From b6e95c39dd91f654f0a345f17b3196f56adf4891 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Wed, 4 Sep 2013 17:20:32 -0700 Subject: [PATCH] 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. CQ-DEPEND=CL:169541 BUG=chrome-os-partner:21969 TEST=Manual Change-Id: Ic21d2016a4ef92c67fa420bdc0f0d8a6508b69e5 Signed-off-by: Julius Werner Reviewed-on: https://chromium-review.googlesource.com/169454 Reviewed-by: Stefan Reinauer --- payloads/libpayload/Config.in | 23 +---------- payloads/libpayload/configs/config.bolt | 1 - payloads/libpayload/configs/config.daisy | 3 -- payloads/libpayload/configs/config.falco | 1 - .../configs/config.fox_baskingridge | 1 - payloads/libpayload/configs/config.fox_wtm2 | 1 - payloads/libpayload/configs/config.link | 1 - payloads/libpayload/configs/config.lumpy | 1 - .../libpayload/configs/config.peach_kirby | 7 +--- payloads/libpayload/configs/config.peach_pit | 7 +--- payloads/libpayload/configs/config.peppy | 1 - payloads/libpayload/configs/config.slippy | 1 - payloads/libpayload/configs/defconfig | 1 - payloads/libpayload/drivers/usb/usbinit.c | 39 ++++++++++--------- payloads/libpayload/include/usb/usb.h | 1 + 15 files changed, 28 insertions(+), 61 deletions(-) diff --git a/payloads/libpayload/Config.in b/payloads/libpayload/Config.in index c07d4820d4..9d1c82d880 100644 --- a/payloads/libpayload/Config.in +++ b/payloads/libpayload/Config.in @@ -374,30 +374,11 @@ config USB_MSC Say Y here unless you know exactly what you are doing. 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 - config USB_GEN_HUB bool default n if (!USB_HUB && !USB_XHCI) diff --git a/payloads/libpayload/configs/config.bolt b/payloads/libpayload/configs/config.bolt index b6e566949e..bb72dd1279 100644 --- a/payloads/libpayload/configs/config.bolt +++ b/payloads/libpayload/configs/config.bolt @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.daisy b/payloads/libpayload/configs/config.daisy index 4103bfa40c..fc38917613 100644 --- a/payloads/libpayload/configs/config.daisy +++ b/payloads/libpayload/configs/config.daisy @@ -53,9 +53,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y # CONFIG_LP_USB_PCI is not set -CONFIG_LP_USB_MEMORY=y -CONFIG_LP_USB_OHCI_BASE_ADDRESS=0x12120000 -CONFIG_LP_USB_EHCI_BASE_ADDRESS=0x12110000 CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.falco b/payloads/libpayload/configs/config.falco index b6e566949e..bb72dd1279 100644 --- a/payloads/libpayload/configs/config.falco +++ b/payloads/libpayload/configs/config.falco @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.fox_baskingridge b/payloads/libpayload/configs/config.fox_baskingridge index 531259cbef..1e8a37383b 100644 --- a/payloads/libpayload/configs/config.fox_baskingridge +++ b/payloads/libpayload/configs/config.fox_baskingridge @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.fox_wtm2 b/payloads/libpayload/configs/config.fox_wtm2 index b6e566949e..bb72dd1279 100644 --- a/payloads/libpayload/configs/config.fox_wtm2 +++ b/payloads/libpayload/configs/config.fox_wtm2 @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.link b/payloads/libpayload/configs/config.link index 531259cbef..1e8a37383b 100644 --- a/payloads/libpayload/configs/config.link +++ b/payloads/libpayload/configs/config.link @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.lumpy b/payloads/libpayload/configs/config.lumpy index 531259cbef..1e8a37383b 100644 --- a/payloads/libpayload/configs/config.lumpy +++ b/payloads/libpayload/configs/config.lumpy @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.peach_kirby b/payloads/libpayload/configs/config.peach_kirby index a068bdd9c1..92a0ac750e 100644 --- a/payloads/libpayload/configs/config.peach_kirby +++ b/payloads/libpayload/configs/config.peach_kirby @@ -47,15 +47,12 @@ CONFIG_LP_COREBOOT_VIDEO_CONSOLE=y # CONFIG_LP_STORAGE is not set CONFIG_LP_USB=y # CONFIG_LP_USB_OHCI is not set -CONFIG_LP_USB_EHCI=y -# CONFIG_LP_USB_XHCI is not set +# CONFIG_LP_USB_EHCI is not set +CONFIG_LP_USB_XHCI=y CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y # CONFIG_LP_USB_PCI is not set -CONFIG_LP_USB_MEMORY=y -CONFIG_LP_USB_OHCI_BASE_ADDRESS=0x12120000 -CONFIG_LP_USB_EHCI_BASE_ADDRESS=0x12110000 CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.peach_pit b/payloads/libpayload/configs/config.peach_pit index 3c63dfdf7a..049e2b2079 100644 --- a/payloads/libpayload/configs/config.peach_pit +++ b/payloads/libpayload/configs/config.peach_pit @@ -47,15 +47,12 @@ CONFIG_LP_COREBOOT_VIDEO_CONSOLE=y # CONFIG_LP_STORAGE is not set CONFIG_LP_USB=y # CONFIG_LP_USB_OHCI is not set -CONFIG_LP_USB_EHCI=y -# CONFIG_LP_USB_XHCI is not set +# CONFIG_LP_USB_EHCI is not set +CONFIG_LP_USB_XHCI=y CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y # CONFIG_LP_USB_PCI is not set -CONFIG_LP_USB_MEMORY=y -CONFIG_LP_USB_OHCI_BASE_ADDRESS=0x12120000 -CONFIG_LP_USB_EHCI_BASE_ADDRESS=0x12110000 CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.peppy b/payloads/libpayload/configs/config.peppy index b6e566949e..bb72dd1279 100644 --- a/payloads/libpayload/configs/config.peppy +++ b/payloads/libpayload/configs/config.peppy @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/config.slippy b/payloads/libpayload/configs/config.slippy index b6e566949e..bb72dd1279 100644 --- a/payloads/libpayload/configs/config.slippy +++ b/payloads/libpayload/configs/config.slippy @@ -64,7 +64,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/configs/defconfig b/payloads/libpayload/configs/defconfig index a8fca141c0..01de7fe5ba 100644 --- a/payloads/libpayload/configs/defconfig +++ b/payloads/libpayload/configs/defconfig @@ -71,7 +71,6 @@ CONFIG_LP_USB_HID=y CONFIG_LP_USB_HUB=y CONFIG_LP_USB_MSC=y CONFIG_LP_USB_PCI=y -# CONFIG_LP_USB_MEMORY is not set CONFIG_LP_USB_GEN_HUB=y # CONFIG_LP_BIG_ENDIAN is not set CONFIG_LP_LITTLE_ENDIAN=y diff --git a/payloads/libpayload/drivers/usb/usbinit.c b/payloads/libpayload/drivers/usb/usbinit.c index 3ea8d9b69f..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((void *)(unsigned long)CONFIG_LP_USB_XHCI_BASE_ADDRESS); -#endif -#ifdef CONFIG_LP_USB_EHCI - ehci_init((void *)(unsigned long)CONFIG_LP_USB_EHCI_BASE_ADDRESS); -#endif -#ifdef CONFIG_LP_USB_OHCI - ohci_init((void *)(unsigned long)CONFIG_LP_USB_OHCI_BASE_ADDRESS); -#endif -} -#endif - /** * Initialize all USB controllers attached to PCI. */ @@ -178,9 +163,27 @@ 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 a351690418..fa3228638b 100644 --- a/payloads/libpayload/include/usb/usb.h +++ b/payloads/libpayload/include/usb/usb.h @@ -239,6 +239,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);