Skip to contentSkip to conversation

RISCV_EFI_BOOT_PROTOCOL support in linux

RFC PATCH Superseded Sunil V L 3 participants 6 messages Jan 26, 2022 – Jan 28, 2022

Subsystems (2)

v1 of 5 Superseded Latest is v5 →

lore
Share & tools
lore

Sunil V L

author
#0 lore raw

cover RISCV_EFI_BOOT_PROTOCOL support in linux

This patch adds support for getting the boot hart ID using new RISCV_EFI_BOOT_PROTOCOL in linux efi stub. While there is an existing solution of passing the boot hart ID through Device Tree, it doesn't work for ACPI. Hence an EFI protocol protocol is recommended which works for both DT and ACPI based platforms.

The latest draft spec of this new protocol is available at
https://github.com/riscv-non-isa/riscv-uefi/releases/download/1.0-rc2/RISCV_UEFI_PROTOCOL-spec.pdf

This linux ptach can be found in:
riscv_boot_protocol_rfc_v1 branch at https://github.com/vlsunil/linux.git

This is tested in qemu with both u-boot and edk2 firmware changes. To test this patch with u-boot, we need u-boot to support this new protocol which can be found in:
riscv_boot_protocol_rfc_v1 branch at https://github.com/vlsunil/u-boot.git

Sunil V L (1):
riscv/efi_stub: Add support for RISCV_EFI_BOOT_PROTOCOL

 drivers/firmware/efi/libstub/efistub.h    | 15 ++++++++++++
 drivers/firmware/efi/libstub/riscv-stub.c | 28 ++++++++++++++++++++---
 include/linux/efi.h                       |  1 +
 3 files changed, 41 insertions(+), 3 deletions(-)
Signature · 1 line
2.25.1
author
#1 lore raw

RFC PATCH 1/1 riscv/efi_stub: Add support for RISCV_EFI_BOOT_PROTOCOL

This patch adds the support for getting the boot hart ID in Linux EFI stub using RISCV_EFI_BOOT_PROTOCOL.

---
 drivers/firmware/efi/libstub/efistub.h    | 15 ++++++++++++
 drivers/firmware/efi/libstub/riscv-stub.c | 28 ++++++++++++++++++++---
 include/linux/efi.h                       |  1 +
 3 files changed, 41 insertions(+), 3 deletions(-)
drivers/firmware/efi/libstub/efistub.h +15 -0
index edb77b0621ea..0428f8816942 100644
@@ -720,6 +720,21 @@ union efi_tcg2_protocol {
 	} mixed_mode;
 };
 
+typedef union riscv_efi_boot_protocol riscv_efi_boot_protocol_t;
+
+union riscv_efi_boot_protocol {
+	struct {
+		u64 revision;
+		efi_status_t (__efiapi *get_boot_hartid)(
+							 riscv_efi_boot_protocol_t *,
+							 size_t *);
+	};
+	struct {
+		u32 revision;
+		u32 get_boot_hartid;
+	} mixed_mode;
+};
+
 typedef union efi_load_file_protocol efi_load_file_protocol_t;
 typedef union efi_load_file_protocol efi_load_file2_protocol_t;
 
drivers/firmware/efi/libstub/riscv-stub.c +25 -3
index 380e4e251399..c7add4eb5453 100644
@@ -46,12 +46,34 @@ static u32 get_boot_hartid_from_fdt(void)
 	return fdt32_to_cpu(*prop);
 }
 
