On 4/17/26 05:29, Jamin Lin wrote:
Implement basic behavior for RNG_CTRL and RNG_DATA:

- RNG_CTRL allows guest to enable/disable the RNG via the DIS bit.
   Only bits [0:3] and bit 5 are writable; other bits are masked.
- The VLD bit (bit 31) is updated by the model to reflect the RNG
   enable state, and is not writable by the guest.
- When RNG is enabled, reads from RNG_DATA return a newly generated
   random value.
- When RNG is disabled, RNG_DATA return 0.

This provides a minimal functional model of the RNG sufficient for
software that expects readable random data without modeling full
hardware behavior.

please send first.

Thanks,

C.


Signed-off-by: Jamin Lin <[email protected]>
---
  hw/misc/aspeed_scu.c | 25 +++++++++++++++++++++++++
  1 file changed, 25 insertions(+)

diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
index 362733ba11..f9ae65d83c 100644
--- a/hw/misc/aspeed_scu.c
+++ b/hw/misc/aspeed_scu.c
@@ -187,6 +187,11 @@
  #define AST2700_SCU_CPU_SCRATCH_1   TO_REG(0x784)
  #define AST2700_SCU_VGA_SCRATCH_0   TO_REG(0x900)
+#define AST2700_SCUIO_RNG_CTRL TO_REG(0xF0)
+#define AST2700_SCUIO_RNG_CTRL_MASK     0x2F
+#define AST2700_SCUIO_RNG_CTRL_DIS      BIT(0)
+#define AST2700_SCUIO_RNG_CTRL_VLD      BIT(31)
+#define AST2700_SCUIO_RNG_DATA          TO_REG(0xF4)
  #define AST2700_SCUIO_CLK_STOP_CTL_1    TO_REG(0x240)
  #define AST2700_SCUIO_CLK_STOP_CLR_1    TO_REG(0x244)
  #define AST2700_SCUIO_CLK_STOP_CTL_2    TO_REG(0x260)
@@ -1257,6 +1262,14 @@ static uint64_t aspeed_ast2700_scuio_read(void *opaque, 
hwaddr offset,
          return 0;
      }
+ switch (reg) {
+    case AST2700_SCUIO_RNG_DATA:
+        if (!(s->regs[AST2700_SCUIO_RNG_CTRL] & AST2700_SCUIO_RNG_CTRL_DIS)) {
+            s->regs[AST2700_SCUIO_RNG_DATA] = aspeed_scu_get_random();
+        }
+        break;
+    }
+
      trace_aspeed_ast2700_scuio_read(offset, size, s->regs[reg]);
      return s->regs[reg];
  }
@@ -1280,6 +1293,18 @@ static void aspeed_ast2700_scuio_write(void *opaque, 
hwaddr offset,
      trace_aspeed_ast2700_scuio_write(offset, size, data);
switch (reg) {
+    case AST2700_SCUIO_RNG_CTRL:
+        data &= AST2700_SCUIO_RNG_CTRL_MASK;
+        if (data & AST2700_SCUIO_RNG_CTRL_DIS) {
+            data &= ~AST2700_SCUIO_RNG_CTRL_VLD;
+            s->regs[AST2700_SCUIO_RNG_DATA] = 0;
+        } else {
+            s->regs[AST2700_SCUIO_RNG_DATA] = aspeed_scu_get_random();
+            data |= AST2700_SCUIO_RNG_CTRL_VLD;
+        }
+        s->regs[reg] = data;
+        updated = true;
+        break;
      case AST2700_SCUIO_CLK_STOP_CTL_1:
      case AST2700_SCUIO_CLK_STOP_CTL_2:
          s->regs[reg] |= data;


Reply via email to