summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-03-14 22:26:42 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-03-14 22:26:42 +0100
commit6bbf5ad2058db4020ae20d6aba8f5b099dadc85f (patch)
treead39f25f27938729261f733d2addf839e8a110b3 /dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
parent1c4f8ae3804be72d947b0b96f90b9300515399bc (diff)
TQ-24 && TQ-16: Add build scripts for MBCI, MBCI+Flash, and UFS.
META: Along other tweaks and important ARM64 patches. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit/AMD64/Storage/AHCI.cc')
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/AHCI.cc387
1 files changed, 0 insertions, 387 deletions
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
deleted file mode 100644
index 874b7012..00000000
--- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
+++ /dev/null
@@ -1,387 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss Corporation, all rights reserved.
-
-------------------------------------------- */
-
-/**
- * @file AHCI.cc
- * @author Amlal El Mahrouss (amlalelmahrouss@icloud.com)
- * @brief AHCI driver.
- * @version 0.1
- * @date 2024-02-02
- *
- * @copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
- *
- */
-
-#include <KernelKit/DeviceMgr.h>
-#include <KernelKit/DriveMgr.h>
-#include <KernelKit/UserProcessScheduler.h>
-#include <KernelKit/LPC.h>
-
-#include <FirmwareKit/EPM.h>
-
-#include <Mod/ATA/ATA.h>
-#include <Mod/AHCI/AHCI.h>
-#include <KernelKit/PCI/Iterator.h>
-#include <NewKit/Utils.h>
-#include <KernelKit/LockDelegate.h>
-
-#include <StorageKit/AHCI.h>
-
-#define kHBAErrTaskFile (1 << 30)
-#define kHBAPxCmdST (0x0001)
-#define kHBAPxCmdFre (0x0010)
-#define kHBAPxCmdFR (0x4000)
-#define kHBAPxCmdCR (0x8000)
-
-#define kSATALBAMode (1 << 6)
-
-#define kSATASRBsy (0x80)
-#define kSATASRDrq (0x08)
-
-#define kHBABohcBiosOwned (1 << 0)
-#define kHBABohcOSOwned (1 << 1)
-
-#define kSATAPortCnt (0x20)
-
-#define kSATASig (0x00000101)
-#define kSATAPISig (0xEB140101)
-
-#define kSATAProgIfAHCI (0x01)
-#define kSATASubClass (0x06)
-#define kSATABar5 (0x24)
-
-using namespace NeOS;
-
-STATIC PCI::Device kSATADev;
-STATIC HbaMem* kSATAHba;
-STATIC Lba kSATASectorCount = 0UL;
-STATIC UInt16 kSATAIndex = 0U;
-STATIC Char kCurrentDiskModel[50] = {"UNKNOWN AHCI DRIVE"};
-STATIC UInt16 kSATAPortsImplemented = 0U;
-
-BOOL kAHCICommandIssued = NO;
-
-template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify>
-STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, SizeT size_buffer) noexcept;
-
-STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept;
-
-STATIC Void drv_compute_disk_ahci() noexcept;
-
-STATIC Void drv_compute_disk_ahci() noexcept
-{
- kSATASectorCount = 0UL;
-
- const UInt16 kSzIdent = kib_cast(1);
-
- UInt8 identify_data[kSzIdent] = {0};
-
- rt_set_memory(identify_data, 0, kSzIdent);
-
- drv_std_input_output<NO, YES, YES>(0, identify_data, kAHCISectorSize, kSzIdent);
-
- for (SizeT i = 0; i < 40; ++i)
- {
- kCurrentDiskModel[i * 2] = identify_data[27 + (i * 2)] >> 8;
- kCurrentDiskModel[i * 2 + 1] = identify_data[27 + (i * 2) + 1] & 0xFF;
- }
-
- kCurrentDiskModel[40] = '\0';
-
- kSATASectorCount = identify_data[60] | identify_data[61];
-
- kout << "Drive Model: " << kCurrentDiskModel << kendl;
-
- kout << "Disk Size: " << number(drv_get_size()) << kendl;
- kout << "Sector Count: " << number(kSATASectorCount) << kendl;
-}
-
-STATIC Int32 drv_find_cmd_slot(HbaPort* port) noexcept
-{
- UInt32 slots = (port->Sact | port->Ci);
-
- for (Int32 i = 0; i < kSATAPortCnt; ++i)
- {
- if ((slots & 1) == 0)
- return i;
-
- slots >>= 1;
- }
-
- return ~0;
-}
-
-template <BOOL Write, BOOL CommandOrCTRL, BOOL Identify>
-STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, SizeT size_buffer) noexcept
-{
- UIntPtr slot = 0UL;
-
- slot = drv_find_cmd_slot(&kSATAHba->Ports[kSATAIndex]);
-
- if (slot == ~0)
- return;
-
- volatile HbaCmdHeader* command_header = ((HbaCmdHeader*)(((UInt64)kSATAHba->Ports[kSATAIndex].Clb)));
-
- MUST_PASS(command_header);
-
- command_header->Cfl = sizeof(FisRegH2D) / sizeof(UInt32);
- command_header->Write = Write;
- command_header->Prdtl = (UInt16)((size_buffer - 1) >> 4) + 1;
-
- HbaCmdTbl* command_table = (HbaCmdTbl*)((VoidPtr)((UInt64)command_header->Ctba));
- rt_set_memory(command_table, 0, sizeof(HbaCmdTbl) + (command_header->Prdtl - 1) * sizeof(HbaPrdtEntry));
-
- MUST_PASS(command_table);
-
- UIntPtr buffer_phys = HAL::hal_get_phys_address(buffer);
-
- Int32 i = 0;
-
- for (; i < (command_header->Prdtl - 1); i++)
- {
- command_table->Prdt[i].Dbc = ((size_buffer / command_header->Prdtl - 1) - 1);
- 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].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);
-
- h2d_fis->FisType = kFISTypeRegH2D;
- h2d_fis->CmdOrCtrl = CommandOrCTRL;
- h2d_fis->Command = Write ? kAHCICmdWriteDmaEx : kAHCICmdReadDmaEx;
-
- if (Identify)
- h2d_fis->Command = kAHCICmdIdentify;
-
- h2d_fis->Lba0 = (lba)&0xFF;
- h2d_fis->Lba1 = (lba >> 8) & 0xFF;
- h2d_fis->Lba2 = (lba >> 16) & 0xFF;
-
- h2d_fis->Device = Identify ? 0U : kSATALBAMode;
-
- h2d_fis->Lba3 = (lba >> 24) & 0xFF;
- h2d_fis->Lba4 = (lba >> 32) & 0xFF;
- h2d_fis->Lba5 = (lba >> 40) & 0xFF;
-
- h2d_fis->CountLow = (size_buffer)&0xFF;
- h2d_fis->CountHigh = (size_buffer >> 8) & 0xFF;
-
- while ((kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)))
- {
- kout << "Waiting for TFD...\r";
- }
-
- kSATAHba->Ports[kSATAIndex].Ci = (1 << slot);
-
- while (YES)
- {
- if ((kSATAHba->Ports[kSATAIndex].Ci & (1 << slot)) == 0)
- break;
-
- if (kSATAHba->Is & kHBAErrTaskFile)
- {
- err_global_get() = kErrorDiskIsCorrupted;
- return;
- }
- }
-
- // Check IS again.
- if (kSATAHba->Is & kHBAErrTaskFile)
- {
- err_global_get() = kErrorDiskIsCorrupted;
- return;
- }
-}
-
-/***
- @brief Gets the number of sectors inside the drive.
- @return Sector size in bytes.
- */
-SizeT drv_get_sector_count_ahci()
-{
- return kSATASectorCount;
-}
-
-/// @brief Get the drive size.
-/// @return Disk size in bytes.
-SizeT drv_get_size_ahci()
-{
- return drv_get_sector_count() * kAHCISectorSize;
-}
-
-/// @brief Initializes an AHCI disk.
-/// @param pi the amount of ports that have been detected.
-/// @return if the disk was successfully initialized or not.
-STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi)
-{
- PCI::Iterator iterator(Types::PciDeviceKind::MassStorageController);
-
- for (SizeT device_index = 0; device_index < NE_BUS_COUNT; ++device_index)
- {
- kSATADev = iterator[device_index].Leak(); // Leak device.
-
- if (kSATADev.Subclass() == kSATASubClass &&
- kSATADev.ProgIf() == kSATAProgIfAHCI)
- {
- HbaMem* mem_ahci = (HbaMem*)kSATADev.Bar(kSATABar5);
-
- kSATADev.EnableMmio((UIntPtr)mem_ahci);
- kSATADev.BecomeBusMaster((UIntPtr)mem_ahci);
-
- UInt32 ports_implemented = mem_ahci->Pi;
- UInt16 ahci_index = 0;
-
- kSATAPortsImplemented = ports_implemented;
-
- const UInt16 kMaxPortsImplemented = kSATAPortCnt;
- const UInt32 kSATASignature = kSATASig;
- const UInt32 kSATAPISignature = kSATAPISig;
- const UInt8 kSATAPresent = 0x03;
- const UInt8 kSATAIPMActive = 0x01;
-
- kSATAHba = mem_ahci;
-
- while (ports_implemented)
- {
- 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)
- {
- 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;
-
- drv_compute_disk_ahci();
-
- break;
- }
- else if (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig)
- {
- 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;
- kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdST;
-
- drv_compute_disk_ahci();
-
- break;
- }
-
- ports_implemented >>= 1;
- ++ahci_index;
- }
-
- pi = mem_ahci->Pi;
-
- return YES;
- }
- }
-
- return NO;
-}
-
-Bool drv_std_detected_ahci()
-{
- return kSATADev.DeviceId() != (UShort)PCI::PciConfigKind::Invalid && kSATADev.Bar(kSATABar5) != 0;
-}
-
-UInt16 sk_init_ahci_device(BOOL atapi)
-{
- UInt16 pi = 0;
- return drv_std_init_ahci(pi, atapi);
-
- return pi;
-}
-
-ErrorOr<AHCIDeviceInterface> sk_acquire_ahci_device(Int32 drv_index)
-{
- if (!drv_std_detected_ahci())
- return ErrorOr<AHCIDeviceInterface>(kErrorDisk);
-
- AHCIDeviceInterface device([](IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) -> void {
- AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self;
-
- auto disk = mnt->GetAddressOf(dev->GetIndex());
- drv_std_input_output<YES, YES, NO>(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); },
- [](IDeviceObject<MountpointInterface*>* self, MountpointInterface* mnt) -> void {
- AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self;
-
- auto disk = mnt->GetAddressOf(dev->GetIndex());
- drv_std_input_output<NO, YES, NO>(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize);
- },
- nullptr);
-
- device.SetPi(kSATAPortsImplemented);
- device.SetIndex(drv_index);
-
- return ErrorOr<AHCIDeviceInterface>(device);
-}
-
-#ifdef __AHCI__
-
-Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer)
-{
- drv_std_input_output<YES, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer);
-}
-
-Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer)
-{
- drv_std_input_output<NO, YES, NO>(lba, (UInt8*)buffer, sector_sz, size_buffer);
-}
-
-Bool drv_std_init(UInt16& pi)
-{
- return drv_std_init_ahci(pi, NO);
-}
-
-Bool drv_std_detected(Void)
-{
- return drv_std_detected_ahci();
-}
-
-/***
- @brief Gets the number of sectors inside the drive.
- @return Sector size in bytes.
- */
-SizeT drv_get_sector_count()
-{
- return drv_get_sector_count_ahci();
-}
-
-/// @brief Get the drive size.
-/// @return Disk size in bytes.
-SizeT drv_get_size()
-{
- return drv_get_size_ahci();
-}
-
-#endif // ifdef __AHCI__