[edk2-devel] [PATCH v4 0/1] New RISC-V Patches

Daniel Schaefer posted 1 patch 3 years, 10 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/edk2 tags/patchew/20200602165152.9823-1-daniel.schaefer@hpe.com
Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.inf |  28 +
Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h           | 563 ++++++++++++
Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c   | 897 ++++++++++++++++++++
3 files changed, 1488 insertions(+)
create mode 100644 Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.inf
create mode 100644 Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
create mode 100644 Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
[edk2-devel] [PATCH v4 0/1] New RISC-V Patches
Posted by Daniel Schaefer 3 years, 10 months ago
Hi,

here's the latest version of the RiscVEdk2SbiLib patch. The other commits from
the last series haven't changed, so I'm not resending them to reduce the noise.

Below in this email, I included a patch showing the differences betwen the last patchset and this one.

The branch is at https://github.com/changab/edk2-platforms/tree/devel-riscvplatforms
and I made another repo, to easily try out booting to EFI Shell on RISC-V:
https://github.com/JohnAZoidberg/riscv-edk2-docker

Other TODOs for upstreaming RISC-V:
- Deduplicating SMBIOS code -> I am doing that currently
- Figuring out in which repo to put the code -> Discussion is still going on

Cheers,
Daniel

Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Gilbert Chen <gilbert.chen@hpe.com>
Cc: Abner Chang <abner.chang@hpe.com>
Cc: Michael D. Kinney <michael.d.kinney@intel.com>

Daniel Schaefer (1):
  ProcessorPkg/Library: Add RiscVEdk2SbiLib

 Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.inf |  28 +
 Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h           | 563 ++++++++++++
 Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c   | 897 ++++++++++++++++++++
 3 files changed, 1488 insertions(+)
 create mode 100644 Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.inf
 create mode 100644 Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
 create mode 100644 Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
--
diff --git i/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c w/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
index d26adaa37ce7..0df505d2675b 100644
--- i/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
+++ w/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib/RiscVEdk2SbiLib.c
@@ -16,8 +16,10 @@
   - SbiLegacyShutdown            -> Wait for new System Reset extension

 

   Copyright (c) 2020, Hewlett Packard Development LP. All rights reserved.<BR>

-

   SPDX-License-Identifier: BSD-2-Clause-Patent

+

+  @par Revision Reference:

+    - OpenSBI Version 0.6

 **/

 

 #include <IndustryStandard/RiscVOpensbi.h>

@@ -30,12 +32,22 @@
 #include <sbi/sbi_init.h>

 

 

+//

+// Maximum arguments for SBI ecall

+// It's possible to pass more but no SBI call uses more as of SBI 0.2.

+// The additional arguments would have to be passed on the stack instead of as

+// registers, like it's done now.

+//

+#define SBI_CALL_MAX_ARGS 6

