diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-01 10:40:19 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-01 10:40:19 +0200 |
| commit | 48d0df78c872f7b843f2444a6bcfa41438dc736e (patch) | |
| tree | 34c23cc3508114f3985289f6cb4e915454604426 /dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc | |
| parent | f88f6074479c627529559f690bf836960d5a6378 (diff) | |
| parent | 1c3b37123cef3fa9c69099bc6228d7b4a082ee90 (diff) | |
Merge pull request #5 from amlel-el-mahrouss/dev
pr/ahci: important patches.
Diffstat (limited to 'dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc | 61 |
1 files changed, 7 insertions, 54 deletions
diff --git a/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc index cc848f64..300b959f 100644 --- a/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/DMA+Generic.cc @@ -32,7 +32,7 @@ STATIC Boolean kATADetected = false; STATIC Int32 kATADeviceType = kATADeviceCount; STATIC Char kATAData[kATADataLen] = {0}; STATIC Kernel::PCI::Device kATADevice; -STATIC Char kCurrentDiskModel[50] = {"UNKNOWN DMA DRIVE"}; +STATIC Char kCurrentDiskModel[50] = {"GENERIC DMA"}; Boolean drv_std_wait_io(UInt16 IO) { @@ -73,76 +73,29 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) { kATADevice = iterator[device_index].Leak(); // And then leak the reference. - // if SATA and then interface is AHCI... + /// IDE interface if (kATADevice.Subclass() == 0x01) { - UInt16 IO = Bus; - - drv_std_select(IO); - - // Bus init, NEIN bit. - rt_out8(IO + ATA_REG_NEIN, 1); - - // identify until it's good. - ATAInit_Retry: - auto status_rdy = rt_in8(IO + ATA_REG_STATUS); - - if (status_rdy & ATA_SR_ERR) - { - return false; - } - - if ((status_rdy & ATA_SR_BSY)) - goto ATAInit_Retry; - - rt_out8(IO + ATA_REG_COMMAND, ATA_CMD_IDENTIFY); - - /// fetch serial info - /// model, speed, number of sectors... - - drv_std_wait_io(IO); - - for (SizeT i = 0ul; i < kATADataLen; ++i) - { - drv_std_wait_io(IO); - kATAData[i] = Kernel::HAL::rt_in16(IO + ATA_REG_DATA); - drv_std_wait_io(IO); - } - - for (SizeT i = 0; i < 40; i += 2) - { - kCurrentDiskModel[i * 2] = kATAData[27 + i * 2] >> 8; - kCurrentDiskModel[i * 2 + 1] = kATAData[27 + i * 2] & 0xFF; - } - - kCurrentDiskModel[40] = '\0'; - - kout << "Drive Model: " << kCurrentDiskModel << kendl; - - OutBus = (Bus == ATA_PRIMARY_IO) ? ATA_PRIMARY_IO : ATA_SECONDARY_IO; - OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE; - - return YES; + + break; } } - ke_panic(RUNTIME_CHECK_BOOTSTRAP, "Invalid ATA DMA driver, not detected"); - return NO; } namespace Kernel::Detail { - struct PRDEntry + struct PRDEntry final { UInt32 mAddress; UInt16 mByteCount; - UInt16 mFlags; + UInt16 mFlags; /// @param PRD flags, set to 0x8000 to indicate end of prd. }; } // namespace Kernel::Detail static UIntPtr kReadAddr = mib_cast(2); -static UIntPtr kWriteAddr = mib_cast(4); +static UIntPtr kWriteAddr = mib_cast(2) + kib_cast(64); Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size) { |
