Cc: Daniel Schaefer <daniel.schae...@hpe.com>
Cc: Abner Chang <abner.ch...@hpe.com>
Cc: Sunil V L <suni...@ventanamicro.com>

Signed-off-by: Daniel Schaefer <daniel.schae...@hpe.com>
---
 Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLibNull/Platform.c          
                           | 27 ++++---
 Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S                   
                           |  2 +
 Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c                            
                           |  5 +-
 
Platform/SiFive/U5SeriesPkg/FreedomU500VC707Board/Library/OpensbiPlatformLib/Platform.c
                   | 29 +------
 
Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/Platform.c
         | 31 +++-----
 
Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/PlatformOverride.h
 |  5 +-
 Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c                
                           | 81 +++++++++++++++++++-
 Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h                  
                           |  1 +
 Silicon/RISC-V/ProcessorPkg/Include/OpensbiTypes.h                             
                           |  1 +
 Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/RiscVOpensbiLib.inf        
                           | 13 +++-
 10 files changed, 128 insertions(+), 67 deletions(-)

diff --git 
a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLibNull/Platform.c 
b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLibNull/Platform.c
index e78d811f4c..b7e39d19c1 100644
--- a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLibNull/Platform.c
+++ b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLibNull/Platform.c
@@ -14,31 +14,38 @@
 #include <sbi/sbi_platform.h>

 

 const struct sbi_platform_operations platform_ops = {

-    .pmp_region_count   = NULL,

-    .pmp_region_info    = NULL,

+    .early_init         = NULL,

     .final_init         = NULL,

+    .early_exit         = NULL,

+    .final_exit         = NULL,

+    .domains_root_regions = NULL,

+    .domains_init       = NULL,

     .console_putc       = NULL,

     .console_getc       = NULL,

     .console_init       = NULL,

     .irqchip_init       = NULL,

+    .irqchip_exit       = NULL,

     .ipi_send           = NULL,

     .ipi_clear          = NULL,

     .ipi_init           = NULL,

+    .ipi_exit           = NULL,

+    .get_tlbr_flush_limit = NULL,

     .timer_value        = NULL,

     .timer_event_stop   = NULL,

     .timer_event_start  = NULL,

     .timer_init         = NULL,

-    .system_reboot      = NULL,

-    .system_shutdown    = NULL

+    .timer_exit         = NULL,

+    .system_reset_check = NULL,

+    .system_reset       = NULL,

 };

 

