From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: Mike Qiu <qiudayu@linux.vnet.ibm.com>
Cc: benh@au1.ibm.com, linuxppc-dev@lists.ozlabs.org,
Gavin Shan <gwshan@linux.vnet.ibm.com>
Subject: Re: [PATCH] Bugfix: powerpc/eeh: Wrong place to call pci_get_slot()
Date: Tue, 15 Jul 2014 09:24:49 +1000 [thread overview]
Message-ID: <20140714232449.GA4711@shangw> (raw)
In-Reply-To: <53C3DC96.70505@linux.vnet.ibm.com>
On Mon, Jul 14, 2014 at 09:35:18PM +0800, Mike Qiu wrote:
>On 07/14/2014 09:01 PM, Gavin Shan wrote:
>>On Mon, Jul 14, 2014 at 04:19:23AM -0400, Mike Qiu wrote:
.../...
>>>Signed-off-by: Mike Qiu <qiudayu@linux.vnet.ibm.com>
>>>---
>>>arch/powerpc/kernel/eeh_pe.c | 29 ++++++++++++++++++++++++++---
>>>1 file changed, 26 insertions(+), 3 deletions(-)
>>>
>>>diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c
>>>index fbd01eb..6f4bfee 100644
>>>--- a/arch/powerpc/kernel/eeh_pe.c
>>>+++ b/arch/powerpc/kernel/eeh_pe.c
>>>@@ -792,6 +792,28 @@ void eeh_pe_restore_bars(struct eeh_pe *pe)
>>>}
>>>
>>>/**
>>>+ * __dn_get_pdev - Retrieve the pci_dev from device_node by bus/devfn
>>>+ * @dn: device_node of the pci_dev
>>>+ * @data: the pci device's bus/devfn
>>>+ *
>>>+ * Retrieve the pci_dev using the given device_node and bus/devfn.
>>>+ */
>>>+void *__dn_get_pdev(struct device_node *dn, void *data)
>>>+{
>>The function isn't necessarily public. "static" is enough, I think.
>>I don't think we need this actually. Please refer to more comments
>>below.
>>
>>>+ struct pci_dn *pdn = PCI_DN(dn);
>>>+ int busno = *((int *)data) >> 8;
>>>+ int devfn = *((int *)data) & 0xff;
>>>+
>>>+ if (!pdn)
>>>+ return NULL;
>>>+
>>>+ if (pdn->busno == busno && pdn->devfn == devfn)
>>>+ return pdn->pcidev;
>>>+
>>>+ return NULL;
>>>+}
>>>+
>>>+/**
>>> * eeh_pe_loc_get - Retrieve location code binding to the given PE
>>> * @pe: EEH PE
>>> *
>>>@@ -807,6 +829,7 @@ const char *eeh_pe_loc_get(struct eeh_pe *pe)
>>> struct pci_dev *pdev;
>>> struct device_node *dn;
>>> const char *loc;
>>>+ int bdevfn;
>>>
>>> if (!bus)
>>> return "N/A";
>>>@@ -823,7 +846,9 @@ const char *eeh_pe_loc_get(struct eeh_pe *pe)
>>> if (loc)
>>> return loc;
>>>
>>>- pdev = pci_get_slot(bus, 0x0);
>>>+ /* Get the root port */
>>>+ bdevfn = (bus->number) << 8 || 0x0;
>>>+ pdev = traverse_pci_devices(hose->dn, __dn_get_pdev, &bdevfn);
>>We needn't search pdev from device-tree and then translate it to
>>device-node. Root port is the only child hooked to root bus's
>>device node (it's also PHB's device-node). So I guess you can
>
>So here you mean, child hooked device node(root port) can be
>hose->dn->child?
>
Yes, I think so.
>>just have something:
>>
>> /* Check PHB's device node */
>> dn = pci_bus_to_OF_node(bus);
>> if (unlikely(!dn)) {
>> loc = "N/A";
>> goto out;
>> }
>> loc = of_get_property(hose->dn,
>> "ibm,loc-code", NULL);
>> if (loc)
>> return loc;
>> loc = of_get_property(hose->dn,
>> "ibm,io-base-loc-code", NULL);
>> if (loc)
>> return loc;
>>
>> /* Check root port */
>> dn = dn->child;
>>> } else {
>>> pdev = bus->self;
>>Here, we needn't grab the bridge as well:
>>
>> dn = pci_bus_to_OF_node(bus);
>>> }
>>Then check the device-node of bridge (or root port):
>>
>> if (unlikely(!dn)) {
>> loc = "N/A";
>> goto out;
>> }
>>
>> loc = of_get_property(dn, "ibm,loc-code", NULL);
>> if (!loc)
>> loc = of_get_property(dn, "ibm,slot-location-code", NULL);
>> if (!loc)
>> loc = "N/A";
>>
>>>@@ -846,8 +871,6 @@ const char *eeh_pe_loc_get(struct eeh_pe *pe)
>>> loc = "N/A";
>>>
>>>out:
>>>- if (pci_is_root_bus(bus) && pdev)
>>>- pci_dev_put(pdev);
>>> return loc;
>>>}
>
>I will make a new patch, after tested, I will resend it out
>
Thanks, Mike.
Thanks,
Gavin
prev parent reply other threads:[~2014-07-14 23:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-14 8:19 [PATCH] Bugfix: powerpc/eeh: Wrong place to call pci_get_slot() Mike Qiu
2014-07-14 13:01 ` Gavin Shan
2014-07-14 13:35 ` Mike Qiu
2014-07-14 23:24 ` Gavin Shan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140714232449.GA4711@shangw \
--to=gwshan@linux.vnet.ibm.com \
--cc=benh@au1.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=qiudayu@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.