| /* 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; |
| } |