The Pedigree Project 0.1
Classes | Public Member Functions | Protected Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
Xhci Class Reference
+ Inheritance diagram for Xhci:
+ Collaboration diagram for Xhci:

Classes

struct  Delivery
 
struct  Endpoint
 
struct  Port
 
struct  Slot
 
struct  Transaction
 

Public Member Functions

 Xhci (Device *device)
 
bool initialiseController ()
 
void getName (String &name) override
 
bool controllerAssignsAddresses () const override
 
bool supportsHubDevices () const override
 
bool prepareDevice (uint8_t address, const UsbEndpoint &endpoint) override
 
bool addressDevice (uint8_t address, const UsbEndpoint &endpoint) override
 
bool resetEndpoint (const UsbEndpoint &endpoint) override
 
uintptr_t createTransaction (UsbEndpoint endpoint) override
 Creates a new transaction with the given endpoint data.
 
void addTransferToTransaction (uintptr_t transaction, bool toggle, UsbPid pid, uintptr_t buffer, size_t bytes) override
 Adds a new transfer to an existent transaction.
 
bool doAsync (uintptr_t transaction, void(*callback)(uintptr_t, ssize_t)=nullptr, uintptr_t parameter=0) override
 
void cancelAsyncAndDrain (uintptr_t transaction, void(*callback)(uintptr_t, ssize_t), uintptr_t parameter) override
 
bool addInterruptInHandler (UsbEndpoint endpoint, uintptr_t buffer, uint16_t bytes, void(*callback)(uintptr_t, ssize_t), UsbInterruptInHandle &handle, uintptr_t parameter=0) override
 Adds an owned recurring interrupt-IN transaction.
 
bool portReset (uint8_t port, bool errorResponse=false) override
 Gets a UsbDevice from a given vendor:product pair.
 
IrqDisposition irq (irq_id_t) override
 
- Public Member Functions inherited from UsbHub
 UsbHub (Device *p)
 
RootConnection rootConnectionForChild (uint8_t childPort) const
 
virtual Type getType ()
 
bool deviceConnected (uint8_t nPort, UsbSpeed speed)
 Called when a device is connected to a port on the hub.
 
void deviceDisconnected (uint8_t nPort)
 Called when a device is disconnected from a port on the hub.
 
ssize_t doSync (uintptr_t nTransaction, uint32_t timeout=5000)
 
- Public Member Functions inherited from Device
 Device (Device *p)
 
DevicegetParent () const
 
void setParent (Device *p)
 
virtual const StringgetSpecificType ()
 
virtual void setSpecificType (String str)
 
void setPciPosition (uint32_t bus, uint32_t device, uint32_t func)
 
void setPciIdentifiers (uint8_t classCode, uint8_t subclassCode, uint16_t vendorId, uint16_t deviceId, uint8_t progIf)
 
void setPciConfigHeader (const PciBus::ConfigSpace &space)
 
PciBus::ConfigSpace getPciConfigHeader () const
 
uint8_t getPciClassCode ()
 
uint8_t getPciSubclassCode ()
 
uint16_t getPciVendorId ()
 
uint16_t getPciDeviceId ()
 
uint8_t getPciProgInterface ()
 
uint32_t getPciBusPosition ()
 
uint32_t getPciDevicePosition ()
 
uint32_t getPciFunctionNumber ()
 
virtual void dump (String &str)
 
virtual Vector< Address * > & addresses ()
 
virtual uintptr_t getInterruptNumber ()
 
virtual void setInterruptNumber (uintptr_t n)
 
void addChild (Device *pDevice)
 
DevicegetChild (size_t n)
 
size_t getNumChildren ()
 
void removeChild (size_t n)
 
void removeChild (Device *d)
 
void replaceChild (Device *src, Device *dest)
 
- Public Member Functions inherited from RequestQueue
 RequestQueue (const String &name)
 
virtual void initialise ()
 
virtual void destroy ()
 
