summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2025-03-03 12:48:17 +0100
committerAmlal <amlal.elmahrouss@icloud.com>2025-03-03 12:48:17 +0100
commitfe61c5e33bd2a739885f3f7edc3c0c0798f918c7 (patch)
tree1cbe3cfdabd7a59b585cf7327c57d06f8c35d54f /dev
parentbdfc8770e68da75c20e4127a9dd10f8a7c36810d (diff)
AHCI: Improvements and tweaks.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/AHCI.cc73
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/DMA.cc9
-rw-r--r--dev/Kernel/src/FS/NeFS.cc6
3 files changed, 40 insertions, 48 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
index 30bd4e78..35d6ba66 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
@@ -58,9 +58,9 @@ STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept;
STATIC Void drv_compute_disk_ahci() noexcept;
STATIC PCI::Device kPCIDevice;
-STATIC HbaMem* kSATA = nullptr;
-STATIC SizeT kSATAIndex = 0UL;
-STATIC Lba kHighestLBA = 0UL;
+STATIC HbaMem* kSATA[kSATAPortCnt] = {};
+STATIC SizeT kSATAIndex = 0UL;
+STATIC Lba kHighestLBA = 0UL;
STATIC UInt16 kSATAPortsImplemented = 0U;
@@ -86,10 +86,7 @@ STATIC Void drv_compute_disk_ahci() noexcept
STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept
{
- if (port == nullptr)
- return ~0;
-
- UInt32 slots = (kSATA->Ports[kSATAIndex].Sact | kSATA->Ports[kSATAIndex].Ci);
+ UInt32 slots = (port->Sact | port->Ci);
for (Int32 i = 0; i < kSATAPortCnt; ++i)
{
@@ -107,14 +104,14 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
{
UIntPtr slot = 0UL;
- slot = drv_find_cmd_slot(&kSATA->Ports[kSATAIndex]);
+ slot = drv_find_cmd_slot(&kSATA[kSATAIndex]->Ports[kSATAIndex]);
if (slot == ~0)
return;
- HbaCmdHeader* command_header = ((HbaCmdHeader*)((UInt64)kSATA->Ports[kSATAIndex].Clb));
+ HbaCmdHeader* command_header = ((HbaCmdHeader*)((UInt64)kSATA[kSATAIndex]->Ports[kSATAIndex].Clb));
- command_header = (sizeof(HbaCmdHeader) * slot) + command_header;
+ command_header += slot;
MUST_PASS(command_header);
@@ -128,8 +125,8 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
UIntPtr buffer_phys = HAL::hal_get_phys_address(buffer);
- command_table->Prdt[0].Dba = ((UInt32)(UInt64)buffer_phys & __UINT32_MAX__);
- command_table->Prdt[0].Dbau = (((UInt64)(buffer_phys) >> 32) & __UINT32_MAX__);
+ command_table->Prdt[0].Dba = ((UInt32)(UInt64)buffer_phys);
+ command_table->Prdt[0].Dbau = (((UInt64)(buffer_phys) >> 32));
command_table->Prdt[0].Dbc = ((size_buffer)-1);
command_table->Prdt[0].Ie = YES;
@@ -142,7 +139,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
if (Identify)
h2d_fis->Command = kAHCICmdIdentify;
- h2d_fis->Lba0 = (lba)&0xFF;
+ h2d_fis->Lba0 = (lba) & 0xFF;
h2d_fis->Lba1 = (lba >> 8) & 0xFF;
h2d_fis->Lba2 = (lba >> 16) & 0xFF;
@@ -152,27 +149,19 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
h2d_fis->Lba4 = (lba >> 32) & 0xFF;
h2d_fis->Lba5 = (lba >> 40) & 0xFF;
- h2d_fis->CountLow = (size_buffer)&0xFF;
+ h2d_fis->CountLow = (size_buffer) & 0xFF;
h2d_fis->CountHigh = (size_buffer >> 8) & 0xFF;
- while ((kSATA->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)))
+ while ((kSATA[kSATAIndex]->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)))
{
kout << "Waiting for TFD...\r";
}
- kSATA->Ports[kSATAIndex].Ci = (1 << slot);
- kAHCICommandIssued = YES;
-
- while (kSATA->Ports[kSATAIndex].Ci & (1 << slot))
- {
- if (kSATA->Is & kHBAErrTaskFile)
- {
- ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component.");
- }
- }
+ kSATA[kSATAIndex]->Ports[kSATAIndex].Ci = (1 << slot);
+ kAHCICommandIssued = YES;
// check again.
- if (kSATA->Is & kHBAErrTaskFile)
+ if (kSATA[kSATAIndex]->Is & kHBAErrTaskFile)
{
ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component.");
}
@@ -224,29 +213,33 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi)
const UInt8 kSATAPresent = 0x03;
const UInt8 kSATAIPMActive = 0x01;
- while (ahci_index < kMaxPortsImplemented)
+ while (ports_implemented)
{
- if (ports_implemented)
- {
- UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F;
- UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F;
+ UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F;
+ UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F;
- if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kSATAPresent && ipm == kSATAIPMActive)
- {
- kSATAIndex = ahci_index;
- kSATA = mem_ahci;
+ if (mem_ahci->Ports[ahci_index].Sig == kSATASignature && det == kSATAPresent && ipm == kSATAIPMActive)
+ {
+ kout << (atapi ? "Detect: /dev/atp" : "Detect: /dev/sat") << number(ahci_index) << endl;
- drv_compute_disk_ahci();
+ kSATAIndex = ahci_index;
+ kSATA[ahci_index] = mem_ahci;
- pi = ports_implemented;
+ pi = ports_implemented;
- return YES;
- }
+ break;
}
ports_implemented >>= 1;
- ++ahci_index;
+ ahci_index++;
+ }
+
+ if (ports_implemented > 0)
+ {
+ drv_compute_disk_ahci();
}
+
+ return YES;
}
}
diff --git a/dev/Kernel/HALKit/AMD64/Storage/DMA.cc b/dev/Kernel/HALKit/AMD64/Storage/DMA.cc
index fe5aab84..06203380 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/DMA.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/DMA.cc
@@ -135,7 +135,7 @@ namespace Details
{
using namespace NeOS;
- struct PRD final
+ struct PRDEntry
{
UInt32 mAddress;
UInt16 mByteCount;
@@ -168,10 +168,11 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz
rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
- Details::PRD* prd = (Details::PRD*)(kATADevice.Bar(0x20) + 4);
+ Details::PRDEntry* prd = (Details::PRDEntry*)(kATADevice.Bar(0x20) + 4); // The PRDEntry is not correct.
+
prd->mAddress = (UInt32)(UIntPtr)kReadAddr;
prd->mByteCount = Size - 1;
- prd->mFlags = 0x8000;
+ prd->mFlags = 0x8000; // indicate the end of prd.
rt_out32(kATADevice.Bar(0x20) + 0x04, (UInt32)(UIntPtr)prd);
@@ -210,7 +211,7 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS
rt_out8(IO + ATA_REG_LBA2, (Lba) >> 16);
rt_out8(IO + ATA_REG_LBA3, (Lba) >> 24);
- Details::PRD* prd = (Details::PRD*)(kATADevice.Bar(0x20) + 4);
+ Details::PRDEntry* prd = (Details::PRDEntry*)(kATADevice.Bar(0x20) + 4);
prd->mAddress = (UInt32)(UIntPtr)kWriteAddr;
prd->mByteCount = Size - 1;
prd->mFlags = 0x8000;
diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc
index ee8e798a..6a1191cc 100644
--- a/dev/Kernel/src/FS/NeFS.cc
+++ b/dev/Kernel/src/FS/NeFS.cc
@@ -1049,13 +1049,11 @@ namespace NeOS::NeFS
/***********************************************************************************/
Boolean fs_init_nefs(Void) noexcept
{
- kout << "Creating A:\r";
+ kout << "Creating main disk...\r";
kMountpoint.A() = io_construct_main_drive();
- kout << "Creating A: [ OK ]\r";
-
- return true;
+ return kMountpoint.A().fPacket.fPacketReadOnly == NO;
}
} // namespace NeOS::NeFS