1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd 4 */ 5 6 #include <common.h> 7 #include <dm.h> 8 #include <ram.h> 9 #include <asm/io.h> 10 #include <asm/arch/rk_atags.h> 11 #include <asm/arch/param.h> 12 13 DECLARE_GLOBAL_DATA_PTR; 14 15 #define SZ_4GB 0x100000000ULL 16 17 #ifndef CONFIG_SPL_BUILD 18 #define SDRAM_OFFSET(offset) (CONFIG_SYS_SDRAM_BASE + (offset)) 19 #define PARAM_DRAM_INFO_OFFSET (SZ_32M) 20 #define PARAM_OPTEE_INFO_OFFSET (SZ_32M + SZ_2M) 21 22 struct tos_param_t { 23 u32 version; 24 u32 checksum; 25 struct { 26 char name[8]; 27 s64 phy_addr; 28 u32 size; 29 u32 flags; 30 } tee_mem; 31 struct { 32 char name[8]; 33 s64 phy_addr; 34 u32 size; 35 u32 flags; 36 } drm_mem; 37 s64 reserve[8]; 38 }; 39 40 static uint16_t trust_checksum(const uint8_t *buf, uint16_t len) 41 { 42 uint16_t i, checksum = 0; 43 44 for (i = 0; i < len; i++) { 45 if (i % 2) 46 checksum += buf[i] << 8; 47 else 48 checksum += buf[i]; 49 } 50 checksum = ~checksum; 51 52 return checksum; 53 } 54 55 struct memblock param_parse_atf_mem(void) 56 { 57 struct memblock mem; 58 59 mem.base = 0; 60 mem.size = 0; 61 62 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 63 struct tag *t = NULL; 64 65 /* 66 * Get memory region of ATF 67 * 68 * 1. New way: atags info; 69 * 2. Leagcy way: 2MB size and start from ddr 0x0 offset; 70 */ 71 t = atags_get_tag(ATAG_ATF_MEM); 72 if (t && t->u.atf_mem.size) { 73 mem.base = t->u.atf_mem.phy_addr; 74 mem.size = t->u.atf_mem.size; 75 /* Sanity */ 76 if (mem.base + mem.size > SDRAM_OFFSET(SZ_1M)) { 77 printf("%s: ATF reserved region is not within 0-1MB " 78 "offset(0x%08llx-0x%08llx)!\n", 79 __func__, (u64)mem.base, (u64)mem.base + mem.size); 80 return mem; 81 } 82 } 83 #endif 84 85 /* Legacy */ 86 if (!mem.size) { 87 if (IS_ENABLED(CONFIG_ARM64) || 88 IS_ENABLED(CONFIG_ARM64_BOOT_AARCH32)) { 89 mem.base = SDRAM_OFFSET(0); 90 mem.size = SZ_1M; 91 } 92 } 93 94 debug("ATF: 0x%llx - 0x%llx\n", (u64)mem.base, (u64)mem.base + mem.size); 95 96 return mem; 97 } 98 99 struct memblock param_parse_optee_mem(void) 100 { 101 struct tos_param_t *tos_parameter; 102 struct memblock mem; 103 u32 checksum; 104 105 mem.base = 0; 106 mem.size = 0; 107 108 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 109 struct tag *t = NULL; 110 111 /* 112 * Get memory region of OP-TEE 113 * 114 * 1. New way: atags info; 115 * 2. Leagcy way: info in ddr 34M offset; 116 */ 117 t = atags_get_tag(ATAG_TOS_MEM); 118 if (t && (t->u.tos_mem.tee_mem.flags == 1)) { 119 mem.base = t->u.tos_mem.tee_mem.phy_addr; 120 mem.size = t->u.tos_mem.tee_mem.size; 121 } 122 #endif 123 124 /* Legacy */ 125 if (!mem.size) { 126 tos_parameter = 127 (struct tos_param_t *)(SDRAM_OFFSET(PARAM_OPTEE_INFO_OFFSET)); 128 checksum = 129 trust_checksum((uint8_t *)(unsigned long)tos_parameter + 8, 130 sizeof(struct tos_param_t) - 8); 131 if ((checksum == tos_parameter->checksum) && 132 (tos_parameter->tee_mem.flags == 1)) { 133 mem.base = tos_parameter->tee_mem.phy_addr; 134 mem.size = tos_parameter->tee_mem.size; 135 } 136 } 137 138 if (mem.size) 139 gd->flags |= GD_FLG_BL32_ENABLED; 140 141 debug("TOS: 0x%llx - 0x%llx\n", (u64)mem.base, (u64)mem.base + mem.size); 142 143 return mem; 144 } 145 146 struct memblock param_parse_common_resv_mem(void) 147 { 148 struct memblock mem; 149 150 #if defined(CONFIG_ARM64) 151 mem.base = SDRAM_OFFSET(SZ_1M); 152 mem.size = SZ_1M; 153 /* 154 * The ARMv8 platform enabling AArch32 mode should reserve memory the same 155 * as AArch64 mode(because there is no difference about ATF), only some 156 * platform has special request, they are: RK3308. 157 */ 158 #elif defined(CONFIG_ARM64_BOOT_AARCH32) && !defined(CONFIG_ROCKCHIP_RK3308) 159 mem.base = SDRAM_OFFSET(SZ_1M); 160 mem.size = SZ_1M; 161 #else 162 mem.size = 0; 163 #endif 164 return mem; 165 } 166 167 int param_parse_bootdev(char **devtype, char **devnum) 168 { 169 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 170 struct tag *t; 171 172 t = atags_get_tag(ATAG_BOOTDEV); 173 if (t) { 174 switch (t->u.bootdev.devtype) { 175 #ifdef CONFIG_DM_MMC 176 case BOOT_TYPE_EMMC: 177 *devtype = "mmc"; 178 *devnum = "0"; 179 break; 180 case BOOT_TYPE_SD0: 181 case BOOT_TYPE_SD1: 182 *devtype = "mmc"; 183 *devnum = "1"; 184 /* 185 * If preloader does not pass sdupdate value, we treat it 186 * as a unknown card and call the rkimgtest cmd to find 187 * out what it is. 188 * 189 * If preloader pass sdupdate value as an update card, 190 * we just set "sdfwupdate" to bootargs instead of 191 * calling rkimgtest cmd which consumes time. 192 */ 193 if (t->u.bootdev.sdupdate == SD_UNKNOWN_CARD) { 194 run_command("mmc dev 1", 0); 195 run_command("rkimgtest mmc 1", 0); 196 } else if (t->u.bootdev.sdupdate == SD_UPDATE_CARD) { 197 env_update("bootargs", "sdfwupdate"); 198 } 199 break; 200 #endif 201 #if defined(CONFIG_RKNAND) || defined(CONFIG_RKNANDC_NAND) 202 case BOOT_TYPE_NAND: 203 *devtype = "rknand"; 204 *devnum = "0"; 205 break; 206 #endif 207 #ifdef CONFIG_RKSFC_NAND 208 case BOOT_TYPE_SPI_NAND: 209 *devtype = "spinand"; 210 *devnum = "0"; 211 break; 212 #endif 213 #ifdef CONFIG_RKSFC_NOR 214 case BOOT_TYPE_SPI_NOR: 215 *devtype = "spinor"; 216 *devnum = "1"; 217 break; 218 #endif 219 #ifdef CONFIG_DM_RAMDISK 220 case BOOT_TYPE_RAM: 221 *devtype = "ramdisk"; 222 *devnum = "0"; 223 break; 224 #endif 225 #ifdef CONFIG_NAND 226 case BOOT_TYPE_MTD_BLK_NAND: 227 *devtype = "mtd"; 228 *devnum = "0"; 229 break; 230 #endif 231 #ifdef CONFIG_MTD_SPI_NAND 232 case BOOT_TYPE_MTD_BLK_SPI_NAND: 233 *devtype = "mtd"; 234 *devnum = "1"; 235 break; 236 #endif 237 #ifdef CONFIG_SPI_FLASH_MTD 238 case BOOT_TYPE_MTD_BLK_SPI_NOR: 239 *devtype = "mtd"; 240 *devnum = "2"; 241 break; 242 #endif 243 default: 244 printf("Unknown bootdev type: 0x%x\n", 245 t->u.bootdev.devtype); 246 return -EINVAL; 247 } 248 249 return 0; 250 } 251 #endif 252 253 return -ENOSYS; 254 } 255 #endif 256 257 static phys_size_t ddr_mem_get_usable_size(u64 base, u64 size) 258 { 259 return (base + size >= CONFIG_SYS_SDRAM_BASE + SDRAM_MAX_SIZE) ? 260 (CONFIG_SYS_SDRAM_BASE + SDRAM_MAX_SIZE - base) : size; 261 } 262 263 struct memblock *param_parse_ddr_mem(int *out_count) 264 { 265 struct udevice *dev; 266 struct memblock *mem; 267 struct ram_info ram; 268 int i, ret, count; 269 270 /* 271 * Get memory region of DDR 272 * 273 * 1. New: atags info; 274 * 2. Leagcy: os register; 275 */ 276 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 277 struct tag *t; 278 u64 base, size; 279 int n; 280 281 t = atags_get_tag(ATAG_DDR_MEM); 282 if (t && t->u.ddr_mem.count) { 283 /* extend top ram size */ 284 if (t->u.ddr_mem.flags & DDR_MEM_FLG_EXT_TOP) 285 gd->ram_top_ext_size = t->u.ddr_mem.data[0]; 286 287 /* normal ram size */ 288 count = t->u.ddr_mem.count; 289 mem = calloc(count + MEM_RESV_COUNT, sizeof(*mem)); 290 if (!mem) { 291 printf("Calloc ddr memory failed\n"); 292 return 0; 293 } 294 295 for (i = 0, n = 0; i < count; i++, n++) { 296 base = t->u.ddr_mem.bank[i]; 297 size = t->u.ddr_mem.bank[i + count]; 298 299 /* 0~4GB */ 300 if (base < SZ_4GB) { 301 mem[n].base = base; 302 mem[n].size = ddr_mem_get_usable_size(base, size); 303 if (base + size > SZ_4GB) { 304 n++; 305 mem[n].base_u64 = SZ_4GB; 306 mem[n].size_u64 = base + size - SZ_4GB; 307 } 308 } else { 309 /* 4GB+ */ 310 mem[n].base_u64 = base; 311 mem[n].size_u64 = size; 312 } 313 314 assert(n < count + MEM_RESV_COUNT); 315 } 316 317 *out_count = n; 318 return mem; 319 } 320 #endif 321 322 /* Leagcy */ 323 ret = uclass_get_device(UCLASS_RAM, 0, &dev); 324 if (ret) { 325 debug("DRAM init failed: %d\n", ret); 326 return NULL; 327 } 328 ret = ram_get_info(dev, &ram); 329 if (ret) { 330 debug("Cannot get DRAM size: %d\n", ret); 331 return NULL; 332 } 333 334 debug("SDRAM base=%lx, size=%lx\n", 335 (unsigned long)ram.base, (unsigned long)ram.size); 336 337 count = 1; 338 mem = calloc(1, sizeof(*mem)); 339 if (!mem) { 340 printf("Calloc ddr memory failed\n"); 341 return 0; 342 } 343 344 for (i = 0; i < count; i++) { 345 mem[i].base = CONFIG_SYS_SDRAM_BASE; 346 mem[i].size = ddr_mem_get_usable_size(mem[i].base, ram.size); 347 } 348 349 *out_count = count; 350 return mem; 351 } 352 353 #ifndef CONFIG_BIDRAM 354 /* 355 * init_bank=0: called from dram_init_banksize() 356 * init_bank=0: called from dram_init() 357 */ 358 phys_size_t param_simple_parse_ddr_mem(int init_bank) 359 { 360 struct memblock *list; 361 int i, count; 362 363 list = param_parse_ddr_mem(&count); 364 if (!list) { 365 printf("Can't get dram banks\n"); 366 return 0; 367 } 368 369 if (count > CONFIG_NR_DRAM_BANKS) { 370 printf("Dram banks num=%d, over %d\n", count, CONFIG_NR_DRAM_BANKS); 371 return 0; 372 } 373 374 if (!init_bank) { 375 i = count - 1; 376 return ddr_mem_get_usable_size(list[i].base, list[i].size); 377 } 378 379 for (i = 0; i < count; i++) { 380 gd->bd->bi_dram[i].start = list[i].base; 381 gd->bd->bi_dram[i].size = 382 ddr_mem_get_usable_size(list[i].base, list[i].size); 383 debug("bank[%d]: 0x%08lx - 0x%08lx\n", i, 384 (ulong)gd->bd->bi_dram[i].start, 385 (ulong)gd->bd->bi_dram[i].start + 386 (ulong)gd->bd->bi_dram[i].size); 387 } 388 389 return 0; 390 } 391 #endif 392 393 int param_parse_pre_serial(void) 394 { 395 #if defined(CONFIG_ROCKCHIP_PRELOADER_SERIAL) && \ 396 defined(CONFIG_ROCKCHIP_PRELOADER_ATAGS) 397 struct tag *t; 398 399 t = atags_get_tag(ATAG_SERIAL); 400 if (t) { 401 gd->serial.using_pre_serial = 1; 402 gd->serial.enable = t->u.serial.enable; 403 gd->serial.baudrate = t->u.serial.baudrate; 404 gd->serial.addr = t->u.serial.addr; 405 gd->serial.id = t->u.serial.id; 406 gd->baudrate = CONFIG_BAUDRATE; 407 debug("preloader: enable=%d, addr=0x%lx, baudrate=%d, id=%d\n", 408 gd->serial.enable, gd->serial.addr, 409 gd->serial.baudrate, gd->serial.id); 410 } else 411 #endif 412 { 413 gd->baudrate = CONFIG_BAUDRATE; 414 gd->serial.baudrate = CONFIG_BAUDRATE; 415 gd->serial.addr = CONFIG_DEBUG_UART_BASE; 416 } 417 418 return 0; 419 } 420 421 int param_parse_pubkey_fuse_programmed(void) 422 { 423 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS 424 struct tag *t; 425 426 t = atags_get_tag(ATAG_PUB_KEY); 427 if (t) { 428 /* Pass if efuse/otp programmed */ 429 if (t->u.pub_key.flag == PUBKEY_FUSE_PROGRAMMED) 430 env_update("bootargs", "fuse.programmed=1"); 431 else 432 env_update("bootargs", "fuse.programmed=0"); 433 } 434 #endif 435 return 0; 436 } 437 438