#pragma once
#include "types.h"
#include "ioctl.h"

typedef struct NvAddressSpace {
    u32  fd;
    u32  page_size;
    bool has_init;
} NvAddressSpace;

Result nvAddressSpaceCreate(NvAddressSpace* a, u32 page_size);
void   nvAddressSpaceClose(NvAddressSpace* a);

Result nvAddressSpaceAlloc(NvAddressSpace* a, bool sparse, u64 size, iova_t* iova_out);
Result nvAddressSpaceAllocFixed(NvAddressSpace* a, bool sparse, u64 size, iova_t iova);
Result nvAddressSpaceFree(NvAddressSpace* a, iova_t iova, u64 size);

Result nvAddressSpaceMap(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t* iova_out);
Result nvAddressSpaceMapFixed(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t iova);
Result nvAddressSpaceModify(NvAddressSpace* a, iova_t iova, u64 offset, u64 size, NvKind kind);
Result nvAddressSpaceUnmap(NvAddressSpace* a, iova_t iova);