diff options
| author | Amlal El Mahrouss <amlalelmahrouss@icloud.com> | 2024-02-03 22:53:06 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlalelmahrouss@icloud.com> | 2024-02-03 22:55:18 +0100 |
| commit | aff54fd3dc6855b62c047f126c6fe20ca717ee0f (patch) | |
| tree | c283173ea6e2ed8a273113dcf597b0f10b2f1d93 /Private/NewBoot | |
| parent | f99e383775fa43c5c1354067962b1590ff2abdae (diff) | |
HCR-11 : SATA support phase 1, work in progress AHCI implementation.
Signed-off-by: Amlal El Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Private/NewBoot')
| -rw-r--r-- | Private/NewBoot/BootKit/Arch/AHCI.hxx | 37 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/Arch/ATA.hxx | 118 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/BootKit.hxx | 2 | ||||
| -rw-r--r-- | Private/NewBoot/Source/Entrypoint.cxx | 1 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx | 2 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx | 25 |
6 files changed, 62 insertions, 123 deletions
diff --git a/Private/NewBoot/BootKit/Arch/AHCI.hxx b/Private/NewBoot/BootKit/Arch/AHCI.hxx index 2e3739b5..0735baad 100644 --- a/Private/NewBoot/BootKit/Arch/AHCI.hxx +++ b/Private/NewBoot/BootKit/Arch/AHCI.hxx @@ -9,4 +9,41 @@ #pragma once +#include <CompilerKit/CompilerKit.hpp> #include <Drivers/AHCI/Defines.hxx> + +class BDeviceAHCI final { + public: + explicit BDeviceAHCI() noexcept; + ~BDeviceAHCI() = default; + + HCORE_COPY_DEFAULT(BDeviceAHCI); + + struct AHCITraits final { + SizeT mBase{1024}; + Boolean mErr{false}; + Boolean mDetected{false}; + + operator bool() { return !mErr; } + }; + + operator bool() { return Leak().mDetected; } + + BDeviceAHCI& Read(WideChar* Buf, const SizeT& SecCount); + BDeviceAHCI& Write(WideChar* Buf, const SizeT& SecCount); + + AHCITraits& Leak(); + + private: + AHCITraits mTraits; +}; + +enum { + kATADevicePATA, + kATADeviceSATA, + kATADevicePATA_PI, + kATADeviceSATA_PI, + kATADeviceCount, +}; + +#define kATASectorSz 512 diff --git a/Private/NewBoot/BootKit/Arch/ATA.hxx b/Private/NewBoot/BootKit/Arch/ATA.hxx index 4b4eb399..fd413705 100644 --- a/Private/NewBoot/BootKit/Arch/ATA.hxx +++ b/Private/NewBoot/BootKit/Arch/ATA.hxx @@ -9,121 +9,21 @@ #pragma once -#include <CompilerKit/CompilerKit.hpp> -#include <NewKit/Defines.hpp> +#include <Drivers/ATA/Defines.hxx> -using namespace HCore; +Boolean IsATADetected(Void); -// Status register -#define ATA_SR_BSY 0x80 -#define ATA_SR_DRDY 0x40 -#define ATA_SR_DF 0x20 -#define ATA_SR_DSC 0x10 -#define ATA_SR_DRQ 0x08 -#define ATA_SR_CORR 0x04 -#define ATA_SR_IDX 0x02 -#define ATA_SR_ERR 0x01 - -// Error register -#define ATA_ER_BBK 0x80 -#define ATA_ER_UNC 0x40 -#define ATA_ER_MC 0x20 -#define ATA_ER_IDNF 0x10 -#define ATA_ER_MCR 0x08 -#define ATA_ER_ABRT 0x04 -#define ATA_ER_TK0NF 0x02 -#define ATA_ER_AMNF 0x01 - -#define ATA_CMD_READ_PIO 0x20 -#define ATA_CMD_READ_PIO_EXT 0x24 -#define ATA_CMD_READ_DMA 0xC8 -#define ATA_CMD_READ_DMA_EXT 0x25 -#define ATA_CMD_WRITE_PIO 0x30 -#define ATA_CMD_WRITE_PIO_EXT 0x34 -#define ATA_CMD_WRITE_DMA 0xCA -#define ATA_CMD_WRITE_DMA_EXT 0x35 -#define ATA_CMD_CACHE_FLUSH 0xE7 -#define ATA_CMD_CACHE_FLUSH_EXT 0xEA -#define ATA_CMD_PACKET 0xA0 -#define ATA_CMD_IDENTIFY_PACKET 0xA1 -#define ATA_CMD_IDENTIFY 0xEC - -#define ATA_IDENT_DEVICE_TYPE 0 -#define ATA_IDENT_CYLINDERS 2 -#define ATA_IDENT_HEADS 6 -#define ATA_IDENT_SECTORS 12 -#define ATA_IDENT_SERIAL 20 -#define ATA_IDENT_MODEL 54 -#define ATA_IDENT_CAPABILITIES 98 -#define ATA_IDENT_FIELDVALID 106 -#define ATA_IDENT_MAX_LBA 120 -#define ATA_IDENT_COMMANDSETS 164 -#define ATA_IDENT_MAX_LBA_EXT 200 - -#define ATA_MASTER 0x00 -#define ATA_SLAVE 0x01 - -// Register -#define ATA_REG_DATA 0x00 -#define ATA_REG_ERROR 0x01 -#define ATA_REG_FEATURES 0x01 -#define ATA_REG_SEC_COUNT0 0x02 -#define ATA_REG_LBA0 0x03 -#define ATA_REG_LBA1 0x04 -#define ATA_REG_LBA2 0x05 -#define ATA_REG_HDDEVSEL 0x06 -#define ATA_REG_COMMAND 0x07 -#define ATA_REG_STATUS 0x07 -#define ATA_REG_SEC_COUNT1 0x08 -#define ATA_REG_LBA3 0x09 -#define ATA_REG_LBA4 0x0A -#define ATA_REG_LBA5 0x0B -#define ATA_REG_CONTROL 0x0C -#define ATA_REG_ALT_STATUS 0x0C -#define ATA_REG_DEV_ADDRESS 0x0D - -#define ATA_PRIMARY_IO 0x1F0 -#define ATA_SECONDARY_IO 0x170 -#define ATA_PRIMARY_DCR_AS 0x3F6 -#define ATA_SECONDARY_DCR_AS 0x376 - -// Irq -#define ATA_PRIMARY_IRQ 14 -#define ATA_SECONDARY_IRQ 15 - -// Channels -#define ATA_PRIMARY 0x00 -#define ATA_SECONDARY 0x01 - -#define ATA_CYL_LOW 4 -#define ATA_CYL_HIGH 5 - -// IO Direction -#define ATA_READ 0x00 -#define ATA_WRITE 0x013 - -#define ATA_PRIMARY_SEL 0xA0 -#define ATA_SECONDARY_SEL 0xB0 - -// ATA Helpers -#define ATA_ADDRESS1(x) (x + 3) -#define ATA_ADDRESS2(x) (x + 4) -#define ATA_ADDRESS3(x) (x + 5) -#define ATA_COMMAND(x) (x + 7) - -Boolean ATAIsDetected(Void); - -class BATADevice final { +class BDeviceATA final { public: enum { kPrimary = ATA_PRIMARY_IO, kSecondary = ATA_SECONDARY_IO, }; - explicit BATADevice() noexcept; - ~BATADevice() = default; + explicit BDeviceATA() noexcept; + ~BDeviceATA() = default; - HCORE_COPY_DEFAULT(BATADevice); + HCORE_COPY_DEFAULT(BDeviceATA); struct ATATraits final { SizeT mBase{1024}; @@ -134,10 +34,10 @@ class BATADevice final { operator bool() { return !mErr; } }; - operator bool() { return ATAIsDetected(); } + operator bool() { return IsATADetected(); } - BATADevice& Read(WideChar* Buf, const SizeT& SecCount); - BATADevice& Write(WideChar* Buf, const SizeT& SecCount); + BDeviceATA& Read(WideChar* Buf, const SizeT& SecCount); + BDeviceATA& Write(WideChar* Buf, const SizeT& SecCount); ATATraits& Leak(); diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index d1584d8a..45f54cb4 100644 --- a/Private/NewBoot/BootKit/BootKit.hxx +++ b/Private/NewBoot/BootKit/BootKit.hxx @@ -85,7 +85,7 @@ class BFileReader final { Int32 mErrorCode{kOperationOkay}; CharacterType mPath[kPathLen]; BTextWriter mWriter; - BATADevice mDevice; + BDeviceATA mDevice; bool mCached{false}; }; diff --git a/Private/NewBoot/Source/Entrypoint.cxx b/Private/NewBoot/Source/Entrypoint.cxx index d2134746..39769b87 100644 --- a/Private/NewBoot/Source/Entrypoint.cxx +++ b/Private/NewBoot/Source/Entrypoint.cxx @@ -7,6 +7,7 @@ * ======================================================== */ +#include "BootKit/Arch/ATA.hxx" #define __BOOTLOADER__ 1 #include <BootKit/BootKit.hxx> diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx index 2d449bbb..2363f8cb 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx @@ -17,3 +17,5 @@ * @copyright Copyright (c) 2024 Mahrouss Logic * */ + +#include <BootKit/Arch/AHCI.hxx> diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx index 3414d060..20af043d 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx @@ -22,8 +22,6 @@ #include <BootKit/BootKit.hxx> #include <EFIKit/Api.hxx> -#include "BootKit/Platform.hxx" - /// bugs: 0 #define kATADataLen 256 @@ -94,7 +92,7 @@ ATAInit_Retry: writer.WriteString(L"\r\n"); - OutBus = (Bus == ATA_PRIMARY) ? BATADevice::kPrimary : BATADevice::kSecondary; + OutBus = (Bus == ATA_PRIMARY) ? BDeviceATA::kPrimary : BDeviceATA::kSecondary; OutMaster = (Bus == ATA_PRIMARY) ? ATA_MASTER : ATA_SLAVE; Out8(Bus + ATA_REG_HDDEVSEL, 0xA0 | ATA_MASTER << 4); @@ -172,12 +170,13 @@ Void ATAWriteLba(UInt32 Lba, UInt8 IO, UInt8 Master, wchar_t* Buf, } } -Boolean ATAIsDetected(Void) { return kATADetected; } +/// @check is ATA detected? +Boolean IsATADetected(Void) { return kATADetected; } /*** * * - * ATA Device class. + * @brief ATA Device class. * * */ @@ -186,8 +185,8 @@ Boolean ATAIsDetected(Void) { return kATADetected; } * @brief ATA Device constructor. * @param void none. */ -BATADevice::BATADevice() noexcept { - if (ATAIsDetected()) return; +BDeviceATA::BDeviceATA() noexcept { + if (IsATADetected()) return; if (ATAInitDriver(ATA_PRIMARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || @@ -209,8 +208,8 @@ BATADevice::BATADevice() noexcept { @param Sz Sector size @param Buf buffer */ -BATADevice& BATADevice::Read(CharacterType* Buf, const SizeT& SectorSz) { - if (!ATAIsDetected()) { +BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { + if (!IsATADetected()) { Leak().mErr = true; return *this; } @@ -232,8 +231,8 @@ BATADevice& BATADevice::Read(CharacterType* Buf, const SizeT& SectorSz) { @param Sz Sector size @param Buf buffer */ -BATADevice& BATADevice::Write(CharacterType* Buf, const SizeT& SectorSz) { - if (!ATAIsDetected()) { +BDeviceATA& BDeviceATA::Write(CharacterType* Buf, const SizeT& SectorSz) { + if (!IsATADetected()) { Leak().mErr = true; return *this; } @@ -256,6 +255,6 @@ BATADevice& BATADevice::Write(CharacterType* Buf, const SizeT& SectorSz) { /** * @brief ATA Config getter. - * @return BATADevice::ATATraits& the drive config. + * @return BDeviceATA::ATATraits& the drive config. */ -BATADevice::ATATraits& BATADevice::Leak() { return mTraits; } +BDeviceATA::ATATraits& BDeviceATA::Leak() { return mTraits; } |
