summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-03-03 05:46:44 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-03-03 05:46:44 +0100
commit6249f2078e0c024dc2cd52436ba11baf6f70bc2a (patch)
tree0272dd3ecf200819e2838a4be5e2bf0c28cfd557 /dev/Kernel
parent31698c31a8a48f77a64e97baa5297633b18221e5 (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.cc33
-rw-r--r--dev/Kernel/StorageKit/AHCI.h4
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