[PATCHv4 1/2] ppc64: perform proper max_bus_speed detection
Lucas Kannebley Tavares
lucaskt at linux.vnet.ibm.com
Thu Apr 25 10:34:32 PDT 2013
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
More information about the dri-devel
mailing list