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