On 04/24/2013 08:48 PM, Tony Breeds wrote: > On Wed, Apr 24, 2013 at 07:54:49PM -0300, lucaskt at linux.vnet.ibm.com wrote: >> From: Lucas Kannebley Tavares<lucaskt at linux.vnet.ibm.com> >> >> On pseries machines the detection for max_bus_speed should be done >> through an OpenFirmware property. This patch adds a function to perform >> this detection and a hook to perform dynamic adding of the function only for >> pseries. This is done by overwriting the weak >> pcibios_root_bridge_prepare function which is called by >> pci_create_root_bus(). >> >> Signed-off-by: Lucas Kannebley Tavares<lucaskt at linux.vnet.ibm.com> >> --- >> arch/powerpc/include/asm/machdep.h | 2 ++ >> arch/powerpc/kernel/pci-common.c | 8 +++++ >> arch/powerpc/platforms/pseries/pci.c | 51 >> ++++++++++++++++++++++++++++++++ >> arch/powerpc/platforms/pseries/pseries.h | 4 +++ >> arch/powerpc/platforms/pseries/setup.c | 2 ++ >> 5 files changed, 67 insertions(+) >> >> diff --git a/arch/powerpc/include/asm/machdep.h >> b/arch/powerpc/include/asm/machdep.h >> index 3d6b410..8f558bf 100644 >> --- a/arch/powerpc/include/asm/machdep.h >> +++ b/arch/powerpc/include/asm/machdep.h >> @@ -107,6 +107,8 @@ struct machdep_calls { >> void (*pcibios_fixup)(void); >> int (*pci_probe_mode)(struct pci_bus *); >> void (*pci_irq_fixup)(struct pci_dev *dev); >> + int (*pcibios_root_bridge_prepare)(struct pci_host_bridge >> + *bridge); >> >> /* To setup PHBs when using automatic OF platform driver for PCI */ >> int (*pci_setup_phb)(struct pci_controller *host); >> diff --git a/arch/powerpc/kernel/pci-common.c >> b/arch/powerpc/kernel/pci-common.c >> index fa12ae4..80986cf 100644 >> --- a/arch/powerpc/kernel/pci-common.c >> +++ b/arch/powerpc/kernel/pci-common.c >> @@ -844,6 +844,14 @@ int pci_proc_domain(struct pci_bus *bus) >> return 1; >> } >> >> +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) >> +{ >> + if (ppc_md.pcibios_root_bridge_prepare) >> + return ppc_md.pcibios_root_bridge_prepare(bridge); >> + >> + return 0; >> +} >> + >> /* This header fixup will do the resource fixup for all devices as they are >> * probed, but not for bridge ranges >> */ >> diff --git a/arch/powerpc/platforms/pseries/pci.c >> b/arch/powerpc/platforms/pseries/pci.c >> index 0b580f4..7f9c956 100644 >> --- a/arch/powerpc/platforms/pseries/pci.c >> +++ b/arch/powerpc/platforms/pseries/pci.c >> @@ -108,3 +108,54 @@ static void fixup_winbond_82c105(struct pci_dev* dev) >> } >> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, >> PCI_DEVICE_ID_WINBOND_82C105, >> fixup_winbond_82c105); >> + >> +int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) >> +{ >> + struct device_node *dn, *pdn; >> + struct pci_bus *bus; >> + const uint32_t *pcie_link_speed_stats; >> + >> + bus = bridge->bus; >> + >> + dn = pcibios_get_phb_of_node(bus); >> + if (!dn) >> + return 0; >> + >> + for (pdn = dn; pdn != NULL; pdn = pdn->parent) { >> + pcie_link_speed_stats = (const uint32_t *) of_get_property(dn, >> + "ibm,pcie-link-speed-stats", NULL); >> + if (pcie_link_speed_stats) >> + break; >> + } > > Please use the helpers in include/linux/of.h rather than open coding > this. > > Yours Tony
Hi Tony, This is what I can find as an equivalent code: for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { pcie_link_speed_stats = (const uint32_t *) of_get_property(dn, "ibm,pcie-link-speed-stats", NULL); if (pcie_link_speed_stats) break; } is this your suggestion, or was it another approach that will have the same result? Thanks, -- Lucas Kannebley Tavares Software Engineer IBM Linux Technology Center