xref: /rk3399_rockchip-uboot/arch/x86/lib/fsp/fsp_car.S (revision e77b62e2906affb94f442ce7735762883f8147af)
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