summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/Boot/amd64-desktop.make20
-rw-r--r--dev/Boot/src/HEL/AMD64/BootEFI.cc2
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/SATA.cc49
-rw-r--r--dev/Mod/AHCI/AHCI.h3
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 */