[cw_spiflash] Update SAM3X pinmap, OTT and SW tests accordingly

Signed-off-by: Michael Schaffner <msf@google.com>
diff --git a/sw/device/examples/demos.c b/sw/device/examples/demos.c
index 379698f..379941f 100644
--- a/sw/device/examples/demos.c
+++ b/sw/device/examples/demos.c
@@ -18,7 +18,7 @@
   LOG_INFO("Watch the LEDs!");
 
   // Give a LED pattern as startup indicator for 5 seconds.
-  CHECK_DIF_OK(dif_gpio_write_all(gpio, 0xff00));
+  CHECK_DIF_OK(dif_gpio_write_all(gpio, 0x00ff));
   for (int i = 0; i < 32; ++i) {
     busy_spin_micros(5 * 1000);  // 5 ms
     CHECK_DIF_OK(dif_gpio_write(gpio, 8 + (i % 8), (i / 8) % 2));
@@ -27,15 +27,15 @@
 }
 
 /**
- * Mask for "valid" GPIO bits. The first byte represents switch inputs,
- * while byte 16 represents the FTDI bit.
+ * Mask for "valid" GPIO bits. The nibble at [11:8] represents switch inputs,
+ * while the bit at [22] represents the FTDI bit (SW strap 0).
  */
-static const uint32_t kGpioMask = 0x100ff;
+static const uint32_t kGpioMask = 0x400f00;
 
 /**
- * Mask for the FTDI bit among the GPIO bits.
+ * Mask for the FTDI bit (SW strap 0) among the GPIO bits.
  */
-static const uint32_t kFtdiMask = 0x10000;
+static const uint32_t kFtdiMask = 0x400000;
 
 uint32_t demo_gpio_to_log_echo(dif_gpio_t *gpio, uint32_t prev_gpio_state) {
   uint32_t gpio_state;
diff --git a/sw/device/examples/hello_world/hello_world.c b/sw/device/examples/hello_world/hello_world.c
index f0153f6..5efd0f0 100644
--- a/sw/device/examples/hello_world/hello_world.c
+++ b/sw/device/examples/hello_world/hello_world.c
@@ -59,8 +59,8 @@
 
   CHECK_DIF_OK(
       dif_gpio_init(mmio_region_from_addr(TOP_EARLGREY_GPIO_BASE_ADDR), &gpio));
-  // Enable GPIO: 0-7 and 16 is input; 8-15 is output.
-  CHECK_DIF_OK(dif_gpio_output_set_enabled_all(&gpio, 0x0ff00));
+  // Enable GPIO: 0-7 is output; 8-11 is input.
+  CHECK_DIF_OK(dif_gpio_output_set_enabled_all(&gpio, 0x000FF));
 
   // Add DATE and TIME because I keep fooling myself with old versions
   LOG_INFO("Hello World!");
diff --git a/sw/device/lib/testing/pinmux_testutils.c b/sw/device/lib/testing/pinmux_testutils.c
index 0427222..1029359 100644
--- a/sw/device/lib/testing/pinmux_testutils.c
+++ b/sw/device/lib/testing/pinmux_testutils.c
@@ -19,7 +19,7 @@
   for (uint32_t index = 0; index < NUM_GPIO; index++) {
     dif_pinmux_index_t mio = kTopEarlgreyPinmuxInselIoa0 + index;
     if (mio == kTopEarlgreyPinmuxInselIoc3 ||
-        mio == kTopEarlgreyPinmuxInselIoc8) {
+        mio == kTopEarlgreyPinmuxInselIob4) {
       // Avoid causing glitches: Don't assign the UART pins to a GPIO.
       continue;
     } else {
@@ -33,8 +33,8 @@
     dif_pinmux_index_t mio = kTopEarlgreyPinmuxMioOutIoa0 + index;
     if (mio == kTopEarlgreyPinmuxMioOutIoc3 ||
         mio == kTopEarlgreyPinmuxMioOutIoc4 ||
-        mio == kTopEarlgreyPinmuxMioOutIoc8 ||
-        mio == kTopEarlgreyPinmuxMioOutIoc9) {
+        mio == kTopEarlgreyPinmuxMioOutIob4 ||
+        mio == kTopEarlgreyPinmuxMioOutIob5) {
       // Avoid causing glitches: Don't assign the UART pins to a GPIO.
       continue;
     } else {
@@ -54,14 +54,14 @@
                                         kTopEarlgreyPinmuxOutselUart0Tx));
 
 #if !OT_IS_ENGLISH_BREAKFAST
-  // Configure UART1 RX input to connect to MIO pad IOC8
+  // Configure UART1 RX input to connect to MIO pad IOB4
   CHECK_DIF_OK(dif_pinmux_input_select(pinmux,
                                        kTopEarlgreyPinmuxPeripheralInUart1Rx,
-                                       kTopEarlgreyPinmuxInselIoc8));
-  CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopEarlgreyPinmuxMioOutIoc8,
+                                       kTopEarlgreyPinmuxInselIob4));
+  CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopEarlgreyPinmuxMioOutIob4,
                                         kTopEarlgreyPinmuxOutselConstantHighZ));
-  // Configure UART1 TX output to connect to MIO pad IOC9
-  CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopEarlgreyPinmuxMioOutIoc9,
+  // Configure UART1 TX output to connect to MIO pad IOB5
+  CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopEarlgreyPinmuxMioOutIob5,
                                         kTopEarlgreyPinmuxOutselUart1Tx));
 #endif
 
diff --git a/sw/device/lib/testing/test_rom/bootstrap.c b/sw/device/lib/testing/test_rom/bootstrap.c
index 4a70712..4533881 100644
--- a/sw/device/lib/testing/test_rom/bootstrap.c
+++ b/sw/device/lib/testing/test_rom/bootstrap.c
@@ -22,7 +22,7 @@
 
 #include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
 
-#define GPIO_BOOTSTRAP_BIT_MASK 0x00020000u
+#define GPIO_BOOTSTRAP_BIT_MASK 0x00400000u
 
 /**
  * Check if flash is blank to determine if bootstrap is needed.
diff --git a/sw/device/silicon_creator/lib/drivers/pinmux.c b/sw/device/silicon_creator/lib/drivers/pinmux.c
index 020add4..863a9e0 100644
--- a/sw/device/silicon_creator/lib/drivers/pinmux.c
+++ b/sw/device/silicon_creator/lib/drivers/pinmux.c
@@ -32,28 +32,34 @@
 /**
  * UART RX pin.
  */
