1 /*
2  * Copyright (c) 2024 Meta Platforms
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <string.h>
8 #include <stdlib.h>
9 
10 #include <zephyr/drivers/i3c.h>
11 
12 #include <zephyr/logging/log.h>
13 LOG_MODULE_DECLARE(i3c, CONFIG_I3C_LOG_LEVEL);
14 
15 /* Generate Names */
16 #define UNKNOWN_NAME_STR(i, _)                                                                     \
17 	{                                                                                          \
18 		.name = "unknown-" STRINGIFY(i)                                                    \
19 	}
20 const struct device dummy_devs[] = {
21 	LISTIFY(CONFIG_I3C_NUM_OF_DESC_MEM_SLABS, UNKNOWN_NAME_STR, (,)) };
22 
23 K_MEM_SLAB_DEFINE(i3c_device_desc_pool, sizeof(struct i3c_device_desc),
24 		  CONFIG_I3C_NUM_OF_DESC_MEM_SLABS, 4);
25 
i3c_device_desc_alloc(void)26 struct i3c_device_desc *i3c_device_desc_alloc(void)
27 {
28 	struct i3c_device_desc *desc;
29 
30 	if (k_mem_slab_alloc(&i3c_device_desc_pool, (void **)&desc, K_NO_WAIT) == 0) {
31 		memset(desc, 0, sizeof(struct i3c_device_desc));
32 		*(const struct device **)&desc->dev =
33 			&dummy_devs[k_mem_slab_num_free_get(&i3c_device_desc_pool)];
34 		LOG_DBG("I3C Device Desc allocated - %d free",
35 			k_mem_slab_num_free_get(&i3c_device_desc_pool));
36 	} else {
37 		LOG_WRN("No memory left for I3C descriptors");
38 	}
39 
40 	return desc;
41 }
42 
i3c_device_desc_free(struct i3c_device_desc * desc)43 void i3c_device_desc_free(struct i3c_device_desc *desc)
44 {
45 	k_mem_slab_free(&i3c_device_desc_pool, (void *)desc);
46 	LOG_DBG("I3C Device Desc freed");
47 }
48 
i3c_device_desc_in_pool(struct i3c_device_desc * desc)49 bool i3c_device_desc_in_pool(struct i3c_device_desc *desc)
50 {
51 	const char *p = (const char *)desc;
52 	ptrdiff_t offset = p - i3c_device_desc_pool.buffer;
53 
54 	return (offset >= 0) &&
55 	       (offset < (i3c_device_desc_pool.info.block_size *
56 		   i3c_device_desc_pool.info.num_blocks)) &&
57 	       ((offset % i3c_device_desc_pool.info.block_size) == 0);
58 }
59