AMD cimx/sb800: Fix PCI-to-PCI bridge 0:14.4 configuration

A set of pins can be configured for GPIO or (parallel) PCI bridge use.

When requested configuration is 0:14.4 enabled, register programming
must be done before attempting to enumerate devices behind the bridge.

When requested configuration is 0:14.4 disabled, we must not even
temporarily enable pins for PCI use to avoid spurious GPIO state changes.

As our PCI subsystem currently does not configure visible PCI bridges
that are marked disabled, we cannot mark 0:14.4 disabled just yet but
need to handle pcengines/apu1 as a special case.

Drop related dead code.

Change-Id: I8644ebae43b33121ef2a7ed30f745299716ce0df
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/8329
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
This commit is contained in:
Kyösti Mälkki 2015-01-17 18:08:40 +02:00
parent 11f9c35bd2
commit 486c05f4bf
4 changed files with 9 additions and 57 deletions

View File

@ -37,10 +37,6 @@ void enable_int_gfx(void)
{ {
volatile u8 *gpio_reg; volatile u8 *gpio_reg;
#ifdef UNUSED_CODE
RWPMIO(SB_PMIOA_REGEA, AccWidthUint8, ~(BIT0), BIT0); /* Disable the PCIB */
RWPMIO(SB_PMIOA_REGF6, AccWidthUint8, ~(BIT0), BIT0); /* Disable Gec */
#endif
/* make sure the Acpi MMIO(fed80000) is accessible */ /* make sure the Acpi MMIO(fed80000) is accessible */
RWPMIO(SB_PMIOA_REG24, AccWidthUint8, ~(BIT0), BIT0); RWPMIO(SB_PMIOA_REG24, AccWidthUint8, ~(BIT0), BIT0);

View File

@ -37,10 +37,6 @@ void enable_int_gfx(void)
{ {
volatile u8 *gpio_reg; volatile u8 *gpio_reg;
#ifdef UNUSED_CODE
RWPMIO(SB_PMIOA_REGEA, AccWidthUint8, ~(BIT0), BIT0); /* Disable the PCIB */
RWPMIO(SB_PMIOA_REGF6, AccWidthuint8, ~(BIT0), BIT0); /* Disable Gec */
#endif
/* make sure the MMIO(fed80000) is accessible */ /* make sure the MMIO(fed80000) is accessible */
RWPMIO(SB_PMIOA_REG24, AccWidthUint8, ~(BIT0), BIT0); RWPMIO(SB_PMIOA_REG24, AccWidthUint8, ~(BIT0), BIT0);

View File

@ -37,10 +37,6 @@ void enable_int_gfx(void)
{ {
volatile u8 *gpio_reg; volatile u8 *gpio_reg;
#ifdef UNUSED_CODE
RWPMIO(SB_PMIOA_REGEA, AccWidthUint8, ~(BIT0), BIT0); /* Disable the PCIB */
RWPMIO(SB_PMIOA_REGF6, AccWidthUint8, ~(BIT0), BIT0); /* Disable Gec */
#endif
/* make sure the Acpi MMIO(fed80000) is accessible */ /* make sure the Acpi MMIO(fed80000) is accessible */
RWPMIO(SB_PMIOA_REG24, AccWidthUint8, ~(BIT0), BIT0); RWPMIO(SB_PMIOA_REG24, AccWidthUint8, ~(BIT0), BIT0);

View File

@ -259,51 +259,6 @@ static const struct pci_driver gec_driver __pci_driver = {
.device = PCI_DEVICE_ID_ATI_SB800_GEC, .device = PCI_DEVICE_ID_ATI_SB800_GEC,
}; };
/**
* @brief Enable PCI Bridge
*
* PcibConfig [PM_Reg: EAh], PCIDisable [Bit0]
* 'PCIDisable' set to 0 to enable P2P bridge.
* 'PCIDisable' set to 1 to disable P2P bridge and enable PCI interface pins
* to function as GPIO {GPIO 35:0}.
*/
static void pci_init(device_t dev)
{
/* PCI Bridge SHOULD be enabled by default according to SB800 rrg,
* but actually was disabled in some platform, so I have to enabled it.
*/
RWMEM(ACPI_MMIO_BASE + PMIO_BASE + SB_PMIOA_REGEA, AccWidthUint8, ~BIT0, 0);
}
static struct device_operations pci_ops = {
.read_resources = pci_bus_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = pci_bus_enable_resources,
.init = pci_init,
.scan_bus = pci_scan_bridge,
.reset_bus = pci_bus_reset,
.ops_pci = &lops_pci,
};
static const struct pci_driver pci_driver __pci_driver = {
.ops = &pci_ops,
.vendor = PCI_VENDOR_ID_ATI,
.device = PCI_DEVICE_ID_ATI_SB800_PCI,
};
struct device_operations bridge_ops = {
.read_resources = pci_bus_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = pci_bus_enable_resources,
.init = 0,
.scan_bus = pci_scan_bridge,
.enable = 0,
.reset_bus = pci_bus_reset,
.ops_pci = &lops_pci,
};
/** /**
* South Bridge CIMx ramstage entry point wrapper. * South Bridge CIMx ramstage entry point wrapper.
*/ */
@ -447,6 +402,15 @@ static void sb800_enable(device_t dev)
break; break;
case (0x14 << 3) | 4: /* 0:14:4 PCI */ case (0x14 << 3) | 4: /* 0:14:4 PCI */
/* PcibConfig [PM_Reg: EAh], PCIDisable [Bit0]
* 'PCIDisable' set to 0 to enable P2P bridge.
* 'PCIDisable' set to 1 to disable P2P bridge and enable PCI interface pins
* to function as GPIO {GPIO 35:0}.
*/
if (dev->enabled)
RWMEM(ACPI_MMIO_BASE + PMIO_BASE + SB_PMIOA_REGEA, AccWidthUint8, ~BIT0, 0);
else
RWMEM(ACPI_MMIO_BASE + PMIO_BASE + SB_PMIOA_REGEA, AccWidthUint8, ~BIT0, BIT0);
break; break;
case (0x14 << 3) | 6: /* 0:14:6 GEC */ case (0x14 << 3) | 6: /* 0:14:6 GEC */