env.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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_EEPROM)
  26. return ENVL_EEPROM;
  27. else if IS_ENABLED(CONFIG_ENV_IS_IN_FAT)
  28. return ENVL_FAT;
  29. else if IS_ENABLED(CONFIG_ENV_IS_IN_FLASH)
  30. return ENVL_FLASH;
  31. else if IS_ENABLED(CONFIG_ENV_IS_IN_MMC)
  32. return ENVL_MMC;
  33. else if IS_ENABLED(CONFIG_ENV_IS_IN_NAND)
  34. return ENVL_NAND;
  35. else if IS_ENABLED(CONFIG_ENV_IS_IN_NVRAM)
  36. return ENVL_NVRAM;
  37. else if IS_ENABLED(CONFIG_ENV_IS_IN_REMOTE)
  38. return ENVL_REMOTE;
  39. else if IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH)
  40. return ENVL_SPI_FLASH;
  41. else if IS_ENABLED(CONFIG_ENV_IS_IN_UBI)
  42. return ENVL_UBI;
  43. else if IS_ENABLED(CONFIG_ENV_IS_NOWHERE)
  44. return ENVL_NOWHERE;
  45. else
  46. return ENVL_UNKNOWN;
  47. }
  48. struct env_driver *env_driver_lookup_default(void)
  49. {
  50. enum env_location loc = env_get_default_location();
  51. struct env_driver *drv;
  52. drv = env_driver_lookup(loc);
  53. if (!drv) {
  54. debug("%s: No environment driver for location %d\n", __func__,
  55. loc);
  56. return NULL;
  57. }
  58. return drv;
  59. }
  60. int env_get_char(int index)
  61. {
  62. struct env_driver *drv = env_driver_lookup_default();
  63. int ret;
  64. if (gd->env_valid == ENV_INVALID)
  65. return default_environment[index];
  66. if (!drv)
  67. return -ENODEV;
  68. if (!drv->get_char)
  69. return *(uchar *)(gd->env_addr + index);
  70. ret = drv->get_char(index);
  71. if (ret < 0) {
  72. debug("%s: Environment failed to load (err=%d)\n",
  73. __func__, ret);
  74. }
  75. return ret;
  76. }
  77. int env_load(void)
  78. {
  79. struct env_driver *drv = env_driver_lookup_default();
  80. int ret = 0;
  81. if (!drv)
  82. return -ENODEV;
  83. if (!drv->load)
  84. return 0;
  85. ret = drv->load();
  86. if (ret) {
  87. debug("%s: Environment failed to load (err=%d)\n", __func__,
  88. ret);
  89. return ret;
  90. }
  91. return 0;
  92. }
  93. int env_save(void)
  94. {
  95. struct env_driver *drv = env_driver_lookup_default();
  96. int ret;
  97. if (!drv)
  98. return -ENODEV;
  99. if (!drv->save)
  100. return -ENOSYS;
  101. ret = drv->save();
  102. if (ret) {
  103. debug("%s: Environment failed to save (err=%d)\n", __func__,
  104. ret);
  105. return ret;
  106. }
  107. return 0;
  108. }
  109. int env_init(void)
  110. {
  111. struct env_driver *drv = env_driver_lookup_default();
  112. int ret = -ENOENT;
  113. if (!drv)
  114. return -ENODEV;
  115. if (drv->init)
  116. ret = drv->init();
  117. if (ret == -ENOENT) {
  118. gd->env_addr = (ulong)&default_environment[0];
  119. gd->env_valid = ENV_VALID;
  120. return 0;
  121. } else if (ret) {
  122. debug("%s: Environment failed to init (err=%d)\n", __func__,
  123. ret);
  124. return ret;
  125. }
  126. return 0;
  127. }