|
The Pedigree Project 0.1
|
#include <ScsiController.h>
Inheritance diagram for ScsiController:
Collaboration diagram for ScsiController:Public Member Functions | |
| ScsiController (Controller *pDev, bool startWorker=true) | |
| bool | prepareDiskRemoval () |
| void | cancelDiskRemoval () |
| virtual bool | supportsConcurrentReads () const |
| virtual bool | sendCommand (size_t nUnit, uintptr_t pCommand, uint8_t nCommandSize, uintptr_t pRespBuffer, uint16_t nRespBytes, bool bWrite)=0 |
| 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 | |
| virtual void | cancelRequest (const Request &request) |
| void | shutdownDiskCaches (bool deviceAvailable=true) |
| virtual size_t | getNumUnits ()=0 |
| 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 () |
Private Member Functions | |
| bool | acquireDiskOperation (OperationBarrier::Lease &operation) |
Private Attributes | |
| OperationBarrier | m_DiskOperations |
Friends | |
| class | ScsiDisk |
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 |
Generic class for Scsi Controllers
Definition at line 38 of file ScsiController.h.
| ScsiController::ScsiController | ( | Controller * | pDev, |
| bool | startWorker = true |
||
| ) |
Definition at line 28 of file ScsiController.cc.
| ScsiController::ScsiController | ( | ) |
Definition at line 34 of file ScsiController.cc.
|
virtual |
Definition at line 39 of file ScsiController.cc.
|
private |
Definition at line 46 of file ScsiController.cc.
| void ScsiController::cancelDiskRemoval | ( | ) |
Definition at line 143 of file ScsiController.cc.
|
protectedvirtual |
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 113 of file ScsiController.cc.
References ScsiDisk::unpin().
|
virtual |
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.
Reimplemented in IsaAtaController, and PciAtaController.
Definition at line 89 of file ScsiController.cc.
References ScsiDisk::doRead(), ScsiDisk::doWriteDirect(), and ScsiDisk::unpin().
| bool ScsiController::prepareDiskRemoval | ( | ) |
Definition at line 123 of file ScsiController.cc.
|
protected |
Definition at line 79 of file ScsiController.cc.
|
protected |
Drains disk work and retires child Cache callbacks. Removed devices discard software cache data and cannot provide a final hardware flush.
Definition at line 50 of file ScsiController.cc.
References OperationBarrier::closeAndWait(), RequestQueue::drain(), Device::getChild(), Device::getNumChildren(), m_DiskOperations, and panic().
Referenced by UsbMassStorageDevice::prepareForDisconnection(), IsaAtaController::shutdown(), and PciAtaController::shutdown().
Here is the caller graph for this function:
|
inlinevirtual |
Concurrent cache fills require independent transport command storage.
Reimplemented in AhciController, and NvmeController.
Definition at line 48 of file ScsiController.h.
|
friend |
Definition at line 70 of file ScsiController.h.
|
private |
Rejects new filesystem-facing disk work while teardown drains.
Definition at line 75 of file ScsiController.h.
Referenced by shutdownDiskCaches().