Add SPI flash to renode configs
b/299910690
Change-Id: I0b54cac3878a94ed35ef0187201f1c61cbae1dfe
diff --git a/platforms/nexus.repl b/platforms/nexus.repl
index c65e57c..8a33c92 100644
--- a/platforms/nexus.repl
+++ b/platforms/nexus.repl
@@ -50,3 +50,7 @@
HostReqIRQ -> smc_plic@33
FinishIRQ -> smc_plic@34
InstructionFaultIRQ -> smc_plic@35
+
+// Flash/MRAM [‘h4400_0000 - ‘h47FF_FFFF) 64MB External Non-Volatile Memory
+extflash_mem:
+ size: 0x04000000
diff --git a/platforms/nexus_smc.repl b/platforms/nexus_smc.repl
index 307f4ec..6ce590b 100644
--- a/platforms/nexus_smc.repl
+++ b/platforms/nexus_smc.repl
@@ -28,6 +28,7 @@
// Control block for the SMC, lets us pause/restart the core at an arbitrary PC.
smc_control: @ sysbus 0x54020000
cpu: cpu1
+ pc: 0x50000000
smc_plic:
0 -> cpu1@9
diff --git a/platforms/secure.repl b/platforms/secure.repl
index ae1fca7..53103a5 100644
--- a/platforms/secure.repl
+++ b/platforms/secure.repl
@@ -104,6 +104,9 @@
SpiEvent -> plic@132
numberOfCSLines: 32
+extflash: SPI.Micron_MT25Q @ spi_host0 0
+ underlyingMemory: extflash_mem
+
// SPI_HOST1 [‘h4007_0000 - ‘h4007_0FFF) 4KB SPI HOST 1
spi_host1: SPI.OpenTitan_SpiHost@ sysbus 0x40310000
FatalAlert -> alert_handler@20
@@ -340,11 +343,9 @@
// RV_CORE_IBEX [‘h411F_0000 - ‘h411F_0FFF) 4KB RV Core Ibex
-// Flash/MRAM [‘h4400_0000 - ‘h44FF_FFFF) 16MB External Non-Volatile Memory
-// TODO(b/197745020) - temporarily 36M for debug (non-LTO) rust component builds
-// NB: the last 4M are written with the ELF model
-extflash: Memory.MappedMemory @ sysbus 0x44000000
- size: 0x02400000
+// Flash/MRAM [‘h4400_0000 - ‘h45FF_FFFF) 32MB External Non-Volatile Memory
+extflash_mem: Memory.MappedMemory @ sysbus 0x44000000
+ size: 0x02000000
// Tag memory for debugging
sysbus:
diff --git a/platforms/shodan.repl b/platforms/shodan.repl
index b848959..49225c3 100644
--- a/platforms/shodan.repl
+++ b/platforms/shodan.repl
@@ -27,6 +27,9 @@
rtirq_B -> smc_plic@11 // kTopMatchaPlicIrqIdMailboxSmcRtirq
eirq_B -> smc_plic@12 // kTopMatchaPlicIrqIdMailboxSmcEirq
+cpio_mem: Memory.MappedMemory @ sysbus 0x46000000
+ size: 0x01000000
+
vec_controlblock : CPU.SpringbokRiscV32_ControlBlock @ sysbus 0x47000000
core: cpu2
mmuNumWindows: 6 // See: go/shodan-vc-memory
diff --git a/platforms/smc.repl b/platforms/smc.repl
index ce84374..596c563 100644
--- a/platforms/smc.repl
+++ b/platforms/smc.repl
@@ -49,6 +49,7 @@
// Control block for the SMC, lets us pause/restart the core at an arbitrary PC.
smc_control: CPU.SmcRiscV32_ControlBlock @ sysbus 0x54020000
cpu: cpu1
+ pc: 0x28000000
// SMC_PLIC
smc_plic: IRQControllers.PlatformLevelInterruptController @ sysbus 0x60000000 // TOP_MATCHA_RV_PLIC_SMC_BASE_ADDR @ top_matcha.h
diff --git a/shodan_infrastructure/SmcRiscV32.cs b/shodan_infrastructure/SmcRiscV32.cs
index c62c68d..579ecfb 100644
--- a/shodan_infrastructure/SmcRiscV32.cs
+++ b/shodan_infrastructure/SmcRiscV32.cs
@@ -13,6 +13,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+using System;
+using System.Collections.Generic;
+using Antmicro.Renode.Core.Structure.Registers;
using Antmicro.Renode.Core;
using Antmicro.Renode.Logging;
using Antmicro.Renode.Peripherals.Bus;
@@ -21,35 +24,56 @@
{
public class SmcRiscV32_ControlBlock : IDoubleWordPeripheral, IKnownSize
{
- public SmcRiscV32_ControlBlock(RiscV32 cpu)
+ public SmcRiscV32_ControlBlock(RiscV32 cpu, long pc)
{
this.cpu = cpu;
+ this.startPC = pc;
+ DefineRegisters();
+ Reset();
}
public void Reset() // IPeripheral
{
}
- public uint ReadDoubleWord(long offset) // IDoubleWordPeripheral
+ public uint ReadDoubleWord(long addr) // IDoubleWordPeripheral
{
- return cpu.PC;
+ return RegistersCollection.Read(addr);
}
- public void WriteDoubleWord(long offset, uint value) // IDoubleWordPeripheral
+ public void WriteDoubleWord(long addr, uint value) // IDoubleWordPeripheral
{
- if (value == 0) {
- this.Log(LogLevel.Noisy, "Stopping SMC");
- cpu.PC = 0;
- cpu.IsHalted = true;
- }
- else {
- this.Log(LogLevel.Noisy, "Starting SMC at 0x{0:X8}", value);
- cpu.PC = value;
- cpu.IsHalted = false;
- }
+ RegistersCollection.Write(addr, value);
}
- public long Size => 0x4;
+ public long Size => 0x8;
private RiscV32 cpu;
+ private long startPC;
+
+ public DoubleWordRegisterCollection RegistersCollection { get; private set; }
+ private void DefineRegisters() {
+ var registerDictionary = new Dictionary<long, DoubleWordRegister>
+ {{(long)Registers.BootEnRegwen, new DoubleWordRegister(this)
+ .WithReservedBits(0, 31)
+ },
+ {(long)Registers.BootEnCtrl, new DoubleWordRegister(this)
+ .WithFlag(0, FieldMode.Write, writeCallback: (_, val) => {
+ if (val) {
+ this.Log(LogLevel.Noisy, "Starting SMC at 0x{0:X}", this.startPC);
+ cpu.PC = this.startPC;
+ cpu.IsHalted = false;
+ } else {
+ this.Log(LogLevel.Noisy, "Stopping SMC");
+ cpu.PC = 0;
+ cpu.IsHalted = true;
+ }
+ })
+ }};
+ RegistersCollection = new DoubleWordRegisterCollection(this, registerDictionary);
+ }
+ public enum Registers {
+ BootEnRegwen = 0x0,
+ BootEnCtrl = 0x4,
+ }
}
}