1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 26aff3115Swdenk /* 3bc11756dSGrant Erickson * (C) Copyright 2002-2008 46aff3115Swdenk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 56aff3115Swdenk */ 66aff3115Swdenk 7371ee137SAndreas Fenkart #include <stdint.h> 8e3c52f2bSTom Rini 900c234f3SStefano Babic /* 1000c234f3SStefano Babic * Programs using the library must check which API is available, 1100c234f3SStefano Babic * that varies depending on the U-Boot version. 1200c234f3SStefano Babic * This can be changed in future 1300c234f3SStefano Babic */ 1400c234f3SStefano Babic #define FW_ENV_API_VERSION 1 1500c234f3SStefano Babic 1681974f44SAndreas Fenkart struct env_opts { 17371ee137SAndreas Fenkart #ifdef CONFIG_FILE 18371ee137SAndreas Fenkart char *config_file; 19371ee137SAndreas Fenkart #endif 20d40dbfb7SB, Ravi char *lockname; 21371ee137SAndreas Fenkart }; 2207ce9440SAndreas Fenkart 23fd4e3280SAndreas Fenkart /** 24fd4e3280SAndreas Fenkart * fw_printenv() - print one or several environment variables 25fd4e3280SAndreas Fenkart * 26fd4e3280SAndreas Fenkart * @argc: number of variables names to be printed, prints all if 0 27fd4e3280SAndreas Fenkart * @argv: array of variable names to be printed, if argc != 0 28fd4e3280SAndreas Fenkart * @value_only: do not repeat the variable name, print the bare value, 29fd4e3280SAndreas Fenkart * only one variable allowed with this option, argc must be 1 30fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 31fd4e3280SAndreas Fenkart * 32fd4e3280SAndreas Fenkart * Description: 33fd4e3280SAndreas Fenkart * Uses fw_env_open, fw_getenv 34fd4e3280SAndreas Fenkart * 35fd4e3280SAndreas Fenkart * Return: 36fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 37fd4e3280SAndreas Fenkart */ 3881974f44SAndreas Fenkart int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts); 39fd4e3280SAndreas Fenkart 40fd4e3280SAndreas Fenkart /** 41382bee57SSimon Glass * fw_env_set() - adds or removes one variable to the environment 42fd4e3280SAndreas Fenkart * 43fd4e3280SAndreas Fenkart * @argc: number of strings in argv, argv[0] is variable name, 44fd4e3280SAndreas Fenkart * argc==1 means erase variable, argc > 1 means add a variable 45fd4e3280SAndreas Fenkart * @argv: argv[0] is variable name, argv[1..argc-1] are concatenated separated 46fd4e3280SAndreas Fenkart * by single blank and set as the new value of the variable 47fd4e3280SAndreas Fenkart * @opts: how to retrieve environment from flash, defaults are used if NULL 48fd4e3280SAndreas Fenkart * 49fd4e3280SAndreas Fenkart * Description: 5033f0086cSStefano Babic * Uses fw_env_open, fw_env_write, fw_env_flush 51fd4e3280SAndreas Fenkart * 52fd4e3280SAndreas Fenkart * Return: 53fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 54fd4e3280SAndreas Fenkart * 55fd4e3280SAndreas Fenkart * ERRORS: 56fd4e3280SAndreas Fenkart * EROFS - some variables ("ethaddr", "serial#") cannot be modified 57fd4e3280SAndreas Fenkart */ 58382bee57SSimon Glass int fw_env_set(int argc, char *argv[], struct env_opts *opts); 59fd4e3280SAndreas Fenkart 60fd4e3280SAndreas Fenkart /** 61fd4e3280SAndreas Fenkart * fw_parse_script() - adds or removes multiple variables with a batch script 62fd4e3280SAndreas Fenkart * 63fd4e3280SAndreas Fenkart * @fname: batch script file name 64fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 65fd4e3280SAndreas Fenkart * 66fd4e3280SAndreas Fenkart * Description: 6733f0086cSStefano Babic * Uses fw_env_open, fw_env_write, fw_env_flush 68fd4e3280SAndreas Fenkart * 69fd4e3280SAndreas Fenkart * Return: 70fd4e3280SAndreas Fenkart * 0 success, -1 on failure (modifies errno) 71fd4e3280SAndreas Fenkart * 72fd4e3280SAndreas Fenkart * Script Syntax: 73fd4e3280SAndreas Fenkart * 74fd4e3280SAndreas Fenkart * key [ [space]+ value] 75fd4e3280SAndreas Fenkart * 76fd4e3280SAndreas Fenkart * lines starting with '#' treated as comment 77fd4e3280SAndreas Fenkart * 78fd4e3280SAndreas Fenkart * A variable without value will be deleted. Any number of spaces are allowed 79fd4e3280SAndreas Fenkart * between key and value. The value starts with the first non-space character 80fd4e3280SAndreas Fenkart * and ends with newline. No comments allowed on these lines. Spaces inside 81fd4e3280SAndreas Fenkart * the value are preserved verbatim. 82fd4e3280SAndreas Fenkart * 83fd4e3280SAndreas Fenkart * Script Example: 84fd4e3280SAndreas Fenkart * 85fd4e3280SAndreas Fenkart * netdev eth0 86fd4e3280SAndreas Fenkart * 87fd4e3280SAndreas Fenkart * kernel_addr 400000 88fd4e3280SAndreas Fenkart * 89fd4e3280SAndreas Fenkart * foo spaces are copied verbatim 90fd4e3280SAndreas Fenkart * 91fd4e3280SAndreas Fenkart * # delete variable bar 92fd4e3280SAndreas Fenkart * 93fd4e3280SAndreas Fenkart * bar 94fd4e3280SAndreas Fenkart */ 9581974f44SAndreas Fenkart int fw_parse_script(char *fname, struct env_opts *opts); 96fd4e3280SAndreas Fenkart 97fd4e3280SAndreas Fenkart 98fd4e3280SAndreas Fenkart /** 99fd4e3280SAndreas Fenkart * fw_env_open() - read enviroment from flash into RAM cache 100fd4e3280SAndreas Fenkart * 101fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 102fd4e3280SAndreas Fenkart * 103fd4e3280SAndreas Fenkart * Return: 104fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 105fd4e3280SAndreas Fenkart */ 10681974f44SAndreas Fenkart int fw_env_open(struct env_opts *opts); 107fd4e3280SAndreas Fenkart 108fd4e3280SAndreas Fenkart /** 109fd4e3280SAndreas Fenkart * fw_getenv() - lookup variable in the RAM cache 110fd4e3280SAndreas Fenkart * 111fd4e3280SAndreas Fenkart * @name: variable to be searched 112fd4e3280SAndreas Fenkart * Return: 113fd4e3280SAndreas Fenkart * pointer to start of value, NULL if not found 114fd4e3280SAndreas Fenkart */ 115fd4e3280SAndreas Fenkart char *fw_getenv(char *name); 116fd4e3280SAndreas Fenkart 117fd4e3280SAndreas Fenkart /** 118fd4e3280SAndreas Fenkart * fw_env_write() - modify a variable held in the RAM cache 119fd4e3280SAndreas Fenkart * 120fd4e3280SAndreas Fenkart * @name: variable 121fd4e3280SAndreas Fenkart * @value: delete variable if NULL, otherwise create or overwrite the variable 122fd4e3280SAndreas Fenkart * 123fd4e3280SAndreas Fenkart * This is called in sequence to update the environment in RAM without updating 124fd4e3280SAndreas Fenkart * the copy in flash after each set 125fd4e3280SAndreas Fenkart * 126fd4e3280SAndreas Fenkart * Return: 127fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 128fd4e3280SAndreas Fenkart * 129fd4e3280SAndreas Fenkart * ERRORS: 130fd4e3280SAndreas Fenkart * EROFS - some variables ("ethaddr", "serial#") cannot be modified 131fd4e3280SAndreas Fenkart */ 132c3a23e8bSAndreas Fenkart int fw_env_write(char *name, char *value); 133fd4e3280SAndreas Fenkart 134fd4e3280SAndreas Fenkart /** 13533f0086cSStefano Babic * fw_env_flush - write the environment from RAM cache back to flash 13633f0086cSStefano Babic * 13733f0086cSStefano Babic * @opts: encryption key, configuration file, defaults are used if NULL 13833f0086cSStefano Babic * 13933f0086cSStefano Babic * Return: 14033f0086cSStefano Babic * 0 on success, -1 on failure (modifies errno) 14133f0086cSStefano Babic */ 14233f0086cSStefano Babic int fw_env_flush(struct env_opts *opts); 14333f0086cSStefano Babic 14433f0086cSStefano Babic /** 14533f0086cSStefano Babic * fw_env_close - free allocated structure and close env 146fd4e3280SAndreas Fenkart * 147fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 148fd4e3280SAndreas Fenkart * 149fd4e3280SAndreas Fenkart * Return: 150fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 151fd4e3280SAndreas Fenkart */ 15281974f44SAndreas Fenkart int fw_env_close(struct env_opts *opts); 1536aff3115Swdenk 15433f0086cSStefano Babic 15500c234f3SStefano Babic /** 15600c234f3SStefano Babic * fw_env_version - return the current version of the library 15700c234f3SStefano Babic * 15800c234f3SStefano Babic * Return: 15900c234f3SStefano Babic * version string of the library 16000c234f3SStefano Babic */ 16100c234f3SStefano Babic char *fw_env_version(void); 16200c234f3SStefano Babic 163c3a23e8bSAndreas Fenkart unsigned long crc32(unsigned long, const unsigned char *, unsigned); 164