diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-02-04 09:41:02 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-02-04 09:41:02 +0100 |
| commit | 73044afd9c61642b4c8217befa1ded3849685554 (patch) | |
| tree | 1a7cd9ad6a6f7ab5db46914fb3deaab49f9898a1 /dev/Kernel/HALKit/AMD64/Storage | |
| parent | f5b6f148a8c10673e3ef268d3fe76b31902c5930 (diff) | |
ADD: Important refactors regarding NeKernel.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit/AMD64/Storage')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/ATA.cc | 8 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/SATA.cc | 101 |
2 files changed, 60 insertions, 49 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/ATA.cc b/dev/Kernel/HALKit/AMD64/Storage/ATA.cc index 697d08e9..dcb6d816 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/ATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/ATA.cc @@ -75,7 +75,7 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) ; if (!timeout) { - kcout << "Timeout waiting for drive to become ready...\r"; + kout << "Timeout waiting for drive to become ready...\r"; return false; } @@ -89,7 +89,7 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) UInt8 status = rt_in8(IO + ATA_REG_STATUS); if (status & ATA_SR_ERR) { - kcout << "ATA Error, aborting...\r"; + kout << "ATA Error, aborting...\r"; return false; } @@ -107,7 +107,7 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) // Step 7: Check if the drive supports DMA if (!(kATAData[63] & (1 << 8)) || !(kATAData[88] & 0xFF)) { - kcout << "No DMA support...\r"; + kout << "No DMA support...\r"; ke_panic(RUNTIME_CHECK_BOOTSTRAP, "No DMA support on necessary disk driver."); return false; @@ -123,7 +123,7 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) ; if (!timeout) { - kcout << "DMA Initialization Timeout...\r"; + kout << "DMA Initialization Timeout...\r"; return false; } #endif // __ATA_DMA__ diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc index 42d33783..16aef2e2 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc @@ -15,6 +15,7 @@ * */ +#include "NewKit/Defines.h" #include <KernelKit/UserProcessScheduler.h> #include <KernelKit/LPC.h> @@ -37,14 +38,11 @@ #define kAhciSRBsy (0x80) #define kAhciSRDrq (0x08) -#define kAhciPortCnt 32 +#define kAhciPortCnt (0x20) -enum -{ - kSATAProgIfAHCI = 0x01, - kSATASubClass = 0x06, - kSATABar5 = 0x24, -}; +#define kSATAProgIfAHCI (0x01) +#define kSATASubClass (0x06) +#define kSATABar5 (0x24) STATIC Kernel::PCI::Device kPCIDevice; STATIC HbaMem* kSATAPort = nullptr; @@ -68,8 +66,8 @@ static Kernel::Void drv_calculate_disk_geometry() noexcept kCurrentDiskSectorCount = (identify_data[61] << 16) | identify_data[60]; - kcout << "Disk Size: " << Kernel::number(drv_get_size()) << endl; - kcout << "Highest Disk LBA: " << Kernel::number(kCurrentDiskSectorCount) << endl; + kout << "Disk Size: " << Kernel::number(drv_get_size()) << endl; + kout << "Highest Disk LBA: " << Kernel::number(kCurrentDiskSectorCount) << endl; } /// @brief Initializes an AHCI disk. @@ -108,14 +106,14 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) { if (ports_implemented) { - kcout << "Port is implemented.\r"; + kout << "Port is implemented.\r"; Kernel::UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F; Kernel::UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F; if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == 3 && ipm == 1) { - kcout << "Port is implemented as SATA.\r"; + kout << "Port is implemented as SATA.\r"; kSATAPortIdx = ahci_index; kSATAPort = mem_ahci; @@ -219,11 +217,6 @@ static Kernel::Int32 drv_find_cmd_slot(HbaPort* port) noexcept template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify> static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buffer, Kernel::SizeT sector_sz, Kernel::SizeT size_buffer) noexcept { - if (!CommandOrCTRL) - return; - - kSATAPort->Ports[kSATAPortIdx].Is = -1; - auto slot = 0L; slot = drv_find_cmd_slot(&kSATAPort->Ports[kSATAPortIdx]); @@ -231,46 +224,50 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff if (slot == -1) return; - volatile HbaCmdHeader* command_header = ((volatile HbaCmdHeader*)((Kernel::UInt64)kSATAPort->Ports[kSATAPortIdx].Clb + kSATAPort->Ports[kSATAPortIdx].Clbu)); + HbaCmdHeader* command_header = ((HbaCmdHeader*)((Kernel::UInt64)kSATAPort->Ports[kSATAPortIdx].Clb + kSATAPort->Ports[kSATAPortIdx].Clbu)); - command_header += slot; + Kernel::rt_set_memory(reinterpret_cast<Kernel::VoidPtr>(command_header), 0, sizeof(HbaCmdHeader)); MUST_PASS(command_header); command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32); command_header->Write = Write; - command_header->Prdtl = (Kernel::UInt16)((size_buffer - 1) >> 4) + 1; + command_header->Prdtl = 1; + + HbaCmdTbl* command_table = new HbaCmdTbl(); - volatile HbaCmdTbl* command_table = (volatile HbaCmdTbl*)((Kernel::UInt64)command_header->Ctba + command_header->Ctbau); + Kernel::rt_set_memory(reinterpret_cast<Kernel::VoidPtr>(command_table), 0, sizeof(HbaCmdTbl)); MUST_PASS(command_table); - for (Kernel::SizeT i = 0; i < (command_header->Prdtl - 1); i++) - { - command_table->PrdtEntries[i].Dba = ((Kernel::UInt32)(Kernel::UInt64)buffer & 0xFFFFFFFF); - command_table->PrdtEntries[i].Dbau = (((Kernel::UInt64)buffer >> 32) & 0xFFFFFFFF); - command_table->PrdtEntries[i].Dbc = (size_buffer - 1); - command_table->PrdtEntries[i].InterruptBit = YES; + command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)buffer); + command_table->Prdt[0].Dbau = (((Kernel::UInt64)buffer >> 32)); + command_table->Prdt[0].Dbc = ((size_buffer)-1); + command_table->Prdt[0].InterruptBit = 1; - size_buffer -= 16; - buffer += kib_cast(4); - } + command_header->Ctba = ((Kernel::UInt32)(Kernel::UInt64)command_table); + command_header->Ctbau = ((Kernel::UInt32)((Kernel::UInt64)command_table >> 32)); - volatile FisRegH2D* h2d_fis = (volatile FisRegH2D*)((Kernel::UInt64)command_table->Cfis); + FisRegH2D* h2d_fis = (FisRegH2D*)((Kernel::UInt64)command_table->Cfis); - h2d_fis->FisType = kFISTypeRegH2D; + Kernel::rt_set_memory(reinterpret_cast<Kernel::VoidPtr>(h2d_fis), 0, sizeof(FisRegH2D)); + h2d_fis->FisType = kFISTypeRegH2D; h2d_fis->CmdOrCtrl = CommandOrCTRL; - - h2d_fis->Command = Write ? kAHCICmdWriteDmaEx : kAHCICmdReadDmaEx; + h2d_fis->Command = Write ? kAHCICmdWriteDmaEx : kAHCICmdReadDmaEx; if (Identify) h2d_fis->Command = kAHCICmdIdentify; - h2d_fis->Lba0 = lba; - h2d_fis->Lba1 = lba >> 8; - h2d_fis->Lba2 = lba >> 16; - h2d_fis->Lba3 = lba >> 24; + h2d_fis->FeatureLow = h2d_fis->FeatureLow | 1; + h2d_fis->FeatureLow = h2d_fis->FeatureLow | (1 << 2); + + h2d_fis->Lba0 = (lba & 0xFF); + h2d_fis->Lba1 = (lba >> 8) & 0xFF; + h2d_fis->Lba2 = (lba >> 16) & 0xFF; + h2d_fis->Lba3 = (lba >> 24) & 0xFF; + h2d_fis->Lba4 = (lba >> 32) & 0xFF; + h2d_fis->Lba5 = (lba >> 40) & 0xFF; h2d_fis->Device = kSataLBAMode; @@ -281,25 +278,39 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff while ((kSATAPort->Ports[kSATAPortIdx].Tfd & (kAhciSRBsy | kAhciSRDrq))) { - kcout << "Waiting for slot to be ready...\r\n"; + kout << "Waiting for the tfd to be ready...\r"; } if (kSATAPort->Is & kHBAErrTaskFile) Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); - // send fis/cmdtbl/cmdhdr. - kSATAPort->Ports[kSATAPortIdx].Ci = 1 << slot; + FisRegD2H* d2h_fis = new FisRegD2H(); - while (kSATAPort->Ports[kSATAPortIdx].Ci & (1 << slot)) - ; + kSATAPort->Ports[kSATAPortIdx].Fb = (Kernel::UInt32)((Kernel::UInt64)d2h_fis); + kSATAPort->Ports[kSATAPortIdx].Fbu = (Kernel::UInt32)((Kernel::UInt64)d2h_fis >> 32); + + kSATAPort->Ports[kSATAPortIdx].Ci = (1 << slot); + + while (YES) + { + if ((kSATAPort->Ports[kSATAPortIdx].Ci & (1 << slot)) == 0) + break; + + if (kSATAPort->Is & kHBAErrTaskFile) + Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); + + kout << "Waiting for the slot to be ready...\r"; + kout << "CI: " << Kernel::hex_number(kSATAPort->Ports[kSATAPortIdx].Ci) << endl; + kout << "TFD: " << Kernel::hex_number(kSATAPort->Ports[kSATAPortIdx].Tfd) << endl; + } while ((kSATAPort->Ports[kSATAPortIdx].Tfd & (kAhciSRBsy | kAhciSRDrq))) { - kcout << "Waiting for slot to be ready...\r\n"; + kout << "Waiting for the tfd to be ready...\r"; } - if (kSATAPort->Is & kHBAErrTaskFile) - Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); + delete command_table; + command_table = nullptr; } /*** |
