xref: /linux/drivers/dibs/dibs_main.c (revision d324a2ca3f8efd57f5839aa2690554a5cbb3586f)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  DIBS - Direct Internal Buffer Sharing
4  *
5  *  Implementation of the DIBS class module
6  *
7  *  Copyright IBM Corp. 2025
8  */
9 #define KMSG_COMPONENT "dibs"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11 
12 #include <linux/module.h>
13 #include <linux/types.h>
14 #include <linux/err.h>
15 #include <linux/dibs.h>
16 
17 MODULE_DESCRIPTION("Direct Internal Buffer Sharing class");
18 MODULE_LICENSE("GPL");
19 
20 /* use an array rather a list for fast mapping: */
21 static struct dibs_client *clients[MAX_DIBS_CLIENTS];
22 static u8 max_client;
23 static DEFINE_MUTEX(clients_lock);
24 
25 int dibs_register_client(struct dibs_client *client)
26 {
27 	int i, rc = -ENOSPC;
28 
29 	mutex_lock(&clients_lock);
30 	for (i = 0; i < MAX_DIBS_CLIENTS; ++i) {
31 		if (!clients[i]) {
32 			clients[i] = client;
33 			client->id = i;
34 			if (i == max_client)
35 				max_client++;
36 			rc = 0;
37 			break;
38 		}
39 	}
40 	mutex_unlock(&clients_lock);
41 
42 	return rc;
43 }
44 EXPORT_SYMBOL_GPL(dibs_register_client);
45 
46 int dibs_unregister_client(struct dibs_client *client)
47 {
48 	int rc = 0;
49 
50 	mutex_lock(&clients_lock);
51 	clients[client->id] = NULL;
52 	if (client->id + 1 == max_client)
53 		max_client--;
54 	mutex_unlock(&clients_lock);
55 	return rc;
56 }
57 EXPORT_SYMBOL_GPL(dibs_unregister_client);
58 
59 static int __init dibs_init(void)
60 {
61 	memset(clients, 0, sizeof(clients));
62 	max_client = 0;
63 
64 	return 0;
65 }
66 
67 static void __exit dibs_exit(void)
68 {
69 }
70 
71 module_init(dibs_init);
72 module_exit(dibs_exit);
73