diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2025-02-15 10:55:46 +0100 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2025-02-15 10:55:58 +0100 |
| commit | 9d340d010d80b074fa9b038087a499ac4009ead1 (patch) | |
| tree | 2dbd59e26d58e3a8a24853c97629e5d9cc05c09f /dev | |
| parent | 5961b530b3d28a2258268c37d69dca22cc3a2423 (diff) | |
ADD: Almost done on AHCI:
- Got the HBA to respond.
- Got it to do some transfers.
- Now debugging a GPF.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/Boot/amd64-desktop.make | 20 | ||||
| -rw-r--r-- | dev/Boot/src/HEL/AMD64/BootEFI.cc | 2 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/SATA.cc | 49 | ||||
| -rw-r--r-- | dev/Mod/AHCI/AHCI.h | 3 |
4 files changed, 36 insertions, 38 deletions
diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make index aa48a2e1..bb5deb71 100644 --- a/dev/Boot/amd64-desktop.make +++ b/dev/Boot/amd64-desktop.make @@ -28,6 +28,24 @@ BIOS=OVMF.fd IMG=epm-master-1.img IMG_2=epm-master-2.img +DISK_DRV = + +ifneq ($(ATA_PIO_SUPPORT), ) +DISK_DRV = -D__ATA_PIO__ +endif + +ifneq ($(ATA_DMA_SUPPORT), ) +DISK_DRV = -D__ATA_DMA__ +endif + +ifneq ($(AHCI_SUPPORT), ) +DISK_DRV = -D__AHCI__ +endif + +ifneq ($(DEBUG_SUPPORT), ) +DEBUG_MACRO = -D__DEBUG__ +endif + ifeq ($(shell uname), Darwin) EMU_FLAGS=-net none -smp 4 -m 8G \ -bios $(BIOS) -drive \ @@ -50,7 +68,7 @@ REM_FLAG=-f FLAG_ASM=-f win64 FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__NEOSKRNL__ -D__ZBAOSLDR__ \ - -DEFI_FUNCTION_WRAPPER -I./ -I../Kernel -I../ -c -nostdlib -fno-rtti -fno-exceptions \ + -DEFI_FUNCTION_WRAPPER -I./ -I../Kernel $(DISK_DRV) -I../ -c -nostdlib -fno-rtti -fno-exceptions \ -std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_NE_APIS__ -DZBA_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT BOOTLOADER=zbaosldr.exe diff --git a/dev/Boot/src/HEL/AMD64/BootEFI.cc b/dev/Boot/src/HEL/AMD64/BootEFI.cc index c6d1ca9d..b3e03f01 100644 --- a/dev/Boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/Boot/src/HEL/AMD64/BootEFI.cc @@ -226,6 +226,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, syschk_thread->SetName("BootZ: System Recovery Check"); } +#ifndef __AHCI__ Boot::BDiskFormatFactory<BootDeviceATA> partition_factory; if (syschk_thread->Start(handover_hdr, NO) != kEfiOk) @@ -252,6 +253,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, fb_clear(); } } +#endif // ------------------------------------------ // // null these fields, to avoid being reused later. diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc index 34acb0a7..375fee08 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc @@ -15,6 +15,8 @@ * */ +#include "HALKit/AMD64/Processor.h" +#include "NewKit/Macros.h" #include <KernelKit/UserProcessScheduler.h> #include <KernelKit/LPC.h> @@ -64,7 +66,7 @@ static Kernel::Void drvi_calculate_disk_geometry() noexcept Kernel::UInt8 identify_data[512] = {}; - drvi_std_input_output<NO, NO, YES>(0, identify_data, 0, 512); + drvi_std_input_output<NO, YES, YES>(0, identify_data, 0, 512); kCurrentDiskSectorCount = (identify_data[61] << 16) | identify_data[60]; @@ -104,8 +106,6 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) HbaMem* mem_ahci = (HbaMem*)kDevice.Bar(kSATABar5); - kout << hex_number((UIntPtr)mem_ahci) << endl; - Kernel::UInt32 ports_implemented = mem_ahci->Pi; Kernel::UInt16 ahci_index = 0; @@ -131,22 +131,7 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) kSATAPortIdx = ahci_index; kSATA = mem_ahci; - // Restart the HBA. - - kSATA->Ports[kSATAPortIdx].Cmd &= ~(kHBAPxCmdST | kHBAPxCmdFre); // Disable command and FIS reception - - while (kSATA->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR) - ; // Wait for controller to stop - - kSATA->Ports[kSATAPortIdx].Serr = 0xFFFFFFFF; // Clear errors - kSATA->Ports[kSATAPortIdx].Is = 0xFFFFFFFF; // Clear interrupts - - kSATA->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdFre; // Re-enable FIS reception - kSATA->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdST; // Start command engine - - kSATA->Ghc |= kHBACmdAE; // Enable AHCI mode - - HAL::rt_wait_400ns(); + kSATA->Ghc |= kHBACmdAE; drvi_calculate_disk_geometry(); @@ -184,7 +169,7 @@ static Kernel::Int32 drvi_find_cmd_slot(HbaPort* port) noexcept for (Kernel::Int32 i = 0; i < kSATAPortCnt; i++) { - if ((slots & i) == 0) + if ((slots & 1) == 0) return i; slots >>= 1; @@ -209,8 +194,6 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf HbaCmdHeader* command_header = ((HbaCmdHeader*)((Kernel::UInt64)(kSATA->Ports[kSATAPortIdx].Clb))); - TRY([&command_header]() -> BOOL { return command_header != nullptr; }); - command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32); command_header->Write = Write; command_header->Prdtl = 1; @@ -223,10 +206,10 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf MUST_PASS(command_table); - auto phys_dma_buf = Kernel::HAL::hal_get_phys_address((Kernel::VoidPtr)buffer); + auto phys_dma_buf = (Kernel::UIntPtr)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].Dbau = (((Kernel::UInt64)phys_dma_buf >> 32)); + command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma_buf & 0xFFFFFFFF); command_table->Prdt[0].Dbc = ((size_buffer)-1); command_table->Prdt[0].IE = 1; @@ -259,20 +242,12 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf while (kSATA->Ports[kSATAPortIdx].Cmd & (kHBAPxCmdCR | kHBAPxCmdFR)) ; // Ensure controller is idle - kSATA->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdFre; kSATA->Ports[kSATAPortIdx].Ci = (1 << slot); +} - while (YES) - { - if (kSATA->Ports[kSATAPortIdx].Ci == 0) - break; - - kout << "PxCI: " << Kernel::hex_number(kSATA->Ports[kSATAPortIdx].Ci) << endl; - kout << "PxCMD: " << Kernel::hex_number(kSATA->Ports[kSATAPortIdx].Cmd) << endl; - - if (kSATA->Is & kHBAErrTaskFile) - Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component."); - } +BOOL drv_is_ready(void) +{ + return kSATA->Ports[kSATAPortIdx].Is == 0; } /*** diff --git a/dev/Mod/AHCI/AHCI.h b/dev/Mod/AHCI/AHCI.h index 127518c9..cccef303 100644 --- a/dev/Mod/AHCI/AHCI.h +++ b/dev/Mod/AHCI/AHCI.h @@ -358,6 +358,9 @@ Kernel::SizeT drv_get_sector_count(); /// @brief Gets the AHCI disk size. Kernel::SizeT drv_get_size(); +/// @brief Checks if the drive has completed the command. +BOOL drv_is_ready(void); + #endif // ifdef __AHCI__ /* EOF */ |
