blob: af26a57a797be598ec8e698c772b8a8047b55b27 [file] [log] [blame]
julhal012c18fbf2021-02-01 08:29:28 +00001/*
Julian Hallcf8170e2022-02-22 11:41:07 +00002 * Copyright (c) 2021-2022, 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{
30 struct config_container *container = malloc(sizeof(struct config_container) + size);
31
32 if (container) {
33
Julian Hall7048d302021-06-03 16:07:28 +010034 container->classifier = classifier;
35 strncpy(container->name, name, sizeof(container->name));
36 container->name[sizeof(container->name) - 1] = '\0';
37 container->instance = instance;
julhal012c18fbf2021-02-01 08:29:28 +000038 container->size = size;
39 container->next = NULL;
40
41 memcpy((uint8_t*)container + sizeof(struct config_container), data, size);
42 }
43
44 return container;
45}
46
47static void config_container_destroy(struct config_container *container)
48{
49 free(container);
50}
51
52static const void *config_container_data(const struct config_container *container)
53{
54 return (const uint8_t*)container + sizeof(struct config_container);
55}
56
57/**
58 * Singleton config_ramstore instance
59 */
60static struct config_ramstore
61{
Julian Hall7048d302021-06-03 16:07:28 +010062 struct config_container *object_list;
julhal012c18fbf2021-02-01 08:29:28 +000063} ramstore = {0};
64
65
66void config_ramstore_init(void)
67{
Julian Hall7048d302021-06-03 16:07:28 +010068
julhal012c18fbf2021-02-01 08:29:28 +000069}
70
71void config_ramstore_deinit(void)
72{
Julian Hall7048d302021-06-03 16:07:28 +010073 while (ramstore.object_list) {
julhal012c18fbf2021-02-01 08:29:28 +000074
Julian Hall7048d302021-06-03 16:07:28 +010075 struct config_container *next = ramstore.object_list->next;
Julian Hallcf8170e2022-02-22 11:41:07 +000076 config_container_destroy(ramstore.object_list);
Julian Hall7048d302021-06-03 16:07:28 +010077 ramstore.object_list = next;
julhal012c18fbf2021-02-01 08:29:28 +000078 }
79}
80
Julian Hall7048d302021-06-03 16:07:28 +010081bool config_store_add(enum config_classifier classifier,
82 const char *name,
83 unsigned int instance,
84 const void *data,
85 size_t data_len)
julhal012c18fbf2021-02-01 08:29:28 +000086{
87 struct config_container *container;
88
Julian Hall7048d302021-06-03 16:07:28 +010089 container = config_container_create(classifier, name, instance, data, data_len);
90 if (!container) return false;
julhal012c18fbf2021-02-01 08:29:28 +000091
Julian Hall7048d302021-06-03 16:07:28 +010092 container->next = ramstore.object_list;
93 ramstore.object_list = container;
julhal012c18fbf2021-02-01 08:29:28 +000094
Julian Hall7048d302021-06-03 16:07:28 +010095 return true;
julhal012c18fbf2021-02-01 08:29:28 +000096}
97
Julian Hall7048d302021-06-03 16:07:28 +010098bool config_store_query(enum config_classifier classifier,
99 const char *name,
100 unsigned int instance,
101 void *data,
102 size_t data_buf_size)
julhal012c18fbf2021-02-01 08:29:28 +0000103{
Julian Hall7048d302021-06-03 16:07:28 +0100104 bool success = false;
105 const struct config_container *container = ramstore.object_list;
julhal012c18fbf2021-02-01 08:29:28 +0000106
107 while (container) {
108
Julian Hall7048d302021-06-03 16:07:28 +0100109 if ((container->classifier == classifier) &&
Imre Kis06360812022-07-05 16:28:00 +0200110 (strncmp(container->name, name, sizeof(container->name)) == 0) &&
Julian Hall7048d302021-06-03 16:07:28 +0100111 (container->instance == instance)) {
julhal012c18fbf2021-02-01 08:29:28 +0000112
Julian Hall7048d302021-06-03 16:07:28 +0100113 if (data_buf_size == container->size) {
Julian Hall7048d302021-06-03 16:07:28 +0100114 memcpy(data, config_container_data(container), container->size);
115 success = true;
Imre Kis06360812022-07-05 16:28:00 +0200116 } else {
117 DMSG("Query with different size (%lu != %lu)", data_buf_size,
118 container->size);
julhal012c18fbf2021-02-01 08:29:28 +0000119 }
120
121 break;
122 }
123
124 container = container->next;
125 }
126
Imre Kis06360812022-07-05 16:28:00 +0200127 if (!success)
128 DMSG("Failed to query data with name %s", name);
129
Julian Hall7048d302021-06-03 16:07:28 +0100130 return success;
julhal012c18fbf2021-02-01 08:29:28 +0000131}
132
Julian Hall7048d302021-06-03 16:07:28 +0100133unsigned int config_store_count(enum config_classifier classifier)
julhal0137e1aea2021-02-09 15:22:20 +0000134{
135 unsigned int count = 0;
136
Julian Hall7048d302021-06-03 16:07:28 +0100137 const struct config_container *container = ramstore.object_list;
julhal0137e1aea2021-02-09 15:22:20 +0000138
139 while (container) {
140
Julian Hall7048d302021-06-03 16:07:28 +0100141 if (container->classifier == classifier) ++count;
julhal0137e1aea2021-02-09 15:22:20 +0000142 container = container->next;
143 }
144
145 return count;
146}