+static u32 get_boot_hartid_from_efi(void)
+{
+	efi_guid_t boot_protocol_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
+	efi_status_t status;
+	riscv_efi_boot_protocol_t *boot_protocol;
+	size_t boot_hart_id;
+
+	status = efi_bs_call(locate_protocol, &boot_protocol_guid, NULL,
+			     (void **)&boot_protocol);
+	if (status == EFI_SUCCESS) {
+		status = efi_call_proto(boot_protocol,
+					get_boot_hartid, &boot_hart_id);
+		if (status == EFI_SUCCESS) {
+			return (u32)boot_hart_id;
+		}
+	}
+	return U32_MAX;
+}
+
 efi_status_t check_platform_features(void)
 {
-	hartid = get_boot_hartid_from_fdt();
+	hartid = get_boot_hartid_from_efi();
 	if (hartid == U32_MAX) {
-		efi_err("/chosen/boot-hartid missing or invalid!\n");
-		return EFI_UNSUPPORTED;
+		hartid = get_boot_hartid_from_fdt();
+		if (hartid == U32_MAX) {
+			efi_err("/chosen/boot-hartid missing or invalid!\n");
+			return EFI_UNSUPPORTED;
+		}
 	}
 	return EFI_SUCCESS;
 }
include/linux/efi.h +1 -0
index ccd4d3f91c98..9822c730207c 100644
@@ -380,6 +380,7 @@ void efi_native_runtime_setup(void);
 #define EFI_CONSOLE_OUT_DEVICE_GUID		EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 #define APPLE_PROPERTIES_PROTOCOL_GUID		EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
 #define EFI_TCG2_PROTOCOL_GUID			EFI_GUID(0x607f766c, 0x7455, 0x42be,  0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
+#define RISCV_EFI_BOOT_PROTOCOL_GUID		EFI_GUID(0xccd15fec, 0x6f73, 0x4eec,  0x83, 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf)
 #define EFI_LOAD_FILE_PROTOCOL_GUID		EFI_GUID(0x56ec3091, 0x954c, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 #define EFI_LOAD_FILE2_PROTOCOL_GUID		EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e,  0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
 #define EFI_RT_PROPERTIES_TABLE_GUID		EFI_GUID(0xeb66918a, 0x7eef, 0x402a,  0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)
Signature · 1 line
2.25.1
maintainer
#2 lore raw

Re: [RFC PATCH 1/1] riscv/efi_stub: Add support for RISCV_EFI_BOOT_PROTOCOL

Hello Sunil,

Quoted 24 lines · Sunil V L

This patch adds the support for getting the boot hart ID in Linux EFI stub using RISCV_EFI_BOOT_PROTOCOL.

---
 drivers/firmware/efi/libstub/efistub.h    | 15 ++++++++++++
 drivers/firmware/efi/libstub/riscv-stub.c | 28 ++++++++++++++++++++---
 include/linux/efi.h                       |  1 +
 3 files changed, 41 insertions(+), 3 deletions(-)
drivers/firmware/efi/libstub/efistub.h +5 -0
index edb77b0621ea..0428f8816942 100644
@@ -720,6 +720,21 @@ union efi_tcg2_protocol {
        } mixed_mode;
 };
 
+typedef union riscv_efi_boot_protocol riscv_efi_boot_protocol_t;
+
+union riscv_efi_boot_protocol {
+       struct {
+               u64 revision;

drivers/firmware/efi/libstub/efistub.h union efi_tcg2_protocol { · line 737

Quoted 10 lines
drivers/firmware/efi/libstub/efistub.h +10 -0
+               efi_status_t (__efiapi *get_boot_hartid)(
+                                                        riscv_efi_boot_protocol_t *,
+                                                        size_t *);
+       };
+       struct {
+               u32 revision;
+               u32 get_boot_hartid;
+       } mixed_mode;
+};
+

You don't the mixed mode member here - this is for X64 kernels on IA32 firmware only.

Quoted 60 lines
drivers/firmware/efi/libstub/efistub.h +0 -0
 typedef union efi_load_file_protocol efi_load_file_protocol_t;
 typedef union efi_load_file_protocol efi_load_file2_protocol_t;
 
drivers/firmware/efi/libstub/riscv-stub.c +25 -3
index 380e4e251399..c7add4eb5453 100644
@@ -46,12 +46,34 @@ static u32 get_boot_hartid_from_fdt(void)
        return fdt32_to_cpu(*prop);
 }
 
