diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-03-03 05:46:44 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-03-03 05:46:44 +0100 |
| commit | 6249f2078e0c024dc2cd52436ba11baf6f70bc2a (patch) | |
| tree | 0272dd3ecf200819e2838a4be5e2bf0c28cfd557 /dev/Kernel | |
| parent | 31698c31a8a48f77a64e97baa5297633b18221e5 (diff) | |
ADD: AHCI: New AHCI Driver API, and refactor AHCIDeviceInterface class
from SK.
NEXT: System Call Table for Kernel to User interaction.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/AHCI.cc | 33 | ||||
| -rw-r--r-- | dev/Kernel/StorageKit/AHCI.h | 4 |
2 files changed, 18 insertions, 19 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc index 79101a00..a59e50f8 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc @@ -42,6 +42,7 @@ #define kSATAPortCnt (0x20) #define kSATASig (0x00000101) +#define kSATAPISig (0xEB140101) #define kSATAProgIfAHCI (0x01) #define kSATASubClass (0x06) @@ -197,7 +198,7 @@ SizeT drv_get_size_ahci() /// @brief Initializes an AHCI disk. /// @param pi the amount of ports that have been detected. /// @return if the disk was successfully initialized or not. -Bool drv_std_init_ahci(UInt16& pi) +STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi) { PCI::Iterator iterator(Types::PciDeviceKind::MassStorageController); @@ -219,12 +220,10 @@ Bool drv_std_init_ahci(UInt16& pi) kSATAPortsImplemented = ports_implemented; const UInt16 kMaxPortsImplemented = kSATAPortCnt; - const UInt32 kSATASignature = kSATASig; + const UInt32 kSATASignature = atapi ? kSATAPISig : kSATASig; const UInt8 kSATAPresent = 0x03; const UInt8 kSATAIPMActive = 0x01; - Boolean detected = NO; - while (ahci_index < kMaxPortsImplemented) { if (ports_implemented) @@ -239,19 +238,15 @@ Bool drv_std_init_ahci(UInt16& pi) drv_compute_disk_ahci(); - detected = YES; - pi = ports_implemented; - break; + return YES; } } ports_implemented >>= 1; ++ahci_index; } - - return detected; } } @@ -263,10 +258,12 @@ Bool drv_std_detected_ahci() return kPCIDevice.DeviceId() != (UShort)PCI::PciConfigKind::Invalid && kPCIDevice.Bar(kSATABar5) != 0; } -Bool sk_init_ahci_device(BOOL atapi) +UInt16 sk_init_ahci_device(BOOL atapi) { UInt16 pi = 0; - return drv_std_init_ahci(pi); + return drv_std_init_ahci(pi, atapi); + + return pi; } ErrorOr<AHCIDeviceInterface> sk_acquire_ahci_device(Int32 drv_index) @@ -295,24 +292,24 @@ ErrorOr<AHCIDeviceInterface> sk_acquire_ahci_device(Int32 drv_index) #ifdef __AHCI__ -Bool drv_std_detected(Void) +Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - return drv_std_detected_ahci(); + drv_std_input_output<YES, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer); } -Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) +Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output<YES, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer); + drv_std_input_output<NO, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer); } Bool drv_std_init(UInt16& pi) { - return drv_std_init_ahci(pi); + return drv_std_init_ahci(pi, NO); } -Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) +Bool drv_std_detected(Void) { - drv_std_input_output<NO, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer); + return drv_std_detected_ahci(); } /*** diff --git a/dev/Kernel/StorageKit/AHCI.h b/dev/Kernel/StorageKit/AHCI.h index c68ba5d2..ce0f91c3 100644 --- a/dev/Kernel/StorageKit/AHCI.h +++ b/dev/Kernel/StorageKit/AHCI.h @@ -31,6 +31,7 @@ namespace NeOS { return this->fPortsImplemented; } + Void SetPi(const UInt16& pi) { MUST_PASS(pi > 0); @@ -41,6 +42,7 @@ namespace NeOS { return this->fDriveIndex; } + Void SetIndex(const UInt32& drv) { this->fDriveIndex = drv; @@ -52,6 +54,6 @@ namespace NeOS UInt32 fDriveIndex{0U}; }; - Bool sk_init_ahci_device(BOOL atapi); + UInt16 sk_init_ahci_device(BOOL atapi); AHCIDeviceInterface sk_acquire_ahci_device(Int32 drv_index); } // namespace NeOS |