-const struct sbi_platform platform = {

-    .opensbi_version    = OPENSBI_VERSION,                      // The OpenSBI 
version this platform table is built bassed on.

-    .platform_version   = SBI_PLATFORM_VERSION(0x0000, 0x0000), // SBI 
Platform version 1.0

-    .name               = "NULL platform",

+struct sbi_platform platform = {

+    .opensbi_version    = OPENSBI_VERSION,

+    .platform_version   = SBI_PLATFORM_VERSION(0x0, 0x01),

+    .name               = "NULL Platform",

     .features           = 0,

     .hart_count         = 0,

+    .hart_index2id      = 0,

     .hart_stack_size    = 0,

-    .disabled_hart_mask = 0,

-    .platform_ops_addr  = 0

+    .platform_ops_addr  = 0,

 };

diff --git a/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S 
b/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S
index 0e3940180d..a8157c896e 100644
--- a/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S
+++ b/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S
@@ -21,6 +21,8 @@
 .text

 .align 3

 

+    .globl _start_warm

+

 ASM_FUNC (_ModuleEntryPoint)

   /*

    * Jump to warm-boot if this is not the selected core booting,

diff --git a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c 
b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c
index 0af0b4bac8..e9f030f352 100644
--- a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c
+++ b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c
@@ -21,6 +21,7 @@
 #include <sbi/sbi_platform.h> // Reference to header file in opensbi

 #include <sbi/sbi_init.h>     // Reference to header file in opensbi

 #include <sbi/sbi_ecall.h>    // Reference to header file in opensbi

+#include <sbi/sbi_trap.h>     // Reference to header file in opensbi

 

 //

 // Indicates the boot hart (PcdBootHartId) OpenSBI initialization is done.

@@ -434,7 +435,7 @@ EFI_STATUS EFIAPI TemporaryRamDone (
 STATIC int SbiEcallFirmwareHandler (

   IN  unsigned long         ExtId,

   IN  unsigned long         FuncId,

-  IN  unsigned long        *Args,

+  IN  CONST struct sbi_trap_regs *TrapRegs,

   OUT unsigned long        *OutVal,

   OUT struct sbi_trap_info *OutTrap

   )

@@ -446,7 +447,7 @@ STATIC int SbiEcallFirmwareHandler (
       *OutVal = (unsigned long) sbi_scratch_thishart_ptr();

       break;

     case SBI_EXT_FW_MSCRATCH_HARTID_FUNC:

-      *OutVal = (unsigned long) sbi_hartid_to_scratch (Args[0]);

+      *OutVal = (unsigned long) sbi_hartid_to_scratch (TrapRegs->a0);

       break;

     default:

       Ret = SBI_ENOTSUPP;

diff --git 
a/Platform/SiFive/U5SeriesPkg/FreedomU500VC707Board/Library/OpensbiPlatformLib/Platform.c
 
b/Platform/SiFive/U5SeriesPkg/FreedomU500VC707Board/Library/OpensbiPlatformLib/Platform.c
index ed4b1550bc..b346eccaf0 100644
--- 
a/Platform/SiFive/U5SeriesPkg/FreedomU500VC707Board/Library/OpensbiPlatformLib/Platform.c
+++ 
b/Platform/SiFive/U5SeriesPkg/FreedomU500VC707Board/Library/OpensbiPlatformLib/Platform.c
@@ -111,30 +111,6 @@ static int U500_final_init(bool cold_boot)
     return 0;

 }

 

-static u32 U500_pmp_region_count(u32 hartid)

-{

-    return 1;

-}

-

-static int U500_pmp_region_info(u32 hartid, u32 index,

-                 ulong *prot, ulong *addr, ulong *log2size)

-{

-    int ret = 0;

-

-    switch (index) {

-    case 0:

-        *prot = PMP_R | PMP_W | PMP_X;

-        *addr = 0;

-        *log2size = __riscv_xlen;

-        break;

-    default:

-        ret = -1;

-        break;

-    };

-

-    return ret;

-}

-

 static int U500_console_init(void)

 {

     unsigned long peri_in_freq;

@@ -196,15 +172,12 @@ static int U500_timer_init(bool cold_boot)
  */

 static u32 u500_hart_index2id[U500_BOOTABLE_HART_COUNT] = {0, 1, 2, 3};

 

-static int U500_system_reset(u32 type)

+static void U500_system_reset(u32 type, u32 second_param)

 {

     /* For now nothing to do. */

-    return 0;

 }

 

 const struct sbi_platform_operations platform_ops = {

-    .pmp_region_count = U500_pmp_region_count,

-    .pmp_region_info = U500_pmp_region_info,

     .final_init = U500_final_init,

     .console_putc = sifive_uart_putc,

     .console_getc = sifive_uart_getc,

diff --git 
a/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/Platform.c
 
b/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/Platform.c
index 4deb048566..2f51e45d58 100644
--- 
a/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/Platform.c
+++ 
b/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/Platform.c
@@ -13,6 +13,8 @@
 #include <sbi/sbi_hartmask.h>

 #include <sbi/sbi_platform.h>

 #include <sbi/sbi_string.h>

+#include <sbi/sbi_math.h>

+#include <sbi_utils/fdt/fdt_domain.h>

 #include <sbi_utils/fdt/fdt_fixup.h>

 #include <sbi_utils/fdt/fdt_helper.h>

 #include <sbi_utils/irqchip/fdt_irqchip.h>

@@ -71,7 +73,7 @@ unsigned long fw_platform_init(unsigned long arg0, unsigned 
long arg1,
                                unsigned long arg2, unsigned long arg3,

                                unsigned long arg4)

 {

-       const char *model, *mmu_type;

+       const char *model;

        void *fdt = (void *)arg1;

        u32 hartid, hart_count = 0;

        int rc, root_offset, cpus_offset, cpu_offset, len;

@@ -101,10 +103,6 @@ unsigned long fw_platform_init(unsigned long arg0, 
unsigned long arg1,
                if (SBI_HARTMASK_MAX_BITS <= hartid)

                        continue;

 

-               mmu_type = fdt_getprop(fdt, cpu_offset, "mmu-type", &len);

-               if (!mmu_type || !len)

-                       hartid = -1U;

-

                generic_hart_index2id[hart_count++] = hartid;

        }

 

@@ -152,6 +150,7 @@ static int generic_final_init(bool cold_boot)
 

        fdt_cpu_fixup(fdt);

        fdt_fixups(fdt);

+       fdt_domain_fixup(fdt);

 

        if (generic_plat && generic_plat->fdt_fixup) {

                rc = generic_plat->fdt_fixup(fdt, generic_plat_match);

@@ -174,6 +173,11 @@ static void generic_final_exit(void)
                generic_plat->final_exit(generic_plat_match);

 }

 

+static int generic_domains_init(void)

+{

+       return fdt_domains_populate(sbi_scratch_thishart_arg1_ptr());

+}

+

 static u64 generic_tlbr_flush_limit(void)

 {

        if (generic_plat && generic_plat->tlbr_flush_limit)

@@ -181,35 +185,20 @@ static u64 generic_tlbr_flush_limit(void)
        return SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT;

 }

 

-static int generic_system_reset(u32 reset_type)

-{

-       if (generic_plat && generic_plat->system_reset)

-               return generic_plat->system_reset(reset_type,

-                                                 generic_plat_match);

-       return fdt_system_reset(reset_type);

-}

-

 const struct sbi_platform_operations platform_ops = {

        .early_init             = generic_early_init,

        .final_init             = generic_final_init,

        .early_exit             = generic_early_exit,

        .final_exit             = generic_final_exit,

-       .console_putc           = fdt_serial_putc,

-       .console_getc           = fdt_serial_getc,

+       .domains_init           = generic_domains_init,

        .console_init           = fdt_serial_init,

        .irqchip_init           = fdt_irqchip_init,

        .irqchip_exit           = fdt_irqchip_exit,

-       .ipi_send               = fdt_ipi_send,

-       .ipi_clear              = fdt_ipi_clear,

        .ipi_init               = fdt_ipi_init,

        .ipi_exit               = fdt_ipi_exit,

        .get_tlbr_flush_limit   = generic_tlbr_flush_limit,

-       .timer_value            = fdt_timer_value,

-       .timer_event_stop       = fdt_timer_event_stop,

-       .timer_event_start      = fdt_timer_event_start,

        .timer_init             = fdt_timer_init,

        .timer_exit             = fdt_timer_exit,

-       .system_reset           = generic_system_reset,

 };

 

 struct sbi_platform platform = {

diff --git 
a/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/PlatformOverride.h
 
b/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/PlatformOverride.h
index 8a53cdf9ac..77a90d645e 100644
--- 
a/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/PlatformOverride.h
+++ 
b/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/Library/OpensbiPlatformLib/PlatformOverride.h
@@ -20,7 +20,10 @@ struct platform_override {
        int (*final_init)(bool cold_boot, const struct fdt_match *match);
        void (*early_exit)(const struct fdt_match *match);
        void (*final_exit)(const struct fdt_match *match);
-       int (*system_reset)(u32 reset_type, const struct fdt_match *match);
+       int (*system_reset_check)(u32 reset_type, u32 reset_reason,
+                                 const struct fdt_match *match);
+       void (*system_reset)(u32 reset_type, u32 reset_reason,
+                            const struct fdt_match *match);
        int (*fdt_fixup)(void *fdt, const struct fdt_match *match);
 };
 
diff --git a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c 
b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c
index e98c8523a3..7bc73a0b82 100644
--- a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c
+++ b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c
@@ -19,6 +19,21 @@
 #define UART_REG_IP     5

 #define UART_IP_RXWM    0x02

 

+

+#define UART_REG_TXFIFO     0

+#define UART_REG_RXFIFO     1

+#define UART_REG_TXCTRL     2

+#define UART_REG_RXCTRL     3

+#define UART_REG_IE         4

+#define UART_REG_IP         5

+#define UART_REG_DIV        6

+

+#define UART_TXFIFO_FULL    0x80000000

+#define UART_RXFIFO_EMPTY   0x80000000

+#define UART_RXFIFO_DATA    0x000000ff

+#define UART_TXCTRL_TXEN    0x1

+#define UART_RXCTRL_RXEN    0x1

+

 //---------------------------------------------

 // UART Settings

 //---------------------------------------------

@@ -28,6 +43,68 @@
 

 BOOLEAN Initiated = FALSE;

 

+/**

+  Get value from serial port register.

+

+  @param  RegIndex   Register index

+

+  @retval Vale returned from from serial port.

+

+**/

+UINT32 GetReg (

+  IN UINT32 RegIndex

+  )

+{

+  return MmioRead32 (FixedPcdGet32(PcdU5UartBase) + (RegIndex * 0x4));

+}

+

+/**

+  Set serial port register.

+

+  @param RegIndex   Register index

+  @param Value      Value write to Register

+

+**/

+VOID SetReg (

+  IN UINT32 RegIndex,

+  IN UINT32 Value

+  )

+{

+  MmioWrite32 (Value, FixedPcdGet32(PcdU5UartBase) + (RegIndex * 0x4));

+}

+

+/**

+  Character output to serial port.

+

+  @param Ch        The character to serial port.

+

+**/

+VOID SifiveUartPutChar (

+  IN UINT8 Ch

+  )

+{

+  while (GetReg (UART_REG_TXFIFO) & UART_TXFIFO_FULL);

+

+  SetReg (UART_REG_TXFIFO, Ch);

+}

+

+/**

+  Get character from serial port.

+

+  @retval character        The character from serial port.

+

+**/

+UINT32 SifiveUartGetChar (VOID)

+{

+  UINT32 Ret;

+

+  Ret = GetReg (UART_REG_RXFIFO);

+  if (!(Ret & UART_RXFIFO_EMPTY)) {

+    return Ret & UART_RXFIFO_DATA;

+  }

+  return -1;

+}

+

 /**

   Initialize the serial device hardware.

 

@@ -88,7 +165,7 @@ SerialPortWrite (
   }

 

   for(Index = 0; Index < NumberOfBytes; Index ++) {

-    sifive_uart_putc (Buffer [Index]);

+    SifiveUartPutChar (Buffer [Index]);

   }

 

   return Index;

@@ -119,7 +196,7 @@ SerialPortRead (
   }

 

   for (Index = 0; Index < NumberOfBytes; Index ++) {

-    Buffer [Index] = (UINT8)sifive_uart_getc ();

+    Buffer [Index] = (UINT8)SifiveUartGetChar ();

   }

 

   return Index;

diff --git a/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h 
b/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
index f81ea06b05..66a87cb8c3 100644
--- a/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
+++ b/Silicon/RISC-V/ProcessorPkg/Include/Library/RiscVEdk2SbiLib.h
@@ -16,6 +16,7 @@
 #include <IndustryStandard/RiscVOpensbi.h>

 #include <sbi/sbi_scratch.h>

 #include <sbi/sbi_platform.h>

+#include <sbi/sbi_ecall.h>

 

 //

 // EDK2 OpenSBI Firmware extension.

diff --git a/Silicon/RISC-V/ProcessorPkg/Include/OpensbiTypes.h 
b/Silicon/RISC-V/ProcessorPkg/Include/OpensbiTypes.h
index 00c374f24a..bbf74e2a82 100644
--- a/Silicon/RISC-V/ProcessorPkg/Include/OpensbiTypes.h
+++ b/Silicon/RISC-V/ProcessorPkg/Include/OpensbiTypes.h
@@ -49,6 +49,7 @@ typedef UINT64   physical_size_t;
 

 #define __packed        __attribute__((packed))

 #define __noreturn      __attribute__((noreturn))

+#define __aligned(x)    __attribute__((aligned(x)))

 

 #if defined(__GNUC__) || defined(__clang__)

   #define likely(x) __builtin_expect((x), 1)

diff --git 
a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/RiscVOpensbiLib.inf 
b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/RiscVOpensbiLib.inf
index 71cc76444e..e40a797896 100644
--- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/RiscVOpensbiLib.inf
+++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/RiscVOpensbiLib.inf
@@ -23,6 +23,7 @@
   opensbi/lib/sbi/sbi_bitmap.c

   opensbi/lib/sbi/sbi_bitops.c

   opensbi/lib/sbi/sbi_console.c

+  opensbi/lib/sbi/sbi_domain.c

   opensbi/lib/sbi/sbi_ecall.c

   opensbi/lib/sbi/sbi_ecall_base.c

   opensbi/lib/sbi/sbi_ecall_hsm.c

@@ -51,27 +52,33 @@
 

   opensbi/lib/utils/fdt/fdt_helper.c

   opensbi/lib/utils/fdt/fdt_fixup.c

+  opensbi/lib/utils/fdt/fdt_domain.c

   opensbi/lib/utils/ipi/fdt_ipi.c

-  opensbi/lib/utils/ipi/fdt_ipi_clint.c

+  opensbi/lib/utils/ipi/aclint_mswi.c

+  opensbi/lib/utils/ipi/fdt_ipi_mswi.c

   opensbi/lib/utils/irqchip/fdt_irqchip.c

   opensbi/lib/utils/irqchip/fdt_irqchip_plic.c

   opensbi/lib/utils/irqchip/plic.c

   opensbi/lib/utils/reset/fdt_reset.c

   opensbi/lib/utils/reset/fdt_reset_htif.c

   opensbi/lib/utils/reset/fdt_reset_sifive.c

+  opensbi/lib/utils/reset/fdt_reset_thead.c

+  opensbi/lib/utils/reset/fdt_reset_thead_asm.S

   opensbi/lib/utils/serial/fdt_serial.c

   opensbi/lib/utils/serial/fdt_serial_htif.c

   opensbi/lib/utils/serial/fdt_serial_shakti.c

   opensbi/lib/utils/serial/fdt_serial_sifive.c

   opensbi/lib/utils/serial/fdt_serial_uart8250.c

+  opensbi/lib/utils/serial/fdt_serial_gaisler.c

+  opensbi/lib/utils/serial/gaisler-uart.c

   opensbi/lib/utils/serial/shakti-uart.c

   opensbi/lib/utils/serial/sifive-uart.c

   opensbi/lib/utils/serial/uart8250.c

-  opensbi/lib/utils/sys/clint.c

   opensbi/lib/utils/sys/htif.c

   opensbi/lib/utils/sys/sifive_test.c

   opensbi/lib/utils/timer/fdt_timer.c

-  opensbi/lib/utils/timer/fdt_timer_clint.c

+  opensbi/lib/utils/timer/aclint_mtimer.c

+  opensbi/lib/utils/timer/fdt_timer_mtimer.c

 

 [Packages]

   EmbeddedPkg/EmbeddedPkg.dec   # For libfdt.

-- 
2.33.0



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81549): https://edk2.groups.io/g/devel/message/81549
Mute This Topic: https://groups.io/mt/86117336/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to