diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pcie_layerscape.c | 21 | ||||
-rw-r--r-- | drivers/pci/pcie_layerscape.h | 1 | ||||
-rw-r--r-- | drivers/pci/pcie_layerscape_fixup.c | 25 |
3 files changed, 35 insertions, 12 deletions
diff --git a/drivers/pci/pcie_layerscape.c b/drivers/pci/pcie_layerscape.c index 3b7377a6ebf..db1375a1cea 100644 --- a/drivers/pci/pcie_layerscape.c +++ b/drivers/pci/pcie_layerscape.c @@ -225,6 +225,9 @@ static int ls_pcie_addr_valid(struct ls_pcie *pcie, pci_dev_t bdf) { struct udevice *bus = pcie->bus; + if (pcie->mode == PCI_HEADER_TYPE_NORMAL) + return -ENODEV; + if (!pcie->enabled) return -ENXIO; @@ -438,9 +441,7 @@ static int ls_pcie_probe(struct udevice *dev) struct ls_pcie *pcie = dev_get_priv(dev); const void *fdt = gd->fdt_blob; int node = dev_of_offset(dev); - u8 header_type; u16 link_sta; - bool ep_mode; uint svr; int ret; fdt_size_t cfg_size; @@ -524,15 +525,15 @@ static int ls_pcie_probe(struct udevice *dev) (unsigned long)pcie->ctrl, (unsigned long)pcie->cfg0, pcie->big_endian); - header_type = readb(pcie->dbi + PCI_HEADER_TYPE); - ep_mode = (header_type & 0x7f) == PCI_HEADER_TYPE_NORMAL; - printf("PCIe%u: %s %s", pcie->idx, dev->name, - ep_mode ? "Endpoint" : "Root Complex"); + pcie->mode = readb(pcie->dbi + PCI_HEADER_TYPE) & 0x7f; - if (ep_mode) - ls_pcie_setup_ep(pcie); - else - ls_pcie_setup_ctrl(pcie); + if (pcie->mode == PCI_HEADER_TYPE_NORMAL) { + printf("PCIe%u: %s %s", pcie->idx, dev->name, "Endpoint"); + ls_pcie_setup_ep(pcie); + } else { + printf("PCIe%u: %s %s", pcie->idx, dev->name, "Root Complex"); + ls_pcie_setup_ctrl(pcie); + } if (!ls_pcie_link_up(pcie)) { /* Let the user know there's no PCIe link */ diff --git a/drivers/pci/pcie_layerscape.h b/drivers/pci/pcie_layerscape.h index 8770b44a1f0..ddfbba65384 100644 --- a/drivers/pci/pcie_layerscape.h +++ b/drivers/pci/pcie_layerscape.h @@ -144,6 +144,7 @@ struct ls_pcie { bool big_endian; bool enabled; int next_lut_index; + int mode; }; extern struct list_head ls_pcie_list; diff --git a/drivers/pci/pcie_layerscape_fixup.c b/drivers/pci/pcie_layerscape_fixup.c index 1a17bd98aa4..089e031724a 100644 --- a/drivers/pci/pcie_layerscape_fixup.c +++ b/drivers/pci/pcie_layerscape_fixup.c @@ -218,7 +218,7 @@ static void fdt_fixup_pcie(void *blob) } #endif -static void ft_pcie_ls_setup(void *blob, struct ls_pcie *pcie) +static void ft_pcie_rc_fix(void *blob, struct ls_pcie *pcie) { int off; uint svr; @@ -243,12 +243,33 @@ static void ft_pcie_ls_setup(void *blob, struct ls_pcie *pcie) return; } - if (pcie->enabled) + if (pcie->enabled && pcie->mode == PCI_HEADER_TYPE_BRIDGE) + fdt_set_node_status(blob, off, FDT_STATUS_OKAY, 0); + else + fdt_set_node_status(blob, off, FDT_STATUS_DISABLED, 0); +} + +static void ft_pcie_ep_fix(void *blob, struct ls_pcie *pcie) +{ + int off; + + off = fdt_node_offset_by_compat_reg(blob, "fsl,ls-pcie-ep", + pcie->dbi_res.start); + if (off < 0) + return; + + if (pcie->enabled && pcie->mode == PCI_HEADER_TYPE_NORMAL) fdt_set_node_status(blob, off, FDT_STATUS_OKAY, 0); else fdt_set_node_status(blob, off, FDT_STATUS_DISABLED, 0); } +static void ft_pcie_ls_setup(void *blob, struct ls_pcie *pcie) +{ + ft_pcie_ep_fix(blob, pcie); + ft_pcie_rc_fix(blob, pcie); +} + /* Fixup Kernel DT for PCIe */ void ft_pci_setup(void *blob, bd_t *bd) { |