xref: /OK3568_Linux_fs/u-boot/board/imgtec/malta/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Copyright (C) 2013 Gabor Juhos <juhosg@openwrt.org>
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun#include <config.h>
8*4882a593Smuzhiyun#include <gt64120.h>
9*4882a593Smuzhiyun#include <msc01.h>
10*4882a593Smuzhiyun#include <pci.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun#include <asm/addrspace.h>
13*4882a593Smuzhiyun#include <asm/asm.h>
14*4882a593Smuzhiyun#include <asm/regdef.h>
15*4882a593Smuzhiyun#include <asm/malta.h>
16*4882a593Smuzhiyun#include <asm/mipsregs.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun#ifdef CONFIG_SYS_BIG_ENDIAN
19*4882a593Smuzhiyun#define CPU_TO_GT32(_x)		((_x))
20*4882a593Smuzhiyun#else
21*4882a593Smuzhiyun#define CPU_TO_GT32(_x) (					\
22*4882a593Smuzhiyun	(((_x) & 0xff) << 24) | (((_x) & 0xff00) << 8) |	\
23*4882a593Smuzhiyun	(((_x) & 0xff0000) >> 8) | (((_x) & 0xff000000) >> 24))
24*4882a593Smuzhiyun#endif
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun	.text
27*4882a593Smuzhiyun	.set noreorder
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun	.globl	lowlevel_init
30*4882a593Smuzhiyunlowlevel_init:
31*4882a593Smuzhiyun	/* detect the core card */
32*4882a593Smuzhiyun	PTR_LI	t0, CKSEG1ADDR(MALTA_REVISION)
33*4882a593Smuzhiyun	lw	t0, 0(t0)
34*4882a593Smuzhiyun	srl	t0, t0, MALTA_REVISION_CORID_SHF
35*4882a593Smuzhiyun	andi	t0, t0, (MALTA_REVISION_CORID_MSK >> \
36*4882a593Smuzhiyun			 MALTA_REVISION_CORID_SHF)
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun	/* core cards using the gt64120 system controller */
39*4882a593Smuzhiyun	li	t1, MALTA_REVISION_CORID_CORE_LV
40*4882a593Smuzhiyun	beq	t0, t1, _gt64120
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun	/* core cards using the MSC01 system controller */
43*4882a593Smuzhiyun	 li	t1, MALTA_REVISION_CORID_CORE_FPGA6
44*4882a593Smuzhiyun	beq	t0, t1, _msc01
45*4882a593Smuzhiyun	 nop
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun	/* unknown system controller */
48*4882a593Smuzhiyun	b	.
49*4882a593Smuzhiyun	 nop
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun	/*
52*4882a593Smuzhiyun	 * Load BAR registers of GT64120 as done by YAMON
53*4882a593Smuzhiyun	 *
54*4882a593Smuzhiyun	 * based on a patch sent by Antony Pavlov <antonynpavlov@gmail.com>
55*4882a593Smuzhiyun	 * to the barebox mailing list.
56*4882a593Smuzhiyun	 * The subject of the original patch:
57*4882a593Smuzhiyun	 *   'MIPS: qemu-malta: add YAMON-style GT64120 memory map'
58*4882a593Smuzhiyun	 * URL:
59*4882a593Smuzhiyun	 * http://www.mail-archive.com/barebox@lists.infradead.org/msg06128.html
60*4882a593Smuzhiyun	 *
61*4882a593Smuzhiyun	 * based on write_bootloader() in qemu.git/hw/mips_malta.c
62*4882a593Smuzhiyun	 * see GT64120 manual and qemu.git/hw/gt64xxx.c for details
63*4882a593Smuzhiyun	 */
64*4882a593Smuzhiyun_gt64120:
65*4882a593Smuzhiyun	/* move GT64120 registers from 0x14000000 to 0x1be00000 */
66*4882a593Smuzhiyun	PTR_LI	t1, CKSEG1ADDR(GT_DEF_BASE)
67*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0xdf000000)
68*4882a593Smuzhiyun	sw	t0, GT_ISD_OFS(t1)
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	/* setup MEM-to-PCI0 mapping */
71*4882a593Smuzhiyun	PTR_LI	t1, CKSEG1ADDR(MALTA_GT_BASE)
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun	/* setup PCI0 io window to 0x18000000-0x181fffff */
74*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0xc0000000)
75*4882a593Smuzhiyun	sw	t0, GT_PCI0IOLD_OFS(t1)
76*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0x40000000)
77*4882a593Smuzhiyun	sw	t0, GT_PCI0IOHD_OFS(t1)
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun	/* setup PCI0 mem windows */
80*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0x80000000)
81*4882a593Smuzhiyun	sw	t0, GT_PCI0M0LD_OFS(t1)
82*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0x3f000000)
83*4882a593Smuzhiyun	sw	t0, GT_PCI0M0HD_OFS(t1)
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0xc1000000)
86*4882a593Smuzhiyun	sw	t0, GT_PCI0M1LD_OFS(t1)
87*4882a593Smuzhiyun	li	t0, CPU_TO_GT32(0x5e000000)
88*4882a593Smuzhiyun	sw	t0, GT_PCI0M1HD_OFS(t1)
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun	jr	ra
91*4882a593Smuzhiyun	 nop
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun	/*
94*4882a593Smuzhiyun	 *
95*4882a593Smuzhiyun	 */
96*4882a593Smuzhiyun_msc01:
97*4882a593Smuzhiyun	/* setup peripheral bus controller clock divide */
98*4882a593Smuzhiyun	PTR_LI	t0, CKSEG1ADDR(MALTA_MSC01_PBC_BASE)
99*4882a593Smuzhiyun	li	t1, 0x1 << MSC01_PBC_CLKCFG_SHF
100*4882a593Smuzhiyun	sw	t1, MSC01_PBC_CLKCFG_OFS(t0)
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun	/* tweak peripheral bus controller timings */
103*4882a593Smuzhiyun	li	t1, (0x1 << MSC01_PBC_CS0TIM_CDT_SHF) | \
104*4882a593Smuzhiyun		    (0x1 << MSC01_PBC_CS0TIM_CAT_SHF)
105*4882a593Smuzhiyun	sw	t1, MSC01_PBC_CS0TIM_OFS(t0)
106*4882a593Smuzhiyun	li	t1, (0x0 << MSC01_PBC_CS0RW_RDT_SHF) | \
107*4882a593Smuzhiyun		    (0x2 << MSC01_PBC_CS0RW_RAT_SHF) | \
108*4882a593Smuzhiyun		    (0x0 << MSC01_PBC_CS0RW_WDT_SHF) | \
109*4882a593Smuzhiyun		    (0x2 << MSC01_PBC_CS0RW_WAT_SHF)
110*4882a593Smuzhiyun	sw	t1, MSC01_PBC_CS0RW_OFS(t0)
111*4882a593Smuzhiyun	lw	t1, MSC01_PBC_CS0CFG_OFS(t0)
112*4882a593Smuzhiyun	li	t2, MSC01_PBC_CS0CFG_DTYP_MSK
113*4882a593Smuzhiyun	and	t1, t2
114*4882a593Smuzhiyun	ori	t1, (0x0 << MSC01_PBC_CS0CFG_ADM_SHF) | \
115*4882a593Smuzhiyun		    (0x3 << MSC01_PBC_CS0CFG_WSIDLE_SHF) | \
116*4882a593Smuzhiyun		    (0x10 << MSC01_PBC_CS0CFG_WS_SHF)
117*4882a593Smuzhiyun	sw	t1, MSC01_PBC_CS0CFG_OFS(t0)
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun	/* setup basic address decode */
120*4882a593Smuzhiyun	PTR_LI	t0, CKSEG1ADDR(MALTA_MSC01_BIU_BASE)
121*4882a593Smuzhiyun	li	t1, 0x0
122*4882a593Smuzhiyun	li	t2, -CONFIG_SYS_MEM_SIZE
123*4882a593Smuzhiyun	sw	t1, MSC01_BIU_MCBAS1L_OFS(t0)
124*4882a593Smuzhiyun	sw	t2, MSC01_BIU_MCMSK1L_OFS(t0)
125*4882a593Smuzhiyun	sw	t1, MSC01_BIU_MCBAS2L_OFS(t0)
126*4882a593Smuzhiyun	sw	t2, MSC01_BIU_MCMSK2L_OFS(t0)
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	/* initialise IP1 - unused */
129*4882a593Smuzhiyun	li	t1, MALTA_MSC01_IP1_BASE
130*4882a593Smuzhiyun	li	t2, -MALTA_MSC01_IP1_SIZE
131*4882a593Smuzhiyun	sw	t1, MSC01_BIU_IP1BAS1L_OFS(t0)
132*4882a593Smuzhiyun	sw	t2, MSC01_BIU_IP1MSK1L_OFS(t0)
133*4882a593Smuzhiyun	sw	t1, MSC01_BIU_IP1BAS2L_OFS(t0)
134*4882a593Smuzhiyun	sw	t2, MSC01_BIU_IP1MSK2L_OFS(t0)
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun	/* initialise IP2 - PCI */
137*4882a593Smuzhiyun	li	t1, MALTA_MSC01_IP2_BASE1
138*4882a593Smuzhiyun	li	t2, -MALTA_MSC01_IP2_SIZE1
139*4882a593Smuzhiyun	sw	t1, MSC01_BIU_IP2BAS1L_OFS(t0)
140*4882a593Smuzhiyun	sw	t2, MSC01_BIU_IP2MSK1L_OFS(t0)
141*4882a593Smuzhiyun	li	t1, MALTA_MSC01_IP2_BASE2
142*4882a593Smuzhiyun	li	t2, -MALTA_MSC01_IP2_SIZE2
143*4882a593Smuzhiyun	sw	t1, MSC01_BIU_IP2BAS2L_OFS(t0)
144*4882a593Smuzhiyun	sw	t2, MSC01_BIU_IP2MSK2L_OFS(t0)
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun	/* initialise IP3 - peripheral bus controller */
147*4882a593Smuzhiyun	li	t1, MALTA_MSC01_IP3_BASE
148*4882a593Smuzhiyun	li	t2, -MALTA_MSC01_IP3_SIZE
149*4882a593Smuzhiyun	sw	t1, MSC01_BIU_IP3BAS1L_OFS(t0)
150*4882a593Smuzhiyun	sw	t2, MSC01_BIU_IP3MSK1L_OFS(t0)
151*4882a593Smuzhiyun	sw	t1, MSC01_BIU_IP3BAS2L_OFS(t0)
152*4882a593Smuzhiyun	sw	t2, MSC01_BIU_IP3MSK2L_OFS(t0)
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun	/* setup PCI memory */
155*4882a593Smuzhiyun	PTR_LI	t0, CKSEG1ADDR(MALTA_MSC01_PCI_BASE)
156*4882a593Smuzhiyun	li	t1, MALTA_MSC01_PCIMEM_BASE
157*4882a593Smuzhiyun	li	t2, (-MALTA_MSC01_PCIMEM_SIZE) & MSC01_PCI_SC2PMMSKL_MSK_MSK
158*4882a593Smuzhiyun	li	t3, MALTA_MSC01_PCIMEM_MAP
159*4882a593Smuzhiyun	sw	t1, MSC01_PCI_SC2PMBASL_OFS(t0)
160*4882a593Smuzhiyun	sw	t2, MSC01_PCI_SC2PMMSKL_OFS(t0)
161*4882a593Smuzhiyun	sw	t3, MSC01_PCI_SC2PMMAPL_OFS(t0)
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun	/* setup PCI I/O */
164*4882a593Smuzhiyun	li	t1, MALTA_MSC01_PCIIO_BASE
165*4882a593Smuzhiyun	li	t2, (-MALTA_MSC01_PCIIO_SIZE) & MSC01_PCI_SC2PIOMSKL_MSK_MSK
166*4882a593Smuzhiyun	li	t3, MALTA_MSC01_PCIIO_MAP
167*4882a593Smuzhiyun	sw	t1, MSC01_PCI_SC2PIOBASL_OFS(t0)
168*4882a593Smuzhiyun	sw	t2, MSC01_PCI_SC2PIOMSKL_OFS(t0)
169*4882a593Smuzhiyun	sw	t3, MSC01_PCI_SC2PIOMAPL_OFS(t0)
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun	/* setup PCI_BAR0 memory window */
172*4882a593Smuzhiyun	li	t1, -CONFIG_SYS_MEM_SIZE
173*4882a593Smuzhiyun	sw	t1, MSC01_PCI_BAR0_OFS(t0)
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun	/* setup PCI to SysCon/CPU translation */
176*4882a593Smuzhiyun	sw	t1, MSC01_PCI_P2SCMSKL_OFS(t0)
177*4882a593Smuzhiyun	sw	zero, MSC01_PCI_P2SCMAPL_OFS(t0)
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	/* setup PCI vendor & device IDs */
180*4882a593Smuzhiyun	li	t1, (PCI_VENDOR_ID_MIPS << MSC01_PCI_HEAD0_VENDORID_SHF) | \
181*4882a593Smuzhiyun		    (PCI_DEVICE_ID_MIPS_MSC01 << MSC01_PCI_HEAD0_DEVICEID_SHF)
182*4882a593Smuzhiyun	sw	t1, MSC01_PCI_HEAD0_OFS(t0)
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun	/* setup PCI subsystem vendor & device IDs */
185*4882a593Smuzhiyun	sw	t1, MSC01_PCI_HEAD11_OFS(t0)
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	/* setup PCI class, revision */
188*4882a593Smuzhiyun	li	t1, (PCI_CLASS_BRIDGE_HOST << MSC01_PCI_HEAD2_CLASS_SHF) | \
189*4882a593Smuzhiyun		    (0x1 << MSC01_PCI_HEAD2_REV_SHF)
190*4882a593Smuzhiyun	sw	t1, MSC01_PCI_HEAD2_OFS(t0)
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun	/* ensure a sane setup */
193*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD3_OFS(t0)
194*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD4_OFS(t0)
195*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD5_OFS(t0)
196*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD6_OFS(t0)
197*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD7_OFS(t0)
198*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD8_OFS(t0)
199*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD9_OFS(t0)
200*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD10_OFS(t0)
201*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD12_OFS(t0)
202*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD13_OFS(t0)
203*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD14_OFS(t0)
204*4882a593Smuzhiyun	sw	zero, MSC01_PCI_HEAD15_OFS(t0)
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun	/* setup PCI command register */
207*4882a593Smuzhiyun	li	t1, (PCI_COMMAND_FAST_BACK | \
208*4882a593Smuzhiyun		     PCI_COMMAND_SERR | \
209*4882a593Smuzhiyun		     PCI_COMMAND_PARITY | \
210*4882a593Smuzhiyun		     PCI_COMMAND_MASTER | \
211*4882a593Smuzhiyun		     PCI_COMMAND_MEMORY)
212*4882a593Smuzhiyun	sw	t1, MSC01_PCI_HEAD1_OFS(t0)
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun	/* setup PCI byte swapping */
215*4882a593Smuzhiyun#ifdef CONFIG_SYS_BIG_ENDIAN
216*4882a593Smuzhiyun	li	t1, (0x1 << MSC01_PCI_SWAP_BAR0_BSWAP_SHF) | \
217*4882a593Smuzhiyun		    (0x1 << MSC01_PCI_SWAP_IO_BSWAP_SHF)
218*4882a593Smuzhiyun	sw	t1, MSC01_PCI_SWAP_OFS(t0)
219*4882a593Smuzhiyun#else
220*4882a593Smuzhiyun	sw	zero, MSC01_PCI_SWAP_OFS(t0)
221*4882a593Smuzhiyun#endif
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun	/* enable PCI host configuration cycles */
224*4882a593Smuzhiyun	lw	t1, MSC01_PCI_CFG_OFS(t0)
225*4882a593Smuzhiyun	li	t2, MSC01_PCI_CFG_RA_MSK | \
226*4882a593Smuzhiyun		    MSC01_PCI_CFG_G_MSK | \
227*4882a593Smuzhiyun		    MSC01_PCI_CFG_EN_MSK
228*4882a593Smuzhiyun	or	t1, t1, t2
229*4882a593Smuzhiyun	sw	t1, MSC01_PCI_CFG_OFS(t0)
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun	jr	ra
232*4882a593Smuzhiyun	 nop
233