Home | History | Annotate | Download | only in fsp
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Copyright (C) 2014, Bin Meng <bmeng.cn (at) gmail.com>
      4  */
      5 
      6 #include <config.h>
      7 #include <asm/post.h>
      8 
      9 .globl car_init
     10 car_init:
     11 	/*
     12 	 * Note: ebp holds the BIST value (built-in self test) so far, but ebp
     13 	 * will be destroyed through the FSP call, thus we have to test the
     14 	 * BIST value here before we call into FSP.
     15 	 */
     16 	test	%ebp, %ebp
     17 	jz	car_init_start
     18 	post_code(POST_BIST_FAILURE)
     19 	jmp	die
     20 
     21 car_init_start:
     22 	post_code(POST_CAR_START)
     23 	lea	find_fsp_header_romstack, %esp
     24 	jmp	find_fsp_header
     25 
     26 find_fsp_header_ret:
     27 	/* EAX points to FSP_INFO_HEADER */
     28 	mov	%eax, %ebp
     29 
     30 	/* sanity test */
     31 	cmp	$CONFIG_FSP_ADDR, %eax
     32 	jb	die
     33 
     34 	/* calculate TempRamInitEntry address */
     35 	mov	0x30(%ebp), %eax
     36 	add	0x1c(%ebp), %eax
     37 
     38 	/* call FSP TempRamInitEntry to setup temporary stack */
     39 	lea	temp_ram_init_romstack, %esp
     40 	jmp	*%eax
     41 
     42 temp_ram_init_ret:
     43 	addl	$4, %esp
     44 	cmp	$0, %eax
     45 	jnz	car_init_fail
     46 
     47 	post_code(POST_CAR_CPU_CACHE)
     48 
     49 	/*
     50 	 * The FSP TempRamInit initializes the ecx and edx registers to
     51 	 * point to a temporary but writable memory range (Cache-As-RAM).
     52 	 * ecx: the start of this temporary memory range,
     53 	 * edx: the end of this range.
     54 	 */
     55 
     56 	/* stack grows down from top of CAR */
     57 	movl	%edx, %esp
     58 	subl	$4, %esp
     59 
     60 	xor	%esi, %esi
     61 	jmp	car_init_done
     62 
     63 .global fsp_init_done
     64 fsp_init_done:
     65 	/*
     66 	 * We come here from fsp_continue() with eax pointing to the HOB list.
     67 	 * Save eax to esi temporarily.
     68 	 */
     69 	movl	%eax, %esi
     70 
     71 car_init_done:
     72 	/*
     73 	 * Re-initialize the ebp (BIST) to zero, as we already reach here
     74 	 * which means we passed BIST testing before.
     75 	 */
     76 	xorl	%ebp, %ebp
     77 	jmp	car_init_ret
     78 
     79 car_init_fail:
     80 	post_code(POST_CAR_FAILURE)
     81 
     82 die:
     83 	hlt
     84 	jmp	die
     85 	hlt
     86 
     87 	/*
     88 	 * The function call before CAR initialization is tricky. It cannot
     89 	 * be called using the 'call' instruction but only the 'jmp' with
     90 	 * the help of a handcrafted stack in the ROM. The stack needs to
     91 	 * contain the function return address as well as the parameters.
     92 	 */
     93 	.balign	4
     94 find_fsp_header_romstack:
     95 	.long	find_fsp_header_ret
     96 
     97 	.balign	4
     98 temp_ram_init_romstack:
     99 	.long	temp_ram_init_ret
    100 	.long	temp_ram_init_params
    101 temp_ram_init_params:
    102 _dt_ucode_base_size:
    103 	/* These next two fields are filled in by ifdtool */
    104 .globl ucode_base
    105 ucode_base:	/* Declared in microcode.h */
    106 	.long	0			/* microcode base */
    107 .globl ucode_size
    108 ucode_size:	/* Declared in microcode.h */
    109 	.long	0			/* microcode size */
    110 	.long	CONFIG_SYS_MONITOR_BASE	/* code region base */
    111 	.long	CONFIG_SYS_MONITOR_LEN	/* code region size */
    112