3 #define nvkm_gsp(p) container_of((p), struct nvkm_gsp, subdev)
4 #include <core/subdev.h>
5 #include <core/falcon.h>
6 #include <core/firmware.h>
8 #define GSP_PAGE_SHIFT 12
9 #define GSP_PAGE_SIZE BIT(GSP_PAGE_SHIFT)
17 struct nvkm_gsp_radix3 {
18 struct nvkm_gsp_mem lvl0;
19 struct nvkm_gsp_mem lvl1;
23 int nvkm_gsp_sg(struct nvkm_device *, u64 size, struct sg_table *);
24 void nvkm_gsp_sg_free(struct nvkm_device *, struct sg_table *);
26 typedef int (*nvkm_gsp_msg_ntfy_func)(void *priv, u32 fn, void *repv, u32 repc);
28 struct nvkm_gsp_event;
29 typedef void (*nvkm_gsp_event_func)(struct nvkm_gsp_event *, void *repv, u32 repc);
32 const struct nvkm_gsp_func *func;
33 struct nvkm_subdev subdev;
35 struct nvkm_falcon falcon;
39 const struct firmware *load;
40 const struct firmware *unload;
42 const struct firmware *bl;
43 const struct firmware *rm;
46 struct nvkm_firmware fw;
47 struct nvkm_gsp_mem sig;
48 struct nvkm_gsp_radix3 radix3;
63 } frts, boot, elf, heap;
83 struct nvkm_falcon_fw load;
84 struct nvkm_falcon_fw unload;
88 struct nvkm_gsp_mem fw;
95 struct nvkm_gsp_mem libos;
96 struct nvkm_gsp_mem loginit;
97 struct nvkm_gsp_mem logintr;
98 struct nvkm_gsp_mem logrm;
99 struct nvkm_gsp_mem rmargs;
101 struct nvkm_gsp_mem wpr_meta;
105 struct nvkm_gsp_radix3 radix3;
106 struct nvkm_gsp_mem meta;
110 struct nvkm_gsp_mem mem;
124 struct nvkm_gsp_cmdq {
132 struct nvkm_gsp_msgq {
137 struct nvkm_gsp_msgq_ntfy {
139 nvkm_gsp_msg_ntfy_func func;
143 struct work_struct work;
148 /* Internal GSP-RM control handles. */
150 struct nvkm_gsp_client {
151 struct nvkm_gsp_object {
152 struct nvkm_gsp_client *client;
153 struct nvkm_gsp_object *parent;
157 struct nvkm_gsp *gsp;
159 struct list_head events;
162 struct nvkm_gsp_device {
163 struct nvkm_gsp_object object;
164 struct nvkm_gsp_object subdevice;
169 enum nvkm_subdev_type type;
186 const struct nvkm_gsp_rm {
187 void *(*rpc_get)(struct nvkm_gsp *, u32 fn, u32 argc);
188 void *(*rpc_push)(struct nvkm_gsp *, void *argv, bool wait, u32 repc);
189 void (*rpc_done)(struct nvkm_gsp *gsp, void *repv);
191 void *(*rm_ctrl_get)(struct nvkm_gsp_object *, u32 cmd, u32 argc);
192 int (*rm_ctrl_push)(struct nvkm_gsp_object *, void **argv, u32 repc);
193 void (*rm_ctrl_done)(struct nvkm_gsp_object *, void *repv);
195 void *(*rm_alloc_get)(struct nvkm_gsp_object *, u32 oclass, u32 argc);
196 void *(*rm_alloc_push)(struct nvkm_gsp_object *, void *argv, u32 repc);
197 void (*rm_alloc_done)(struct nvkm_gsp_object *, void *repv);
199 int (*rm_free)(struct nvkm_gsp_object *);
201 int (*client_ctor)(struct nvkm_gsp *, struct nvkm_gsp_client *);
202 void (*client_dtor)(struct nvkm_gsp_client *);
204 int (*device_ctor)(struct nvkm_gsp_client *, struct nvkm_gsp_device *);
205 void (*device_dtor)(struct nvkm_gsp_device *);
207 int (*event_ctor)(struct nvkm_gsp_device *, u32 handle, u32 id,
208 nvkm_gsp_event_func, struct nvkm_gsp_event *);
209 void (*event_dtor)(struct nvkm_gsp_event *);
219 nvkm_gsp_rm(struct nvkm_gsp *gsp)
221 return gsp && (gsp->fws.rm || gsp->fw.img);
225 nvkm_gsp_rpc_get(struct nvkm_gsp *gsp, u32 fn, u32 argc)
227 return gsp->rm->rpc_get(gsp, fn, argc);
231 nvkm_gsp_rpc_push(struct nvkm_gsp *gsp, void *argv, bool wait, u32 repc)
233 return gsp->rm->rpc_push(gsp, argv, wait, repc);
237 nvkm_gsp_rpc_rd(struct nvkm_gsp *gsp, u32 fn, u32 argc)
239 void *argv = nvkm_gsp_rpc_get(gsp, fn, argc);
241 if (IS_ERR_OR_NULL(argv))
244 return nvkm_gsp_rpc_push(gsp, argv, true, argc);
248 nvkm_gsp_rpc_wr(struct nvkm_gsp *gsp, void *argv, bool wait)
250 void *repv = nvkm_gsp_rpc_push(gsp, argv, wait, 0);
253 return PTR_ERR(repv);
259 nvkm_gsp_rpc_done(struct nvkm_gsp *gsp, void *repv)
261 gsp->rm->rpc_done(gsp, repv);
265 nvkm_gsp_rm_ctrl_get(struct nvkm_gsp_object *object, u32 cmd, u32 argc)
267 return object->client->gsp->rm->rm_ctrl_get(object, cmd, argc);
271 nvkm_gsp_rm_ctrl_push(struct nvkm_gsp_object *object, void *argv, u32 repc)
273 return object->client->gsp->rm->rm_ctrl_push(object, argv, repc);
277 nvkm_gsp_rm_ctrl_rd(struct nvkm_gsp_object *object, u32 cmd, u32 repc)
279 void *argv = nvkm_gsp_rm_ctrl_get(object, cmd, repc);
285 ret = nvkm_gsp_rm_ctrl_push(object, &argv, repc);
292 nvkm_gsp_rm_ctrl_wr(struct nvkm_gsp_object *object, void *argv)
294 int ret = nvkm_gsp_rm_ctrl_push(object, &argv, 0);
302 nvkm_gsp_rm_ctrl_done(struct nvkm_gsp_object *object, void *repv)
304 object->client->gsp->rm->rm_ctrl_done(object, repv);
308 nvkm_gsp_rm_alloc_get(struct nvkm_gsp_object *parent, u32 handle, u32 oclass, u32 argc,
309 struct nvkm_gsp_object *object)
311 struct nvkm_gsp_client *client = parent->client;
312 struct nvkm_gsp *gsp = client->gsp;
315 object->client = parent->client;
316 object->parent = parent;
317 object->handle = handle;
319 argv = gsp->rm->rm_alloc_get(object, oclass, argc);
320 if (IS_ERR_OR_NULL(argv)) {
321 object->client = NULL;
329 nvkm_gsp_rm_alloc_push(struct nvkm_gsp_object *object, void *argv, u32 repc)
331 void *repv = object->client->gsp->rm->rm_alloc_push(object, argv, repc);
334 object->client = NULL;
340 nvkm_gsp_rm_alloc_wr(struct nvkm_gsp_object *object, void *argv)
342 void *repv = nvkm_gsp_rm_alloc_push(object, argv, 0);
345 return PTR_ERR(repv);
351 nvkm_gsp_rm_alloc_done(struct nvkm_gsp_object *object, void *repv)
353 object->client->gsp->rm->rm_alloc_done(object, repv);
357 nvkm_gsp_rm_alloc(struct nvkm_gsp_object *parent, u32 handle, u32 oclass, u32 argc,
358 struct nvkm_gsp_object *object)
360 void *argv = nvkm_gsp_rm_alloc_get(parent, handle, oclass, argc, object);
362 if (IS_ERR_OR_NULL(argv))
363 return argv ? PTR_ERR(argv) : -EIO;
365 return nvkm_gsp_rm_alloc_wr(object, argv);
369 nvkm_gsp_rm_free(struct nvkm_gsp_object *object)
372 return object->client->gsp->rm->rm_free(object);
378 nvkm_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client)
380 if (WARN_ON(!gsp->rm))
383 return gsp->rm->client_ctor(gsp, client);
387 nvkm_gsp_client_dtor(struct nvkm_gsp_client *client)
390 client->gsp->rm->client_dtor(client);
394 nvkm_gsp_device_ctor(struct nvkm_gsp_client *client, struct nvkm_gsp_device *device)
396 return client->gsp->rm->device_ctor(client, device);
400 nvkm_gsp_device_dtor(struct nvkm_gsp_device *device)
402 if (device->object.client)
403 device->object.client->gsp->rm->device_dtor(device);
407 nvkm_gsp_client_device_ctor(struct nvkm_gsp *gsp,
408 struct nvkm_gsp_client *client, struct nvkm_gsp_device *device)
410 int ret = nvkm_gsp_client_ctor(gsp, client);
413 ret = nvkm_gsp_device_ctor(client, device);
415 nvkm_gsp_client_dtor(client);
421 struct nvkm_gsp_event {
422 struct nvkm_gsp_device *device;
424 nvkm_gsp_event_func func;
426 struct nvkm_gsp_object object;
428 struct list_head head;
432 nvkm_gsp_device_event_ctor(struct nvkm_gsp_device *device, u32 handle, u32 id,
433 nvkm_gsp_event_func func, struct nvkm_gsp_event *event)
435 return device->object.client->gsp->rm->event_ctor(device, handle, id, func, event);
439 nvkm_gsp_event_dtor(struct nvkm_gsp_event *event)
441 struct nvkm_gsp_device *device = event->device;
444 device->object.client->gsp->rm->event_dtor(event);
447 int nvkm_gsp_intr_stall(struct nvkm_gsp *, enum nvkm_subdev_type, int);
448 int nvkm_gsp_intr_nonstall(struct nvkm_gsp *, enum nvkm_subdev_type, int);
450 int gv100_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
451 int tu102_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
452 int tu116_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
453 int ga100_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
454 int ga102_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
455 int ad102_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);