File Index
Files and directories
Sign in
FILE

gsp.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c C
   1/*
   2 * Copyright 2023 Red Hat Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 */
  22#include <rm/rpc.h>
  23
  24#include "priv.h"
  25
  26#include <core/pci.h>
  27#include <subdev/pci/priv.h>
  28#include <subdev/timer.h>
  29#include <subdev/vfn.h>
  30#include <engine/fifo/chan.h>
  31#include <engine/sec2.h>
  32#include <nvif/log.h>
  33
  34#include <nvfw/fw.h>
  35
  36#include "nvrm/gsp.h"
  37#include "nvrm/rpcfn.h"
  38#include "nvrm/msgfn.h"
  39#include "nvrm/event.h"
  40#include "nvrm/fifo.h"
  41
  42#include <linux/acpi.h>
  43#include <linux/ctype.h>
  44#include <linux/parser.h>
  45
  46extern struct dentry *nouveau_debugfs_root;
  47
  48static void
  49r535_gsp_msgq_work(struct work_struct *work)
  50{
  51	struct nvkm_gsp *gsp = container_of(work, typeof(*gsp), msgq.work);
  52
  53	mutex_lock(&gsp->cmdq.mutex);
  54	if (*gsp->msgq.rptr != *gsp->msgq.wptr)
  55		r535_gsp_msg_recv(gsp, 0, 0);
  56	mutex_unlock(&gsp->cmdq.mutex);
  57}
  58
  59static irqreturn_t
  60r535_gsp_intr(struct nvkm_inth *inth)
  61{
  62	struct nvkm_gsp *gsp = container_of(inth, typeof(*gsp), subdev.inth);
  63	struct nvkm_subdev *subdev = &gsp->subdev;
  64	u32 intr = nvkm_falcon_rd32(&gsp->falcon, 0x0008);
  65	u32 inte = nvkm_falcon_rd32(&gsp->falcon, gsp->falcon.func->addr2 +
  66						  gsp->falcon.func->riscv_irqmask);
  67	u32 stat = intr & inte;
  68
  69	if (!stat) {
  70		nvkm_debug(subdev, "inte %08x %08x\n", intr, inte);
  71		return IRQ_NONE;
  72	}
  73
  74	if (stat & 0x00000040) {
  75		nvkm_falcon_wr32(&gsp->falcon, 0x004, 0x00000040);
  76		schedule_work(&gsp->msgq.work);
  77		stat &= ~0x00000040;
  78	}
  79
  80	if (stat) {
  81		nvkm_error(subdev, "intr %08x\n", stat);
  82		nvkm_falcon_wr32(&gsp->falcon, 0x014, stat);
  83		nvkm_falcon_wr32(&gsp->falcon, 0x004, stat);
  84	}
  85
  86	nvkm_falcon_intr_retrigger(&gsp->falcon);
  87	return IRQ_HANDLED;
  88}
  89
  90static bool
  91r535_gsp_xlat_mc_engine_idx(u32 mc_engine_idx, enum nvkm_subdev_type *ptype, int *pinst)
  92{
  93	switch (mc_engine_idx) {
  94	case MC_ENGINE_IDX_GSP:
  95		*ptype = NVKM_SUBDEV_GSP;
  96		*pinst = 0;
  97		return true;
  98	case MC_ENGINE_IDX_DISP:
  99		*ptype = NVKM_ENGINE_DISP;
 100		*pinst = 0;
 101		return true;
 102	case MC_ENGINE_IDX_CE0 ... MC_ENGINE_IDX_CE9:
 103		*ptype = NVKM_ENGINE_CE;
 104		*pinst = mc_engine_idx - MC_ENGINE_IDX_CE0;
 105		return true;
 106	case MC_ENGINE_IDX_GR0:
 107		*ptype = NVKM_ENGINE_GR;
 108		*pinst = 0;
 109		return true;
 110	case MC_ENGINE_IDX_NVDEC0 ... MC_ENGINE_IDX_NVDEC7:
 111		*ptype = NVKM_ENGINE_NVDEC;
 112		*pinst = mc_engine_idx - MC_ENGINE_IDX_NVDEC0;
 113		return true;
 114	case MC_ENGINE_IDX_MSENC ... MC_ENGINE_IDX_MSENC2:
 115		*ptype = NVKM_ENGINE_NVENC;
 116		*pinst = mc_engine_idx - MC_ENGINE_IDX_MSENC;
 117		return true;
 118	case MC_ENGINE_IDX_NVJPEG0 ... MC_ENGINE_IDX_NVJPEG7:
 119		*ptype = NVKM_ENGINE_NVJPG;
 120		*pinst = mc_engine_idx - MC_ENGINE_IDX_NVJPEG0;
 121		return true;
 122	case MC_ENGINE_IDX_OFA0:
 123		*ptype = NVKM_ENGINE_OFA;
 124		*pinst = 0;
 125		return true;
 126	default:
 127		return false;
 128	}
 129}
 130
 131static int
 132r535_gsp_intr_get_table(struct nvkm_gsp *gsp)
 133{
 134	NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS *ctrl;
 135	const struct nvkm_rm_api *rmapi = gsp->rm->api;
 136	int ret = 0;
 137
 138	ctrl = nvkm_gsp_rm_ctrl_get(&gsp->internal.device.subdevice,
 139				    NV2080_CTRL_CMD_INTERNAL_INTR_GET_KERNEL_TABLE, sizeof(*ctrl));
 140	if (IS_ERR(ctrl))
 141		return PTR_ERR(ctrl);
 142
 143	ret = nvkm_gsp_rm_ctrl_push(&gsp->internal.device.subdevice, &ctrl, sizeof(*ctrl));
 144	if (WARN_ON(ret)) {
 145		nvkm_gsp_rm_ctrl_done(&gsp->internal.device.subdevice, ctrl);
 146		return ret;
 147	}
 148
 149	for (unsigned i = 0; i < ctrl->tableLen; i++) {
 150		enum nvkm_subdev_type type;
 151		int inst;
 152
 153		nvkm_debug(&gsp->subdev,
 154			   "%2d: engineIdx %3d pmcIntrMask %08x stall %08x nonStall %08x\n", i,
 155			   ctrl->table[i].engineIdx, ctrl->table[i].pmcIntrMask,
 156			   ctrl->table[i].vectorStall, ctrl->table[i].vectorNonStall);
 157
 158		if (!rmapi->gsp->xlat_mc_engine_idx(ctrl->table[i].engineIdx, &type, &inst))
 159			continue;
 160
 161		if (WARN_ON(gsp->intr_nr == ARRAY_SIZE(gsp->intr))) {
 162			ret = -ENOSPC;
 163			break;
 164		}
 165
 166		gsp->intr[gsp->intr_nr].type = type;
 167		gsp->intr[gsp->intr_nr].inst = inst;
 168		gsp->intr[gsp->intr_nr].stall = ctrl->table[i].vectorStall;
 169		gsp->intr[gsp->intr_nr].nonstall = ctrl->table[i].vectorNonStall;
 170		gsp->intr_nr++;
 171	}
 172
 173	nvkm_gsp_rm_ctrl_done(&gsp->internal.device.subdevice, ctrl);
 174	return ret;
 175}
 176
 177void
 178r535_gsp_get_static_info_fb(struct nvkm_gsp *gsp,
 179			    const struct NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS *info)
 180{
 181	int last_usable = -1;
 182
 183	for (int i = 0; i < info->numFBRegions; i++) {
 184		const NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO *reg = &info->fbRegion[i];
 185
 186		nvkm_debug(&gsp->subdev, "fb region %d: "
 187			   "%016llx-%016llx rsvd:%016llx perf:%08x comp:%d iso:%d prot:%d\n", i,
 188			   reg->base, reg->limit, reg->reserved, reg->performance,
 189			   reg->supportCompressed, reg->supportISO, reg->bProtected);
 190
 191		if (!reg->reserved && !reg->bProtected) {
 192			if (reg->supportCompressed && reg->supportISO &&
 193			    !WARN_ON_ONCE(gsp->fb.region_nr >= ARRAY_SIZE(gsp->fb.region))) {
 194					const u64 size = (reg->limit + 1) - reg->base;
 195
 196					gsp->fb.region[gsp->fb.region_nr].addr = reg->base;
 197					gsp->fb.region[gsp->fb.region_nr].size = size;
 198					gsp->fb.region_nr++;
 199			}
 200
 201			last_usable = i;
 202		}
 203	}
 204
 205	if (last_usable >= 0) {
 206		u32 rsvd_base = info->fbRegion[last_usable].limit + 1;
 207
 208		gsp->fb.rsvd_size = gsp->fb.heap.addr - rsvd_base;
 209	}
 210}
 211
 212static int
 213r535_gsp_get_static_info(struct nvkm_gsp *gsp)
 214{
 215	GspStaticConfigInfo *rpc;
 216
 217	rpc = nvkm_gsp_rpc_rd(gsp, NV_VGPU_MSG_FUNCTION_GET_GSP_STATIC_INFO, sizeof(*rpc));
 218	if (IS_ERR(rpc))
 219		return PTR_ERR(rpc);
 220
 221	gsp->internal.client.object.client = &gsp->internal.client;
 222	gsp->internal.client.object.parent = NULL;
 223	gsp->internal.client.object.handle = rpc->hInternalClient;
 224	gsp->internal.client.gsp = gsp;
 225
 226	gsp->internal.device.object.client = &gsp->internal.client;
 227	gsp->internal.device.object.parent = &gsp->internal.client.object;
 228	gsp->internal.device.object.handle = rpc->hInternalDevice;
 229
 230	gsp->internal.device.subdevice.client = &gsp->internal.client;
 231	gsp->internal.device.subdevice.parent = &gsp->internal.device.object;
 232	gsp->internal.device.subdevice.handle = rpc->hInternalSubdevice;
 233
 234	gsp->bar.rm_bar1_pdb = rpc->bar1PdeBase;
 235	gsp->bar.rm_bar2_pdb = rpc->bar2PdeBase;
 236
 237	r535_gsp_get_static_info_fb(gsp, &rpc->fbRegionInfoParams);
 238
 239	for (int gpc = 0; gpc < ARRAY_SIZE(rpc->tpcInfo); gpc++) {
 240		if (rpc->gpcInfo.gpcMask & BIT(gpc)) {
 241			gsp->gr.tpcs += hweight32(rpc->tpcInfo[gpc].tpcMask);
 242			gsp->gr.gpcs++;
 243		}
 244	}
 245
 246	nvkm_gsp_rpc_done(gsp, rpc);
 247	return 0;
 248}
 249
 250void
 251nvkm_gsp_mem_dtor(struct nvkm_gsp_mem *mem)
 252{
 253	if (mem->data) {
 254		/*
 255		 * Poison the buffer to catch any unexpected access from
 256		 * GSP-RM if the buffer was prematurely freed.
 257		 */
 258		memset(mem->data, 0xFF, mem->size);
 259
 260		dma_free_coherent(mem->dev, mem->size, mem->data, mem->addr);
 261		put_device(mem->dev);
 262
 263		memset(mem, 0, sizeof(*mem));
 264	}
 265}
 266
 267/**
 268 * nvkm_gsp_mem_ctor - constructor for nvkm_gsp_mem objects
 269 * @gsp: gsp pointer
 270 * @size: number of bytes to allocate
 271 * @mem: nvkm_gsp_mem object to initialize
 272 *
 273 * Allocates a block of memory for use with GSP.
 274 *
 275 * This memory block can potentially out-live the driver's remove() callback,
 276 * so we take a device reference to ensure its lifetime. The reference is
 277 * dropped in the destructor.
 278 */
 279int
 280nvkm_gsp_mem_ctor(struct nvkm_gsp *gsp, size_t size, struct nvkm_gsp_mem *mem)
 281{
 282	mem->data = dma_alloc_coherent(gsp->subdev.device->dev, size, &mem->addr, GFP_KERNEL);
 283	if (WARN_ON(!mem->data))
 284		return -ENOMEM;
 285
 286	mem->size = size;
 287	mem->dev = get_device(gsp->subdev.device->dev);
 288
 289	return 0;
 290}
 291
 292static int
 293r535_gsp_postinit(struct nvkm_gsp *gsp)
 294{
 295	struct nvkm_device *device = gsp->subdev.device;
 296	const struct nvkm_rm_api *rmapi = gsp->rm->api;
 297	int ret;
 298
 299	ret = rmapi->gsp->get_static_info(gsp);
 300	if (WARN_ON(ret))
 301		return ret;
 302
 303	INIT_WORK(&gsp->msgq.work, r535_gsp_msgq_work);
 304
 305	ret = r535_gsp_intr_get_table(gsp);
 306	if (WARN_ON(ret))
 307		return ret;
 308
 309	ret = nvkm_gsp_intr_stall(gsp, gsp->subdev.type, gsp->subdev.inst);
 310	if (WARN_ON(ret < 0))
 311		return ret;
 312
 313	ret = nvkm_inth_add(&device->vfn->intr, ret, NVKM_INTR_PRIO_NORMAL, &gsp->subdev,
 314			    r535_gsp_intr, &gsp->subdev.inth);
 315	if (WARN_ON(ret))
 316		return ret;
 317
 318	nvkm_inth_allow(&gsp->subdev.inth);
 319	nvkm_wr32(device, 0x110004, 0x00000040);
 320
 321	/* Release the DMA buffers that were needed only for boot and init */
 322	nvkm_gsp_mem_dtor(&gsp->boot.fw);
 323	nvkm_gsp_mem_dtor(&gsp->libos);
 324
 325	return ret;
 326}
 327
 328static int
 329r535_gsp_rpc_unloading_guest_driver(struct nvkm_gsp *gsp, bool suspend)
 330{
 331	rpc_unloading_guest_driver_v1F_07 *rpc;
 332
 333	rpc = nvkm_gsp_rpc_get(gsp, NV_VGPU_MSG_FUNCTION_UNLOADING_GUEST_DRIVER, sizeof(*rpc));
 334	if (IS_ERR(rpc))
 335		return PTR_ERR(rpc);
 336
 337	if (suspend) {
 338		rpc->bInPMTransition = 1;
 339		rpc->bGc6Entering = 0;
 340		rpc->newLevel = NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3;
 341	} else {
 342		rpc->bInPMTransition = 0;
 343		rpc->bGc6Entering = 0;
 344		rpc->newLevel = NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_0;
 345	}
 346
 347	return nvkm_gsp_rpc_wr(gsp, rpc, NVKM_GSP_RPC_REPLY_RECV);
 348}
 349
 350enum registry_type {
 351	REGISTRY_TABLE_ENTRY_TYPE_DWORD  = 1, /* 32-bit unsigned integer */
 352	REGISTRY_TABLE_ENTRY_TYPE_BINARY = 2, /* Binary blob */
 353	REGISTRY_TABLE_ENTRY_TYPE_STRING = 3, /* Null-terminated string */
 354};
 355
 356/* An arbitrary limit to the length of a registry key */
 357#define REGISTRY_MAX_KEY_LENGTH		64
 358
 359/**
 360 * struct registry_list_entry - linked list member for a registry key/value
 361 * @head: list_head struct
 362 * @type: dword, binary, or string
 363 * @klen: the length of name of the key
 364 * @vlen: the length of the value
 365 * @key: the key name
 366 * @dword: the data, if REGISTRY_TABLE_ENTRY_TYPE_DWORD
 367 * @binary: the data, if TYPE_BINARY or TYPE_STRING
 368 *
 369 * Every registry key/value is represented internally by this struct.
 370 *
 371 * Type DWORD is a simple 32-bit unsigned integer, and its value is stored in
 372 * @dword.
 373 *
 374 * Types BINARY and STRING are variable-length binary blobs.  The only real
 375 * difference between BINARY and STRING is that STRING is null-terminated and
 376 * is expected to contain only printable characters.
 377 *
 378 * Note: it is technically possible to have multiple keys with the same name
 379 * but different types, but this is not useful since GSP-RM expects keys to
 380 * have only one specific type.
 381 */
 382struct registry_list_entry {
 383	struct list_head head;
 384	enum registry_type type;
 385	size_t klen;
 386	char key[REGISTRY_MAX_KEY_LENGTH];
 387	size_t vlen;
 388	u32 dword;			/* TYPE_DWORD */
 389	u8 binary[] __counted_by(vlen);	/* TYPE_BINARY or TYPE_STRING */
 390};
 391
 392/**
 393 * add_registry -- adds a registry entry
 394 * @gsp: gsp pointer
 395 * @key: name of the registry key
 396 * @type: type of data
 397 * @data: pointer to value
 398 * @length: size of data, in bytes
 399 *
 400 * Adds a registry key/value pair to the registry database.
 401 *
 402 * This function collects the registry information in a linked list.  After
 403 * all registry keys have been added, build_registry() is used to create the
 404 * RPC data structure.
 405 *
 406 * registry_rpc_size is a running total of the size of all registry keys.
 407 * It's used to avoid an O(n) calculation of the size when the RPC is built.
 408 *
 409 * Returns 0 on success, or negative error code on error.
 410 */
 411static int add_registry(struct nvkm_gsp *gsp, const char *key,
 412			enum registry_type type, const void *data, size_t length)
 413{
 414	struct registry_list_entry *reg;
 415	const size_t nlen = strnlen(key, REGISTRY_MAX_KEY_LENGTH) + 1;
 416	size_t alloc_size; /* extra bytes to alloc for binary or string value */
 417
 418	if (nlen > REGISTRY_MAX_KEY_LENGTH)
 419		return -EINVAL;
 420
 421	alloc_size = (type == REGISTRY_TABLE_ENTRY_TYPE_DWORD) ? 0 : length;
 422
 423	reg = kmalloc(sizeof(*reg) + alloc_size, GFP_KERNEL);
 424	if (!reg)
 425		return -ENOMEM;
 426
 427	switch (type) {
 428	case REGISTRY_TABLE_ENTRY_TYPE_DWORD:
 429		reg->dword = *(const u32 *)(data);
 430		break;
 431	case REGISTRY_TABLE_ENTRY_TYPE_BINARY:
 432	case REGISTRY_TABLE_ENTRY_TYPE_STRING:
 433		memcpy(reg->binary, data, alloc_size);
 434		break;
 435	default:
 436		nvkm_error(&gsp->subdev, "unrecognized registry type %u for '%s'\n",
 437			   type, key);
 438		kfree(reg);
 439		return -EINVAL;
 440	}
 441
 442	memcpy(reg->key, key, nlen);
 443	reg->klen = nlen;
 444	reg->vlen = length;
 445	reg->type = type;
 446
 447	list_add_tail(&reg->head, &gsp->registry_list);
 448	gsp->registry_rpc_size += sizeof(PACKED_REGISTRY_ENTRY) + nlen + alloc_size;
 449
 450	return 0;
 451}
 452
 453static int add_registry_num(struct nvkm_gsp *gsp, const char *key, u32 value)
 454{
 455	return add_registry(gsp, key, REGISTRY_TABLE_ENTRY_TYPE_DWORD,
 456			    &value, sizeof(u32));
 457}
 458
 459static int add_registry_string(struct nvkm_gsp *gsp, const char *key, const char *value)
 460{
 461	return add_registry(gsp, key, REGISTRY_TABLE_ENTRY_TYPE_STRING,
 462			    value, strlen(value) + 1);
 463}
 464
 465/**
 466 * build_registry -- create the registry RPC data
 467 * @gsp: gsp pointer
 468 * @registry: pointer to the RPC payload to fill
 469 *
 470 * After all registry key/value pairs have been added, call this function to
 471 * build the RPC.
 472 *
 473 * The registry RPC looks like this:
 474 *
 475 * +-----------------+
 476 * |NvU32 size;      |
 477 * |NvU32 numEntries;|
 478 * +-----------------+
 479 * +----------------------------------------+
 480 * |PACKED_REGISTRY_ENTRY                   |
 481 * +----------------------------------------+
 482 * |Null-terminated key (string) for entry 0|
 483 * +----------------------------------------+
 484 * |Binary/string data value for entry 0    | (only if necessary)
 485 * +----------------------------------------+
 486 *
 487 * +----------------------------------------+
 488 * |PACKED_REGISTRY_ENTRY                   |
 489 * +----------------------------------------+
 490 * |Null-terminated key (string) for entry 1|
 491 * +----------------------------------------+
 492 * |Binary/string data value for entry 1    | (only if necessary)
 493 * +----------------------------------------+
 494 * ... (and so on, one copy for each entry)
 495 *
 496 *
 497 * The 'data' field of an entry is either a 32-bit integer (for type DWORD)
 498 * or an offset into the PACKED_REGISTRY_TABLE (for types BINARY and STRING).
 499 *
 500 * All memory allocated by add_registry() is released.
 501 */
 502static void build_registry(struct nvkm_gsp *gsp, PACKED_REGISTRY_TABLE *registry)
 503{
 504	struct registry_list_entry *reg, *n;
 505	size_t str_offset;
 506	unsigned int i = 0;
 507
 508	registry->numEntries = list_count_nodes(&gsp->registry_list);
 509	str_offset = struct_size(registry, entries, registry->numEntries);
 510
 511	list_for_each_entry_safe(reg, n, &gsp->registry_list, head) {
 512		registry->entries[i].type = reg->type;
 513		registry->entries[i].length = reg->vlen;
 514
 515		/* Append the key name to the table */
 516		registry->entries[i].nameOffset = str_offset;
 517		memcpy((void *)registry + str_offset, reg->key, reg->klen);
 518		str_offset += reg->klen;
 519
 520		switch (reg->type) {
 521		case REGISTRY_TABLE_ENTRY_TYPE_DWORD:
 522			registry->entries[i].data = reg->dword;
 523			break;
 524		case REGISTRY_TABLE_ENTRY_TYPE_BINARY:
 525		case REGISTRY_TABLE_ENTRY_TYPE_STRING:
 526			/* If the type is binary or string, also append the value */
 527			memcpy((void *)registry + str_offset, reg->binary, reg->vlen);
 528			registry->entries[i].data = str_offset;
 529			str_offset += reg->vlen;
 530			break;
 531		default:
 532			break;
 533		}
 534
 535		i++;
 536		list_del(&reg->head);
 537		kfree(reg);
 538	}
 539
 540	/* Double-check that we calculated the sizes correctly */
 541	WARN_ON(gsp->registry_rpc_size != str_offset);
 542
 543	registry->size = gsp->registry_rpc_size;
 544}
 545
 546/**
 547 * clean_registry -- clean up registry memory in case of error
 548 * @gsp: gsp pointer
 549 *
 550 * Call this function to clean up all memory allocated by add_registry()
 551 * in case of error and build_registry() is not called.
 552 */
 553static void clean_registry(struct nvkm_gsp *gsp)
 554{
 555	struct registry_list_entry *reg, *n;
 556
 557	list_for_each_entry_safe(reg, n, &gsp->registry_list, head) {
 558		list_del(&reg->head);
 559		kfree(reg);
 560	}
 561
 562	gsp->registry_rpc_size = sizeof(PACKED_REGISTRY_TABLE);
 563}
 564
 565MODULE_PARM_DESC(NVreg_RegistryDwords,
 566		 "A semicolon-separated list of key=integer pairs of GSP-RM registry keys");
 567static char *NVreg_RegistryDwords;
 568module_param(NVreg_RegistryDwords, charp, 0400);
 569
 570/* dword only */
 571struct nv_gsp_registry_entries {
 572	const char *name;
 573	u32 value;
 574};
 575
 576/*
 577 * r535_registry_entries - required registry entries for GSP-RM
 578 *
 579 * This array lists registry entries that are required for GSP-RM to
 580 * function correctly.
 581 *
 582 * RMSecBusResetEnable - enables PCI secondary bus reset
 583 * RMForcePcieConfigSave - forces GSP-RM to preserve PCI configuration
 584 *   registers on any PCI reset.
 585 * RMDevidCheckIgnore - allows GSP-RM to boot even if the PCI dev ID
 586 *   is not found in the internal product name database.
 587 */
 588static const struct nv_gsp_registry_entries r535_registry_entries[] = {
 589	{ "RMSecBusResetEnable", 1 },
 590	{ "RMForcePcieConfigSave", 1 },
 591	{ "RMDevidCheckIgnore", 1 },
 592};
 593#define NV_GSP_REG_NUM_ENTRIES ARRAY_SIZE(r535_registry_entries)
 594
 595/**
 596 * strip - strips all characters in 'reject' from 's'
 597 * @s: string to strip
 598 * @reject: string of characters to remove
 599 *
 600 * 's' is modified.
 601 *
 602 * Returns the length of the new string.
 603 */
 604static size_t strip(char *s, const char *reject)
 605{
 606	char *p = s, *p2 = s;
 607	size_t length = 0;
 608	char c;
 609
 610	do {
 611		while ((c = *p2) && strchr(reject, c))
 612			p2++;
 613
 614		*p++ = c = *p2++;
 615		length++;
 616	} while (c);
 617
 618	return length;
 619}
 620
 621/**
 622 * r535_gsp_rpc_set_registry - build registry RPC and call GSP-RM
 623 * @gsp: gsp pointer
 624 *
 625 * The GSP-RM registry is a set of key/value pairs that configure some aspects
 626 * of GSP-RM. The keys are strings, and the values are 32-bit integers.
 627 *
 628 * The registry is built from a combination of a static hard-coded list (see
 629 * above) and entries passed on the driver's command line.
 630 */
 631static int
 632r535_gsp_rpc_set_registry(struct nvkm_gsp *gsp)
 633{
 634	PACKED_REGISTRY_TABLE *rpc;
 635	unsigned int i;
 636	int ret;
 637
 638	INIT_LIST_HEAD(&gsp->registry_list);
 639	gsp->registry_rpc_size = sizeof(PACKED_REGISTRY_TABLE);
 640
 641	for (i = 0; i < NV_GSP_REG_NUM_ENTRIES; i++) {
 642		ret = add_registry_num(gsp, r535_registry_entries[i].name,
 643				       r535_registry_entries[i].value);
 644		if (ret)
 645			goto fail;
 646	}
 647
 648	/*
 649	 * The NVreg_RegistryDwords parameter is a string of key=value
 650	 * pairs separated by semicolons. We need to extract and trim each
 651	 * substring, and then parse the substring to extract the key and
 652	 * value.
 653	 */
 654	if (NVreg_RegistryDwords) {
 655		char *p = kstrdup(NVreg_RegistryDwords, GFP_KERNEL);
 656		char *start, *next = p, *equal;
 657
 658		if (!p) {
 659			ret = -ENOMEM;
 660			goto fail;
 661		}
 662
 663		/* Remove any whitespace from the parameter string */
 664		strip(p, " \t\n");
 665
 666		while ((start = strsep(&next, ";"))) {
 667			long value;
 668
 669			equal = strchr(start, '=');
 670			if (!equal || equal == start || equal[1] == 0) {
 671				nvkm_error(&gsp->subdev,
 672					   "ignoring invalid registry string '%s'\n",
 673					   start);
 674				continue;
 675			}
 676
 677			/* Truncate the key=value string to just key */
 678			*equal = 0;
 679
 680			ret = kstrtol(equal + 1, 0, &value);
 681			if (!ret) {
 682				ret = add_registry_num(gsp, start, value);
 683			} else {
 684				/* Not a number, so treat it as a string */
 685				ret = add_registry_string(gsp, start, equal + 1);
 686			}
 687
 688			if (ret) {
 689				nvkm_error(&gsp->subdev,
 690					   "ignoring invalid registry key/value '%s=%s'\n",
 691					   start, equal + 1);
 692				continue;
 693			}
 694		}
 695
 696		kfree(p);
 697	}
 698
 699	rpc = nvkm_gsp_rpc_get(gsp, NV_VGPU_MSG_FUNCTION_SET_REGISTRY, gsp->registry_rpc_size);
 700	if (IS_ERR(rpc)) {
 701		ret = PTR_ERR(rpc);
 702		goto fail;
 703	}
 704
 705	build_registry(gsp, rpc);
 706
 707	return nvkm_gsp_rpc_wr(gsp, rpc, NVKM_GSP_RPC_REPLY_NOSEQ);
 708
 709fail:
 710	clean_registry(gsp);
 711	return ret;
 712}
 713
 714#if defined(CONFIG_ACPI) && defined(CONFIG_X86)
 715void
 716r535_gsp_acpi_caps(acpi_handle handle, CAPS_METHOD_DATA *caps)
 717{
 718	const guid_t NVOP_DSM_GUID =
 719		GUID_INIT(0xA486D8F8, 0x0BDA, 0x471B,
 720			  0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0);
 721	u64 NVOP_DSM_REV = 0x00000100;
 722	union acpi_object argv4 = {
 723		.buffer.type    = ACPI_TYPE_BUFFER,
 724		.buffer.length  = 4,
 725	}, *obj;
 726
 727	caps->status = 0xffff;
 728
 729	if (!acpi_check_dsm(handle, &NVOP_DSM_GUID, NVOP_DSM_REV, BIT_ULL(0x1a)))
 730		return;
 731
 732	argv4.buffer.pointer = kmalloc(argv4.buffer.length, GFP_KERNEL);
 733	if (!argv4.buffer.pointer)
 734		return;
 735
 736	obj = acpi_evaluate_dsm(handle, &NVOP_DSM_GUID, NVOP_DSM_REV, 0x1a, &argv4);
 737	if (!obj)
 738		goto done;
 739
 740	if (obj->type != ACPI_TYPE_BUFFER ||
 741	    obj->buffer.length != 4)
 742		goto done;
 743
 744	caps->status = 0;
 745	caps->optimusCaps = *(u32 *)obj->buffer.pointer;
 746
 747done:
 748	ACPI_FREE(obj);
 749
 750	kfree(argv4.buffer.pointer);
 751}
 752
 753void
 754r535_gsp_acpi_jt(acpi_handle handle, JT_METHOD_DATA *jt)
 755{
 756	const guid_t JT_DSM_GUID =
 757		GUID_INIT(0xCBECA351L, 0x067B, 0x4924,
 758			  0x9C, 0xBD, 0xB4, 0x6B, 0x00, 0xB8, 0x6F, 0x34);
 759	u64 JT_DSM_REV = 0x00000103;
 760	u32 caps;
 761	union acpi_object argv4 = {
 762		.buffer.type    = ACPI_TYPE_BUFFER,
 763		.buffer.length  = sizeof(caps),
 764	}, *obj;
 765
 766	jt->status = 0xffff;
 767
 768	argv4.buffer.pointer = kmalloc(argv4.buffer.length, GFP_KERNEL);
 769	if (!argv4.buffer.pointer)
 770		return;
 771
 772	obj = acpi_evaluate_dsm(handle, &JT_DSM_GUID, JT_DSM_REV, 0x1, &argv4);
 773	if (!obj)
 774		goto done;
 775
 776	if (obj->type != ACPI_TYPE_BUFFER ||
 777	    obj->buffer.length != 4)
 778		goto done;
 779
 780	jt->status = 0;
 781	jt->jtCaps = *(u32 *)obj->buffer.pointer;
 782	jt->jtRevId = (jt->jtCaps & 0xfff00000) >> 20;
 783	jt->bSBIOSCaps = 0;
 784
 785done:
 786	ACPI_FREE(obj);
 787
 788	kfree(argv4.buffer.pointer);
 789}
 790
 791static void
 792r535_gsp_acpi_mux_id(acpi_handle handle, u32 id, MUX_METHOD_DATA_ELEMENT *mode,
 793						 MUX_METHOD_DATA_ELEMENT *part)
 794{
 795	union acpi_object mux_arg = { ACPI_TYPE_INTEGER };
 796	struct acpi_object_list input = { 1, &mux_arg };
 797	acpi_handle iter = NULL, handle_mux = NULL;
 798	acpi_status status;
 799	unsigned long long value;
 800
 801	mode->status = 0xffff;
 802	part->status = 0xffff;
 803
 804	do {
 805		status = acpi_get_next_object(ACPI_TYPE_DEVICE, handle, iter, &iter);
 806		if (ACPI_FAILURE(status) || !iter)
 807			return;
 808
 809		status = acpi_evaluate_integer(iter, "_ADR", NULL, &value);
 810		if (ACPI_FAILURE(status) || value != id)
 811			continue;
 812
 813		handle_mux = iter;
 814	} while (!handle_mux);
 815
 816	if (!handle_mux)
 817		return;
 818
 819	/* I -think- 0 means "acquire" according to nvidia's driver source */
 820	input.pointer->integer.type = ACPI_TYPE_INTEGER;
 821	input.pointer->integer.value = 0;
 822
 823	status = acpi_evaluate_integer(handle_mux, "MXDM", &input, &value);
 824	if (ACPI_SUCCESS(status)) {
 825		mode->acpiId = id;
 826		mode->mode   = value;
 827		mode->status = 0;
 828	}
 829
 830	status = acpi_evaluate_integer(handle_mux, "MXDS", &input, &value);
 831	if (ACPI_SUCCESS(status)) {
 832		part->acpiId = id;
 833		part->mode   = value;
 834		part->status = 0;
 835	}
 836}
 837
 838static void
 839r535_gsp_acpi_mux(acpi_handle handle, DOD_METHOD_DATA *dod, MUX_METHOD_DATA *mux)
 840{
 841	mux->tableLen = dod->acpiIdListLen / sizeof(dod->acpiIdList[0]);
 842
 843	for (int i = 0; i < mux->tableLen; i++) {
 844		r535_gsp_acpi_mux_id(handle, dod->acpiIdList[i], &mux->acpiIdMuxModeTable[i],
 845								 &mux->acpiIdMuxPartTable[i]);
 846	}
 847}
 848
 849void
 850r535_gsp_acpi_dod(acpi_handle handle, DOD_METHOD_DATA *dod)
 851{
 852	acpi_status status;
 853	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
 854	union acpi_object *_DOD;
 855
 856	dod->status = 0xffff;
 857
 858	status = acpi_evaluate_object(handle, "_DOD", NULL, &output);
 859	if (ACPI_FAILURE(status))
 860		return;
 861
 862	_DOD = output.pointer;
 863
 864	if (_DOD->type != ACPI_TYPE_PACKAGE ||
 865	    _DOD->package.count > ARRAY_SIZE(dod->acpiIdList))
 866		return;
 867
 868	for (int i = 0; i < _DOD->package.count; i++) {
 869		if (WARN_ON(_DOD->package.elements[i].type != ACPI_TYPE_INTEGER))
 870			return;
 871
 872		dod->acpiIdList[i] = _DOD->package.elements[i].integer.value;
 873		dod->acpiIdListLen += sizeof(dod->acpiIdList[0]);
 874	}
 875
 876	dod->status = 0;
 877	kfree(output.pointer);
 878}
 879#endif
 880
 881static void
 882r535_gsp_acpi_info(struct nvkm_gsp *gsp, ACPI_METHOD_DATA *acpi)
 883{
 884#if defined(CONFIG_ACPI) && defined(CONFIG_X86)
 885	acpi_handle handle = ACPI_HANDLE(gsp->subdev.device->dev);
 886
 887	if (!handle)
 888		return;
 889
 890	acpi->bValid = 1;
 891
 892	r535_gsp_acpi_dod(handle, &acpi->dodMethodData);
 893	if (acpi->dodMethodData.status == 0)
 894		r535_gsp_acpi_mux(handle, &acpi->dodMethodData, &acpi->muxMethodData);
 895
 896	r535_gsp_acpi_jt(handle, &acpi->jtMethodData);
 897	r535_gsp_acpi_caps(handle, &acpi->capsMethodData);
 898#endif
 899}
 900
 901static int
 902r535_gsp_set_system_info(struct nvkm_gsp *gsp)
 903{
 904	struct nvkm_device *device = gsp->subdev.device;
 905	struct nvkm_device_pci *pdev = container_of(device, typeof(*pdev), device);
 906	GspSystemInfo *info;
 907
 908	if (WARN_ON(device->type == NVKM_DEVICE_TEGRA))
 909		return -ENOSYS;
 910
 911	info = nvkm_gsp_rpc_get(gsp, NV_VGPU_MSG_FUNCTION_GSP_SET_SYSTEM_INFO, sizeof(*info));
 912	if (IS_ERR(info))
 913		return PTR_ERR(info);
 914
 915	info->gpuPhysAddr = device->func->resource_addr(device, NVKM_BAR0_PRI);
 916	info->gpuPhysFbAddr = device->func->resource_addr(device, NVKM_BAR1_FB);
 917	info->gpuPhysInstAddr = device->func->resource_addr(device, NVKM_BAR2_INST);
 918	info->nvDomainBusDeviceFunc = pci_dev_id(pdev->pdev);
 919	info->maxUserVa = TASK_SIZE;
 920	info->pciConfigMirrorBase = device->pci->func->cfg.addr;
 921	info->pciConfigMirrorSize = device->pci->func->cfg.size;
 922	r535_gsp_acpi_info(gsp, &info->acpiMethodData);
 923
 924	return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOSEQ);
 925}
 926
 927static int
 928r535_gsp_msg_os_error_log(void *priv, u32 fn, void *repv, u32 repc)
 929{
 930	struct nvkm_gsp *gsp = priv;
 931	struct nvkm_subdev *subdev = &gsp->subdev;
 932	rpc_os_error_log_v17_00 *msg = repv;
 933
 934	if (WARN_ON(repc < sizeof(*msg)))
 935		return -EINVAL;
 936
 937	nvkm_error(subdev, "Xid:%d %s\n", msg->exceptType, msg->errString);
 938	return 0;
 939}
 940
 941static int
 942r535_gsp_msg_mmu_fault_queued(void *priv, u32 fn, void *repv, u32 repc)
 943{
 944	struct nvkm_gsp *gsp = priv;
 945	struct nvkm_subdev *subdev = &gsp->subdev;
 946
 947	WARN_ON(repc != 0);
 948
 949	nvkm_error(subdev, "mmu fault queued\n");
 950	return 0;
 951}
 952
 953static int
 954r535_gsp_msg_post_event(void *priv, u32 fn, void *repv, u32 repc)
 955{
 956	struct nvkm_gsp *gsp = priv;
 957	struct nvkm_gsp_client *client;
 958	struct nvkm_subdev *subdev = &gsp->subdev;
 959	rpc_post_event_v17_00 *msg = repv;
 960
 961	if (WARN_ON(repc < sizeof(*msg)))
 962		return -EINVAL;
 963	if (WARN_ON(repc != sizeof(*msg) + msg->eventDataSize))
 964		return -EINVAL;
 965
 966	nvkm_debug(subdev, "event: %08x %08x %d %08x %08x %d %d\n",
 967		   msg->hClient, msg->hEvent, msg->notifyIndex, msg->data,
 968		   msg->status, msg->eventDataSize, msg->bNotifyList);
 969
 970	mutex_lock(&gsp->client_id.mutex);
 971	client = idr_find(&gsp->client_id.idr, msg->hClient & 0xffff);
 972	if (client) {
 973		struct nvkm_gsp_event *event;
 974		bool handled = false;
 975
 976		list_for_each_entry(event, &client->events, head) {
 977			if (event->object.handle == msg->hEvent) {
 978				event->func(event, msg->eventData, msg->eventDataSize);
 979				handled = true;
 980			}
 981		}
 982
 983		if (!handled) {
 984			nvkm_error(subdev, "event: cid 0x%08x event 0x%08x not found!\n",
 985				   msg->hClient, msg->hEvent);
 986		}
 987	} else {
 988		nvkm_error(subdev, "event: cid 0x%08x not found!\n", msg->hClient);
 989	}
 990	mutex_unlock(&gsp->client_id.mutex);
 991	return 0;
 992}
 993
 994/**
 995 * r535_gsp_msg_run_cpu_sequencer() -- process I/O commands from the GSP
 996 * @priv: gsp pointer
 997 * @fn: function number (ignored)
 998 * @repv: pointer to libos print RPC
 999 * @repc: message size
1000 *
1001 * The GSP sequencer is a list of I/O commands that the GSP can send to
1002 * the driver to perform for various purposes.  The most common usage is to
1003 * perform a special mid-initialization reset.
1004 */
1005static int
1006r535_gsp_msg_run_cpu_sequencer(void *priv, u32 fn, void *repv, u32 repc)
1007{
1008	struct nvkm_gsp *gsp = priv;
1009	struct nvkm_subdev *subdev = &gsp->subdev;
1010	struct nvkm_device *device = subdev->device;
1011	rpc_run_cpu_sequencer_v17_00 *seq = repv;
1012	int ptr = 0, ret;
1013
1014	nvkm_debug(subdev, "seq: %08x %08x\n", seq->bufferSizeDWord, seq->cmdIndex);
1015
1016	while (ptr < seq->cmdIndex) {
1017		GSP_SEQUENCER_BUFFER_CMD *cmd = (void *)&seq->commandBuffer[ptr];
1018
1019		ptr += 1;
1020		ptr += GSP_SEQUENCER_PAYLOAD_SIZE_DWORDS(cmd->opCode);
1021
1022		switch (cmd->opCode) {
1023		case GSP_SEQ_BUF_OPCODE_REG_WRITE: {
1024			u32 addr = cmd->payload.regWrite.addr;
1025			u32 data = cmd->payload.regWrite.val;
1026
1027			nvkm_trace(subdev, "seq wr32 %06x %08x\n", addr, data);
1028			nvkm_wr32(device, addr, data);
1029		}
1030			break;
1031		case GSP_SEQ_BUF_OPCODE_REG_MODIFY: {
1032			u32 addr = cmd->payload.regModify.addr;
1033			u32 mask = cmd->payload.regModify.mask;
1034			u32 data = cmd->payload.regModify.val;
1035
1036			nvkm_trace(subdev, "seq mask %06x %08x %08x\n", addr, mask, data);
1037			nvkm_mask(device, addr, mask, data);
1038		}
1039			break;
1040		case GSP_SEQ_BUF_OPCODE_REG_POLL: {
1041			u32 addr = cmd->payload.regPoll.addr;
1042			u32 mask = cmd->payload.regPoll.mask;
1043			u32 data = cmd->payload.regPoll.val;
1044			u32 usec = cmd->payload.regPoll.timeout ?: 4000000;
1045			//u32 error = cmd->payload.regPoll.error;
1046
1047			nvkm_trace(subdev, "seq poll %06x %08x %08x %d\n", addr, mask, data, usec);
1048			nvkm_rd32(device, addr);
1049			nvkm_usec(device, usec,
1050				if ((nvkm_rd32(device, addr) & mask) == data)
1051					break;
1052			);
1053		}
1054			break;
1055		case GSP_SEQ_BUF_OPCODE_DELAY_US: {
1056			u32 usec = cmd->payload.delayUs.val;
1057
1058			nvkm_trace(subdev, "seq usec %d\n", usec);
1059			udelay(usec);
1060		}
1061			break;
1062		case GSP_SEQ_BUF_OPCODE_REG_STORE: {
1063			u32 addr = cmd->payload.regStore.addr;
1064			u32 slot = cmd->payload.regStore.index;
1065
1066			seq->regSaveArea[slot] = nvkm_rd32(device, addr);
1067			nvkm_trace(subdev, "seq save %08x -> %d: %08x\n", addr, slot,
1068				   seq->regSaveArea[slot]);
1069		}
1070			break;
1071		case GSP_SEQ_BUF_OPCODE_CORE_RESET:
1072			nvkm_trace(subdev, "seq core reset\n");
1073			nvkm_falcon_reset(&gsp->falcon);
1074			nvkm_falcon_mask(&gsp->falcon, 0x624, 0x00000080, 0x00000080);
1075			nvkm_falcon_wr32(&gsp->falcon, 0x10c, 0x00000000);
1076			break;
1077		case GSP_SEQ_BUF_OPCODE_CORE_START:
1078			nvkm_trace(subdev, "seq core start\n");
1079			if (nvkm_falcon_rd32(&gsp->falcon, 0x100) & 0x00000040)
1080				nvkm_falcon_wr32(&gsp->falcon, 0x130, 0x00000002);
1081			else
1082				nvkm_falcon_wr32(&gsp->falcon, 0x100, 0x00000002);
1083			break;
1084		case GSP_SEQ_BUF_OPCODE_CORE_WAIT_FOR_HALT:
1085			nvkm_trace(subdev, "seq core wait halt\n");
1086			nvkm_msec(device, 2000,
1087				if (nvkm_falcon_rd32(&gsp->falcon, 0x100) & 0x00000010)
1088					break;
1089			);
1090			break;
1091		case GSP_SEQ_BUF_OPCODE_CORE_RESUME: {
1092			struct nvkm_sec2 *sec2 = device->sec2;
1093			u32 mbox0;
1094
1095			nvkm_trace(subdev, "seq core resume\n");
1096
1097			ret = gsp->func->reset(gsp);
1098			if (WARN_ON(ret))
1099				return ret;
1100
1101			nvkm_falcon_wr32(&gsp->falcon, 0x040, lower_32_bits(gsp->libos.addr));
1102			nvkm_falcon_wr32(&gsp->falcon, 0x044, upper_32_bits(gsp->libos.addr));
1103
1104			nvkm_falcon_start(&sec2->falcon);
1105
1106			if (nvkm_msec(device, 2000,
1107				if (nvkm_rd32(device, 0x1180f8) & 0x04000000)
1108					break;
1109			) < 0)
1110				return -ETIMEDOUT;
1111
1112			mbox0 = nvkm_falcon_rd32(&sec2->falcon, 0x040);
1113			if (WARN_ON(mbox0)) {
1114				nvkm_error(&gsp->subdev, "seq core resume sec2: 0x%x\n", mbox0);
1115				return -EIO;
1116			}
1117
1118			nvkm_falcon_wr32(&gsp->falcon, 0x080, gsp->boot.app_version);
1119
1120			if (WARN_ON(!nvkm_falcon_riscv_active(&gsp->falcon)))
1121				return -EIO;
1122		}
1123			break;
1124		default:
1125			nvkm_error(subdev, "unknown sequencer opcode %08x\n", cmd->opCode);
1126			return -EINVAL;
1127		}
1128	}
1129
1130	return 0;
1131}
1132
1133static int
1134r535_gsp_shared_init(struct nvkm_gsp *gsp)
1135{
1136	struct {
1137		msgqTxHeader tx;
1138		msgqRxHeader rx;
1139	} *cmdq, *msgq;
1140	int ret, i;
1141
1142	gsp->shm.cmdq.size = 0x40000;
1143	gsp->shm.msgq.size = 0x40000;
1144
1145	gsp->shm.ptes.nr  = (gsp->shm.cmdq.size + gsp->shm.msgq.size) >> GSP_PAGE_SHIFT;
1146	gsp->shm.ptes.nr += DIV_ROUND_UP(gsp->shm.ptes.nr * sizeof(u64), GSP_PAGE_SIZE);
1147	gsp->shm.ptes.size = ALIGN(gsp->shm.ptes.nr * sizeof(u64), GSP_PAGE_SIZE);
1148
1149	ret = nvkm_gsp_mem_ctor(gsp, gsp->shm.ptes.size +
1150				     gsp->shm.cmdq.size +
1151				     gsp->shm.msgq.size,
1152				&gsp->shm.mem);
1153	if (ret)
1154		return ret;
1155
1156	gsp->shm.ptes.ptr = gsp->shm.mem.data;
1157	gsp->shm.cmdq.ptr = (u8 *)gsp->shm.ptes.ptr + gsp->shm.ptes.size;
1158	gsp->shm.msgq.ptr = (u8 *)gsp->shm.cmdq.ptr + gsp->shm.cmdq.size;
1159
1160	for (i = 0; i < gsp->shm.ptes.nr; i++)
1161		gsp->shm.ptes.ptr[i] = gsp->shm.mem.addr + (i << GSP_PAGE_SHIFT);
1162
1163	cmdq = gsp->shm.cmdq.ptr;
1164	cmdq->tx.version = 0;
1165	cmdq->tx.size = gsp->shm.cmdq.size;
1166	cmdq->tx.entryOff = GSP_PAGE_SIZE;
1167	cmdq->tx.msgSize = GSP_PAGE_SIZE;
1168	cmdq->tx.msgCount = (cmdq->tx.size - cmdq->tx.entryOff) / cmdq->tx.msgSize;
1169	cmdq->tx.writePtr = 0;
1170	cmdq->tx.flags = 1;
1171	cmdq->tx.rxHdrOff = offsetof(typeof(*cmdq), rx.readPtr);
1172
1173	msgq = gsp->shm.msgq.ptr;
1174
1175	gsp->cmdq.cnt = cmdq->tx.msgCount;
1176	gsp->cmdq.wptr = &cmdq->tx.writePtr;
1177	gsp->cmdq.rptr = &msgq->rx.readPtr;
1178	gsp->msgq.cnt = cmdq->tx.msgCount;
1179	gsp->msgq.wptr = &msgq->tx.writePtr;
1180	gsp->msgq.rptr = &cmdq->rx.readPtr;
1181	return 0;
1182}
1183
1184static void
1185r535_gsp_set_rmargs(struct nvkm_gsp *gsp, bool resume)
1186{
1187	GSP_ARGUMENTS_CACHED *args = gsp->rmargs.data;
1188
1189	args->messageQueueInitArguments.sharedMemPhysAddr = gsp->shm.mem.addr;
1190	args->messageQueueInitArguments.pageTableEntryCount = gsp->shm.ptes.nr;
1191	args->messageQueueInitArguments.cmdQueueOffset =
1192		(u8 *)gsp->shm.cmdq.ptr - (u8 *)gsp->shm.mem.data;
1193	args->messageQueueInitArguments.statQueueOffset =
1194		(u8 *)gsp->shm.msgq.ptr - (u8 *)gsp->shm.mem.data;
1195
1196	if (!resume) {
1197		args->srInitArguments.oldLevel = 0;
1198		args->srInitArguments.flags = 0;
1199		args->srInitArguments.bInPMTransition = 0;
1200	} else {
1201		args->srInitArguments.oldLevel = NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3;
1202		args->srInitArguments.flags = 0;
1203		args->srInitArguments.bInPMTransition = 1;
1204	}
1205}
1206
1207static int
1208r535_gsp_rmargs_init(struct nvkm_gsp *gsp, bool resume)
1209{
1210	int ret;
1211
1212	if (!resume) {
1213		ret = r535_gsp_shared_init(gsp);
1214		if (ret)
1215			return ret;
1216
1217		ret = nvkm_gsp_mem_ctor(gsp, 0x1000, &gsp->rmargs);
1218		if (ret)
1219			return ret;
1220	}
1221
1222	gsp->rm->api->gsp->set_rmargs(gsp, resume);
1223	return 0;
1224}
1225
1226#ifdef CONFIG_DEBUG_FS
1227
1228/*
1229 * If GSP-RM load fails, then the GSP nvkm object will be deleted, the logging
1230 * debugfs entries will be deleted, and it will not be possible to debug the
1231 * load failure. The keep_gsp_logging parameter tells Nouveau to copy the
1232 * logging buffers to new debugfs entries, and these entries are retained
1233 * until the driver unloads.
1234 */
1235static bool keep_gsp_logging;
1236module_param(keep_gsp_logging, bool, 0444);
1237MODULE_PARM_DESC(keep_gsp_logging,
1238		 "Migrate the GSP-RM logging debugfs entries upon exit");
1239
1240/*
1241 * GSP-RM uses a pseudo-class mechanism to define of a variety of per-"engine"
1242 * data structures, and each engine has a "class ID" genererated by a
1243 * pre-processor. This is the class ID for the PMU.
1244 */
1245#define NV_GSP_MSG_EVENT_UCODE_LIBOS_CLASS_PMU		0xf3d722
1246
1247/**
1248 * struct rpc_ucode_libos_print_v1e_08 - RPC payload for libos print buffers
1249 * @ucode_eng_desc: the engine descriptor
1250 * @libos_print_buf_size: the size of the libos_print_buf[]
1251 * @libos_print_buf: the actual buffer
1252 *
1253 * The engine descriptor is divided into 31:8 "class ID" and 7:0 "instance
1254 * ID". We only care about messages from PMU.
1255 */
1256struct rpc_ucode_libos_print_v1e_08 {
1257	u32 ucode_eng_desc;
1258	u32 libos_print_buf_size;
1259	u8 libos_print_buf[];
1260};
1261
1262/**
1263 * r535_gsp_msg_libos_print - capture log message from the PMU
1264 * @priv: gsp pointer
1265 * @fn: function number (ignored)
1266 * @repv: pointer to libos print RPC
1267 * @repc: message size
1268 *
1269 * Called when we receive a UCODE_LIBOS_PRINT event RPC from GSP-RM. This RPC
1270 * contains the contents of the libos print buffer from PMU. It is typically
1271 * only written to when PMU encounters an error.
1272 *
1273 * Technically this RPC can be used to pass print buffers from any number of
1274 * GSP-RM engines, but we only expect to receive them for the PMU.
1275 *
1276 * For the PMU, the buffer is 4K in size and the RPC always contains the full
1277 * contents.
1278 */
1279static int
1280r535_gsp_msg_libos_print(void *priv, u32 fn, void *repv, u32 repc)
1281{
1282	struct nvkm_gsp *gsp = priv;
1283	struct nvkm_subdev *subdev = &gsp->subdev;
1284	struct rpc_ucode_libos_print_v1e_08 *rpc = repv;
1285	unsigned int class = rpc->ucode_eng_desc >> 8;
1286
1287	nvkm_debug(subdev, "received libos print from class 0x%x for %u bytes\n",
1288		   class, rpc->libos_print_buf_size);
1289
1290	if (class != NV_GSP_MSG_EVENT_UCODE_LIBOS_CLASS_PMU) {
1291		nvkm_warn(subdev,
1292			  "received libos print from unknown class 0x%x\n",
1293			  class);
1294		return -ENOMSG;
1295	}
1296
1297	if (rpc->libos_print_buf_size > GSP_PAGE_SIZE) {
1298		nvkm_error(subdev, "libos print is too large (%u bytes)\n",
1299			   rpc->libos_print_buf_size);
1300		return -E2BIG;
1301	}
1302
1303	memcpy(gsp->blob_pmu.data, rpc->libos_print_buf, rpc->libos_print_buf_size);
1304
1305	return 0;
1306}
1307
1308/**
1309 * create_debugfs - create a blob debugfs entry
1310 * @gsp: gsp pointer
1311 * @name: name of this dentry
1312 * @blob: blob wrapper
1313 *
1314 * Creates a debugfs entry for a logging buffer with the name 'name'.
1315 */
1316static struct dentry *create_debugfs(struct nvkm_gsp *gsp, const char *name,
1317				     struct debugfs_blob_wrapper *blob)
1318{
1319	struct dentry *dent;
1320
1321	dent = debugfs_create_blob(name, 0444, gsp->debugfs.parent, blob);
1322	if (IS_ERR(dent)) {
1323		nvkm_error(&gsp->subdev,
1324			   "failed to create %s debugfs entry\n", name);
1325		return NULL;
1326	}
1327
1328	/*
1329	 * For some reason, debugfs_create_blob doesn't set the size of the
1330	 * dentry, so do that here.  See [1]
1331	 *
1332	 * [1] https://lore.kernel.org/r/linux-fsdevel/20240207200619.3354549-1-ttabi@nvidia.com/
1333	 */
1334	i_size_write(d_inode(dent), blob->size);
1335
1336	return dent;
1337}
1338
1339/**
1340 * r535_gsp_libos_debugfs_init - create logging debugfs entries
1341 * @gsp: gsp pointer
1342 *
1343 * Create the debugfs entries. This exposes the log buffers to userspace so
1344 * that an external tool can parse it.
1345 *
1346 * The 'logpmu' contains exception dumps from the PMU. It is written via an
1347 * RPC sent from GSP-RM and must be only 4KB. We create it here because it's
1348 * only useful if there is a debugfs entry to expose it. If we get the PMU
1349 * logging RPC and there is no debugfs entry, the RPC is just ignored.
1350 *
1351 * The blob_init, blob_rm, and blob_pmu objects can't be transient
1352 * because debugfs_create_blob doesn't copy them.
1353 *
1354 * NOTE: OpenRM loads the logging elf image and prints the log messages
1355 * in real-time. We may add that capability in the future, but that
1356 * requires loading ELF images that are not distributed with the driver and
1357 * adding the parsing code to Nouveau.
1358 *
1359 * Ideally, this should be part of nouveau_debugfs_init(), but that function
1360 * is called too late. We really want to create these debugfs entries before
1361 * r535_gsp_booter_load() is called, so that if GSP-RM fails to initialize,
1362 * there could still be a log to capture.
1363 */
1364static void
1365r535_gsp_libos_debugfs_init(struct nvkm_gsp *gsp)
1366{
1367	struct device *dev = gsp->subdev.device->dev;
1368
1369	/* Create a new debugfs directory with a name unique to this GPU. */
1370	gsp->debugfs.parent = debugfs_create_dir(dev_name(dev), nouveau_debugfs_root);
1371	if (IS_ERR(gsp->debugfs.parent)) {
1372		nvkm_error(&gsp->subdev,
1373			   "failed to create %s debugfs root\n", dev_name(dev));
1374		return;
1375	}
1376
1377	gsp->blob_init.data = gsp->loginit.data;
1378	gsp->blob_init.size = gsp->loginit.size;
1379	gsp->blob_intr.data = gsp->logintr.data;
1380	gsp->blob_intr.size = gsp->logintr.size;
1381	gsp->blob_rm.data = gsp->logrm.data;
1382	gsp->blob_rm.size = gsp->logrm.size;
1383
1384	gsp->debugfs.init = create_debugfs(gsp, "loginit", &gsp->blob_init);
1385	if (!gsp->debugfs.init)
1386		goto error;
1387
1388	gsp->debugfs.intr = create_debugfs(gsp, "logintr", &gsp->blob_intr);
1389	if (!gsp->debugfs.intr)
1390		goto error;
1391
1392	gsp->debugfs.rm = create_debugfs(gsp, "logrm", &gsp->blob_rm);
1393	if (!gsp->debugfs.rm)
1394		goto error;
1395
1396	/*
1397	 * Since the PMU buffer is copied from an RPC, it doesn't need to be
1398	 * a DMA buffer.
1399	 */
1400	gsp->blob_pmu.size = GSP_PAGE_SIZE;
1401	gsp->blob_pmu.data = kzalloc(gsp->blob_pmu.size, GFP_KERNEL);
1402	if (!gsp->blob_pmu.data)
1403		goto error;
1404
1405	gsp->debugfs.pmu = create_debugfs(gsp, "logpmu", &gsp->blob_pmu);
1406	if (!gsp->debugfs.pmu) {
1407		kfree(gsp->blob_pmu.data);
1408		goto error;
1409	}
1410
1411	i_size_write(d_inode(gsp->debugfs.init), gsp->blob_init.size);
1412	i_size_write(d_inode(gsp->debugfs.intr), gsp->blob_intr.size);
1413	i_size_write(d_inode(gsp->debugfs.rm), gsp->blob_rm.size);
1414	i_size_write(d_inode(gsp->debugfs.pmu), gsp->blob_pmu.size);
1415
1416	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_UCODE_LIBOS_PRINT,
1417			      r535_gsp_msg_libos_print, gsp);
1418
1419	nvkm_debug(&gsp->subdev, "created debugfs GSP-RM logging entries\n");
1420
1421	if (keep_gsp_logging) {
1422		nvkm_info(&gsp->subdev,
1423			  "logging buffers will be retained on failure\n");
1424	}
1425
1426	return;
1427
1428error:
1429	debugfs_remove(gsp->debugfs.parent);
1430	gsp->debugfs.parent = NULL;
1431}
1432
1433#endif
1434
1435static inline u64
1436r535_gsp_libos_id8(const char *name)
1437{
1438	u64 id = 0;
1439
1440	for (int i = 0; i < sizeof(id) && *name; i++, name++)
1441		id = (id << 8) | *name;
1442
1443	return id;
1444}
1445
1446/**
1447 * create_pte_array() - creates a PTE array of a physically contiguous buffer
1448 * @ptes: pointer to the array
1449 * @addr: base address of physically contiguous buffer (GSP_PAGE_SIZE aligned)
1450 * @size: size of the buffer
1451 *
1452 * GSP-RM sometimes expects physically-contiguous buffers to have an array of
1453 * "PTEs" for each page in that buffer.  Although in theory that allows for
1454 * the buffer to be physically discontiguous, GSP-RM does not currently
1455 * support that.
1456 *
1457 * In this case, the PTEs are DMA addresses of each page of the buffer.  Since
1458 * the buffer is physically contiguous, calculating all the PTEs is simple
1459 * math.
1460 *
1461 * See memdescGetPhysAddrsForGpu()
1462 */
1463static void create_pte_array(u64 *ptes, dma_addr_t addr, size_t size)
1464{
1465	unsigned int num_pages = DIV_ROUND_UP_ULL(size, GSP_PAGE_SIZE);
1466	unsigned int i;
1467
1468	for (i = 0; i < num_pages; i++)
1469		ptes[i] = (u64)addr + (i << GSP_PAGE_SHIFT);
1470}
1471
1472/**
1473 * r535_gsp_libos_init() -- create the libos arguments structure
1474 * @gsp: gsp pointer
1475 *
1476 * The logging buffers are byte queues that contain encoded printf-like
1477 * messages from GSP-RM.  They need to be decoded by a special application
1478 * that can parse the buffers.
1479 *
1480 * The 'loginit' buffer contains logs from early GSP-RM init and
1481 * exception dumps.  The 'logrm' buffer contains the subsequent logs. Both are
1482 * written to directly by GSP-RM and can be any multiple of GSP_PAGE_SIZE.
1483 *
1484 * The physical address map for the log buffer is stored in the buffer
1485 * itself, starting with offset 1. Offset 0 contains the "put" pointer (pp).
1486 * Initially, pp is equal to 0. If the buffer has valid logging data in it,
1487 * then pp points to index into the buffer where the next logging entry will
1488 * be written. Therefore, the logging data is valid if:
1489 *   1 <= pp < sizeof(buffer)/sizeof(u64)
1490 *
1491 * The GSP only understands 4K pages (GSP_PAGE_SIZE), so even if the kernel is
1492 * configured for a larger page size (e.g. 64K pages), we need to give
1493 * the GSP an array of 4K pages. Fortunately, since the buffer is
1494 * physically contiguous, it's simple math to calculate the addresses.
1495 *
1496 * The buffers must be a multiple of GSP_PAGE_SIZE.  GSP-RM also currently
1497 * ignores the @kind field for LOGINIT, LOGINTR, and LOGRM, but expects the
1498 * buffers to be physically contiguous anyway.
1499 *
1500 * The memory allocated for the arguments must remain until the GSP sends the
1501 * init_done RPC.
1502 *
1503 * See _kgspInitLibosLoggingStructures (allocates memory for buffers)
1504 * See kgspSetupLibosInitArgs_IMPL (creates pLibosInitArgs[] array)
1505 */
1506static int
1507r535_gsp_libos_init(struct nvkm_gsp *gsp)
1508{
1509	LibosMemoryRegionInitArgument *args;
1510	int ret;
1511
1512	ret = nvkm_gsp_mem_ctor(gsp, 0x1000, &gsp->libos);
1513	if (ret)
1514		return ret;
1515
1516	args = gsp->libos.data;
1517
1518	ret = nvkm_gsp_mem_ctor(gsp, 0x10000, &gsp->loginit);
1519	if (ret)
1520		return ret;
1521
1522	args[0].id8  = r535_gsp_libos_id8("LOGINIT");
1523	args[0].pa   = gsp->loginit.addr;
1524	args[0].size = gsp->loginit.size;
1525	args[0].kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
1526	args[0].loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
1527	create_pte_array(gsp->loginit.data + sizeof(u64), gsp->loginit.addr, gsp->loginit.size);
1528
1529	ret = nvkm_gsp_mem_ctor(gsp, 0x10000, &gsp->logintr);
1530	if (ret)
1531		return ret;
1532
1533	args[1].id8  = r535_gsp_libos_id8("LOGINTR");
1534	args[1].pa   = gsp->logintr.addr;
1535	args[1].size = gsp->logintr.size;
1536	args[1].kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
1537	args[1].loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
1538	create_pte_array(gsp->logintr.data + sizeof(u64), gsp->logintr.addr, gsp->logintr.size);
1539
1540	ret = nvkm_gsp_mem_ctor(gsp, 0x10000, &gsp->logrm);
1541	if (ret)
1542		return ret;
1543
1544	args[2].id8  = r535_gsp_libos_id8("LOGRM");
1545	args[2].pa   = gsp->logrm.addr;
1546	args[2].size = gsp->logrm.size;
1547	args[2].kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
1548	args[2].loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
1549	create_pte_array(gsp->logrm.data + sizeof(u64), gsp->logrm.addr, gsp->logrm.size);
1550
1551	ret = r535_gsp_rmargs_init(gsp, false);
1552	if (ret)
1553		return ret;
1554
1555	args[3].id8  = r535_gsp_libos_id8("RMARGS");
1556	args[3].pa   = gsp->rmargs.addr;
1557	args[3].size = gsp->rmargs.size;
1558	args[3].kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
1559	args[3].loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
1560
1561#ifdef CONFIG_DEBUG_FS
1562	r535_gsp_libos_debugfs_init(gsp);
1563#endif
1564
1565	return 0;
1566}
1567
1568void
1569nvkm_gsp_sg_free(struct nvkm_device *device, struct sg_table *sgt)
1570{
1571	struct scatterlist *sgl;
1572	int i;
1573
1574	dma_unmap_sgtable(device->dev, sgt, DMA_BIDIRECTIONAL, 0);
1575
1576	for_each_sgtable_sg(sgt, sgl, i) {
1577		struct page *page = sg_page(sgl);
1578
1579		__free_page(page);
1580	}
1581
1582	sg_free_table(sgt);
1583}
1584
1585int
1586nvkm_gsp_sg(struct nvkm_device *device, u64 size, struct sg_table *sgt)
1587{
1588	const u64 pages = DIV_ROUND_UP(size, PAGE_SIZE);
1589	struct scatterlist *sgl;
1590	int ret, i;
1591
1592	ret = sg_alloc_table(sgt, pages, GFP_KERNEL);
1593	if (ret)
1594		return ret;
1595
1596	for_each_sgtable_sg(sgt, sgl, i) {
1597		struct page *page = alloc_page(GFP_KERNEL);
1598
1599		if (!page) {
1600			nvkm_gsp_sg_free(device, sgt);
1601			return -ENOMEM;
1602		}
1603
1604		sg_set_page(sgl, page, PAGE_SIZE, 0);
1605	}
1606
1607	ret = dma_map_sgtable(device->dev, sgt, DMA_BIDIRECTIONAL, 0);
1608	if (ret)
1609		nvkm_gsp_sg_free(device, sgt);
1610
1611	return ret;
1612}
1613
1614static void
1615nvkm_gsp_radix3_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_radix3 *rx3)
1616{
1617	nvkm_gsp_sg_free(gsp->subdev.device, &rx3->lvl2);
1618	nvkm_gsp_mem_dtor(&rx3->lvl1);
1619	nvkm_gsp_mem_dtor(&rx3->lvl0);
1620}
1621
1622/**
1623 * nvkm_gsp_radix3_sg - build a radix3 table from a S/G list
1624 * @gsp: gsp pointer
1625 * @sgt: S/G list to traverse
1626 * @size: size of the image, in bytes
1627 * @rx3: radix3 array to update
1628 *
1629 * The GSP uses a three-level page table, called radix3, to map the firmware.
1630 * Each 64-bit "pointer" in the table is either the bus address of an entry in
1631 * the next table (for levels 0 and 1) or the bus address of the next page in
1632 * the GSP firmware image itself.
1633 *
1634 * Level 0 contains a single entry in one page that points to the first page
1635 * of level 1.
1636 *
1637 * Level 1, since it's also only one page in size, contains up to 512 entries,
1638 * one for each page in Level 2.
1639 *
1640 * Level 2 can be up to 512 pages in size, and each of those entries points to
1641 * the next page of the firmware image.  Since there can be up to 512*512
1642 * pages, that limits the size of the firmware to 512*512*GSP_PAGE_SIZE = 1GB.
1643 *
1644 * Internally, the GSP has its window into system memory, but the base
1645 * physical address of the aperture is not 0.  In fact, it varies depending on
1646 * the GPU architecture.  Since the GPU is a PCI device, this window is
1647 * accessed via DMA and is therefore bound by IOMMU translation.  The end
1648 * result is that GSP-RM must translate the bus addresses in the table to GSP
1649 * physical addresses.  All this should happen transparently.
1650 *
1651 * Returns 0 on success, or negative error code
1652 *
1653 * See kgspCreateRadix3_IMPL
1654 */
1655static int
1656nvkm_gsp_radix3_sg(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size,
1657		   struct nvkm_gsp_radix3 *rx3)
1658{
1659	struct sg_dma_page_iter sg_dma_iter;
1660	struct scatterlist *sg;
1661	size_t bufsize;
1662	u64 *pte;
1663	int ret, i, page_idx = 0;
1664
1665	ret = nvkm_gsp_mem_ctor(gsp, GSP_PAGE_SIZE, &rx3->lvl0);
1666	if (ret)
1667		return ret;
1668
1669	ret = nvkm_gsp_mem_ctor(gsp, GSP_PAGE_SIZE, &rx3->lvl1);
1670	if (ret)
1671		goto lvl1_fail;
1672
1673	// Allocate level 2
1674	bufsize = ALIGN((size / GSP_PAGE_SIZE) * sizeof(u64), GSP_PAGE_SIZE);
1675	ret = nvkm_gsp_sg(gsp->subdev.device, bufsize, &rx3->lvl2);
1676	if (ret)
1677		goto lvl2_fail;
1678
1679	// Write the bus address of level 1 to level 0
1680	pte = rx3->lvl0.data;
1681	*pte = rx3->lvl1.addr;
1682
1683	// Write the bus address of each page in level 2 to level 1
1684	pte = rx3->lvl1.data;
1685	for_each_sgtable_dma_page(&rx3->lvl2, &sg_dma_iter, 0)
1686		*pte++ = sg_page_iter_dma_address(&sg_dma_iter);
1687
1688	// Finally, write the bus address of each page in sgt to level 2
1689	for_each_sgtable_sg(&rx3->lvl2, sg, i) {
1690		void *sgl_end;
1691
1692		pte = sg_virt(sg);
1693		sgl_end = (void *)pte + sg->length;
1694
1695		for_each_sgtable_dma_page(sgt, &sg_dma_iter, page_idx) {
1696			*pte++ = sg_page_iter_dma_address(&sg_dma_iter);
1697			page_idx++;
1698
1699			// Go to the next scatterlist for level 2 if we've reached the end
1700			if ((void *)pte >= sgl_end)
1701				break;
1702		}
1703	}
1704
1705	if (ret) {
1706lvl2_fail:
1707		nvkm_gsp_mem_dtor(&rx3->lvl1);
1708lvl1_fail:
1709		nvkm_gsp_mem_dtor(&rx3->lvl0);
1710	}
1711
1712	return ret;
1713}
1714
1715static u32
1716r535_gsp_sr_data_size(struct nvkm_gsp *gsp)
1717{
1718	GspFwWprMeta *meta = gsp->wpr_meta.data;
1719
1720	return meta->gspFwWprEnd - meta->gspFwWprStart;
1721}
1722
1723int
1724r535_gsp_fini(struct nvkm_gsp *gsp, enum nvkm_suspend_state suspend)
1725{
1726	struct nvkm_rm *rm = gsp->rm;
1727	int ret;
1728
1729	if (suspend) {
1730		u32 len = rm->api->gsp->sr_data_size(gsp);
1731		GspFwSRMeta *sr;
1732
1733		ret = nvkm_gsp_sg(gsp->subdev.device, len, &gsp->sr.sgt);
1734		if (ret)
1735			return ret;
1736
1737		ret = nvkm_gsp_radix3_sg(gsp, &gsp->sr.sgt, len, &gsp->sr.radix3);
1738		if (ret)
1739			return ret;
1740
1741		ret = nvkm_gsp_mem_ctor(gsp, sizeof(*sr), &gsp->sr.meta);
1742		if (ret)
1743			return ret;
1744
1745		sr = gsp->sr.meta.data;
1746		sr->magic = GSP_FW_SR_META_MAGIC;
1747		sr->revision = GSP_FW_SR_META_REVISION;
1748		sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr;
1749		sr->sizeOfSuspendResumeData = len;
1750
1751		ret = rm->api->fbsr->suspend(gsp, suspend == NVKM_RUNTIME_SUSPEND);
1752		if (ret) {
1753			nvkm_gsp_mem_dtor(&gsp->sr.meta);
1754			nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
1755			nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
1756			return ret;
1757		}
1758
1759		/*
1760		 * TODO: Debug the GSP firmware / RPC handling to find out why
1761		 * without this Turing (but none of the other architectures)
1762		 * ends up resetting all channels after resume.
1763		 */
1764		msleep(50);
1765	}
1766
1767	ret = r535_gsp_rpc_unloading_guest_driver(gsp, suspend);
1768	if (WARN_ON(ret))
1769		return ret;
1770
1771	nvkm_msec(gsp->subdev.device, 2000,
1772		if (nvkm_falcon_rd32(&gsp->falcon, 0x040) == 0x80000000)
1773			break;
1774	);
1775
1776	gsp->running = false;
1777	return 0;
1778}
1779
1780int
1781r535_gsp_init(struct nvkm_gsp *gsp)
1782{
1783	int ret;
1784
1785	nvkm_falcon_wr32(&gsp->falcon, 0x080, gsp->boot.app_version);
1786
1787	if (WARN_ON(!nvkm_falcon_riscv_active(&gsp->falcon)))
1788		return -EIO;
1789
1790	ret = r535_gsp_rpc_poll(gsp, NV_VGPU_MSG_EVENT_GSP_INIT_DONE);
1791	if (ret)
1792		goto done;
1793
1794	gsp->running = true;
1795
1796done:
1797	if (gsp->sr.meta.data) {
1798		gsp->rm->api->fbsr->resume(gsp);
1799
1800		nvkm_gsp_mem_dtor(&gsp->sr.meta);
1801		nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
1802		nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
1803		return ret;
1804	}
1805
1806	if (ret == 0)
1807		ret = r535_gsp_postinit(gsp);
1808
1809	return ret;
1810}
1811
1812static int
1813r535_gsp_rm_boot_ctor(struct nvkm_gsp *gsp)
1814{
1815	const struct firmware *fw = gsp->fws.bl;
1816	const struct nvfw_bin_hdr *hdr;
1817	RM_RISCV_UCODE_DESC *desc;
1818	int ret;
1819
1820	ret = nvkm_gsp_fwsec_sb_ctor(gsp);
1821	if (ret)
1822		return ret;
1823
1824	hdr = nvfw_bin_hdr(&gsp->subdev, fw->data);
1825	desc = (void *)fw->data + hdr->header_offset;
1826
1827	ret = nvkm_gsp_mem_ctor(gsp, hdr->data_size, &gsp->boot.fw);
1828	if (ret)
1829		goto dtor_fwsec;
1830
1831	memcpy(gsp->boot.fw.data, fw->data + hdr->data_offset, hdr->data_size);
1832
1833	gsp->boot.code_offset = desc->monitorCodeOffset;
1834	gsp->boot.data_offset = desc->monitorDataOffset;
1835	gsp->boot.manifest_offset = desc->manifestOffset;
1836	gsp->boot.app_version = desc->appVersion;
1837	return 0;
1838dtor_fwsec:
1839	nvkm_gsp_fwsec_sb_dtor(gsp);
1840	return ret;
1841}
1842
1843static const struct nvkm_firmware_func
1844r535_gsp_fw = {
1845	.type = NVKM_FIRMWARE_IMG_SGT,
1846};
1847
1848static int
1849r535_gsp_elf_section(struct nvkm_gsp *gsp, const char *name, const u8 **pdata, u64 *psize)
1850{
1851	const u8 *img = gsp->fws.rm->data;
1852	const struct elf64_hdr *ehdr = (const struct elf64_hdr *)img;
1853	const struct elf64_shdr *shdr = (const struct elf64_shdr *)&img[ehdr->e_shoff];
1854	const char *names = &img[shdr[ehdr->e_shstrndx].sh_offset];
1855
1856	for (int i = 0; i < ehdr->e_shnum; i++, shdr++) {
1857		if (!strcmp(&names[shdr->sh_name], name)) {
1858			*pdata = &img[shdr->sh_offset];
1859			*psize = shdr->sh_size;
1860			return 0;
1861		}
1862	}
1863
1864	nvkm_error(&gsp->subdev, "section '%s' not found\n", name);
1865	return -ENOENT;
1866}
1867
1868#ifdef CONFIG_DEBUG_FS
1869
1870struct r535_gsp_log {
1871	struct nvif_log log;
1872
1873	/*
1874	 * Logging buffers in debugfs. The wrapper objects need to remain
1875	 * in memory until the dentry is deleted.
1876	 */
1877	struct dentry *debugfs_logging_dir;
1878	struct debugfs_blob_wrapper blob_init;
1879	struct debugfs_blob_wrapper blob_intr;
1880	struct debugfs_blob_wrapper blob_rm;
1881	struct debugfs_blob_wrapper blob_pmu;
1882};
1883
1884/**
1885 * r535_debugfs_shutdown - delete GSP-RM logging buffers for one GPU
1886 * @_log: nvif_log struct for this GPU
1887 *
1888 * Called when the driver is shutting down, to clean up the retained GSP-RM
1889 * logging buffers.
1890 */
1891static void r535_debugfs_shutdown(struct nvif_log *_log)
1892{
1893	struct r535_gsp_log *log = container_of(_log, struct r535_gsp_log, log);
1894
1895	debugfs_remove(log->debugfs_logging_dir);
1896
1897	kfree(log->blob_init.data);
1898	kfree(log->blob_intr.data);
1899	kfree(log->blob_rm.data);
1900	kfree(log->blob_pmu.data);
1901
1902	/* We also need to delete the list object */
1903	kfree(log);
1904}
1905
1906/**
1907 * is_empty - return true if the logging buffer was never written to
1908 * @b: blob wrapper with ->data field pointing to logging buffer
1909 *
1910 * The first 64-bit field of loginit, and logintr, and logrm is the 'put'
1911 * pointer, and it is initialized to 0. It's a dword-based index into the
1912 * circular buffer, indicating where the next printf write will be made.
1913 *
1914 * If the pointer is still 0 when GSP-RM is shut down, that means that the
1915 * buffer was never written to, so it can be ignored.
1916 *
1917 * This test also works for logpmu, even though it doesn't have a put pointer.
1918 */
1919static bool is_empty(const struct debugfs_blob_wrapper *b)
1920{
1921	u64 *put = b->data;
1922
1923	return put ? (*put == 0) : true;
1924}
1925
1926/**
1927 * r535_gsp_copy_log - preserve the logging buffers in a blob
1928 * @parent: the top-level dentry for this GPU
1929 * @name: name of debugfs entry to create
1930 * @s: original wrapper object to copy from
1931 * @t: new wrapper object to copy to
1932 *
1933 * When GSP shuts down, the nvkm_gsp object and all its memory is deleted.
1934 * To preserve the logging buffers, the buffers need to be copied, but only
1935 * if they actually have data.
1936 */
1937static int r535_gsp_copy_log(struct dentry *parent,
1938			     const char *name,
1939			     const struct debugfs_blob_wrapper *s,
1940			     struct debugfs_blob_wrapper *t)
1941{
1942	struct dentry *dent;
1943	void *p;
1944
1945	if (is_empty(s))
1946		return 0;
1947
1948	/* The original buffers will be deleted */
1949	p = kmemdup(s->data, s->size, GFP_KERNEL);
1950	if (!p)
1951		return -ENOMEM;
1952
1953	t->data = p;
1954	t->size = s->size;
1955
1956	dent = debugfs_create_blob(name, 0444, parent, t);
1957	if (IS_ERR(dent)) {
1958		kfree(p);
1959		memset(t, 0, sizeof(*t));
1960		return PTR_ERR(dent);
1961	}
1962
1963	i_size_write(d_inode(dent), t->size);
1964
1965	return 0;
1966}
1967
1968/**
1969 * r535_gsp_retain_logging - copy logging buffers to new debugfs root
1970 * @gsp: gsp pointer
1971 *
1972 * If keep_gsp_logging is enabled, then we want to preserve the GSP-RM logging
1973 * buffers and their debugfs entries, but all those objects would normally
1974 * deleted if GSP-RM fails to load.
1975 *
1976 * To preserve the logging buffers, we need to:
1977 *
1978 * 1) Allocate new buffers and copy the logs into them, so that the original
1979 * DMA buffers can be released.
1980 *
1981 * 2) Preserve the directories.  We don't need to save single dentries because
1982 * we're going to delete the parent when the
1983 *
1984 * If anything fails in this process, then all the dentries need to be
1985 * deleted.  We don't need to deallocate the original logging buffers because
1986 * the caller will do that regardless.
1987 */
1988static void r535_gsp_retain_logging(struct nvkm_gsp *gsp)
1989{
1990	struct device *dev = gsp->subdev.device->dev;
1991	struct r535_gsp_log *log = NULL;
1992	int ret;
1993
1994	if (!keep_gsp_logging || !gsp->debugfs.parent) {
1995		/* Nothing to do */
1996		goto exit;
1997	}
1998
1999	/* Check to make sure at least one buffer has data. */
2000	if (is_empty(&gsp->blob_init) && is_empty(&gsp->blob_intr) &&
2001	    is_empty(&gsp->blob_rm) && is_empty(&gsp->blob_rm)) {
2002		nvkm_warn(&gsp->subdev, "all logging buffers are empty\n");
2003		goto exit;
2004	}
2005
2006	log = kzalloc(sizeof(*log), GFP_KERNEL);
2007	if (!log)
2008		goto error;
2009
2010	/*
2011	 * Since the nvkm_gsp object is going away, the debugfs_blob_wrapper
2012	 * objects are also being deleted, which means the dentries will no
2013	 * longer be valid.  Delete the existing entries so that we can create
2014	 * new ones with the same name.
2015	 */
2016	debugfs_remove(gsp->debugfs.init);
2017	debugfs_remove(gsp->debugfs.intr);
2018	debugfs_remove(gsp->debugfs.rm);
2019	debugfs_remove(gsp->debugfs.pmu);
2020
2021	ret = r535_gsp_copy_log(gsp->debugfs.parent, "loginit", &gsp->blob_init, &log->blob_init);
2022	if (ret)
2023		goto error;
2024
2025	ret = r535_gsp_copy_log(gsp->debugfs.parent, "logintr", &gsp->blob_intr, &log->blob_intr);
2026	if (ret)
2027		goto error;
2028
2029	ret = r535_gsp_copy_log(gsp->debugfs.parent, "logrm", &gsp->blob_rm, &log->blob_rm);
2030	if (ret)
2031		goto error;
2032
2033	ret = r535_gsp_copy_log(gsp->debugfs.parent, "logpmu", &gsp->blob_pmu, &log->blob_pmu);
2034	if (ret)
2035		goto error;
2036
2037	/* The nvkm_gsp object is going away, so save the dentry */
2038	log->debugfs_logging_dir = gsp->debugfs.parent;
2039
2040	log->log.shutdown = r535_debugfs_shutdown;
2041	list_add(&log->log.entry, &gsp_logs.head);
2042
2043	nvkm_warn(&gsp->subdev,
2044		  "logging buffers migrated to /sys/kernel/debug/nouveau/%s\n",
2045		  dev_name(dev));
2046
2047	return;
2048
2049error:
2050	nvkm_warn(&gsp->subdev, "failed to migrate logging buffers\n");
2051
2052exit:
2053	debugfs_remove(gsp->debugfs.parent);
2054
2055	if (log) {
2056		kfree(log->blob_init.data);
2057		kfree(log->blob_intr.data);
2058		kfree(log->blob_rm.data);
2059		kfree(log->blob_pmu.data);
2060		kfree(log);
2061	}
2062}
2063
2064#endif
2065
2066/**
2067 * r535_gsp_libos_debugfs_fini - cleanup/retain log buffers on shutdown
2068 * @gsp: gsp pointer
2069 *
2070 * If the log buffers are exposed via debugfs, the data for those entries
2071 * needs to be cleaned up when the GSP device shuts down.
2072 */
2073static void
2074r535_gsp_libos_debugfs_fini(struct nvkm_gsp __maybe_unused *gsp)
2075{
2076#ifdef CONFIG_DEBUG_FS
2077	r535_gsp_retain_logging(gsp);
2078
2079	/*
2080	 * Unlike the other buffers, the PMU blob is a kmalloc'd buffer that
2081	 * exists only if the debugfs entries were created.
2082	 */
2083	kfree(gsp->blob_pmu.data);
2084	gsp->blob_pmu.data = NULL;
2085#endif
2086}
2087
2088void
2089r535_gsp_dtor(struct nvkm_gsp *gsp)
2090{
2091	idr_destroy(&gsp->client_id.idr);
2092	mutex_destroy(&gsp->client_id.mutex);
2093
2094	nvkm_gsp_radix3_dtor(gsp, &gsp->radix3);
2095	nvkm_gsp_mem_dtor(&gsp->sig);
2096	nvkm_firmware_dtor(&gsp->fw);
2097
2098	nvkm_falcon_fw_dtor(&gsp->booter.unload);
2099	nvkm_falcon_fw_dtor(&gsp->booter.load);
2100
2101	nvkm_gsp_mem_dtor(&gsp->fmc.args);
2102	kfree(gsp->fmc.sig);
2103	kfree(gsp->fmc.pkey);
2104	kfree(gsp->fmc.hash);
2105	nvkm_gsp_mem_dtor(&gsp->fmc.fw);
2106
2107	mutex_destroy(&gsp->msgq.mutex);
2108	mutex_destroy(&gsp->cmdq.mutex);
2109
2110	nvkm_gsp_dtor_fws(gsp);
2111	nvkm_gsp_fwsec_sb_dtor(gsp);
2112
2113	nvkm_gsp_mem_dtor(&gsp->rmargs);
2114	nvkm_gsp_mem_dtor(&gsp->wpr_meta);
2115	nvkm_gsp_mem_dtor(&gsp->shm.mem);
2116
2117	r535_gsp_libos_debugfs_fini(gsp);
2118
2119	nvkm_gsp_mem_dtor(&gsp->loginit);
2120	nvkm_gsp_mem_dtor(&gsp->logintr);
2121	nvkm_gsp_mem_dtor(&gsp->logrm);
2122}
2123
2124static void
2125r535_gsp_drop_send_user_shared_data(struct nvkm_gsp *gsp)
2126{
2127	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_GSP_SEND_USER_SHARED_DATA, NULL, NULL);
2128}
2129
2130int
2131r535_gsp_oneinit(struct nvkm_gsp *gsp)
2132{
2133	struct nvkm_device *device = gsp->subdev.device;
2134	const struct nvkm_rm_api *rmapi = gsp->rm->api;
2135	const u8 *data;
2136	u64 size;
2137	int ret;
2138
2139	mutex_init(&gsp->cmdq.mutex);
2140	mutex_init(&gsp->msgq.mutex);
2141
2142	/* Load GSP firmware from ELF image into DMA-accessible memory. */
2143	ret = r535_gsp_elf_section(gsp, ".fwimage", &data, &size);
2144	if (ret)
2145		return ret;
2146
2147	ret = nvkm_firmware_ctor(&r535_gsp_fw, "gsp-rm", device, data, size, &gsp->fw);
2148	if (ret)
2149		return ret;
2150
2151	/* Load relevant signature from ELF image. */
2152	ret = r535_gsp_elf_section(gsp, gsp->func->sig_section, &data, &size);
2153	if (ret)
2154		return ret;
2155
2156	ret = nvkm_gsp_mem_ctor(gsp, ALIGN(size, 256), &gsp->sig);
2157	if (ret)
2158		return ret;
2159
2160	memcpy(gsp->sig.data, data, size);
2161
2162	/* Build radix3 page table for ELF image. */
2163	ret = nvkm_gsp_radix3_sg(gsp, &gsp->fw.mem.sgt, gsp->fw.len, &gsp->radix3);
2164	if (ret)
2165		return ret;
2166
2167	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_GSP_RUN_CPU_SEQUENCER,
2168			      r535_gsp_msg_run_cpu_sequencer, gsp);
2169	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_POST_EVENT, r535_gsp_msg_post_event, gsp);
2170	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_RC_TRIGGERED, rmapi->fifo->rc_triggered, gsp);
2171	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_MMU_FAULT_QUEUED,
2172			      r535_gsp_msg_mmu_fault_queued, gsp);
2173	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_OS_ERROR_LOG, r535_gsp_msg_os_error_log, gsp);
2174	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_PERF_BRIDGELESS_INFO_UPDATE, NULL, NULL);
2175	r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_UCODE_LIBOS_PRINT, NULL, NULL);
2176	if (rmapi->gsp->drop_send_user_shared_data)
2177		rmapi->gsp->drop_send_user_shared_data(gsp);
2178	if (rmapi->gsp->drop_post_nocat_record)
2179		rmapi->gsp->drop_post_nocat_record(gsp);
2180
2181	ret = r535_gsp_rm_boot_ctor(gsp);
2182	if (ret)
2183		return ret;
2184
2185	/* Release FW images - we've copied them to DMA buffers now. */
2186	nvkm_gsp_dtor_fws(gsp);
2187
2188	ret = r535_gsp_libos_init(gsp);
2189	if (WARN_ON(ret))
2190		return ret;
2191
2192	ret = rmapi->gsp->set_system_info(gsp);
2193	if (WARN_ON(ret))
2194		return ret;
2195
2196	ret = r535_gsp_rpc_set_registry(gsp);
2197	if (WARN_ON(ret))
2198		return ret;
2199
2200	mutex_init(&gsp->client_id.mutex);
2201	idr_init(&gsp->client_id.idr);
2202	return 0;
2203}
2204
2205const struct nvkm_rm_api_gsp
2206r535_gsp = {
2207	.set_rmargs = r535_gsp_set_rmargs,
2208	.set_system_info = r535_gsp_set_system_info,
2209	.get_static_info = r535_gsp_get_static_info,
2210	.xlat_mc_engine_idx = r535_gsp_xlat_mc_engine_idx,
2211	.drop_send_user_shared_data = r535_gsp_drop_send_user_shared_data,
2212	.sr_data_size = r535_gsp_sr_data_size,
2213};
~/ Read-only file preview.