diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2025-02-22 08:51:07 +0100 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2025-02-22 08:51:07 +0100 |
| commit | 699746a397043ab82b4e83e2ac5bf3ddc0486964 (patch) | |
| tree | 73cb763d1b0ce4ab1dc3f9970ac54e19ac321180 /dev/Kernel/HALKit/AMD64/Storage | |
| parent | 34f62ae2dd8c77cee1f0f3680caf407b1be6b350 (diff) | |
ADD: More improvements now on DeviceMgr.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit/AMD64/Storage')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/AHCI.cc | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc index ba1b7223..8f8ca539 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc @@ -61,6 +61,8 @@ STATIC HbaMem* kSATA = nullptr; STATIC SizeT kSATAIndex = 0UL; STATIC Lba kHighestLBA = 0UL; +STATIC UInt16 kSATAPortsImplemented = 0U; + BOOL kAHCICommandIssued = NO; STATIC Void drv_compute_disk_ahci() noexcept @@ -214,6 +216,8 @@ Bool drv_std_init_ahci(UInt16& pi) UInt32 ports_implemented = mem_ahci->Pi; UInt16 ahci_index = 0; + kSATAPortsImplemented = ports_implemented; + const UInt16 kMaxPortsImplemented = kSATAPortCnt; const UInt32 kSATASignature = kSATASig; const UInt8 kSATAPresent = 0x03; @@ -259,27 +263,32 @@ Bool drv_std_detected_ahci() return kPCIDevice.DeviceId() != (UShort)PCI::PciConfigKind::Invalid && kPCIDevice.Bar(kSATABar5) != 0; } -ErrorOr<AHCIDeviceInterface> sk_acquire_ahci_device(Int32 drv_index) +Bool sk_init_ahci_device(BOOL atapi) { UInt16 pi = 0; + return drv_std_init_ahci(pi); +} - if (!drv_std_init_ahci(pi)) +ErrorOr<AHCIDeviceInterface> sk_acquire_ahci_device(Int32 drv_index) +{ + if (!drv_std_detected_ahci()) return ErrorOr<AHCIDeviceInterface>(kErrorDisk); AHCIDeviceInterface device([](IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) -> void { AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; - auto disk = mnt->GetAddressOf(dev->fDriveIndex); - drv_std_input_output<YES, YES, NO>(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); - }, - [](IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) -> void { - AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; - - auto disk = mnt->GetAddressOf(dev->fDriveIndex); - drv_std_input_output<NO, YES, NO>(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); - }, nullptr); - - device.SetPi(pi); + auto disk = mnt->GetAddressOf(dev->GetIndex()); + drv_std_input_output<YES, YES, NO>(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); }, + [](IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) -> void { + AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; + + auto disk = mnt->GetAddressOf(dev->GetIndex()); + drv_std_input_output<NO, YES, NO>(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); + }, + nullptr); + + device.SetPi(kSATAPortsImplemented); + device.SetIndex(MountpointInterface::kDriveIndexA); return ErrorOr<AHCIDeviceInterface>(device); } |
