|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright 2007-2011 Freescale Semiconductor, Inc.
|
|
|
+ * Copyright 2007-2012 Freescale Semiconductor, Inc.
|
|
|
*
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
@@ -499,13 +499,7 @@ void fsl_pci_init(struct pci_controller *hose, struct fsl_pci_info *pci_info)
|
|
|
}
|
|
|
|
|
|
#ifndef CONFIG_PCI_NOSCAN
|
|
|
- pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &temp8);
|
|
|
-
|
|
|
- /* Programming Interface (PCI_CLASS_PROG)
|
|
|
- * 0 == pci host or pcie root-complex,
|
|
|
- * 1 == pci agent or pcie end-point
|
|
|
- */
|
|
|
- if (!temp8) {
|
|
|
+ if (!fsl_is_pci_agent(hose)) {
|
|
|
debug(" Scanning PCI bus %02x\n",
|
|
|
hose->current_busno);
|
|
|
hose->last_busno = pci_hose_scan_bus(hose, hose->current_busno);
|
|
@@ -543,12 +537,22 @@ void fsl_pci_init(struct pci_controller *hose, struct fsl_pci_info *pci_info)
|
|
|
|
|
|
int fsl_is_pci_agent(struct pci_controller *hose)
|
|
|
{
|
|
|
- u8 prog_if;
|
|
|
+ u8 pcie_cap;
|
|
|
pci_dev_t dev = PCI_BDF(hose->first_busno, 0, 0);
|
|
|
|
|
|
- pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &prog_if);
|
|
|
+ pci_hose_read_config_byte(hose, dev, FSL_PCIE_CAP_ID, &pcie_cap);
|
|
|
+ if (pcie_cap == PCI_CAP_ID_EXP) {
|
|
|
+ u8 header_type;
|
|
|
+
|
|
|
+ pci_hose_read_config_byte(hose, dev, PCI_HEADER_TYPE,
|
|
|
+ &header_type);
|
|
|
+ return (header_type & 0x7f) == PCI_HEADER_TYPE_NORMAL;
|
|
|
+ } else {
|
|
|
+ u8 prog_if;
|
|
|
|
|
|
- return (prog_if == FSL_PROG_IF_AGENT);
|
|
|
+ pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &prog_if);
|
|
|
+ return (prog_if == FSL_PROG_IF_AGENT);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
int fsl_pci_init_port(struct fsl_pci_info *pci_info,
|
|
@@ -618,12 +622,10 @@ int fsl_pci_init_port(struct fsl_pci_info *pci_info,
|
|
|
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)
|
|
|
+ if (!fsl_is_pci_agent(hose))
|
|
|
return;
|
|
|
|
|
|
pci_hose_read_config_byte(hose, dev, FSL_PCIE_CAP_ID, &pcie_cap);
|