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