diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-29 10:51:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-29 10:51:53 +0200 |
| commit | 5c0bb7ee7b1b0fee02cc179fb21f4c57a61d6c2d (patch) | |
| tree | cb17577bcdc9714c97a84ce417a075117097f146 /dev/kernel/DmaKit | |
| parent | d608230b1350b064ceb01e6572519b108f6139b0 (diff) | |
| parent | 3167f59dbb401d6a79b1524537e04218baf49ee3 (diff) | |
Merge pull request #32 from nekernel-org/dev
0.0.2e3
Diffstat (limited to 'dev/kernel/DmaKit')
| -rw-r--r-- | dev/kernel/DmaKit/DmaPool.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h new file mode 100644 index 00000000..ec98745d --- /dev/null +++ b/dev/kernel/DmaKit/DmaPool.h @@ -0,0 +1,88 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss , all rights reserved. + + File: FileMgr.h + Purpose: Kernel file manager. + +------------------------------------------- */ + +#pragma once + +#include <HALKit/AMD64/Processor.h> +#include <KernelKit/DebugOutput.h> + +#ifdef __NE_AMD64__ +#define kNeDMAPoolStart (0x1000000) +#define kNeDMAPoolSize (0x1000000) + +namespace Kernel { +/// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it. +inline UInt8* kDmaPoolPtr = (UInt8*) kNeDMAPoolStart; +inline const UInt8* kDmaPoolEnd = (UInt8*) (kNeDMAPoolStart + kNeDMAPoolSize); + +/***********************************************************************************/ +/// @brief allocate from the rtl_dma_alloc system. +/// @param size the size of the chunk to allocate. +/// @param align alignement of pointer. +/***********************************************************************************/ +inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { + if (!size) { + return nullptr; + } + + UIntPtr addr = (UIntPtr) kDmaPoolPtr; + + /// here we just align the address according to a `align` variable, i'd rather be a power of two + /// really. + addr = (addr + (align - 1)) & ~(align - 1); + + if ((addr + size) >= reinterpret_cast<UIntPtr>(kDmaPoolEnd)) { + err_global_get() = kErrorDmaExhausted; + return nullptr; + } + + kDmaPoolPtr = (UInt8*) (addr + size); + + HAL::mm_memory_fence((VoidPtr)addr); + + return (VoidPtr) addr; +} + +/***********************************************************************************/ +/// @brief Free DMA pointer. +/***********************************************************************************/ +inline Void rtl_dma_free(SizeT size) { + if (!size) return; + + auto ptr = (UInt8*) (kDmaPoolPtr - size); + + if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) { + err_global_get() = kErrorDmaExhausted; + return; + } + + kDmaPoolPtr = ptr; + + HAL::mm_memory_fence(ptr); +} + +/***********************************************************************************/ +/// @brief Flush DMA pointer. +/***********************************************************************************/ +inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) { + if (ptr > kDmaPoolEnd) { + return; + } + + if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) { + err_global_get() = kErrorDmaExhausted; + return; + } + + for (SizeT buf_idx = 0UL; buf_idx < size_buffer; ++buf_idx) { + HAL::mm_memory_fence((VoidPtr) ((UInt8*) ptr + buf_idx)); + } +} +} // namespace Kernel +#endif
\ No newline at end of file |
