hyper-v: Enable swiotlb bounce buffer for Isolation VM
authorTianyu Lan <Tianyu.Lan@microsoft.com>
Mon, 13 Dec 2021 07:14:04 +0000 (02:14 -0500)
committerWei Liu <wei.liu@kernel.org>
Mon, 20 Dec 2021 18:01:09 +0000 (18:01 +0000)
hyperv Isolation VM requires bounce buffer support to copy
data from/to encrypted memory and so enable swiotlb force
mode to use swiotlb bounce buffer for DMA transaction.

In Isolation VM with AMD SEV, the bounce buffer needs to be
accessed via extra address space which is above shared_gpa_boundary
(E.G 39 bit address line) reported by Hyper-V CPUID ISOLATION_CONFIG.
The access physical address will be original physical address +
shared_gpa_boundary. The shared_gpa_boundary in the AMD SEV SNP
spec is called virtual top of memory(vTOM). Memory addresses below
vTOM are automatically treated as private while memory above
vTOM is treated as shared.

Swiotlb bounce buffer code calls set_memory_decrypted()
to mark bounce buffer visible to host and map it in extra
address space via memremap. Populate the shared_gpa_boundary
(vTOM) via swiotlb_unencrypted_base variable.

The map function memremap() can't work in the early place
(e.g ms_hyperv_init_platform()) and so call swiotlb_update_mem_
attributes() in the hyperv_init().

Signed-off-by: Tianyu Lan <Tianyu.Lan@microsoft.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/20211213071407.314309-4-ltykernel@gmail.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
arch/x86/hyperv/hv_init.c
arch/x86/kernel/cpu/mshyperv.c

index 96eb7db31c8ed0e03bc93a8c4594376a20f1f6da..559b6954fee685ea0dfb81c4f29bbab39068b83b 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/syscore_ops.h>
 #include <clocksource/hyperv_timer.h>
 #include <linux/highmem.h>
+#include <linux/swiotlb.h>
 
 int hyperv_init_cpuhp;
 u64 hv_current_partition_id = ~0ull;
@@ -498,6 +499,17 @@ void __init hyperv_init(void)
 
        /* Query the VMs extended capability once, so that it can be cached. */
        hv_query_ext_cap(0);
+
+#ifdef CONFIG_SWIOTLB
+       /*
+        * Swiotlb bounce buffer needs to be mapped in extra address
+        * space. Map function doesn't work in the early place and so
+        * call swiotlb_update_mem_attributes() here.
+        */
+       if (hv_is_isolation_supported())
+               swiotlb_update_mem_attributes();
+#endif
+
        return;
 
 clean_guest_os_id:
index ff55df60228f728c0ea1f5b49eb56316de81661b..94c4994572889e1586ceb9c41733cf43e0f5d24a 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/kexec.h>
 #include <linux/i8253.h>
 #include <linux/random.h>
+#include <linux/swiotlb.h>
 #include <asm/processor.h>
 #include <asm/hypervisor.h>
 #include <asm/hyperv-tlfs.h>
@@ -329,8 +330,20 @@ static void __init ms_hyperv_init_platform(void)
                pr_info("Hyper-V: Isolation Config: Group A 0x%x, Group B 0x%x\n",
                        ms_hyperv.isolation_config_a, ms_hyperv.isolation_config_b);
 
-               if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP)
+               if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) {
                        static_branch_enable(&isolation_type_snp);
+#ifdef CONFIG_SWIOTLB
+                       swiotlb_unencrypted_base = ms_hyperv.shared_gpa_boundary;
+#endif
+               }
+
+#ifdef CONFIG_SWIOTLB
+               /*
+                * Enable swiotlb force mode in Isolation VM to
+                * use swiotlb bounce buffer for dma transaction.
+                */
+               swiotlb_force = SWIOTLB_FORCE;
+#endif
        }
 
        if (hv_max_functions_eax >= HYPERV_CPUID_NESTED_FEATURES) {