+

 /**

   Call SBI call using ecall instruction.

 

+  Asserts when NumArgs exceeds SBI_CALL_MAX_ARGS.

+

   @param[in] ExtId    SBI extension ID.

   @param[in] FuncId   SBI function ID.

-  @param[in] NumAargs Number of arguments to pass to the ecall.

+  @param[in] NumArgs  Number of arguments to pass to the ecall.

   @param[in] ...      Argument list for the ecall.

 

   @retval  Returns SbiRet structure with value and error code.

@@ -49,16 +61,19 @@ SbiCall(
   IN  UINTN FuncId,

   IN  UINTN NumArgs,

   ...

-) {

+  )

+{

     UINTN I;

     SbiRet Ret;

-    UINTN Args[6];

+    UINTN Args[SBI_CALL_MAX_ARGS];

     VA_LIST ArgList;

-    VA_START(ArgList, NumArgs);

+    VA_START (ArgList, NumArgs);

 

-    for (I = 0; I < 6; I++) {

+    ASSERT (NumArgs <= SBI_CALL_MAX_ARGS);

+

+    for (I = 0; I < SBI_CALL_MAX_ARGS; I++) {

       if (I < NumArgs) {

-        Args[I] = VA_ARG(ArgList, UINTN);

+        Args[I] = VA_ARG (ArgList, UINTN);

       } else {

         // Default to 0 for all arguments that are not given

         Args[I] = 0;

@@ -95,8 +110,9 @@ STATIC
 EFI_STATUS

 EFIAPI

 TranslateError(

-  IN UINTN SbiError

-  ) {

+  IN  UINTN SbiError

+  )

+{

   switch (SbiError) {

     case SBI_SUCCESS:

       return EFI_SUCCESS;

@@ -129,7 +145,7 @@ TranslateError(
 }

 

 //

-// OpenSBI libraary interface function for the base extension

+// OpenSBI library interface function for the base extension

 //

 

 /**

@@ -150,7 +166,7 @@ SbiGetSpecVersion (
   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, 0);

 

   if (!Ret.Error) {

-    *SpecVersion = (UINTN) Ret.Value;

+    *SpecVersion = (UINTN)Ret.Value;

   }

 }

 

@@ -169,7 +185,7 @@ SbiGetImplId (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_ID, 0);

-  *ImplId = (UINTN) Ret.Value;

+  *ImplId = (UINTN)Ret.Value;

 }

 

 /**

@@ -187,7 +203,7 @@ SbiGetImplVersion (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_VERSION, 0);

-  *ImplVersion = (UINTN) Ret.Value;

+  *ImplVersion = (UINTN)Ret.Value;

 }

 

 /**

@@ -207,7 +223,7 @@ SbiProbeExtension (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 0);

-  *ProbeResult = (UINTN) Ret.Value;

+  *ProbeResult = (UINTN)Ret.Value;

 }

 

 /**

@@ -224,7 +240,7 @@ SbiGetMachineVendorId (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_GET_MVENDORID, 0);

-  *MachineVendorId = (UINTN) Ret.Value;

+  *MachineVendorId = (UINTN)Ret.Value;

 }

 

 /**

@@ -241,7 +257,7 @@ SbiGetMachineArchId (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_GET_MARCHID, 0);

-  *MachineArchId = (UINTN) Ret.Value;

+  *MachineArchId = (UINTN)Ret.Value;

 }

 

 /**

@@ -258,7 +274,7 @@ SbiGetMachineImplId (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_GET_MIMPID, 0);

-  *MachineImplId = (UINTN) Ret.Value;

+  *MachineImplId = (UINTN)Ret.Value;

 }

 

 //

@@ -296,13 +312,15 @@ SbiHartStart (
   IN  UINTN                          Priv

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_HSM,

-                        SBI_EXT_HSM_HART_START,

-                        3,

-                        HartId,

-                        StartAddr,

-                        Priv);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_HSM,

+                 SBI_EXT_HSM_HART_START,

+                 3,

+                 HartId,

+                 StartAddr,

+                 Priv

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -320,7 +338,7 @@ SbiHartStop (
   )

 {

   SbiRet Ret = SbiCall (SBI_EXT_HSM, SBI_EXT_HSM_HART_STOP, 0);

-  return TranslateError(Ret.Error);

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -350,10 +368,10 @@ SbiHartGetStatus (
   SbiRet Ret = SbiCall (SBI_EXT_HSM, SBI_EXT_HSM_HART_GET_STATUS, 1, HartId);

 

   if (!Ret.Error) {

-    *HartStatus = (UINTN) Ret.Value;

+    *HartStatus = (UINTN)Ret.Value;

   }

 

-  return TranslateError(Ret.Error);

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -380,12 +398,14 @@ SbiSendIpi (
   IN  UINTN                          HartMaskBase

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_IPI,

-                        SBI_EXT_IPI_SEND_IPI,

-                        2,

-                        (UINTN) HartMask,

-                        HartMaskBase);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_IPI,

+                 SBI_EXT_IPI_SEND_IPI,

+                 2,

+                 (UINTN)HartMask,

+                 HartMaskBase

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -408,12 +428,14 @@ SbiRemoteFenceI (
   IN  UINTN                          HartMaskBase

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_FENCE_I,

-                        2,

-                        (UINTN) HartMask,

-                        HartMaskBase);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_FENCE_I,

+                 2,

+                 (UINTN)HartMask,

+                 HartMaskBase

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -446,14 +468,16 @@ SbiRemoteSfenceVma (
   IN  UINTN                          Size

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_SFENCE_VMA,

-                        4,

-                        (UINTN) HartMask,

-                        HartMaskBase,

-                        StartAddr,

-                        Size);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_SFENCE_VMA,

+                 4,

+                 (UINTN)HartMask,

+                 HartMaskBase,

+                 StartAddr,

+                 Size

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -488,15 +512,17 @@ SbiRemoteSfenceVmaAsid (
   IN  UINTN                          Asid

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID,

-                        5,

-                        (UINTN) HartMask,

-                        HartMaskBase,

-                        StartAddr,

-                        Size,

-                        Asid);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID,

+                 5,

+                 (UINTN)HartMask,

+                 HartMaskBase,

+                 StartAddr,

+                 Size,

+                 Asid

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -535,15 +561,17 @@ SbiRemoteHFenceGvmaVmid (
   IN  UINTN                          Vmid

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA,

-                        5,

-                        (UINTN) HartMask,

-                        HartMaskBase,

-                        StartAddr,

-                        Size,

-                        Vmid);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA,

+                 5,

+                 (UINTN)HartMask,

+                 HartMaskBase,

+                 StartAddr,

+                 Size,

+                 Vmid

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -580,14 +608,16 @@ SbiRemoteHFenceGvma (
   IN  UINTN                          Size

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID,

-                        4,

-                        (UINTN) HartMask,

-                        HartMaskBase,

-                        StartAddr,

-                        Size);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID,

+                 4,

+                 (UINTN)HartMask,

+                 HartMaskBase,

+                 StartAddr,

+                 Size

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -626,15 +656,17 @@ SbiRemoteHFenceVvmaAsid (
   IN  UINTN                          Asid

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA,

-                        5,

-                        (UINTN) HartMask,

-                        HartMaskBase,

-                        StartAddr,

-                        Size,

-                        Asid);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA,

+                 5,

+                 (UINTN)HartMask,

+                 HartMaskBase,

+                 StartAddr,

+                 Size,

+                 Asid

+                 );

+  return TranslateError (Ret.Error);

 }

 

 /**

@@ -671,14 +703,16 @@ SbiRemoteHFenceVvma (
   IN  UINTN                          Size

   )

 {

-  SbiRet Ret = SbiCall (SBI_EXT_RFENCE,

-                        SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID,

-                        4,

-                        (UINTN) HartMask,

-                        HartMaskBase,

-                        StartAddr,

-                        Size);

-  return TranslateError(Ret.Error);

+  SbiRet Ret = SbiCall (

+                 SBI_EXT_RFENCE,

+                 SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID,

+                 4,

+                 (UINTN)HartMask,

+                 HartMaskBase,

+                 StartAddr,

+                 Size

+                 );

+  return TranslateError (Ret.Error);

 }

 

 //

@@ -689,14 +723,13 @@ SbiRemoteHFenceVvma (
   Call a function in a vendor defined SBI extension

 

   ASSERT() if the ExtensionId is not in the designated SBI Vendor Extension

-  Space.

+  Space or NumArgs exceeds SBI_CALL_MAX_ARGS.

 

   @param[in]  ExtensionId          The SBI vendor extension ID.

   @param[in]  FunctionId           The function ID to call in this extension.

   @param[in]  NumArgs              How many arguments are passed.

   @param[in]  ...                  Actual Arguments to the function.

   @retval EFI_SUCCESS if the SBI function was called and it was successful

-  @retval EFI_INVALID_PARAMETER if NumArgs exceeds 6

   @retval others if the called SBI function returns an error

 **/

 EFI_STATUS