+static u32 get_boot_hartid_from_efi(void)
+{
+       efi_guid_t boot_protocol_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
+       efi_status_t status;
+       riscv_efi_boot_protocol_t *boot_protocol;
+       size_t boot_hart_id;
+
+       status = efi_bs_call(locate_protocol, &boot_protocol_guid, NULL,
+                            (void **)&boot_protocol);
+       if (status == EFI_SUCCESS) {
+               status = efi_call_proto(boot_protocol,
+                                       get_boot_hartid, &boot_hart_id);
+               if (status == EFI_SUCCESS) {
+                       return (u32)boot_hart_id;
+               }
+       }
+       return U32_MAX;
+}
+
 efi_status_t check_platform_features(void)
 {
-       hartid = get_boot_hartid_from_fdt();
+       hartid = get_boot_hartid_from_efi();
        if (hartid == U32_MAX) {
-               efi_err("/chosen/boot-hartid missing or invalid!\n");
-               return EFI_UNSUPPORTED;
+               hartid = get_boot_hartid_from_fdt();
+               if (hartid == U32_MAX) {
+                       efi_err("/chosen/boot-hartid missing or invalid!\n");
+                       return EFI_UNSUPPORTED;
+               }
        }
        return EFI_SUCCESS;
 }
include/linux/efi.h +1 -1
index ccd4d3f91c98..9822c730207c 100644
@@ -380,6 +380,7 @@ void efi_native_runtime_setup(void);
 #define EFI_CONSOLE_OUT_DEVICE_GUID            EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 #define APPLE_PROPERTIES_PROTOCOL_GUID         EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
 #define EFI_TCG2_PROTOCOL_GUID                 EFI_GUID(0x607f766c, 0x7455, 0x42be,  0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
+#define RISCV_EFI_BOOT_PROTOCOL_GUID           EFI_GUID(0xccd15fec, 0x6f73, 0x4eec,  0x83, 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf)
 #define EFI_LOAD_FILE_PROTOCOL_GUID            EFI_GUID(0x56ec3091, 0x954c, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 #define EFI_LOAD_FILE2_PROTOCOL_GUID           EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e,  0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
 #define EFI_RT_PROPERTIES_TABLE_GUID           EFI_GUID(0xeb66918a, 0x7eef, 0x402a,  0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)
--

2.25.1

author
#3 lore raw

Re: [RFC PATCH 1/1] riscv/efi_stub: Add support for RISCV_EFI_BOOT_PROTOCOL

Quoted 32 lines · Ard Biesheuvel

Hello Sunil,

Quoted 29 lines · Sunil V L

This patch adds the support for getting the boot hart ID in Linux EFI stub using RISCV_EFI_BOOT_PROTOCOL.

---
 drivers/firmware/efi/libstub/efistub.h    | 15 ++++++++++++
 drivers/firmware/efi/libstub/riscv-stub.c | 28 ++++++++++++++++++++---
 include/linux/efi.h                       |  1 +
 3 files changed, 41 insertions(+), 3 deletions(-)
drivers/firmware/efi/libstub/efistub.h +10 -0
index edb77b0621ea..0428f8816942 100644
@@ -720,6 +720,21 @@ union efi_tcg2_protocol {
        } mixed_mode;
 };
 
