diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-03-14 08:19:35 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-03-14 08:19:35 +0100 |
| commit | b244cd4bdfb83b3f87c16f8d03725f84cfd0760e (patch) | |
| tree | 96e26346bc0ab41115c4abffa20e228a34d46008 /dev | |
| parent | 27f4afb0e6bf21124ea4ca74e38821ecfe250388 (diff) | |
AHCI: Important tweaks.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/Boot/amd64-desktop.make | 2 | ||||
| -rw-r--r-- | dev/Boot/src/HEL/AMD64/BootEFI.cc | 4 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/AHCI.cc | 35 | ||||
| -rw-r--r-- | dev/Kernel/NewKit/Macros.h | 2 | ||||
| -rw-r--r-- | dev/Mod/AHCI/AHCI.h | 30 |
5 files changed, 49 insertions, 24 deletions
diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make index cbfd9d87..2802c5e1 100644 --- a/dev/Boot/amd64-desktop.make +++ b/dev/Boot/amd64-desktop.make @@ -95,7 +95,7 @@ all: compile-amd64 .PHONY: disk disk: - dd if=/dev/zero of=$(BOOT) bs=1M count=100 + dd if=/dev/zero of=$(BOOT) bs=30M count=100 mformat -i $(BOOT) -F -v "NEOS_ESP" diff --git a/dev/Boot/src/HEL/AMD64/BootEFI.cc b/dev/Boot/src/HEL/AMD64/BootEFI.cc index 4f9087c9..84a4a777 100644 --- a/dev/Boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/Boot/src/HEL/AMD64/BootEFI.cc @@ -218,6 +218,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, syschk_thread->Start(handover_hdr, NO); } +#ifndef __AHCI__ Boot::BDiskFormatFactory<BootDeviceATA> partition_factory; if (syschk_thread->Start(handover_hdr, NO) != kEfiOk) @@ -244,7 +245,8 @@ 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/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc index e1f48503..f6656ce5 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc @@ -41,6 +41,9 @@ #define kSATASRBsy (0x80) #define kSATASRDrq (0x08) +#define kHBABohcBiosOwned (1 << 0) +#define kHBABohcOSOwned (1 << 1) + #define kSATAPortCnt (0x20) #define kSATASig (0x00000101) @@ -88,6 +91,8 @@ STATIC Void drv_compute_disk_ahci() noexcept kCurrentDiskModel[40] = '\0'; + kSATASectorCount = identify_data[60] | identify_data[61]; + kout << "Drive Model: " << kCurrentDiskModel << kendl; kout << "Disk Size: " << number(drv_get_size()) << kendl; @@ -119,9 +124,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz if (slot == ~0) return; - HbaCmdHeader* command_header = ((HbaCmdHeader*)(((UInt64)kSATAHba->Ports[kSATAIndex].Clb))); - - command_header += slot; + volatile HbaCmdHeader* command_header = ((HbaCmdHeader*)(((UInt64)kSATAHba->Ports[kSATAIndex].Clb))); MUST_PASS(command_header); @@ -146,9 +149,10 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz command_table->Prdt[i].Ie = YES; } - command_table->Prdt[i].Dba = ((UInt32)(UInt64)buffer_phys); - command_table->Prdt[i].Dbc = ((size_buffer / command_header->Prdtl - 1) - 1); - command_table->Prdt[i].Ie = YES; + command_table->Prdt[i].Dba = ((UInt32)(UInt64)buffer_phys + (i * command_table->Prdt[i].Dbc)); + command_table->Prdt[i].Dbau = (((UInt64)(buffer_phys) >> 32) + (i * command_table->Prdt[i].Dbc)); + command_table->Prdt[i].Dbc = ((size_buffer / command_header->Prdtl - 1) - 1); + command_table->Prdt[i].Ie = YES; FisRegH2D* h2d_fis = (FisRegH2D*)(&command_table->Cfis); @@ -163,7 +167,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz h2d_fis->Lba1 = (lba >> 8) & 0xFF; h2d_fis->Lba2 = (lba >> 16) & 0xFF; - h2d_fis->Device = Identify ? 0 : kSATALBAMode; + h2d_fis->Device = Identify ? 0U : kSATALBAMode; h2d_fis->Lba3 = (lba >> 24) & 0xFF; h2d_fis->Lba4 = (lba >> 32) & 0xFF; @@ -231,8 +235,8 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi) { HbaMem* mem_ahci = (HbaMem*)kSATADev.Bar(kSATABar5); - kSATADev.BecomeBusMaster((UInt32)(UIntPtr)mem_ahci); - kSATADev.EnableMmio((UInt32)(UIntPtr)mem_ahci); + kSATADev.EnableMmio((UIntPtr)mem_ahci); + kSATADev.BecomeBusMaster((UIntPtr)mem_ahci); UInt32 ports_implemented = mem_ahci->Pi; UInt16 ahci_index = 0; @@ -257,6 +261,17 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi) kout << "Detect: /dev/sat" << number(ahci_index) << kendl; kSATAIndex = ahci_index; + kSATAHba = mem_ahci; + + if (kSATAHba->Bohc & kHBABohcBiosOwned) + { + kSATAHba->Bohc |= kHBABohcOSOwned; + + while (kSATAHba->Bohc & kHBABohcBiosOwned) + { + + } + } kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre; kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdST; @@ -270,6 +285,8 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi) kout << "Detect: /dev/atp" << number(ahci_index) << kendl; kSATAIndex = ahci_index; + kSATAHba = mem_ahci; + kSATAHba->Ports[ahci_index].Cmd |= kHBAPxCmdFre | kHBAPxCmdST; kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre; diff --git a/dev/Kernel/NewKit/Macros.h b/dev/Kernel/NewKit/Macros.h index 2cdd97ed..637a2a30 100644 --- a/dev/Kernel/NewKit/Macros.h +++ b/dev/Kernel/NewKit/Macros.h @@ -51,7 +51,7 @@ #endif // #ifndef ALIGN #ifndef ATTRIBUTE -#define ATTRIBUTE(X) __attribute__((X)) +#define ATTRIBUTE(...) __attribute__((__VA_ARGS__)) #endif // #ifndef ATTRIBUTE #ifndef __NE_VER__ diff --git a/dev/Mod/AHCI/AHCI.h b/dev/Mod/AHCI/AHCI.h index 9e534a1a..d4f8ceb1 100644 --- a/dev/Mod/AHCI/AHCI.h +++ b/dev/Mod/AHCI/AHCI.h @@ -271,16 +271,22 @@ typedef struct HbaMem final typedef struct HbaCmdHeader final { // DW0 - NeOS::UInt8 Cfl : 5; // Command FIS length in DWORDS, 2 ~ 16 - NeOS::UInt8 Atapi : 1; // ATAPI - NeOS::UInt8 Write : 1; // Write, 1: H2D, 0: D2H - NeOS::UInt8 Prefetchable : 1; // Prefetchable - - NeOS::UInt8 Reset : 1; // Reset - NeOS::UInt8 BIST : 1; // BIST - NeOS::UInt8 Clear : 1; // Clear busy upon R_OK - NeOS::UInt8 Reserved0 : 1; // Reserved - NeOS::UInt8 Pmp : 4; // Port multiplier port + union { + struct + { + NeOS::UInt8 Cfl : 5; // Command FIS length in DWORDS, 2 ~ 16 + NeOS::UInt8 Atapi : 1; // ATAPI + NeOS::UInt8 Write : 1; // Write, 1: H2D, 0: D2H + NeOS::UInt8 Prefetchable : 1; // Prefetchable + + NeOS::UInt8 Reset : 1; // Reset + NeOS::UInt8 BIST : 1; // BIST + NeOS::UInt8 Clear : 1; // Clear busy upon R_OK + NeOS::UInt8 Reserved0 : 1; // Reserved + NeOS::UInt8 Pmp : 4; // Port multiplier port + }; + NeOS::UInt16 Flags; + }; NeOS::UInt16 Prdtl; // Physical region descriptor table length in entries NeOS::UInt32 Prdbc; // Physical region descriptor byte count transferred @@ -288,8 +294,8 @@ typedef struct HbaCmdHeader final NeOS::UInt32 Ctba; // Command table descriptor base address NeOS::UInt32 Ctbau; // Command table descriptor base address upper 32 bits - NeOS::UInt32 Rscv[4]; -} HbaCmdHeader; + NeOS::UInt32 Rsv[4]; +} ATTRIBUTE(packed, aligned(32)) HbaCmdHeader; typedef struct HbaFis final { |
