blob: 838b4205dc2fef0e6ec0cc23d6a9ddfa5d2a171f [file] [log] [blame]
julhal012c18fbf2021-02-01 08:29:28 +00001/*
Imre Kis58cdf332024-06-04 11:52:05 +02002 * Copyright (c) 2021-2024, Arm Limited and Contributors. All rights reserved.
julhal012c18fbf2021-02-01 08:29:28 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include "config_ramstore.h"
Imre Kis06360812022-07-05 16:28:00 +02008#include "config/interface/config_store.h"
9#include "trace.h"
julhal012c18fbf2021-02-01 08:29:28 +000010#include <stdlib.h>
11#include <string.h>
12#include <stdint.h>
13
14/**
15 * Variable length container for a configuration object.
16 */
17struct config_container
18{
Julian Hall7048d302021-06-03 16:07:28 +010019 enum config_classifier classifier;
20 char name[32];
21 unsigned int instance;
julhal012c18fbf2021-02-01 08:29:28 +000022 size_t size;
23 struct config_container *next;
24};
25
Julian Hall7048d302021-06-03 16:07:28 +010026static struct config_container *config_container_create(enum config_classifier classifier,
27 const char *name, unsigned int instance,
28 const void *data, size_t size)
julhal012c18fbf2021-02-01 08:29:28 +000029{
Imre Kis58cdf332024-06-04 11:52:05 +020030 struct config_container *container = NULL;
31 size_t name_length = strlen(name) + 1;
julhal012c18fbf2021-02-01 08:29:28 +000032
Imre Kis58cdf332024-06-04 11:52:05 +020033 if (name_length > sizeof(container->name))
34 return NULL;
julhal012c18fbf2021-02-01 08:29:28 +000035
Imre Kis58cdf332024-06-04 11:52:05 +020036 container = malloc(sizeof(struct config_container) + size);
37 if (!container)
38 return NULL;
julhal012c18fbf2021-02-01 08:29:28 +000039
Imre Kis58cdf332024-06-04 11:52:05 +020040 container->classifier = classifier;
41 memcpy(container->name, name, name_length);
42 container->instance = instance;
43 container->size = size;
44 container->next = NULL;
45
46 memcpy((uint8_t *)container + sizeof(struct config_container), data, size);
julhal012c18fbf2021-02-01 08:29:28 +000047
48 return container;
49}
50
51static void config_container_destroy(struct config_container *container)
52{
53 free(container);
54}
55
56static const void *config_container_data(const struct config_container *container)
57{
58 return (const uint8_t*)container + sizeof(struct config_container);
59}
60
61/**
62 * Singleton config_ramstore instance
63 */
64static struct config_ramstore
65{
Julian Hall7048d302021-06-03 16:07:28 +010066 struct config_container *object_list;
julhal012c18fbf2021-02-01 08:29:28 +000067} ramstore = {0};
68
69
70void config_ramstore_init(void)
71{
Julian Hall7048d302021-06-03 16:07:28 +010072
julhal012c18fbf2021-02-01 08:29:28 +000073}
74
75void config_ramstore_deinit(void)
76{
Julian Hall7048d302021-06-03 16:07:28 +010077 while (ramstore.object_list) {
julhal012c18fbf2021-02-01 08:29:28 +000078
Julian Hall7048d302021-06-03 16:07:28 +010079 struct config_container *next = ramstore.object_list->next;
Julian Hallcf8170e2022-02-22 11:41:07 +000080 config_container_destroy(ramstore.object_list);
Julian Hall7048d302021-06-03 16:07:28 +010081 ramstore.object_list = next;
julhal012c18fbf2021-02-01 08:29:28 +000082 }
83}
84
Julian Hall7048d302021-06-03 16:07:28 +010085bool config_store_add(enum config_classifier classifier,
86 const char *name,
87 unsigned int instance,
88 const void *data,
89 size_t data_len)
julhal012c18fbf2021-02-01 08:29:28 +000090{
91 struct config_container *container;
92
Julian Hall7048d302021-06-03 16:07:28 +010093 container = config_container_create(classifier, name, instance, data, data_len);
94 if (!container) return false;
julhal012c18fbf2021-02-01 08:29:28 +000095
Julian Hall7048d302021-06-03 16:07:28 +010096 container->next = ramstore.object_list;
97 ramstore.object_list = container;
julhal012c18fbf2021-02-01 08:29:28 +000098
Julian Hall7048d302021-06-03 16:07:28 +010099 return true;
julhal012c18fbf2021-02-01 08:29:28 +0000100}
101
Julian Hall7048d302021-06-03 16:07:28 +0100102bool config_store_query(enum config_classifier classifier,
103 const char *name,
104 unsigned int instance,
105 void *data,
106 size_t data_buf_size)
julhal012c18fbf2021-02-01 08:29:28 +0000107{
Julian Hall7048d302021-06-03 16:07:28 +0100108 bool success = false;
109 const struct config_container *container = ramstore.object_list;
julhal012c18fbf2021-02-01 08:29:28 +0000110
111 while (container) {
112
Julian Hall7048d302021-06-03 16:07:28 +0100113 if ((container->classifier == classifier) &&
Imre Kis06360812022-07-05 16:28:00 +0200114 (strncmp(container->name, name, sizeof(container->name)) == 0) &&
Julian Hall7048d302021-06-03 16:07:28 +0100115 (container->instance == instance)) {
julhal012c18fbf2021-02-01 08:29:28 +0000116
Julian Hall7048d302021-06-03 16:07:28 +0100117 if (data_buf_size == container->size) {
Julian Hall7048d302021-06-03 16:07:28 +0100118 memcpy(data, config_container_data(container), container->size);
119 success = true;
Imre Kis06360812022-07-05 16:28:00 +0200120 } else {
121 DMSG("Query with different size (%lu != %lu)", data_buf_size,
122 container->size);
julhal012c18fbf2021-02-01 08:29:28 +0000123 }
124
125 break;
126 }
127
128 container = container->next;
129 }
130
Imre Kis06360812022-07-05 16:28:00 +0200131 if (!success)
132 DMSG("Failed to query data with name %s", name);
133
Julian Hall7048d302021-06-03 16:07:28 +0100134 return success;
julhal012c18fbf2021-02-01 08:29:28 +0000135}
136
Julian Hall7048d302021-06-03 16:07:28 +0100137unsigned int config_store_count(enum config_classifier classifier)
julhal0137e1aea2021-02-09 15:22:20 +0000138{
139 unsigned int count = 0;
140
Julian Hall7048d302021-06-03 16:07:28 +0100141 const struct config_container *container = ramstore.object_list;
julhal0137e1aea2021-02-09 15:22:20 +0000142
143 while (container) {
144
Julian Hall7048d302021-06-03 16:07:28 +0100145 if (container->classifier == classifier) ++count;
julhal0137e1aea2021-02-09 15:22:20 +0000146 container = container->next;
147 }
148
149 return count;
150}