From 0c61ea5560f26990d08ecbc8207776b308c48db5 Mon Sep 17 00:00:00 2001 From: amlal Date: Fri, 22 Mar 2024 14:36:41 +0100 Subject: NewBoot: BootATA.cxx: Improve driver. Signed-off-by: amlal --- Private/NewBoot/Source/HEL/AMD64/BootATA.cxx | 43 ++++++++++++---------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx b/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx index 72340d01..1d94c776 100644 --- a/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx @@ -92,16 +92,6 @@ ATAInit_Retry: kATAData[indexData] = In16(IO + ATA_REG_DATA); } - writer.Write(L"NewBoot: Drive Model: "); - - for (SizeT indexData = 0; indexData < kATADataLen; indexData += 1) { - writer.WriteCharacter(kATAData[indexData]); - } - - writer.Write(L"\r\n"); - - writer.Write(L"\r\n"); - OutBus = (Bus == ATA_PRIMARY_IO) ? BDeviceATA::kPrimary : BDeviceATA::kSecondary; OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE; @@ -145,6 +135,8 @@ Void boot_ata_read(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, SizeT SectorSz, SizeT Size) { UInt8 Command = (!Master ? 0xE0 : 0xF0); + boot_ata_wait_io(IO); + Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF)); Out8(IO + ATA_REG_SEC_COUNT0, SectorSz); @@ -154,16 +146,21 @@ Void boot_ata_read(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO); - boot_ata_wait_io(IO); + while ((In8(ATA_COMMAND(IO))) & ATA_SR_BSY) boot_ata_wait_io(IO); - BTextWriter writer; + UInt16 byte = In16(IO + ATA_REG_DATA); + SizeT IndexOff = 0UL; + Buf[IndexOff] = byte; - writer.Write(L"NewBoot: Port: ").Write(IO).Write(L"\r\n"); + while (byte != 0xFF) { + if (IndexOff > Size) break; - for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) { - WideChar chr = In16(IO + ATA_REG_DATA); + ++IndexOff; + + while ((In8(ATA_COMMAND(IO))) & ATA_SR_BSY) boot_ata_wait_io(IO); - Buf[IndexOff] = chr; + byte = In16(IO + ATA_REG_DATA); + Buf[IndexOff] = byte; } } @@ -171,6 +168,8 @@ Void boot_ata_write(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, SizeT SectorSz, SizeT Size) { UInt8 Command = (!Master ? 0xE0 : 0xF0); + boot_ata_wait_io(IO); + Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF)); Out8(IO + ATA_REG_SEC_COUNT0, SectorSz); @@ -180,11 +179,9 @@ Void boot_ata_write(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO); - boot_ata_wait_io(IO); - for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) { + boot_ata_wait_io(IO); Out16(IO + ATA_REG_DATA, Buf[IndexOff]); - } } @@ -213,12 +210,8 @@ BDeviceATA::BDeviceATA() noexcept { kATADetected = true; BTextWriter writer; + writer.Write(L"NewBoot: Drive is OnLine.\r\n"); - writer.Write(L"NewBoot: IO: ") - .Write(this->Leak().mBus) - .Write(L" Master: ") - .Write(this->Leak().mMaster) - .Write(L"\r\n"); } } /** @@ -262,7 +255,7 @@ BDeviceATA& BDeviceATA::Write(CharacterTypeUTF8* Buf, const SizeT& SectorSz) { if (!Buf || SectorSz < 1) return *this; - boot_ata_read(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster, + boot_ata_write(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster, Buf, SectorSz, this->Leak().mSize); return *this; -- cgit v1.2.3