Skip to content

Commit

Permalink
Update USBDev utils, tests & PLIC tests for refactored driver
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexJones0 committed Nov 6, 2024
1 parent 1637458 commit 0a29aeb
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 46 deletions.
8 changes: 4 additions & 4 deletions sw/cheri/checks/usbdev_check.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ static void write_strn(UartPtr uart, const char *str, size_t len) {
static const uint8_t _Alignas(uint32_t) signon[] = "Hello from CHERI USB!\r\n";

// Device Descriptor; see "Table 9-8. Standard Device Descriptor"
static const uint8_t _Alignas(uint32_t) dev_dscr[] = {0x12u, 1, 0, 2, 0, 0, 0, OpenTitanUsbdev::MaxPacketLen,
static const uint8_t _Alignas(uint32_t) dev_dscr[] = {0x12u, 1, 0, 2, 0, 0, 0, OpenTitanUsbdev::MaxPacketLength,
0xd1, 0x18, 0x3a, 0x50, // Google lowRISC generic FS USB
0, 1, 0, 0, 0, 1};

Expand All @@ -49,8 +49,8 @@ static const uint8_t _Alignas(uint32_t) cfg_dscr[] = {
// Present a single interface consisting of an IN EP and and OUT EP.
USB_CFG_DSCR_HEAD(USB_CFG_DSCR_LEN + (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN), 1),
VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
USB_BULK_EP_DSCR(0, 1, OpenTitanUsbdev::MaxPacketLen, 0),
USB_BULK_EP_DSCR(1, 1, OpenTitanUsbdev::MaxPacketLen, 4),
USB_BULK_EP_DSCR(0, 1, OpenTitanUsbdev::MaxPacketLength, 0),
USB_BULK_EP_DSCR(1, 1, OpenTitanUsbdev::MaxPacketLength, 4),
};

// Default test descriptor; required by the USB DPI model and retrieved using a Vendor Specific
Expand All @@ -67,7 +67,7 @@ static void rxCallback(void *rxHandle, uint8_t ep, bool setup, const uint8_t *da

[[noreturn]] extern "C" void entry_point(void *rwRoot) {
// Buffer for data transfer to/from the USB device.
// uint8_t _Alignas(uint32_t) data[OpenTitanUsbdev::MaxPacketLen];
// uint8_t _Alignas(uint32_t) data[OpenTitanUsbdev::MaxPacketLength];

Capability<void> root{rwRoot};

Expand Down
30 changes: 15 additions & 15 deletions sw/cheri/common/usbdev-utils.hh
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class UsbdevUtils {
cfgLen(cfg_len),
testDscr(test),
testLen(test_len),
bufAvail(((uint64_t)1u << OpenTitanUsbdev::NumBuffers) - 1u) {
bufAvail(((uint64_t)1u << OpenTitanUsbdev::BufferCount) - 1u) {
// Initialise the device and track which packet buffers are still available for use.
int rc = usbdev->init(bufAvail);
assert(!rc);
Expand Down Expand Up @@ -180,7 +180,7 @@ class UsbdevUtils {
/// Allocate a buffer.
bool buf_alloc(uint8_t &bufNum) {
if (bufAvail) {
for (bufNum = 0U; bufNum < OpenTitanUsbdev::NumBuffers; ++bufNum) {
for (bufNum = 0U; bufNum < OpenTitanUsbdev::BufferCount; ++bufNum) {
if (1U & (bufAvail >> bufNum)) {
bufAvail &= ~((uint64_t)1U << bufNum);
return true;
Expand Down Expand Up @@ -237,9 +237,9 @@ class UsbdevUtils {
/// Send a packet of data over the USB to the host controller.
bool send_data(uint8_t ep, const uint32_t *data, uint16_t pktLen) {
uint8_t bufNum;
assert(pktLen <= OpenTitanUsbdev::MaxPacketLen);
assert(pktLen <= OpenTitanUsbdev::MaxPacketLength);
if (!buf_alloc(bufNum)) return false;
if (usbdev->send_packet(bufNum, ep, data, (uint8_t)pktLen)) {
if (usbdev->packet_send(bufNum, ep, data, (uint8_t)pktLen)) {
buf_release(bufNum);
return false;
}
Expand All @@ -253,15 +253,15 @@ class UsbdevUtils {
// controller; this must be done promptly not just for performance reasons but also to ensure
// that IN Control Transfers conclude their Data Stage before the Status Stage commences.
uint8_t ep, bufNum;
int rc = usbdev->packet_collected(ep, bufNum);
int rc = usbdev->retrieve_collected_packet(ep, bufNum);
while (!rc) {
// Release the buffer for reuse.
buf_release(bufNum);
if (epInCtx[ep].txDoneCallback) {
// Invoke the 'done' handler for this IN endpoint.
epInCtx[ep].txDoneCallback(epInCtx[ep].txDoneHandle, rc);
}
rc = usbdev->packet_collected(ep, bufNum);
rc = usbdev->retrieve_collected_packet(ep, bufNum);
}

// Ensure that the packet reception FIFOs remains supplied with buffers.
Expand All @@ -270,15 +270,15 @@ class UsbdevUtils {
// Process received packets.
uint16_t pktLen;
bool isSetup;
rc = usbdev->recv_packet(ep, bufNum, pktLen, isSetup, packetData);
rc = usbdev->packet_receive(bufNum, ep, pktLen, isSetup, packetData);
while (!rc) {
// Release the buffer for reuse.
buf_release(bufNum);
if (epOutCtx[ep].recvCallback) {
const uint8_t *pktData = reinterpret_cast<uint8_t *>(packetData);
epOutCtx[ep].recvCallback(epOutCtx[ep].recvHandle, ep, isSetup, pktData, pktLen);
}
rc = usbdev->recv_packet(ep, bufNum, pktLen, isSetup, packetData);
rc = usbdev->packet_receive(bufNum, ep, pktLen, isSetup, packetData);
}
}

Expand Down Expand Up @@ -315,22 +315,22 @@ class UsbdevUtils {
switch (data[3]) {
case kUsbDescTypeDevice:
if (wLen > devLen) wLen = devLen;
rc = usbdev->send_packet(bufNum, 0u, (uint32_t *)devDscr, (uint8_t)wLen);
rc = usbdev->packet_send(bufNum, 0u, (uint32_t *)devDscr, (uint8_t)wLen);
assert(!rc);
ctrlState = Ctrl_StatusGetDesc;
release = false;
break;

case kUsbDescTypeConfiguration:
if (wLen > cfgLen) wLen = cfgLen;
rc = usbdev->send_packet(bufNum, 0u, (uint32_t *)cfgDscr, (uint8_t)wLen);
rc = usbdev->packet_send(bufNum, 0u, (uint32_t *)cfgDscr, (uint8_t)wLen);
assert(!rc);
ctrlState = Ctrl_StatusGetDesc;
release = false;
break;

default:
rc = usbdev->set_ep_stalling(0u, true);
rc = usbdev->set_endpoint_stalling(0u, true);
assert(!rc);
break;
}
Expand All @@ -340,15 +340,15 @@ class UsbdevUtils {
case kUsbSetupReqSetAddress:
devAddr = (uint8_t)wValue;
// Send a Zero Length Packet as ACK.
rc = usbdev->send_packet(bufNum, 0u, nullptr, 0u);
rc = usbdev->packet_send(bufNum, 0u, nullptr, 0u);
assert(!rc);
ctrlState = Ctrl_StatusSetAddr;
release = false;
break;

// SET_CONFIGURATION request.
case kUsbSetupReqSetConfiguration:
rc = usbdev->send_packet(bufNum, 0u, nullptr, 0u); // ZLP ACK.
rc = usbdev->packet_send(bufNum, 0u, nullptr, 0u); // ZLP ACK.
assert(!rc);
ctrlState = Ctrl_StatusSetConfig;
release = false;
Expand All @@ -358,7 +358,7 @@ class UsbdevUtils {
// configuration.
case kVendorSetupReqTestConfig:
if (wLen > testLen) wLen = testLen;
rc = usbdev->send_packet(bufNum, 0u, (uint32_t *)testDscr, (uint8_t)wLen);
rc = usbdev->packet_send(bufNum, 0u, (uint32_t *)testDscr, (uint8_t)wLen);
assert(!rc);
ctrlState = Ctrl_StatusGetDesc;
release = false;
Expand Down Expand Up @@ -444,5 +444,5 @@ class UsbdevUtils {
} epOutCtx[OpenTitanUsbdev::MaxEndpoints];

// Buffer for received packet data.
uint32_t packetData[OpenTitanUsbdev::MaxPacketLen >> 2];
uint32_t packetData[OpenTitanUsbdev::MaxPacketLength >> 2];
};
48 changes: 24 additions & 24 deletions sw/cheri/tests/plic_tests.hh
Original file line number Diff line number Diff line change
Expand Up @@ -248,44 +248,44 @@ struct PlicTest {
instance = 0;

struct usbdev_irq {
OpenTitanUsbdev::OpenTitanUsbdevInterrupt id;
OpenTitanUsbdev::UsbdevInterrupt id;
bool can_clear;
};
static constexpr std::array<usbdev_irq, 18> usbdevMap = {{
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptDisconnected, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptHostLost, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptLinkReset, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptLinkSuspend, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptLinkResume, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptAvBufferOverflow, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptLinkInError, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptCrcError, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptPidError, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptBitstuffError, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptFrame, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptPowered, true},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptLinkOutError, true},

{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptPacketReceived, false},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptPacketSent, false},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptRecvFifoFull, false},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptAvOutBufferEmpty, false},
{OpenTitanUsbdev::OpenTitanUsbdevInterrupt::InterruptAvSetupBufferEmpty, false},
{OpenTitanUsbdev::UsbdevInterrupt::Disconnected, true},
{OpenTitanUsbdev::UsbdevInterrupt::HostLost, true},
{OpenTitanUsbdev::UsbdevInterrupt::LinkReset, true},
{OpenTitanUsbdev::UsbdevInterrupt::LinkSuspend, true},
{OpenTitanUsbdev::UsbdevInterrupt::LinkResume, true},
{OpenTitanUsbdev::UsbdevInterrupt::AvailableBufferOverflow, true},
{OpenTitanUsbdev::UsbdevInterrupt::LinkInError, true},
{OpenTitanUsbdev::UsbdevInterrupt::RedundancyCheckError, true},
{OpenTitanUsbdev::UsbdevInterrupt::PacketIdentifierError, true},
{OpenTitanUsbdev::UsbdevInterrupt::BitstuffingError, true},
{OpenTitanUsbdev::UsbdevInterrupt::FrameUpdated, true},
{OpenTitanUsbdev::UsbdevInterrupt::Powered, true},
{OpenTitanUsbdev::UsbdevInterrupt::LinkOutError, true},

{OpenTitanUsbdev::UsbdevInterrupt::PacketReceived, false},
{OpenTitanUsbdev::UsbdevInterrupt::PacketSent, false},
{OpenTitanUsbdev::UsbdevInterrupt::ReceiveFull, false},
{OpenTitanUsbdev::UsbdevInterrupt::AvailableOutEmpty, false},
{OpenTitanUsbdev::UsbdevInterrupt::AvailableSetupEmpty, false},
}};

auto usbdev = usbdev_ptr(root);

// Ensure that initially all interrupts are cleared and disabled.
usbdev->interrupt_disable(static_cast<OpenTitanUsbdev::OpenTitanUsbdevInterrupt>(~0u));
usbdev->interrupt_disable(static_cast<OpenTitanUsbdev::UsbdevInterrupt>(~0u));
usbdev->interruptState = ~0u;
usbdev->interruptTest = 0u;

log_->println(" Testing USBDEV:");
for (size_t i = 0; i < usbdevMap.size(); ++i) {
ip_irq_id = usbdevMap[i].id;
ip_irq_id = static_cast<uint32_t>(usbdevMap[i].id);
is_irq_clearable = usbdevMap[i].can_clear;
plic_irq_id = static_cast<PLIC::Interrupts>(PLIC::Interrupts::Usbdev + instance);
exp_intr_state = usbdevMap[i].id;
exp_intr_state = static_cast<uint32_t>(usbdevMap[i].id);

// Register interrupt handler.
irq_handler = [](PlicTest *plic_test, PLIC::Interrupts irq) {
Expand Down Expand Up @@ -314,7 +314,7 @@ struct PlicTest {
usbdev->interruptTest = 0;
}
// Disable interrupt to prevent interference with other tests.
usbdev->interrupt_disable(static_cast<OpenTitanUsbdev::OpenTitanUsbdevInterrupt>(ip_irq_id));
usbdev->interrupt_disable(static_cast<OpenTitanUsbdev::UsbdevInterrupt>(plic_test->ip_irq_id));
}

// Wait with timeout until an interrupt occurs, logging any mismatch.
Expand Down
6 changes: 3 additions & 3 deletions sw/cheri/tests/usbdev_tests.hh
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ using namespace CHERI;

// Device Descriptor; see "Table 9-8. Standard Device Descriptor"
static const uint8_t _Alignas(uint32_t) deviceDescriptor[] = {
0x12u, 1, 0, 2, 0, 0, 0, OpenTitanUsbdev::MaxPacketLen, 0xd1, 0x18, 0x3a, 0x50, 0, 1, 0, 0, 0, 1};
0x12u, 1, 0, 2, 0, 0, 0, OpenTitanUsbdev::MaxPacketLength, 0xd1, 0x18, 0x3a, 0x50, 0, 1, 0, 0, 0, 1};

// Configuration Descriptor; see "Table 9-10. Standard Configuration Descriptor"
static const uint8_t _Alignas(uint32_t) configDescriptor[] = {
// Present a single interface consisting of an IN EP and and OUT EP.
USB_CFG_DSCR_HEAD(USB_CFG_DSCR_LEN + (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN), 1),
VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
USB_BULK_EP_DSCR(0, 1, OpenTitanUsbdev::MaxPacketLen, 0),
USB_BULK_EP_DSCR(1, 1, OpenTitanUsbdev::MaxPacketLen, 4),
USB_BULK_EP_DSCR(0, 1, OpenTitanUsbdev::MaxPacketLength, 0),
USB_BULK_EP_DSCR(1, 1, OpenTitanUsbdev::MaxPacketLength, 4),
};

// Default test descriptor; required by the USB DPI model and retrieved using a
Expand Down

0 comments on commit 0a29aeb

Please sign in to comment.