Message ID | 1425868467-9667-5-git-send-email-wangyijing@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Mar 09, 2015 at 10:34:01AM +0800, Yijing Wang wrote: > From: Arnd Bergmann <arnd@arndb.de> > > Use pci_scan_root_bus() instead of deprecated function > pci_scan_bus_parented(). > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > Signed-off-by: Yijing Wang <wangyijing@huawei.com> > CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> > CC: xen-devel@lists.xenproject.org > Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> > --- > drivers/pci/xen-pcifront.c | 12 +++++++++--- > 1 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c > index b1ffebe..9e7c28b 100644 > --- a/drivers/pci/xen-pcifront.c > +++ b/drivers/pci/xen-pcifront.c > @@ -21,6 +21,7 @@ > #include <linux/bitops.h> > #include <linux/time.h> > #include <xen/platform_pci.h> > +#include "pci.h" > > #include <asm/xen/swiotlb-xen.h> > #define INVALID_GRANT_REF (0) > @@ -446,6 +447,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev, > unsigned int domain, unsigned int bus) > { > struct pci_bus *b; > + LIST_HEAD(resources); > struct pcifront_sd *sd = NULL; > struct pci_bus_entry *bus_entry = NULL; > int err = 0; > @@ -470,17 +472,21 @@ static int pcifront_scan_root(struct pcifront_device *pdev, > err = -ENOMEM; > goto err_out; > } > + pci_add_resource(&resources, &ioport_resource); > + pci_add_resource(&resources, &iomem_resource); > + pci_add_resource(&resources, &busn_resource); Since I don't want to export busn_resource, you might have to allocate your own struct resource for it here. And, of course, figure out the details of which PCI domain you're in and whether you need to share one struct resource across several host bridges in the same domain. > pcifront_init_sd(sd, domain, bus, pdev); > > pci_lock_rescan_remove(); > > - b = pci_scan_bus_parented(&pdev->xdev->dev, bus, > - &pcifront_bus_ops, sd); > + b = pci_scan_root_bus(&pdev->xdev->dev, bus, > + &pcifront_bus_ops, sd, &resources); > if (!b) { > dev_err(&pdev->xdev->dev, > "Error creating PCI Frontend Bus!\n"); > err = -ENOMEM; > pci_unlock_rescan_remove(); > + pci_free_resource_list(&resources); > goto err_out; > } > > @@ -488,7 +494,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev, > > list_add(&bus_entry->list, &pdev->root_buses); > > - /* pci_scan_bus_parented skips devices which do not have a have > + /* pci_scan_root_bus skips devices which do not have a > * devfn==0. The pcifront_scan_bus enumerates all devfn. */ > err = pcifront_scan_bus(pdev, domain, bus, b); > > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
>> struct pci_bus *b; >> + LIST_HEAD(resources); >> struct pcifront_sd *sd = NULL; >> struct pci_bus_entry *bus_entry = NULL; >> int err = 0; >> @@ -470,17 +472,21 @@ static int pcifront_scan_root(struct pcifront_device *pdev, >> err = -ENOMEM; >> goto err_out; >> } >> + pci_add_resource(&resources, &ioport_resource); >> + pci_add_resource(&resources, &iomem_resource); >> + pci_add_resource(&resources, &busn_resource); > > Since I don't want to export busn_resource, you might have to allocate your > own struct resource for it here. And, of course, figure out the details of > which PCI domain you're in and whether you need to share one struct > resource across several host bridges in the same domain. Allocate its own resource here is ok for me, as I mentioned in previous reply, so do we still need to add additional info to figure out which domain own the bus resource ? > >> pcifront_init_sd(sd, domain, bus, pdev); >> >> pci_lock_rescan_remove(); >> >> - b = pci_scan_bus_parented(&pdev->xdev->dev, bus, >> - &pcifront_bus_ops, sd); >> + b = pci_scan_root_bus(&pdev->xdev->dev, bus, >> + &pcifront_bus_ops, sd, &resources); >> if (!b) { >> dev_err(&pdev->xdev->dev, >> "Error creating PCI Frontend Bus!\n"); >> err = -ENOMEM; >> pci_unlock_rescan_remove(); >> + pci_free_resource_list(&resources); >> goto err_out; >> } >> >> @@ -488,7 +494,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev, >> >> list_add(&bus_entry->list, &pdev->root_buses); >> >> - /* pci_scan_bus_parented skips devices which do not have a have >> + /* pci_scan_root_bus skips devices which do not have a >> * devfn==0. The pcifront_scan_bus enumerates all devfn. */ >> err = pcifront_scan_bus(pdev, domain, bus, b); >> >> -- >> 1.7.1 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-pci" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > . >
On Thu, Mar 12, 2015 at 07:46:45PM +0800, Yijing Wang wrote: > >> struct pci_bus *b; > >> + LIST_HEAD(resources); > >> struct pcifront_sd *sd = NULL; > >> struct pci_bus_entry *bus_entry = NULL; > >> int err = 0; > >> @@ -470,17 +472,21 @@ static int pcifront_scan_root(struct pcifront_device *pdev, > >> err = -ENOMEM; > >> goto err_out; > >> } > >> + pci_add_resource(&resources, &ioport_resource); > >> + pci_add_resource(&resources, &iomem_resource); > >> + pci_add_resource(&resources, &busn_resource); > > > > Since I don't want to export busn_resource, you might have to allocate your > > own struct resource for it here. And, of course, figure out the details of > > which PCI domain you're in and whether you need to share one struct > > resource across several host bridges in the same domain. > > Allocate its own resource here is ok for me, as I mentioned in previous reply, > so do we still need to add additional info to figure out which domain own the bus resource ? That's up to the caller. Only the platform knows which bridges it wants to have in the same domain. In principle, every host bridge could be in its own domain, since each bridge is the root of a unique PCI hierarchy. But some platforms have firmware that assumes otherwise. I have no idea what xen assumes. > >> pcifront_init_sd(sd, domain, bus, pdev); > >> > >> pci_lock_rescan_remove(); > >> > >> - b = pci_scan_bus_parented(&pdev->xdev->dev, bus, > >> - &pcifront_bus_ops, sd); > >> + b = pci_scan_root_bus(&pdev->xdev->dev, bus, > >> + &pcifront_bus_ops, sd, &resources); > >> if (!b) { > >> dev_err(&pdev->xdev->dev, > >> "Error creating PCI Frontend Bus!\n"); > >> err = -ENOMEM; > >> pci_unlock_rescan_remove(); > >> + pci_free_resource_list(&resources); > >> goto err_out; > >> } > >> > >> @@ -488,7 +494,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev, > >> > >> list_add(&bus_entry->list, &pdev->root_buses); > >> > >> - /* pci_scan_bus_parented skips devices which do not have a have > >> + /* pci_scan_root_bus skips devices which do not have a > >> * devfn==0. The pcifront_scan_bus enumerates all devfn. */ > >> err = pcifront_scan_bus(pdev, domain, bus, b); > >> > >> -- > >> 1.7.1 > >> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-pci" in > >> the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > > > . > > > > > -- > Thanks! > Yijing > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index b1ffebe..9e7c28b 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c @@ -21,6 +21,7 @@ #include <linux/bitops.h> #include <linux/time.h> #include <xen/platform_pci.h> +#include "pci.h" #include <asm/xen/swiotlb-xen.h> #define INVALID_GRANT_REF (0) @@ -446,6 +447,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev, unsigned int domain, unsigned int bus) { struct pci_bus *b; + LIST_HEAD(resources); struct pcifront_sd *sd = NULL; struct pci_bus_entry *bus_entry = NULL; int err = 0; @@ -470,17 +472,21 @@ static int pcifront_scan_root(struct pcifront_device *pdev, err = -ENOMEM; goto err_out; } + pci_add_resource(&resources, &ioport_resource); + pci_add_resource(&resources, &iomem_resource); + pci_add_resource(&resources, &busn_resource); pcifront_init_sd(sd, domain, bus, pdev); pci_lock_rescan_remove(); - b = pci_scan_bus_parented(&pdev->xdev->dev, bus, - &pcifront_bus_ops, sd); + b = pci_scan_root_bus(&pdev->xdev->dev, bus, + &pcifront_bus_ops, sd, &resources); if (!b) { dev_err(&pdev->xdev->dev, "Error creating PCI Frontend Bus!\n"); err = -ENOMEM; pci_unlock_rescan_remove(); + pci_free_resource_list(&resources); goto err_out; } @@ -488,7 +494,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev, list_add(&bus_entry->list, &pdev->root_buses); - /* pci_scan_bus_parented skips devices which do not have a have + /* pci_scan_root_bus skips devices which do not have a * devfn==0. The pcifront_scan_bus enumerates all devfn. */ err = pcifront_scan_bus(pdev, domain, bus, b);