summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/AMD64/PCI/DMA.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/HALKit/AMD64/PCI/DMA.cpp')
-rw-r--r--src/kernel/HALKit/AMD64/PCI/DMA.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/kernel/HALKit/AMD64/PCI/DMA.cpp b/src/kernel/HALKit/AMD64/PCI/DMA.cpp
new file mode 100644
index 00000000..73e5e401
--- /dev/null
+++ b/src/kernel/HALKit/AMD64/PCI/DMA.cpp
@@ -0,0 +1,70 @@
+// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org)
+// Licensed under the Apache License, Version 2.0 (see LICENSE file)
+// Official repository: https://github.com/nekernel-org/nekernel
+
+#include <ArchKit/ArchKit.h>
+#include <KernelKit/PCI/DMA.h>
+
+namespace Kernel {
+DMAWrapper::operator bool() {
+ return this->fAddress;
+}
+
+bool DMAWrapper::operator!() {
+ return !this->fAddress;
+}
+
+Boolean DMAWrapper::Check(UIntPtr offset) const {
+ if (!this->fAddress) return false;
+
+ if (offset == 0) return false;
+
+ kout << "[DMAWrapper::IsIn] Checking offset...\r";
+ return reinterpret_cast<UIntPtr>(this->fAddress) >= offset;
+}
+
+bool DMAWrapper::Write(UIntPtr& bit, const UInt32& offset) {
+ kout << "[DMAWrapper::Read] Checking this->fAddress...\r";
+
+ if (!this->fAddress) return false;
+
+ (Void)(kout << "[DMAWrapper::Write] Writing at address: "
+ << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
+
+ ke_dma_write<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset, bit);
+
+ return true;
+}
+
+UIntPtr DMAWrapper::Read(const UInt32& offset) {
+ kout << "[DMAWrapper::Read] Checking this->fAddress...\r";
+
+ if (!this->fAddress) return ~0;
+
+ (Void)(kout << "[DMAWrapper::Write] Writing at address: "
+ << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
+
+ return (UIntPtr) ke_dma_read<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset);
+}
+
+UIntPtr DMAWrapper::operator[](UIntPtr& offset) {
+ return this->Read(offset);
+}
+
+OwnPtr<IOBuf<Char*>> DMAFactory::Construct(OwnPtr<DMAWrapper>& dma) {
+ if (!dma) return {};
+
+ OwnPtr<IOBuf<Char*>> dmaOwnPtr =
+ make_ptr<IOBuf<Char*>, char*>(reinterpret_cast<char*>(dma->fAddress));
+
+ if (!dmaOwnPtr) return {};
+
+ kout << "Returning the new OwnPtr<IOBuf<Char*>>!\r";
+ return dmaOwnPtr;
+}
+
+DMAWrapper& DMAWrapper::operator=(voidPtr Ptr) {
+ this->fAddress = Ptr;
+ return *this;
+}
+} // namespace Kernel