+typedef union riscv_efi_boot_protocol riscv_efi_boot_protocol_t;
+
+union riscv_efi_boot_protocol {
+       struct {
+               u64 revision;
+               efi_status_t (__efiapi *get_boot_hartid)(
+                                                        riscv_efi_boot_protocol_t *,
+                                                        size_t *);
+       };
+       struct {
Quoted 8 lines

drivers/firmware/efi/libstub/efistub.h union efi_tcg2_protocol { · line 737

Quoted 5 lines
drivers/firmware/efi/libstub/efistub.h +5 -0
+               u32 revision;
+               u32 get_boot_hartid;
+       } mixed_mode;
+};
+

You don't the mixed mode member here - this is for X64 kernels on IA32 firmware only.

Ah OK. Thanks for the feedback, Ard. Will remove it in next version.

Thanks
Sunil

Quoted 61 lines
Quoted 61 lines
drivers/firmware/efi/libstub/efistub.h +0 -0
 typedef union efi_load_file_protocol efi_load_file_protocol_t;
 typedef union efi_load_file_protocol efi_load_file2_protocol_t;
 
drivers/firmware/efi/libstub/riscv-stub.c +25 -3
index 380e4e251399..c7add4eb5453 100644
@@ -46,12 +46,34 @@ static u32 get_boot_hartid_from_fdt(void)
        return fdt32_to_cpu(*prop);
 }
 
+static u32 get_boot_hartid_from_efi(void)
+{
+       efi_guid_t boot_protocol_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
+       efi_status_t status;
+       riscv_efi_boot_protocol_t *boot_protocol;
+       size_t boot_hart_id;
+
+       status = efi_bs_call(locate_protocol, &boot_protocol_guid, NULL,
+                            (void **)&boot_protocol);
+       if (status == EFI_SUCCESS) {
+               status = efi_call_proto(boot_protocol,
+                                       get_boot_hartid, &boot_hart_id);
+               if (status == EFI_SUCCESS) {
+                       return (u32)boot_hart_id;
+               }
+       }
+       return U32_MAX;
+}
+
 efi_status_t check_platform_features(void)
 {
-       hartid = get_boot_hartid_from_fdt();
+       hartid = get_boot_hartid_from_efi();
        if (hartid == U32_MAX) {
-               efi_err("/chosen/boot-hartid missing or invalid!\n");
-               return EFI_UNSUPPORTED;
+               hartid = get_boot_hartid_from_fdt();
+               if (hartid == U32_MAX) {
+                       efi_err("/chosen/boot-hartid missing or invalid!\n");
+                       return EFI_UNSUPPORTED;
+               }
        }
        return EFI_SUCCESS;
 }
include/linux/efi.h +1 -1
index ccd4d3f91c98..9822c730207c 100644
@@ -380,6 +380,7 @@ void efi_native_runtime_setup(void);
 #define EFI_CONSOLE_OUT_DEVICE_GUID            EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 #define APPLE_PROPERTIES_PROTOCOL_GUID         EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
 #define EFI_TCG2_PROTOCOL_GUID                 EFI_GUID(0x607f766c, 0x7455, 0x42be,  0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
+#define RISCV_EFI_BOOT_PROTOCOL_GUID           EFI_GUID(0xccd15fec, 0x6f73, 0x4eec,  0x83, 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf)
 #define EFI_LOAD_FILE_PROTOCOL_GUID            EFI_GUID(0x56ec3091, 0x954c, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 #define EFI_LOAD_FILE2_PROTOCOL_GUID           EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e,  0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
 #define EFI_RT_PROPERTIES_TABLE_GUID           EFI_GUID(0xeb66918a, 0x7eef, 0x402a,  0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)
--

2.25.1

#4 lore raw

Re: [RFC PATCH 1/1] riscv/efi_stub: Add support for RISCV_EFI_BOOT_PROTOCOL

In reply to Sunil V L

Am 26. Januar 2022 12:06:15 MEZ schrieb Sunil V L <[email protected]>:

Quoted 2 lines

This patch adds the support for getting the boot hart ID in Linux EFI stub using RISCV_EFI_BOOT_PROTOCOL.

It would be helpful to add a link to the spec in the commit message and maybe a comment that this protocol is needed for the ACPI use case.

Quoted 14 lines

---

