From 3c1e435e048e01f7f28ede00ffa4b596f8123141 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sat, 24 Feb 2024 14:31:14 -0800 Subject: [PATCH] [Voyageurs] Move NormalTrb generation into helper func. --- sys/voyageurs/xhci/endpoint.cpp | 16 ++++------------ sys/voyageurs/xhci/trb.cpp | 12 ++++++++++++ sys/voyageurs/xhci/trb.h | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/sys/voyageurs/xhci/endpoint.cpp b/sys/voyageurs/xhci/endpoint.cpp index b08d6ed..3cfb568 100644 --- a/sys/voyageurs/xhci/endpoint.cpp +++ b/sys/voyageurs/xhci/endpoint.cpp @@ -2,6 +2,8 @@ #include +#include "xhci/trb.h" + void Endpoint::Initialize(XhciEndpointContext* context) { enabled_ = true; context_ = context; @@ -13,12 +15,7 @@ void Endpoint::Initialize(XhciEndpointContext* context) { context_->error_and_type = (0x3 << 1) | (0x7 << 3) | (0x8 << 16); for (uint64_t i = 0; i < 10; i++) { - trb_ring_->EnqueueTrb({ - .parameter = recv_phys_ + offset_, - .status = 8, - .type_and_cycle = 1 | (1 << 2) | (1 << 5) | (1 << 10), - .control = 0, - }); + trb_ring_->EnqueueTrb(CreateNormalTrb(recv_phys_ + offset_, 8)); offset_ += 8; } } @@ -27,11 +24,6 @@ void Endpoint::TransferComplete(uint64_t trb_phys) { uint64_t phys_offset = (trb_phys - trb_ring_->PhysicalAddress()) / sizeof(XhciTrb); dbgln("Data: {x}", *((uint64_t*)recv_mem_.vaddr() + phys_offset)); - trb_ring_->EnqueueTrb({ - .parameter = recv_phys_ + offset_, - .status = 8, - .type_and_cycle = 1 | (1 << 2) | (1 << 5) | (1 << 10), - .control = 0, - }); + trb_ring_->EnqueueTrb(CreateNormalTrb(recv_phys_ + offset_, 8)); offset_ += 8; } diff --git a/sys/voyageurs/xhci/trb.cpp b/sys/voyageurs/xhci/trb.cpp index 039ac2f..7fca204 100644 --- a/sys/voyageurs/xhci/trb.cpp +++ b/sys/voyageurs/xhci/trb.cpp @@ -4,6 +4,8 @@ constexpr uint8_t kTrb_TypeOffset = 10; constexpr uint16_t kTrb_Cycle = 1; constexpr uint16_t kTrb_ToggleCycle = (1 << 1); +constexpr uint16_t kTrb_InterruptShortPacket = (1 << 2); +constexpr uint16_t kTrb_Interrupt = (1 << 5); constexpr uint16_t kTrb_BSR = (1 << 9); namespace { @@ -18,6 +20,16 @@ TrbType GetType(const XhciTrb& trb) { return TrbType(trb.type_and_cycle >> kTrb_TypeOffset); } +XhciTrb CreateNormalTrb(uint64_t physical_address, uint8_t size) { + return { + .parameter = physical_address, + .status = size, + .type_and_cycle = (uint16_t)(TypeToInt(TrbType::Normal) | kTrb_Cycle | + kTrb_Interrupt | kTrb_InterruptShortPacket), + .control = 0, + }; +} + XhciTrb CreateLinkTrb(uint64_t physical_address) { return { .parameter = physical_address, diff --git a/sys/voyageurs/xhci/trb.h b/sys/voyageurs/xhci/trb.h index 9fbba5a..f7fee03 100644 --- a/sys/voyageurs/xhci/trb.h +++ b/sys/voyageurs/xhci/trb.h @@ -29,6 +29,7 @@ enum class TrbType : uint8_t { TrbType GetType(const XhciTrb& trb); +XhciTrb CreateNormalTrb(uint64_t physical_address, uint8_t size); XhciTrb CreateLinkTrb(uint64_t physical_address); XhciTrb CreateEnableSlotTrb();