summaryrefslogtreecommitdiff
path: root/payloads
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2013-09-04 17:20:32 -0700
committerIsaac Christensen <isaac.christensen@se-eng.com>2014-08-28 00:09:32 +0200
commitd7c25b357fb26c0bd9e7844e32529c90e994f4a3 (patch)
tree68a4e12cf436067e31b0e8fd806f22879e5af20d /payloads
parentfbcc8ceca13c92f0c885c8d760735412d33b99ba (diff)
downloadcoreboot-d7c25b357fb26c0bd9e7844e32529c90e994f4a3.tar.xz
libpayload: usb: Allow direct instantiation of MMIO host controllers
The existing USB_MEMORY mechanism to instantiate non-PCI host controllers is clunky and inflexible... most importantly, it doesn't allow multiple host controllers of the same kind. This patch replaces it with a function that allows payloads to directly instantiate as many host controllers of whatever type they need. Change-Id: Ic21d2016a4ef92c67fa420bdc0f0d8a6508b69e5 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/169454 Reviewed-by: Stefan Reinauer <reinauer@google.com> (cherry picked from commit b6e95c39dd91f654f0a345f17b3196f56adf4891) Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com> Reviewed-on: http://review.coreboot.org/6644 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'payloads')
-rw-r--r--payloads/libpayload/Config.in23
-rw-r--r--payloads/libpayload/configs/defconfig1
-rw-r--r--payloads/libpayload/drivers/usb/usbinit.c39
-rw-r--r--payloads/libpayload/include/usb/usb.h1
4 files changed, 24 insertions, 40 deletions
diff --git a/payloads/libpayload/Config.in b/payloads/libpayload/Config.in
index ae90285943..f28f9b874e 100644
--- a/payloads/libpayload/Config.in
+++ b/payloads/libpayload/Config.in
@@ -378,30 +378,11 @@ config USB_GEN_HUB
default n if (!USB_HUB && !USB_XHCI)
default y if (USB_HUB || USB_XHCI)
config USB_PCI
- bool
+ bool "Auto-scan PCI bus for USB host controllers"
+ depends on USB
default y if ARCH_X86
default n
-config USB_MEMORY
- bool
- default y if ARCH_ARMV7
- default n
-
-config USB_OHCI_BASE_ADDRESS
- hex
- depends on USB_MEMORY && USB_OHCI
- default 0x12120000
-
-config USB_EHCI_BASE_ADDRESS
- hex
- depends on USB_MEMORY && USB_EHCI
- default 0x12110000
-
-config USB_XHCI_BASE_ADDRESS
- hex
- depends on USB_MEMORY && USB_XHCI
- default 0x12000000
-
endmenu
menu "Debugging"
diff --git a/payloads/libpayload/configs/defconfig b/payloads/libpayload/configs/defconfig
index c4e0d15f2d..5804ed8985 100644
--- a/payloads/libpayload/configs/defconfig
+++ b/payloads/libpayload/configs/defconfig
@@ -71,7 +71,6 @@ CONFIG_LP_USB_HUB=y
CONFIG_LP_USB_MSC=y
CONFIG_LP_USB_GEN_HUB=y
CONFIG_LP_USB_PCI=y
-# CONFIG_LP_USB_MEMORY is not set
# CONFIG_LP_BIG_ENDIAN is not set
CONFIG_LP_LITTLE_ENDIAN=y
CONFIG_LP_IO_ADDRESS_SPACE=y
diff --git a/payloads/libpayload/drivers/usb/usbinit.c b/payloads/libpayload/drivers/usb/usbinit.c
index 90c31d7ef5..1710760c87 100644
--- a/payloads/libpayload/drivers/usb/usbinit.c
+++ b/payloads/libpayload/drivers/usb/usbinit.c
@@ -156,21 +156,6 @@ static void usb_scan_pci_bus(int bus)
}
#endif
-#ifdef CONFIG_LP_USB_MEMORY
-static void usb_scan_memory(void)
-{
-#ifdef CONFIG_LP_USB_XHCI
- xhci_init(CONFIG_LP_USB_XHCI_BASE_ADDRESS);
-#endif
-#ifdef CONFIG_LP_USB_EHCI
- ehci_init(CONFIG_LP_USB_EHCI_BASE_ADDRESS);
-#endif
-#ifdef CONFIG_LP_USB_OHCI
- ohci_init(CONFIG_LP_USB_OHCI_BASE_ADDRESS);
-#endif
-}
-#endif
-
/**
* Initialize all USB controllers attached to PCI.
*/
@@ -179,8 +164,26 @@ int usb_initialize(void)
#ifdef CONFIG_LP_USB_PCI
usb_scan_pci_bus(0);
#endif
-#ifdef CONFIG_LP_USB_MEMORY
- usb_scan_memory();
-#endif
return 0;
}
+
+hci_t *usb_add_mmio_hc(hc_type type, void *bar)
+{
+ switch (type) {
+#ifdef CONFIG_LP_USB_OHCI
+ case OHCI:
+ return ohci_init(bar);
+#endif
+#ifdef CONFIG_LP_USB_EHCI
+ case EHCI:
+ return ehci_init(bar);
+#endif
+#ifdef CONFIG_LP_USB_XHCI
+ case XHCI:
+ return xhci_init(bar);
+#endif
+ default:
+ usb_debug("HC type %d (at %p) is not supported!\n", type, bar);
+ return NULL;
+ }
+}
diff --git a/payloads/libpayload/include/usb/usb.h b/payloads/libpayload/include/usb/usb.h
index 0bfbc20327..2bf1993b82 100644
--- a/payloads/libpayload/include/usb/usb.h
+++ b/payloads/libpayload/include/usb/usb.h
@@ -240,6 +240,7 @@ typedef struct {
unsigned short wReportDescriptorLength;
} __attribute__ ((packed)) hid_descriptor_t;
+hci_t *usb_add_mmio_hc(hc_type type, void *bar);
hci_t *new_controller (void);
void detach_controller (hci_t *controller);
void usb_poll (void);