MUST_USE_RESULT uint64_t addRequest (size_t priority, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
MUST_USE_RESULT uint64_t addRequest (size_t priority, ActionOnDuplicate action, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
uint64_t addAsyncRequest (size_t priority, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
bool canWaitForCompletion ()
 
MUST_USE_RESULT bool waitForPreallocated (PreallocatedRequest &request)
 
MUST_USE_RESULT PreallocatedPublishResult publishPreallocated (PreallocatedRequest &request, size_t priority, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
MUST_USE_RESULT PreallocatedPublishResult republishPreallocatedWhileReleasing (PreallocatedRequest &request, size_t priority, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
MUST_USE_RESULT bool halt ()
 
MUST_USE_RESULT bool resume ()
 
LifecycleState getLifecycleState ()
 
bool drain ()
 

Protected Member Functions

void releaseDeviceAddress (uint8_t address) override
 
bool cancelInterruptInAndDrain (const UsbInterruptInToken &, void(*)(uintptr_t, ssize_t), uintptr_t, bool producerAlreadyStopped) override
 
bool inInterruptCallbackContext () const override
 
size_t currentRootPortGeneration (size_t port) const override
 
void replaySuppressedConnectionChange (size_t port) override
 
uint64_t executeRequest (uint64_t port, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t generation) override
 
void cancelRequest (const Request &request) override
 
- Protected Member Functions inherited from UsbHub
virtual bool beginStartupActivity ()
 
virtual void endStartupActivity (UsbStartup::Outcome)
 
MUST_USE_RESULT bool publishInterruptInHandle (UsbInterruptInHandle &handle, const UsbInterruptInToken &token, void(*callback)(uintptr_t, ssize_t), uintptr_t parameter)
 
void disconnectAllDevices ()
 
void retainDisconnectedAddressesUntilControllerTeardown ()
 
void attachToUpstreamHub (UsbHub *upstream, const RootConnection &connection)
 
UsbHubrootHub () const
 
MUST_USE_RESULT bool suppressConnectionChanges (size_t port, ConnectionChangeSuppression &suppression)
 
MUST_USE_RESULT bool deferConnectionChangeIfSuppressed (size_t port)
 
- Protected Member Functions inherited from Device
 NOT_COPYABLE_OR_ASSIGNABLE (Device)
 
- Protected Member Functions inherited from IrqHandler
virtual ~IrqHandler ()
 
- Protected Member Functions inherited from IrqHandlerBase
virtual ~IrqHandlerBase ()
 
- Protected Member Functions inherited from RequestQueue
virtual bool workerPlacement (ThreadPlacement &) const
 
 RequestQueue (const RequestQueue &)
 
void operator= (const RequestQueue &)
 
virtual bool compareRequests (const Request &a, const Request &b)
 
int work ()
 
NextRequestResult getNextRequest (Request *&request)
 
bool drainIntakeLocked (size_t priority)
 
void publishRequest (Request *request)
 
RequestfindDuplicate (const Request &request)
 
void discardRequest (Request *request)
 
uint64_t addAsyncRequestInternal (size_t priority, uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4, uint64_t p5, uint64_t p6, uint64_t p7, uint64_t p8)
 
PreallocatedPublishResult publishPreallocatedRequest (PreallocatedRequest &request, PreallocatedRequest::State availableState, size_t priority, uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4, uint64_t p5, uint64_t p6, uint64_t p7, uint64_t p8)
 
void releasePreallocatedRequest (Request *request)
 
void invokeCancelRequest (const Request &request)
 
bool callbackActiveOnCurrentThread () const
 
void releaseRequest (Request *request)
 
uint64_t waitForRequest (Request *request)
 
bool startWorker ()
 
bool stopWorker ()
 
void closePreallocatedAdmission ()
 
void waitForPreallocatedPublishers ()
 

Private Member Functions

uint32_t read (size_t offset) const
 
void write (size_t offset, uint32_t value)
 
void write64 (size_t offset, uint64_t value)
 
bool wait (size_t offset, uint32_t mask, uint32_t expected, size_t milliseconds)
 
bool parseCapabilities (uint32_t hcc)
 
bool command (XhciHw::Trb trb, uint8_t *returnedSlot=nullptr)
 
bool collectEventsLocked (bool fromInterrupt)
 
bool transferEventLocked (const XhciHw::Trb &event)
 
void notifyPortLocked (size_t port)
 
bool halt ()
 
void failLocked ()
 
void shutdown ()
 
EndpointensureEndpoint (uint8_t slot, const UsbEndpoint &description)
 
uint8_t findSlot (const UsbEndpoint &endpoint) const
 
uint32_t * inputContext (size_t index)
 
uint32_t * outputContext (uint8_t slot, size_t index)
 
bool resetEndpointHardware (uint8_t slot, uint8_t dci, bool stop)
 
bool submitLocked (Transaction &transaction)
 
bool accept (uintptr_t transaction, void(*callback)(uintptr_t, ssize_t), uintptr_t parameter, UsbInterruptInHandle *handle)
 
void finishLocked (Transaction &transaction, ssize_t result, bool natural)
 
void enqueueDeliveryLocked (UsbHcd::CallbackDeliveryQueue::Record *delivery)
 
void freeTransactionLocked (uintptr_t transaction)
 
void cancelTransfer (uintptr_t transaction, size_t generation, bool recurring, void(*callback)(uintptr_t, ssize_t), uintptr_t parameter)
 

Static Private Member Functions

static bool decodeCompletion (Transaction &, size_t index, uint8_t code, size_t residual, bool &complete, size_t &actual)
 
static bool completionRegressions ()
 
static void afterDelivery (void *context)
 
static void destroyDelivery (void *context)
 
static int deliveryWorker (void *context)
 

Private Attributes

Devicem_Pci
 
IoBasem_Registers = nullptr
 
size_t m_Op = 0
 
size_t m_Runtime = 0
 
size_t m_Doorbells = 0
 
size_t m_ContextSize = 32
 
size_t m_PortCount = 0
 
size_t m_SlotCount = 0
 
irq_id_t m_Irq = 0
 
bool m_HardwareOwned = false
 
Atomic< bool > m_Online {false}
 
Atomic< bool > m_Stopping {false}
 
Atomic< bool > m_Failed {false}
 
Atomic< bool > m_PortsClosing {false}
 
bool m_Shutdown = false
 
bool m_DeliveryStopping = false
 
bool m_PolledInterrupt = false
 
bool m_ObservedInterruptCompletion = false
 
Mutex m_Lock
 
Mutex m_CommandLock
 
Mutex m_ConfigurationLock
 
Mutex m_CancelLock
 
OperationBarrier m_Submissions
 
OperationBarrier m_Cancellations
 
OperationBarrier m_Transfers
 
XhciHw::Ring m_Commands
 
MemoryRegion m_Events
 
MemoryRegion m_Erst
 
MemoryRegion m_Dcbaa
 
MemoryRegion m_Input
 
MemoryRegion m_ScratchPointers
 
MemoryRegionm_Scratch [32] {}
 
size_t m_EventHead = 0
 
size_t m_EventWraps = 0
 
bool m_EventCycle = true
 
uint64_t m_CommandAddress = 0
 
uint8_t m_CommandCode = 0
 
uint8_t m_CommandSlot = 0
 
Semaphore m_CommandDone {0, false}
 
Slot m_Slots [XhciHw::MaxSlots+1]
 
uint8_t m_Addresses [128] {}
 
uint8_t m_PortSlots [XhciHw::MaxPorts] {}
 
Port m_Ports [XhciHw::MaxPorts]
 
UsbHcd::PortChangeRequest m_PortChanges [XhciHw::MaxPorts]
 
Transactionm_Transactions [XhciHw::MaxTransactions] {}
 
UsbHcd::CallbackDeliveryQueue m_Deliveries
 
List< UsbHcd::CallbackDeliveryQueue::Record * > m_ReadyDeliveries
 
Semaphore m_DeliveryReady {0, false}
 
Threadm_DeliveryThread = nullptr
 

Additional Inherited Members

- Public Types inherited from Device
enum  Type {
  Generic , Root , Disk , Bus ,
  Display , Network , Sound , Console ,
  Mouse , Controller , UsbController , UsbGeneric ,
  UsbContainer
}
 
typedef Device *(* Callback) (Device *)
 
- Public Types inherited from RequestQueue
enum class  OverrunStatus { Clear , Armed , Stalled , Overloaded }
 
enum class  PreallocatedPublishResult {
  Accepted , TokenBusy , QueueStopped , QueueFull ,
  InvalidPriority
}
 
enum  ActionOnDuplicate { Block , NewRequest , ReturnImmediately }
 
enum class  LifecycleState { Stopped , Accepting , Stopping , Destroyed }
 
- Static Public Member Functions inherited from Device
static void foreach (Callback callback, Device *root=0)
 
template<class F , class... Args>
static void foreach (pedigree_std::Callable< F > &callback, Device *root, Args... args)
 
static void addToRoot (Device *device)
 
static void searchByVendorId (uint16_t vendorId, void(*callback)(Device *), Device *root=0)
 
static void searchByVendorIdAndDeviceId (uint16_t vendorId, uint16_t deviceId, void(*callback)(Device *), Device *root=0)
 
static void searchByClass (uint16_t classCode, void(*callback)(Device *), Device *root=0)
 
static void searchByClassAndSubclass (uint16_t classCode, uint16_t subclassCode, void(*callback)(Device *), Device *root=0)
 
static void searchByClassSubclassAndProgInterface (uint16_t classCode, uint16_t subclassCode, uint8_t progInterface, void(*callback)(Device *), Device *root=0)
 
- Protected Types inherited from RequestQueue
enum class  NextRequestResult { Item , Empty , Retry }
 
- Static Protected Member Functions inherited from Device
static Deviceroot ()
 
- Static Protected Member Functions inherited from RequestQueue
static int trampoline (void *p)
 
static void completeRequest (Request *request, uint64_t returnValue, bool rejected)
 
static void retainRequest (Request *request)
 
- Protected Attributes inherited from Device
Vector< Address * > m_Addresses
 
Vector< Device * > m_Children
 
Devicem_pParent
 
uintptr_t m_InterruptNumber
 
String m_SpecificType
 
PciBus::ConfigSpace m_ConfigHeader
 
uint8_t m_ClassCode
 
uint8_t m_SubclassCode
 
uint16_t m_VendorId
 
uint16_t m_DeviceId
 
uint8_t m_ProgInterface
 
uint32_t m_PciBusPos
 
uint32_t m_PciDevicePos
 
uint32_t m_PciFunctionNum
 
- Protected Attributes inherited from RequestQueue
IntakeLane m_IntakeLanes [REQUEST_QUEUE_NUM_PRIORITIES]
 
Requestm_pRequestQueue [REQUEST_QUEUE_NUM_PRIORITIES]
 
Requestm_pRequestQueueTail [REQUEST_QUEUE_NUM_PRIORITIES]
 
Requestm_pActiveRequest
 
Atomic< size_t > m_State
 
Mutex m_LifecycleMutex
 
WaitQueue m_RequestQueueWaiters
 
WaitQueue m_WorkerWaiters
 
Threadm_pThread
 
Atomic< PerProcessorScheduler * > m_pWorkerScheduler
 
SchedulerWorkerWake m_WorkerWake
 
Atomic< size_t > m_bWorkerReady
 
Atomic< size_t > m_bWorkerActive
 
size_t m_WorkerProgressGeneration
 
RequestQueueOverrunChecker m_OverrunChecker
 
Timerm_pOverrunTimer
 
Atomic< size_t > m_PublicationState
 
size_t m_nMaxAsyncRequests
 
Atomic< size_t > m_nAsyncRequests
 
Atomic< size_t > m_nTotalRequests
 
Atomic< size_t > m_nActiveRequests
 
NormalStaticString m_Name
 
- Static Protected Attributes inherited from Device
static Device m_Root
 
static Mutex m_TreeLock
 
- Static Protected Attributes inherited from RequestQueue
static constexpr size_t PublicationClosed = static_cast<size_t>(1) << ((sizeof(size_t) * 8) - 1)
 
static constexpr size_t PublicationCountMask = ~PublicationClosed
 

Detailed Description

Definition at line 16 of file Xhci.h.

Constructor & Destructor Documentation

◆ Xhci()

Xhci::Xhci ( Device device)
explicit

Definition at line 17 of file Xhci.cc.

◆ ~Xhci()

Xhci::~Xhci ( )
override

Definition at line 26 of file Xhci.cc.

Member Function Documentation

◆ accept()

bool Xhci::accept ( uintptr_t  transaction,
void(*)(uintptr_t, ssize_t)  callback,
uintptr_t  parameter,
UsbInterruptInHandle handle 
)
private

Definition at line 167 of file XhciTransfer.cc.

◆ addInterruptInHandler()

bool Xhci::addInterruptInHandler ( UsbEndpoint  endpointInfo,
uintptr_t  pBuffer,
uint16_t  nBytes,
void(*)(uintptr_t, ssize_t)  pCallback,
UsbInterruptInHandle handle,
uintptr_t  pParam = 0 
)
overridevirtual

Adds an owned recurring interrupt-IN transaction.

Implements UsbHub.

Definition at line 203 of file XhciTransfer.cc.

References addTransferToTransaction(), createTransaction(), and OperationBarrier::tryAcquire().

◆ addressDevice()

bool Xhci::addressDevice ( uint8_t  address,
const UsbEndpoint endpoint 
)
overridevirtual

Reimplemented from UsbHub.

Definition at line 79 of file XhciDevice.cc.

◆ addTransferToTransaction()

void Xhci::addTransferToTransaction ( uintptr_t  pTransaction,
bool  bToggle,
UsbPid  pid,
uintptr_t  pBuffer,
size_t  nBytes 
)
overridevirtual

Adds a new transfer to an existent transaction.

Implements UsbHub.

Definition at line 54 of file XhciTransfer.cc.

References OperationBarrier::tryAcquire().

Referenced by addInterruptInHandler().

+ Here is the caller graph for this function:

◆ afterDelivery()

void Xhci::afterDelivery ( void *  context)
staticprivate

Definition at line 362 of file XhciTransfer.cc.

◆ cancelAsyncAndDrain()

void Xhci::cancelAsyncAndDrain ( uintptr_t  pTransaction,
void(*)(uintptr_t, ssize_t)  pCallback,
uintptr_t  pParam 
)
overridevirtual

Cancels an accepted transaction or drains a completion which won the race. On return, the matching callback has run exactly once and the controller can no longer access any transfer buffer.

The callback and parameter identify the original transaction generation, preventing a stale numeric transaction handle from cancelling a reused controller slot.

Implements UsbHub.

Definition at line 79 of file XhciLifecycle.cc.

References OperationBarrier::tryAcquire().

◆ cancelInterruptInAndDrain()

bool Xhci::cancelInterruptInAndDrain ( const UsbInterruptInToken token,
void(*)(uintptr_t, ssize_t)  callback,
uintptr_t  parameter,
bool  producerAlreadyStopped 
)
overrideprotectedvirtual

Stops and drains one exact recurring interrupt-IN subscription.

Implements UsbHub.

Definition at line 86 of file XhciLifecycle.cc.

References UsbHcd::CallbackDeliveryQueue::cancelSubscription(), panic(), and OperationBarrier::tryAcquire().

◆ cancelRequest()

void Xhci::cancelRequest ( const Request request)
overrideprotectedvirtual

Releases payload ownership for a request that will not execute.

This runs without the queue guard for rejected candidates (including stopped queues, duplicates and capacity limits) and queued requests cancelled by destroy(). Implementations used by allocation-free producers must not sleep. Derived destructors must call destroy() while their override and member state are still alive. During destroy(), the lifecycle is serialized: halt() and resume() on this queue return false, while recursive destroy() is a fatal contract violation.

Reimplemented from RequestQueue.

Definition at line 187 of file XhciEvent.cc.

◆ cancelTransfer()

void Xhci::cancelTransfer ( uintptr_t  transaction,
size_t  generation,
bool  recurring,
void(*)(uintptr_t, ssize_t)  callback,
uintptr_t  parameter 
)
private

Definition at line 35 of file XhciLifecycle.cc.

◆ collectEventsLocked()

bool Xhci::collectEventsLocked ( bool  fromInterrupt)
private

Definition at line 9 of file XhciEvent.cc.

◆ command()

bool Xhci::command ( XhciHw::Trb  trb,
uint8_t *  returnedSlot = nullptr 
)
private

Definition at line 258 of file Xhci.cc.

◆ completionRegressions()

bool Xhci::completionRegressions ( )
staticprivate

Definition at line 238 of file XhciTransfer.cc.

◆ controllerAssignsAddresses()

bool Xhci::controllerAssignsAddresses ( ) const
inlineoverridevirtual

Reimplemented from UsbHub.

Definition at line 24 of file Xhci.h.

◆ createTransaction()

uintptr_t Xhci::createTransaction ( UsbEndpoint  endpointInfo)
overridevirtual

Creates a new transaction with the given endpoint data.

Implements UsbHub.

Definition at line 11 of file XhciTransfer.cc.

References VirtualAddressSpace::getKernelAddressSpace(), VirtualAddressSpace::getMapping(), and OperationBarrier::tryAcquire().

Referenced by addInterruptInHandler().

+ Here is the caller graph for this function:

◆ currentRootPortGeneration()

size_t Xhci::currentRootPortGeneration ( size_t  port) const
overrideprotectedvirtual

Current observed connection generation for one HCD root port.

Reimplemented from UsbHub.

Definition at line 119 of file XhciEvent.cc.

◆ decodeCompletion()

bool Xhci::decodeCompletion ( Transaction transaction,
size_t  index,
uint8_t  code,
size_t  residual,
bool &  complete,
size_t &  actual 
)
staticprivate

Definition at line 216 of file XhciTransfer.cc.

◆ deliveryWorker()

int Xhci::deliveryWorker ( void *  context)
staticprivate

Definition at line 386 of file XhciTransfer.cc.

◆ destroyDelivery()

void Xhci::destroyDelivery ( void *  context)
staticprivate

Definition at line 379 of file XhciTransfer.cc.

◆ doAsync()

bool Xhci::doAsync ( uintptr_t  pTransaction,
void(*)(uintptr_t, ssize_t)  pCallback = nullptr,
uintptr_t  pParam = 0 
)
overridevirtual

Performs a transaction asynchronously.

Returning true transfers one completion obligation to the controller: it must call the callback exactly once, and only after it can no longer access any transfer buffer. Returning false guarantees that the callback was not and will not be called, and that the rejected transaction no longer owns controller or transfer-buffer state.

Implements UsbHub.

Definition at line 197 of file XhciTransfer.cc.

References OperationBarrier::tryAcquire().

◆ enqueueDeliveryLocked()

void Xhci::enqueueDeliveryLocked ( UsbHcd::CallbackDeliveryQueue::Record delivery)
private

Definition at line 325 of file XhciTransfer.cc.

◆ ensureEndpoint()

Xhci::Endpoint * Xhci::ensureEndpoint ( uint8_t  slot,
const UsbEndpoint description 
)
private

Definition at line 107 of file XhciDevice.cc.

◆ executeRequest()

uint64_t Xhci::executeRequest ( uint64_t  p1,
uint64_t  p2,
uint64_t  p3,
uint64_t  p4,
uint64_t  p5,
uint64_t  p6,
uint64_t  p7,
uint64_t  p8 
)
overrideprotectedvirtual

Callback - classes are expected to inherit and override this function. It's called when a request needs to be executed (by the worker thread).

Implements RequestQueue.

Definition at line 162 of file XhciEvent.cc.

References UsbHub::deviceConnected(), UsbHub::deviceDisconnected(), and portReset().

◆ failLocked()

void Xhci::failLocked ( )
private

Definition at line 21 of file XhciLifecycle.cc.

◆ findSlot()

uint8_t Xhci::findSlot ( const UsbEndpoint endpoint) const
private

Definition at line 18 of file XhciDevice.cc.

◆ finishLocked()

void Xhci::finishLocked ( Transaction transaction,
ssize_t  result,
bool  natural 
)
private

Definition at line 332 of file XhciTransfer.cc.

◆ freeTransactionLocked()

void Xhci::freeTransactionLocked ( uintptr_t  transaction)
private

Definition at line 382 of file XhciTransfer.cc.

◆ getName()

void Xhci::getName ( String str)
inlineoverridevirtual

Stores the device's name in str.

Reimplemented from Device.

Definition at line 21 of file Xhci.h.

◆ halt()

bool Xhci::halt ( )
private

Definition at line 13 of file XhciLifecycle.cc.

◆ inInterruptCallbackContext()

bool Xhci::inInterruptCallbackContext ( ) const
inlineoverrideprotectedvirtual

True when this execution context must not wait for a USB callback.

Reimplemented from UsbHub.

Definition at line 50 of file Xhci.h.

References UsbHcd::CallbackDeliveryQueue::isInCallbackContext().

◆ initialiseController()

bool Xhci::initialiseController ( )

Definition at line 122 of file Xhci.cc.

◆ inputContext()

uint32_t * Xhci::inputContext ( size_t  index)
private

Definition at line 10 of file XhciDevice.cc.

◆ irq()

IrqDisposition Xhci::irq ( irq_id_t  number)
overridevirtual

Handles a pending IRQ in thread context.

Implements IrqHandler.

Definition at line 98 of file XhciEvent.cc.

References Quiesced.

◆ notifyPortLocked()

void Xhci::notifyPortLocked ( size_t  port)
private

Definition at line 104 of file XhciEvent.cc.

◆ outputContext()

uint32_t * Xhci::outputContext ( uint8_t  slot,
size_t  index 
)
private

Definition at line 14 of file XhciDevice.cc.

◆ parseCapabilities()

bool Xhci::parseCapabilities ( uint32_t  hcc)
private

Definition at line 49 of file Xhci.cc.

◆ portReset()

bool Xhci::portReset ( uint8_t  nPort,
bool  bErrorResponse = false 
)
overridevirtual

Gets a UsbDevice from a given vendor:product pair.

Performs a port reset for the given port. Should only be used in situations where a device cannot recover from an error without a complete reset.

Note
Assumes the port is at CONNECTED with a VALID DEVICE attached.
Parameters
bErrorResponsetrue if this is a reset as a response to an error. Error responses are allowed to use significantly longer delays in their reset logic.

Implements UsbHub.

Definition at line 127 of file XhciEvent.cc.

Referenced by executeRequest().

+ Here is the caller graph for this function:

◆ prepareDevice()

bool Xhci::prepareDevice ( uint8_t  address,
const UsbEndpoint endpoint 
)
overridevirtual

Reimplemented from UsbHub.

Definition at line 31 of file XhciDevice.cc.

◆ read()

uint32_t Xhci::read ( size_t  offset) const
private

Definition at line 29 of file Xhci.cc.

◆ releaseDeviceAddress()

void Xhci::releaseDeviceAddress ( uint8_t  )
overrideprotectedvirtual

The last interface and subtree pin released this logical address.

Reimplemented from UsbHub.

Definition at line 203 of file XhciDevice.cc.

References Hex, panic(), and MemoryRegion::virtualAddress().

◆ replaySuppressedConnectionChange()

void Xhci::replaySuppressedConnectionChange ( size_t  port)
overrideprotectedvirtual

Re-publishes one coalesced observation in ordinary thread context.

Reimplemented from UsbHub.

Definition at line 122 of file XhciEvent.cc.

◆ resetEndpoint()

bool Xhci::resetEndpoint ( const UsbEndpoint endpoint)
overridevirtual

Reimplemented from UsbHub.

Definition at line 192 of file XhciDevice.cc.

◆ resetEndpointHardware()

bool Xhci::resetEndpointHardware ( uint8_t  slot,
uint8_t  dci,
bool  stop 
)
private

Definition at line 173 of file XhciDevice.cc.

◆ shutdown()

void Xhci::shutdown ( )
private

Definition at line 96 of file XhciLifecycle.cc.

◆ submitLocked()

bool Xhci::submitLocked ( Transaction transaction)
private

Definition at line 104 of file XhciTransfer.cc.

◆ supportsHubDevices()

bool Xhci::supportsHubDevices ( ) const
inlineoverridevirtual

Reimplemented from UsbHub.

Definition at line 27 of file Xhci.h.

◆ transferEventLocked()

bool Xhci::transferEventLocked ( const XhciHw::Trb event)
private

Definition at line 268 of file XhciTransfer.cc.

◆ wait()

bool Xhci::wait ( size_t  offset,
uint32_t  mask,
uint32_t  expected,
size_t  milliseconds 
)
private

Definition at line 39 of file Xhci.cc.

◆ write()

void Xhci::write ( size_t  offset,
uint32_t  value 
)
private

Definition at line 32 of file Xhci.cc.

◆ write64()

void Xhci::write64 ( size_t  offset,
uint64_t  value 
)
private

Definition at line 35 of file Xhci.cc.

Member Data Documentation

◆ m_Addresses

uint8_t Xhci::m_Addresses[128] {}
private

Definition at line 164 of file Xhci.h.

◆ m_Cancellations

OperationBarrier Xhci::m_Cancellations
private

Definition at line 154 of file Xhci.h.

◆ m_CancelLock

Mutex Xhci::m_CancelLock
private

Definition at line 153 of file Xhci.h.

◆ m_CommandAddress

uint64_t Xhci::m_CommandAddress = 0
private

Definition at line 160 of file Xhci.h.

◆ m_CommandCode

uint8_t Xhci::m_CommandCode = 0
private

Definition at line 161 of file Xhci.h.

◆ m_CommandDone

Semaphore Xhci::m_CommandDone {0, false}
private

Definition at line 162 of file Xhci.h.

◆ m_CommandLock

Mutex Xhci::m_CommandLock
private

Definition at line 153 of file Xhci.h.

◆ m_Commands

XhciHw::Ring Xhci::m_Commands
private

Definition at line 155 of file Xhci.h.

◆ m_CommandSlot

uint8_t Xhci::m_CommandSlot = 0
private

Definition at line 161 of file Xhci.h.

◆ m_ConfigurationLock

Mutex Xhci::m_ConfigurationLock
private

Definition at line 153 of file Xhci.h.

◆ m_ContextSize

size_t Xhci::m_ContextSize = 32
private

Definition at line 146 of file Xhci.h.

◆ m_Dcbaa

MemoryRegion Xhci::m_Dcbaa
private

Definition at line 156 of file Xhci.h.

◆ m_Deliveries

UsbHcd::CallbackDeliveryQueue Xhci::m_Deliveries
private

Definition at line 168 of file Xhci.h.

◆ m_DeliveryReady

Semaphore Xhci::m_DeliveryReady {0, false}
private

Definition at line 170 of file Xhci.h.

◆ m_DeliveryStopping

bool Xhci::m_DeliveryStopping = false
private

Definition at line 151 of file Xhci.h.

◆ m_DeliveryThread

Thread* Xhci::m_DeliveryThread = nullptr
private

Definition at line 171 of file Xhci.h.

◆ m_Doorbells

size_t Xhci::m_Doorbells = 0
private

Definition at line 146 of file Xhci.h.

◆ m_Erst

MemoryRegion Xhci::m_Erst
private

Definition at line 156 of file Xhci.h.

◆ m_EventCycle

bool Xhci::m_EventCycle = true
private

Definition at line 159 of file Xhci.h.

◆ m_EventHead

size_t Xhci::m_EventHead = 0
private

Definition at line 158 of file Xhci.h.

◆ m_Events

MemoryRegion Xhci::m_Events
private

Definition at line 156 of file Xhci.h.

◆ m_EventWraps

size_t Xhci::m_EventWraps = 0
private

Definition at line 158 of file Xhci.h.

◆ m_Failed

Atomic<bool> Xhci::m_Failed {false}
private

Definition at line 150 of file Xhci.h.

◆ m_HardwareOwned

bool Xhci::m_HardwareOwned = false
private

Definition at line 149 of file Xhci.h.

◆ m_Input

MemoryRegion Xhci::m_Input
private

Definition at line 156 of file Xhci.h.

◆ m_Irq

irq_id_t Xhci::m_Irq = 0
private

Definition at line 148 of file Xhci.h.

◆ m_Lock

Mutex Xhci::m_Lock
private

Definition at line 153 of file Xhci.h.

◆ m_ObservedInterruptCompletion

bool Xhci::m_ObservedInterruptCompletion = false
private

Definition at line 152 of file Xhci.h.

◆ m_Online

Atomic<bool> Xhci::m_Online {false}
private

Definition at line 150 of file Xhci.h.

◆ m_Op

size_t Xhci::m_Op = 0
private

Definition at line 146 of file Xhci.h.

◆ m_Pci

Device* Xhci::m_Pci
private

Definition at line 144 of file Xhci.h.

◆ m_PolledInterrupt

bool Xhci::m_PolledInterrupt = false
private

Definition at line 151 of file Xhci.h.

◆ m_PortChanges

UsbHcd::PortChangeRequest Xhci::m_PortChanges[XhciHw::MaxPorts]
private

Definition at line 166 of file Xhci.h.

◆ m_PortCount

size_t Xhci::m_PortCount = 0
private

Definition at line 147 of file Xhci.h.

◆ m_Ports

Port Xhci::m_Ports[XhciHw::MaxPorts]
private

Definition at line 165 of file Xhci.h.

◆ m_PortsClosing

Atomic<bool> Xhci::m_PortsClosing {false}
private

Definition at line 150 of file Xhci.h.

◆ m_PortSlots

uint8_t Xhci::m_PortSlots[XhciHw::MaxPorts] {}
private

Definition at line 164 of file Xhci.h.

◆ m_ReadyDeliveries

List<UsbHcd::CallbackDeliveryQueue::Record*> Xhci::m_ReadyDeliveries
private

Definition at line 169 of file Xhci.h.

◆ m_Registers

IoBase* Xhci::m_Registers = nullptr
private

Definition at line 145 of file Xhci.h.

◆ m_Runtime

size_t Xhci::m_Runtime = 0
private

Definition at line 146 of file Xhci.h.

◆ m_Scratch

MemoryRegion* Xhci::m_Scratch[32] {}
private

Definition at line 157 of file Xhci.h.

◆ m_ScratchPointers

MemoryRegion Xhci::m_ScratchPointers
private

Definition at line 156 of file Xhci.h.

◆ m_Shutdown

bool Xhci::m_Shutdown = false
private

Definition at line 151 of file Xhci.h.

◆ m_SlotCount

size_t Xhci::m_SlotCount = 0
private

Definition at line 147 of file Xhci.h.

◆ m_Slots

Slot Xhci::m_Slots[XhciHw::MaxSlots+1]
private

Definition at line 163 of file Xhci.h.

◆ m_Stopping

Atomic<bool> Xhci::m_Stopping {false}
private

Definition at line 150 of file Xhci.h.

◆ m_Submissions

OperationBarrier Xhci::m_Submissions
private

Definition at line 154 of file Xhci.h.

◆ m_Transactions

Transaction* Xhci::m_Transactions[XhciHw::MaxTransactions] {}
private

Definition at line 167 of file Xhci.h.

◆ m_Transfers

OperationBarrier Xhci::m_Transfers
private

Definition at line 154 of file Xhci.h.


The documentation for this class was generated from the following files: