The Pedigree Project 0.1
AhciDisk.h
1/*
2 * Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef AHCI_DISK_H
18#define AHCI_DISK_H
19
20#include "modules/drivers/common/scsi/ScsiDisk.h"
21
22class AhciController;
23
24class EXPORTED_PUBLIC AhciDisk final : public ScsiDisk {
25 public:
26 AhciDisk(AhciController* controller, size_t port);
27 ~AhciDisk() override;
28
29 bool initialise();
30
31 void getName(String& name) override;
32 size_t getSize() const override;
33 size_t getBlockCount() const override;
34 size_t getBlockSize() const override;
35 size_t getNativeBlockSize() const override;
36
37 uint64_t doRead(uint64_t location) override;
38 uint64_t doWrite(uint64_t location) override;
39 uint64_t doWriteDirect(uint64_t location, uintptr_t page) override;
40 uint64_t doWriteDirectPhysical(uint64_t location, uintptr_t page,
41 physical_uintptr_t physical) override;
42 uint64_t doSync(uint64_t location) override;
43
44 AhciController* controller() const {
45 return m_Controller;
46 }
47 size_t port() const {
48 return m_Port;
49 }
50
51 protected:
52 Device* dmaDevice() const override;
53 bool supportsBufferTransfers() const override {
54 return true;
55 }
56 bool supportsDirectCacheWrite() const override {
57 return true;
58 }
59 bool transferBuffer(uint64_t location, void* buffer, size_t length, bool writing) override;
60 bool transferReadBuffers(Disk::ReadBuffer* buffers, size_t count) override;
61 bool transferWriteBuffers(Disk::WriteBuffer* buffers, size_t count) override;
62
63 private:
64 friend class AhciController;
65 size_t validPageLength(uint64_t location) const;
66
67 AhciController* m_Controller;
68 const size_t m_Port;
69 size_t m_Sectors;
70 size_t m_SectorBytes;
71 size_t m_Bytes;
72 bool m_ExtendedFlush;
73 bool m_Initialised;
74 char m_Model[41];
75};
76
77#endif
virtual uint64_t doRead(uint64_t location)
Definition ScsiDisk.cc:1267
bool initialise(class ScsiController *pController, size_t nUnit)
Definition ScsiDisk.cc:286
virtual size_t getSize() const
Gets the size of the disk.
Definition ScsiDisk.h:141
virtual MUST_USE_RESULT uint64_t doWriteDirect(uint64_t location, uintptr_t page)
Definition ScsiDisk.cc:1435
virtual void getName(String &str)
Definition ScsiDisk.h:124
virtual size_t getBlockSize() const
Gets the preferred I/O extent of the disk.
Definition ScsiDisk.h:149
virtual size_t getNativeBlockSize() const
Definition ScsiDisk.h:157