libpayload: Switch xHCI shared ports back to EHCI on shutdown

On Intel's Panther Point the xHCI ports are shared with an EHCI
controller. Our xHCI driver switches them to xHCI, naturally. But
we forgot to switch them back on shutdown, which left them
unusable by a non-xHCI aware operating system.

Change-Id: I70ef08655a603b42ee939935d50cf77ea97878a3
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: http://review.coreboot.org/3791
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
Nico Huber 2013-07-19 14:03:47 +02:00 committed by Nico Huber
parent 681d17e0bf
commit c371442a29
1 changed files with 15 additions and 0 deletions

View File

@ -110,6 +110,19 @@ xhci_switch_ppt_ports(pcidev_t addr)
} }
} }
/* On Panther Point: switch all ports back to EHCI */
static void
xhci_switchback_ppt_ports(pcidev_t addr)
{
if (pci_read_config32(addr, 0x00) == 0x1e318086) {
u32 reg32 = pci_read_config32(addr, 0xd0) & 0xf;
xhci_debug("Switching ports back: 0x%"PRIx32"\n", reg32);
pci_write_config32(addr, 0xd0, 0x00000000);
reg32 = pci_read_config32(addr, 0xd0) & 0xf;
xhci_debug("Still switched to xHCI: 0x%"PRIx32"\n", reg32);
}
}
static long static long
xhci_handshake(volatile u32 *const reg, u32 mask, u32 wait_for, long timeout_us) xhci_handshake(volatile u32 *const reg, u32 mask, u32 wait_for, long timeout_us)
{ {
@ -389,6 +402,8 @@ xhci_shutdown(hci_t *const controller)
xhci_stop(controller); xhci_stop(controller);
xhci_switchback_ppt_ports(controller->bus_address);
if (xhci->sp_ptrs) { if (xhci->sp_ptrs) {
const size_t max_sp_bufs = xhci->capreg->Max_Scratchpad_Bufs; const size_t max_sp_bufs = xhci->capreg->Max_Scratchpad_Bufs;
for (i = 0; i < max_sp_bufs; ++i) { for (i = 0; i < max_sp_bufs; ++i) {