brintos

brintos / linux-shallow public Read only

0
0
Text · 3.1 KiB · 341f133 Raw
137 lines · c
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>6struct nvkm_chan;7 8enum 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,15};16 17struct nvkm_falcon {18	const struct nvkm_falcon_func *func;19	struct nvkm_subdev *owner;20	const char *name;21	u32 addr;22	u32 addr2;23 24	struct mutex mutex;25	struct mutex dmem_mutex;26	bool oneinit;27 28	struct nvkm_subdev *user;29 30	u8 version;31	u8 secret;32	bool debug;33 34	struct nvkm_memory *core;35	bool external;36 37	struct {38		u32 limit;39		u32 *data;40		u32  size;41		u8 ports;42	} code;43 44	struct {45		u32 limit;46		u32 *data;47		u32  size;48		u8 ports;49	} data;50 51	struct nvkm_engine engine;52};53 54int nvkm_falcon_get(struct nvkm_falcon *, struct nvkm_subdev *);55void nvkm_falcon_put(struct nvkm_falcon *, struct nvkm_subdev *);56 57int 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 **);59 60struct nvkm_falcon_func {61	int (*disable)(struct nvkm_falcon *);62	int (*enable)(struct nvkm_falcon *);63	int (*select)(struct nvkm_falcon *);64	u32 addr2;65	u32 riscv_irqmask;66	bool reset_pmc;67	int (*reset_eng)(struct nvkm_falcon *);68	int (*reset_prep)(struct nvkm_falcon *);69	int (*reset_wait_mem_scrubbing)(struct nvkm_falcon *);70 71	u32 debug;72	void (*bind_inst)(struct nvkm_falcon *, int target, u64 addr);73	int (*bind_stat)(struct nvkm_falcon *, bool intr);74	bool bind_intr;75 76	const struct nvkm_falcon_func_pio *imem_pio;77	const struct nvkm_falcon_func_dma *imem_dma;78 79	const struct nvkm_falcon_func_pio *dmem_pio;80	const struct nvkm_falcon_func_dma *dmem_dma;81 82	u32 emem_addr;83	const struct nvkm_falcon_func_pio *emem_pio;84 85	struct {86		u32 head;87		u32 tail;88		u32 stride;89	} cmdq, msgq;90 91	bool (*riscv_active)(struct nvkm_falcon *);92	void (*intr_retrigger)(struct nvkm_falcon *);93 94	struct {95		u32 *data;96		u32  size;97	} code;98	struct {99		u32 *data;100		u32  size;101	} data;102	void (*init)(struct nvkm_falcon *);103	void (*intr)(struct nvkm_falcon *, struct nvkm_chan *);104 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 *);108 109	struct nvkm_sclass sclass[];110};111 112static inline u32113nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr)114{115	return nvkm_rd32(falcon->owner->device, falcon->addr + addr);116}117 118static inline void119nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data)120{121	nvkm_wr32(falcon->owner->device, falcon->addr + addr, data);122}123 124static inline u32125nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val)126{127	struct nvkm_device *device = falcon->owner->device;128 129	return nvkm_mask(device, falcon->addr + addr, mask, val);130}131 132void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8,133			   bool);134void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);135void nvkm_falcon_start(struct nvkm_falcon *);136#endif137