1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NVKM_FLCNEN_H__
3 #define __NVKM_FLCNEN_H__
4 #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
5 #include <core/engine.h>
8 enum nvkm_falcon_dmaidx {
9 FALCON_DMAIDX_UCODE = 0,
10 FALCON_DMAIDX_VIRT = 1,
11 FALCON_DMAIDX_PHYS_VID = 2,
12 FALCON_DMAIDX_PHYS_SYS_COH = 3,
13 FALCON_DMAIDX_PHYS_SYS_NCOH = 4,
14 FALCON_SEC2_DMAIDX_UCODE = 6,
18 const struct nvkm_falcon_func *func;
19 struct nvkm_subdev *owner;
25 struct mutex dmem_mutex;
28 struct nvkm_subdev *user;
34 struct nvkm_memory *core;
51 struct nvkm_engine engine;
54 int nvkm_falcon_get(struct nvkm_falcon *, struct nvkm_subdev *);
55 void nvkm_falcon_put(struct nvkm_falcon *, struct nvkm_subdev *);
57 int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
58 enum nvkm_subdev_type, int inst, bool enable, u32 addr, struct nvkm_engine **);
60 struct nvkm_falcon_func {
61 int (*disable)(struct nvkm_falcon *);
62 int (*enable)(struct nvkm_falcon *);
63 int (*select)(struct nvkm_falcon *);
67 int (*reset_eng)(struct nvkm_falcon *);
68 int (*reset_prep)(struct nvkm_falcon *);
69 int (*reset_wait_mem_scrubbing)(struct nvkm_falcon *);
72 void (*bind_inst)(struct nvkm_falcon *, int target, u64 addr);
73 int (*bind_stat)(struct nvkm_falcon *, bool intr);
76 const struct nvkm_falcon_func_pio *imem_pio;
77 const struct nvkm_falcon_func_dma *imem_dma;
79 const struct nvkm_falcon_func_pio *dmem_pio;
80 const struct nvkm_falcon_func_dma *dmem_dma;
83 const struct nvkm_falcon_func_pio *emem_pio;
91 bool (*riscv_active)(struct nvkm_falcon *);
92 void (*intr_retrigger)(struct nvkm_falcon *);
102 void (*init)(struct nvkm_falcon *);
103 void (*intr)(struct nvkm_falcon *, struct nvkm_chan *);
105 void (*load_imem)(struct nvkm_falcon *, void *, u32, u32, u16, u8, bool);
106 void (*load_dmem)(struct nvkm_falcon *, void *, u32, u32, u8);
107 void (*start)(struct nvkm_falcon *);
109 struct nvkm_sclass sclass[];
113 nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr)
115 return nvkm_rd32(falcon->owner->device, falcon->addr + addr);
119 nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data)
121 nvkm_wr32(falcon->owner->device, falcon->addr + addr, data);
125 nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val)
127 struct nvkm_device *device = falcon->owner->device;
129 return nvkm_mask(device, falcon->addr + addr, mask, val);
132 void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8,
134 void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
135 void nvkm_falcon_start(struct nvkm_falcon *);