]> xenbits.xensource.com Git - people/hx242/xen.git/commitdiff
xen/arm: Allow a platform to override the DMA width
authorJulien Grall <jgrall@amazon.com>
Sat, 16 May 2020 10:41:16 +0000 (11:41 +0100)
committerJulien Grall <jgrall@amazon.com>
Sun, 24 May 2020 13:59:46 +0000 (14:59 +0100)
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@amazon.com>
Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Tested-by: Corey Minyard <cminyard@mvista.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
xen/arch/arm/platform.c
xen/include/asm-arm/mm.h
xen/include/asm-arm/numa.h
xen/include/asm-arm/platform.h

index 8eb0b6e57a5a784f9ca6ff8e199e024382594963..4db5bbb4c51d9ebdfba49d24f4ea140b3589d720 100644 (file)
@@ -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
index 7df91280bc77db3e58ff44acbf5d273a34ab388c..f8ba49b1188f0486e8ddc6cd9b2fe2db55c2123f 100644 (file)
@@ -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:
index 490d1f31aa14ddf3b1154c7f88dd47d97813c86f..31a6de4e2346401461593b52fe9433b0f6cda78b 100644 (file)
@@ -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:
index ed4d30a1be7cb1b30101ad70a28db4acfdbea25a..997eb25216316b174c0561b2f6008a8d6afaae57 100644 (file)
@@ -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;
 };
 
 /*