mt_efuse.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <stdlib.h>
  2. #include <debug.h>
  3. #include <video.h>
  4. #define EFUSE_PART_NAME "efuse"
  5. #define CHK_SIZE 20
  6. #define CHK_THRESHOLD 19
  7. #define EFUSE_NONE 0x00
  8. #define EFUSE_FINE 0xAA
  9. #define EFUSE_BROKEN 0x5A
  10. #define EFUSE_REBLOW 0x55
  11. extern int mboot_recovery_load_raw_part(char *part_name, unsigned long *addr, unsigned int size);
  12. static int mboot_efuse_load_misc(unsigned char *misc_addr, unsigned int size)
  13. {
  14. int ret;
  15. dprintf(SPEW, "[%s]: size is %u\n", __func__, size);
  16. dprintf(SPEW, "[%s]: misc_addr is 0x%p\n", __func__, misc_addr);
  17. ret = mboot_recovery_load_raw_part(EFUSE_PART_NAME, (unsigned long *) misc_addr, size);
  18. return ret;
  19. }
  20. #ifdef MTK_EFUSE_WRITER_SUPPORT
  21. unsigned int mt_efuse_get(void)
  22. {
  23. unsigned char *data;
  24. unsigned char efuse = EFUSE_NONE;
  25. char *str = "";
  26. int ret, i, cnt;
  27. data = malloc(CHK_SIZE);
  28. if (!data) {
  29. dprintf(CRITICAL, "%s: malloc failed\n", __func__);
  30. goto fail;
  31. }
  32. ret = mboot_efuse_load_misc(data, CHK_SIZE);
  33. if (ret < 0) {
  34. dprintf(CRITICAL, "%s: read partition failed\n", __func__);
  35. goto fail;
  36. }
  37. switch (data[0]) {
  38. case EFUSE_FINE:
  39. case EFUSE_BROKEN:
  40. case EFUSE_REBLOW:
  41. efuse = data[0];
  42. break;
  43. }
  44. if (efuse != EFUSE_NONE) {
  45. for (i = cnt = 1; i < CHK_SIZE; i++) {
  46. if (data[i] == efuse)
  47. cnt++;
  48. }
  49. if (cnt >= CHK_THRESHOLD) {
  50. if (efuse == EFUSE_FINE)
  51. str = "success";
  52. else if (efuse == EFUSE_BROKEN)
  53. str = "broken";
  54. else if (efuse == EFUSE_REBLOW)
  55. str = "reblow";
  56. video_printf("efuse blow: %s\n", str);
  57. }
  58. }
  59. fail:
  60. if (data)
  61. free(data);
  62. return (unsigned int)efuse;
  63. }
  64. #else
  65. unsigned int mt_efuse_get(void)
  66. {
  67. return 0;
  68. }
  69. #endif