[chiplevel test] Test GPIOs on hyperdebug

Signed-off-by: Chris Frantz <cfrantz@google.com>
diff --git a/sw/device/tests/BUILD b/sw/device/tests/BUILD
index 4ec67c3..4f862df 100644
--- a/sw/device/tests/BUILD
+++ b/sw/device/tests/BUILD
@@ -1102,8 +1102,16 @@
 opentitan_functest(
     name = "gpio_pinmux_test",
     srcs = ["gpio_pinmux_test.c"],
+    cw310 = cw310_params(
+        interface = "hyperdebug",
+        tags = ["manual"],
+        test_cmds = [
+            "--bootstrap=\"$(location {flash})\"",
+        ],
+    ),
     targets = [
         "verilator",
+        "cw310_test_rom",
     ],
     test_harness = "//sw/host/tests/chip/gpio",
     verilator = verilator_params(
diff --git a/sw/host/tests/chip/gpio/src/main.rs b/sw/host/tests/chip/gpio/src/main.rs
index d38922f..6b0a6c7 100644
--- a/sw/host/tests/chip/gpio/src/main.rs
+++ b/sw/host/tests/chip/gpio/src/main.rs
@@ -38,40 +38,116 @@
 }
 
 lazy_static! {
-static ref VERILATOR: Config = Config {
-    input: collection! {
-        PinmuxPeripheralIn::GpioGpio0 => PinmuxInsel::Iob6,
-        PinmuxPeripheralIn::GpioGpio1 => PinmuxInsel::Iob7,
-        PinmuxPeripheralIn::GpioGpio2 => PinmuxInsel::Iob8,
-        PinmuxPeripheralIn::GpioGpio3 => PinmuxInsel::Iob9,
-        PinmuxPeripheralIn::GpioGpio4 => PinmuxInsel::Iob10,
-        PinmuxPeripheralIn::GpioGpio5 => PinmuxInsel::Iob11,
-        PinmuxPeripheralIn::GpioGpio6 => PinmuxInsel::Iob12,
-        PinmuxPeripheralIn::GpioGpio7 => PinmuxInsel::Ior5,
-        PinmuxPeripheralIn::GpioGpio8 => PinmuxInsel::Ior6,
-        PinmuxPeripheralIn::GpioGpio9 => PinmuxInsel::Ior7,
-        // IOR8-9 aren't MIOs.
-        PinmuxPeripheralIn::GpioGpio10 => PinmuxInsel::Ior10,
-        PinmuxPeripheralIn::GpioGpio11 => PinmuxInsel::Ior11,
-        PinmuxPeripheralIn::GpioGpio12 => PinmuxInsel::Ior12,
-        PinmuxPeripheralIn::GpioGpio13 => PinmuxInsel::Ior13,
+static ref CONFIG: HashMap<&'static str, Config> = collection! {
+    "verilator" => Config {
+        input: collection! {
+            PinmuxPeripheralIn::GpioGpio0 => PinmuxInsel::Iob6,
+            PinmuxPeripheralIn::GpioGpio1 => PinmuxInsel::Iob7,
+            PinmuxPeripheralIn::GpioGpio2 => PinmuxInsel::Iob8,
+            PinmuxPeripheralIn::GpioGpio3 => PinmuxInsel::Iob9,
+            PinmuxPeripheralIn::GpioGpio4 => PinmuxInsel::Iob10,
+            PinmuxPeripheralIn::GpioGpio5 => PinmuxInsel::Iob11,
+            PinmuxPeripheralIn::GpioGpio6 => PinmuxInsel::Iob12,
+            PinmuxPeripheralIn::GpioGpio7 => PinmuxInsel::Ior5,
+            PinmuxPeripheralIn::GpioGpio8 => PinmuxInsel::Ior6,
+            PinmuxPeripheralIn::GpioGpio9 => PinmuxInsel::Ior7,
+            // IOR8-9 aren't MIOs.
+            PinmuxPeripheralIn::GpioGpio10 => PinmuxInsel::Ior10,
+            PinmuxPeripheralIn::GpioGpio11 => PinmuxInsel::Ior11,
+            PinmuxPeripheralIn::GpioGpio12 => PinmuxInsel::Ior12,
+            PinmuxPeripheralIn::GpioGpio13 => PinmuxInsel::Ior13,
+        },
+        output: collection! {
+            PinmuxMioOut::Iob6 => PinmuxOutsel::GpioGpio0,
+            PinmuxMioOut::Iob7 => PinmuxOutsel::GpioGpio1,
+            PinmuxMioOut::Iob8 => PinmuxOutsel::GpioGpio2,
+            PinmuxMioOut::Iob9 => PinmuxOutsel::GpioGpio3,
+            PinmuxMioOut::Iob10 => PinmuxOutsel::GpioGpio4,
+            PinmuxMioOut::Iob11 => PinmuxOutsel::GpioGpio5,
+            PinmuxMioOut::Iob12 => PinmuxOutsel::GpioGpio6,
+            PinmuxMioOut::Ior5 => PinmuxOutsel::GpioGpio7,
+            PinmuxMioOut::Ior6 => PinmuxOutsel::GpioGpio8,
+            PinmuxMioOut::Ior7 => PinmuxOutsel::GpioGpio9,
+            // IOR8-9 aren't MIOs.
+            PinmuxMioOut::Ior10 => PinmuxOutsel::GpioGpio10,
+            PinmuxMioOut::Ior11 => PinmuxOutsel::GpioGpio11,
+            PinmuxMioOut::Ior12 => PinmuxOutsel::GpioGpio12,
+            PinmuxMioOut::Ior13 => PinmuxOutsel::GpioGpio13,
+        },
     },
-    output: collection! {
-        PinmuxMioOut::Iob6 => PinmuxOutsel::GpioGpio0,
-        PinmuxMioOut::Iob7 => PinmuxOutsel::GpioGpio1,
-        PinmuxMioOut::Iob8 => PinmuxOutsel::GpioGpio2,
-        PinmuxMioOut::Iob9 => PinmuxOutsel::GpioGpio3,
-        PinmuxMioOut::Iob10 => PinmuxOutsel::GpioGpio4,
-        PinmuxMioOut::Iob11 => PinmuxOutsel::GpioGpio5,
-        PinmuxMioOut::Iob12 => PinmuxOutsel::GpioGpio6,
-        PinmuxMioOut::Ior5 => PinmuxOutsel::GpioGpio7,
-        PinmuxMioOut::Ior6 => PinmuxOutsel::GpioGpio8,
-        PinmuxMioOut::Ior7 => PinmuxOutsel::GpioGpio9,
-        // IOR8-9 aren't MIOs.
-        PinmuxMioOut::Ior10 => PinmuxOutsel::GpioGpio10,
-        PinmuxMioOut::Ior11 => PinmuxOutsel::GpioGpio11,
-        PinmuxMioOut::Ior12 => PinmuxOutsel::GpioGpio12,
-        PinmuxMioOut::Ior13 => PinmuxOutsel::GpioGpio13,
+    "hyperdebug" => Config {
+        input: collection! {
+            // The commented lines represent multi-fuction pins.  These will
+            // be added back in when the hyperdebug firmware can set these
+            // multifunction pins into GPIO mode.
+
+            //PinmuxPeripheralIn::GpioGpio0 => PinmuxInsel::Ioa0,   // UART4
+            //PinmuxPeripheralIn::GpioGpio1 => PinmuxInsel::Ioa1,   // UART4
+            PinmuxPeripheralIn::GpioGpio2 => PinmuxInsel::Ioa2,
+            PinmuxPeripheralIn::GpioGpio3 => PinmuxInsel::Ioa3,
+            //PinmuxPeripheralIn::GpioGpio4 => PinmuxInsel::Ioa4,   // UART5
+            //PinmuxPeripheralIn::GpioGpio5 => PinmuxInsel::Ioa5,   // UART5
+            PinmuxPeripheralIn::GpioGpio6 => PinmuxInsel::Ioa6,
+            //PinmuxPeripheralIn::GpioGpio7 => PinmuxInsel::Ioa7,   // I2C1
+            //PinmuxPeripheralIn::GpioGpio8 => PinmuxInsel::Ioa8,   // I2C1
+            //PinmuxPeripheralIn::GpioGpio9 => PinmuxInsel::Iob4,   // UART3
+            //PinmuxPeripheralIn::GpioGpio10 => PinmuxInsel::Iob5,  // UART3
+            PinmuxPeripheralIn::GpioGpio11 => PinmuxInsel::Iob6,
+
+            PinmuxPeripheralIn::GpioGpio12 => PinmuxInsel::Ioc0,
+            PinmuxPeripheralIn::GpioGpio13 => PinmuxInsel::Ioc1,
+            PinmuxPeripheralIn::GpioGpio14 => PinmuxInsel::Ioc2,
+
+            PinmuxPeripheralIn::GpioGpio15 => PinmuxInsel::Ioc5,
+            PinmuxPeripheralIn::GpioGpio16 => PinmuxInsel::Ioc6,
+            PinmuxPeripheralIn::GpioGpio17 => PinmuxInsel::Ioc10,
+            PinmuxPeripheralIn::GpioGpio18 => PinmuxInsel::Ioc11,
+            PinmuxPeripheralIn::GpioGpio19 => PinmuxInsel::Ioc12,
+
+            PinmuxPeripheralIn::GpioGpio20 => PinmuxInsel::Ior5,
+            PinmuxPeripheralIn::GpioGpio21 => PinmuxInsel::Ior6,
+            PinmuxPeripheralIn::GpioGpio22 => PinmuxInsel::Ior7,
+            // IOR8-9 aren't MIOs.
+            PinmuxPeripheralIn::GpioGpio25 => PinmuxInsel::Ior10,
+            PinmuxPeripheralIn::GpioGpio26 => PinmuxInsel::Ior11,
+            PinmuxPeripheralIn::GpioGpio27 => PinmuxInsel::Ior12,
+            PinmuxPeripheralIn::GpioGpio28 => PinmuxInsel::Ior13,
+
+        },
+        output: collection! {
+            // The commented lines represent multi-fuction pins.  These will
+            // be added back in when the hyperdebug firmware can set these
+            // multifunction pins into GPIO mode.
+
+            //PinmuxMioOut::Ioa0 => PinmuxOutsel::GpioGpio0,   // UART4
+            //PinmuxMioOut::Ioa1 => PinmuxOutsel::GpioGpio1,   // UART4
+            PinmuxMioOut::Ioa2 => PinmuxOutsel::GpioGpio2,
+            PinmuxMioOut::Ioa3 => PinmuxOutsel::GpioGpio3,
+            //PinmuxMioOut::Ioa4 => PinmuxOutsel::GpioGpio4,   // UART5
+            //PinmuxMioOut::Ioa5 => PinmuxOutsel::GpioGpio5,   // UART5
+            PinmuxMioOut::Ioa6 => PinmuxOutsel::GpioGpio6,
+            //PinmuxMioOut::Ioa7 => PinmuxOutsel::GpioGpio7,   // I2C1
+            //PinmuxMioOut::Ioa8 => PinmuxOutsel::GpioGpio8,   // I2C1
+            //PinmuxMioOut::Iob4 => PinmuxOutsel::GpioGpio9,   // UART3
+            //PinmuxMioOut::Iob5 => PinmuxOutsel::GpioGpio10,  // UART3
+            PinmuxMioOut::Iob6 => PinmuxOutsel::GpioGpio11,
+            PinmuxMioOut::Ioc0 => PinmuxOutsel::GpioGpio12,
+            PinmuxMioOut::Ioc1 => PinmuxOutsel::GpioGpio13,
+            PinmuxMioOut::Ioc2 => PinmuxOutsel::GpioGpio14,
+            PinmuxMioOut::Ioc5 => PinmuxOutsel::GpioGpio15,
+            PinmuxMioOut::Ioc6 => PinmuxOutsel::GpioGpio16,
+            PinmuxMioOut::Ioc10 => PinmuxOutsel::GpioGpio17,
+            PinmuxMioOut::Ioc11 => PinmuxOutsel::GpioGpio18,
+            PinmuxMioOut::Ioc12 => PinmuxOutsel::GpioGpio19,
+            PinmuxMioOut::Ior5 => PinmuxOutsel::GpioGpio20,
+            PinmuxMioOut::Ior6 => PinmuxOutsel::GpioGpio21,
+            PinmuxMioOut::Ior7 => PinmuxOutsel::GpioGpio22,
+            // IOR8-9 aren't MIOs.
+            PinmuxMioOut::Ior10 => PinmuxOutsel::GpioGpio25,
+            PinmuxMioOut::Ior11 => PinmuxOutsel::GpioGpio26,
+            PinmuxMioOut::Ior12 => PinmuxOutsel::GpioGpio27,
+            PinmuxMioOut::Ior13 => PinmuxOutsel::GpioGpio28,
+        },
     },
 };
 }
@@ -148,12 +224,15 @@
     Ok(())
 }
 
-fn test_gpio_outputs(_opts: &Opts, transport: &TransportWrapper) -> Result<()> {
+fn test_gpio_outputs(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
     let uart = transport.uart("console")?;
-    // TODO(cfrantz): Enhance this test to have pinmux configurations for other
-    // platforms, such as cw310+hyperdebug.
-    let config = &VERILATOR;
-    log::info!("Configuring pinmux");
+    log::info!(
+        "Configuring pinmux for {:?}",
+        opts.init.backend_opts.interface
+    );
+    let config = CONFIG
+        .get(opts.init.backend_opts.interface.as_str())
+        .expect("interface");
     PinmuxConfig::configure(&*uart, None, Some(&config.output))?;
 
     log::info!("Configuring debugger GPIOs as inputs");
@@ -175,12 +254,15 @@
     Ok(())
 }
 
-fn test_gpio_inputs(_opts: &Opts, transport: &TransportWrapper) -> Result<()> {
+fn test_gpio_inputs(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
     let uart = transport.uart("console")?;
-    // TODO(cfrantz): Enhance this test to have pinmux configurations for other
-    // platforms, such as cw310+hyperdebug.
-    let config = &VERILATOR;
-    log::info!("Configuring pinmux");
+    log::info!(
+        "Configuring pinmux for {:?}",
+        opts.init.backend_opts.interface
+    );
+    let config = CONFIG
+        .get(opts.init.backend_opts.interface.as_str())
+        .expect("interface");
     PinmuxConfig::configure(&*uart, Some(&config.input), None)?;
 
     log::info!("Configuring debugger GPIOs as outputs");