[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 11/11] xen/arm: Add linux,pci-domain property for hwdom if not available.
On Wed, 6 Oct 2021, Rahul Singh wrote: > If the property is not present in the device tree node for host bridge, > XEN while creating the dtb for hwdom will create this property and > assigns the already allocated segment to the host bridge > so that XEN and linux will have the same segment for the host bridges. > > Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx> > Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx> > Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> I committed this patch > --- > Change in v5: none > Change in v4: > - Added Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > - Added Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx> > Change in v3: > - Use is_pci_passthrough_enabled() > Change in v2: > - Add linux,pci-domain only when pci-passthrough command line option is > enabeld > --- > --- > xen/arch/arm/domain_build.c | 16 ++++++++++++++++ > xen/arch/arm/pci/pci-host-common.c | 21 +++++++++++++++++++++ > xen/include/asm-arm/pci.h | 9 +++++++++ > 3 files changed, 46 insertions(+) > > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c > index f4c89bde8c..8739e3285e 100644 > --- a/xen/arch/arm/domain_build.c > +++ b/xen/arch/arm/domain_build.c > @@ -747,6 +747,22 @@ static int __init write_properties(struct domain *d, > struct kernel_info *kinfo, > return res; > } > > + if ( is_pci_passthrough_enabled() && dt_device_type_is_equal(node, > "pci") ) > + { > + if ( !dt_find_property(node, "linux,pci-domain", NULL) ) > + { > + uint16_t segment; > + > + res = pci_get_host_bridge_segment(node, &segment); > + if ( res < 0 ) > + return res; > + > + res = fdt_property_cell(kinfo->fdt, "linux,pci-domain", segment); > + if ( res ) > + return res; > + } > + } > + > /* > * Override the property "status" to disable the device when it's > * marked for passthrough. > diff --git a/xen/arch/arm/pci/pci-host-common.c > b/xen/arch/arm/pci/pci-host-common.c > index c5941b10e9..593beeb48c 100644 > --- a/xen/arch/arm/pci/pci-host-common.c > +++ b/xen/arch/arm/pci/pci-host-common.c > @@ -255,6 +255,27 @@ struct pci_host_bridge *pci_find_host_bridge(uint16_t > segment, uint8_t bus) > > return NULL; > } > + > +/* > + * This function will lookup an hostbridge based on config space address. > + */ > +int pci_get_host_bridge_segment(const struct dt_device_node *node, > + uint16_t *segment) > +{ > + struct pci_host_bridge *bridge; > + > + list_for_each_entry( bridge, &pci_host_bridges, node ) > + { > + if ( bridge->dt_node != node ) > + continue; > + > + *segment = bridge->segment; > + return 0; > + } > + > + return -EINVAL; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/include/asm-arm/pci.h b/xen/include/asm-arm/pci.h > index 5532ce3977..7cb2e2f1ed 100644 > --- a/xen/include/asm-arm/pci.h > +++ b/xen/include/asm-arm/pci.h > @@ -90,6 +90,8 @@ int pci_generic_config_write(struct pci_host_bridge > *bridge, pci_sbdf_t sbdf, > void __iomem *pci_ecam_map_bus(struct pci_host_bridge *bridge, > pci_sbdf_t sbdf, uint32_t where); > struct pci_host_bridge *pci_find_host_bridge(uint16_t segment, uint8_t bus); > +int pci_get_host_bridge_segment(const struct dt_device_node *node, > + uint16_t *segment); > > static always_inline bool is_pci_passthrough_enabled(void) > { > @@ -104,5 +106,12 @@ static always_inline bool > is_pci_passthrough_enabled(void) > return false; > } > > +static inline int pci_get_host_bridge_segment(const struct dt_device_node > *node, > + uint16_t *segment) > +{ > + ASSERT_UNREACHABLE(); > + return -EINVAL; > +} > + > #endif /*!CONFIG_HAS_PCI*/ > #endif /* __ARM_PCI_H__ */ > -- > 2.25.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |