From: Hiroo Matsumoto <matsumoto.hiroo@jp.fujitsu.com>
To: unlisted-recipients:; (no To-header on input)
Cc: Bjorn Helgaas <bhelgaas@google.com>,
Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>,
jbarnes@virtuousgeek.org, linux-pci@vger.kernel.org
Subject: Re: [RFC] pciehp: Add archdata setting
Date: Mon, 16 Apr 2012 15:32:05 +0900 [thread overview]
Message-ID: <4F8BBCE5.6010108@jp.fujitsu.com> (raw)
In-Reply-To: <4F876C54.5040408@jp.fujitsu.com>
[-- Attachment #1: Type: text/plain, Size: 1316 bytes --]
Hi, Bjorn
I wrote a code with bus_register_notifier().
A function that calls bus_register_notifer() is called from
rootfs_initcall as well as amd_iommu is.
Please review this.
Regards.
Hiroo MATSUMOTO
> Hi, Bjorn
>
>
> Thanks for your research and comment.
>
> As you said, a way of registering code with bus_register_notifier(),
> which will be called in device_add(), is better one than
> pcibios_enable_device().
> I will try to write code with bus_register_notifier().
>
>
> Regards.
>
> Hiroo MATSUMOTO
>
>> On Wed, Apr 11, 2012 at 11:00 PM, Hiroo Matsumoto
>> <matsumoto.hiroo@jp.fujitsu.com> wrote:
>>> Hi, Kaneshige
>>>
>>>
>>> You are right!
>>> Setting dma_ops in pcibios_enable_device is a nice way.
>>> In PCI driver, pci_enable_device_xxx that calls pcibios_enable_device is
>>> called before checking archdata.dma_ops.
>>>
>>> I added code of checking and setting dma_ops to pcibios_enable_device in
>>> arch/powerpc/kernel/pci-common.c.
>>> It works good.
>>
>> When I researched this, I thought the best route was to use the
>> bus_register_notifier() path, as amd_iommu_init_notifier() does.
>>
>> We're filling in a struct device field, not a PCI field, and
>> bus_register_notifier() seems like a more generic path than relying on
>> pcibios_enable_device().
>>
>> Bjorn
>>
>>
>
[-- Attachment #2: ppc-pcibios-bus_notifier-for-hp.patch --]
[-- Type: text/plain, Size: 2136 bytes --]
Signed-off-by: Hiroo MATSUMOTO <matsumoto.hiroo@jp.fujitsu.com>
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 32656f1..1fe1e25 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1083,6 +1083,17 @@ void __devinit pcibios_setup_bus_self(struct pci_bus *bus)
ppc_md.pci_dma_bus_setup(bus);
}
+static inline void pcibios_set_dma_ops(struct pci_dev *dev)
+{
+ /* Hook up default DMA ops */
+ set_dma_ops(&dev->dev, pci_dma_ops);
+ set_dma_offset(&dev->dev, PCI_DRAM_OFFSET);
+
+ /* Additional platform DMA/iommu setup */
+ if (ppc_md.pci_dma_dev_setup)
+ ppc_md.pci_dma_dev_setup(dev);
+}
+
void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
{
struct pci_dev *dev;
@@ -1102,13 +1113,7 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
*/
set_dev_node(&dev->dev, pcibus_to_node(dev->bus));
- /* Hook up default DMA ops */
- set_dma_ops(&dev->dev, pci_dma_ops);
- set_dma_offset(&dev->dev, PCI_DRAM_OFFSET);
-
- /* Additional platform DMA/iommu setup */
- if (ppc_md.pci_dma_dev_setup)
- ppc_md.pci_dma_dev_setup(dev);
+ pcibios_set_dma_ops(dev);
/* Read default IRQs and fixup if necessary */
pci_read_irq_line(dev);
@@ -1749,3 +1754,33 @@ static void fixup_hide_host_resource_fsl(struct pci_dev *dev)
}
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl);
+
+static int pcibios_device_change_notifier(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct pci_dev *dev = to_pci_dev(data);
+
+ if (!dev)
+ return 0;
+
+ switch (action) {
+ case BUS_NOTIFY_ADD_DEVICE:
+ if (!get_dma_ops(&dev->dev))
+ pcibios_set_dma_ops(dev);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static struct notifier_block device_nb = {
+ .notifier_call = pcibios_device_change_notifier,
+};
+
+static int pcibios_bus_notifier_init(void)
+{
+ return bus_register_notifier(&pci_bus_type, &device_nb);
+}
+rootfs_initcall(pcibios_bus_notifier_init);
next prev parent reply other threads:[~2012-04-16 6:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-02 7:42 [RFC] pciehp: Add archdata setting 松本博郎
2012-04-02 14:13 ` Bjorn Helgaas
2012-04-03 6:26 ` 松本博郎
2012-04-03 7:53 ` Kenji Kaneshige
2012-04-03 7:15 ` Kenji Kaneshige
2012-04-04 8:03 ` 松本博郎
2012-04-12 5:00 ` Hiroo Matsumoto
2012-04-12 13:12 ` Bjorn Helgaas
2012-04-12 23:59 ` Hiroo Matsumoto
2012-04-16 6:32 ` Hiroo Matsumoto [this message]
2012-04-23 17:21 ` Bjorn Helgaas
2012-04-26 10:00 ` Hiroo Matsumoto
2012-05-10 10:38 ` Hiroo Matsumoto
2012-05-10 12:09 ` Kenji Kaneshige
2012-05-15 23:20 ` Bjorn Helgaas
2012-05-23 1:33 ` Hiroo Matsumoto
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=4F8BBCE5.6010108@jp.fujitsu.com \
--to=matsumoto.hiroo@jp.fujitsu.com \
--cc=bhelgaas@google.com \
--cc=jbarnes@virtuousgeek.org \
--cc=kaneshige.kenji@jp.fujitsu.com \
--cc=linux-pci@vger.kernel.org \
/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.