env.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * Copyright (C) 2017 Google, Inc
  3. * Written by Simon Glass <sjg@chromium.org>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <environment.h>
  9. DECLARE_GLOBAL_DATA_PTR;
  10. static struct env_driver *env_driver_lookup(enum env_location loc)
  11. {
  12. struct env_driver *drv;
  13. const int n_ents = ll_entry_count(struct env_driver, env_driver);
  14. struct env_driver *entry;
  15. drv = ll_entry_start(struct env_driver, env_driver);
  16. for (entry = drv; entry != drv + n_ents; entry++) {
  17. if (loc == entry->location)
  18. return entry;
  19. }
  20. /* Not found */
  21. return NULL;
  22. }
  23. static enum env_location env_get_default_location(void)
  24. {
  25. if IS_ENABLED(CONFIG_ENV_IS_IN_DATAFLASH)
  26. return ENVL_DATAFLASH;
  27. else if IS_ENABLED(CONFIG_ENV_IS_IN_EEPROM)
  28. return ENVL_EEPROM;
  29. else if IS_ENABLED(CONFIG_ENV_IS_IN_FAT)
  30. return ENVL_FAT;
  31. else if IS_ENABLED(CONFIG_ENV_IS_IN_FLASH)
  32. return ENVL_FLASH;
  33. else if IS_ENABLED(CONFIG_ENV_IS_IN_MMC)
  34. return ENVL_MMC;
  35. else if IS_ENABLED(CONFIG_ENV_IS_IN_NAND)
  36. return ENVL_NAND;
  37. else if IS_ENABLED(CONFIG_ENV_IS_IN_NVRAM)
  38. return ENVL_NVRAM;
  39. else if IS_ENABLED(CONFIG_ENV_IS_IN_REMOTE)
  40. return ENVL_REMOTE;
  41. else if IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH)
  42. return ENVL_SPI_FLASH;
  43. else if IS_ENABLED(CONFIG_ENV_IS_IN_UBI)
  44. return ENVL_UBI;
  45. else if IS_ENABLED(CONFIG_ENV_IS_NOWHERE)
  46. return ENVL_NOWHERE;
  47. else
  48. return ENVL_UNKNOWN;
  49. }
  50. struct env_driver *env_driver_lookup_default(void)
  51. {
  52. enum env_location loc = env_get_default_location();
  53. struct env_driver *drv;
  54. drv = env_driver_lookup(loc);
  55. if (!drv) {
  56. debug("%s: No environment driver for location %d\n", __func__,
  57. loc);
  58. return NULL;
  59. }
  60. return drv;
  61. }
  62. int env_get_char(int index)
  63. {
  64. struct env_driver *drv = env_driver_lookup_default();
  65. int ret;
  66. if (!gd->env_valid)
  67. return default_environment[index];
  68. if (!drv)
  69. return -ENODEV;
  70. if (!drv->get_char)
  71. return *(uchar *)(gd->env_addr + index);
  72. ret = drv->get_char(index);
  73. if (ret < 0) {
  74. debug("%s: Environment failed to load (err=%d)\n",
  75. __func__, ret);
  76. }
  77. return ret;
  78. }
  79. int env_load(void)
  80. {
  81. struct env_driver *drv = env_driver_lookup_default();
  82. int ret = 0;
  83. if (!drv)
  84. return -ENODEV;
  85. if (!drv->load)
  86. return 0;
  87. ret = drv->load();
  88. if (ret) {
  89. debug("%s: Environment failed to load (err=%d)\n", __func__,
  90. ret);
  91. return ret;
  92. }
  93. return 0;
  94. }
  95. int env_save(void)
  96. {
  97. struct env_driver *drv = env_driver_lookup_default();
  98. int ret;
  99. if (!drv)
  100. return -ENODEV;
  101. if (!drv->save)
  102. return -ENOSYS;
  103. ret = drv->save();
  104. if (ret) {
  105. debug("%s: Environment failed to save (err=%d)\n", __func__,
  106. ret);
  107. return ret;
  108. }
  109. return 0;
  110. }
  111. int env_init(void)
  112. {
  113. struct env_driver *drv = env_driver_lookup_default();
  114. int ret = -ENOENT;
  115. if (!drv)
  116. return -ENODEV;
  117. if (drv->init)
  118. ret = drv->init();
  119. if (ret == -ENOENT) {
  120. gd->env_addr = (ulong)&default_environment[0];
  121. gd->env_valid = ENV_VALID;
  122. return 0;
  123. } else if (ret) {
  124. debug("%s: Environment failed to init (err=%d)\n", __func__,
  125. ret);
  126. return ret;
  127. }
  128. return 0;
  129. }