|
[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 |