[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.14 1/3] xen/arm: Allow a platform to override the DMA width
Hi Julien, On Mon, 2020-05-18 at 12:30 +0100, Julien Grall wrote: > From: Julien Grall <jgrall@xxxxxxxxxx> > > At the moment, Xen is assuming that all the devices are at least 32-bit > DMA capable. However, some SoC have devices that may be able to access > a much restricted range. For instance, the RPI has devices that can > only access the first 1GB of RAM. > > The structure platform_desc is now extended to allow a platform to > override the DMA width. The new is used to implement > arch_get_dma_bit_size(). > > The prototype is now moved in asm-arm/mm.h as the function is not NUMA > specific. The implementation is done in platform.c so we don't have to > include platform.h everywhere. This should be fine as the function is > not expected to be called in hotpath. > > Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx> > --- > > Cc: Jan Beulich <jbeulich@xxxxxxxx> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > Cc: George Dunlap <george.dunlap@xxxxxxxxxx> > > I noticed that arch_get_dma_bit_size() is only called when there is more > than one NUMA node. I am a bit unsure what is the reason behind it. > > The goal for Arm is to use arch_get_dma_bit_size() when deciding how low > the first Dom0 bank should be allocated. > --- > xen/arch/arm/platform.c | 5 +++++ > xen/include/asm-arm/mm.h | 2 ++ > xen/include/asm-arm/numa.h | 5 ----- > xen/include/asm-arm/platform.h | 2 ++ > 4 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/xen/arch/arm/platform.c b/xen/arch/arm/platform.c > index 8eb0b6e57a5a..4db5bbb4c51d 100644 > --- a/xen/arch/arm/platform.c > +++ b/xen/arch/arm/platform.c > @@ -155,6 +155,11 @@ bool platform_device_is_blacklisted(const struct > dt_device_node *node) > return (dt_match_node(blacklist, node) != NULL); > } > > +unsigned int arch_get_dma_bitsize(void) > +{ > + return ( platform && platform->dma_bitsize ) ? platform->dma_bitsize : > 32; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h > index 7df91280bc77..f8ba49b1188f 100644 > --- a/xen/include/asm-arm/mm.h > +++ b/xen/include/asm-arm/mm.h > @@ -366,6 +366,8 @@ int arch_acquire_resource(struct domain *d, unsigned int > type, unsigned int id, > return -EOPNOTSUPP; > } > > +unsigned int arch_get_dma_bitsize(void); > + > #endif /* __ARCH_ARM_MM__ */ > /* > * Local variables: > diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h > index 490d1f31aa14..31a6de4e2346 100644 > --- a/xen/include/asm-arm/numa.h > +++ b/xen/include/asm-arm/numa.h > @@ -25,11 +25,6 @@ extern mfn_t first_valid_mfn; > #define node_start_pfn(nid) (mfn_x(first_valid_mfn)) > #define __node_distance(a, b) (20) > > -static inline unsigned int arch_get_dma_bitsize(void) > -{ > - return 32; > -} > - > #endif /* __ARCH_ARM_NUMA_H */ > /* > * Local variables: > diff --git a/xen/include/asm-arm/platform.h b/xen/include/asm-arm/platform.h > index ed4d30a1be7c..997eb2521631 100644 > --- a/xen/include/asm-arm/platform.h > +++ b/xen/include/asm-arm/platform.h > @@ -38,6 +38,8 @@ struct platform_desc { > * List of devices which must not pass-through to a guest > */ > const struct dt_device_match *blacklist_dev; > + /* Override the DMA width (32-bit by default). */ > + unsigned int dma_bitsize; > }; > > /*
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |