1 /*
2  * SPDX-License-Identifier: BSD-3-Clause
3  * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4  */
5 
6 #include <debug.h>
7 #include <errno.h>
8 #include <host_defs.h>
9 #include <host_utils.h>
10 #include <plat_common.h>
11 #include <string.h>
12 #include <xlat_tables.h>
13 
14 static struct sysreg_cb callbacks[SYSREG_MAX_CBS];
15 static unsigned int installed_cb_idx;
16 
17 /*
18  * Allocate memory to emulate physical memory to initialize the
19  * granule library.
20  */
21 static unsigned char granules_buffer[HOST_MEM_SIZE] __aligned(GRANULE_SIZE);
22 
23 /*
24  * Generic callback to access a sysreg for reading.
25  */
sysreg_rd_cb(u_register_t * reg)26 static u_register_t sysreg_rd_cb(u_register_t *reg)
27 {
28 	return *reg;
29 }
30 
31 /*
32  * Generic callback to access a sysreg for writing.
33  */
sysreg_wr_cb(u_register_t val,u_register_t * reg)34 static void sysreg_wr_cb(u_register_t val, u_register_t *reg)
35 {
36 	*reg = val;
37 }
38 
host_util_get_sysreg_cb(char * name)39 struct sysreg_cb *host_util_get_sysreg_cb(char *name)
40 {
41 	for (unsigned int i = 0U; i < SYSREG_MAX_CBS; i++) {
42 		if (strncmp(name, &callbacks[i].sysreg[0],
43 			    MAX_SYSREG_NAME_LEN) == 0) {
44 			return &callbacks[i];
45 		}
46 	}
47 
48 	return (struct sysreg_cb *)NULL;
49 }
50 
host_util_set_sysreg_cb(char * name,rd_cb_t rd_cb,wr_cb_t wr_cb,u_register_t init)51 int host_util_set_sysreg_cb(char *name, rd_cb_t rd_cb, wr_cb_t wr_cb,
52 			    u_register_t init)
53 {
54 	if (installed_cb_idx < SYSREG_MAX_CBS) {
55 		callbacks[installed_cb_idx].rd_cb = rd_cb;
56 		callbacks[installed_cb_idx].wr_cb = wr_cb;
57 		callbacks[installed_cb_idx].value = init;
58 
59 		(void)strncpy(&(callbacks[installed_cb_idx].sysreg[0]),
60 			      &name[0], MAX_SYSREG_NAME_LEN);
61 
62 		/*
63 		 * Add a string termination character in case the
64 		 * name were truncated.
65 		 */
66 		callbacks[installed_cb_idx].sysreg[MAX_SYSREG_NAME_LEN] = '\0';
67 
68 		++installed_cb_idx;
69 
70 		return 0;
71 	}
72 
73 	return -ENOMEM;
74 }
75 
host_util_reset_all_sysreg_cb(void)76 void host_util_reset_all_sysreg_cb(void)
77 {
78 
79 	(void)memset((void *)callbacks, 0,
80 		     sizeof(struct sysreg_cb) * SYSREG_MAX_CBS);
81 
82 	installed_cb_idx = 0U;
83 }
84 
host_util_set_default_sysreg_cb(char * name,u_register_t init)85 int host_util_set_default_sysreg_cb(char *name, u_register_t init)
86 {
87 	return host_util_set_sysreg_cb(name, &sysreg_rd_cb,
88 				     &sysreg_wr_cb, init);
89 }
90 
host_util_get_granule_base(void)91 unsigned long host_util_get_granule_base(void)
92 {
93 	return (unsigned long)granules_buffer;
94 }
95