Skip to content

Commit 5ac01e9

Browse files
committed
drivers: Added retention register API
Added general purpose API for access retention registers. Signed-off-by: Andrzej Puzdrowski <[email protected]>
1 parent 717b4fe commit 5ac01e9

File tree

6 files changed

+248
-0
lines changed

6 files changed

+248
-0
lines changed

drivers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@ add_subdirectory_ifdef(CONFIG_BOARD_XENVM xen)
7272
add_subdirectory_ifdef(CONFIG_MM_DRV mm)
7373
add_subdirectory_ifdef(CONFIG_RESET reset)
7474
add_subdirectory_ifdef(CONFIG_COREDUMP_DEVICE coredump)
75+
add_subdirectory_ifdef(CONFIG_RETREG retreg)

drivers/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,6 @@ source "drivers/coredump/Kconfig"
147147

148148
source "drivers/xen/Kconfig"
149149

150+
source "drivers/retreg/Kconfig"
151+
150152
endmenu

drivers/retreg/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
zephyr_library()
4+
5+
zephyr_library_sources_ifdef(CONFIG_USERSPACE retreg_handlers.c)

drivers/retreg/Kconfig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
menuconfig RETREG
2+
bool "Retention registers support"
3+
help
4+
Enable support for the hardware retention registers
5+
6+
if RETREG
7+
8+
module = RETREG
9+
module-str = retreg
10+
source "subsys/logging/Kconfig.template.log_config"
11+
12+
endif

drivers/retreg/retreg_handlers.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (c) 2022 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/syscall_handler.h>
8+
#include <zephyr/drivers/retreg.h>
9+
10+
static inline int z_vrfy_retreg_read(const struct device *dev, uint32_t reg_idx,
11+
void *data, size_t len)
12+
{
13+
Z_OOPS(Z_SYSCALL_DRIVER_RETREG(dev, read));
14+
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(data, len));
15+
return z_impl_retreg_read((const struct device *)dev, reg_idx,
16+
(void *)data,
17+
len);
18+
}
19+
#include <syscalls/retreg_read_mrsh.c>
20+
21+
static inline int z_vrfy_retreg_write(const struct device *dev, uint32_t reg_idx,
22+
const void *data, size_t len)
23+
{
24+
Z_OOPS(Z_SYSCALL_DRIVER_RETREG(dev, write));
25+
Z_OOPS(Z_SYSCALL_MEMORY_READ(data, len));
26+
return z_impl_retreg_write((const struct device *)dev, reg_idx,
27+
(const void *)data, len);
28+
}
29+
#include <syscalls/retreg_write_mrsh.c>
30+
31+
static inline const struct retreg_layout *z_vrfy_get_retreg_layout(const struct device *dev)
32+
{
33+
Z_OOPS(Z_SYSCALL_DRIVER_RETREG(dev, get_parameters));
34+
return z_impl_get_reteg_layou(dev);
35+
}
36+
#include <syscalls/retreg_retreg_layout_mrsh.c>
37+
38+
struct retreg_layout *z_impl_get_retreg_layout(const struct device *dev);

