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

Public Member Functions

 AhciController (Device *pci)
 
bool initialiseController ()
 
bool supportsConcurrentReads () const override
 
void shutdown ()
 
bool identify (size_t port, uint16_t *words, bool interruptProbe=false)
 
EXPORTED_PUBLIC bool readWrite (size_t port, uint64_t lba, uint16_t sectors, void *buffer, size_t bytes, bool write)
 
bool readBatch (size_t port, Disk::ReadBuffer *buffers, size_t count)
 
bool writeBatch (size_t port, Disk::WriteBuffer *buffers, size_t count)
 
bool flush (size_t port, bool extended)
 
void configureDisk (size_t port, size_t sectorBytes, size_t queueDepth)
 
EXPORTED_PUBLIC size_t interruptCompletions () const
 
EXPORTED_PUBLIC size_t maximumOutstanding (size_t port) const
 
Device * pciDevice () const
 
IrqDisposition irq (irq_id_t number) override
 
bool acceptsSpuriousInterrupts () const override
 
bool sendCommand (size_t, uintptr_t, uint8_t, uintptr_t, uint16_t, bool) override
 
- Public Member Functions inherited from ScsiController
 ScsiController (Controller *pDev, bool startWorker=true)
 
bool prepareDiskRemoval ()
 
void cancelDiskRemoval ()
 
virtual uint64_t 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)
 
- Public Member Functions inherited from Controller
 Controller (Device *pDev)
 
virtual Type getType ()
 
virtual void getName (String &str)
 
virtual void dump (String &str)
 
- Public Member Functions inherited from Device
 Device (Device *p)
 
Device * getParent () const
 
void setParent (Device *p)
 
virtual const String & getSpecificType ()
 
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 ()
 
Device * getPhysicalFunction () const
 
size_t getVirtualFunctionIndex () const
 
void setVirtualFunction (Device *physicalFunction, size_t index)
 
virtual Vector< Address * > & addresses ()
 
virtual uintptr_t getInterruptNumber ()
 
virtual void setInterruptNumber (uintptr_t n)
 
void addChild (Device *pDevice)
 
Device * getChild (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)
 
MUST_USE_RESULT bool publishAsyncRequest (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

size_t getNumUnits () override
 
- Protected Member Functions inherited from ScsiController
virtual void cancelRequest (const Request &request)
 
void shutdownDiskCaches (bool deviceAvailable=true)
 
void searchDisks ()
 
- Protected Member Functions inherited from Device
 NOT_COPYABLE_OR_ASSIGNABLE (Device)
 
- 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)
 
Request * findDuplicate (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 ()
 
- Protected Member Functions inherited from IrqHandler
virtual ~IrqHandler ()
 
- Protected Member Functions inherited from IrqHandlerBase
virtual ~IrqHandlerBase ()
 

Private Member Functions

bool readWrite (size_t port, uint64_t lba, uint16_t sectors, void *buffer, size_t bytes, bool write, bool cacheFill)
 
bool claimOwnership (uint32_t version)
 
bool reset ()
 

Private Attributes

Device * m_Pci
 
IoBase * m_Registers
 
AhciPort * m_Ports [32]
 
Mutex m_IrqLock
 
irq_id_t m_Irq
 
uint32_t m_Implemented
 
uint16_t m_OriginalCommand
 
bool m_PciChanged
 
bool m_HardwareOwned
 
bool m_Interrupts
 
bool m_Stopping
 
bool m_Shutdown
 

Friends

class AhciDisk
 

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 bool treeLockHeldByCurrentThread ()
 
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 Device & root ()
 
- 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
 
Device * m_pParent
 
Device * m_PhysicalFunction
 
size_t m_VirtualFunctionIndex
 
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]
 
Request * m_pRequestQueue [REQUEST_QUEUE_NUM_PRIORITIES]
 
Request * m_pRequestQueueTail [REQUEST_QUEUE_NUM_PRIORITIES]
 
Request * m_pActiveRequest
 
Atomic< size_t > m_State
 
Mutex m_LifecycleMutex
 
WaitQueue m_RequestQueueWaiters
 
WaitQueue m_WorkerWaiters
 
Thread * m_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
 
Timer * m_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 25 of file AhciController.h.

Constructor & Destructor Documentation

◆ AhciController()

AhciController::AhciController ( Device *  pci)
explicit

Definition at line 34 of file AhciController.cc.

◆ ~AhciController()

AhciController::~AhciController ( )
override

Definition at line 49 of file AhciController.cc.

Member Function Documentation

◆ acceptsSpuriousInterrupts()

bool AhciController::acceptsSpuriousInterrupts ( ) const
inlineoverridevirtual

A recyclable message vector may deliver a late edge from its previous source. Opt in only when the callback verifies its own device's pending work and an empty invocation has no side effects.

Reimplemented from IrqHandler.

Definition at line 47 of file AhciController.h.