-static const pinmux_input_t kInputUart = {
+static const pinmux_input_t kInputUart0 = {
     .periph = kTopEarlgreyPinmuxPeripheralInUart0Rx,
     .pad = kTopEarlgreyPinmuxInselIoc3,
 };
 
 /**
- * Bootstrap pin.
- *
- * TODO(#11934): The actual chip will have 3 strapping pins that should be
- * configured as inputs.
+ * UART TX pin.
  */
-static const pinmux_input_t kInputBootstrap = {
-    .periph = kTopEarlgreyPinmuxPeripheralInGpioGpio17,
-    .pad = kTopEarlgreyPinmuxInselIob8,
+static const pinmux_output_t kOutputUart0 = {
+    .pad = kTopEarlgreyPinmuxMioOutIoc4,
+    .periph = kTopEarlgreyPinmuxOutselUart0Tx,
 };
 
 /**
- * UART TX pin.
+ * SW strap pins.
+ *
  */
-static const pinmux_output_t kOutputUart = {
-    .pad = kTopEarlgreyPinmuxMioOutIoc4,
-    .periph = kTopEarlgreyPinmuxOutselUart0Tx,
+static const pinmux_input_t kInputSwStrap0 = {
+    .periph = kTopEarlgreyPinmuxPeripheralInGpioGpio22,
+    .pad = kTopEarlgreyPinmuxInselIoc0,
+};
+static const pinmux_input_t kInputSwStrap1 = {
+    .periph = kTopEarlgreyPinmuxPeripheralInGpioGpio23,
+    .pad = kTopEarlgreyPinmuxInselIoc1,
+};
+static const pinmux_input_t kInputSwStrap2 = {
+    .periph = kTopEarlgreyPinmuxPeripheralInGpioGpio24,
+    .pad = kTopEarlgreyPinmuxInselIoc2,
 };
 
 /**
@@ -84,9 +90,11 @@
   uint32_t bootstrap_en = otp_read32(OTP_CTRL_PARAM_ROM_BOOTSTRAP_EN_OFFSET);
   if (launder32(bootstrap_en) == kHardenedBoolTrue) {
     HARDENED_CHECK_EQ(bootstrap_en, kHardenedBoolTrue);
-    configure_input(kInputBootstrap);
+    configure_input(kInputSwStrap0);
+    configure_input(kInputSwStrap1);
+    configure_input(kInputSwStrap2);
   }
 
-  configure_input(kInputUart);
-  configure_output(kOutputUart);
+  configure_input(kInputUart0);
+  configure_output(kOutputUart0);
 }
diff --git a/sw/device/silicon_creator/lib/drivers/pinmux_unittest.cc b/sw/device/silicon_creator/lib/drivers/pinmux_unittest.cc
index 52f6b9e..16937ea 100644
--- a/sw/device/silicon_creator/lib/drivers/pinmux_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/pinmux_unittest.cc
@@ -68,8 +68,12 @@
   // The inputs that will be configured.
   EXPECT_CALL(otp_, read32(OTP_CTRL_PARAM_ROM_BOOTSTRAP_EN_OFFSET))
       .WillOnce(Return(kHardenedBoolTrue));
-  EXPECT_ABS_WRITE32(RegIn(kTopEarlgreyPinmuxPeripheralInGpioGpio17),
-                     kTopEarlgreyPinmuxInselIob8)
+  EXPECT_ABS_WRITE32(RegIn(kTopEarlgreyPinmuxPeripheralInGpioGpio22),
+                     kTopEarlgreyPinmuxInselIoc0)
+  EXPECT_ABS_WRITE32(RegIn(kTopEarlgreyPinmuxPeripheralInGpioGpio23),
+                     kTopEarlgreyPinmuxInselIoc1)
+  EXPECT_ABS_WRITE32(RegIn(kTopEarlgreyPinmuxPeripheralInGpioGpio24),
+                     kTopEarlgreyPinmuxInselIoc2)
   EXPECT_ABS_WRITE32(RegIn(kTopEarlgreyPinmuxPeripheralInUart0Rx),
                      kTopEarlgreyPinmuxInselIoc3);
 
diff --git a/sw/device/tests/gpio_smoketest.c b/sw/device/tests/gpio_smoketest.c
index 5780f9c..da480d2 100644
--- a/sw/device/tests/gpio_smoketest.c
+++ b/sw/device/tests/gpio_smoketest.c
@@ -28,13 +28,10 @@
 /**
  * Pins to be tested.
  *
- * This test only uses pins 0-15 to be compatible with both FPGA and DV:
- * - On the nexys video board (chip_earlgrey_nexysvideo.sv), pins 20-23 are
- *   grounded and pins 16-19 are reserved for JTAG, while
- * - On the OpenTitan ASIC (chip_earlgrey_asic.sv), pins 20-31 are grounded and
- *   pins 16-19 are reserved for JTAG.
+ * This test only uses pins 0-12 to be compatible with both FPGA and DV.
+ * See chip-level testbenches and top-level hjson file for actual configuration.
  */
-static const uint32_t kGpioMask = 0x0000FFFF;
+static const uint32_t kGpioMask = 0x00000FFF;
 
 /**
  * Writes the given value to GPIO pins and compares it against the value read.
diff --git a/sw/device/tests/sim_dv/gpio_test.c b/sw/device/tests/sim_dv/gpio_test.c
index 5779ebc..df1352c 100644
--- a/sw/device/tests/sim_dv/gpio_test.c
+++ b/sw/device/tests/sim_dv/gpio_test.c
@@ -25,10 +25,10 @@
 static const uint32_t kGpiosMask = 0xffffffff;
 
 // These constants reflect the GPIOs exposed by the OpenTitan SoC.
-static const uint32_t kNumChipGpios = 16;
-// TODO #2484: GPIO pins 16-19 are special inputs - do not touch them.
-static const uint32_t kGpiosAllowedMask = 0xfff0ffff;
-static const uint32_t kChipGpiosMask = 0xffff & kGpiosAllowedMask;
+static const uint32_t kNumChipGpios = 12;
+// TODO: update GPIO test once the chip-level testbench uses the correct pinout.
+static const uint32_t kGpiosAllowedMask = 0xffffffff;
+static const uint32_t kChipGpiosMask = 0xfff & kGpiosAllowedMask;
 
 // These indicate the GPIO pin irq expected to fire, declared volatile since
 // they are used by the ISR.
diff --git a/sw/device/tests/sim_dv/uart_tx_rx_test.c b/sw/device/tests/sim_dv/uart_tx_rx_test.c
index 87a810f..255b215 100644
--- a/sw/device/tests/sim_dv/uart_tx_rx_test.c
+++ b/sw/device/tests/sim_dv/uart_tx_rx_test.c
@@ -535,13 +535,13 @@
 
   LOG_INFO("Test UART%d with base_addr: %08x", kUartIdx, uart_base_addr);
 
-  // TODO, remove thse once pinout configuration is provided
   pinmux_connect_uart_to_pads(
       kTopEarlgreyPinmuxInselIoc3, kTopEarlgreyPinmuxPeripheralInUart0Rx,
       kTopEarlgreyPinmuxMioOutIoc4, kTopEarlgreyPinmuxOutselUart0Tx);
   pinmux_connect_uart_to_pads(
-      kTopEarlgreyPinmuxInselIor5, kTopEarlgreyPinmuxPeripheralInUart1Rx,
-      kTopEarlgreyPinmuxMioOutIor6, kTopEarlgreyPinmuxOutselUart1Tx);
+      kTopEarlgreyPinmuxInselIob4, kTopEarlgreyPinmuxPeripheralInUart1Rx,
+      kTopEarlgreyPinmuxMioOutIob5, kTopEarlgreyPinmuxOutselUart1Tx);
+  // TODO: the UARTs below still need to be mapped to the correct location.
   pinmux_connect_uart_to_pads(
       kTopEarlgreyPinmuxInselIor7, kTopEarlgreyPinmuxPeripheralInUart2Rx,
       kTopEarlgreyPinmuxMioOutIor10, kTopEarlgreyPinmuxOutselUart2Tx);
diff --git a/sw/host/opentitanlib/src/transport/cw310/mod.rs b/sw/host/opentitanlib/src/transport/cw310/mod.rs
index c275118..d5cdbd2 100644
--- a/sw/host/opentitanlib/src/transport/cw310/mod.rs
+++ b/sw/host/opentitanlib/src/transport/cw310/mod.rs
@@ -53,7 +53,6 @@
     const PIN_TAP_STRAP0: &'static str = "USB_A18";
     const PIN_TAP_STRAP1: &'static str = "USB_A19";
 
-
     pub fn new(
         usb_vid: Option<u16>,
         usb_pid: Option<u16>,
@@ -189,9 +188,9 @@
             // Program the FPGA bitstream.
             let usb = self.device.borrow();
             usb.spi1_enable(false)?;
-            usb.pin_set_state(CW310::PIN_TAP_STRAP0, true)?;
-            usb.pin_set_state(CW310::PIN_TAP_STRAP1, true)?;
-            usb.pin_set_state(CW310::PIN_TAP_STRAP2, true)?;
+            usb.pin_set_state(CW310::PIN_SW_STRAP0, true)?;
+            usb.pin_set_state(CW310::PIN_SW_STRAP1, true)?;
+            usb.pin_set_state(CW310::PIN_SW_STRAP2, true)?;
             usb.fpga_program(&fpga_program.bitstream)?;
             Ok(None)
         } else {
diff --git a/sw/host/opentitanlib/src/transport/cw310/spi.rs b/sw/host/opentitanlib/src/transport/cw310/spi.rs
index 15621d9..3bb49bf 100644
--- a/sw/host/opentitanlib/src/transport/cw310/spi.rs
+++ b/sw/host/opentitanlib/src/transport/cw310/spi.rs
@@ -29,7 +29,7 @@
             usb.spi1_enable(true)?;
 
             // Set the JTAG pin to false to use SPI mode.
-            usb.pin_set_state(CW310::PIN_JTAG, false)?;
+            usb.pin_set_state(CW310::PIN_TAP_STRAP1, false)?;
         }
 
         Ok(CW310Spi { device })
diff --git a/util/fpga/cw_spiflash.py b/util/fpga/cw_spiflash.py
index b514564..d1dfa1d 100644
--- a/util/fpga/cw_spiflash.py
+++ b/util/fpga/cw_spiflash.py
@@ -135,25 +135,35 @@
                                            'PIN_CS',
                                            'PIN_TRST',
                                            'PIN_SRST',
-                                           'PIN_JTAG_SPI',
-                                           'PIN_BOOTSTRAP'])
+                                           'PIN_SW_STRAP0',
+                                           'PIN_SW_STRAP1',
+                                           'PIN_SW_STRAP2',
+                                           'PIN_TAP_STRAP0',
+                                           'PIN_TAP_STRAP1'
+                                           ])
     _PIN_MAPPINGS = {}
-    _PIN_MAPPINGS['CW305'] = PinMapping('USB_A13',
+    _PIN_MAPPINGS['CW305'] = PinMapping('USB_A9',
+                                        'USB_A10',
+                                        'USB_A11',
+                                        'USB_A12',
+                                        'USB_A13',
                                         'USB_A14',
                                         'USB_A15',
                                         'USB_A16',
                                         'USB_A17',
                                         'USB_A18',
-                                        'USB_A19',
-                                        'USB_A20')
+                                        'USB_A19')
     _PIN_MAPPINGS['CW310'] = PinMapping('USB_SPI_SCK',
                                         'USB_SPI_COPI',
                                         'USB_SPI_CIPO',
                                         'USB_SPI_CS',
+                                        'USB_A13',
+                                        'USB_A14',
+                                        'USB_A15',
+                                        'USB_A16',
                                         'USB_A17',
                                         'USB_A18',
-                                        'USB_A19',
-                                        'USB_A16')
+                                        'USB_A19')
     _board = 'CW305'
 
     # Delays below are in seconds.
@@ -179,12 +189,18 @@
         self._fpga_io = fpga.gpio_mode()
         self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_TRST)
         self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_SRST)
-        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_JTAG_SPI)
-        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_BOOTSTRAP)
+        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP0)
+        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP1)
+        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP2)
+        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP0)
+        self._fpga_io.pin_set_output(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP1)
         self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_TRST, 1)
         self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SRST, 1)
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_JTAG_SPI, 1)
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_BOOTSTRAP, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP0, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP1, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP2, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP0, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP1, 1)
         # Initialize SPI pins.
         self._fpga_io.spi1_setpins(sck=self._PIN_MAPPINGS[self._board].PIN_SCK,
                                    sdo=self._PIN_MAPPINGS[self._board].PIN_SDI,
@@ -193,7 +209,7 @@
         self._fpga_io.spi1_enable(True)
 
     def _reset_opentitan(self):
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_JTAG_SPI, 1)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP1, 1)
         self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SRST, 0)
         time.sleep(self._BOOTSTRAP_DELAY)
         self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SRST, 1)
@@ -201,16 +217,20 @@
 
     def __enter__(self):
         """Starts bootstrapping."""
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_BOOTSTRAP, 1)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP0, 1)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP1, 1)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP2, 1)
         self._reset_opentitan()
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_JTAG_SPI, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP1, 0)
         time.sleep(self._BOOTSTRAP_DELAY)
         return self
 
     def __exit__(self, exc_type, exc_value, traceback):
         """Ends bootstrapping."""
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_BOOTSTRAP, 0)
-        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_JTAG_SPI, 1)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP0, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP1, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_SW_STRAP2, 0)
+        self._fpga_io.pin_set_state(self._PIN_MAPPINGS[self._board].PIN_TAP_STRAP1, 1)
         time.sleep(self._BOOTSTRAP_DELAY)
 
     def transfer(self, frame):