|
@@ -37,6 +37,11 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
|
#include <pci.h>
|
|
|
#include <asm/immap_fsl_pci.h>
|
|
|
|
|
|
+/* Freescale-specific PCI config registers */
|
|
|
+#define FSL_PCI_PBFR 0x44
|
|
|
+#define FSL_PCIE_CAP_ID 0x4c
|
|
|
+#define FSL_PCIE_CFG_RDY 0x4b0
|
|
|
+
|
|
|
void pciauto_prescan_setup_bridge(struct pci_controller *hose,
|
|
|
pci_dev_t dev, int sub_bus);
|
|
|
void pciauto_postscan_setup_bridge(struct pci_controller *hose,
|
|
@@ -306,6 +311,30 @@ void fsl_pci_init(struct pci_controller *hose)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* Enable inbound PCI config cycles for agent/endpoint interface */
|
|
|
+void fsl_pci_config_unlock(struct pci_controller *hose)
|
|
|
+{
|
|
|
+ pci_dev_t dev = PCI_BDF(hose->first_busno,0,0);
|
|
|
+ u8 agent;
|
|
|
+ u8 pcie_cap;
|
|
|
+ u16 pbfr;
|
|
|
+
|
|
|
+ pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &agent);
|
|
|
+ if (!agent)
|
|
|
+ return;
|
|
|
+
|
|
|
+ pci_hose_read_config_byte(hose, dev, FSL_PCIE_CAP_ID, &pcie_cap);
|
|
|
+ if (pcie_cap != 0x0) {
|
|
|
+ /* PCIe - set CFG_READY bit of Configuration Ready Register */
|
|
|
+ pci_hose_write_config_byte(hose, dev, FSL_PCIE_CFG_RDY, 0x1);
|
|
|
+ } else {
|
|
|
+ /* PCI - clear ACL bit of PBFR */
|
|
|
+ pci_hose_read_config_word(hose, dev, FSL_PCI_PBFR, &pbfr);
|
|
|
+ pbfr &= ~0x20;
|
|
|
+ pci_hose_write_config_word(hose, dev, FSL_PCI_PBFR, pbfr);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_OF_BOARD_SETUP
|
|
|
#include <libfdt.h>
|
|
|
#include <fdt_support.h>
|