From 3effa2d2e513f81e633079c395ae8544031edd6d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 11 Feb 2025 10:29:48 +0100 Subject: ADD: Tweaks and improvements on AHCI. Signed-off-by: Amlal El Mahrouss --- dev/Boot/amd64-desktop.make | 5 ++- dev/Kernel/HALKit/AMD64/HalDebugOutput.cc | 2 +- dev/Kernel/HALKit/AMD64/Storage/SATA.cc | 53 +++++++++++-------------------- dev/Kernel/KernelKit/DriveMgr.h | 8 ++--- dev/Kernel/KernelKit/PCI/Device.h | 2 +- dev/Kernel/NewKit/Array.h | 2 +- dev/Kernel/NewKit/ArrayList.h | 4 +-- dev/Usr/LibCF/Array.h | 6 ++-- dev/Usr/LibCF/Property.h | 18 +++++------ dev/Usr/LibCF/Ref.h | 2 +- 10 files changed, 42 insertions(+), 60 deletions(-) (limited to 'dev') diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make index 7d25645e..f1bd60f1 100644 --- a/dev/Boot/amd64-desktop.make +++ b/dev/Boot/amd64-desktop.make @@ -30,8 +30,7 @@ IMG_2=epm-master-2.img EMU_FLAGS=-net none -smp 4 -m 8G \ -bios $(BIOS) -drive \ - file=fat:rw:src/Root/,index=3,format=raw \ - -serial stdio + file=fat:rw:src/Root/,index=3,format=raw LD_FLAGS=-e Main --subsystem=10 @@ -82,7 +81,7 @@ compile-amd64: .PHONY: run-efi-amd64-ahci run-efi-amd64-ahci: - $(EMU) $(EMU_FLAGS) -M q35 -hda $(IMG) -s -S + $(EMU) $(EMU_FLAGS) -M q35 -hda $(IMG) -s -S -trace ahci_* .PHONY: run-efi-amd64-ata-pio run-efi-amd64-ata-pio: diff --git a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc index a95b444e..a51a1e15 100644 --- a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc @@ -126,7 +126,7 @@ namespace Kernel fb_init(); FBDrawInRegion(fb_get_clear_clr(), FB::UIAccessibilty::Height(), FB::UIAccessibilty::Width(), - 0, 0); + 0, 0); fb_clear(); } diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc index 2d53fa37..58435c8d 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc @@ -27,6 +27,7 @@ #ifdef __AHCI__ #define kHBAErrTaskFile (1 << 30) +#define kHBACmdGhc (1 << 31) #define kHBAPxCmdST 0x0001 #define kHBAPxCmdFre 0x0010 #define kHBAPxCmdFR 0x4000 @@ -91,7 +92,7 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) HbaMem* mem_ahci = (HbaMem*)kPCIDevice.Bar(kSATABar5); - kout << hex_number((UIntPtr)mem_ahci) << endl; + kout << hex_number((UIntPtr)mem_ahci) << endl; Kernel::UInt32 ports_implemented = mem_ahci->Pi; Kernel::UInt16 ahci_index = 0; @@ -115,32 +116,9 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) kSATAPortIdx = ahci_index; kSATAPort = mem_ahci; - kSATAPort->Ports[kSATAPortIdx].Cmd &= ~kHBAPxCmdST; - kSATAPort->Ports[kSATAPortIdx].Cmd &= ~kHBAPxCmdFre; - - while (YES) - { - if (kSATAPort->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR) - continue; - - if (kSATAPort->Ports[kSATAPortIdx].Cmd & kHBAPxCmdFR) - continue; - - break; - } - - kSATAPort->Ghc |= (1 << 31); - - while (YES) - { - if (kSATAPort->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR) - continue; - - break; - } - kSATAPort->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdFre; kSATAPort->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdST; + kSATAPort->Ghc |= kHBACmdGhc; drvi_calculate_disk_geometry(); @@ -204,10 +182,10 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf MUST_PASS(command_header); - command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32); - command_header->Write = Write; - command_header->Prdtl = 1; - command_header->Atapi = 0; + command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32); + command_header->Write = Write; + command_header->Prdtl = 1; + command_header->Atapi = 0; command_header->Prefetchable = 1; HbaCmdTbl* command_table = new HbaCmdTbl(); @@ -216,15 +194,17 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf MUST_PASS(command_table); - 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)); + auto phys_dma_buf = Kernel::HAL::hal_get_phys_address(buffer); + + command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma_buf & 0xFFFFFFFF); + command_table->Prdt[0].Dbau = (((Kernel::UInt64)phys_dma_buf << 32)); command_table->Prdt[0].Dbc = ((size_buffer)-1); command_table->Prdt[0].IE = 1; - 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)); + auto phys_dma_tbl = Kernel::HAL::hal_get_phys_address(command_table); + + command_header->Ctba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma_tbl & 0xFFFFFFFF); + command_header->Ctbau = ((Kernel::UInt32)((Kernel::UInt64)phys_dma_tbl << 32)); FisRegH2D* h2d_fis = (FisRegH2D*)((Kernel::UInt64)&command_table->Cfis); @@ -264,6 +244,9 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf if (kSATAPort->Ports[kSATAPortIdx].Ci == 0) break; + kout << "AHCI Interrupt Status: " << Kernel::hex_number(kSATAPort->Is) << endl; + kout << "PxCMD: " << Kernel::hex_number(kSATAPort->Ports[kSATAPortIdx].Cmd) << endl; + if (kSATAPort->Is & kHBAErrTaskFile) Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); } diff --git a/dev/Kernel/KernelKit/DriveMgr.h b/dev/Kernel/KernelKit/DriveMgr.h index 28c2fdad..997db1f9 100644 --- a/dev/Kernel/KernelKit/DriveMgr.h +++ b/dev/Kernel/KernelKit/DriveMgr.h @@ -30,11 +30,11 @@ namespace Kernel kInvalidDrive = -1, /// Storage types, combine with flags. - kBlockDevice = 0xAD, + kBlockDevice = 0xAD, kMassStorageDrive = 0xDA, - kFloppyDrive = 0xCD, - kOpticalDrive = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray - kTapeDrive = 0xD7, + kFloppyDrive = 0xCD, + kOpticalDrive = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray + kTapeDrive = 0xD7, /// Storage flags, combine with types. kReadOnlyDrive = 0x10, // Read only drive diff --git a/dev/Kernel/KernelKit/PCI/Device.h b/dev/Kernel/KernelKit/PCI/Device.h index 7af2381d..cb463485 100644 --- a/dev/Kernel/KernelKit/PCI/Device.h +++ b/dev/Kernel/KernelKit/PCI/Device.h @@ -13,7 +13,7 @@ namespace Kernel::PCI { ConfigAddress = 0xCF8, ConfigData = 0xCFC, - CommandReg = 0x0004, + CommandReg = 0x0004, Invalid = 0xFFFF, }; diff --git a/dev/Kernel/NewKit/Array.h b/dev/Kernel/NewKit/Array.h index aab3ba91..43c67586 100644 --- a/dev/Kernel/NewKit/Array.h +++ b/dev/Kernel/NewKit/Array.h @@ -24,7 +24,7 @@ namespace Kernel T& operator[](const SizeT& at) { - MUST_PASS(at < this->Count()); + MUST_PASS(at < this->Count()); return fArray[at]; } diff --git a/dev/Kernel/NewKit/ArrayList.h b/dev/Kernel/NewKit/ArrayList.h index a0d4388e..e05480f0 100644 --- a/dev/Kernel/NewKit/ArrayList.h +++ b/dev/Kernel/NewKit/ArrayList.h @@ -36,7 +36,7 @@ namespace Kernel T& operator[](int index) const { - MUST_PASS(index < this->Count()); + MUST_PASS(index < this->Count()); return fList[index]; } @@ -51,7 +51,7 @@ namespace Kernel } private: - T* fList{nullptr}; + T* fList{nullptr}; SizeT fLen{0}; }; diff --git a/dev/Usr/LibCF/Array.h b/dev/Usr/LibCF/Array.h index 8533b649..acd72f95 100644 --- a/dev/Usr/LibCF/Array.h +++ b/dev/Usr/LibCF/Array.h @@ -15,14 +15,14 @@ namespace LibCF { public: explicit CFArray() = default; - ~CFArray() = default; + ~CFArray() = default; CFArray& operator=(const CFArray&) = default; CFArray(const CFArray&) = default; T& operator[](const SizeT& at) { - MUST_PASS(at < this->Count()); + MUST_PASS(at < this->Count()); return fArray[at]; } @@ -60,4 +60,4 @@ namespace LibCF { return CFArray{val}; } -} // namespace Kernel +} // namespace LibCF diff --git a/dev/Usr/LibCF/Property.h b/dev/Usr/LibCF/Property.h index 629dba27..5c2916f4 100644 --- a/dev/Usr/LibCF/Property.h +++ b/dev/Usr/LibCF/Property.h @@ -14,11 +14,11 @@ namespace LibCF { - class CFString; - class CFProperty; + class CFString; + class CFProperty; class CFGUID; - template + template class CFArray; /// @brief handle to anything (number, ptr, string...) @@ -36,18 +36,18 @@ namespace LibCF CFProperty& operator=(const CFProperty&) = default; CFProperty(const CFProperty&) = default; - Bool StringEquals(CFString& name); + Bool StringEquals(CFString& name); CFPropertyId& GetValue(); - CFString& GetKey(); + CFString& GetKey(); private: - CFString* fName{nullptr}; - CFPropertyId fValue{0UL}; - Ref fGUID{}; + CFString* fName{nullptr}; + CFPropertyId fValue{0UL}; + Ref fGUID{}; }; template using CFPropertyArray = CFArray; -} // namespace CFKit +} // namespace LibCF #endif // !CFKIT_PROPS_H diff --git a/dev/Usr/LibCF/Ref.h b/dev/Usr/LibCF/Ref.h index faad67c5..18321e3b 100644 --- a/dev/Usr/LibCF/Ref.h +++ b/dev/Usr/LibCF/Ref.h @@ -101,6 +101,6 @@ namespace LibCF private: Ref fRef{nullptr}; }; -} // namespace Kernel +} // namespace LibCF #endif // ifndef _NEWKIT_REF_H_ -- cgit v1.2.3