Message ID | 20211004141151.132231-6-andr2000@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | PCI devices passthrough on Arm, part 2 | expand |
Hi Oleksandr, > On 4 Oct 2021, at 3:11 pm, Oleksandr Andrushchenko <andr2000@gmail.com> wrote: > > From: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> > > While adding a PCI device mark it as such, so other frameworks > can distinguish it from DT devices. > For that introduce an architecture defined helper which may perform > additional initialization of the newly created PCI device. > > Cc: Andrew Cooper <andrew.cooper3@citrix.com> > Cc: Paul Durrant <paul@xen.org> > Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> > [applicable parts] > Acked-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Rahul Singh <rahul.singh@arm.com> Tested-by: Rahul Singh <rahul.singh@arm.com> Regards, Rahul > --- > Since v3: > - fixed Arm build without CONFIG_HAS_PCI > Since v2: > - !! dropped Stefano's r-b because of the changes > - introduced arch_pci_init_pdev (Jan) > Since v1: > - moved the assignment from iommu_add_device to alloc_pdev > --- > xen/arch/arm/pci/pci.c | 5 +++++ > xen/drivers/passthrough/pci.c | 2 ++ > xen/include/asm-arm/pci.h | 7 +++++++ > xen/include/asm-x86/pci.h | 2 ++ > 4 files changed, 16 insertions(+) > > diff --git a/xen/arch/arm/pci/pci.c b/xen/arch/arm/pci/pci.c > index 138da19284ab..082c14e127a8 100644 > --- a/xen/arch/arm/pci/pci.c > +++ b/xen/arch/arm/pci/pci.c > @@ -34,6 +34,11 @@ struct pci_dev *dev_to_pci(struct device *dev) > return container_of(dev, struct pci_dev, arch.dev); > } > > +void arch_pci_init_pdev(struct pci_dev *pdev) > +{ > + pci_to_dev(pdev)->type = DEV_PCI; > +} > + > static int __init dt_pci_init(void) > { > struct dt_device_node *np; > diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c > index b36d5a481162..9e6246afeef5 100644 > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -329,6 +329,8 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg, u8 bus, u8 devfn) > *((u8*) &pdev->devfn) = devfn; > pdev->domain = NULL; > > + arch_pci_init_pdev(pdev); > + > rc = pdev_msi_init(pdev); > if ( rc ) > { > diff --git a/xen/include/asm-arm/pci.h b/xen/include/asm-arm/pci.h > index e6d4000e2ac8..ea87ec6006fc 100644 > --- a/xen/include/asm-arm/pci.h > +++ b/xen/include/asm-arm/pci.h > @@ -105,6 +105,9 @@ static always_inline bool is_pci_passthrough_enabled(void) > { > return pci_passthrough_enabled; > } > + > +void arch_pci_init_pdev(struct pci_dev *pdev); > + > #else /*!CONFIG_HAS_PCI*/ > > struct arch_pci_dev { }; > @@ -121,5 +124,9 @@ static inline int pci_get_host_bridge_segment(const struct dt_device_node *node, > return -EINVAL; > } > > +struct pci_dev; > + > +static inline void arch_pci_init_pdev(struct pci_dev *pdev) {} > + > #endif /*!CONFIG_HAS_PCI*/ > #endif /* __ARM_PCI_H__ */ > diff --git a/xen/include/asm-x86/pci.h b/xen/include/asm-x86/pci.h > index c4a4fdcbc239..443f25347d08 100644 > --- a/xen/include/asm-x86/pci.h > +++ b/xen/include/asm-x86/pci.h > @@ -36,4 +36,6 @@ static always_inline bool is_pci_passthrough_enabled(void) > return true; > } > > +static inline void arch_pci_init_pdev(struct pci_dev *pdev) {} > + > #endif /* __X86_PCI_H__ */ > -- > 2.25.1 >
diff --git a/xen/arch/arm/pci/pci.c b/xen/arch/arm/pci/pci.c index 138da19284ab..082c14e127a8 100644 --- a/xen/arch/arm/pci/pci.c +++ b/xen/arch/arm/pci/pci.c @@ -34,6 +34,11 @@ struct pci_dev *dev_to_pci(struct device *dev) return container_of(dev, struct pci_dev, arch.dev); } +void arch_pci_init_pdev(struct pci_dev *pdev) +{ + pci_to_dev(pdev)->type = DEV_PCI; +} + static int __init dt_pci_init(void) { struct dt_device_node *np; diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index b36d5a481162..9e6246afeef5 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -329,6 +329,8 @@ static struct pci_dev *alloc_pdev(struct pci_seg *pseg, u8 bus, u8 devfn) *((u8*) &pdev->devfn) = devfn; pdev->domain = NULL; + arch_pci_init_pdev(pdev); + rc = pdev_msi_init(pdev); if ( rc ) { diff --git a/xen/include/asm-arm/pci.h b/xen/include/asm-arm/pci.h index e6d4000e2ac8..ea87ec6006fc 100644 --- a/xen/include/asm-arm/pci.h +++ b/xen/include/asm-arm/pci.h @@ -105,6 +105,9 @@ static always_inline bool is_pci_passthrough_enabled(void) { return pci_passthrough_enabled; } + +void arch_pci_init_pdev(struct pci_dev *pdev); + #else /*!CONFIG_HAS_PCI*/ struct arch_pci_dev { }; @@ -121,5 +124,9 @@ static inline int pci_get_host_bridge_segment(const struct dt_device_node *node, return -EINVAL; } +struct pci_dev; + +static inline void arch_pci_init_pdev(struct pci_dev *pdev) {} + #endif /*!CONFIG_HAS_PCI*/ #endif /* __ARM_PCI_H__ */ diff --git a/xen/include/asm-x86/pci.h b/xen/include/asm-x86/pci.h index c4a4fdcbc239..443f25347d08 100644 --- a/xen/include/asm-x86/pci.h +++ b/xen/include/asm-x86/pci.h @@ -36,4 +36,6 @@ static always_inline bool is_pci_passthrough_enabled(void) return true; } +static inline void arch_pci_init_pdev(struct pci_dev *pdev) {} + #endif /* __X86_PCI_H__ */