1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * (C) Copyright 2000-2010 4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 5 * 6 * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> 7 * Andreas Heppel <aheppel@sysgo.de> 8 */ 9 10#include <common.h> 11#include <command.h> 12#include <env.h> 13#include <env_internal.h> 14#include <asm/global_data.h> 15#include <linux/stddef.h> 16#include <search.h> 17#include <errno.h> 18#include <u-boot/crc.h> 19 20DECLARE_GLOBAL_DATA_PTR; 21 22static env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR; 23 24static int env_nvram_load(void) 25{ 26 char buf[CONFIG_ENV_SIZE]; 27 28 memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE); 29 30 return env_import(buf, 1, H_EXTERNAL); 31} 32 33static int env_nvram_save(void) 34{ 35 env_t env_new; 36 int rcode = 0; 37 38 rcode = env_export(&env_new); 39 if (rcode) 40 return rcode; 41 42 if (memcpy((char *)CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE) == NULL) 43 rcode = 1; 44 45 return rcode; 46} 47 48/* 49 * Initialize Environment use 50 * 51 * We are still running from ROM, so data use is limited 52 */ 53static int env_nvram_init(void) 54{ 55 if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { 56 gd->env_addr = (ulong)&env_ptr->data; 57 gd->env_valid = ENV_VALID; 58 } else { 59 gd->env_valid = ENV_INVALID; 60 } 61 62 return 0; 63} 64 65U_BOOT_ENV_LOCATION(nvram) = { 66 .location = ENVL_NVRAM, 67 ENV_NAME("NVRAM") 68 .load = env_nvram_load, 69 .save = env_save_ptr(env_nvram_save), 70 .init = env_nvram_init, 71}; 72