1 /* SPDX-License-Identifier: MIT
2 *
3 * Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
4 */
5 #include "rm.h"
6
7 void
nvkm_gsp_client_dtor(struct nvkm_gsp_client * client)8 nvkm_gsp_client_dtor(struct nvkm_gsp_client *client)
9 {
10 const unsigned int id = client->object.handle - NVKM_RM_CLIENT(0);
11 struct nvkm_gsp *gsp = client->gsp;
12
13 if (!gsp)
14 return;
15
16 if (client->object.client)
17 nvkm_gsp_rm_free(&client->object);
18
19 mutex_lock(&gsp->client_id.mutex);
20 idr_remove(&gsp->client_id.idr, id);
21 mutex_unlock(&gsp->client_id.mutex);
22
23 client->gsp = NULL;
24 }
25
26 int
nvkm_gsp_client_ctor(struct nvkm_gsp * gsp,struct nvkm_gsp_client * client)27 nvkm_gsp_client_ctor(struct nvkm_gsp *gsp, struct nvkm_gsp_client *client)
28 {
29 int id, ret;
30
31 if (WARN_ON(!gsp->rm))
32 return -ENOSYS;
33
34 mutex_lock(&gsp->client_id.mutex);
35 id = idr_alloc(&gsp->client_id.idr, client, 0, NVKM_RM_CLIENT_MASK + 1, GFP_KERNEL);
36 mutex_unlock(&gsp->client_id.mutex);
37 if (id < 0)
38 return id;
39
40 client->gsp = gsp;
41 client->object.client = client;
42 INIT_LIST_HEAD(&client->events);
43
44 ret = gsp->rm->api->client->ctor(client, NVKM_RM_CLIENT(id));
45 if (ret)
46 nvkm_gsp_client_dtor(client);
47
48 return ret;
49 }
50