x86: quark: Add Cache-As-RAM initialization
Quark SoC contains an embedded 512KiB SRAM (eSRAM) that is initialized by hardware. eSRAM is the ideal place to be used for Cache-As-RAM (CAR) before system memory is available. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									3c8ae536ec
								
							
						
					
					
						commit
						0fae4d24df
					
				|  | @ -0,0 +1,105 @@ | |||
| /* | ||||
|  * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
 | ||||
|  * | ||||
|  * SPDX-License-Identifier:	GPL-2.0+ | ||||
|  */ | ||||
| 
 | ||||
| #include <config.h> | ||||
| #include <asm/pci.h> | ||||
| #include <asm/post.h> | ||||
| #include <asm/arch/quark.h> | ||||
| #include <asm/arch/msg_port.h> | ||||
| 
 | ||||
| .globl car_init
 | ||||
| car_init: | ||||
| 	post_code(POST_CAR_START) | ||||
| 
 | ||||
| 	/* | ||||
| 	 * Quark SoC contains an embedded 512KiB SRAM (eSRAM) that is | ||||
| 	 * initialized by hardware. eSRAM is the ideal place to be used | ||||
| 	 * for Cache-As-RAM (CAR) before system memory is available. | ||||
| 	 * | ||||
| 	 * Relocate this eSRAM to a suitable location in the physical | ||||
| 	 * memory map and enable it. | ||||
| 	 */ | ||||
| 
 | ||||
| 	/* Host Memory Bound Register P03h:R08h */ | ||||
| 	mov	$((MSG_PORT_HOST_BRIDGE << 16) | (HM_BOUND << 8)), %eax | ||||
| 	mov	$(DRAM_BASE + DRAM_MAX_SIZE + ESRAM_SIZE), %edx | ||||
| 	lea	1f, %esp | ||||
| 	jmp	msg_port_write | ||||
| 1: | ||||
| 
 | ||||
| 	/* eSRAM Block Page Control Register P05h:R82h */ | ||||
| 	mov	$((MSG_PORT_MEM_MGR << 16) | (ESRAM_BLK_CTRL << 8)), %eax | ||||
| 	mov	$(ESRAM_BLOCK_MODE | (CONFIG_ESRAM_BASE >> 24)), %edx | ||||
| 	lea	2f, %esp | ||||
| 	jmp	msg_port_write | ||||
| 2: | ||||
| 
 | ||||
| 	post_code(POST_CAR_CPU_CACHE) | ||||
| 	jmp	car_init_ret | ||||
| 
 | ||||
| msg_port_read: | ||||
| 	/* | ||||
| 	 * Parameter: | ||||
| 	 *   eax[23:16] - Message Port ID | ||||
| 	 *   eax[15:08] - Register Address | ||||
| 	 * | ||||
| 	 * Return Value: | ||||
| 	 *   eax - Message Port Register value | ||||
| 	 * | ||||
| 	 * Return Address: esp | ||||
| 	 */ | ||||
| 
 | ||||
| 	or	$((MSG_OP_READ << 24) | MSG_BYTE_ENABLE), %eax | ||||
| 	mov	%eax, %ebx | ||||
| 
 | ||||
| 	/* Write MCR B0:D0:F0:RD0 */ | ||||
| 	mov	$(PCI_CFG_EN | MSG_CTRL_REG), %eax | ||||
| 	mov	$PCI_REG_ADDR, %dx | ||||
| 	out	%eax, %dx | ||||
| 	mov	$PCI_REG_DATA, %dx | ||||
| 	mov	%ebx, %eax | ||||
| 	out	%eax, %dx | ||||
| 
 | ||||
| 	/* Read MDR B0:D0:F0:RD4 */ | ||||
| 	mov	$(PCI_CFG_EN | MSG_DATA_REG), %eax | ||||
| 	mov	$PCI_REG_ADDR, %dx | ||||
| 	out	%eax, %dx | ||||
| 	mov	$PCI_REG_DATA, %dx | ||||
| 	in	%dx, %eax | ||||
| 
 | ||||
| 	jmp	*%esp | ||||
| 
 | ||||
| msg_port_write: | ||||
| 	/* | ||||
| 	 * Parameter: | ||||
| 	 *   eax[23:16] - Message Port ID | ||||
| 	 *   eax[15:08] - Register Address | ||||
| 	 *   edx        - Message Port Register value to write | ||||
| 	 * | ||||
| 	 * Return Address: esp | ||||
| 	 */ | ||||
| 
 | ||||
| 	or	$((MSG_OP_WRITE << 24) | MSG_BYTE_ENABLE), %eax | ||||
| 	mov	%eax, %esi | ||||
| 	mov	%edx, %edi | ||||
| 
 | ||||
| 	/* Write MDR B0:D0:F0:RD4 */ | ||||
| 	mov	$(PCI_CFG_EN | MSG_DATA_REG), %eax | ||||
| 	mov	$PCI_REG_ADDR, %dx | ||||
| 	out	%eax, %dx | ||||
| 	mov	$PCI_REG_DATA, %dx | ||||
| 	mov	%edi, %eax | ||||
| 	out	%eax, %dx | ||||
| 
 | ||||
| 	/* Write MCR B0:D0:F0:RD0 */ | ||||
| 	mov	$(PCI_CFG_EN | MSG_CTRL_REG), %eax | ||||
| 	mov	$PCI_REG_ADDR, %dx | ||||
| 	out	%eax, %dx | ||||
| 	mov	$PCI_REG_DATA, %dx | ||||
| 	mov	%esi, %eax | ||||
| 	out	%eax, %dx | ||||
| 
 | ||||
| 	jmp	*%esp | ||||
		Loading…
	
		Reference in New Issue