diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-02-10 09:38:30 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-02-10 09:38:30 +0100 |
| commit | 051f3f52992afa597375ed8d55b0a447863c3bce (patch) | |
| tree | 9a7a84150c2acf6908344831260bbd536e349f87 /dev | |
| parent | 7a260f76e9c05d84e59ffd7270ed8a65d08a4790 (diff) | |
SATA.cc: It seems like the DMA is not working.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/Kernel/FSKit/NeFS.h | 16 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/Storage/SATA.cc | 41 | ||||
| -rw-r--r-- | dev/Kernel/src/DriveMgr.cc | 6 | ||||
| -rw-r--r-- | dev/Kernel/src/FS/NeFS.cc | 30 | ||||
| -rw-r--r-- | dev/Mod/AHCI/AHCI.h | 38 |
5 files changed, 66 insertions, 65 deletions
diff --git a/dev/Kernel/FSKit/NeFS.h b/dev/Kernel/FSKit/NeFS.h index ffd56d03..87633b76 100644 --- a/dev/Kernel/FSKit/NeFS.h +++ b/dev/Kernel/FSKit/NeFS.h @@ -99,7 +99,7 @@ default. #define kResourceTypeMenu (12) #define kResourceTypeSound (13) #define kResourceTypeFont (14) -#define kNeFSPartLen (32) +#define kNeFSPartLen (32) #define kNeFSFlagDeleted (70) #define kNeFSFlagUnallocated (0) @@ -206,7 +206,7 @@ struct PACKED NEFS_FORK_STRUCT final /// @brief Partition block type struct PACKED NEFS_ROOT_PARTITION_BLOCK final { - Kernel::Char Ident[kNeFSIdentLen] = {0}; + Kernel::Char Ident[kNeFSIdentLen] = {0}; Kernel::Char PartitionName[kNeFSPartLen] = {0}; Kernel::Int32 Flags; @@ -279,8 +279,8 @@ namespace Kernel /// @param name the fork name. /// @return the fork. _Output NEFS_FORK_STRUCT* FindFork(_Input NEFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean data); + _Input const Char* name, + Boolean data); _Output Void RemoveFork(_Input NEFS_FORK_STRUCT* fork); @@ -291,8 +291,8 @@ namespace Kernel _Output NEFS_CATALOG_STRUCT* GetCatalog(_Input const Char* name); _Output NEFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name, - _Input const Int32& flags, - _Input const Int32& kind); + _Input const Int32& flags, + _Input const Int32& kind); _Output NEFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name); @@ -303,8 +303,8 @@ namespace Kernel _Input const Char* name); _Output VoidPtr ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* catalog, - _Input Bool isRsrcFork, - _Input SizeT dataSz, + _Input Bool isRsrcFork, + _Input SizeT dataSz, _Input const Char* forkName); _Output Bool Seek(_Input _Output NEFS_CATALOG_STRUCT* catalog, SizeT off); diff --git a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc index 00ef8767..1435cfac 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/SATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/SATA.cc @@ -15,6 +15,7 @@ * */ +#include "NewKit/Macros.h" #include <KernelKit/UserProcessScheduler.h> #include <KernelKit/LPC.h> @@ -51,11 +52,11 @@ STATIC Kernel::Lba kCurrentDiskSectorCount = 0UL; template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify> static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buffer, Kernel::SizeT sector_sz, Kernel::SizeT size_buffer) noexcept; -static Kernel::Int32 drv_find_cmd_slot(HbaPort* port) noexcept; +static Kernel::Int32 drvi_find_cmd_slot(HbaPort* port) noexcept; -static Kernel::Void drv_calculate_disk_geometry() noexcept; +static Kernel::Void drvi_calculate_disk_geometry() noexcept; -static Kernel::Void drv_calculate_disk_geometry() noexcept +static Kernel::Void drvi_calculate_disk_geometry() noexcept { kCurrentDiskSectorCount = 0UL; @@ -103,8 +104,6 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) { if (ports_implemented) { - kout << "Port is implemented.\r"; - Kernel::UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F; Kernel::UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F; @@ -123,13 +122,26 @@ Kernel::Boolean drv_std_init(Kernel::UInt16& PortsImplemented) 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; - drv_calculate_disk_geometry(); + drvi_calculate_disk_geometry(); return YES; } @@ -159,7 +171,7 @@ Kernel::Void drv_std_read(Kernel::UInt64 lba, Kernel::Char* buffer, Kernel::Size drv_std_input_output<NO, YES, NO>(lba, (Kernel::UInt8*)buffer, sector_sz, size_buffer); } -static Kernel::Int32 drv_find_cmd_slot(HbaPort* port) noexcept +static Kernel::Int32 drvi_find_cmd_slot(HbaPort* port) noexcept { Kernel::UInt32 slots = port->Ci; @@ -179,7 +191,7 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff { auto slot = 0L; - slot = drv_find_cmd_slot(&kSATAPort->Ports[kSATAPortIdx]); + slot = drvi_find_cmd_slot(&kSATAPort->Ports[kSATAPortIdx]); if (slot == -1) return; @@ -191,17 +203,13 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff command_header += slot; - Kernel::rt_set_memory(reinterpret_cast<Kernel::VoidPtr>(command_header), 0, sizeof(HbaCmdHeader)); - MUST_PASS(command_header); command_header->Cfl = sizeof(FisRegH2D) / sizeof(Kernel::UInt32); command_header->Write = Write; command_header->Prdtl = 1; - HbaCmdTbl* command_table = new HbaCmdTbl(); - - Kernel::rt_set_memory(reinterpret_cast<Kernel::VoidPtr>(command_table), 0, sizeof(HbaCmdTbl)); + HbaCmdTbl* command_table = (HbaCmdTbl*)((Kernel::UIntPtr)command_header->Ctba + command_header->Ctbau); MUST_PASS(command_table); @@ -215,8 +223,6 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff FisRegH2D* h2d_fis = (FisRegH2D*)((Kernel::UInt64)command_table->Cfis); - Kernel::rt_set_memory(reinterpret_cast<Kernel::VoidPtr>(h2d_fis), 0, sizeof(FisRegH2D)); - h2d_fis->FisType = kFISTypeRegH2D; h2d_fis->CmdOrCtrl = CommandOrCTRL; h2d_fis->Command = Write ? kAHCICmdWriteDmaEx : kAHCICmdReadDmaEx; @@ -263,11 +269,8 @@ static Kernel::Void drv_std_input_output(Kernel::UInt64 lba, Kernel::UInt8* buff while ((kSATAPort->Ports[kSATAPortIdx].Tfd & (kAhciSRBsy | kAhciSRDrq))) { - kout << "Waiting for the tfd to be ready...\r"; + kout << "Waiting for the TFD to be ready...\r"; } - - delete command_table; - command_table = nullptr; } /*** diff --git a/dev/Kernel/src/DriveMgr.cc b/dev/Kernel/src/DriveMgr.cc index f7215346..5d1868da 100644 --- a/dev/Kernel/src/DriveMgr.cc +++ b/dev/Kernel/src/DriveMgr.cc @@ -162,7 +162,7 @@ namespace Kernel trait.fInit(trait.fPacket); - kout << "Reading EPM block...\r"; + kout << "Reading block...\r"; trait.fInput(trait.fPacket); @@ -191,9 +191,7 @@ namespace Kernel kout << "Scheme Found: " << block_struct.Name << endl; - if (block_struct.Name[0] == 0 || - block_struct.Name[0] == 0xFF || - block_struct.Name[0] == 0xAF) + if (block_struct.Name[0] == 0) kout << "Disk partition is empty (Read Only)\r"; } diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc index e0e3483c..f8938444 100644 --- a/dev/Kernel/src/FS/NeFS.cc +++ b/dev/Kernel/src/FS/NeFS.cc @@ -165,10 +165,10 @@ _Output BOOL NeFileSystemParser::CreateFork(_Input NEFS_FORK_STRUCT& the_fork) /// @return the fork. /***********************************************************************************/ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean isDataFork) + _Input const Char* name, + Boolean isDataFork) { - auto drive = kMountpoint.A(); + auto drive = kMountpoint.A(); NEFS_FORK_STRUCT* the_fork = nullptr; Lba lba = isDataFork ? catalog->DataFork : catalog->ResourceFork; @@ -232,8 +232,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char /// @return catalog pointer. /***********************************************************************************/ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char* name, - _Input const Int32& flags, - _Input const Int32& kind) + _Input const Int32& flags, + _Input const Int32& kind) { kout << "CreateCatalog(...)\r"; @@ -323,7 +323,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char drive.fInput(drive.fPacket); NEFS_ROOT_PARTITION_BLOCK* blk_nefs = (NEFS_ROOT_PARTITION_BLOCK*)part_block; - out_lba = blk_nefs->StartCatalog; + out_lba = blk_nefs->StartCatalog; } NEFS_CATALOG_STRUCT* child_catalog = new NEFS_CATALOG_STRUCT(); @@ -646,7 +646,7 @@ bool NeFileSystemParser::WriteCatalog(_Input const Char* catalog_name, Bool is_r catalog = nullptr; NEFS_FORK_STRUCT* fork_data_input = new NEFS_FORK_STRUCT(); - NEFS_FORK_STRUCT prev_fork{}; + NEFS_FORK_STRUCT prev_fork{}; kout << hex_number(startFork) << endl; @@ -709,16 +709,16 @@ bool NeFileSystemParser::WriteCatalog(_Input const Char* catalog_name, Bool is_r /// @param catalog_name the catalog name. /// @return the newly found catalog. _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* catalog_name, - Lba& out_lba, - Bool search_hidden, - Bool local_search) + Lba& out_lba, + Bool search_hidden, + Bool local_search) { if (!catalog_name || *catalog_name == 0) return nullptr; NEFS_ROOT_PARTITION_BLOCK part{0}; - auto& drive = kMountpoint.A(); + auto& drive = kMountpoint.A(); rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, rt_string_len("fs/nefs-packet")); @@ -894,7 +894,7 @@ _Output Boolean NeFileSystemParser::RemoveCatalog(_Input const Char* catalog_nam drive.fPacket.fPacketLba = out_lba; // the catalog position. drive.fPacket.fPacketSize = - sizeof(NEFS_CATALOG_STRUCT); // size of catalog. roughly the sector size. + sizeof(NEFS_CATALOG_STRUCT); // size of catalog. roughly the sector size. drive.fPacket.fPacketContent = catalog; // the catalog itself. drive.fOutput(drive.fPacket); // send packet. @@ -936,8 +936,8 @@ _Output Boolean NeFileSystemParser::RemoveCatalog(_Input const Char* catalog_nam /***********************************************************************************/ VoidPtr NeFileSystemParser::ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* catalog, - _Input Bool is_rsrc_fork, - _Input SizeT dataSz, + _Input Bool is_rsrc_fork, + _Input SizeT dataSz, _Input const Char* forkName) { if (!catalog) @@ -953,7 +953,7 @@ VoidPtr NeFileSystemParser::ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* cata << ", fork: " << hex_number(dataForkLba) << endl; NEFS_FORK_STRUCT* fs_buf = new NEFS_FORK_STRUCT(); - auto drive = kMountpoint.A(); + auto drive = kMountpoint.A(); rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, rt_string_len("fs/nefs-packet")); diff --git a/dev/Mod/AHCI/AHCI.h b/dev/Mod/AHCI/AHCI.h index 05f75391..8e457431 100644 --- a/dev/Mod/AHCI/AHCI.h +++ b/dev/Mod/AHCI/AHCI.h @@ -89,10 +89,10 @@ typedef struct FisRegD2H final // DWORD 0 Kernel::UInt8 FisType; // FIS_TYPE_REG_D2H - Kernel::UInt8 PortMul : 4; // Port multiplier - Kernel::UInt8 Reserved0 : 2; // Reserved - Kernel::UInt8 IE : 1; // Interrupt bit - Kernel::UInt8 Reserved1 : 1; // Reserved + Kernel::UInt8 PortMul : 4; // Port multiplier + Kernel::UInt8 Reserved0 : 2; // Reserved + Kernel::UInt8 IE : 1; // Interrupt bit + Kernel::UInt8 Reserved1 : 1; // Reserved Kernel::UInt8 Status; // Status register Kernel::UInt8 Error; // Error register @@ -137,10 +137,10 @@ typedef struct FisPioSetup final // DWORD 0 Kernel::UInt8 FisType; // FIS_TYPE_PIO_SETUP - Kernel::UInt8 PortMul : 4; // Port multiplier - Kernel::UInt8 Reserved0 : 1; // Reserved - Kernel::UInt8 DTD : 1; // Data transfer direction, 1 - device to host - Kernel::UInt8 IE : 1; // Interrupt bit + Kernel::UInt8 PortMul : 4; // Port multiplier + Kernel::UInt8 Reserved0 : 1; // Reserved + Kernel::UInt8 DTD : 1; // Data transfer direction, 1 - device to host + Kernel::UInt8 IE : 1; // Interrupt bit Kernel::UInt8 Reserved1 : 1; Kernel::UInt8 Status; // Status register @@ -174,18 +174,18 @@ typedef struct FisDmaSetup final // DWORD 0 Kernel::UInt8 FisType; // FIS_TYPE_DMA_SETUP - Kernel::UInt8 PortMul : 4; // Port multiplier - Kernel::UInt8 Reserved0 : 1; // Reserved - Kernel::UInt8 DTD : 1; // Data transfer direction, 1 - device to host - Kernel::UInt8 IE : 1; // Interrupt bit - Kernel::UInt8 AutoEnable : 1; // Auto-activate. Specifies if DMA Activate FIS is needed + Kernel::UInt8 PortMul : 4; // Port multiplier + Kernel::UInt8 Reserved0 : 1; // Reserved + Kernel::UInt8 DTD : 1; // Data transfer direction, 1 - device to host + Kernel::UInt8 IE : 1; // Interrupt bit + Kernel::UInt8 AutoEnable : 1; // Auto-activate. Specifies if DMA Activate FIS is needed Kernel::UInt8 Reserved1[2]; // Reserved // DWORD 1&2 volatile Kernel::UInt64 DmaBufferId; // DMA Buffer Identifier. Used to Identify DMA buffer in - // host memory. SATA Spec says host specific and not in - // Spec. Trying AHCI spec might work. + // host memory. SATA Spec says host specific and not in + // Spec. Trying AHCI spec might work. // DWORD 3 Kernel::UInt32 Rsvd; // More reserved @@ -318,9 +318,9 @@ typedef struct HbaPrdtEntry final Kernel::UInt32 Dbau; // Data base address upper 32 bits Kernel::UInt32 Reserved0; // Reserved // DW3 - Kernel::UInt32 Dbc : 22; // Byte count, 4M max - Kernel::UInt32 Reserved1 : 9; // Reserved - Kernel::UInt32 IE : 1; // Interrupt on completion + Kernel::UInt32 Dbc : 22; // Byte count, 4M max + Kernel::UInt32 Reserved1 : 9; // Reserved + Kernel::UInt32 IE : 1; // Interrupt on completion } HbaPrdtEntry; typedef struct HbaCmdTbl final @@ -328,7 +328,7 @@ typedef struct HbaCmdTbl final Kernel::UInt8 Cfis[64]; // Command FIS Kernel::UInt8 Acmd[16]; // ATAPI command, 12 or 16 bytes Kernel::UInt8 Rsv[48]; // Reserved - struct HbaPrdtEntry Prdt[]; // Physical region descriptor table entries, 0 ~ 65535 + struct HbaPrdtEntry Prdt[]; // Physical region descriptor table entries, 0 ~ 65535 } HbaCmdTbl; /// @brief Initializes an AHCI disk. |
