diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2025-02-22 08:45:43 +0100 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2025-02-22 08:45:43 +0100 |
| commit | 34f62ae2dd8c77cee1f0f3680caf407b1be6b350 (patch) | |
| tree | 0985426a5d3baf2ae398a3f27ee4faca5d879f2e /dev/Kernel/HALKit | |
| parent | 917938db87fee3a905a78c499d2fe1dc2f0b5ca5 (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')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalDebugOutput.cc | 4 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/AHCI.cc | 82 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/DMA.cc | 18 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/PIO.cc | 2 |
4 files changed, 80 insertions, 26 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc index dfdf52f1..ba4e4a7c 100644 --- a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc @@ -63,7 +63,7 @@ namespace NeOS TerminalDevice::~TerminalDevice() = default; - EXTERN_C void ke_io_write(const Char* bytes) + EXTERN_C void ke_io_write(IDeviceObject<const Char*>* obj, const Char* bytes) { #ifdef __DEBUG__ Detail::hal_serial_init<Detail::kPort>(); @@ -138,7 +138,7 @@ namespace NeOS #endif // __DEBUG__ } - EXTERN_C void ke_io_read(const Char* bytes) + EXTERN_C void ke_io_read(IDeviceObject<const Char*>*, const Char* bytes) { #ifdef __DEBUG__ Detail::hal_serial_init<Detail::kPort>(); 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) { |
