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