Loading drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h +2 −15 Original line number Diff line number Diff line Loading @@ -411,21 +411,8 @@ nvkm_gsp_rm_free(struct nvkm_gsp_object *object) return 0; } static inline int nvkm_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client) { if (WARN_ON(!gsp->rm)) return -ENOSYS; return gsp->rm->api->client->ctor(gsp, client); } static inline void nvkm_gsp_client_dtor(struct nvkm_gsp_client *client) { if (client->gsp) client->gsp->rm->api->client->dtor(client); } int nvkm_gsp_client_ctor(struct nvkm_gsp *, struct nvkm_gsp_client *); void nvkm_gsp_client_dtor(struct nvkm_gsp_client *); static inline int nvkm_gsp_device_ctor(struct nvkm_gsp_client *client, struct nvkm_gsp_device *device) Loading drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/Kbuild +1 −0 Original line number Diff line number Diff line # SPDX-License-Identifier: MIT # # Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. nvkm-y += nvkm/subdev/gsp/rm/client.o nvkm-y += nvkm/subdev/gsp/rm/engine.o nvkm-y += nvkm/subdev/gsp/rm/gr.o nvkm-y += nvkm/subdev/gsp/rm/nvdec.o Loading drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/client.c 0 → 100644 +49 −0 Original line number Diff line number Diff line /* SPDX-License-Identifier: MIT * * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. */ #include "rm.h" void nvkm_gsp_client_dtor(struct nvkm_gsp_client *client) { const unsigned int id = client->object.handle - NVKM_RM_CLIENT(0); struct nvkm_gsp *gsp = client->gsp; if (!gsp) return; if (client->object.client) nvkm_gsp_rm_free(&client->object); mutex_lock(&gsp->client_id.mutex); idr_remove(&gsp->client_id.idr, id); mutex_unlock(&gsp->client_id.mutex); client->gsp = NULL; } int nvkm_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client) { int id, ret; if (WARN_ON(!gsp->rm)) return -ENOSYS; mutex_lock(&gsp->client_id.mutex); id = idr_alloc(&gsp->client_id.idr, client, 0, NVKM_RM_CLIENT_MASK + 1, GFP_KERNEL); mutex_unlock(&gsp->client_id.mutex); if (id < 0) return id; client->gsp = gsp; client->object.client = client; INIT_LIST_HEAD(&client->events); ret = gsp->rm->api->client->ctor(client, NVKM_RM_CLIENT(id)); if (ret) nvkm_gsp_client_dtor(client); return ret; } drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/handles.h +1 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ /* RMAPI handles for various objects allocated from GSP-RM with RM_ALLOC. */ #define NVKM_RM_CLIENT(id) (0xc1d00000 | (id)) #define NVKM_RM_CLIENT_MASK 0x0000ffff #define NVKM_RM_DEVICE 0xde1d0000 #define NVKM_RM_SUBDEVICE 0x5d1d0000 #define NVKM_RM_DISP 0x00730000 Loading drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/client.c +5 −39 Original line number Diff line number Diff line Loading @@ -23,57 +23,23 @@ #include "nvrm/client.h" static void r535_gsp_client_dtor(struct nvkm_gsp_client *client) { struct nvkm_gsp *gsp = client->gsp; nvkm_gsp_rm_free(&client->object); mutex_lock(&gsp->client_id.mutex); idr_remove(&gsp->client_id.idr, client->object.handle & 0xffff); mutex_unlock(&gsp->client_id.mutex); client->gsp = NULL; } static int r535_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client) r535_gsp_client_ctor(struct nvkm_gsp_client *client, u32 handle) { NV0000_ALLOC_PARAMETERS *args; int ret; mutex_lock(&gsp->client_id.mutex); ret = idr_alloc(&gsp->client_id.idr, client, 0, 0xffff + 1, GFP_KERNEL); mutex_unlock(&gsp->client_id.mutex); if (ret < 0) return ret; client->gsp = gsp; client->object.client = client; INIT_LIST_HEAD(&client->events); args = nvkm_gsp_rm_alloc_get(&client->object, NVKM_RM_CLIENT(ret), NV01_ROOT, sizeof(*args), args = nvkm_gsp_rm_alloc_get(&client->object, handle, NV01_ROOT, sizeof(*args), &client->object); if (IS_ERR(args)) { r535_gsp_client_dtor(client); return ret; } if (IS_ERR(args)) return PTR_ERR(args); args->hClient = client->object.handle; args->processID = ~0; ret = nvkm_gsp_rm_alloc_wr(&client->object, args); if (ret) { r535_gsp_client_dtor(client); return ret; } return 0; return nvkm_gsp_rm_alloc_wr(&client->object, args); } const struct nvkm_rm_api_client r535_client = { .ctor = r535_gsp_client_ctor, .dtor = r535_gsp_client_dtor, }; Loading
drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h +2 −15 Original line number Diff line number Diff line Loading @@ -411,21 +411,8 @@ nvkm_gsp_rm_free(struct nvkm_gsp_object *object) return 0; } static inline int nvkm_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client) { if (WARN_ON(!gsp->rm)) return -ENOSYS; return gsp->rm->api->client->ctor(gsp, client); } static inline void nvkm_gsp_client_dtor(struct nvkm_gsp_client *client) { if (client->gsp) client->gsp->rm->api->client->dtor(client); } int nvkm_gsp_client_ctor(struct nvkm_gsp *, struct nvkm_gsp_client *); void nvkm_gsp_client_dtor(struct nvkm_gsp_client *); static inline int nvkm_gsp_device_ctor(struct nvkm_gsp_client *client, struct nvkm_gsp_device *device) Loading
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/Kbuild +1 −0 Original line number Diff line number Diff line # SPDX-License-Identifier: MIT # # Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. nvkm-y += nvkm/subdev/gsp/rm/client.o nvkm-y += nvkm/subdev/gsp/rm/engine.o nvkm-y += nvkm/subdev/gsp/rm/gr.o nvkm-y += nvkm/subdev/gsp/rm/nvdec.o Loading
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/client.c 0 → 100644 +49 −0 Original line number Diff line number Diff line /* SPDX-License-Identifier: MIT * * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. */ #include "rm.h" void nvkm_gsp_client_dtor(struct nvkm_gsp_client *client) { const unsigned int id = client->object.handle - NVKM_RM_CLIENT(0); struct nvkm_gsp *gsp = client->gsp; if (!gsp) return; if (client->object.client) nvkm_gsp_rm_free(&client->object); mutex_lock(&gsp->client_id.mutex); idr_remove(&gsp->client_id.idr, id); mutex_unlock(&gsp->client_id.mutex); client->gsp = NULL; } int nvkm_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client) { int id, ret; if (WARN_ON(!gsp->rm)) return -ENOSYS; mutex_lock(&gsp->client_id.mutex); id = idr_alloc(&gsp->client_id.idr, client, 0, NVKM_RM_CLIENT_MASK + 1, GFP_KERNEL); mutex_unlock(&gsp->client_id.mutex); if (id < 0) return id; client->gsp = gsp; client->object.client = client; INIT_LIST_HEAD(&client->events); ret = gsp->rm->api->client->ctor(client, NVKM_RM_CLIENT(id)); if (ret) nvkm_gsp_client_dtor(client); return ret; }
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/handles.h +1 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ /* RMAPI handles for various objects allocated from GSP-RM with RM_ALLOC. */ #define NVKM_RM_CLIENT(id) (0xc1d00000 | (id)) #define NVKM_RM_CLIENT_MASK 0x0000ffff #define NVKM_RM_DEVICE 0xde1d0000 #define NVKM_RM_SUBDEVICE 0x5d1d0000 #define NVKM_RM_DISP 0x00730000 Loading
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/client.c +5 −39 Original line number Diff line number Diff line Loading @@ -23,57 +23,23 @@ #include "nvrm/client.h" static void r535_gsp_client_dtor(struct nvkm_gsp_client *client) { struct nvkm_gsp *gsp = client->gsp; nvkm_gsp_rm_free(&client->object); mutex_lock(&gsp->client_id.mutex); idr_remove(&gsp->client_id.idr, client->object.handle & 0xffff); mutex_unlock(&gsp->client_id.mutex); client->gsp = NULL; } static int r535_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client) r535_gsp_client_ctor(struct nvkm_gsp_client *client, u32 handle) { NV0000_ALLOC_PARAMETERS *args; int ret; mutex_lock(&gsp->client_id.mutex); ret = idr_alloc(&gsp->client_id.idr, client, 0, 0xffff + 1, GFP_KERNEL); mutex_unlock(&gsp->client_id.mutex); if (ret < 0) return ret; client->gsp = gsp; client->object.client = client; INIT_LIST_HEAD(&client->events); args = nvkm_gsp_rm_alloc_get(&client->object, NVKM_RM_CLIENT(ret), NV01_ROOT, sizeof(*args), args = nvkm_gsp_rm_alloc_get(&client->object, handle, NV01_ROOT, sizeof(*args), &client->object); if (IS_ERR(args)) { r535_gsp_client_dtor(client); return ret; } if (IS_ERR(args)) return PTR_ERR(args); args->hClient = client->object.handle; args->processID = ~0; ret = nvkm_gsp_rm_alloc_wr(&client->object, args); if (ret) { r535_gsp_client_dtor(client); return ret; } return 0; return nvkm_gsp_rm_alloc_wr(&client->object, args); } const struct nvkm_rm_api_client r535_client = { .ctor = r535_gsp_client_ctor, .dtor = r535_gsp_client_dtor, };