1a13110a9SKlaus Goger /* 2a13110a9SKlaus Goger * (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH 3a13110a9SKlaus Goger * 4a13110a9SKlaus Goger * SPDX-License-Identifier: GPL-2.0+ 5a13110a9SKlaus Goger */ 6a13110a9SKlaus Goger #include <common.h> 7a13110a9SKlaus Goger #include <dm.h> 8e92e5803SPhilipp Tomsich #include <misc.h> 9e92e5803SPhilipp Tomsich #include <ram.h> 10a13110a9SKlaus Goger #include <dm/pinctrl.h> 11a13110a9SKlaus Goger #include <dm/uclass-internal.h> 12*9415b9a7SPhilipp Tomsich #include <misc.h> 13*9415b9a7SPhilipp Tomsich #include <asm/setup.h> 14a13110a9SKlaus Goger #include <asm/arch/periph.h> 15a13110a9SKlaus Goger #include <power/regulator.h> 16e92e5803SPhilipp Tomsich #include <u-boot/sha256.h> 17e92e5803SPhilipp Tomsich 18*9415b9a7SPhilipp Tomsich #define RK3399_CPUID_OFF 0x7 19*9415b9a7SPhilipp Tomsich #define RK3399_CPUID_LEN 0x10 20*9415b9a7SPhilipp Tomsich 21e92e5803SPhilipp Tomsich DECLARE_GLOBAL_DATA_PTR; 22e92e5803SPhilipp Tomsich 23e92e5803SPhilipp Tomsich #define RK3399_CPUID_OFF 0x7 24e92e5803SPhilipp Tomsich #define RK3399_CPUID_LEN 0x10 25a13110a9SKlaus Goger 26a13110a9SKlaus Goger DECLARE_GLOBAL_DATA_PTR; 27a13110a9SKlaus Goger 28a13110a9SKlaus Goger int board_init(void) 29a13110a9SKlaus Goger { 30a13110a9SKlaus Goger struct udevice *pinctrl, *regulator; 31a13110a9SKlaus Goger int ret; 32a13110a9SKlaus Goger 33a13110a9SKlaus Goger /* 34a13110a9SKlaus Goger * The PWM does not have decicated interrupt number in dts and can 35a13110a9SKlaus Goger * not get periph_id by pinctrl framework, so let's init them here. 36a13110a9SKlaus Goger * The PWM2 and PWM3 are for pwm regulators. 37a13110a9SKlaus Goger */ 38a13110a9SKlaus Goger ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl); 39a13110a9SKlaus Goger if (ret) { 40a13110a9SKlaus Goger debug("%s: Cannot find pinctrl device\n", __func__); 41a13110a9SKlaus Goger goto out; 42a13110a9SKlaus Goger } 43a13110a9SKlaus Goger 44a13110a9SKlaus Goger ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_PWM2); 45a13110a9SKlaus Goger if (ret) { 46a13110a9SKlaus Goger debug("%s PWM2 pinctrl init fail!\n", __func__); 47a13110a9SKlaus Goger goto out; 48a13110a9SKlaus Goger } 49a13110a9SKlaus Goger 50a13110a9SKlaus Goger /* rk3399 need to init vdd_center to get the correct output voltage */ 51a13110a9SKlaus Goger ret = regulator_get_by_platname("vdd_center", ®ulator); 52a13110a9SKlaus Goger if (ret) 53a13110a9SKlaus Goger debug("%s: Cannot get vdd_center regulator\n", __func__); 54a13110a9SKlaus Goger 55a13110a9SKlaus Goger ret = regulator_get_by_platname("vcc5v0_host", ®ulator); 56a13110a9SKlaus Goger if (ret) { 57a13110a9SKlaus Goger debug("%s vcc5v0_host init fail! ret %d\n", __func__, ret); 58a13110a9SKlaus Goger goto out; 59a13110a9SKlaus Goger } 60a13110a9SKlaus Goger 61a13110a9SKlaus Goger ret = regulator_set_enable(regulator, true); 62a13110a9SKlaus Goger if (ret) { 63a13110a9SKlaus Goger debug("%s vcc5v0-host-en set fail!\n", __func__); 64a13110a9SKlaus Goger goto out; 65a13110a9SKlaus Goger } 66a13110a9SKlaus Goger 67a13110a9SKlaus Goger out: 68a13110a9SKlaus Goger return 0; 69a13110a9SKlaus Goger } 70a13110a9SKlaus Goger 71*9415b9a7SPhilipp Tomsich static void setup_serial(void) 72*9415b9a7SPhilipp Tomsich { 73*9415b9a7SPhilipp Tomsich #if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE) 74*9415b9a7SPhilipp Tomsich struct udevice *dev; 75*9415b9a7SPhilipp Tomsich int ret, i; 76*9415b9a7SPhilipp Tomsich u8 cpuid[RK3399_CPUID_LEN]; 77*9415b9a7SPhilipp Tomsich u8 low[RK3399_CPUID_LEN/2], high[RK3399_CPUID_LEN/2]; 78*9415b9a7SPhilipp Tomsich char cpuid_str[RK3399_CPUID_LEN * 2 + 1]; 79*9415b9a7SPhilipp Tomsich u64 serialno; 80*9415b9a7SPhilipp Tomsich char serialno_str[16]; 81*9415b9a7SPhilipp Tomsich 82*9415b9a7SPhilipp Tomsich /* the first misc device will be used */ 83*9415b9a7SPhilipp Tomsich ret = uclass_get_device(UCLASS_MISC, 0, &dev); 84*9415b9a7SPhilipp Tomsich if (ret) { 85*9415b9a7SPhilipp Tomsich debug("%s: could not find efuse device\n", __func__); 86*9415b9a7SPhilipp Tomsich return; 87*9415b9a7SPhilipp Tomsich } 88*9415b9a7SPhilipp Tomsich 89*9415b9a7SPhilipp Tomsich /* read the cpu_id range from the efuses */ 90*9415b9a7SPhilipp Tomsich ret = misc_read(dev, RK3399_CPUID_OFF, &cpuid, sizeof(cpuid)); 91*9415b9a7SPhilipp Tomsich if (ret) { 92*9415b9a7SPhilipp Tomsich debug("%s: reading cpuid from the efuses failed\n", 93*9415b9a7SPhilipp Tomsich __func__); 94*9415b9a7SPhilipp Tomsich return; 95*9415b9a7SPhilipp Tomsich } 96*9415b9a7SPhilipp Tomsich 97*9415b9a7SPhilipp Tomsich memset(cpuid_str, 0, sizeof(cpuid_str)); 98*9415b9a7SPhilipp Tomsich for (i = 0; i < 16; i++) 99*9415b9a7SPhilipp Tomsich sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]); 100*9415b9a7SPhilipp Tomsich 101*9415b9a7SPhilipp Tomsich debug("cpuid: %s\n", cpuid_str); 102*9415b9a7SPhilipp Tomsich 103*9415b9a7SPhilipp Tomsich /* 104*9415b9a7SPhilipp Tomsich * Mix the cpuid bytes using the same rules as in 105*9415b9a7SPhilipp Tomsich * ${linux}/drivers/soc/rockchip/rockchip-cpuinfo.c 106*9415b9a7SPhilipp Tomsich */ 107*9415b9a7SPhilipp Tomsich for (i = 0; i < 8; i++) { 108*9415b9a7SPhilipp Tomsich low[i] = cpuid[1 + (i << 1)]; 109*9415b9a7SPhilipp Tomsich high[i] = cpuid[i << 1]; 110*9415b9a7SPhilipp Tomsich } 111*9415b9a7SPhilipp Tomsich 112*9415b9a7SPhilipp Tomsich serialno = crc32_no_comp(0, low, 8); 113*9415b9a7SPhilipp Tomsich serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32; 114*9415b9a7SPhilipp Tomsich snprintf(serialno_str, sizeof(serialno_str), "%llx", serialno); 115*9415b9a7SPhilipp Tomsich 116*9415b9a7SPhilipp Tomsich setenv("cpuid#", cpuid_str); 117*9415b9a7SPhilipp Tomsich setenv("serial#", serialno_str); 118*9415b9a7SPhilipp Tomsich #endif 119*9415b9a7SPhilipp Tomsich 120*9415b9a7SPhilipp Tomsich return; 121*9415b9a7SPhilipp Tomsich } 122*9415b9a7SPhilipp Tomsich 123*9415b9a7SPhilipp Tomsich int misc_init_r(void) 124*9415b9a7SPhilipp Tomsich { 125*9415b9a7SPhilipp Tomsich setup_serial(); 126*9415b9a7SPhilipp Tomsich 127*9415b9a7SPhilipp Tomsich return 0; 128*9415b9a7SPhilipp Tomsich } 129*9415b9a7SPhilipp Tomsich 130*9415b9a7SPhilipp Tomsich #ifdef CONFIG_SERIAL_TAG 131*9415b9a7SPhilipp Tomsich void get_board_serial(struct tag_serialnr *serialnr) 132*9415b9a7SPhilipp Tomsich { 133*9415b9a7SPhilipp Tomsich char *serial_string; 134*9415b9a7SPhilipp Tomsich u64 serial = 0; 135*9415b9a7SPhilipp Tomsich 136*9415b9a7SPhilipp Tomsich serial_string = getenv("serial#"); 137*9415b9a7SPhilipp Tomsich 138*9415b9a7SPhilipp Tomsich if (serial_string) 139*9415b9a7SPhilipp Tomsich serial = simple_strtoull(serial_string, NULL, 16); 140*9415b9a7SPhilipp Tomsich 141*9415b9a7SPhilipp Tomsich serialnr->high = (u32)(serial >> 32); 142*9415b9a7SPhilipp Tomsich serialnr->low = (u32)(serial & 0xffffffff); 143*9415b9a7SPhilipp Tomsich } 144*9415b9a7SPhilipp Tomsich #endif 145*9415b9a7SPhilipp Tomsich 146a13110a9SKlaus Goger int dram_init(void) 147a13110a9SKlaus Goger { 148e92e5803SPhilipp Tomsich struct ram_info ram; 149e92e5803SPhilipp Tomsich struct udevice *dev; 150e92e5803SPhilipp Tomsich int ret; 151e92e5803SPhilipp Tomsich 152e92e5803SPhilipp Tomsich ret = uclass_get_device(UCLASS_RAM, 0, &dev); 153e92e5803SPhilipp Tomsich if (ret) { 154e92e5803SPhilipp Tomsich debug("DRAM init failed: %d\n", ret); 155e92e5803SPhilipp Tomsich return ret; 156e92e5803SPhilipp Tomsich } 157e92e5803SPhilipp Tomsich ret = ram_get_info(dev, &ram); 158e92e5803SPhilipp Tomsich if (ret) { 159e92e5803SPhilipp Tomsich debug("Cannot get DRAM size: %d\n", ret); 160e92e5803SPhilipp Tomsich return ret; 161e92e5803SPhilipp Tomsich } 162e92e5803SPhilipp Tomsich debug("SDRAM base=%llx, size=%x\n", ram.base, (unsigned int)ram.size); 163e92e5803SPhilipp Tomsich gd->ram_size = ram.size; 164e92e5803SPhilipp Tomsich 165a13110a9SKlaus Goger return 0; 166a13110a9SKlaus Goger } 167a13110a9SKlaus Goger 168a13110a9SKlaus Goger int dram_init_banksize(void) 169a13110a9SKlaus Goger { 170a13110a9SKlaus Goger /* Reserve 0x200000 for ATF bl31 */ 171a13110a9SKlaus Goger gd->bd->bi_dram[0].start = 0x200000; 172a13110a9SKlaus Goger gd->bd->bi_dram[0].size = 0x7e000000; 173a13110a9SKlaus Goger 174a13110a9SKlaus Goger return 0; 175a13110a9SKlaus Goger } 176