File Index
Files and directories
Sign in
FILE

gr.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c C
  1/* SPDX-License-Identifier: MIT
  2 *
  3 * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
  4 */
  5#include <rm/gr.h>
  6
  7#include <subdev/mmu.h>
  8#include <engine/fifo.h>
  9#include <engine/fifo/chid.h>
 10#include <engine/gr/priv.h>
 11
 12#include "nvrm/gr.h"
 13#include "nvrm/engine.h"
 14
 15int
 16r570_gr_tpc_mask(struct nvkm_gsp *gsp, int gpc, u32 *pmask)
 17{
 18	NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS *ctrl;
 19	int ret;
 20
 21	ctrl = nvkm_gsp_rm_ctrl_get(&gsp->internal.device.subdevice,
 22				    NV2080_CTRL_CMD_GPU_GET_FERMI_TPC_INFO, sizeof(*ctrl));
 23	if (IS_ERR(ctrl))
 24		return PTR_ERR(ctrl);
 25
 26	ctrl->gpcId = gpc;
 27
 28	ret = nvkm_gsp_rm_ctrl_push(&gsp->internal.device.subdevice, &ctrl, sizeof(*ctrl));
 29	if (ret)
 30		return ret;
 31
 32	*pmask = ctrl->tpcMask;
 33
 34	nvkm_gsp_rm_ctrl_done(&gsp->internal.device.subdevice, ctrl);
 35	return 0;
 36}
 37
 38int
 39r570_gr_gpc_mask(struct nvkm_gsp *gsp, u32 *pmask)
 40{
 41	NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS *ctrl;
 42
 43	ctrl = nvkm_gsp_rm_ctrl_rd(&gsp->internal.device.subdevice,
 44				   NV2080_CTRL_CMD_GPU_GET_FERMI_GPC_INFO, sizeof(*ctrl));
 45	if (IS_ERR(ctrl))
 46		return PTR_ERR(ctrl);
 47
 48	*pmask = ctrl->gpcMask;
 49
 50	nvkm_gsp_rm_ctrl_done(&gsp->internal.device.subdevice, ctrl);
 51	return 0;
 52}
 53
 54static int
 55r570_gr_scrubber_ctrl(struct r535_gr *gr, bool teardown)
 56{
 57	NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS *ctrl;
 58
 59	ctrl = nvkm_gsp_rm_ctrl_get(&gr->scrubber.vmm->rm.device.subdevice,
 60				    NV2080_CTRL_CMD_INTERNAL_KGR_INIT_BUG4208224_WAR,
 61				    sizeof(*ctrl));
 62	if (IS_ERR(ctrl))
 63		return PTR_ERR(ctrl);
 64
 65	ctrl->bTeardown = teardown;
 66
 67	return nvkm_gsp_rm_ctrl_wr(&gr->scrubber.vmm->rm.device.subdevice, ctrl);
 68}
 69
 70static void
 71r570_gr_scrubber_fini(struct r535_gr *gr)
 72{
 73	/* Teardown scrubber channel on RM. */
 74	if (gr->scrubber.enabled) {
 75		WARN_ON(r570_gr_scrubber_ctrl(gr, true));
 76		gr->scrubber.enabled = false;
 77	}
 78
 79	/* Free scrubber channel. */
 80	nvkm_gsp_rm_free(&gr->scrubber.threed);
 81	nvkm_gsp_rm_free(&gr->scrubber.chan);
 82
 83	for (int i = 0; i < gr->ctxbuf_nr; i++) {
 84		nvkm_vmm_put(gr->scrubber.vmm, &gr->scrubber.ctxbuf.vma[i]);
 85		nvkm_memory_unref(&gr->scrubber.ctxbuf.mem[i]);
 86	}
 87
 88	nvkm_vmm_unref(&gr->scrubber.vmm);
 89	nvkm_memory_unref(&gr->scrubber.inst);
 90}
 91
 92static int
 93r570_gr_scrubber_init(struct r535_gr *gr)
 94{
 95	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
 96	struct nvkm_device *device = subdev->device;
 97	struct nvkm_gsp *gsp = device->gsp;
 98	struct nvkm_rm *rm = gsp->rm;
 99	int ret;
100
101	/* Scrubber channel only required on TU10x. */
102	switch (device->chipset) {
103	case 0x162:
104	case 0x164:
105	case 0x166:
106		break;
107	default:
108		return 0;
109	}
110
111	if (gr->scrubber.chid < 0) {
112		gr->scrubber.chid = nvkm_chid_get(device->fifo->chid, NULL);
113		if (gr->scrubber.chid < 0)
114			return gr->scrubber.chid;
115	}
116
117	/* Allocate scrubber channel. */
118	ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
119			      0x2000 + device->fifo->rm.mthdbuf_size, 0, true,
120			      &gr->scrubber.inst);
121	if (ret)
122		goto done;
123
124	ret = nvkm_vmm_new(device, 0x1000, 0, NULL, 0, NULL, "grScrubberVmm",
125			   &gr->scrubber.vmm);
126	if (ret)
127		goto done;
128
129	ret = r535_mmu_vaspace_new(gr->scrubber.vmm, KGRAPHICS_SCRUBBER_HANDLE_VAS, false);
130	if (ret)
131		goto done;
132
133	ret = rm->api->fifo->chan.alloc(&gr->scrubber.vmm->rm.device, KGRAPHICS_SCRUBBER_HANDLE_CHANNEL,
134					NV2080_ENGINE_TYPE_GR0, 0, false, gr->scrubber.chid,
135					nvkm_memory_addr(gr->scrubber.inst),
136					nvkm_memory_addr(gr->scrubber.inst) + 0x1000,
137					nvkm_memory_addr(gr->scrubber.inst) + 0x2000,
138					gr->scrubber.vmm, 0, 0x1000, &gr->scrubber.chan);
139	if (ret)
140		goto done;
141
142	ret = r535_gr_promote_ctx(gr, false, gr->scrubber.vmm, gr->scrubber.ctxbuf.mem,
143				  gr->scrubber.ctxbuf.vma, &gr->scrubber.chan);
144	if (ret)
145		goto done;
146
147	ret = nvkm_gsp_rm_alloc(&gr->scrubber.chan, KGRAPHICS_SCRUBBER_HANDLE_3DOBJ,
148				rm->gpu->gr.class.threed, 0, &gr->scrubber.threed);
149	if (ret)
150		goto done;
151
152	/* Initialise scrubber channel on RM. */
153	ret = r570_gr_scrubber_ctrl(gr, false);
154	if (ret)
155		goto done;
156
157	gr->scrubber.enabled = true;
158
159done:
160	if (ret)
161		r570_gr_scrubber_fini(gr);
162
163	return ret;
164}
165
166static int
167r570_gr_get_ctxbufs_info(struct r535_gr *gr)
168{
169	NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS *info;
170	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
171	struct nvkm_gsp *gsp = subdev->device->gsp;
172
173	info = nvkm_gsp_rm_ctrl_rd(&gsp->internal.device.subdevice,
174				   NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO,
175				   sizeof(*info));
176	if (WARN_ON(IS_ERR(info)))
177		return PTR_ERR(info);
178
179	for (int i = 0; i < ARRAY_SIZE(info->engineContextBuffersInfo[0].engine); i++)
180		r535_gr_get_ctxbuf_info(gr, i, &info->engineContextBuffersInfo[0].engine[i]);
181
182	nvkm_gsp_rm_ctrl_done(&gsp->internal.device.subdevice, info);
183	return 0;
184}
185
186const struct nvkm_rm_api_gr
187r570_gr = {
188	.get_ctxbufs_info = r570_gr_get_ctxbufs_info,
189	.scrubber.init = r570_gr_scrubber_init,
190	.scrubber.fini = r570_gr_scrubber_fini,
191};
~/ Read-only file preview.