17b02bf3cSSimon Glass/* 27b02bf3cSSimon Glass * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com> 37b02bf3cSSimon Glass * 47b02bf3cSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 57b02bf3cSSimon Glass */ 67b02bf3cSSimon Glass 77b02bf3cSSimon Glass#include <config.h> 87b02bf3cSSimon Glass#include <asm/post.h> 97b02bf3cSSimon Glass 107b02bf3cSSimon Glass.globl car_init 117b02bf3cSSimon Glasscar_init: 127b02bf3cSSimon Glass /* 137b02bf3cSSimon Glass * Note: ebp holds the BIST value (built-in self test) so far, but ebp 147b02bf3cSSimon Glass * will be destroyed through the FSP call, thus we have to test the 157b02bf3cSSimon Glass * BIST value here before we call into FSP. 167b02bf3cSSimon Glass */ 177b02bf3cSSimon Glass test %ebp, %ebp 187b02bf3cSSimon Glass jz car_init_start 197b02bf3cSSimon Glass post_code(POST_BIST_FAILURE) 207b02bf3cSSimon Glass jmp die 217b02bf3cSSimon Glass 227b02bf3cSSimon Glasscar_init_start: 237b02bf3cSSimon Glass post_code(POST_CAR_START) 247b02bf3cSSimon Glass lea find_fsp_header_romstack, %esp 257b02bf3cSSimon Glass jmp find_fsp_header 267b02bf3cSSimon Glass 277b02bf3cSSimon Glassfind_fsp_header_ret: 287b02bf3cSSimon Glass /* EAX points to FSP_INFO_HEADER */ 297b02bf3cSSimon Glass mov %eax, %ebp 307b02bf3cSSimon Glass 317b02bf3cSSimon Glass /* sanity test */ 327b02bf3cSSimon Glass cmp $CONFIG_FSP_ADDR, %eax 337b02bf3cSSimon Glass jb die 347b02bf3cSSimon Glass 357b02bf3cSSimon Glass /* calculate TempRamInitEntry address */ 367b02bf3cSSimon Glass mov 0x30(%ebp), %eax 377b02bf3cSSimon Glass add 0x1c(%ebp), %eax 387b02bf3cSSimon Glass 397b02bf3cSSimon Glass /* call FSP TempRamInitEntry to setup temporary stack */ 407b02bf3cSSimon Glass lea temp_ram_init_romstack, %esp 417b02bf3cSSimon Glass jmp *%eax 427b02bf3cSSimon Glass 437b02bf3cSSimon Glasstemp_ram_init_ret: 447b02bf3cSSimon Glass addl $4, %esp 457b02bf3cSSimon Glass cmp $0, %eax 467b02bf3cSSimon Glass jnz car_init_fail 477b02bf3cSSimon Glass 487b02bf3cSSimon Glass post_code(POST_CAR_CPU_CACHE) 497b02bf3cSSimon Glass 507b02bf3cSSimon Glass /* 517b02bf3cSSimon Glass * The FSP TempRamInit initializes the ecx and edx registers to 527b02bf3cSSimon Glass * point to a temporary but writable memory range (Cache-As-RAM). 537b02bf3cSSimon Glass * ecx: the start of this temporary memory range, 547b02bf3cSSimon Glass * edx: the end of this range. 557b02bf3cSSimon Glass */ 567b02bf3cSSimon Glass 577b02bf3cSSimon Glass /* stack grows down from top of CAR */ 587b02bf3cSSimon Glass movl %edx, %esp 59aefaff8eSBin Meng subl $4, %esp 607b02bf3cSSimon Glass 61aefaff8eSBin Meng xor %esi, %esi 62aefaff8eSBin Meng jmp car_init_done 637b02bf3cSSimon Glass 647b02bf3cSSimon Glass.global fsp_init_done 657b02bf3cSSimon Glassfsp_init_done: 667b02bf3cSSimon Glass /* 6748aa6c26SBin Meng * We come here from fsp_continue() with eax pointing to the HOB list. 687b02bf3cSSimon Glass * Save eax to esi temporarily. 697b02bf3cSSimon Glass */ 707b02bf3cSSimon Glass movl %eax, %esi 71aefaff8eSBin Meng 72aefaff8eSBin Mengcar_init_done: 737b02bf3cSSimon Glass /* 747b02bf3cSSimon Glass * Re-initialize the ebp (BIST) to zero, as we already reach here 757b02bf3cSSimon Glass * which means we passed BIST testing before. 767b02bf3cSSimon Glass */ 777b02bf3cSSimon Glass xorl %ebp, %ebp 787b02bf3cSSimon Glass jmp car_init_ret 797b02bf3cSSimon Glass 807b02bf3cSSimon Glasscar_init_fail: 817b02bf3cSSimon Glass post_code(POST_CAR_FAILURE) 827b02bf3cSSimon Glass 837b02bf3cSSimon Glassdie: 847b02bf3cSSimon Glass hlt 857b02bf3cSSimon Glass jmp die 867b02bf3cSSimon Glass hlt 877b02bf3cSSimon Glass 887b02bf3cSSimon Glass /* 897b02bf3cSSimon Glass * The function call before CAR initialization is tricky. It cannot 907b02bf3cSSimon Glass * be called using the 'call' instruction but only the 'jmp' with 917b02bf3cSSimon Glass * the help of a handcrafted stack in the ROM. The stack needs to 927b02bf3cSSimon Glass * contain the function return address as well as the parameters. 937b02bf3cSSimon Glass */ 947b02bf3cSSimon Glass .balign 4 957b02bf3cSSimon Glassfind_fsp_header_romstack: 967b02bf3cSSimon Glass .long find_fsp_header_ret 977b02bf3cSSimon Glass 987b02bf3cSSimon Glass .balign 4 997b02bf3cSSimon Glasstemp_ram_init_romstack: 1007b02bf3cSSimon Glass .long temp_ram_init_ret 1017b02bf3cSSimon Glass .long temp_ram_init_params 1027b02bf3cSSimon Glasstemp_ram_init_params: 1037b02bf3cSSimon Glass_dt_ucode_base_size: 1047b02bf3cSSimon Glass /* These next two fields are filled in by ifdtool */ 105*e77b62e2SSimon Glass.globl ucode_base 106*e77b62e2SSimon Glassucode_base: /* Declared in micrcode.h */ 1077b02bf3cSSimon Glass .long 0 /* microcode base */ 1087b02bf3cSSimon Glass .long 0 /* microcode size */ 1097b02bf3cSSimon Glass .long CONFIG_SYS_MONITOR_BASE /* code region base */ 1107b02bf3cSSimon Glass .long CONFIG_SYS_MONITOR_LEN /* code region size */ 111