xref: /openbmc/u-boot/include/env_flags.h (revision 87f78478)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
22598090bSJoe Hershberger /*
32598090bSJoe Hershberger  * (C) Copyright 2012
42598090bSJoe Hershberger  * Joe Hershberger, National Instruments, joe.hershberger@ni.com
52598090bSJoe Hershberger  */
62598090bSJoe Hershberger 
72598090bSJoe Hershberger #ifndef __ENV_FLAGS_H__
82598090bSJoe Hershberger #define __ENV_FLAGS_H__
92598090bSJoe Hershberger 
102598090bSJoe Hershberger enum env_flags_vartype {
112598090bSJoe Hershberger 	env_flags_vartype_string,
122598090bSJoe Hershberger 	env_flags_vartype_decimal,
132598090bSJoe Hershberger 	env_flags_vartype_hex,
142598090bSJoe Hershberger 	env_flags_vartype_bool,
152598090bSJoe Hershberger #ifdef CONFIG_CMD_NET
162598090bSJoe Hershberger 	env_flags_vartype_ipaddr,
172598090bSJoe Hershberger 	env_flags_vartype_macaddr,
182598090bSJoe Hershberger #endif
192598090bSJoe Hershberger 	env_flags_vartype_end
202598090bSJoe Hershberger };
212598090bSJoe Hershberger 
22267541f7SJoe Hershberger enum env_flags_varaccess {
23267541f7SJoe Hershberger 	env_flags_varaccess_any,
24267541f7SJoe Hershberger 	env_flags_varaccess_readonly,
25267541f7SJoe Hershberger 	env_flags_varaccess_writeonce,
26267541f7SJoe Hershberger 	env_flags_varaccess_changedefault,
27267541f7SJoe Hershberger 	env_flags_varaccess_end
28267541f7SJoe Hershberger };
29267541f7SJoe Hershberger 
302598090bSJoe Hershberger #define ENV_FLAGS_VAR ".flags"
312598090bSJoe Hershberger #define ENV_FLAGS_ATTR_MAX_LEN 2
322598090bSJoe Hershberger #define ENV_FLAGS_VARTYPE_LOC 0
33267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_LOC 1
342598090bSJoe Hershberger 
352598090bSJoe Hershberger #ifndef CONFIG_ENV_FLAGS_LIST_STATIC
362598090bSJoe Hershberger #define CONFIG_ENV_FLAGS_LIST_STATIC ""
372598090bSJoe Hershberger #endif
382598090bSJoe Hershberger 
391d6cd0a3SJoe Hershberger #ifdef CONFIG_CMD_NET
4073c2bbeeSJoe Hershberger #ifdef CONFIG_REGEX
41*be09f5bcSSimon Goldschmidt #define ETHADDR_WILDCARD "\\d*"
4273c2bbeeSJoe Hershberger #else
4373c2bbeeSJoe Hershberger #define ETHADDR_WILDCARD
4473c2bbeeSJoe Hershberger #endif
451d6cd0a3SJoe Hershberger #ifdef CONFIG_ENV_OVERWRITE
4673c2bbeeSJoe Hershberger #define ETHADDR_FLAGS "eth" ETHADDR_WILDCARD "addr:ma,"
471d6cd0a3SJoe Hershberger #else
481d6cd0a3SJoe Hershberger #ifdef CONFIG_OVERWRITE_ETHADDR_ONCE
4973c2bbeeSJoe Hershberger #define ETHADDR_FLAGS "eth" ETHADDR_WILDCARD "addr:mc,"
501d6cd0a3SJoe Hershberger #else
5173c2bbeeSJoe Hershberger #define ETHADDR_FLAGS "eth" ETHADDR_WILDCARD "addr:mo,"
521d6cd0a3SJoe Hershberger #endif
531d6cd0a3SJoe Hershberger #endif
54c0a93440SJoe Hershberger #define NET_FLAGS \
55c0a93440SJoe Hershberger 	"ipaddr:i," \
56c0a93440SJoe Hershberger 	"gatewayip:i," \
57c0a93440SJoe Hershberger 	"netmask:i," \
58c0a93440SJoe Hershberger 	"serverip:i," \
590299cee5SStefan Agner 	"nvlan:d," \
600299cee5SStefan Agner 	"vlan:d," \
61c0a93440SJoe Hershberger 	"dnsip:i,"
621d6cd0a3SJoe Hershberger #else
63c0a93440SJoe Hershberger #define ETHADDR_FLAGS
64c0a93440SJoe Hershberger #define NET_FLAGS
651d6cd0a3SJoe Hershberger #endif
661d6cd0a3SJoe Hershberger 
671d6cd0a3SJoe Hershberger #ifndef CONFIG_ENV_OVERWRITE
681d6cd0a3SJoe Hershberger #define SERIAL_FLAGS "serial#:so,"
691d6cd0a3SJoe Hershberger #else
701d6cd0a3SJoe Hershberger #define SERIAL_FLAGS ""
711d6cd0a3SJoe Hershberger #endif
721d6cd0a3SJoe Hershberger 
732598090bSJoe Hershberger #define ENV_FLAGS_LIST_STATIC \
741d6cd0a3SJoe Hershberger 	ETHADDR_FLAGS \
75c0a93440SJoe Hershberger 	NET_FLAGS \
761d6cd0a3SJoe Hershberger 	SERIAL_FLAGS \
772598090bSJoe Hershberger 	CONFIG_ENV_FLAGS_LIST_STATIC
782598090bSJoe Hershberger 
79fffad71bSJoe Hershberger #ifdef CONFIG_CMD_ENV_FLAGS
80fffad71bSJoe Hershberger /*
81fffad71bSJoe Hershberger  * Print the whole list of available type flags.
82fffad71bSJoe Hershberger  */
83fffad71bSJoe Hershberger void env_flags_print_vartypes(void);
84fffad71bSJoe Hershberger /*
85267541f7SJoe Hershberger  * Print the whole list of available access flags.
86267541f7SJoe Hershberger  */
87267541f7SJoe Hershberger void env_flags_print_varaccess(void);
88267541f7SJoe Hershberger /*
89fffad71bSJoe Hershberger  * Return the name of the type.
90fffad71bSJoe Hershberger  */
91fffad71bSJoe Hershberger const char *env_flags_get_vartype_name(enum env_flags_vartype type);
92267541f7SJoe Hershberger /*
93267541f7SJoe Hershberger  * Return the name of the access.
94267541f7SJoe Hershberger  */
95267541f7SJoe Hershberger const char *env_flags_get_varaccess_name(enum env_flags_varaccess access);
96fffad71bSJoe Hershberger #endif
97fffad71bSJoe Hershberger 
982598090bSJoe Hershberger /*
992598090bSJoe Hershberger  * Parse the flags string from a .flags attribute list into the vartype enum.
1002598090bSJoe Hershberger  */
1012598090bSJoe Hershberger enum env_flags_vartype env_flags_parse_vartype(const char *flags);
102267541f7SJoe Hershberger /*
103267541f7SJoe Hershberger  * Parse the flags string from a .flags attribute list into the varaccess enum.
104267541f7SJoe Hershberger  */
105267541f7SJoe Hershberger enum env_flags_varaccess env_flags_parse_varaccess(const char *flags);
106267541f7SJoe Hershberger /*
107267541f7SJoe Hershberger  * Parse the binary flags from a hash table entry into the varaccess enum.
108267541f7SJoe Hershberger  */
109267541f7SJoe Hershberger enum env_flags_varaccess env_flags_parse_varaccess_from_binflags(int binflags);
1102598090bSJoe Hershberger 
1110118e83bSCodrin Ciubotariu #ifdef CONFIG_CMD_NET
1120118e83bSCodrin Ciubotariu /*
1130118e83bSCodrin Ciubotariu  * Check if a string has the format of an Ethernet MAC address
1140118e83bSCodrin Ciubotariu  */
1150118e83bSCodrin Ciubotariu int eth_validate_ethaddr_str(const char *addr);
1160118e83bSCodrin Ciubotariu #endif
1170118e83bSCodrin Ciubotariu 
11830fd4fadSJoe Hershberger #ifdef USE_HOSTCC
11930fd4fadSJoe Hershberger /*
12030fd4fadSJoe Hershberger  * Look up the type of a variable directly from the .flags var.
12130fd4fadSJoe Hershberger  */
12230fd4fadSJoe Hershberger enum env_flags_vartype env_flags_get_type(const char *name);
12330fd4fadSJoe Hershberger /*
124267541f7SJoe Hershberger  * Look up the access of a variable directly from the .flags var.
125267541f7SJoe Hershberger  */
126267541f7SJoe Hershberger enum env_flags_varaccess env_flags_get_access(const char *name);
127267541f7SJoe Hershberger /*
12830fd4fadSJoe Hershberger  * Validate the newval for its type to conform with the requirements defined by
12930fd4fadSJoe Hershberger  * its flags (directly looked at the .flags var).
13030fd4fadSJoe Hershberger  */
13130fd4fadSJoe Hershberger int env_flags_validate_type(const char *name, const char *newval);
13230fd4fadSJoe Hershberger /*
133267541f7SJoe Hershberger  * Validate the newval for its access to conform with the requirements defined
134267541f7SJoe Hershberger  * by its flags (directly looked at the .flags var).
135267541f7SJoe Hershberger  */
136267541f7SJoe Hershberger int env_flags_validate_access(const char *name, int check_mask);
137267541f7SJoe Hershberger /*
138267541f7SJoe Hershberger  * Validate that the proposed access to variable "name" is valid according to
139267541f7SJoe Hershberger  * the defined flags for that variable, if any.
140267541f7SJoe Hershberger  */
141267541f7SJoe Hershberger int env_flags_validate_varaccess(const char *name, int check_mask);
142267541f7SJoe Hershberger /*
14330fd4fadSJoe Hershberger  * Validate the parameters passed to "env set" for type compliance
14430fd4fadSJoe Hershberger  */
145167f5258SAndreas Fenkart int env_flags_validate_env_set_params(char *name, char *const val[], int count);
14630fd4fadSJoe Hershberger 
14730fd4fadSJoe Hershberger #else /* !USE_HOSTCC */
14830fd4fadSJoe Hershberger 
1492598090bSJoe Hershberger #include <search.h>
1502598090bSJoe Hershberger 
1512598090bSJoe Hershberger /*
1522598090bSJoe Hershberger  * When adding a variable to the environment, initialize the flags for that
1532598090bSJoe Hershberger  * variable.
1542598090bSJoe Hershberger  */
1552598090bSJoe Hershberger void env_flags_init(ENTRY *var_entry);
1562598090bSJoe Hershberger 
1572598090bSJoe Hershberger /*
1582598090bSJoe Hershberger  * Validate the newval for to conform with the requirements defined by its flags
1592598090bSJoe Hershberger  */
1602598090bSJoe Hershberger int env_flags_validate(const ENTRY *item, const char *newval, enum env_op op,
1612598090bSJoe Hershberger 	int flag);
1622598090bSJoe Hershberger 
163267541f7SJoe Hershberger #endif /* USE_HOSTCC */
164267541f7SJoe Hershberger 
1652598090bSJoe Hershberger /*
1662598090bSJoe Hershberger  * These are the binary flags used in the environment entry->flags variable to
1672598090bSJoe Hershberger  * decribe properties of veriables in the table
1682598090bSJoe Hershberger  */
1692598090bSJoe Hershberger #define ENV_FLAGS_VARTYPE_BIN_MASK			0x00000007
1702598090bSJoe Hershberger /* The actual variable type values use the enum value (within the mask) */
171267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_DELETE		0x00000008
172267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_CREATE		0x00000010
173267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_OVERWR		0x00000020
174267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_NONDEF_OVERWR	0x00000040
175267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_BIN_MASK			0x00000078
17630fd4fadSJoe Hershberger 
1772598090bSJoe Hershberger #endif /* __ENV_FLAGS_H__ */
178