@@ -710,39 +743,41 @@ SbiVendorCall (
 {

     SbiRet Ret;

     VA_LIST Args;

-    VA_START(Args, NumArgs);

+    VA_START (Args, NumArgs);

 

-    ASSERT (ExtensionId >= 0x09000000 && ExtensionId <= 0x09FFFFFF);

+    ASSERT (ExtensionId >= SBI_EXT_VENDOR_START && ExtensionId <= SBI_EXT_VENDOR_END);

+    ASSERT (NumArgs <= SBI_CALL_MAX_ARGS);

 

     switch (NumArgs) {

       case 0:

         Ret = SbiCall (ExtensionId, FunctionId, NumArgs);

         break;

       case 1:

-        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG(Args, UINTN));

+        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG (Args, UINTN));

         break;

       case 2:

-        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN));

+        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN));

         break;

       case 3:

-        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN), VA_ARG(Args, UINTN));

+        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN), VA_ARG (Args, UINTN));

         break;

       case 4:

-        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN), VA_ARG(Args, UINTN), VA_ARG(Args, UINTN));

+        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN), VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN));

         break;

       case 5:

-        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN), VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN), VA_ARG(Args, UINTN));

+        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN), VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN), VA_ARG (Args, UINTN));

         break;

       case 6:

-        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN), VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN), VA_ARG(Args, UINTN),

