summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-03-14 08:19:35 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-03-14 08:19:35 +0100
commitb244cd4bdfb83b3f87c16f8d03725f84cfd0760e (patch)
tree96e26346bc0ab41115c4abffa20e228a34d46008 /dev/Kernel/HALKit
parent27f4afb0e6bf21124ea4ca74e38821ecfe250388 (diff)
AHCI: Important 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/AHCI.cc35
1 files changed, 26 insertions, 9 deletions
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;