root/drivers/gpu/drm/nouveau/include/nvif/chan.h
/* SPDX-License-Identifier: MIT
 *
 * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
 */
#ifndef __NVIF_CHAN_H__
#define __NVIF_CHAN_H__
#include "push.h"

struct nvif_chan {
        const struct nvif_chan_func {
                struct {
                        u32 (*read_get)(struct nvif_chan *);
                } push;

                struct {
                        u32 (*read_get)(struct nvif_chan *);
                        void (*push)(struct nvif_chan *, bool main, u64 addr, u32 size,
                                     bool no_prefetch);
                        void (*kick)(struct nvif_chan *);
                        int (*post)(struct nvif_chan *, u32 gpptr, u32 pbptr);
                        u32 post_size;
                } gpfifo;

                struct {
                        int (*release)(struct nvif_chan *, u64 addr, u32 data);
                } sem;
        } *func;

        struct {
                struct nvif_map map;
        } userd;

        struct {
                struct nvif_map map;
                u32 cur;
                u32 max;
                int free;
        } gpfifo;

        struct {
                struct nvif_map map;
                u64 addr;
        } sema;

        struct nvif_push push;

        struct nvif_user *usermode;
        u32 doorbell_token;
};

int nvif_chan_dma_wait(struct nvif_chan *, u32 push_nr);

void nvif_chan_gpfifo_ctor(const struct nvif_chan_func *, void *userd, void *gpfifo, u32 gpfifo_size,
                           void *push, u64 push_addr, u32 push_size, struct nvif_chan *);
int nvif_chan_gpfifo_wait(struct nvif_chan *, u32 gpfifo_nr, u32 push_nr);
void nvif_chan_gpfifo_push(struct nvif_chan *, u64 addr, u32 size, bool no_prefetch);
int nvif_chan_gpfifo_post(struct nvif_chan *);

void nvif_chan506f_gpfifo_push(struct nvif_chan *, bool main, u64 addr, u32 size, bool no_prefetch);
void nvif_chan506f_gpfifo_kick(struct nvif_chan *);

int nvif_chan906f_ctor_(const struct nvif_chan_func *, void *userd, void *gpfifo, u32 gpfifo_size,
                        void *push, u64 push_addr, u32 push_size, void *sema, u64 sema_addr,
                        struct nvif_chan *);
u32 nvif_chan906f_read_get(struct nvif_chan *);
u32 nvif_chan906f_gpfifo_read_get(struct nvif_chan *);
int nvif_chan906f_gpfifo_post(struct nvif_chan *, u32 gpptr, u32 pbptr);

int nvif_chan506f_ctor(struct nvif_chan *, void *userd, void *gpfifo, u32 gpfifo_size,
                       void *push, u64 push_addr, u32 push_size);
int nvif_chan906f_ctor(struct nvif_chan *, void *userd, void *gpfifo, u32 gpfifo_size,
                       void *push, u64 push_addr, u32 push_size, void *sema, u64 sema_addr);
int nvif_chanc36f_ctor(struct nvif_chan *, void *userd, void *gpfifo, u32 gpfifo_size,
                       void *push, u64 push_addr, u32 push_size, void *sema, u64 sema_addr,
                       struct nvif_user *usermode, u32 doorbell_token);
#endif