
-----Original Message----- From: Minghuan Lian Sent: Thursday, February 25, 2016 11:55 PM To: Stuart Yoder stuart.yoder@nxp.com; u-boot@lists.denx.de Cc: york sun york.sun@nxp.com; Prabhakar Kushwaha prabhakar.kushwaha@nxp.com; Mingkai Hu mingkai.hu@nxp.com; Yang-Leo Li leoyang.li@nxp.com; marc.zyngier@arm.com; Stuart Yoder stuart.yoder@nxp.com Subject: RE: [PATCH 7/7 v2] pci/layerscape: set LUT and msi-map for discovered PCI devices
Hi Stuart,
Please see my comments inline.
Thanks, Minghuan
-----Original Message----- From: Stuart Yoder [mailto:stuart.yoder@nxp.com] Sent: Friday, February 26, 2016 7:06 AM To: u-boot@lists.denx.de Cc: york sun york.sun@nxp.com; Prabhakar Kushwaha prabhakar.kushwaha@nxp.com; Mingkai Hu mingkai.hu@nxp.com; Minghuan Lian minghuan.lian@nxp.com; Yang-Leo Li leoyang.li@nxp.com; marc.zyngier@arm.com; Stuart Yoder stuart.yoder@nxp.com Subject: [PATCH 7/7 v2] pci/layerscape: set LUT and msi-map for discovered PCI devices
From: Stuart Yoder stuart.yoder@nxp.com
for all PCI devices discovered in a system: -allocate a LUT (look-up-table) entry in that PCI controller -allocate a stream ID for the device -program and enable a LUT entry (maps PCI requester id to stream ID) -set the msi-map property on the controller reflecting the LUT mapping
basic bus scanning loop/logic was taken from drivers/pci/pci.c pci_hose_scan_bus().
Signed-off-by: Stuart Yoder stuart.yoder@nxp.com
-v2 -removed skip of host bridge when scanning the bus
drivers/pci/pcie_layerscape.c | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+)
diff --git a/drivers/pci/pcie_layerscape.c b/drivers/pci/pcie_layerscape.c index dfafaf2..3470210 100644 --- a/drivers/pci/pcie_layerscape.c +++ b/drivers/pci/pcie_layerscape.c @@ -569,6 +569,66 @@ static void fdt_pcie_set_msi_map_entry(void *blob, struct ls_pcie *pcie, fdt_appendprop_u32(blob, nodeoffset, "msi-map", 1); }
+static void fdt_fixup_pcie(void *blob) +{
- unsigned int found_multi = 0;
- unsigned char header_type;
- int index;
- u32 streamid;
- pci_dev_t dev;
- int bus;
- unsigned short id;
- struct pci_controller *hose;
- struct ls_pcie *pcie;
- int i;
- for (i = 0, hose = pci_get_hose_head(); hose; hose = hose->next, i++) {
pcie = hose->priv_data;
for (bus = hose->first_busno; bus <= hose->last_busno; bus++) {
for (dev = PCI_BDF(bus, 0, 0);
dev < PCI_BDF(bus, PCI_MAX_PCI_DEVICES - 1,
PCI_MAX_PCI_FUNCTIONS - 1);
dev += PCI_BDF(0, 0, 1)) {
if (PCI_FUNC(dev) && !found_multi)
continue;
pci_read_config_word(dev, PCI_VENDOR_ID, &id);
pci_read_config_byte(dev, PCI_HEADER_TYPE,
&header_type);
if ((id == 0xFFFF) || (id == 0x0000))
continue;
if (!PCI_FUNC(dev))
found_multi = header_type & 0x80;
streamid = ls_pcie_next_streamid();
if (streamid < 0) {
[Minghuan Lian] streamed is u32 type not int, it should be always >= 0.
printf("ERROR: no stream ids free\n");
continue;
}
index = ls_pcie_next_lut_index(pcie);
[Minghuan Lian] ls_pcie_next_lut_index() returns an u32 value not int. we may change all index and streamid to int type.
Thanks. Stream IDs are not signed numbers, I'll update the patch series to be consistent and use a value of 0xffffffff to indicate an error. The LUT index I think should be an int.
Stuart