summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit/AMD64/Storage
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2025-02-22 08:51:07 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2025-02-22 08:51:07 +0100
commit699746a397043ab82b4e83e2ac5bf3ddc0486964 (patch)
tree73cb763d1b0ce4ab1dc3f9970ac54e19ac321180 /dev/Kernel/HALKit/AMD64/Storage
parent34f62ae2dd8c77cee1f0f3680caf407b1be6b350 (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.cc35
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);
}