Message ID | 20240412084213.1733764-9-steven.price@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: Support for running as a guest in Arm CCA | expand |
On Fri, Apr 12, 2024 at 09:42:07AM +0100, Steven Price wrote: > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > index 786fd6ce5f17..01a2e3ce6921 100644 > --- a/arch/arm64/mm/init.c > +++ b/arch/arm64/mm/init.c > @@ -370,7 +370,9 @@ void __init bootmem_init(void) > */ > void __init mem_init(void) > { > - bool swiotlb = max_pfn > PFN_DOWN(arm64_dma_phys_limit); > + bool swiotlb = (max_pfn > PFN_DOWN(arm64_dma_phys_limit)); This series tends to add unnecessary brackets. > + > + swiotlb |= is_realm_world(); I first thought we wouldn't need this, just passing 'true' further down but I guess you want to avoid reducing the bounce buffer size when it's only needed for kmalloc() bouncing. > > if (IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) && !swiotlb) { > /* > @@ -383,7 +385,12 @@ void __init mem_init(void) > swiotlb = true; > } > > - swiotlb_init(swiotlb, SWIOTLB_VERBOSE); > + if (is_realm_world()) { > + swiotlb_init(swiotlb, SWIOTLB_VERBOSE | SWIOTLB_FORCE); > + swiotlb_update_mem_attributes(); > + } else { > + swiotlb_init(swiotlb, SWIOTLB_VERBOSE); > + } Just do this higher up and avoid calling is_realm_world() twice: unsigned int flags = SWIOTLB_VERBOSE; ... if (is_realm_world()) { swiotlb = true; flags |= SWIOTLB_FORCE; } ... swiotlb_init(swiotlb, flags);
diff --git a/arch/arm64/kernel/rsi.c b/arch/arm64/kernel/rsi.c index 159bc428c77b..5c8ed3aaa35f 100644 --- a/arch/arm64/kernel/rsi.c +++ b/arch/arm64/kernel/rsi.c @@ -5,6 +5,8 @@ #include <linux/jump_label.h> #include <linux/memblock.h> +#include <linux/swiotlb.h> + #include <asm/rsi.h> struct realm_config __attribute((aligned(PAGE_SIZE))) config; diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 786fd6ce5f17..01a2e3ce6921 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -370,7 +370,9 @@ void __init bootmem_init(void) */ void __init mem_init(void) { - bool swiotlb = max_pfn > PFN_DOWN(arm64_dma_phys_limit); + bool swiotlb = (max_pfn > PFN_DOWN(arm64_dma_phys_limit)); + + swiotlb |= is_realm_world(); if (IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) && !swiotlb) { /* @@ -383,7 +385,12 @@ void __init mem_init(void) swiotlb = true; } - swiotlb_init(swiotlb, SWIOTLB_VERBOSE); + if (is_realm_world()) { + swiotlb_init(swiotlb, SWIOTLB_VERBOSE | SWIOTLB_FORCE); + swiotlb_update_mem_attributes(); + } else { + swiotlb_init(swiotlb, SWIOTLB_VERBOSE); + } /* this will put all unused low memory onto the freelists */ memblock_free_all();