1*0fae4d24SBin Meng/* 2*0fae4d24SBin Meng * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 3*0fae4d24SBin Meng * 4*0fae4d24SBin Meng * SPDX-License-Identifier: GPL-2.0+ 5*0fae4d24SBin Meng */ 6*0fae4d24SBin Meng 7*0fae4d24SBin Meng#include <config.h> 8*0fae4d24SBin Meng#include <asm/pci.h> 9*0fae4d24SBin Meng#include <asm/post.h> 10*0fae4d24SBin Meng#include <asm/arch/quark.h> 11*0fae4d24SBin Meng#include <asm/arch/msg_port.h> 12*0fae4d24SBin Meng 13*0fae4d24SBin Meng.globl car_init 14*0fae4d24SBin Mengcar_init: 15*0fae4d24SBin Meng post_code(POST_CAR_START) 16*0fae4d24SBin Meng 17*0fae4d24SBin Meng /* 18*0fae4d24SBin Meng * Quark SoC contains an embedded 512KiB SRAM (eSRAM) that is 19*0fae4d24SBin Meng * initialized by hardware. eSRAM is the ideal place to be used 20*0fae4d24SBin Meng * for Cache-As-RAM (CAR) before system memory is available. 21*0fae4d24SBin Meng * 22*0fae4d24SBin Meng * Relocate this eSRAM to a suitable location in the physical 23*0fae4d24SBin Meng * memory map and enable it. 24*0fae4d24SBin Meng */ 25*0fae4d24SBin Meng 26*0fae4d24SBin Meng /* Host Memory Bound Register P03h:R08h */ 27*0fae4d24SBin Meng mov $((MSG_PORT_HOST_BRIDGE << 16) | (HM_BOUND << 8)), %eax 28*0fae4d24SBin Meng mov $(DRAM_BASE + DRAM_MAX_SIZE + ESRAM_SIZE), %edx 29*0fae4d24SBin Meng lea 1f, %esp 30*0fae4d24SBin Meng jmp msg_port_write 31*0fae4d24SBin Meng1: 32*0fae4d24SBin Meng 33*0fae4d24SBin Meng /* eSRAM Block Page Control Register P05h:R82h */ 34*0fae4d24SBin Meng mov $((MSG_PORT_MEM_MGR << 16) | (ESRAM_BLK_CTRL << 8)), %eax 35*0fae4d24SBin Meng mov $(ESRAM_BLOCK_MODE | (CONFIG_ESRAM_BASE >> 24)), %edx 36*0fae4d24SBin Meng lea 2f, %esp 37*0fae4d24SBin Meng jmp msg_port_write 38*0fae4d24SBin Meng2: 39*0fae4d24SBin Meng 40*0fae4d24SBin Meng post_code(POST_CAR_CPU_CACHE) 41*0fae4d24SBin Meng jmp car_init_ret 42*0fae4d24SBin Meng 43*0fae4d24SBin Mengmsg_port_read: 44*0fae4d24SBin Meng /* 45*0fae4d24SBin Meng * Parameter: 46*0fae4d24SBin Meng * eax[23:16] - Message Port ID 47*0fae4d24SBin Meng * eax[15:08] - Register Address 48*0fae4d24SBin Meng * 49*0fae4d24SBin Meng * Return Value: 50*0fae4d24SBin Meng * eax - Message Port Register value 51*0fae4d24SBin Meng * 52*0fae4d24SBin Meng * Return Address: esp 53*0fae4d24SBin Meng */ 54*0fae4d24SBin Meng 55*0fae4d24SBin Meng or $((MSG_OP_READ << 24) | MSG_BYTE_ENABLE), %eax 56*0fae4d24SBin Meng mov %eax, %ebx 57*0fae4d24SBin Meng 58*0fae4d24SBin Meng /* Write MCR B0:D0:F0:RD0 */ 59*0fae4d24SBin Meng mov $(PCI_CFG_EN | MSG_CTRL_REG), %eax 60*0fae4d24SBin Meng mov $PCI_REG_ADDR, %dx 61*0fae4d24SBin Meng out %eax, %dx 62*0fae4d24SBin Meng mov $PCI_REG_DATA, %dx 63*0fae4d24SBin Meng mov %ebx, %eax 64*0fae4d24SBin Meng out %eax, %dx 65*0fae4d24SBin Meng 66*0fae4d24SBin Meng /* Read MDR B0:D0:F0:RD4 */ 67*0fae4d24SBin Meng mov $(PCI_CFG_EN | MSG_DATA_REG), %eax 68*0fae4d24SBin Meng mov $PCI_REG_ADDR, %dx 69*0fae4d24SBin Meng out %eax, %dx 70*0fae4d24SBin Meng mov $PCI_REG_DATA, %dx 71*0fae4d24SBin Meng in %dx, %eax 72*0fae4d24SBin Meng 73*0fae4d24SBin Meng jmp *%esp 74*0fae4d24SBin Meng 75*0fae4d24SBin Mengmsg_port_write: 76*0fae4d24SBin Meng /* 77*0fae4d24SBin Meng * Parameter: 78*0fae4d24SBin Meng * eax[23:16] - Message Port ID 79*0fae4d24SBin Meng * eax[15:08] - Register Address 80*0fae4d24SBin Meng * edx - Message Port Register value to write 81*0fae4d24SBin Meng * 82*0fae4d24SBin Meng * Return Address: esp 83*0fae4d24SBin Meng */ 84*0fae4d24SBin Meng 85*0fae4d24SBin Meng or $((MSG_OP_WRITE << 24) | MSG_BYTE_ENABLE), %eax 86*0fae4d24SBin Meng mov %eax, %esi 87*0fae4d24SBin Meng mov %edx, %edi 88*0fae4d24SBin Meng 89*0fae4d24SBin Meng /* Write MDR B0:D0:F0:RD4 */ 90*0fae4d24SBin Meng mov $(PCI_CFG_EN | MSG_DATA_REG), %eax 91*0fae4d24SBin Meng mov $PCI_REG_ADDR, %dx 92*0fae4d24SBin Meng out %eax, %dx 93*0fae4d24SBin Meng mov $PCI_REG_DATA, %dx 94*0fae4d24SBin Meng mov %edi, %eax 95*0fae4d24SBin Meng out %eax, %dx 96*0fae4d24SBin Meng 97*0fae4d24SBin Meng /* Write MCR B0:D0:F0:RD0 */ 98*0fae4d24SBin Meng mov $(PCI_CFG_EN | MSG_CTRL_REG), %eax 99*0fae4d24SBin Meng mov $PCI_REG_ADDR, %dx 100*0fae4d24SBin Meng out %eax, %dx 101*0fae4d24SBin Meng mov $PCI_REG_DATA, %dx 102*0fae4d24SBin Meng mov %esi, %eax 103*0fae4d24SBin Meng out %eax, %dx 104*0fae4d24SBin Meng 105*0fae4d24SBin Meng jmp *%esp 106