summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'dev/Kernel')
-rw-r--r--dev/Kernel/HALKit/AMD64/HalDebugOutput.cc2
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/SATA.cc53
-rw-r--r--dev/Kernel/KernelKit/DriveMgr.h8
-rw-r--r--dev/Kernel/KernelKit/PCI/Device.h2
-rw-r--r--dev/Kernel/NewKit/Array.h2
-rw-r--r--dev/Kernel/NewKit/ArrayList.h4
6 files changed, 27 insertions, 44 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc
index a95b444e..a51a1e15 100644
--- a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc
+++ b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc
@@ -126,7 +126,7 @@ namespace Kernel
fb_init();
FBDrawInRegion(fb_get_clear_clr(), FB::UIAccessibilty::Height(), FB::UIAccessibilty::Width(),
- 0, 0);
+ 0, 0);
fb_clear();
}
diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc
index 2d53fa37..58435c8d 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc
@@ -27,6 +27,7 @@
#ifdef __AHCI__
#define kHBAErrTaskFile (1 << 30)
+#define kHBACmdGhc (1 << 31)
#define kHBAPxCmdST 0x0001
#define kHBAPxCmdFre 0x0010
#define kHBAPxCmdFR 0x4000
@@ -91,7 +92,7 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented)
HbaMem* mem_ahci = (HbaMem*)kPCIDevice.Bar(kSATABar5);
- kout << hex_number((UIntPtr)mem_ahci) << endl;
+ kout << hex_number((UIntPtr)mem_ahci) << endl;
Kernel::UInt32 ports_implemented = mem_ahci->Pi;
Kernel::UInt16 ahci_index = 0;
@@ -115,32 +116,9 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented)
kSATAPortIdx = ahci_index;
kSATAPort = mem_ahci;
- kSATAPort->Ports[kSATAPortIdx].Cmd &= ~kHBAPxCmdST;
- kSATAPort->Ports[kSATAPortIdx].Cmd &= ~kHBAPxCmdFre;
-
- while (YES)
- {
- if (kSATAPort->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR)
- continue;
-
- if (kSATAPort->Ports[kSATAPortIdx].Cmd & kHBAPxCmdFR)
- continue;
-
- break;
- }
-
- kSATAPort->Ghc |= (1 << 31);
-
- while (YES)
- {
- if (kSATAPort->Ports[kSATAPortIdx].Cmd & kHBAPxCmdCR)
- continue;
-
- break;
- }
-
kSATAPort->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdFre;
kSATAPort->Ports[kSATAPortIdx].Cmd |= kHBAPxCmdST;
+ kSATAPort->Ghc |= kHBACmdGhc;
drvi_calculate_disk_geometry();
@@ -204,10 +182,10 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf
MUST_PASS(command_header);
- command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32);
- command_header->Write = Write;
- command_header->Prdtl = 1;
- command_header->Atapi = 0;
+ command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32);
+ command_header->Write = Write;
+ command_header->Prdtl = 1;
+ command_header->Atapi = 0;
command_header->Prefetchable = 1;
HbaCmdTbl* command_table = new HbaCmdTbl();
@@ -216,15 +194,17 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf
MUST_PASS(command_table);
- command_table->Prdt[0].Dba = ((Kernel::UInt32)(Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer) & 0xFFFFFFFF);
- command_table->Prdt[0].Dbau = (((Kernel::UInt64)Kernel::HAL::hal_get_phys_address(buffer) >> 32));
+ auto phys_dma_buf = 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].Dbc = ((size_buffer)-1);
command_table->Prdt[0].IE = 1;
- auto phys_dma = Kernel::HAL::hal_get_phys_address(command_table);
-
- command_header->Ctba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma & 0xFFFFFFFF);
- command_header->Ctbau = ((Kernel::UInt32)((Kernel::UInt64)phys_dma >> 32));
+ auto phys_dma_tbl = Kernel::HAL::hal_get_phys_address(command_table);
+
+ command_header->Ctba = ((Kernel::UInt32)(Kernel::UInt64)phys_dma_tbl & 0xFFFFFFFF);
+ command_header->Ctbau = ((Kernel::UInt32)((Kernel::UInt64)phys_dma_tbl << 32));
FisRegH2D* h2d_fis = (FisRegH2D*)((Kernel::UInt64)&command_table->Cfis);
@@ -264,6 +244,9 @@ static Kernel::Void drvi_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buf
if (kSATAPort->Ports[kSATAPortIdx].Ci == 0)
break;
+ kout << "AHCI Interrupt Status: " << Kernel::hex_number(kSATAPort->Is) << endl;
+ kout << "PxCMD: " << Kernel::hex_number(kSATAPort->Ports[kSATAPortIdx].Cmd) << endl;
+
if (kSATAPort->Is & kHBAErrTaskFile)
Kernel::ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "AHCI Read disk failure, faulty component.");
}
diff --git a/dev/Kernel/KernelKit/DriveMgr.h b/dev/Kernel/KernelKit/DriveMgr.h
index 28c2fdad..997db1f9 100644
--- a/dev/Kernel/KernelKit/DriveMgr.h
+++ b/dev/Kernel/KernelKit/DriveMgr.h
@@ -30,11 +30,11 @@ namespace Kernel
kInvalidDrive = -1,
/// Storage types, combine with flags.
- kBlockDevice = 0xAD,
+ kBlockDevice = 0xAD,
kMassStorageDrive = 0xDA,
- kFloppyDrive = 0xCD,
- kOpticalDrive = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray
- kTapeDrive = 0xD7,
+ kFloppyDrive = 0xCD,
+ kOpticalDrive = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray
+ kTapeDrive = 0xD7,
/// Storage flags, combine with types.
kReadOnlyDrive = 0x10, // Read only drive
diff --git a/dev/Kernel/KernelKit/PCI/Device.h b/dev/Kernel/KernelKit/PCI/Device.h
index 7af2381d..cb463485 100644
--- a/dev/Kernel/KernelKit/PCI/Device.h
+++ b/dev/Kernel/KernelKit/PCI/Device.h
@@ -13,7 +13,7 @@ namespace Kernel::PCI
{
ConfigAddress = 0xCF8,
ConfigData = 0xCFC,
- CommandReg = 0x0004,
+ CommandReg = 0x0004,
Invalid = 0xFFFF,
};
diff --git a/dev/Kernel/NewKit/Array.h b/dev/Kernel/NewKit/Array.h
index aab3ba91..43c67586 100644
--- a/dev/Kernel/NewKit/Array.h
+++ b/dev/Kernel/NewKit/Array.h
@@ -24,7 +24,7 @@ namespace Kernel
T& operator[](const SizeT& at)
{
- MUST_PASS(at < this->Count());
+ MUST_PASS(at < this->Count());
return fArray[at];
}
diff --git a/dev/Kernel/NewKit/ArrayList.h b/dev/Kernel/NewKit/ArrayList.h
index a0d4388e..e05480f0 100644
--- a/dev/Kernel/NewKit/ArrayList.h
+++ b/dev/Kernel/NewKit/ArrayList.h
@@ -36,7 +36,7 @@ namespace Kernel
T& operator[](int index) const
{
- MUST_PASS(index < this->Count());
+ MUST_PASS(index < this->Count());
return fList[index];
}
@@ -51,7 +51,7 @@ namespace Kernel
}
private:
- T* fList{nullptr};
+ T* fList{nullptr};
SizeT fLen{0};
};