-                       VA_ARG(Args, UINTN));

+        Ret = SbiCall (ExtensionId, FunctionId, NumArgs, VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN), VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN), VA_ARG (Args, UINTN),

+                       VA_ARG (Args, UINTN));

         break;

       default:

         // Too many args. In theory SBI can handle more arguments when they are

@@ -752,7 +787,7 @@ SbiVendorCall (
      }

 

     VA_END(Args);

-    return TranslateError(Ret.Error);

+    return TranslateError (Ret.Error);

 }

 

 //

@@ -777,7 +812,7 @@ SbiGetMscratch (
   SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT, SBI_EXT_FW_MSCRATCH_FUNC, 0);

 

   if (!Ret.Error) {

-    *ScratchSpace = (SBI_SCRATCH *) Ret.Value;

+    *ScratchSpace = (SBI_SCRATCH *)Ret.Value;

   }

 

   return EFI_SUCCESS;

@@ -797,13 +832,15 @@ SbiGetMscratchHartid (
   OUT SBI_SCRATCH                    **ScratchSpace

   )

 {

-  SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT,

-                        SBI_EXT_FW_MSCRATCH_HARTID_FUNC,

-                        1,

-                        HartId);

+  SbiRet Ret = SbiCall (

+                 SBI_EDK2_FW_EXT,

+                 SBI_EXT_FW_MSCRATCH_HARTID_FUNC,

+                 1,

+                 HartId

+                 );

 

   if (!Ret.Error) {

-    *ScratchSpace = (SBI_SCRATCH *) Ret.Value;

+    *ScratchSpace = (SBI_SCRATCH *)Ret.Value;

   }

 

   return EFI_SUCCESS;

@@ -826,9 +863,9 @@ SbiGetFirmwareContext (
   SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT, SBI_EXT_FW_MSCRATCH_FUNC, 0);

 

   if (!Ret.Error) {

-    ScratchSpace = (SBI_SCRATCH *) Ret.Value;

-    SbiPlatform = (SBI_PLATFORM *) sbi_platform_ptr(ScratchSpace);

-    *FirmwareContext = (EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *) SbiPlatform->firmware_context;

+    ScratchSpace = (SBI_SCRATCH *)Ret.Value;

+    SbiPlatform = (SBI_PLATFORM *)sbi_platform_ptr(ScratchSpace);

+    *FirmwareContext = (EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT *)SbiPlatform->firmware_context;

   }

 

   return EFI_SUCCESS;

@@ -851,9 +888,9 @@ SbiSetFirmwareContext (
   SbiRet Ret = SbiCall (SBI_EDK2_FW_EXT, SBI_EXT_FW_MSCRATCH_FUNC, 0);

 

   if (!Ret.Error) {

-    ScratchSpace = (SBI_SCRATCH *) Ret.Value;

-    SbiPlatform = (SBI_PLATFORM *) sbi_platform_ptr(ScratchSpace);

-    SbiPlatform->firmware_context = (UINTN) FirmwareContext;

+    ScratchSpace = (SBI_SCRATCH *)Ret.Value;

+    SbiPlatform = (SBI_PLATFORM *)sbi_platform_ptr (ScratchSpace);

+    SbiPlatform->firmware_context = (UINTN)FirmwareContext;

   }

 

   return EFI_SUCCESS;

-- 
2.26.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#60600): https://edk2.groups.io/g/devel/message/60600
Mute This Topic: https://groups.io/mt/74631920/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-