1 // SPDX-License-Identifier: GPL-2.0 OR MIT
2 /* Copyright 2018-2019 Qiang Yu <yuq825@gmail.com> */
4 #include <linux/slab.h>
6 #include "lima_device.h"
9 int lima_ctx_create(struct lima_device
*dev
, struct lima_ctx_mgr
*mgr
, u32
*id
)
14 ctx
= kzalloc(sizeof(*ctx
), GFP_KERNEL
);
18 kref_init(&ctx
->refcnt
);
20 for (i
= 0; i
< lima_pipe_num
; i
++) {
21 err
= lima_sched_context_init(dev
->pipe
+ i
, ctx
->context
+ i
, &ctx
->guilty
);
26 err
= xa_alloc(&mgr
->handles
, id
, ctx
, xa_limit_32b
, GFP_KERNEL
);
33 for (i
--; i
>= 0; i
--)
34 lima_sched_context_fini(dev
->pipe
+ i
, ctx
->context
+ i
);
39 static void lima_ctx_do_release(struct kref
*ref
)
41 struct lima_ctx
*ctx
= container_of(ref
, struct lima_ctx
, refcnt
);
44 for (i
= 0; i
< lima_pipe_num
; i
++)
45 lima_sched_context_fini(ctx
->dev
->pipe
+ i
, ctx
->context
+ i
);
49 int lima_ctx_free(struct lima_ctx_mgr
*mgr
, u32 id
)
54 mutex_lock(&mgr
->lock
);
55 ctx
= xa_erase(&mgr
->handles
, id
);
57 kref_put(&ctx
->refcnt
, lima_ctx_do_release
);
60 mutex_unlock(&mgr
->lock
);
64 struct lima_ctx
*lima_ctx_get(struct lima_ctx_mgr
*mgr
, u32 id
)
68 mutex_lock(&mgr
->lock
);
69 ctx
= xa_load(&mgr
->handles
, id
);
71 kref_get(&ctx
->refcnt
);
72 mutex_unlock(&mgr
->lock
);
76 void lima_ctx_put(struct lima_ctx
*ctx
)
78 kref_put(&ctx
->refcnt
, lima_ctx_do_release
);
81 void lima_ctx_mgr_init(struct lima_ctx_mgr
*mgr
)
83 mutex_init(&mgr
->lock
);
84 xa_init_flags(&mgr
->handles
, XA_FLAGS_ALLOC
);
87 void lima_ctx_mgr_fini(struct lima_ctx_mgr
*mgr
)
92 xa_for_each(&mgr
->handles
, id
, ctx
) {
93 kref_put(&ctx
->refcnt
, lima_ctx_do_release
);
96 xa_destroy(&mgr
->handles
);
97 mutex_destroy(&mgr
->lock
);