Skip to content

Commit

Permalink
nouveau/gsp: add some basic registry entries.
Browse files Browse the repository at this point in the history
The nvidia driver sets these two basic registry entries always,
so copy it.

Reviewed-by: Danilo Krummrich <dakr@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Dave Airlie committed Nov 3, 2023
1 parent 5177e5f commit 8d55b0a
Showing 1 changed file with 35 additions and 10 deletions.
45 changes: 35 additions & 10 deletions drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,26 +1029,51 @@ r535_gsp_rpc_unloading_guest_driver(struct nvkm_gsp *gsp, bool suspend)
return nvkm_gsp_rpc_wr(gsp, rpc, true);
}

/* dword only */
struct nv_gsp_registry_entries {
const char *name;
u32 value;
};

static const struct nv_gsp_registry_entries r535_registry_entries[] = {
{ "RMSecBusResetEnable", 1 },
{ "RMForcePcieConfigSave", 1 },
};
#define NV_GSP_REG_NUM_ENTRIES ARRAY_SIZE(r535_registry_entries)

static int
r535_gsp_rpc_set_registry(struct nvkm_gsp *gsp)
{
PACKED_REGISTRY_TABLE *rpc;
char *strings;
int str_offset;
int i;
size_t rpc_size = sizeof(*rpc) + sizeof(rpc->entries[0]) * NV_GSP_REG_NUM_ENTRIES;

/* add strings + null terminator */
for (i = 0; i < NV_GSP_REG_NUM_ENTRIES; i++)
rpc_size += strlen(r535_registry_entries[i].name) + 1;

rpc = nvkm_gsp_rpc_get(gsp, NV_VGPU_MSG_FUNCTION_SET_REGISTRY,
sizeof(*rpc) + sizeof(rpc->entries[0]) + 1);
rpc = nvkm_gsp_rpc_get(gsp, NV_VGPU_MSG_FUNCTION_SET_REGISTRY, rpc_size);
if (IS_ERR(rpc))
return PTR_ERR(rpc);

rpc->size = sizeof(*rpc);
rpc->numEntries = 1;
rpc->entries[0].nameOffset = offsetof(typeof(*rpc), entries[1]);
rpc->entries[0].type = 1;
rpc->entries[0].data = 0;
rpc->entries[0].length = 4;

strings = (char *)&rpc->entries[1];
strings[0] = '\0';
rpc->numEntries = NV_GSP_REG_NUM_ENTRIES;

str_offset = offsetof(typeof(*rpc), entries[NV_GSP_REG_NUM_ENTRIES]);
strings = (char *)&rpc->entries[NV_GSP_REG_NUM_ENTRIES];
for (i = 0; i < NV_GSP_REG_NUM_ENTRIES; i++) {
int name_len = strlen(r535_registry_entries[i].name) + 1;

rpc->entries[i].nameOffset = str_offset;
rpc->entries[i].type = 1;
rpc->entries[i].data = r535_registry_entries[i].value;
rpc->entries[i].length = 4;
memcpy(strings, r535_registry_entries[i].name, name_len);
strings += name_len;
str_offset += name_len;
}

return nvkm_gsp_rpc_wr(gsp, rpc, false);
}
Expand Down

0 comments on commit 8d55b0a

Please sign in to comment.