summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit/AMD64/Storage
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2025-02-22 08:45:43 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2025-02-22 08:45:43 +0100
commit34f62ae2dd8c77cee1f0f3680caf407b1be6b350 (patch)
tree0985426a5d3baf2ae398a3f27ee4faca5d879f2e /dev/Kernel/HALKit/AMD64/Storage
parent917938db87fee3a905a78c499d2fe1dc2f0b5ca5 (diff)
New DeviceMgr, other APIs have been reworked as a result.
AHCI becomes the first module to be available in StorageKit. 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.cc82
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/DMA.cc18
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/PIO.cc2
3 files changed, 78 insertions, 24 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
index 8334de7e..ba1b7223 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
@@ -15,6 +15,8 @@
*
*/
+#include <KernelKit/DeviceMgr.h>
+#include <KernelKit/DriveMgr.h>
#include <KernelKit/UserProcessScheduler.h>
#include <KernelKit/LPC.h>
@@ -24,7 +26,7 @@
#include <NewKit/Utils.h>
#include <KernelKit/LockDelegate.h>
-#ifdef __AHCI__
+#include <StorageKit/AHCI.h>
#define kHBAErrTaskFile (1 << 30)
#define kHBAPxCmdST (0x0001)
@@ -39,9 +41,11 @@
#define kSATAPortCnt (0x20)
+#define kSATASig (0x00000101)
+
#define kSATAProgIfAHCI (0x01)
-#define kSATASubClass (0x06)
-#define kSATABar5 (0x24)
+#define kSATASubClass (0x06)
+#define kSATABar5 (0x24)
using namespace NeOS;
@@ -50,7 +54,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept;
-STATIC Void drv_calculate_disk_geometry() noexcept;
+STATIC Void drv_compute_disk_ahci() noexcept;
STATIC PCI::Device kPCIDevice;
STATIC HbaMem* kSATA = nullptr;
@@ -59,7 +63,7 @@ STATIC Lba kHighestLBA = 0UL;
BOOL kAHCICommandIssued = NO;
-STATIC Void drv_calculate_disk_geometry() noexcept
+STATIC Void drv_compute_disk_ahci() noexcept
{
kHighestLBA = 0UL;
@@ -175,7 +179,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
@brief Gets the number of sectors inside the drive.
@return Sector size in bytes.
*/
-SizeT drv_get_sector_count()
+SizeT drv_get_sector_count_ahci()
{
MUST_PASS(kHighestLBA > 0);
return kHighestLBA;
@@ -183,7 +187,7 @@ SizeT drv_get_sector_count()
/// @brief Get the drive size.
/// @return Disk size in bytes.
-SizeT drv_get_size()
+SizeT drv_get_size_ahci()
{
return drv_get_sector_count() * kAHCISectorSize;
}
@@ -191,7 +195,7 @@ SizeT drv_get_size()
/// @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(UInt16& pi)
+Bool drv_std_init_ahci(UInt16& pi)
{
PCI::Iterator iterator(Types::PciDeviceKind::MassStorageController);
@@ -211,7 +215,7 @@ Bool drv_std_init(UInt16& pi)
UInt16 ahci_index = 0;
const UInt16 kMaxPortsImplemented = kSATAPortCnt;
- const UInt32 kSATASignature = 0x00000101;
+ const UInt32 kSATASignature = kSATASig;
const UInt8 kSATAPresent = 0x03;
const UInt8 kSATAIPMActive = 0x01;
@@ -226,12 +230,10 @@ Bool drv_std_init(UInt16& pi)
if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kSATAPresent && ipm == kSATAIPMActive)
{
- kout << "SATA port found.\r";
-
kSATAIndex = ahci_index;
kSATA = mem_ahci;
- drv_calculate_disk_geometry();
+ drv_compute_disk_ahci();
detected = YES;
@@ -252,9 +254,41 @@ Bool drv_std_init(UInt16& pi)
return No;
}
+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)
+{
+ UInt16 pi = 0;
+
+ if (!drv_std_init_ahci(pi))
+ 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);
+
+ return ErrorOr<AHCIDeviceInterface>(device);
+}
+
+#ifdef __AHCI__
+
Bool drv_std_detected(Void)
{
- return kPCIDevice.DeviceId() != (UShort)PCI::PciConfigKind::Invalid;
+ drv_std_detected_ahci();
}
Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer)
@@ -262,9 +296,29 @@ Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer)
drv_std_input_output<YES, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer);
}
+Bool drv_std_init(UInt16& pi)
+{
+ return drv_std_init_ahci(pi);
+}
+
Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer)
{
drv_std_input_output<NO, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer);
}
-#endif // ifdef __AHCI__ \ No newline at end of file
+/***
+ @brief Gets the number of sectors inside the drive.
+ @return Sector size in bytes.
+ */
+SizeT drv_get_sector_count()
+{
+ return drv_get_sector_count_ahci();
+}
+
+/// @brief Get the drive size.
+/// @return Disk size in bytes.
+SizeT drv_get_size()
+{
+ return drv_get_size_ahci();
+}
+#endif // ifdef __AHCI__
diff --git a/dev/Kernel/HALKit/AMD64/Storage/DMA.cc b/dev/Kernel/HALKit/AMD64/Storage/DMA.cc
index eafd86fa..a4190065 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/DMA.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/DMA.cc
@@ -32,7 +32,7 @@ STATIC Boolean kATADetected = false;
STATIC Int32 kATADeviceType = kATADeviceCount;
STATIC Char kATAData[kATADataLen] = {0};
STATIC NeOS::PCI::Device kATADevice;
-STATIC Char kCurrentDiskModel[50] = {"UNKNOWN ATA DRIVE"};
+STATIC Char kCurrentDiskModel[50] = {"UNKNOWN DMA DRIVE"};
Boolean drv_std_wait_io(UInt16 IO)
{
@@ -40,18 +40,18 @@ Boolean drv_std_wait_io(UInt16 IO)
rt_in8(IO + ATA_REG_STATUS);
ATAWaitForIO_Retry:
- auto statRdy = rt_in8(IO + ATA_REG_STATUS);
+ auto status_rdy = rt_in8(IO + ATA_REG_STATUS);
- if ((statRdy & ATA_SR_BSY))
+ if ((status_rdy & ATA_SR_BSY))
goto ATAWaitForIO_Retry;
ATAWaitForIO_Retry2:
- statRdy = rt_in8(IO + ATA_REG_STATUS);
+ status_rdy = rt_in8(IO + ATA_REG_STATUS);
- if (statRdy & ATA_SR_ERR)
+ if (status_rdy & ATA_SR_ERR)
return false;
- if (!(statRdy & ATA_SR_DRDY))
+ if (!(status_rdy & ATA_SR_DRDY))
goto ATAWaitForIO_Retry2;
return true;
@@ -85,14 +85,14 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster)
// identify until it's good.
ATAInit_Retry:
- auto statRdy = rt_in8(IO + ATA_REG_STATUS);
+ auto status_rdy = rt_in8(IO + ATA_REG_STATUS);
- if (statRdy & ATA_SR_ERR)
+ if (status_rdy & ATA_SR_ERR)
{
return false;
}
- if ((statRdy & ATA_SR_BSY))
+ if ((status_rdy & ATA_SR_BSY))
goto ATAInit_Retry;
rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_IDENTIFY);
diff --git a/dev/Kernel/HALKit/AMD64/Storage/PIO.cc b/dev/Kernel/HALKit/AMD64/Storage/PIO.cc
index 2563738a..96232e4b 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/PIO.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/PIO.cc
@@ -30,7 +30,7 @@ using namespace NeOS::HAL;
STATIC Boolean kATADetected = false;
STATIC Int32 kATADeviceType = kATADeviceCount;
STATIC Char kATAData[kATADataLen] = {0};
-STATIC Char kCurrentDiskModel[50] = {"UNKNOWN ATA DRIVE"};
+STATIC Char kCurrentDiskModel[50] = {"UNKNOWN PIO DRIVE"};
Boolean drv_std_wait_io(UInt16 IO)
{