xref: /openbmc/u-boot/arch/arm/mach-imx/mac.c (revision 83d290c5)
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