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>
This commit is contained in:
Julius Werner 2013-09-04 17:20:32 -07:00 committed by Isaac Christensen
parent fbcc8ceca1
commit d7c25b357f
4 changed files with 24 additions and 40 deletions

View File

@ -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"

View File

@ -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

View File

@ -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.
*/
@ -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;
}
}

View File

@ -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);