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