drm/nouveau/gsp: add common client alloc code

570.144 has incompatible changes to NV0000_ALLOC_PARAMETERS.

Factor out the common code so it can be shared.

Signed-off-by: Ben Skeggs <bskeggs@nvidia.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Ben Skeggs
2025-05-14 09:19:56 +10:00
committed by Dave Airlie
parent 9c86a6010a
commit 1b9d7b9df8
6 changed files with 59 additions and 56 deletions

View File

@@ -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)

View File

@@ -1,6 +1,7 @@
# 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

View File

@@ -0,0 +1,49 @@
/* 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;
}

View File

@@ -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

View File

@@ -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,
};

View File

@@ -59,8 +59,7 @@ struct nvkm_rm_api {
} *alloc;
const struct nvkm_rm_api_client {
int (*ctor)(struct nvkm_gsp *, struct nvkm_gsp_client *);
void (*dtor)(struct nvkm_gsp_client *);
int (*ctor)(struct nvkm_gsp_client *, u32 handle);
} *client;
const struct nvkm_rm_api_device {