diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2025-03-03 12:48:17 +0100 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2025-03-03 12:48:17 +0100 |
| commit | fe61c5e33bd2a739885f3f7edc3c0c0798f918c7 (patch) | |
| tree | 1cbe3cfdabd7a59b585cf7327c57d06f8c35d54f /dev/Kernel | |
| parent | bdfc8770e68da75c20e4127a9dd10f8a7c36810d (diff) | |
AHCI: Improvements and tweaks.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/AHCI.cc | 73 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/DMA.cc | 9 | ||||
| -rw-r--r-- | dev/Kernel/src/FS/NeFS.cc | 6 |
3 files changed, 40 insertions, 48 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc index 30bd4e78..35d6ba66 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc @@ -58,9 +58,9 @@ STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept; STATIC Void drv_compute_disk_ahci() noexcept; STATIC PCI::Device kPCIDevice; -STATIC HbaMem* kSATA = nullptr; -STATIC SizeT kSATAIndex = 0UL; -STATIC Lba kHighestLBA = 0UL; +STATIC HbaMem* kSATA[kSATAPortCnt] = {}; +STATIC SizeT kSATAIndex = 0UL; +STATIC Lba kHighestLBA = 0UL; STATIC UInt16 kSATAPortsImplemented = 0U; @@ -86,10 +86,7 @@ STATIC Void drv_compute_disk_ahci() noexcept STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept { - if (port == nullptr) - return ~0; - - UInt32 slots = (kSATA->Ports[kSATAIndex].Sact | kSATA->Ports[kSATAIndex].Ci); + UInt32 slots = (port->Sact | port->Ci); for (Int32 i = 0; i < kSATAPortCnt; ++i) { @@ -107,14 +104,14 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz { UIntPtr slot = 0UL; - slot = drv_find_cmd_slot(&kSATA->Ports[kSATAIndex]); + slot = drv_find_cmd_slot(&kSATA[kSATAIndex]->Ports[kSATAIndex]); if (slot == ~0) return; - HbaCmdHeader* command_header = ((HbaCmdHeader*)((UInt64)kSATA->Ports[kSATAIndex].Clb)); + HbaCmdHeader* command_header = ((HbaCmdHeader*)((UInt64)kSATA[kSATAIndex]->Ports[kSATAIndex].Clb)); - command_header = (sizeof(HbaCmdHeader) * slot) + command_header; + command_header += slot; MUST_PASS(command_header); @@ -128,8 +125,8 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz UIntPtr buffer_phys = HAL::hal_get_phys_address(buffer); - command_table->Prdt[0].Dba = ((UInt32)(UInt64)buffer_phys & __UINT32_MAX__); - command_table->Prdt[0].Dbau = (((UInt64)(buffer_phys) >> 32) & __UINT32_MAX__); + command_table->Prdt[0].Dba = ((UInt32)(UInt64)buffer_phys); + command_table->Prdt[0].Dbau = (((UInt64)(buffer_phys) >> 32)); command_table->Prdt[0].Dbc = ((size_buffer)-1); command_table->Prdt[0].Ie = YES; @@ -142,7 +139,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz if (Identify) h2d_fis->Command = kAHCICmdIdentify; - h2d_fis->Lba0 = (lba)&0xFF; + h2d_fis->Lba0 = (lba) & 0xFF; h2d_fis->Lba1 = (lba >> 8) & 0xFF; h2d_fis->Lba2 = (lba >> 16) & 0xFF; @@ -152,27 +149,19 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz h2d_fis->Lba4 = (lba >> 32) & 0xFF; h2d_fis->Lba5 = (lba >> 40) & 0xFF; - h2d_fis->CountLow = (size_buffer)&0xFF; + h2d_fis->CountLow = (size_buffer) & 0xFF; h2d_fis->CountHigh = (size_buffer >> 8) & 0xFF; - while ((kSATA->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq))) + while ((kSATA[kSATAIndex]->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq))) { kout << "Waiting for TFD...\r"; } - kSATA->Ports[kSATAIndex].Ci = (1 << slot); - kAHCICommandIssued = YES; - - while (kSATA->Ports[kSATAIndex].Ci & (1 << slot)) - { - if (kSATA->Is & kHBAErrTaskFile) - { - ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); - } - } + kSATA[kSATAIndex]->Ports[kSATAIndex].Ci = (1 << slot); + kAHCICommandIssued = YES; // check again. - if (kSATA->Is & kHBAErrTaskFile) + if (kSATA[kSATAIndex]->Is & kHBAErrTaskFile) { ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); } @@ -224,29 +213,33 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi) const UInt8 kSATAPresent = 0x03; const UInt8 kSATAIPMActive = 0x01; - while (ahci_index < kMaxPortsImplemented) + while (ports_implemented) { - if (ports_implemented) - { - UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F; - UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F; + UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F; + UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F; - if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kSATAPresent && ipm == kSATAIPMActive) - { - kSATAIndex = ahci_index; - kSATA = mem_ahci; + if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kSATAPresent && ipm == kSATAIPMActive) + { + kout << (atapi ? "Detect: /dev/atp" : "Detect: /dev/sat") << number(ahci_index) << endl; - drv_compute_disk_ahci(); + kSATAIndex = ahci_index; + kSATA[ahci_index] = mem_ahci; - pi = ports_implemented; + pi = ports_implemented; - return YES; - } + break; } ports_implemented >>= 1; - ++ahci_index; + ahci_index++; + } + + if (ports_implemented > 0) + { + drv_compute_disk_ahci(); } + + return YES; } } diff --git a/dev/Kernel/HALKit/AMD64/Storage/DMA.cc b/dev/Kernel/HALKit/AMD64/Storage/DMA.cc index fe5aab84..06203380 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/DMA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/DMA.cc @@ -135,7 +135,7 @@ namespace Details { using namespace NeOS; - struct PRD final + struct PRDEntry { UInt32 mAddress; UInt16 mByteCount; @@ -168,10 +168,11 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16); rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24); - Details::PRD* prd = (Details::PRD*)(kATADevice.Bar(0x20) + 4); + Details::PRDEntry* prd = (Details::PRDEntry*)(kATADevice.Bar(0x20) + 4); // The PRDEntry is not correct. + prd->mAddress = (UInt32)(UIntPtr)kReadAddr; prd->mByteCount = Size - 1; - prd->mFlags = 0x8000; + prd->mFlags = 0x8000; // indicate the end of prd. rt_out32(kATADevice.Bar(0x20) + 0x04, (UInt32)(UIntPtr)prd); @@ -210,7 +211,7 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16); rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24); - Details::PRD* prd = (Details::PRD*)(kATADevice.Bar(0x20) + 4); + Details::PRDEntry* prd = (Details::PRDEntry*)(kATADevice.Bar(0x20) + 4); prd->mAddress = (UInt32)(UIntPtr)kWriteAddr; prd->mByteCount = Size - 1; prd->mFlags = 0x8000; diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc index ee8e798a..6a1191cc 100644 --- a/dev/Kernel/src/FS/NeFS.cc +++ b/dev/Kernel/src/FS/NeFS.cc @@ -1049,13 +1049,11 @@ namespace NeOS::NeFS /***********************************************************************************/ Boolean fs_init_nefs(Void) noexcept { - kout << "Creating A:\r"; + kout << "Creating main disk...\r"; kMountpoint.A() = io_construct_main_drive(); - kout << "Creating A: [ OK ]\r"; - - return true; + return kMountpoint.A().fPacket.fPacketReadOnly == NO; } } // namespace NeOS::NeFS |
