xref: /openbmc/linux/drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
2a128bbfaSBen Skeggs #ifndef __NVKM_FLCNEN_H__
3a128bbfaSBen Skeggs #define __NVKM_FLCNEN_H__
49d498e0fSBen Skeggs #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
59d498e0fSBen Skeggs #include <core/engine.h>
6*c546656fSBen Skeggs struct nvkm_chan;
7c39f472eSBen Skeggs 
831214108SAlexandre Courbot enum nvkm_falcon_dmaidx {
931214108SAlexandre Courbot 	FALCON_DMAIDX_UCODE		= 0,
1031214108SAlexandre Courbot 	FALCON_DMAIDX_VIRT		= 1,
1131214108SAlexandre Courbot 	FALCON_DMAIDX_PHYS_VID		= 2,
1231214108SAlexandre Courbot 	FALCON_DMAIDX_PHYS_SYS_COH	= 3,
1331214108SAlexandre Courbot 	FALCON_DMAIDX_PHYS_SYS_NCOH	= 4,
14114223aaSAlexandre Courbot 	FALCON_SEC2_DMAIDX_UCODE	= 6,
1531214108SAlexandre Courbot };
1631214108SAlexandre Courbot 
175025407bSBen Skeggs struct nvkm_falcon {
18a83d8872SBen Skeggs 	const struct nvkm_falcon_func *func;
19a9d90860SBen Skeggs 	struct nvkm_subdev *owner;
2031214108SAlexandre Courbot 	const char *name;
21c39f472eSBen Skeggs 	u32 addr;
22a51c69eeSBen Skeggs 	u32 addr2;
2331214108SAlexandre Courbot 
2431214108SAlexandre Courbot 	struct mutex mutex;
25e444de56SAlexandre Courbot 	struct mutex dmem_mutex;
265a4b98cdSBen Skeggs 	bool oneinit;
275a4b98cdSBen Skeggs 
28a9d90860SBen Skeggs 	struct nvkm_subdev *user;
2931214108SAlexandre Courbot 
30c39f472eSBen Skeggs 	u8 version;
31c39f472eSBen Skeggs 	u8 secret;
3231214108SAlexandre Courbot 	bool debug;
33c39f472eSBen Skeggs 
34406ca8c7SBen Skeggs 	struct nvkm_memory *core;
35c39f472eSBen Skeggs 	bool external;
36c39f472eSBen Skeggs 
37c39f472eSBen Skeggs 	struct {
38c39f472eSBen Skeggs 		u32 limit;
39c39f472eSBen Skeggs 		u32 *data;
40c39f472eSBen Skeggs 		u32  size;
4131214108SAlexandre Courbot 		u8 ports;
42c39f472eSBen Skeggs 	} code;
43c39f472eSBen Skeggs 
44c39f472eSBen Skeggs 	struct {
45c39f472eSBen Skeggs 		u32 limit;
46c39f472eSBen Skeggs 		u32 *data;
47c39f472eSBen Skeggs 		u32  size;
4831214108SAlexandre Courbot 		u8 ports;
49c39f472eSBen Skeggs 	} data;
5031214108SAlexandre Courbot 
5131214108SAlexandre Courbot 	struct nvkm_engine engine;
52c39f472eSBen Skeggs };
53c39f472eSBen Skeggs 
54a9d90860SBen Skeggs int nvkm_falcon_get(struct nvkm_falcon *, struct nvkm_subdev *);
55a9d90860SBen Skeggs void nvkm_falcon_put(struct nvkm_falcon *, struct nvkm_subdev *);
5631214108SAlexandre Courbot 
57400c2a45SBen Skeggs int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
5850551b15SBen Skeggs 		     enum nvkm_subdev_type, int inst, bool enable, u32 addr, struct nvkm_engine **);
5953e60da4SBen Skeggs 
60a83d8872SBen Skeggs struct nvkm_falcon_func {
61f15cde64SBen Skeggs 	int (*disable)(struct nvkm_falcon *);
62f15cde64SBen Skeggs 	int (*enable)(struct nvkm_falcon *);
634b569dedSBen Skeggs 	int (*select)(struct nvkm_falcon *);
64a51c69eeSBen Skeggs 	u32 addr2;
65f15cde64SBen Skeggs 	bool reset_pmc;
66f15cde64SBen Skeggs 	int (*reset_eng)(struct nvkm_falcon *);
67a51c69eeSBen Skeggs 	int (*reset_prep)(struct nvkm_falcon *);
68f15cde64SBen Skeggs 	int (*reset_wait_mem_scrubbing)(struct nvkm_falcon *);
69f15cde64SBen Skeggs 
700e44c217SBen Skeggs 	u32 debug;
712541626cSBen Skeggs 	void (*bind_inst)(struct nvkm_falcon *, int target, u64 addr);
722541626cSBen Skeggs 	int (*bind_stat)(struct nvkm_falcon *, bool intr);
732541626cSBen Skeggs 	bool bind_intr;
742541626cSBen Skeggs 
750e44c217SBen Skeggs 	const struct nvkm_falcon_func_pio *imem_pio;
76a51c69eeSBen Skeggs 	const struct nvkm_falcon_func_dma *imem_dma;
77a51c69eeSBen Skeggs 
780e44c217SBen Skeggs 	const struct nvkm_falcon_func_pio *dmem_pio;
79a51c69eeSBen Skeggs 	const struct nvkm_falcon_func_dma *dmem_dma;
800e44c217SBen Skeggs 
812541626cSBen Skeggs 	u32 emem_addr;
822541626cSBen Skeggs 	const struct nvkm_falcon_func_pio *emem_pio;
832541626cSBen Skeggs 
842541626cSBen Skeggs 	struct {
852541626cSBen Skeggs 		u32 head;
862541626cSBen Skeggs 		u32 tail;
872541626cSBen Skeggs 		u32 stride;
882541626cSBen Skeggs 	} cmdq, msgq;
892541626cSBen Skeggs 
9053e60da4SBen Skeggs 	struct {
9153e60da4SBen Skeggs 		u32 *data;
9253e60da4SBen Skeggs 		u32  size;
9353e60da4SBen Skeggs 	} code;
9453e60da4SBen Skeggs 	struct {
9553e60da4SBen Skeggs 		u32 *data;
9653e60da4SBen Skeggs 		u32  size;
9753e60da4SBen Skeggs 	} data;
9853e60da4SBen Skeggs 	void (*init)(struct nvkm_falcon *);
99c358f538SBen Skeggs 	void (*intr)(struct nvkm_falcon *, struct nvkm_chan *);
100fb0a5bbeSBen Skeggs 
10131214108SAlexandre Courbot 	void (*load_imem)(struct nvkm_falcon *, void *, u32, u32, u16, u8, bool);
10231214108SAlexandre Courbot 	void (*load_dmem)(struct nvkm_falcon *, void *, u32, u32, u8);
10331214108SAlexandre Courbot 	void (*start)(struct nvkm_falcon *);
10431214108SAlexandre Courbot 
1059d498e0fSBen Skeggs 	struct nvkm_sclass sclass[];
106a83d8872SBen Skeggs };
10731214108SAlexandre Courbot 
10831214108SAlexandre Courbot static inline u32
nvkm_falcon_rd32(struct nvkm_falcon * falcon,u32 addr)10931214108SAlexandre Courbot nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr)
11031214108SAlexandre Courbot {
11131214108SAlexandre Courbot 	return nvkm_rd32(falcon->owner->device, falcon->addr + addr);
11231214108SAlexandre Courbot }
11331214108SAlexandre Courbot 
11431214108SAlexandre Courbot static inline void
nvkm_falcon_wr32(struct nvkm_falcon * falcon,u32 addr,u32 data)11531214108SAlexandre Courbot nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data)
11631214108SAlexandre Courbot {
11731214108SAlexandre Courbot 	nvkm_wr32(falcon->owner->device, falcon->addr + addr, data);
11831214108SAlexandre Courbot }
11931214108SAlexandre Courbot 
12031214108SAlexandre Courbot static inline u32
nvkm_falcon_mask(struct nvkm_falcon * falcon,u32 addr,u32 mask,u32 val)12131214108SAlexandre Courbot nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val)
12231214108SAlexandre Courbot {
12331214108SAlexandre Courbot 	struct nvkm_device *device = falcon->owner->device;
12431214108SAlexandre Courbot 
12531214108SAlexandre Courbot 	return nvkm_mask(device, falcon->addr + addr, mask, val);
12631214108SAlexandre Courbot }
12731214108SAlexandre Courbot 
12831214108SAlexandre Courbot void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8,
12931214108SAlexandre Courbot 			   bool);
13031214108SAlexandre Courbot void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
13131214108SAlexandre Courbot void nvkm_falcon_start(struct nvkm_falcon *);
132c39f472eSBen Skeggs #endif
133