USB fixups
- Build rules for usbdev tests.
- Fixups for the usbdev libraries and tests to execute on matcha.
- Tweak to the verilator setup, such that VBUS sense is bound to the
correct MIO.
Change-Id: Ieee258399986e106529131c49e11b88f12436ca7
diff --git a/hw/top_matcha/rtl/chip_matcha_verilator.sv b/hw/top_matcha/rtl/chip_matcha_verilator.sv
index d0d5606..279cc22 100644
--- a/hw/top_matcha/rtl/chip_matcha_verilator.sv
+++ b/hw/top_matcha/rtl/chip_matcha_verilator.sv
@@ -123,7 +123,7 @@
mio_in[MioPadIob8:MioPadIoa0] = cio_gpio_p2d_i[17:0];
mio_in[MioPadIob12:MioPadIob10] = cio_gpio_p2d_i[20:18];
mio_in[MioPadIoc6] = cio_gpio_p2d_i[21];
- mio_in[MioPadIoc7] = cio_gpio_p2d_i[25];
+ mio_in[MioPadIoc7] = cio_usbdev_sense_p2d_i;
mio_in[MioPadIoc9] = cio_gpio_p2d_i[26];
mio_in[MioPadIor7:MioPadIor6] = cio_gpio_p2d_i[29:28];
mio_in[MioPadIor10] = cio_gpio_p2d_i[31];
@@ -403,8 +403,6 @@
logic unused_pwr_clamp;
assign unused_pwr_clamp = base_ast_pwr.pwr_clamp;
- logic unused_cio_usbdev_sense_p2d_i;
- assign unused_cio_usbdev_sense_p2d_i = cio_usbdev_sense_p2d_i;
prim_mubi_pkg::mubi4_t ast_init_done;
ast #(
diff --git a/sw/device/lib/dif/BUILD b/sw/device/lib/dif/BUILD
index c907a26..e926379 100644
--- a/sw/device/lib/dif/BUILD
+++ b/sw/device/lib/dif/BUILD
@@ -273,4 +273,25 @@
],
)
+cc_library(
+ name = "usbdev",
+ srcs = [
+ "autogen/dif_usbdev_autogen.c",
+ "autogen/dif_usbdev_autogen.h",
+ "dif_usbdev.c",
+ ],
+ hdrs = [
+ "dif_usbdev.h",
+ ],
+ deps = [
+ "@lowrisc_opentitan//sw/device/lib/dif:base",
+ "@lowrisc_opentitan//hw/ip/usbdev/data:usbdev_regs",
+ "@lowrisc_opentitan//sw/device/lib/base:bitfield",
+ "@lowrisc_opentitan//sw/device/lib/base:macros",
+ "@lowrisc_opentitan//sw/device/lib/base:memory",
+ "@lowrisc_opentitan//sw/device/lib/base:mmio",
+ "@lowrisc_opentitan//sw/device/lib/base:multibits",
+ ],
+)
+
#TODO(b/249392661): Add unit test for each dif component.
diff --git a/sw/device/lib/testing/BUILD b/sw/device/lib/testing/BUILD
index 5f8fd9f..dc8bfdb 100644
--- a/sw/device/lib/testing/BUILD
+++ b/sw/device/lib/testing/BUILD
@@ -96,3 +96,34 @@
"@lowrisc_opentitan//sw/device/lib/testing/test_framework:check",
],
)
+
+cc_library(
+ name = "usb_testutils",
+ srcs = [
+ "usb_testutils.c",
+ "usb_testutils_controlep.c",
+ ],
+ hdrs = [
+ "usb_testutils.h",
+ "usb_testutils_controlep.h",
+ "usb_testutils_diags.h",
+ ],
+ target_compatible_with = [OPENTITAN_CPU],
+ deps = [
+ "//hw/top_matcha/sw/autogen:top_matcha",
+ "//sw/device/lib/dif:usbdev",
+ "@lowrisc_opentitan//sw/device/lib/testing/test_framework:check",
+ ],
+)
+
+cc_library(
+ name = "usb_testutils_simpleserial",
+ srcs = ["usb_testutils_simpleserial.c"],
+ hdrs = ["usb_testutils_simpleserial.h"],
+ target_compatible_with = [OPENTITAN_CPU],
+ deps = [
+ ":usb_testutils",
+ "@lowrisc_opentitan//sw/device/lib/testing/test_framework:check",
+ ],
+)
+
diff --git a/sw/device/lib/testing/usb_testutils.c b/sw/device/lib/testing/usb_testutils.c
index bacc95b..d1e79c0 100644
--- a/sw/device/lib/testing/usb_testutils.c
+++ b/sw/device/lib/testing/usb_testutils.c
@@ -7,9 +7,9 @@
#include "sw/device/lib/dif/dif_usbdev.h"
#include "sw/device/lib/testing/test_framework/check.h"
-#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
+#include "hw/top_matcha/sw/autogen/top_matcha.h"
-#define USBDEV_BASE_ADDR TOP_EARLGREY_USBDEV_BASE_ADDR
+#define USBDEV_BASE_ADDR TOP_MATCHA_USBDEV_BASE_ADDR
static dif_usbdev_t usbdev;
static dif_usbdev_buffer_pool_t buffer_pool;
diff --git a/sw/device/tests/BUILD b/sw/device/tests/BUILD
index cf00c08..69afec9 100644
--- a/sw/device/tests/BUILD
+++ b/sw/device/tests/BUILD
@@ -511,6 +511,44 @@
],
)
+sec_flash_binary(
+ name = "usbdev_test",
+ srcs = [
+ "usbdev_test.c",
+ ],
+ copts = [
+ "-nostdlib",
+ "-ffreestanding",
+ ],
+ deps = [
+ ":test_lib",
+ "//sw/device/lib/testing/test_framework:ottf_main",
+ "//sw/device/lib/dif:usbdev",
+ "//sw/device/lib/testing:usb_testutils",
+ "//sw/device/lib/testing:usb_testutils_simpleserial",
+ "@lowrisc_opentitan//hw/ip/usbdev/data:usbdev_regs",
+ ],
+)
+
+sec_flash_binary(
+ name = "usbdev_stream_test",
+ srcs = [
+ "usbdev_stream_test.c",
+ ],
+ copts = [
+ "-nostdlib",
+ "-ffreestanding",
+ ],
+ deps = [
+ ":test_lib",
+ "//sw/device/lib/testing/test_framework:ottf_main",
+ "//sw/device/lib/dif:usbdev",
+ "//sw/device/lib/testing:usb_testutils",
+ "//sw/device/lib/testing:usb_testutils_simpleserial",
+ "@lowrisc_opentitan//hw/ip/usbdev/data:usbdev_regs",
+ ],
+)
+
cc_library(
name = "test_lib",
target_compatible_with = [OPENTITAN_CPU],
@@ -611,6 +649,18 @@
# To test the following targets:
# bazel test --test_output=streamed --test_tag_filters=verilator,-broken //sw/device/tests/...
matcha_verilator_test(
+ name = "verilator_usbdev_test",
+ timeout = "long",
+ sec_flash_binary = ":usbdev_test",
+)
+
+matcha_verilator_test(
+ name = "verilator_usbdev_stream_test",
+ timeout = "long",
+ sec_flash_binary = ":usbdev_stream_test",
+)
+
+matcha_verilator_test(
name = "verilator_tlul_mailbox_test",
timeout = "long",
sec_flash_binary = ":tlul_mailbox_test",
diff --git a/sw/device/tests/usbdev_stream_test.c b/sw/device/tests/usbdev_stream_test.c
index a119324..0d19c6d 100644
--- a/sw/device/tests/usbdev_stream_test.c
+++ b/sw/device/tests/usbdev_stream_test.c
@@ -26,7 +26,7 @@
#include "sw/device/lib/testing/usb_testutils.h"
#include "sw/device/lib/testing/usb_testutils_controlep.h"
-#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h" // Generated.
+#include "hw/top_matcha/sw/autogen/top_matcha.h" // Generated.
// Maximum number of concurrent streams
#ifdef USBDEV_NUM_ENDPOINTS
@@ -36,13 +36,6 @@
#define STREAMS_MAX 11U
#endif
-// TODO - currently we are unable to send the configuration descriptor
-// if we try to describe more than two bidirectional endpoints
-#if STREAMS_MAX > 2U
-#undef STREAMS_MAX
-#define STREAMS_MAX 2U
-#endif
-
// Number of streams to be tested
#ifndef NUM_STREAMS
#define NUM_STREAMS STREAMS_MAX
@@ -216,15 +209,14 @@
/**
* Configuration values for USB.
- * TODO - dynamically construct a config descriptor appropriate to the test;
- * this would avoid creating unusable ports on the host and also provide
- * a little more testing
*/
static const uint8_t config_descriptors[] = {
USB_CFG_DSCR_HEAD(USB_CFG_DSCR_LEN + STREAMS_MAX * (USB_INTERFACE_DSCR_LEN +
2 * USB_EP_DSCR_LEN),
STREAMS_MAX),
+ // Up to 11 interfaces and STREAMS_MAX in the descriptor head specifies how
+ // many of the interfaces will be declared to the host
VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
USB_BULK_EP_DSCR(0, 1U, USBDEV_MAX_PACKET_SIZE, 0),
USB_BULK_EP_DSCR(1, 1U, USBDEV_MAX_PACKET_SIZE, 0),
@@ -232,6 +224,42 @@
VEND_INTERFACE_DSCR(1, 2, 0x50, 1),
USB_BULK_EP_DSCR(0, 2U, USBDEV_MAX_PACKET_SIZE, 0),
USB_BULK_EP_DSCR(1, 2U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(2, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 3U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 3U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(3, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 4U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 4U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(4, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 5U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 5U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(5, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 6U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 6U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(6, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 7U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 7U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(7, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 8U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 8U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(8, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 9U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 9U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(9, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 10U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 10U, USBDEV_MAX_PACKET_SIZE, 0),
+
+ VEND_INTERFACE_DSCR(10, 2, 0x50, 1),
+ USB_BULK_EP_DSCR(0, 11U, USBDEV_MAX_PACKET_SIZE, 0),
+ USB_BULK_EP_DSCR(1, 11U, USBDEV_MAX_PACKET_SIZE, 0),
};
/**
@@ -414,7 +442,7 @@
}
// Callback for successful buffer transmission
-static void strm_tx_done(void *stream_v) {
+static void strm_tx_done(void *stream_v, usb_testutils_xfr_result_t result) {
usbdev_stream_t *s = (usbdev_stream_t *)stream_v;
usbdev_stream_test_ctx_t *ctx = s->ctx;
usb_testutils_ctx_t *usbdev = ctx->usbdev;
@@ -457,7 +485,6 @@
dif_usbdev_buffer_t buf) {
usbdev_stream_t *s = (usbdev_stream_t *)stream_v;
usbdev_stream_test_ctx_t *ctx = s->ctx;
- usb_testutils_ctx_t *usbdev = ctx->usbdev;
CHECK(packet_info.endpoint == s->rx_ep);
@@ -627,9 +654,9 @@
// Context state for streaming test
usbdev_stream_test_ctx_t *ctx = &stream_test;
- CHECK(kDeviceType == kDeviceSimVerilator || kDeviceType == kDeviceFpgaCw310,
+ CHECK(kDeviceType == kDeviceSimVerilator || kDeviceType == kDeviceFpgaNexus,
"This test is not expected to run on platforms other than the "
- "Verilator simulation or CW310 FPGA. It needs logic on the host side "
+ "Verilator simulation or Nexus FPGA. It needs logic on the host side "
"to retrieve, scramble and return the generated byte stream");
LOG_INFO("Running USBDEV Stream Test");
@@ -646,11 +673,17 @@
LOG_INFO(" - %u stream(s), 0x%x bytes each", nstreams, transfer_bytes);
CHECK_DIF_OK(dif_pinmux_init(
- mmio_region_from_addr(TOP_EARLGREY_PINMUX_AON_BASE_ADDR), &pinmux));
+ mmio_region_from_addr(TOP_MATCHA_PINMUX_AON_BASE_ADDR), &pinmux));
pinmux_testutils_init(&pinmux);
CHECK_DIF_OK(dif_pinmux_input_select(
- &pinmux, kTopEarlgreyPinmuxPeripheralInUsbdevSense,
- kTopEarlgreyPinmuxInselIoc7));
+ &pinmux, kTopMatchaPinmuxPeripheralInUsbdevSense,
+ kTopMatchaPinmuxInselIoc7));
+ if (kDeviceType == kDeviceFpgaNexus) {
+ dif_pinmux_pad_attr_t attrs;
+ CHECK_DIF_OK(dif_pinmux_pad_get_attrs(&pinmux, kTopMatchaMuxedPadsIoc7, kDifPinmuxPadKindMio, &attrs));
+ attrs.flags |= kDifPinmuxPadAttrInvertLevel;
+ CHECK_DIF_OK(dif_pinmux_pad_write_attrs(&pinmux, kTopMatchaMuxedPadsIoc7, kDifPinmuxPadKindMio, attrs, &attrs));
+ }
// Remember context state for usb_testutils context
ctx->usbdev = &usbdev;
@@ -658,7 +691,7 @@
// Call `usbdev_init` here so that DPI will not start until the
// simulation has finished all of the printing, which takes a while
// if `--trace` was passed in.
- usb_testutils_init(ctx->usbdev, /*pinflip=*/false, /*en_diff_rcvr=*/false,
+ usb_testutils_init(&usbdev, /*pinflip=*/false, /*en_diff_rcvr=*/kDeviceType == kDeviceSimVerilator ? false : true,
/*tx_use_d_se0=*/false);
usb_testutils_controlep_init(&usbdev_control, ctx->usbdev, 0,
config_descriptors, sizeof(config_descriptors),
diff --git a/sw/device/tests/usbdev_test.c b/sw/device/tests/usbdev_test.c
index af52cf5..482c207 100644
--- a/sw/device/tests/usbdev_test.c
+++ b/sw/device/tests/usbdev_test.c
@@ -27,7 +27,7 @@
#include "sw/device/lib/testing/usb_testutils_controlep.h"
#include "sw/device/lib/testing/usb_testutils_simpleserial.h"
-#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h" // Generated.
+#include "hw/top_matcha/sw/autogen/top_matcha.h" // Generated.
/**
* Configuration values for USB.
@@ -97,24 +97,30 @@
OTTF_DEFINE_TEST_CONFIG();
bool test_main(void) {
- CHECK(kDeviceType == kDeviceSimVerilator || kDeviceType == kDeviceFpgaCw310,
+ CHECK(kDeviceType == kDeviceSimVerilator || kDeviceType == kDeviceFpgaNexus,
"This test is not expected to run on platforms other than the "
- "Verilator simulation or CW310 FPGA. It needs the USB DPI model "
+ "Verilator simulation or Nexus FPGA. It needs the USB DPI model "
"or host application.");
LOG_INFO("Running USBDEV test");
CHECK_DIF_OK(dif_pinmux_init(
- mmio_region_from_addr(TOP_EARLGREY_PINMUX_AON_BASE_ADDR), &pinmux));
+ mmio_region_from_addr(TOP_MATCHA_PINMUX_AON_BASE_ADDR), &pinmux));
pinmux_testutils_init(&pinmux);
CHECK_DIF_OK(dif_pinmux_input_select(
- &pinmux, kTopEarlgreyPinmuxPeripheralInUsbdevSense,
- kTopEarlgreyPinmuxInselIoc7));
+ &pinmux, kTopMatchaPinmuxPeripheralInUsbdevSense,
+ kTopMatchaPinmuxInselIoc7));
+ if (kDeviceType == kDeviceFpgaNexus) {
+ dif_pinmux_pad_attr_t attrs;
+ CHECK_DIF_OK(dif_pinmux_pad_get_attrs(&pinmux, kTopMatchaMuxedPadsIoc7, kDifPinmuxPadKindMio, &attrs));
+ attrs.flags |= kDifPinmuxPadAttrInvertLevel;
+ CHECK_DIF_OK(dif_pinmux_pad_write_attrs(&pinmux, kTopMatchaMuxedPadsIoc7, kDifPinmuxPadKindMio, attrs, &attrs));
+ }
// Call `usbdev_init` here so that DPI will not start until the
// simulation has finished all of the printing, which takes a while
// if `--trace` was passed in.
- usb_testutils_init(&usbdev, /*pinflip=*/false, /*en_diff_rcvr=*/false,
+ usb_testutils_init(&usbdev, /*pinflip=*/false, /*en_diff_rcvr=*/kDeviceType == kDeviceSimVerilator ? false : true,
/*tx_use_d_se0=*/false);
usb_testutils_controlep_init(&usbdev_control, &usbdev, 0, config_descriptors,
sizeof(config_descriptors), test_descriptor,