mac.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2017 NXP
  4. *
  5. * Peng Fan <peng.fan@nxp.com>
  6. */
  7. #include <common.h>
  8. #include <asm/arch/imx-regs.h>
  9. #include <asm/io.h>
  10. #include <asm/arch/sys_proto.h>
  11. #include <errno.h>
  12. struct imx_mac_fuse {
  13. u32 mac_addr0;
  14. u32 rsvd0[3];
  15. u32 mac_addr1;
  16. u32 rsvd1[3];
  17. u32 mac_addr2;
  18. u32 rsvd2[7];
  19. };
  20. #define MAC_FUSE_MX6_OFFSET 0x620
  21. #define MAC_FUSE_MX7_OFFSET 0x640
  22. void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
  23. {
  24. struct imx_mac_fuse *fuse;
  25. u32 offset;
  26. bool has_second_mac;
  27. offset = is_mx6() ? MAC_FUSE_MX6_OFFSET : MAC_FUSE_MX7_OFFSET;
  28. fuse = (struct imx_mac_fuse *)(ulong)(OCOTP_BASE_ADDR + offset);
  29. has_second_mac = is_mx7() || is_mx6sx() || is_mx6ul() || is_mx6ull();
  30. if (has_second_mac && dev_id == 1) {
  31. u32 value = readl(&fuse->mac_addr2);
  32. mac[0] = value >> 24;
  33. mac[1] = value >> 16;
  34. mac[2] = value >> 8;
  35. mac[3] = value;
  36. value = readl(&fuse->mac_addr1);
  37. mac[4] = value >> 24;
  38. mac[5] = value >> 16;
  39. } else {
  40. u32 value = readl(&fuse->mac_addr1);
  41. mac[0] = value >> 8;
  42. mac[1] = value;
  43. value = readl(&fuse->mac_addr0);
  44. mac[2] = value >> 24;
  45. mac[3] = value >> 16;
  46. mac[4] = value >> 8;
  47. mac[5] = value;
  48. }
  49. }