diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-02-11 10:11:33 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-02-11 10:11:33 +0100 |
| commit | 1583ee83e3e3e49673884fbdb309911dafef215f (patch) | |
| tree | 53d3deb7c4a0da77fe3a2df983bbb665944465c8 /dev/Kernel/HALKit | |
| parent | e513a342fc619d2a84c041d69fb00638f9642573 (diff) | |
ADD: tweaks.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/SATA.cc | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc index 8e23712f..2d53fa37 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc @@ -184,7 +184,7 @@ static Kernel::Int32 drvi_find_cmd_slot(HbaPort* port) noexcept slots >>= 1; } - return -1; + return 0; } template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify> @@ -200,9 +200,7 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf if (size_buffer > mib_cast(4)) Kernel::ke_panic(RUNTIME_CHECK_FAILED, "AHCI only supports < 4mb DMA transfers."); - HbaCmdHeader* command_header = ((HbaCmdHeader*)((Kernel::UInt64)(kSATAPort->Ports[kSATAPortIdx].Clbu) + kSATAPort->Ports[kSATAPortIdx].Clb)); - - command_header += slot; + HbaCmdHeader* command_header = ((HbaCmdHeader*)((Kernel::UInt64)(kSATAPort->Ports[kSATAPortIdx].Clbu << 32) | kSATAPort->Ports[kSATAPortIdx].Clb)) + slot; MUST_PASS(command_header); @@ -210,18 +208,23 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf command_header->Write = Write; command_header->Prdtl = 1; command_header->Atapi = 0; + command_header->Prefetchable = 1; + + HbaCmdTbl* command_table = new HbaCmdTbl(); - HbaCmdTbl* command_table = (HbaCmdTbl*)((Kernel::UIntPtr)(command_header->Ctbau) + command_header->Ctba); + Kernel::rt_set_memory(command_table, 0, sizeof(HbaCmdTbl)); MUST_PASS(command_table); - command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer)); + command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer) & 0xFFFFFFFF); command_table->Prdt[0].Dbau = (((Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer) >> 32)); command_table->Prdt[0].Dbc = ((size_buffer)-1); command_table->Prdt[0].IE = 1; - command_header->Ctba = ((Kernel::UInt32)(Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer)); - command_header->Ctbau = ((Kernel::UInt32)((Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer) >> 32)); + auto phys_dma = Kernel::HAL::hal_get_phys_address(command_table); + + command_header->Ctba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma & 0xFFFFFFFF); + command_header->Ctbau = ((Kernel::UInt32)((Kernel::UInt64)phys_dma >> 32)); FisRegH2D* h2d_fis = (FisRegH2D*)((Kernel::UInt64)&command_table->Cfis); @@ -258,7 +261,7 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf while (YES) { - if ((kSATAPort->Ports[kSATAPortIdx].Ci & (1 << slot)) == 0) + if (kSATAPort->Ports[kSATAPortIdx].Ci == 0) break; if (kSATAPort->Is & kHBAErrTaskFile) @@ -269,6 +272,9 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf { kout << "Waiting for the TFD to be ready...\r"; } + + delete command_table; + command_table = nullptr; } /*** |
