diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-26 22:26:48 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-26 22:27:09 +0100 |
| commit | eba8b7ddd0a455d9e49f32dcae712c5612c0093c (patch) | |
| tree | 749a3d34546d055507a920bce4ab10e8a9945719 /Private/StorageKit/ATA.hpp | |
| parent | dd192787a70a973f2474720aea49af3f6ddabb7a (diff) | |
Kernel: Major repository refactor.
Rework the repo into Private and Public modules.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/StorageKit/ATA.hpp')
| -rw-r--r-- | Private/StorageKit/ATA.hpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/Private/StorageKit/ATA.hpp b/Private/StorageKit/ATA.hpp new file mode 100644 index 00000000..76f06409 --- /dev/null +++ b/Private/StorageKit/ATA.hpp @@ -0,0 +1,104 @@ +/* +* ======================================================== +* +* hCore +* Copyright 2024 Mahrouss Logic, all rights reserved. +* +* ======================================================== +*/ + +#pragma once + +#include <KernelKit/PCI/Dma.hpp> +#include <KernelKit/PCI/IO.hpp> +#include <NewKit/Defines.hpp> +#include <StorageKit/PRDT.hpp> +#include <KernelKit/DebugOutput.hpp> + +namespace hCore +{ + enum class PATAType + { + kRead28, + kRead48, + kWrite28, + kWrite48, + kUnknown + }; + + const char* ata_read_28(ULong lba); + const char* ata_read_48(ULong lba); + + Int32 ata_write_48(ULong lba, const char *text = nullptr); + Int32 ata_write_28(ULong lba, const char *text = nullptr); + + class PATACommandManager final + { + public: + PATACommandManager() = default; + ~PATACommandManager() = default; + + PATACommandManager &operator=(const PATACommandManager &) = default; + PATACommandManager(const PATACommandManager &) = default; + + public: + static Ref<PATACommandManager> Shared() + { + static Ref<PATACommandManager> manager; + return manager; + } + + public: + template <PATAType Command> + ErrorOr<const char*> operator()(ULong lba, const char *text = nullptr) noexcept + { + switch (Command) + { + case PATAType::kRead28: + return ErrorOr<const char*>(ata_read_28(lba)); + case PATAType::kRead48: + return ErrorOr<const char*>(ata_read_48(lba)); + case PATAType::kWrite28: + { + if (text) + { + ata_write_28(lba, text); + kcout << "ErrorOr<CT> ata_read<CT, Command>: Write ATA Command... " + "(Write28)\n"; + + return {}; + } + + kcout << "ErrorOr<CT> ata_read<CT, Command>: Bad ATA Command... " + "(Write28)\n"; + + return {}; + } + case PATAType::kWrite48: + { + if (text) + { + ata_write_48(lba, text); + kcout << "ErrorOr<CT> ata_read<CT, Command>: Write ATA Command... " + "(Write48)\n"; + + return {}; + } + + kcout << "ErrorOr<CT> ata_read<CT, Command>: Bad ATA Command... " + "(Write48)\n"; + + return {}; + } + case PATAType::kUnknown: + { + kcout << "ErrorOr<CT> ata_read<CT, Command>: Unknown ATA Command...\n"; + return {}; + } + } + + return ErrorOr<const char*>(nullptr); + } + + }; +} // namespace hCore |