include/zephyr/drivers/retreg.h

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
/*
2+
* Copyright (c) 2022 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/**
8+
* @file
9+
*
10+
* @brief Public API for Retention Registers drivers
11+
*/
12+
13+
#ifndef ZEPHYR_INCLUDE_DRIVERS_RETREG_H_
14+
#define ZEPHYR_INCLUDE_DRIVERS_RETREG_H_
15+
16+
#include <zephyr/types.h>
17+
#include <stddef.h>
18+
#include <sys/types.h>
19+
#include <zephyr/device.h>
20+
21+
#ifdef __cplusplus
22+
extern "C" {
23+
#endif
24+
25+
/**
26+
* @brief Retention Registers Interface
27+
* @defgroup retreg_interface Retention Registers Interface
28+
* @ingroup io_interfaces
29+
* @{
30+
*/
31+
32+
struct retreg_layout_group {
33+
size_t reg_count; /* count of reg sequence of the same size */
34+
size_t reg_size; /* the size in bytes */
35+
};
36+
37+
struct retreg_layout {
38+
size_t group_num;
39+
struct retreg_layout_group *groups;
40+
};
41+
/**
42+
* @}
43+
*/
44+
45+
/**
46+
* @brief Retention Registers internal Interface
47+
* @defgroup retreg_internal_interface Retention Registers internal Interface
48+
* @ingroup io_interfaces
49+
* @{
50+
*/
51+
52+
/**
53+
* @brief Retention Register read implementation handler type
54+
*/
55+
typedef int (*retreg_api_read)(const struct device *dev, uint32_t idx,
56+
void *data,
57+
size_t len);
58+
/**
59+
* @brief Retention Register write implementation handler type
60+
*/
61+
typedef int (*retreg_api_write)(const struct device *dev, uint32_t idx,
62+
const void *data, size_t len);
63+
64+
65+
/**
66+
* Retention parameters. Contents of this structure suppose to be
67+
* filled in during the device initialization and stay constant
68+
* through a runtime.
69+
*/
70+
struct retreg_parameters {
71+
struct retreg_layout *retreg_layout;
72+
};
73+
74+
/**
75+
* @brief Retrieve paramiters of the retention registers.
76+
*
77+
* @param dev Retention registers device whose paramiters to retrieve.
78+
* @param params The pointer to the paramiters will be returned in
79+
* this argument.
80+
*/
81+
typedef const struct retreg_parameters *(*retreg_api_get_parameters)(const struct device *dev);
82+
83+
84+
__subsystem struct retreg_driver_api {
85+
retreg_api_read read;
86+
retreg_api_write write;
87+
retreg_api_get_parameters get_parameters;
88+
};
89+
90+
/**
91+
* @}
92+
*/
93+
94+
/**
95+
* @addtogroup retreg_interface
96+
* @{
97+
*/
98+
99+
/**
100+
* @brief Read data from retention register
101+
*
102+
* @param dev : device
103+
* @param reg_idx : index of the retention register
104+
* @param data : Buffer to store read data
105+
* @param len : Number of bytes to read.
106+
*
107+
* @return 0 on success, negative errno code on fail.
108+
*/
109+
__syscall int retreg_read(const struct device *dev, uint32_t reg_idx, void *data,
110+
size_t len);
111+
112+
static inline int z_impl_retreg_read(const struct device *dev, uint32_t reg_idx, void *data,
113+
size_t len)
114+
{
115+
const struct retreg_driver_api *api =
116+
(const struct retreg_driver_api *)dev->api;
117+
118+
return api->read(dev, reg_idx, data, len);
119+
}
120+
121+
/**
122+
* @brief Write data to retention register
123+
*
124+
* @param dev : device
125+
* @param reg_idx : index of the retention register
126+
* @param data : data to write
127+
* @param len : Number of bytes to write.
128+
*
129+
* @return 0 on success, negative errno code on fail.
130+
*/
131+
__syscall int retreg_write(const struct device *dev, uint32_t reg_idx, const void *data,
132+
size_t len);
133+
134+
static inline int z_impl_retreg_write(const struct device *dev, uint32_t reg_idx, const void *data,
135+
size_t len)
136+
{
137+
const struct retreg_driver_api *api =
138+
(const struct retreg_driver_api *)dev->api;
139+
140+
return api->write(dev, reg_idx, data, len);
141+
}
142+
143+
144+
/**
145+
* @brief Retrieve a retention registers layout.
146+
*
147+
* A retention registers device layout is a run-length encoded description of the
148+
* susbsequent registers size on the device.
149+
*
150+
* For retention devices which have uniform register sizes, this routine
151+
* returns an array of length 1, which specifies the page size and
152+
* number of pages in the memory.
153+
*
154+
* Layouts for retention devices with nonuniform registers sizes will be
155+
* returned as an array with multiple elements, each of which
156+
* describes a group of registers that all have the same size. In this
157+
* case, the sequence of array elements specifies the order in which
158+
* these groups occur on the device.
159+
*
160+
* @param dev retention registers device whose layout to retrieve.
161+
*
162+
* @retval Pointer to the layout data. It might be NULL if layout is not
163+
* supported by the driver.
164+
*/
165+
__syscall struct retreg_layout *reteg_get_layout(const struct device *dev,
166+
const struct retreg_layout **layout,
167+
size_t *layout_size);
168+
169+
static inline const struct retreg_layout *z_impl_get_retreg_layout(const struct device *dev)
170+
{
171+
const struct retreg_driver_api *api =
172+
(const struct retreg_driver_api *)dev->api;
173+
174+
const struct retreg_parameters *params;
175+
176+
params = api->get_parameters(dev);
177+
return params->retreg_layout;
178+
}
179+
180+
/**
181+
* @}
182+
*/
183+
184+
#ifdef __cplusplus
185+
}
186+
#endif
187+
188+
#include <syscalls/retreg.h>
189+
190+
#endif /* ZEPHYR_INCLUDE_DRIVERS_RETREG_H_ */

0 commit comments

Comments
 (0)