{"id":2224932,"url":"http://patchwork.ozlabs.org/api/patches/2224932/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/patch/20260419173829.1074404-1-aswin.murugan@oss.qualcomm.com/","project":{"id":18,"url":"http://patchwork.ozlabs.org/api/projects/18/?format=json","name":"U-Boot","link_name":"uboot","list_id":"u-boot.lists.denx.de","list_email":"u-boot@lists.denx.de","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260419173829.1074404-1-aswin.murugan@oss.qualcomm.com>","list_archive_url":null,"date":"2026-04-19T17:38:29","name":"[v1] mach-snapdragon: Add KVM hypervisor support","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":false,"hash":"ae96cb809a27e74dde7addfe87c640577befe93c","submitter":{"id":90811,"url":"http://patchwork.ozlabs.org/api/people/90811/?format=json","name":"Aswin Murugan","email":"aswin.murugan@oss.qualcomm.com"},"delegate":{"id":84350,"url":"http://patchwork.ozlabs.org/api/users/84350/?format=json","username":"narmstrong","first_name":"Neil","last_name":"Armstrong","email":"narmstrong@baylibre.com"},"mbox":"http://patchwork.ozlabs.org/project/uboot/patch/20260419173829.1074404-1-aswin.murugan@oss.qualcomm.com/mbox/","series":[{"id":500521,"url":"http://patchwork.ozlabs.org/api/series/500521/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/list/?series=500521","date":"2026-04-19T17:38:29","name":"[v1] mach-snapdragon: Add KVM hypervisor support","version":1,"mbox":"http://patchwork.ozlabs.org/series/500521/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2224932/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2224932/checks/","tags":{},"related":[],"headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=nqw7/hmn;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=UX3vA+9l;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=85.214.62.61; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=oss.qualcomm.com","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com\n header.b=\"nqw7/hmn\";\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.b=\"UX3vA+9l\";\n\tdkim-atps=neutral","phobos.denx.de; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com","phobos.denx.de;\n spf=pass smtp.mailfrom=aswin.murugan@oss.qualcomm.com"],"Received":["from phobos.denx.de (phobos.denx.de [85.214.62.61])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fzG7s5KXPz1yGt\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 03:39:05 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id F2D7183E81;\n\tSun, 19 Apr 2026 19:38:56 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id DEE8884181; Sun, 19 Apr 2026 19:38:55 +0200 (CEST)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n [205.220.180.131])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id B0E7A839D9\n for <u-boot@lists.denx.de>; Sun, 19 Apr 2026 19:38:52 +0200 (CEST)","from pps.filterd (m0279869.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 63JGCU1n2107176\n for <u-boot@lists.denx.de>; Sun, 19 Apr 2026 17:38:51 GMT","from mail-pf1-f197.google.com (mail-pf1-f197.google.com\n [209.85.210.197])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dm0y632vh-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <u-boot@lists.denx.de>; Sun, 19 Apr 2026 17:38:50 +0000 (GMT)","by mail-pf1-f197.google.com with SMTP id\n d2e1a72fcca58-82f7bec24fdso1390456b3a.2\n for <u-boot@lists.denx.de>; Sun, 19 Apr 2026 10:38:50 -0700 (PDT)","from hu-aswinm-blr.qualcomm.com\n (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19])\n by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-82f97eb5ce8sm6020070b3a.61.2026.04.19.10.38.45\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sun, 19 Apr 2026 10:38:48 -0700 (PDT)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n content-transfer-encoding:date:from:message-id:mime-version\n :subject:to; s=qcppdkim1; bh=4r5zEIU/dXPfFFQqEgbH8fxAnczLuX4G31A\n z5P/PXuU=; b=nqw7/hmnLp8v7G3SKRuwfIqSKc4qyrZ8lHhYrWYWtcaZ6WYwz9o\n 8xE6Y67LinKt7/didIDy0DA0QFkWz6fVm7T9deVUJaEk3kFGeRtoB0hK0BKEJUSH\n 0KGsVRJkIMw5xpbToKo2ITskZZlIZRByIc2Ns6qkZbad08uA+hsdRGpEUQL3XMuj\n j+cUQbWXEDmj7NtAuTtzKbk35YYL1Af0Hb8unmtrzFSN22FRrIc8ecTjpZwP2IiT\n UUj0q2gvIr+MiqoHXBUu0FfU7sz85SV2RAm3z5Ei/eJzgWObeBVG1RSuueMsBYve\n e3toQkwLos2ZTuE9i4RVdinqfGDo1bWKFgg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1776620330; x=1777225130; darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:message-id:date:subject:to\n :from:from:to:cc:subject:date:message-id:reply-to;\n bh=4r5zEIU/dXPfFFQqEgbH8fxAnczLuX4G31Az5P/PXuU=;\n b=UX3vA+9lC2T2TYnpL8fwWNxNYSbYLeDo0qEXGI/r3G4F9sAQ/vhvA5IOX6f/yC+Ym1\n lRRm30kDC1sn7PrJaKcPGOJjY1+KKEu1YZNUFTzRklZPy7GMzVLwMVPliSfio9fPAkAi\n wn+StQKXW6q5NatBKxDKaajuKQ/cP+x6oE3pDsG1RdLiRmtS9QF2o8Tke6zlzj6Y9YXP\n 6SKr9//cLchoFtgjLFn+aPpAFRuSeW2cdJoy28IaSkILYtiGQvS82OfBM5Sn7wnAB4KL\n aRYvNejgHQyblx2EtKZjS8NZz+gdskCwwkE0sM1udCP4WQpiY1JZ3CcQtwRLCdjTquXc\n Uwkg=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776620330; x=1777225130;\n h=content-transfer-encoding:mime-version:message-id:date:subject:to\n :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=4r5zEIU/dXPfFFQqEgbH8fxAnczLuX4G31Az5P/PXuU=;\n b=ngymTdrL/36i+9EpECf2OLbS8bjGPgfZMr9N2gQ19MNWcRoYatpe1P92jjpvWZJk+B\n ORYWCC56Afga6j9JbeHXd1x9DwflZTrhenjH73X+13xeSw+QB0BRyT6Mch93/EC86UQ3\n 2HO58atoEvx3Rr5acKjF9yyDHXyQ5OBMi4mWzcekMAnSZo5bohuQlSxpwiKcTrodJWQm\n WvLylMb4PkK5VBIrkul86Cd4FbhoV2Ns8OWvLGTGHUfroWwjj7rtzVT4MeIjMo0eEWNl\n GaJSvsbwcMwncbRPzjWnpJjLLkbrPI6cJveMCxPUHYqFeNhic+SK3IdUe5Vc0zDFkTHC\n W04Q==","X-Forwarded-Encrypted":"i=1;\n AFNElJ8V+ZpSl04V++WBqHo7yGJQrlKjHDjm8STjzR08QqlqyH01dbJA8MT84tnOWxisAzljxFzluro=@lists.denx.de","X-Gm-Message-State":"AOJu0YxEv9p/R4l8379leAfo6RYPmetyX310pudL8RtbA7nE3Job9HtD\n HEjcyapm6TcelF2daWCstBl4HAvOWUzvzb21oUMSG90cXMokI5vAIgIuuUbRyPl0cLyW2f3YVba\n v8ypogKKtCLARa67SOAA+YxJruWnjPuAY9ol285LjK6O3Jv96x2WI7u9u","X-Gm-Gg":"AeBDieuXgG1luC0huaQHIUnw0GRptOLs2zSW+AilHIvR1h86+7TPym9TEsRbshyLztt\n rwJIH9eVT4xRYe73U6bpQOQ3mKpvB7osPpkbHLS4n10x4ECcHphVSUgly9HjxZd8P4shIRN5vLU\n 5oAUnESpK5HuYPv/pS+8XLRDJGuSTSUOqMyYf3tOZEI+0vBMLhCDwnRT7gu0cGr4BTLP5V5LgeG\n +XE0VLD3Upvfoxuk8QrKJ/C7xLXUlPrWDMIMHmbYYb6l13FVmLwQEA/mo910trX5BnCjd/swYnz\n DiFrpQ/vzw/s7Yc/X87rBztVTwZroJqQ01a09KNZiAxBATPwSQ+e4oet4Y5eHEnhjoa0sX/2xrz\n vQmuNbTEoPFJzd6NApjd8iqkvcRowwT8YtOWEhjlLCTVH502hwAlSbD9iRrJaygBXg2DnR1HZ93\n QF226h7T9g4EZ8NvXKwE8IPOrzik6X8C06U0svvTWJ8qBHFZTU3mo=","X-Received":["by 2002:a05:6a00:4214:b0:81f:3fbd:ccf with SMTP id\n d2e1a72fcca58-82f8c8bcc27mr9943627b3a.23.1776620329829;\n Sun, 19 Apr 2026 10:38:49 -0700 (PDT)","by 2002:a05:6a00:4214:b0:81f:3fbd:ccf with SMTP id\n d2e1a72fcca58-82f8c8bcc27mr9943610b3a.23.1776620329320;\n Sun, 19 Apr 2026 10:38:49 -0700 (PDT)"],"From":"Aswin Murugan <aswin.murugan@oss.qualcomm.com>","To":"trini@konsulko.com, casey.connolly@linaro.org, neil.armstrong@linaro.org,\n sumit.garg@kernel.org, aswin.murugan@oss.qualcomm.com,\n sughosh.ganu@arm.com, gchan9527@gmail.com, u-boot-qcom@groups.io,\n u-boot@lists.denx.de","Subject":"[PATCH v1] mach-snapdragon: Add KVM hypervisor support","Date":"Sun, 19 Apr 2026 23:08:29 +0530","Message-Id":"<20260419173829.1074404-1-aswin.murugan@oss.qualcomm.com>","X-Mailer":"git-send-email 2.34.1","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Proofpoint-ORIG-GUID":"AtxXdBqCXyXLy9p0SutJyOmb8votIZt4","X-Authority-Analysis":"v=2.4 cv=Fpo1OWrq c=1 sm=1 tr=0 ts=69e5132a cx=c_pps\n a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17\n a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8\n a=v8_0fD8sVwdknlzlMUYA:9 a=2VI0MkxyNR6bbpdq8BZq:22","X-Proofpoint-GUID":"AtxXdBqCXyXLy9p0SutJyOmb8votIZt4","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDE5MDE4OCBTYWx0ZWRfXzSYoMWxffcpN\n SYffe2VhJHgzImDCno6S5ual6LW+uV/UbuihllLZnOOc2saRXWc4qWE2ZOmS1D+6vDHuVS3se1f\n 3UmnQFnvDxac3GvPnYtQliHdUW2a+z5Fg8y1ciOUwktIgiMwcrmTN2GKEHzzlzFPhxBkAPMOj3u\n srXTqxpKZmhi3yEVd8fCYhu8q1E5JIu5Wz9Ix6Osd17g0Nap5VdLvknhUDeaU2tR3vS+P0Q1YS4\n l3H4Am1pD5YNR33JwAnEmMK+G4f+JiUG0N9n8RdHPtKdqAPp/qc/eZXoWBQWAhPBmMym7so5h+F\n UqaJ7yic6+wqjk7nDzh1ukgGy23bCq4fdZQOMnemvMnp3ypj1bVcqN9le3h2dCUUCzkSwKwaReI\n RDJbSpYY0vo8bzSTkdcfWYFQmnW8zk4weGTCTgScvARkKgwHe6LyG2SaqFfYCHDDxCi4YPjQxEy\n mUQkRJhN+KeSji2Fxng==","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-19_05,2026-04-17_04,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n impostorscore=0 phishscore=0 suspectscore=0 lowpriorityscore=0 bulkscore=0\n priorityscore=1501 clxscore=1015 adultscore=0 spamscore=0 malwarescore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2604070000 definitions=main-2604190188","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"},"content":"Enable Linux KVM virtualization on Snapdragon SoCs.\n\nIntroduce CONFIG_QCOM_KVM_SUPPORT to select KVM or Gunyah\nhypervisor modes at build time.\n\nqcom-priv.h:\n - Add TrustZone SMC interface definitions and parameter IDs\n - Define hypervisor boot types (GUNYAH=0, KVM=1)\n - Add TCR_EL2 bit field definitions for memory config\n\nboard.c:\n - Add qcom_configure_kvm_hypervisor() with EL-aware logic\n - EL2: Perform direct SMC call for hypervisor setup\n - EL1: Save context, disable caches, run SMC, restore state,\n   reconfigure TCR_EL2, re-enable caches\n - Add qcom_configure_gunyah_hypervisor() for standard flow\n - Add SCM service availability checks\n\nDefault mode remains Gunyah. Enable CONFIG_QCOM_KVM_SUPPORT to\nselect KVM for Linux.\n\nSigned-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>\n---\n arch/arm/mach-snapdragon/Kconfig     |   7 ++\n arch/arm/mach-snapdragon/board.c     | 154 +++++++++++++++++++++++++++\n arch/arm/mach-snapdragon/qcom-priv.h |  31 ++++++\n 3 files changed, 192 insertions(+)","diff":"diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig\nindex d3de8693b5a..2e5676945ca 100644\n--- a/arch/arm/mach-snapdragon/Kconfig\n+++ b/arch/arm/mach-snapdragon/Kconfig\n@@ -42,4 +42,11 @@ config SYS_CONFIG_NAME\n \t  Based on this option include/configs/<CONFIG_SYS_CONFIG_NAME>.h header\n \t  will be used for board configuration.\n \n+config QCOM_KVM_SUPPORT\n+\tbool \"Enable KVM support for Qualcomm platforms\"\n+\tdepends on ARM64\n+\thelp\n+\t  This configures the hypervisor interface during boot to support\n+\t  KVM virtualization instead of the default Gunyah hypervisor.\n+\n endif\ndiff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c\nindex 5fb3240acc5..2926dd8ccc0 100644\n--- a/arch/arm/mach-snapdragon/board.c\n+++ b/arch/arm/mach-snapdragon/board.c\n@@ -510,6 +510,154 @@ void __weak qcom_late_init(void)\n {\n }\n \n+/**\n+ * qcom_configure_kvm_hypervisor() - Configure hypervisor for KVM guest mode\n+ *\n+ * Configures the hypervisor for KVM operation:\n+ * - EL2 path: Direct SMC call\n+ * - EL1 path: Save context, disable caches, SMC call, restore context\n+ *\n+ * Return: 0 on success, negative error code on failure\n+ */\n+static int qcom_configure_kvm_hypervisor(void)\n+{\n+\tstruct arm_smccc_res res;\n+\tu64 current_el;\n+\n+\tasm volatile(\"mrs %0, CurrentEL\" : \"=r\" (current_el));\n+\tcurrent_el = (current_el >> 2) & 0x3;\n+\n+\tlog_info(\"Configuring hypervisor for KVM (EL%llu)\\n\", current_el);\n+\n+\tarm_smccc_smc(TZ_INFO_IS_SVC_AVAILABLE_ID,\n+\t\t      TZ_INFO_IS_SVC_AVAILABLE_ID_PARAM_ID,\n+\t\t      TZ_CONFIGURE_MILESTONE_SERVICE_ID,\n+\t\t      0, 0, 0, 0, 0, &res);\n+\n+\tif (res.a0 != 0)\n+\t\tlog_debug(\"KVM milestone service not available (0x%lx)\\n\", res.a0);\n+\n+\tif (current_el == 2) {\n+\t\tlog_debug(\"At EL2\\n\");\n+\n+\t\tarm_smccc_smc(TZ_CONFIGURE_MILESTONE_SERVICE_ID,\n+\t\t\t      TZ_CONFIGURE_MILESTONE_SERVICE_PARAM_ID,\n+\t\t\t      0, 0, QCOM_HYP_BOOT_TYPE_KVM,\n+\t\t\t      0, 0, 0, &res);\n+\n+\t\tif (res.a0 != 0) {\n+\t\t\tlog_err(\"Hypervisor configuration failed: 0x%lx\\n\", res.a0);\n+\t\t\treturn -EIO;\n+\t\t}\n+\n+\t\tlog_info(\"KVM hypervisor configured\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tlog_debug(\"At EL1, saving register context\\n\");\n+\n+\tu64 ttbr0_el1, tcr_el1, tcr_el2, mair_el1;\n+\tu64 t0sz, phys_addr_size;\n+\n+\t/* Save EL1 system register context */\n+\tasm volatile(\"mrs %0, ttbr0_el1\" : \"=r\" (ttbr0_el1));\n+\tasm volatile(\"mrs %0, tcr_el1\" : \"=r\" (tcr_el1));\n+\tasm volatile(\"mrs %0, mair_el1\" : \"=r\" (mair_el1));\n+\n+\tt0sz = tcr_el1 & TCR_T0SZ_MASK;\n+\tphys_addr_size = tcr_el1 & TCR_PS_MASK;\n+\n+\tlog_debug(\"Saved context: TTBR0=0x%llx TCR=0x%llx MAIR=0x%llx\\n\",\n+\t\t  ttbr0_el1, tcr_el1, mair_el1);\n+\n+\ticache_disable();\n+\tdcache_disable();\n+\n+\tarm_smccc_smc(TZ_CONFIGURE_MILESTONE_SERVICE_ID,\n+\t\t      TZ_CONFIGURE_MILESTONE_SERVICE_PARAM_ID,\n+\t\t      0, 0, QCOM_HYP_BOOT_TYPE_KVM,\n+\t\t      0, 0, 0, &res);\n+\n+\tif (res.a0 != 0) {\n+\t\tlog_err(\"Hypervisor configuration failed: 0x%lx\\n\", res.a0);\n+\t\ticache_enable();\n+\t\tdcache_enable();\n+\t\treturn -EIO;\n+\t}\n+\n+\tasm volatile(\"mrs %0, CurrentEL\" : \"=r\" (current_el));\n+\tcurrent_el = (current_el >> 2) & 0x3;\n+\n+\tasm volatile(\"msr ttbr0_el1, %0\" : : \"r\" (ttbr0_el1));\n+\tasm volatile(\"isb\");\n+\n+\tif (current_el != 2) {\n+\t\tlog_debug(\"No EL2 transition, skipping TCR_EL2 config\\n\");\n+\t\ticache_enable();\n+\t\tdcache_enable();\n+\t\tlog_warning(\"KVM hypervisor configuration failed\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\t/* Read current TCR_EL2 and reconfigure it */\n+\tasm volatile(\"mrs %0, tcr_el2\" : \"=r\" (tcr_el2));\n+\n+\ttcr_el2 &= ~(TCR_T0SZ_MASK | (0x7UL << 16));\n+\ttcr_el2 |= t0sz | (phys_addr_size >> TCR_PS_SHIFT);\n+\n+\ttcr_el2 &= ~TCR_SH_ORGN_IRGN_MASK;\n+\ttcr_el2 |= TCR_SH_INNER_SHAREABLE |\n+\t\t   TCR_ORGN_WRITE_BACK_ALLOC |\n+\t\t   TCR_IRGN_WRITE_BACK_ALLOC;\n+\n+\tasm volatile(\"msr tcr_el2, %0\" : : \"r\" (tcr_el2));\n+\tasm volatile(\"msr mair_el1, %0\" : : \"r\" (mair_el1));\n+\tasm volatile(\"isb\");\n+\n+\ticache_enable();\n+\tdcache_enable();\n+\n+\tlog_info(\"KVM hypervisor configured\\n\");\n+\treturn 0;\n+}\n+\n+/**\n+ * qcom_configure_gunyah_hypervisor() - Configure hypervisor for Gunyah mode\n+ *\n+ * Configures the hypervisor for standard Gunyah operation.\n+ *\n+ * Return: 0 on success, negative error code on failure\n+ */\n+static int qcom_configure_gunyah_hypervisor(void)\n+{\n+\tstruct arm_smccc_res res;\n+\n+\tlog_info(\"Configuring hypervisor for Gunyah mode\\n\");\n+\n+\tarm_smccc_smc(TZ_INFO_IS_SVC_AVAILABLE_ID,\n+\t\t      TZ_INFO_IS_SVC_AVAILABLE_ID_PARAM_ID,\n+\t\t      TZ_CONFIGURE_MILESTONE_SERVICE_ID,\n+\t\t      0, 0, 0, 0, 0, &res);\n+\n+\tif (res.a0 != 0) {\n+\t\tlog_debug(\"Hypervisor milestone service not available (0x%lx)\\n\", res.a0);\n+\t\treturn 0;\n+\t}\n+\n+\tarm_smccc_smc(TZ_CONFIGURE_MILESTONE_SERVICE_ID,\n+\t\t      TZ_CONFIGURE_MILESTONE_SERVICE_PARAM_ID,\n+\t\t      0, 0, QCOM_HYP_BOOT_TYPE_GUNYAH,\n+\t\t      0, 0, 0, &res);\n+\n+\tif (res.a0 != 0) {\n+\t\tlog_err(\"Hypervisor configuration failed: 0x%lx\\n\", res.a0);\n+\t\treturn -EIO;\n+\t}\n+\n+\tlog_info(\"Gunyah hypervisor configured\\n\");\n+\treturn 0;\n+}\n+\n #define KERNEL_COMP_SIZE\tSZ_64M\narch/arm/mach-snapdragon/Kconfig #ifdef CONFIG_FASTBOOT_BUF_SIZE\n #define FASTBOOT_BUF_SIZE CONFIG_FASTBOOT_BUF_SIZE\n@@ -570,6 +718,12 @@ int board_late_init(void)\n \tqcom_late_init();\n \n \tqcom_show_boot_source();\n+\n+\tif (IS_ENABLED(CONFIG_QCOM_KVM_SUPPORT))\n+\t\tqcom_configure_kvm_hypervisor();\n+\telse\n+\t\tqcom_configure_gunyah_hypervisor();\n+\n \t/* Configure the dfu_string for capsule updates */\n \tqcom_configure_capsule_updates();\n \ndiff --git a/arch/arm/mach-snapdragon/qcom-priv.h b/arch/arm/mach-snapdragon/qcom-priv.h\nindex b8bf574e8bb..a5d9dec6aa7 100644\n--- a/arch/arm/mach-snapdragon/qcom-priv.h\n+++ b/arch/arm/mach-snapdragon/qcom-priv.h\n@@ -17,6 +17,37 @@ enum qcom_boot_source {\n \n extern enum qcom_boot_source qcom_boot_source;\n \n+/* TrustZone SMC definitions */\n+#define TZ_SYSCALL_CREATE_SMC_ID(o, s, f) \\\n+\t((u32)((((o) & 0x3f) << 24) | (((s) & 0xff) << 8) | ((f) & 0xff)))\n+\n+#define TZ_OWNER_SIP\t\t\t\t2\n+#define TZ_SVC_BOOT\t\t\t\t1\n+#define TZ_SVC_INFO\t\t\t\t6\n+#define TZ_BOOT_CMD_KVM_MILESTONE\t\t0x21\n+#define TZ_INFO_IS_SVC_AVAILABLE_CMD\t\t0x01\n+\n+#define TZ_CONFIGURE_MILESTONE_SERVICE_ID \\\n+\tTZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_SIP, TZ_SVC_BOOT, TZ_BOOT_CMD_KVM_MILESTONE)\n+#define TZ_CONFIGURE_MILESTONE_SERVICE_PARAM_ID\t\t0x23\n+\n+#define TZ_INFO_IS_SVC_AVAILABLE_ID \\\n+\tTZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_SIP, TZ_SVC_INFO, TZ_INFO_IS_SVC_AVAILABLE_CMD)\n+#define TZ_INFO_IS_SVC_AVAILABLE_ID_PARAM_ID\t\t0x1\n+\n+/* Hypervisor boot types */\n+#define QCOM_HYP_BOOT_TYPE_GUNYAH\t\t0\n+#define QCOM_HYP_BOOT_TYPE_KVM\t\t\t1\n+\n+/* TCR_EL2 bit field definitions */\n+#define TCR_T0SZ_MASK\t\t\t\t0x1FUL\n+#define TCR_PS_MASK\t\t\t\t(0x7UL << 32)\n+#define TCR_PS_SHIFT\t\t\t\t16\n+#define TCR_SH_ORGN_IRGN_MASK\t\t\t0x3F00UL\n+#define TCR_SH_INNER_SHAREABLE\t\t\t(3UL << 12)\n+#define TCR_ORGN_WRITE_BACK_ALLOC\t\tBIT(10)\n+#define TCR_IRGN_WRITE_BACK_ALLOC\t\tBIT(8)\n+\n #if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)\n void qcom_configure_capsule_updates(void);\n #else\n","prefixes":["v1"]}