From: Jason Gunthorpe <jgg@nvidia.com>
To: Alexandre Ghiti <alex@ghiti.fr>,
Albert Ou <aou@eecs.berkeley.edu>,
Ard Biesheuvel <ardb@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
Catalin Marinas <catalin.marinas@arm.com>,
Jonathan Corbet <corbet@lwn.net>, David Sterba <dsterba@suse.com>,
Ilias Apalodimas <ilias.apalodimas@linaro.org>,
linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-doc@vger.kernel.org, linux-efi@vger.kernel.org,
linux-riscv@lists.infradead.org,
Mark Rutland <mark.rutland@arm.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Paul Walmsley <pjw@kernel.org>,
Randy Dunlap <rdunlap@infradead.org>,
Simon Glass <sjg@chromium.org>,
Shuah Khan <skhan@linuxfoundation.org>,
Nick Terrell <terrelln@fb.com>, Will Deacon <will@kernel.org>
Cc: Alexandre Ghiti <alexghiti@rivosinc.com>,
Conor Dooley <conor.dooley@microchip.com>,
linux-integrity@vger.kernel.org,
Palmer Dabbelt <palmer@rivosinc.com>,
patches@lists.linux.dev,
Ross Philipson <ross.philipson@gmail.com>,
Sami Tolvanen <samitolvanen@google.com>,
Song Shuai <songshuaishuai@tinylab.org>
Subject: [PATCH 12/16] arm64: drtm: Add macro definitions for DEN0113
Date: Thu, 24 Sep 2026 10:53:15 -0300 [thread overview]
Message-ID: <12-v1-27d06b313981+8b-arm64_drtm_jgg@nvidia.com> (raw)
In-Reply-To: <0-v1-27d06b313981+8b-arm64_drtm_jgg@nvidia.com>
Taken from rev 1.4b of the spec, following the SMCC register layout and
constant names.
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
---
arch/arm64/include/asm/drtm.h | 196 ++++++++++++++++++++++++++++++++++
1 file changed, 196 insertions(+)
create mode 100644 arch/arm64/include/asm/drtm.h
diff --git a/arch/arm64/include/asm/drtm.h b/arch/arm64/include/asm/drtm.h
new file mode 100644
index 00000000000000..d6dd04a4ebcea5
--- /dev/null
+++ b/arch/arm64/include/asm/drtm.h
@@ -0,0 +1,196 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES
+ *
+ * Definitions from ARM DEN 0113 "DRTM Architecture for Arm"
+ */
+#ifndef __ASM_DRTM_H
+#define __ASM_DRTM_H
+
+#include <linux/arm-smccc.h>
+#include <linux/bits.h>
+
+/* Offset 0x02 is reserved by DEN0113. */
+#define ARM_DRTM_SMC_FN_BASE \
+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_64, \
+ ARM_SMCCC_OWNER_STANDARD, 0x110)
+#define ARM_DRTM_SMC_VERSION (ARM_DRTM_SMC_FN_BASE + 0x00)
+#define ARM_DRTM_SMC_FEATURES (ARM_DRTM_SMC_FN_BASE + 0x01)
+#define ARM_DRTM_SMC_UNPROTECT_MEMORY (ARM_DRTM_SMC_FN_BASE + 0x03)
+#define ARM_DRTM_SMC_DYNAMIC_LAUNCH (ARM_DRTM_SMC_FN_BASE + 0x04)
+#define ARM_DRTM_SMC_CLOSE_LOCALITY (ARM_DRTM_SMC_FN_BASE + 0x05)
+#define ARM_DRTM_SMC_GET_ERROR (ARM_DRTM_SMC_FN_BASE + 0x06)
+#define ARM_DRTM_SMC_SET_ERROR (ARM_DRTM_SMC_FN_BASE + 0x07)
+#define ARM_DRTM_SMC_SET_TCB_HASH (ARM_DRTM_SMC_FN_BASE + 0x08)
+#define ARM_DRTM_SMC_LOCK_TCB_HASHES (ARM_DRTM_SMC_FN_BASE + 0x09)
+#define ARM_DRTM_SMC_ENABLE_SECURE_INTERRUPTS (ARM_DRTM_SMC_FN_BASE + 0x0a)
+
+#define ARM_DRTM_FEATURE_SELECTOR BIT_U64(63)
+#define ARM_DRTM_FEATURE_TPM 0x01
+#define ARM_DRTM_FEATURE_MIN_MEMORY 0x02
+#define ARM_DRTM_FEATURE_DMA_PROTECTION 0x03
+#define ARM_DRTM_FEATURE_BOOT_PE 0x04
+#define ARM_DRTM_FEATURE_TCB_HASH 0x05
+#define ARM_DRTM_FEATURE_IMAGE_AUTH 0x06
+
+#define ARM_DRTM_VERSION_MAJOR_MASK GENMASK_U32(30, 16)
+#define ARM_DRTM_VERSION_MINOR_MASK GENMASK_U32(15, 0)
+#define ARM_DRTM_VERSION_MAJOR 1
+#define ARM_DRTM_VERSION_MIN_MINOR 1
+
+#define ARM_DRTM_TPM_ALG_MASK GENMASK_U64(15, 0)
+#define ARM_DRTM_TPM_HASHING BIT_U64(32)
+#define ARM_DRTM_PCR_SCHEMA_MASK GENMASK_U64(36, 33)
+#define ARM_DRTM_PCR_SCHEMA_DEFAULT BIT_U64(33)
+#define ARM_DRTM_PCR_SCHEMA_AUTHORITIES BIT_U64(34)
+
+#define ARM_DRTM_DLME_DATA_PAGES_MASK GENMASK_U64(31, 0)
+#define ARM_DRTM_NW_DCE_PAGES_MASK GENMASK_U64(63, 32)
+#define ARM_DRTM_PAGE_SIZE 4096
+
+#define ARM_DRTM_DMA_PROTECTION_MASK GENMASK_U64(7, 0)
+#define ARM_DRTM_DMA_PROTECTION_COMPLETE BIT_U64(0)
+#define ARM_DRTM_DMA_PROTECTION_REGION BIT_U64(1)
+#define ARM_DRTM_MAX_REGIONS_MASK GENMASK_U64(23, 8)
+#define ARM_DRTM_TCB_HASH_COUNT_MASK GENMASK_U64(7, 0)
+#define ARM_DRTM_IMAGE_AUTH_SUPPORTED BIT_U64(0)
+
+#define ARM_DRTM_LAUNCH_HASH_FIRMWARE 0
+#define ARM_DRTM_LAUNCH_HASH_TPM BIT_U32(0)
+#define ARM_DRTM_LAUNCH_PCR_DEFAULT 0
+#define ARM_DRTM_LAUNCH_PCR_AUTHORITIES BIT_U32(1)
+#define ARM_DRTM_LAUNCH_DMA_COMPLETE 0
+#define ARM_DRTM_LAUNCH_DMA_REGION BIT_U32(3)
+#define ARM_DRTM_LAUNCH_NO_AUTH 0
+#define ARM_DRTM_LAUNCH_AUTH BIT_U32(6)
+#define ARM_DRTM_LAUNCH_KEEP_SECURE_IRQS 0
+#define ARM_DRTM_LAUNCH_DISABLE_SECURE_IRQS BIT_U32(7)
+
+#define ARM_DRTM_SUCCESS 0
+#define ARM_DRTM_NOT_SUPPORTED -1
+#define ARM_DRTM_INVALID_PARAMETERS -2
+#define ARM_DRTM_DENIED -3
+#define ARM_DRTM_NOT_FOUND -4
+#define ARM_DRTM_INTERNAL_ERROR -5
+#define ARM_DRTM_MEM_PROTECT_INVALID -6
+#define ARM_DRTM_OUT_OF_RESOURCES -8
+#define ARM_DRTM_INVALID_DATA -9
+#define ARM_DRTM_SECONDARY_PE_NOT_OFF -10
+#define ARM_DRTM_ALREADY_CLOSED -11
+#define ARM_DRTM_TPM_ERROR -12
+
+/* Algorthim IDs are defined by TCG, in the kernel they are TPM_ALG_* */
+
+#define ARM_DRTM_PARAMETERS_REVISION 2
+
+#ifndef __ASSEMBLY__
+
+#include <linux/bitfield.h>
+#include <linux/build_bug.h>
+#include <linux/stddef.h>
+#include <linux/types.h>
+
+struct arm_drtm_parameters {
+ __le16 revision;
+ __le16 reserved;
+ __le32 launch_features;
+ __le64 dlme_region_address;
+ __le64 dlme_region_size;
+ __le64 dlme_image_start;
+ __le64 dlme_entry_point_offset;
+ __le64 dlme_image_size;
+ __le64 dlme_data_offset;
+ __le64 nw_dce_region_address;
+ __le64 nw_dce_region_size;
+ __le64 protection_table_address;
+ __le64 protection_table_size;
+};
+static_assert(sizeof(struct arm_drtm_parameters) == 88);
+
+static inline s32 arm_drtm_version(u16 *major, u16 *minor)
+{
+ struct arm_smccc_res res;
+ u32 version;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_VERSION, 0, 0, 0, 0, 0, 0, 0,
+ &res);
+ version = res.a0;
+ /*
+ * For this command only the output is specified as w0 a 32 bit value.
+ * All others use x0 a 64 bit value. The -ve error and version are
+ * overlayed together with the 32 bit sign bit telling them apart.
+ */
+ if (version & BIT(31))
+ return version;
+
+ *major = FIELD_GET(ARM_DRTM_VERSION_MAJOR_MASK, version);
+ *minor = FIELD_GET(ARM_DRTM_VERSION_MINOR_MASK, version);
+ return ARM_DRTM_SUCCESS;
+}
+
+static inline s64 arm_drtm_features(u64 function_or_feature, u64 *value)
+{
+ struct arm_smccc_res res;
+ s64 status;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_FEATURES, function_or_feature,
+ 0, 0, 0, 0, 0, 0, &res);
+ status = res.a0;
+ if (status >= 0 && value)
+ *value = res.a1;
+ return status;
+}
+
+static inline s64 arm_drtm_unprotect_memory(void)
+{
+ struct arm_smccc_res res;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_UNPROTECT_MEMORY, 0, 0, 0, 0, 0, 0, 0,
+ &res);
+ return res.a0;
+}
+
+static inline s64
+arm_drtm_dynamic_launch(struct arm_drtm_parameters *params_addr)
+{
+ struct arm_smccc_res res;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_DYNAMIC_LAUNCH,
+ (unsigned long)params_addr, 0, 0, 0, 0, 0, 0, &res);
+ return res.a0;
+}
+
+static inline s64 arm_drtm_close_locality(u32 locality)
+{
+ struct arm_smccc_res res;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_CLOSE_LOCALITY, locality,
+ 0, 0, 0, 0, 0, 0, &res);
+ return res.a0;
+}
+
+static inline s64 arm_drtm_get_error(s64 *error_code)
+{
+ struct arm_smccc_res res;
+ s64 status;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_GET_ERROR, 0, 0, 0, 0, 0, 0, 0,
+ &res);
+ status = res.a0;
+ if (status != ARM_DRTM_SUCCESS)
+ return status;
+
+ *error_code = res.a1;
+ return ARM_DRTM_SUCCESS;
+}
+
+static inline s64 arm_drtm_enable_secure_interrupts(void)
+{
+ struct arm_smccc_res res;
+
+ arm_smccc_1_1_smc(ARM_DRTM_SMC_ENABLE_SECURE_INTERRUPTS,
+ 0, 0, 0, 0, 0, 0, 0, &res);
+ return res.a0;
+}
+
+#endif /* !__ASSEMBLY__ */
+#endif /* __ASM_DRTM_H */
--
2.43.0
next prev parent reply other threads:[~2026-09-24 13:53 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-24 13:53 [PATCH 00/16] arm64: DRTM, boot portion Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 01/16] efi/libstub: Fix error unwind freeing fdt in allocate_new_fdt_and_exit_boot() Jason Gunthorpe
2026-09-24 22:42 ` Jonathan Cameron
2026-09-24 23:44 ` Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 02/16] efi/riscv: libstub: Don't set image_size in handle_kernel_image() Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 03/16] efi/libstub: Free cmdline_ptr in efi_pe_entry Jason Gunthorpe
2026-09-24 22:49 ` Jonathan Cameron
2026-09-25 12:59 ` Jason Gunthorpe
2026-09-25 13:20 ` Ard Biesheuvel
2026-09-24 13:53 ` [PATCH 04/16] vmlinux.lds: Move DATA_LE32() from arm64 to the common linker script Jason Gunthorpe
2026-09-24 22:53 ` Jonathan Cameron
2026-09-24 23:50 ` Jason Gunthorpe
2026-09-25 13:30 ` Ard Biesheuvel
2026-09-24 13:53 ` [PATCH 05/16] efi/libstub: Add a general way to get symbols from the vmlinux into zboot Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 06/16] arm64/efi: Use CONFIG_EFI_STUB_IMAGE_INFO for code_size Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 07/16] efi/zboot: Lift efi_cache_sync_image() from efi_zboot_decompress() Jason Gunthorpe
2026-09-24 22:57 ` Jonathan Cameron
2026-09-24 23:53 ` Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 08/16] efi/libstub: Add generic arch callbacks for DRTM Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 09/16] efi/libstub: Have efi_kaslr_relocate_kernel() handle extra_size Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 10/16] efi: Add a __efi_data_handoff section annotation Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 11/16] efi/libstub: Put the stub's writable data in unique sections for DRTM Jason Gunthorpe
2026-09-24 13:53 ` Jason Gunthorpe [this message]
2026-09-25 0:29 ` [PATCH 12/16] arm64: drtm: Add macro definitions for DEN0113 Jonathan Cameron
2026-09-26 18:27 ` Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 13/16] arm64: drtm: Update the linker script for EFI_STUB_DRTM Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 14/16] arm64: drtm: Add drtm_entry point to head.S Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 15/16] arm64: drtm: Call UNPROTECT_MEMORY Jason Gunthorpe
2026-09-24 13:53 ` [PATCH 16/16] efi/arm64: Implement ARM64 DRTM in the stub Jason Gunthorpe
2026-09-25 18:37 ` Jonathan Cameron
2026-09-26 18:45 ` Jason Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=12-v1-27d06b313981+8b-arm64_drtm_jgg@nvidia.com \
--to=jgg@nvidia.com \
--cc=alex@ghiti.fr \
--cc=alexghiti@rivosinc.com \
--cc=aou@eecs.berkeley.edu \
--cc=ardb@kernel.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=conor.dooley@microchip.com \
--cc=corbet@lwn.net \
--cc=dsterba@suse.com \
--cc=ilias.apalodimas@linaro.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=palmer@dabbelt.com \
--cc=palmer@rivosinc.com \
--cc=patches@lists.linux.dev \
--cc=pjw@kernel.org \
--cc=rdunlap@infradead.org \
--cc=ross.philipson@gmail.com \
--cc=samitolvanen@google.com \
--cc=sjg@chromium.org \
--cc=skhan@linuxfoundation.org \
--cc=songshuaishuai@tinylab.org \
--cc=terrelln@fb.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox