1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2022 Marek Vasut <marex@denx.de>
7 #include <asm/arch/clock.h>
8 #include <asm/arch/sys_proto.h>
10 #include <asm/mach-imx/boot_mode.h>
12 #include <i2c_eeprom.h>
17 #include "lpddr4_timing.h"
19 DECLARE_GLOBAL_DATA_PTR;
21 int mach_cpu_init(void)
27 int board_phys_sdram_size(phys_size_t *size)
29 u8 memcfg = dmo_get_memcfg();
31 *size = (4ULL >> ((memcfg >> 1) & 0x3)) * SZ_1G;
36 /* IMX8M SNVS registers needed for the bootcount functionality */
37 #define SNVS_BASE_ADDR 0x30370000
38 #define SNVS_LPSR 0x4c
39 #define SNVS_LPLVDR 0x64
40 #define SNVS_LPPGDR_INIT 0x41736166
42 static void setup_snvs(void)
44 /* Enable SNVS clock */
45 clock_enable(CCGR_SNVS, 1);
46 /* Initialize glitch detect */
47 writel(SNVS_LPPGDR_INIT, SNVS_BASE_ADDR + SNVS_LPLVDR);
48 /* Clear interrupt status */
49 writel(0xffffffff, SNVS_BASE_ADDR + SNVS_LPSR);
52 static void setup_mac_address(void)
54 unsigned char enetaddr[6];
58 ret = eth_env_get_enetaddr("ethaddr", enetaddr);
59 if (ret) /* ethaddr is already set */
62 off = fdt_path_offset(gd->fdt_blob, "eeprom0");
64 printf("%s: No eeprom0 path offset\n", __func__);
68 ret = uclass_get_device_by_of_offset(UCLASS_I2C_EEPROM, off, &dev);
70 printf("Cannot find EEPROM!\n");
74 ret = i2c_eeprom_read(dev, 0xb0, enetaddr, 0x6);
76 printf("Error reading configuration EEPROM!\n");
80 if (is_valid_ethaddr(enetaddr))
81 eth_env_set_enetaddr("ethaddr", enetaddr);
84 static void setup_boot_device(void)
86 int boot_device = get_boot_device();
89 devnum = env_get("devnum");
90 if (devnum) /* devnum is already set */
93 if (boot_device == MMC3_BOOT) /* eMMC */
94 env_set_ulong("devnum", 0);
96 env_set_ulong("devnum", 1);
105 int board_late_init(void)