nvram.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. #include <common.h>
  10. #include <command.h>
  11. #include <env.h>
  12. #include <env_internal.h>
  13. #include <asm/global_data.h>
  14. #include <linux/stddef.h>
  15. #include <search.h>
  16. #include <errno.h>
  17. #include <u-boot/crc.h>
  18. DECLARE_GLOBAL_DATA_PTR;
  19. static env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
  20. static int env_nvram_load(void)
  21. {
  22. char buf[CONFIG_ENV_SIZE];
  23. memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
  24. return env_import(buf, 1, H_EXTERNAL);
  25. }
  26. static int env_nvram_save(void)
  27. {
  28. env_t env_new;
  29. int rcode = 0;
  30. rcode = env_export(&env_new);
  31. if (rcode)
  32. return rcode;
  33. if (memcpy((char *)CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE) == NULL)
  34. rcode = 1;
  35. return rcode;
  36. }
  37. /*
  38. * Initialize Environment use
  39. *
  40. * We are still running from ROM, so data use is limited
  41. */
  42. static int env_nvram_init(void)
  43. {
  44. if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
  45. gd->env_addr = (ulong)&env_ptr->data;
  46. gd->env_valid = ENV_VALID;
  47. } else {
  48. gd->env_valid = ENV_INVALID;
  49. }
  50. return 0;
  51. }
  52. U_BOOT_ENV_LOCATION(nvram) = {
  53. .location = ENVL_NVRAM,
  54. ENV_NAME("NVRAM")
  55. .load = env_nvram_load,
  56. .save = env_save_ptr(env_nvram_save),
  57. .init = env_nvram_init,
  58. };