1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 26ce8b10bSPeng Fan /* 36ce8b10bSPeng Fan * Copyright 2017 NXP 46ce8b10bSPeng Fan * 56ce8b10bSPeng Fan * Peng Fan <peng.fan@nxp.com> 66ce8b10bSPeng Fan */ 76ce8b10bSPeng Fan 86ce8b10bSPeng Fan #include <common.h> 96ce8b10bSPeng Fan #include <asm/arch/imx-regs.h> 106ce8b10bSPeng Fan #include <asm/io.h> 116ce8b10bSPeng Fan #include <asm/arch/sys_proto.h> 126ce8b10bSPeng Fan #include <errno.h> 136ce8b10bSPeng Fan 146ce8b10bSPeng Fan struct imx_mac_fuse { 156ce8b10bSPeng Fan u32 mac_addr0; 166ce8b10bSPeng Fan u32 rsvd0[3]; 176ce8b10bSPeng Fan u32 mac_addr1; 186ce8b10bSPeng Fan u32 rsvd1[3]; 196ce8b10bSPeng Fan u32 mac_addr2; 206ce8b10bSPeng Fan u32 rsvd2[7]; 216ce8b10bSPeng Fan }; 226ce8b10bSPeng Fan 236ce8b10bSPeng Fan #define MAC_FUSE_MX6_OFFSET 0x620 246ce8b10bSPeng Fan #define MAC_FUSE_MX7_OFFSET 0x640 256ce8b10bSPeng Fan 266ce8b10bSPeng Fan void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) 276ce8b10bSPeng Fan { 286ce8b10bSPeng Fan struct imx_mac_fuse *fuse; 296ce8b10bSPeng Fan u32 offset; 306ce8b10bSPeng Fan bool has_second_mac; 316ce8b10bSPeng Fan 326ce8b10bSPeng Fan offset = is_mx6() ? MAC_FUSE_MX6_OFFSET : MAC_FUSE_MX7_OFFSET; 336ce8b10bSPeng Fan fuse = (struct imx_mac_fuse *)(ulong)(OCOTP_BASE_ADDR + offset); 346ce8b10bSPeng Fan has_second_mac = is_mx7() || is_mx6sx() || is_mx6ul() || is_mx6ull(); 356ce8b10bSPeng Fan 366ce8b10bSPeng Fan if (has_second_mac && dev_id == 1) { 376ce8b10bSPeng Fan u32 value = readl(&fuse->mac_addr2); 386ce8b10bSPeng Fan 396ce8b10bSPeng Fan mac[0] = value >> 24; 406ce8b10bSPeng Fan mac[1] = value >> 16; 416ce8b10bSPeng Fan mac[2] = value >> 8; 426ce8b10bSPeng Fan mac[3] = value; 436ce8b10bSPeng Fan 446ce8b10bSPeng Fan value = readl(&fuse->mac_addr1); 456ce8b10bSPeng Fan mac[4] = value >> 24; 466ce8b10bSPeng Fan mac[5] = value >> 16; 476ce8b10bSPeng Fan 486ce8b10bSPeng Fan } else { 496ce8b10bSPeng Fan u32 value = readl(&fuse->mac_addr1); 506ce8b10bSPeng Fan 516ce8b10bSPeng Fan mac[0] = value >> 8; 526ce8b10bSPeng Fan mac[1] = value; 536ce8b10bSPeng Fan 546ce8b10bSPeng Fan value = readl(&fuse->mac_addr0); 556ce8b10bSPeng Fan mac[2] = value >> 24; 566ce8b10bSPeng Fan mac[3] = value >> 16; 576ce8b10bSPeng Fan mac[4] = value >> 8; 586ce8b10bSPeng Fan mac[5] = value; 596ce8b10bSPeng Fan } 606ce8b10bSPeng Fan } 61