xref: /linux/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
18a8b1ec5SBen Skeggs /* SPDX-License-Identifier: MIT
28a8b1ec5SBen Skeggs  *
38a8b1ec5SBen Skeggs  * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
48a8b1ec5SBen Skeggs  */
58a8b1ec5SBen Skeggs #include <subdev/gsp.h>
68a8b1ec5SBen Skeggs #ifndef __NVKM_RM_H__
78a8b1ec5SBen Skeggs #define __NVKM_RM_H__
838cafe9bSBen Skeggs #include "handles.h"
9a3f32329SBen Skeggs struct nvkm_outp;
102f9974fdSBen Skeggs struct r535_gr;
118a8b1ec5SBen Skeggs 
12befe75aeSBen Skeggs struct nvkm_rm_impl {
1357fe0d30SBen Skeggs 	const struct nvkm_rm_wpr *wpr;
14befe75aeSBen Skeggs 	const struct nvkm_rm_api *api;
15befe75aeSBen Skeggs };
16befe75aeSBen Skeggs 
17befe75aeSBen Skeggs struct nvkm_rm {
18befe75aeSBen Skeggs 	struct nvkm_device *device;
19befe75aeSBen Skeggs 	const struct nvkm_rm_gpu *gpu;
2057fe0d30SBen Skeggs 	const struct nvkm_rm_wpr *wpr;
21befe75aeSBen Skeggs 	const struct nvkm_rm_api *api;
22befe75aeSBen Skeggs };
23befe75aeSBen Skeggs 
2457fe0d30SBen Skeggs struct nvkm_rm_wpr {
2557fe0d30SBen Skeggs 	u32 os_carveout_size;
2657fe0d30SBen Skeggs 	u32 base_size;
2757fe0d30SBen Skeggs 	u64 heap_size_min;
2844f93b20SBen Skeggs 	u32 heap_size_non_wpr;
2932cb1cc3SBen Skeggs 	u32 rsvd_size_pmu;
3044f93b20SBen Skeggs 	bool offset_set_by_acr;
3157fe0d30SBen Skeggs };
3257fe0d30SBen Skeggs 
338a8b1ec5SBen Skeggs struct nvkm_rm_api {
34aa733b3eSBen Skeggs 	const struct nvkm_rm_api_gsp {
35207c445bSBen Skeggs 		void (*set_rmargs)(struct nvkm_gsp *, bool resume);
36aa733b3eSBen Skeggs 		int (*set_system_info)(struct nvkm_gsp *);
377bb77eacSBen Skeggs 		int (*get_static_info)(struct nvkm_gsp *);
3820235009SBen Skeggs 		bool (*xlat_mc_engine_idx)(u32 mc_engine_idx, enum nvkm_subdev_type *, int *inst);
39e95bb6b6SBen Skeggs 		void (*drop_send_user_shared_data)(struct nvkm_gsp *);
4053dac062SBen Skeggs 		void (*drop_post_nocat_record)(struct nvkm_gsp *);
419c86a601SBen Skeggs 		u32 (*sr_data_size)(struct nvkm_gsp *);
42aa733b3eSBen Skeggs 	} *gsp;
43aa733b3eSBen Skeggs 
448a8b1ec5SBen Skeggs 	const struct nvkm_rm_api_rpc {
458a8b1ec5SBen Skeggs 		void *(*get)(struct nvkm_gsp *, u32 fn, u32 argc);
468a8b1ec5SBen Skeggs 		void *(*push)(struct nvkm_gsp *gsp, void *argv,
478a8b1ec5SBen Skeggs 			      enum nvkm_gsp_rpc_reply_policy policy, u32 repc);
488a8b1ec5SBen Skeggs 		void (*done)(struct nvkm_gsp *gsp, void *repv);
498a8b1ec5SBen Skeggs 	} *rpc;
50063d193fSBen Skeggs 
51063d193fSBen Skeggs 	const struct nvkm_rm_api_ctrl {
52063d193fSBen Skeggs 		void *(*get)(struct nvkm_gsp_object *, u32 cmd, u32 params_size);
53063d193fSBen Skeggs 		int (*push)(struct nvkm_gsp_object *, void **params, u32 repc);
54063d193fSBen Skeggs 		void (*done)(struct nvkm_gsp_object *, void *params);
55063d193fSBen Skeggs 	} *ctrl;
56be33f499SBen Skeggs 
57be33f499SBen Skeggs 	const struct nvkm_rm_api_alloc {
58be33f499SBen Skeggs 		void *(*get)(struct nvkm_gsp_object *, u32 oclass, u32 params_size);
59be33f499SBen Skeggs 		void *(*push)(struct nvkm_gsp_object *, void *params);
60be33f499SBen Skeggs 		void (*done)(struct nvkm_gsp_object *, void *params);
61be33f499SBen Skeggs 
62be33f499SBen Skeggs 		int (*free)(struct nvkm_gsp_object *);
63be33f499SBen Skeggs 	} *alloc;
6445a78c64SBen Skeggs 
6545a78c64SBen Skeggs 	const struct nvkm_rm_api_client {
661b9d7b9dSBen Skeggs 		int (*ctor)(struct nvkm_gsp_client *, u32 handle);
6745a78c64SBen Skeggs 	} *client;
68f9643364SBen Skeggs 
69f9643364SBen Skeggs 	const struct nvkm_rm_api_device {
70f9643364SBen Skeggs 		int (*ctor)(struct nvkm_gsp_client *, struct nvkm_gsp_device *);
71f9643364SBen Skeggs 		void (*dtor)(struct nvkm_gsp_device *);
72f9643364SBen Skeggs 
73f9643364SBen Skeggs 		struct {
74f9643364SBen Skeggs 			int (*ctor)(struct nvkm_gsp_device *, u32 handle, u32 id,
75f9643364SBen Skeggs 				    nvkm_gsp_event_func, struct nvkm_gsp_event *);
76f9643364SBen Skeggs 			void (*dtor)(struct nvkm_gsp_event *);
77f9643364SBen Skeggs 		} event;
78f9643364SBen Skeggs 	} *device;
797c2d25f1SBen Skeggs 
80c21b0397SBen Skeggs 	const struct nvkm_rm_api_fbsr {
81c21b0397SBen Skeggs 		int (*suspend)(struct nvkm_gsp *);
82c21b0397SBen Skeggs 		void (*resume)(struct nvkm_gsp *);
83c21b0397SBen Skeggs 	} *fbsr;
84c21b0397SBen Skeggs 
858f8d9bcaSBen Skeggs 	const struct nvkm_rm_api_disp {
866854ce2cSBen Skeggs 		int (*get_static_info)(struct nvkm_disp *);
871cf5940bSBen Skeggs 		int (*get_supported)(struct nvkm_disp *, unsigned long *display_mask);
88bfbae411SBen Skeggs 		int (*get_connect_state)(struct nvkm_disp *, unsigned display_id);
89cf6b2b5eSBen Skeggs 		int (*get_active)(struct nvkm_disp *, unsigned head, u32 *display_id);
906854ce2cSBen Skeggs 
918f8d9bcaSBen Skeggs 		int (*bl_ctrl)(struct nvkm_disp *, unsigned display_id, bool set, int *val);
92a3f32329SBen Skeggs 
93a3f32329SBen Skeggs 		struct {
9437a82fa3SBen Skeggs 			int (*get_caps)(struct nvkm_disp *, int *link_bw, bool *mst, bool *wm);
95a3f32329SBen Skeggs 			int (*set_indexed_link_rates)(struct nvkm_outp *);
96a3f32329SBen Skeggs 		} dp;
97e0ed9434SBen Skeggs 
98e0ed9434SBen Skeggs 		struct {
99e0ed9434SBen Skeggs 			int (*set_pushbuf)(struct nvkm_disp *, s32 oclass, int inst,
100e0ed9434SBen Skeggs 					   struct nvkm_memory *);
101f82fb646SBen Skeggs 			int (*dmac_alloc)(struct nvkm_disp *, u32 oclass, int inst, u32 put_offset,
102f82fb646SBen Skeggs 					  struct nvkm_gsp_object *);
103e0ed9434SBen Skeggs 		} chan;
1048f8d9bcaSBen Skeggs 	} *disp;
1058f8d9bcaSBen Skeggs 
106727937b3SBen Skeggs 	const struct nvkm_rm_api_fifo {
107727937b3SBen Skeggs 		int (*xlat_rm_engine_type)(u32 rm_engine_type,
108727937b3SBen Skeggs 					   enum nvkm_subdev_type *, int *nv2080_type);
109f308c9ffSBen Skeggs 		int (*ectx_size)(struct nvkm_fifo *);
1103194bedaSBen Skeggs 		unsigned rsvd_chids;
1118887abb8SBen Skeggs 		int (*rc_triggered)(void *priv, u32 fn, void *repv, u32 repc);
11227b13dc5SBen Skeggs 		struct {
11327b13dc5SBen Skeggs 			int (*alloc)(struct nvkm_gsp_device *, u32 handle,
11427b13dc5SBen Skeggs 				     u32 nv2080_engine_type, u8 runq, bool priv, int chid,
11527b13dc5SBen Skeggs 				     u64 inst_addr, u64 userd_addr, u64 mthdbuf_addr,
11627b13dc5SBen Skeggs 				     struct nvkm_vmm *, u64 gpfifo_offset, u32 gpfifo_length,
11727b13dc5SBen Skeggs 				     struct nvkm_gsp_object *);
11827b13dc5SBen Skeggs 		} chan;
119727937b3SBen Skeggs 	} *fifo;
120727937b3SBen Skeggs 
1217c2d25f1SBen Skeggs 	const struct nvkm_rm_api_engine {
1227c2d25f1SBen Skeggs 		int (*alloc)(struct nvkm_gsp_object *chan, u32 handle, u32 class, int inst,
1237c2d25f1SBen Skeggs 			     struct nvkm_gsp_object *);
1247c2d25f1SBen Skeggs 	} *ce, *nvdec, *nvenc, *nvjpg, *ofa;
1252f9974fdSBen Skeggs 
1262f9974fdSBen Skeggs 	const struct nvkm_rm_api_gr {
1272f9974fdSBen Skeggs 		int (*get_ctxbufs_info)(struct r535_gr *);
12853dac062SBen Skeggs 		struct {
12953dac062SBen Skeggs 			int (*init)(struct r535_gr *);
13053dac062SBen Skeggs 			void (*fini)(struct r535_gr *);
13153dac062SBen Skeggs 		} scrubber;
1322f9974fdSBen Skeggs 	} *gr;
1338a8b1ec5SBen Skeggs };
1348a8b1ec5SBen Skeggs 
135befe75aeSBen Skeggs extern const struct nvkm_rm_impl r535_rm_tu102;
136befe75aeSBen Skeggs extern const struct nvkm_rm_impl r535_rm_ga102;
137aa733b3eSBen Skeggs extern const struct nvkm_rm_api_gsp r535_gsp;
13853dac062SBen Skeggs typedef struct DOD_METHOD_DATA DOD_METHOD_DATA;
13953dac062SBen Skeggs typedef struct JT_METHOD_DATA JT_METHOD_DATA;
14053dac062SBen Skeggs typedef struct CAPS_METHOD_DATA CAPS_METHOD_DATA;
14153dac062SBen Skeggs void r535_gsp_acpi_dod(acpi_handle, DOD_METHOD_DATA *);
14253dac062SBen Skeggs void r535_gsp_acpi_jt(acpi_handle, JT_METHOD_DATA *);
14353dac062SBen Skeggs void r535_gsp_acpi_caps(acpi_handle, CAPS_METHOD_DATA *);
14453dac062SBen Skeggs struct NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS;
14553dac062SBen Skeggs void r535_gsp_get_static_info_fb(struct nvkm_gsp *,
14653dac062SBen Skeggs 				 const struct NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS *);
1478a8b1ec5SBen Skeggs extern const struct nvkm_rm_api_rpc r535_rpc;
148063d193fSBen Skeggs extern const struct nvkm_rm_api_ctrl r535_ctrl;
149be33f499SBen Skeggs extern const struct nvkm_rm_api_alloc r535_alloc;
15045a78c64SBen Skeggs extern const struct nvkm_rm_api_client r535_client;
15153dac062SBen Skeggs void r535_gsp_client_dtor(struct nvkm_gsp_client *);
152f9643364SBen Skeggs extern const struct nvkm_rm_api_device r535_device;
153bc784972SBen Skeggs int r535_mmu_vaspace_new(struct nvkm_vmm *, u32 handle, bool external);
154bc784972SBen Skeggs void r535_mmu_vaspace_del(struct nvkm_vmm *);
155c21b0397SBen Skeggs extern const struct nvkm_rm_api_fbsr r535_fbsr;
15653dac062SBen Skeggs void r535_fbsr_resume(struct nvkm_gsp *);
15753dac062SBen Skeggs int r535_fbsr_memlist(struct nvkm_gsp_device *, u32 handle, enum nvkm_memory_target,
15853dac062SBen Skeggs 		      u64 phys, u64 size, struct sg_table *, struct nvkm_gsp_object *);
1598f8d9bcaSBen Skeggs extern const struct nvkm_rm_api_disp r535_disp;
160727937b3SBen Skeggs extern const struct nvkm_rm_api_fifo r535_fifo;
16153dac062SBen Skeggs void r535_fifo_rc_chid(struct nvkm_fifo *, int chid);
1627c2d25f1SBen Skeggs extern const struct nvkm_rm_api_engine r535_ce;
1632f9974fdSBen Skeggs extern const struct nvkm_rm_api_gr r535_gr;
1647c2d25f1SBen Skeggs void *r535_gr_dtor(struct nvkm_gr *);
1657c2d25f1SBen Skeggs int r535_gr_oneinit(struct nvkm_gr *);
1667c2d25f1SBen Skeggs u64 r535_gr_units(struct nvkm_gr *);
1677c2d25f1SBen Skeggs int r535_gr_chan_new(struct nvkm_gr *, struct nvkm_chan *, const struct nvkm_oclass *,
1687c2d25f1SBen Skeggs 		     struct nvkm_object **);
16953dac062SBen Skeggs int r535_gr_promote_ctx(struct r535_gr *, bool golden, struct nvkm_vmm *,
17053dac062SBen Skeggs 			struct nvkm_memory **pctxbuf_mem, struct nvkm_vma **pctxbuf_vma,
17153dac062SBen Skeggs 			struct nvkm_gsp_object *chan);
1727c2d25f1SBen Skeggs extern const struct nvkm_rm_api_engine r535_nvdec;
1737c2d25f1SBen Skeggs extern const struct nvkm_rm_api_engine r535_nvenc;
1747c2d25f1SBen Skeggs extern const struct nvkm_rm_api_engine r535_nvjpg;
1757c2d25f1SBen Skeggs extern const struct nvkm_rm_api_engine r535_ofa;
17653dac062SBen Skeggs 
17753dac062SBen Skeggs extern const struct nvkm_rm_impl r570_rm_tu102;
17853dac062SBen Skeggs extern const struct nvkm_rm_impl r570_rm_ga102;
17944f93b20SBen Skeggs extern const struct nvkm_rm_impl r570_rm_gh100;
18032cb1cc3SBen Skeggs extern const struct nvkm_rm_impl r570_rm_gb10x;
181*284ad706SBen Skeggs extern const struct nvkm_rm_impl r570_rm_gb20x;
18253dac062SBen Skeggs extern const struct nvkm_rm_api_gsp r570_gsp;
18353dac062SBen Skeggs extern const struct nvkm_rm_api_client r570_client;
18453dac062SBen Skeggs extern const struct nvkm_rm_api_fbsr r570_fbsr;
18553dac062SBen Skeggs extern const struct nvkm_rm_api_disp r570_disp;
18653dac062SBen Skeggs extern const struct nvkm_rm_api_fifo r570_fifo;
18753dac062SBen Skeggs extern const struct nvkm_rm_api_gr r570_gr;
18853dac062SBen Skeggs int r570_gr_gpc_mask(struct nvkm_gsp *, u32 *mask);
18953dac062SBen Skeggs int r570_gr_tpc_mask(struct nvkm_gsp *, int gpc, u32 *mask);
19053dac062SBen Skeggs extern const struct nvkm_rm_api_engine r570_ofa;
1918a8b1ec5SBen Skeggs #endif
192