29 bool initialise(uint32_t capabilities, uint32_t version, uint32_t extendedCapabilities);
31 void enableInterrupts();
32 bool interrupt(
bool pending);
33 bool command(uint8_t opcode, uint64_t lba, uint16_t sectors,
void* buffer,
size_t bytes,
34 bool write,
bool interrupts,
bool interruptProbe =
false,
bool cacheFill =
false,
35 physical_uintptr_t dmaPhysical = 0,
36 const physical_uintptr_t* directReadPages =
nullptr);
39 size_t interruptCompletions()
const;
40 size_t maximumOutstanding()
const;
41 void configureDisk(
size_t sectorBytes,
size_t queueDepth);
42 size_t sectorBytes()
const {
47 bool transferBatch(
Disk::ReadBuffer* buffers,
size_t count,
bool interrupts,
bool writing,
48 const physical_uintptr_t* dmaPhysical =
nullptr,
49 const physical_uintptr_t*
const* directReadPages =
nullptr);
50 uint32_t read(
size_t reg)
const;
51 void write(
size_t reg, uint32_t value);
52 void waitForProgress();
53 bool waitClear(
size_t reg, uint32_t bits,
size_t milliseconds);
55 void acknowledge(uint32_t status);
56 void observe(uint32_t status,
bool fromInterrupt);
57 void pollCompletions(
bool interrupts);
59 bool chooseSlot(
bool queued,
size_t& index);
60 bool issueCommand(
size_t index, uint8_t opcode, uint64_t lba, uint16_t sectors,
void* buffer,
61 size_t bytes,
bool writing,
bool queued,
bool interrupts,
62 physical_uintptr_t directPhysical = 0,
63 const physical_uintptr_t* directReadPages =
nullptr);
64 bool reapCommand(
size_t index, uint8_t opcode,
void* buffer,
size_t bytes,
bool writing,
65 bool queued,
bool interrupts,
bool interruptProbe,
bool directRead =
false);
73 : data(
"AHCI transfer buffer"), completion(0,
false), done(
false), errors(0), deadline(0) {}
75 physical_uintptr_t pages[16];
83 mutable Mutex m_StateLock;
93 bool m_AddressesInstalled;
94 bool m_PolledInterrupt;
95 size_t m_InterruptCompletions;
96 size_t m_MaximumOutstanding;