◆ claimOwnership()

bool AhciController::claimOwnership ( uint32_t  version)
private

Definition at line 54 of file AhciController.cc.

◆ configureDisk()

void AhciController::configureDisk ( size_t  port,
size_t  sectorBytes,
size_t  queueDepth 
)

Definition at line 255 of file AhciController.cc.

◆ flush()

bool AhciController::flush ( size_t  port,
bool  extended 
)

Definition at line 267 of file AhciController.cc.

◆ getNumUnits()

size_t AhciController::getNumUnits ( )
inlineoverrideprotectedvirtual

Implements ScsiController.

Definition at line 56 of file AhciController.h.

◆ identify()

bool AhciController::identify ( size_t  port,
uint16_t *  words,
bool  interruptProbe = false 
)

Definition at line 237 of file AhciController.cc.

◆ initialiseController()

bool AhciController::initialiseController ( )

Definition at line 93 of file AhciController.cc.

◆ interruptCompletions()

size_t AhciController::interruptCompletions ( ) const

Definition at line 271 of file AhciController.cc.

◆ irq()

IrqDisposition AhciController::irq ( irq_id_t  number)
overridevirtual

Handles a pending IRQ in thread context.

Implements IrqHandler.

Definition at line 215 of file AhciController.cc.

References Quiesced, IoBase::read32(), and IoBase::write32().

◆ maximumOutstanding()

size_t AhciController::maximumOutstanding ( size_t  port) const

Definition at line 314 of file AhciController.cc.

◆ pciDevice()

Device * AhciController::pciDevice ( ) const
inline

Definition at line 43 of file AhciController.h.

◆ readBatch()

bool AhciController::readBatch ( size_t  port,
Disk::ReadBuffer *  buffers,
size_t  count 
)

Definition at line 259 of file AhciController.cc.

◆ readWrite() [1/2]

bool AhciController::readWrite ( size_t  port,
uint64_t  lba,
uint16_t  sectors,
void *  buffer,
size_t  bytes,
bool  write 
)

Definition at line 241 of file AhciController.cc.

◆ readWrite() [2/2]

bool AhciController::readWrite ( size_t  port,
uint64_t  lba,
uint16_t  sectors,
void *  buffer,
size_t  bytes,
bool  write,
bool  cacheFill 
)
private

Definition at line 245 of file AhciController.cc.

◆ reset()

bool AhciController::reset ( )
private

Definition at line 81 of file AhciController.cc.

◆ sendCommand()

bool AhciController::sendCommand ( size_t  ,
uintptr_t  ,
uint8_t  ,
uintptr_t  ,
uint16_t  ,
bool   
)
inlineoverridevirtual

Implements ScsiController.

Definition at line 51 of file AhciController.h.

◆ shutdown()

void AhciController::shutdown ( )

Definition at line 278 of file AhciController.cc.

◆ supportsConcurrentReads()

bool AhciController::supportsConcurrentReads ( ) const
inlineoverridevirtual

Concurrent cache fills require independent transport command storage.

Reimplemented from ScsiController.

Definition at line 30 of file AhciController.h.

◆ writeBatch()

bool AhciController::writeBatch ( size_t  port,
Disk::WriteBuffer *  buffers,
size_t  count 
)

Definition at line 263 of file AhciController.cc.

Friends And Related Symbol Documentation

◆ AhciDisk

friend class AhciDisk
friend

Definition at line 61 of file AhciController.h.

Member Data Documentation

◆ m_HardwareOwned

bool AhciController::m_HardwareOwned
private

Definition at line 74 of file AhciController.h.

◆ m_Implemented

uint32_t AhciController::m_Implemented
private

Definition at line 71 of file AhciController.h.

◆ m_Interrupts

bool AhciController::m_Interrupts
private

Definition at line 75 of file AhciController.h.

◆ m_Irq

irq_id_t AhciController::m_Irq
private

Definition at line 70 of file AhciController.h.

◆ m_IrqLock

Mutex AhciController::m_IrqLock
mutableprivate

Definition at line 69 of file AhciController.h.

◆ m_OriginalCommand

uint16_t AhciController::m_OriginalCommand
private

Definition at line 72 of file AhciController.h.

◆ m_Pci

Device* AhciController::m_Pci
private

Definition at line 66 of file AhciController.h.

◆ m_PciChanged

bool AhciController::m_PciChanged
private

Definition at line 73 of file AhciController.h.

◆ m_Ports

AhciPort* AhciController::m_Ports[32]
private

Definition at line 68 of file AhciController.h.

◆ m_Registers

IoBase* AhciController::m_Registers
private

Definition at line 67 of file AhciController.h.

◆ m_Shutdown

bool AhciController::m_Shutdown
private

Definition at line 77 of file AhciController.h.

◆ m_Stopping

bool AhciController::m_Stopping
private

Definition at line 76 of file AhciController.h.


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