drivers/firmware/efi/libstub/efistub.h    | 15 ++++++++++++
drivers/firmware/efi/libstub/riscv-stub.c | 28 ++++++++++++++++++++---
include/linux/efi.h                       |  1 +
3 files changed, 41 insertions(+), 3 deletions(-)
drivers/firmware/efi/libstub/efistub.h +0 -0
index edb77b0621ea..0428f8816942 100644
@@ -720,6 +720,21 @@ union efi_tcg2_protocol {
 	} mixed_mode;

drivers/firmware/efi/libstub/efistub.h union efi_tcg2_protocol { · line 730

Quoted 10 lines
drivers/firmware/efi/libstub/efistub.h +8 -0
 };
 
+typedef union riscv_efi_boot_protocol riscv_efi_boot_protocol_t;
+
+union riscv_efi_boot_protocol {
+	struct {
+		u64 revision;
+		efi_status_t (__efiapi *get_boot_hartid)(
+							 riscv_efi_boot_protocol_t *,
+							 size_t *);

I prefer to have parameter names for readability

According to the platform specification mhartid is MXLEN wide. UINTN (size_t) is SXLEN wide.

Does this have any implications on how we define the protocol?

Quoted 14 lines
drivers/firmware/efi/libstub/efistub.h +6 -0
+	};
+	struct {
+		u32 revision;
+		u32 get_boot_hartid;>+	} mixed_mode;
+};
+
 typedef union efi_load_file_protocol efi_load_file_protocol_t;
 typedef union efi_load_file_protocol efi_load_file2_protocol_t;
 
drivers/firmware/efi/libstub/riscv-stub.c +0 -0
index 380e4e251399..c7add4eb5453 100644

drivers/firmware/efi/libstub/riscv-stub.c static u32 get_boot_hartid_from_fdt(void) · line 50

Quoted 5 lines
drivers/firmware/efi/libstub/riscv-stub.c +2 -0
@@ -46,12 +46,34 @@ static u32 get_boot_hartid_from_fdt(void)
 	return fdt32_to_cpu(*prop);
 }
 
+static u32 get_boot_hartid_from_efi(void)
+{

The returned value must be UINTN /size_t like the protocol. This width must be carried to the legacy entry point of Linux.

Quoted 5 lines
drivers/firmware/efi/libstub/riscv-stub.c +5 -0
+	efi_guid_t boot_protocol_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
+	efi_status_t status;
+	riscv_efi_boot_protocol_t *boot_protocol;
+	size_t boot_hart_id;
+

drivers/firmware/efi/libstub/riscv-stub.c static u32 get_boot_hartid_from_fdt(void) · line 65

Quoted 10 lines
drivers/firmware/efi/libstub/riscv-stub.c +10 -0
+	status = efi_bs_call(locate_protocol, &boot_protocol_guid, NULL,
+			     (void **)&boot_protocol);
+	if (status == EFI_SUCCESS) {
+		status = efi_call_proto(boot_protocol,
+					get_boot_hartid, &boot_hart_id);
+		if (status == EFI_SUCCESS) {
+			return (u32)boot_hart_id;
+		}
+	}
+	return U32_MAX;

U32_MAX is a legal value for the hart id.

drivers/firmware/efi/libstub/riscv-stub.c static u32 get_boot_hartid_from_fdt(void) · line 73

Quoted 11 lines
drivers/firmware/efi/libstub/riscv-stub.c +5 -3
+}
+
 efi_status_t check_platform_features(void)
 {
-	hartid = get_boot_hartid_from_fdt();
+	hartid = get_boot_hartid_from_efi();
 	if (hartid == U32_MAX) {
-		efi_err("/chosen/boot-hartid missing or invalid!\n");
-		return EFI_UNSUPPORTED;
+		hartid = get_boot_hartid_from_fdt();
+		if (hartid == U32_MAX) {

U32_MAX is a legal value for the hart id. Please, separate status and value.

Best regards

Heinrich

Quoted 18 lines
drivers/firmware/efi/libstub/riscv-stub.c +3 -0
+			efi_err("/chosen/boot-hartid missing or invalid!\n");
+			return EFI_UNSUPPORTED;
+		}
 	}
 	return EFI_SUCCESS;
 }
