12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #pragma once
- #include <common/sys/types.h>
- #include <common/glib.h>
- #include "mm-types.h"
- #include "mm.h"
- #include "slab.h"
- #define MMIO_BUDDY_MAX_EXP PAGE_1G_SHIFT
- #define MMIO_BUDDY_MIN_EXP PAGE_4K_SHIFT
- #define MMIO_BUDDY_REGION_COUNT (MMIO_BUDDY_MAX_EXP - MMIO_BUDDY_MIN_EXP + 1)
- struct __mmio_buddy_addr_region
- {
- struct List list;
- uint64_t vaddr;
- };
- struct __mmio_free_region_list
- {
- struct List list_head;
- int64_t num_free;
- };
- struct mmio_buddy_mem_pool
- {
- uint64_t pool_start_addr;
- uint64_t pool_size;
- spinlock_t op_lock;
-
- struct __mmio_free_region_list free_regions[MMIO_BUDDY_REGION_COUNT];
- };
- static __always_inline void __mmio_buddy_release_addr_region(struct __mmio_buddy_addr_region *region)
- {
- kfree(region);
- }
- int __mmio_buddy_give_back(uint64_t vaddr, int exp);
- void mmio_buddy_init();
- struct __mmio_buddy_addr_region *mmio_buddy_query_addr_region(int exp);
|