Skip to content

Commit

Permalink
xen/arm: introduce XENFEAT_direct_mapped and XENFEAT_not_direct_mapped
Browse files Browse the repository at this point in the history
Newer Xen versions expose two Xen feature flags to tell us if the domain
is directly mapped or not. Only when a domain is directly mapped it
makes sense to enable swiotlb-xen on ARM.

Introduce a function on ARM to check the new Xen feature flags and also
to deal with the legacy case. Call the function xen_swiotlb_detect.

Signed-off-by: Stefano Stabellini <[email protected]>
Reviewed-by: Boris Ostrovsky <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Juergen Gross <[email protected]>
  • Loading branch information
Stefano Stabellini authored and jgross1 committed Apr 23, 2021
1 parent a929e12 commit f5079a9
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 2 deletions.
1 change: 1 addition & 0 deletions arch/arm/include/asm/xen/swiotlb-xen.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include <xen/arm/swiotlb-xen.h>
14 changes: 13 additions & 1 deletion arch/arm/xen/mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,22 @@ void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order)
return;
}

int xen_swiotlb_detect(void)
{
if (!xen_domain())
return 0;
if (xen_feature(XENFEAT_direct_mapped))
return 1;
/* legacy case */
if (!xen_feature(XENFEAT_not_direct_mapped) && xen_initial_domain())
return 1;
return 0;
}

static int __init xen_mm_init(void)
{
struct gnttab_cache_flush cflush;
if (!xen_initial_domain())
if (!xen_swiotlb_detect())
return 0;
xen_swiotlb_init(1, false);

Expand Down
1 change: 1 addition & 0 deletions arch/arm64/include/asm/xen/swiotlb-xen.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include <xen/arm/swiotlb-xen.h>
2 changes: 1 addition & 1 deletion arch/arm64/mm/dma-mapping.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
iommu_setup_dma_ops(dev, dma_base, size);

#ifdef CONFIG_XEN
if (xen_initial_domain())
if (xen_swiotlb_detect())
dev->dma_ops = &xen_swiotlb_dma_ops;
#endif
}
7 changes: 7 additions & 0 deletions include/xen/arm/swiotlb-xen.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_ARM_SWIOTLB_XEN_H
#define _ASM_ARM_SWIOTLB_XEN_H

extern int xen_swiotlb_detect(void);

#endif /* _ASM_ARM_SWIOTLB_XEN_H */
14 changes: 14 additions & 0 deletions include/xen/interface/features.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,20 @@
*/
#define XENFEAT_linux_rsdp_unrestricted 15

/*
* A direct-mapped (or 1:1 mapped) domain is a domain for which its
* local pages have gfn == mfn. If a domain is direct-mapped,
* XENFEAT_direct_mapped is set; otherwise XENFEAT_not_direct_mapped
* is set.
*
* If neither flag is set (e.g. older Xen releases) the assumptions are:
* - not auto_translated domains (x86 only) are always direct-mapped
* - on x86, auto_translated domains are not direct-mapped
* - on ARM, Dom0 is direct-mapped, DomUs are not
*/
#define XENFEAT_not_direct_mapped 16
#define XENFEAT_direct_mapped 17

#define XENFEAT_NR_SUBMAPS 1

#endif /* __XEN_PUBLIC_FEATURES_H__ */
1 change: 1 addition & 0 deletions include/xen/swiotlb-xen.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#define __LINUX_SWIOTLB_XEN_H

#include <linux/swiotlb.h>
#include <asm/xen/swiotlb-xen.h>

void xen_dma_sync_for_cpu(struct device *dev, dma_addr_t handle,
size_t size, enum dma_data_direction dir);
Expand Down

0 comments on commit f5079a9

Please sign in to comment.