#pragma once

#define GPFIFO_QUEUE_SIZE        0x800
#define GPFIFO_ENTRY_NOT_MAIN    BIT(9)
#define GPFIFO_ENTRY_NO_PREFETCH BIT(31)

typedef struct {
    NvChannel* parent;
    u32 syncpt_id;
    u32 num_entries;
    nvioctl_gpfifo_entry entries[GPFIFO_QUEUE_SIZE];
} NvGpfifo;

Result nvGpfifoCreate(NvGpfifo* f, NvChannel* parent);
void   nvGpfifoClose(NvGpfifo* f);

Result nvGpfifoAppendEntry(NvGpfifo* f, iova_t start, size_t num_cmds, u32 flags);
Result nvGpfifoAppendCmdList(NvGpfifo* f, NvCmdList* cmd_list, u32 flags);
Result nvGpfifoFlush(NvGpfifo* f, u32 fence_incr, NvFence* fence_out);