summaryrefslogtreecommitdiffhomepage
path: root/Private/NewBoot
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-03 22:53:06 +0100
committerAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-03 22:55:18 +0100
commitaff54fd3dc6855b62c047f126c6fe20ca717ee0f (patch)
treec283173ea6e2ed8a273113dcf597b0f10b2f1d93 /Private/NewBoot
parentf99e383775fa43c5c1354067962b1590ff2abdae (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.hxx37
-rw-r--r--Private/NewBoot/BootKit/Arch/ATA.hxx118
-rw-r--r--Private/NewBoot/BootKit/BootKit.hxx2
-rw-r--r--Private/NewBoot/Source/Entrypoint.cxx1
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx2
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx25
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; }