include/linux/efi.h +1 -0
index ccd4d3f91c98..9822c730207c 100644
@@ -380,6 +380,7 @@ void efi_native_runtime_setup(void);
 #define EFI_CONSOLE_OUT_DEVICE_GUID		EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 #define APPLE_PROPERTIES_PROTOCOL_GUID		EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
 #define EFI_TCG2_PROTOCOL_GUID			EFI_GUID(0x607f766c, 0x7455, 0x42be,  0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
+#define RISCV_EFI_BOOT_PROTOCOL_GUID		EFI_GUID(0xccd15fec, 0x6f73, 0x4eec,  0x83, 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf)
 #define EFI_LOAD_FILE_PROTOCOL_GUID		EFI_GUID(0x56ec3091, 0x954c, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 #define EFI_LOAD_FILE2_PROTOCOL_GUID		EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e,  0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
 #define EFI_RT_PROPERTIES_TABLE_GUID		EFI_GUID(0xeb66918a, 0x7eef, 0x402a,  0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)
author
#5 lore raw

Re: [RFC PATCH 1/1] riscv/efi_stub: Add support for RISCV_EFI_BOOT_PROTOCOL

Quoted 5 lines · Heinrich Schuchardt

Am 26. Januar 2022 12:06:15 MEZ schrieb Sunil V L <[email protected]>:

Quoted 2 lines

This patch adds the support for getting the boot hart ID in Linux EFI stub using RISCV_EFI_BOOT_PROTOCOL.

It would be helpful to add a link to the spec in the commit message and maybe a comment that this protocol is needed for the ACPI use case.

Sure. Will add.

Quoted 17 lines
Quoted 17 lines

---

drivers/firmware/efi/libstub/efistub.h    | 15 ++++++++++++
drivers/firmware/efi/libstub/riscv-stub.c | 28 ++++++++++++++++++++---
include/linux/efi.h                       |  1 +
3 files changed, 41 insertions(+), 3 deletions(-)
drivers/firmware/efi/libstub/efistub.h +0 -0
index edb77b0621ea..0428f8816942 100644
@@ -720,6 +720,21 @@ union efi_tcg2_protocol {
 	} mixed_mode;
 };
 
Quoted 10 lines

drivers/firmware/efi/libstub/efistub.h union efi_tcg2_protocol { · line 730

Quoted 8 lines
drivers/firmware/efi/libstub/efistub.h +8 -0
+typedef union riscv_efi_boot_protocol riscv_efi_boot_protocol_t;
+
+union riscv_efi_boot_protocol {
+	struct {
+		u64 revision;
+		efi_status_t (__efiapi *get_boot_hartid)(
+							 riscv_efi_boot_protocol_t *,
+							 size_t *);

I prefer to have parameter names for readability

Sure. Will add.

Quoted 4 lines

According to the platform specification mhartid is MXLEN wide. UINTN (size_t) is SXLEN wide.

Does this have any implications on how we define the protocol?

I don't think so. EFI and kernel will be at same privilige level. So, it is not really an issue for this protocol.

But when MXLEN > SXLEN (ex: 64 vs 32), then implementation need to ensure hartid value is 32 bit only so that when it is passed from M-mode firmware to S-mode, it gets correct value. But again this is not an issue from this EFI protocol perspective.

Quoted 32 lines
Quoted 15 lines
drivers/firmware/efi/libstub/efistub.h +6 -0
+	};
+	struct {
+		u32 revision;
+		u32 get_boot_hartid;>+	} mixed_mode;
+};
+
 typedef union efi_load_file_protocol efi_load_file_protocol_t;
 typedef union efi_load_file_protocol efi_load_file2_protocol_t;
 
drivers/firmware/efi/libstub/riscv-stub.c +0 -0
index 380e4e251399..c7add4eb5453 100644

drivers/firmware/efi/libstub/riscv-stub.c static u32 get_boot_hartid_from_fdt(void) · line 50

Quoted 5 lines
drivers/firmware/efi/libstub/riscv-stub.c +2 -0
@@ -46,12 +46,34 @@ static u32 get_boot_hartid_from_fdt(void)
 	return fdt32_to_cpu(*prop);
 }
 
+static u32 get_boot_hartid_from_efi(void)
+{

The returned value must be UINTN /size_t like the protocol. This width must be carried to the legacy entry point of Linux.

Quoted 9 lines
drivers/firmware/efi/libstub/riscv-stub.c +9 -0
+	efi_guid_t boot_protocol_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
+	efi_status_t status;
+	riscv_efi_boot_protocol_t *boot_protocol;
+	size_t boot_hart_id;
+
+	status = efi_bs_call(locate_protocol, &boot_protocol_guid, NULL,
+			     (void **)&boot_protocol);
+	if (status == EFI_SUCCESS) {
+		status = efi_call_proto(boot_protocol,
Quoted 8 lines

drivers/firmware/efi/libstub/riscv-stub.c static u32 get_boot_hartid_from_fdt(void) · line 65

Quoted 6 lines
drivers/firmware/efi/libstub/riscv-stub.c +6 -0
+					get_boot_hartid, &boot_hart_id);
+		if (status == EFI_SUCCESS) {
+			return (u32)boot_hart_id;
+		}
+	}
+	return U32_MAX;

U32_MAX is a legal value for the hart id.

Yeah. This is an existing issue in get_boot_hartid_from_fdt() for which I have sent a fix patch. Once that gets accepted, I will fix get_boot_hartid_from_efi() and send RFC V2 patch.

Quoted 14 lines

drivers/firmware/efi/libstub/riscv-stub.c static u32 get_boot_hartid_from_fdt(void) · line 73

Quoted 12 lines
drivers/firmware/efi/libstub/riscv-stub.c +5 -3
+}
+
 efi_status_t check_platform_features(void)
 {
-	hartid = get_boot_hartid_from_fdt();
+	hartid = get_boot_hartid_from_efi();
 	if (hartid == U32_MAX) {
-		efi_err("/chosen/boot-hartid missing or invalid!\n");
-		return EFI_UNSUPPORTED;
+		hartid = get_boot_hartid_from_fdt();
+		if (hartid == U32_MAX) {

U32_MAX is a legal value for the hart id. Please, separate status and value.

Will fix it.

Thank you very much for the feedback.
Sunil

Quoted 24 lines

Best regards

Heinrich

Quoted 18 lines
drivers/firmware/efi/libstub/riscv-stub.c +3 -0
+			efi_err("/chosen/boot-hartid missing or invalid!\n");
+			return EFI_UNSUPPORTED;
+		}
 	}
 	return EFI_SUCCESS;
 }
include/linux/efi.h +1 -0
index ccd4d3f91c98..9822c730207c 100644
@@ -380,6 +380,7 @@ void efi_native_runtime_setup(void);
 #define EFI_CONSOLE_OUT_DEVICE_GUID		EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 #define APPLE_PROPERTIES_PROTOCOL_GUID		EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
 #define EFI_TCG2_PROTOCOL_GUID			EFI_GUID(0x607f766c, 0x7455, 0x42be,  0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
+#define RISCV_EFI_BOOT_PROTOCOL_GUID		EFI_GUID(0xccd15fec, 0x6f73, 0x4eec,  0x83, 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf)
 #define EFI_LOAD_FILE_PROTOCOL_GUID		EFI_GUID(0x56ec3091, 0x954c, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 #define EFI_LOAD_FILE2_PROTOCOL_GUID		EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e,  0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
 #define EFI_RT_PROPERTIES_TABLE_GUID		EFI_GUID(0xeb66918a, 0x7eef, 0x402a,  0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)