2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2011-2012 by Broadcom Corporation
|
|
|
|
*
|
|
|
|
* Init for bmips 5000.
|
|
|
|
* Used to init second core in dual core 5000's.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/init.h>
|
|
|
|
|
|
|
|
#include <asm/asm.h>
|
|
|
|
#include <asm/asmmacro.h>
|
|
|
|
#include <asm/cacheops.h>
|
|
|
|
#include <asm/regdef.h>
|
|
|
|
#include <asm/mipsregs.h>
|
|
|
|
#include <asm/stackframe.h>
|
|
|
|
#include <asm/addrspace.h>
|
|
|
|
#include <asm/hazards.h>
|
|
|
|
#include <asm/bmips.h>
|
|
|
|
|
|
|
|
#ifdef CONFIG_CPU_BMIPS5000
|
|
|
|
|
|
|
|
|
|
|
|
#define cacheop(kva, size, linesize, op) \
|
|
|
|
.set noreorder ; \
|
2016-04-12 17:17:57 -06:00
|
|
|
addu t1, kva, size ; \
|
|
|
|
subu t2, linesize, 1 ; \
|
|
|
|
not t2 ; \
|
|
|
|
and t0, kva, t2 ; \
|
|
|
|
addiu t1, t1, -1 ; \
|
|
|
|
and t1, t2 ; \
|
|
|
|
9: cache op, 0(t0) ; \
|
|
|
|
bne t0, t1, 9b ; \
|
|
|
|
addu t0, linesize ; \
|
|
|
|
.set reorder ;
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define IS_SHIFT 22
|
|
|
|
#define IL_SHIFT 19
|
|
|
|
#define IA_SHIFT 16
|
|
|
|
#define DS_SHIFT 13
|
|
|
|
#define DL_SHIFT 10
|
|
|
|
#define DA_SHIFT 7
|
|
|
|
#define IS_MASK 7
|
|
|
|
#define IL_MASK 7
|
|
|
|
#define IA_MASK 7
|
|
|
|
#define DS_MASK 7
|
|
|
|
#define DL_MASK 7
|
|
|
|
#define DA_MASK 7
|
|
|
|
#define ICE_MASK 0x80000000
|
|
|
|
#define DCE_MASK 0x40000000
|
|
|
|
|
|
|
|
#define CP0_BRCM_CONFIG0 $22, 0
|
|
|
|
#define CP0_BRCM_MODE $22, 1
|
|
|
|
#define CP0_CONFIG_K0_MASK 7
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
#define CP0_ICACHE_TAG_LO $28
|
|
|
|
#define CP0_ICACHE_DATA_LO $28, 1
|
|
|
|
#define CP0_DCACHE_TAG_LO $28, 2
|
2016-02-03 19:14:50 -07:00
|
|
|
#define CP0_D_SEC_CACHE_DATA_LO $28, 3
|
2016-04-12 17:17:57 -06:00
|
|
|
#define CP0_ICACHE_TAG_HI $29
|
|
|
|
#define CP0_ICACHE_DATA_HI $29, 1
|
|
|
|
#define CP0_DCACHE_TAG_HI $29, 2
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
#define CP0_BRCM_MODE_Luc_MASK (1 << 11)
|
|
|
|
#define CP0_BRCM_CONFIG0_CWF_MASK (1 << 20)
|
|
|
|
#define CP0_BRCM_CONFIG0_TSE_MASK (1 << 19)
|
|
|
|
#define CP0_BRCM_MODE_SET_MASK (1 << 7)
|
|
|
|
#define CP0_BRCM_MODE_ClkRATIO_MASK (7 << 4)
|
|
|
|
#define CP0_BRCM_MODE_BrPRED_MASK (3 << 24)
|
|
|
|
#define CP0_BRCM_MODE_BrPRED_SHIFT 24
|
|
|
|
#define CP0_BRCM_MODE_BrHIST_MASK (0x1f << 20)
|
|
|
|
#define CP0_BRCM_MODE_BrHIST_SHIFT 20
|
|
|
|
|
|
|
|
/* ZSC L2 Cache Register Access Register Definitions */
|
2016-04-12 17:17:57 -06:00
|
|
|
#define BRCM_ZSC_ALL_REGS_SELECT 0x7 << 24
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
#define BRCM_ZSC_CONFIG_REG 0 << 3
|
|
|
|
#define BRCM_ZSC_REQ_BUFFER_REG 2 << 3
|
|
|
|
#define BRCM_ZSC_RBUS_ADDR_MAPPING_REG0 4 << 3
|
|
|
|
#define BRCM_ZSC_RBUS_ADDR_MAPPING_REG1 6 << 3
|
|
|
|
#define BRCM_ZSC_RBUS_ADDR_MAPPING_REG2 8 << 3
|
|
|
|
|
|
|
|
#define BRCM_ZSC_SCB0_ADDR_MAPPING_REG0 0xa << 3
|
|
|
|
#define BRCM_ZSC_SCB0_ADDR_MAPPING_REG1 0xc << 3
|
|
|
|
|
|
|
|
#define BRCM_ZSC_SCB1_ADDR_MAPPING_REG0 0xe << 3
|
|
|
|
#define BRCM_ZSC_SCB1_ADDR_MAPPING_REG1 0x10 << 3
|
|
|
|
|
|
|
|
#define BRCM_ZSC_CONFIG_LMB1En 1 << (15)
|
|
|
|
#define BRCM_ZSC_CONFIG_LMB0En 1 << (14)
|
|
|
|
|
|
|
|
/* branch predition values */
|
|
|
|
|
|
|
|
#define BRCM_BrPRED_ALL_TAKEN (0x0)
|
|
|
|
#define BRCM_BrPRED_ALL_NOT_TAKEN (0x1)
|
|
|
|
#define BRCM_BrPRED_BHT_ENABLE (0x2)
|
|
|
|
#define BRCM_BrPRED_PREDICT_BACKWARD (0x3)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.align 2
|
|
|
|
/*
|
|
|
|
* Function: size_i_cache
|
|
|
|
* Arguments: None
|
|
|
|
* Returns: v0 = i cache size, v1 = I cache line size
|
|
|
|
* Description: compute the I-cache size and I-cache line size
|
|
|
|
* Trashes: v0, v1, a0, t0
|
|
|
|
*
|
|
|
|
* pseudo code:
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
LEAF(size_i_cache)
|
2016-04-12 17:17:57 -06:00
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 a0, CP0_CONFIG, 1
|
2016-02-03 19:14:50 -07:00
|
|
|
move t0, a0
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine sets per way: IS
|
|
|
|
*
|
|
|
|
* This field contains the number of sets (i.e., indices) per way of
|
|
|
|
* the instruction cache:
|
|
|
|
* i) 0x0: 64, ii) 0x1: 128, iii) 0x2: 256, iv) 0x3: 512, v) 0x4: 1k
|
|
|
|
* vi) 0x5 - 0x7: Reserved.
|
|
|
|
*/
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
srl a0, a0, IS_SHIFT
|
|
|
|
and a0, a0, IS_MASK
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/* sets per way = (64<<IS) */
|
|
|
|
|
|
|
|
li v0, 0x40
|
2016-04-12 17:17:57 -06:00
|
|
|
sllv v0, v0, a0
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine line size
|
|
|
|
*
|
|
|
|
* This field contains the line size of the instruction cache:
|
|
|
|
* i) 0x0: No I-cache present, i) 0x3: 16 bytes, ii) 0x4: 32 bytes, iii)
|
|
|
|
* 0x5: 64 bytes, iv) the rest: Reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
move a0, t0
|
|
|
|
|
|
|
|
srl a0, a0, IL_SHIFT
|
|
|
|
and a0, a0, IL_MASK
|
|
|
|
|
|
|
|
beqz a0, no_i_cache
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* line size = 2 ^ (IL+1) */
|
|
|
|
|
|
|
|
addi a0, a0, 1
|
|
|
|
li v1, 1
|
|
|
|
sll v1, v1, a0
|
|
|
|
|
|
|
|
/* v0 now have sets per way, multiply it by line size now
|
|
|
|
* that will give the set size
|
|
|
|
*/
|
|
|
|
|
|
|
|
sll v0, v0, a0
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine set associativity
|
|
|
|
*
|
|
|
|
* This field contains the set associativity of the instruction cache.
|
|
|
|
* i) 0x0: Direct mapped, ii) 0x1: 2-way, iii) 0x2: 3-way, iv) 0x3:
|
|
|
|
* 4-way, v) 0x4 - 0x7: Reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
move a0, t0
|
|
|
|
|
|
|
|
srl a0, a0, IA_SHIFT
|
|
|
|
and a0, a0, IA_MASK
|
|
|
|
addi a0, a0, 0x1
|
|
|
|
|
|
|
|
/* v0 has the set size, multiply it by
|
|
|
|
* set associativiy, to get the cache size
|
|
|
|
*/
|
|
|
|
|
|
|
|
multu v0, a0 /*multu is interlocked, so no need to insert nops */
|
2016-04-12 17:17:57 -06:00
|
|
|
mflo v0
|
2016-02-03 19:14:50 -07:00
|
|
|
b 1f
|
|
|
|
nop
|
|
|
|
|
|
|
|
no_i_cache:
|
2016-04-12 17:17:57 -06:00
|
|
|
move v0, zero
|
2016-02-03 19:14:50 -07:00
|
|
|
move v1, zero
|
|
|
|
1:
|
2016-04-12 17:17:57 -06:00
|
|
|
jr ra
|
2016-02-03 19:14:50 -07:00
|
|
|
nop
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
END(size_i_cache)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: size_d_cache
|
|
|
|
* Arguments: None
|
|
|
|
* Returns: v0 = d cache size, v1 = d cache line size
|
|
|
|
* Description: compute the D-cache size and D-cache line size.
|
|
|
|
* Trashes: v0, v1, a0, t0
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
LEAF(size_d_cache)
|
2016-04-12 17:17:57 -06:00
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 a0, CP0_CONFIG, 1
|
2016-02-03 19:14:50 -07:00
|
|
|
move t0, a0
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine sets per way: IS
|
|
|
|
*
|
|
|
|
* This field contains the number of sets (i.e., indices) per way of
|
|
|
|
* the instruction cache:
|
|
|
|
* i) 0x0: 64, ii) 0x1: 128, iii) 0x2: 256, iv) 0x3: 512, v) 0x4: 1k
|
|
|
|
* vi) 0x5 - 0x7: Reserved.
|
|
|
|
*/
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
srl a0, a0, DS_SHIFT
|
|
|
|
and a0, a0, DS_MASK
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/* sets per way = (64<<IS) */
|
|
|
|
|
|
|
|
li v0, 0x40
|
2016-04-12 17:17:57 -06:00
|
|
|
sllv v0, v0, a0
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine line size
|
|
|
|
*
|
|
|
|
* This field contains the line size of the instruction cache:
|
|
|
|
* i) 0x0: No I-cache present, i) 0x3: 16 bytes, ii) 0x4: 32 bytes, iii)
|
|
|
|
* 0x5: 64 bytes, iv) the rest: Reserved.
|
|
|
|
*/
|
|
|
|
move a0, t0
|
|
|
|
|
|
|
|
srl a0, a0, DL_SHIFT
|
|
|
|
and a0, a0, DL_MASK
|
|
|
|
|
|
|
|
beqz a0, no_d_cache
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* line size = 2 ^ (IL+1) */
|
|
|
|
|
|
|
|
addi a0, a0, 1
|
|
|
|
li v1, 1
|
|
|
|
sll v1, v1, a0
|
|
|
|
|
|
|
|
/* v0 now have sets per way, multiply it by line size now
|
|
|
|
* that will give the set size
|
|
|
|
*/
|
|
|
|
|
|
|
|
sll v0, v0, a0
|
|
|
|
|
|
|
|
/* determine set associativity
|
|
|
|
*
|
|
|
|
* This field contains the set associativity of the instruction cache.
|
|
|
|
* i) 0x0: Direct mapped, ii) 0x1: 2-way, iii) 0x2: 3-way, iv) 0x3:
|
|
|
|
* 4-way, v) 0x4 - 0x7: Reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
move a0, t0
|
|
|
|
|
|
|
|
srl a0, a0, DA_SHIFT
|
|
|
|
and a0, a0, DA_MASK
|
|
|
|
addi a0, a0, 0x1
|
|
|
|
|
|
|
|
/* v0 has the set size, multiply it by
|
|
|
|
* set associativiy, to get the cache size
|
|
|
|
*/
|
|
|
|
|
|
|
|
multu v0, a0 /*multu is interlocked, so no need to insert nops */
|
2016-04-12 17:17:57 -06:00
|
|
|
mflo v0
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
b 1f
|
|
|
|
nop
|
|
|
|
|
|
|
|
no_d_cache:
|
2016-04-12 17:17:57 -06:00
|
|
|
move v0, zero
|
2016-02-03 19:14:50 -07:00
|
|
|
move v1, zero
|
|
|
|
1:
|
|
|
|
jr ra
|
|
|
|
nop
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
END(size_d_cache)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: enable_ID
|
|
|
|
* Arguments: None
|
|
|
|
* Returns: None
|
|
|
|
* Description: Enable I and D caches, initialize I and D-caches, also set
|
2016-04-12 17:17:57 -06:00
|
|
|
* hardware delay for d-cache (TP0).
|
2016-02-03 19:14:50 -07:00
|
|
|
* Trashes: t0
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
.global enable_ID
|
|
|
|
.ent enable_ID
|
2016-04-12 17:17:57 -06:00
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
enable_ID:
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_BRCM_CONFIG0
|
2016-02-03 19:14:50 -07:00
|
|
|
or t0, t0, (ICE_MASK | DCE_MASK)
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 t0, CP0_BRCM_CONFIG0
|
2016-02-03 19:14:50 -07:00
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
|
|
|
|
.end enable_ID
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: l1_init
|
|
|
|
* Arguments: None
|
|
|
|
* Returns: None
|
|
|
|
* Description: Enable I and D caches, and initialize I and D-caches
|
|
|
|
* Trashes: a0, v0, v1, t0, t1, t2, t8
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
.globl l1_init
|
|
|
|
.ent l1_init
|
2016-04-12 17:17:57 -06:00
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
l1_init:
|
|
|
|
|
|
|
|
/* save return address */
|
2016-04-12 17:17:57 -06:00
|
|
|
move t8, ra
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
/* initialize I and D cache Data and Tag registers. */
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 zero, CP0_ICACHE_TAG_LO
|
|
|
|
mtc0 zero, CP0_ICACHE_TAG_HI
|
2016-02-03 19:14:50 -07:00
|
|
|
mtc0 zero, CP0_ICACHE_DATA_LO
|
|
|
|
mtc0 zero, CP0_ICACHE_DATA_HI
|
|
|
|
mtc0 zero, CP0_DCACHE_TAG_LO
|
|
|
|
mtc0 zero, CP0_DCACHE_TAG_HI
|
|
|
|
|
|
|
|
/* Enable Caches before Clearing. If the caches are disabled
|
|
|
|
* then the cache operations to clear the cache will be ignored
|
|
|
|
*/
|
|
|
|
|
|
|
|
jal enable_ID
|
|
|
|
nop
|
|
|
|
|
|
|
|
jal size_i_cache /* v0 = i-cache size, v1 = i-cache line size */
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* run uncached in kseg 1 */
|
|
|
|
la k0, 1f
|
|
|
|
lui k1, 0x2000
|
|
|
|
or k0, k1, k0
|
|
|
|
jr k0
|
|
|
|
nop
|
|
|
|
1:
|
|
|
|
|
|
|
|
/*
|
|
|
|
* set K0 cache mode
|
|
|
|
*/
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_CONFIG
|
|
|
|
and t0, t0, ~CP0_CONFIG_K0_MASK
|
|
|
|
or t0, t0, 3 /* Write Back mode */
|
|
|
|
mtc0 t0, CP0_CONFIG
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/*
|
2016-04-12 17:17:57 -06:00
|
|
|
* Initialize instruction cache.
|
2016-02-03 19:14:50 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
li a0, KSEG0
|
|
|
|
cacheop(a0, v0, v1, Index_Store_Tag_I)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Now we can run from I-$, kseg 0
|
|
|
|
*/
|
|
|
|
la k0, 1f
|
|
|
|
lui k1, 0x2000
|
|
|
|
or k0, k1, k0
|
|
|
|
xor k0, k1, k0
|
|
|
|
jr k0
|
|
|
|
nop
|
|
|
|
1:
|
|
|
|
/*
|
2016-04-12 17:17:57 -06:00
|
|
|
* Initialize data cache.
|
2016-02-03 19:14:50 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
jal size_d_cache /* v0 = d-cache size, v1 = d-cache line size */
|
|
|
|
nop
|
|
|
|
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
li a0, KSEG0
|
2016-02-03 19:14:50 -07:00
|
|
|
cacheop(a0, v0, v1, Index_Store_Tag_D)
|
|
|
|
|
|
|
|
jr t8
|
|
|
|
nop
|
|
|
|
|
|
|
|
.end l1_init
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_other_config
|
|
|
|
* Arguments: none
|
|
|
|
* Returns: None
|
|
|
|
* Description: initialize other remainder configuration to defaults.
|
|
|
|
* Trashes: t0, t1
|
|
|
|
*
|
|
|
|
* pseudo code:
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
LEAF(set_other_config)
|
|
|
|
.set noreorder
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
/* enable Bus error for I-fetch */
|
|
|
|
mfc0 t0, CP0_CACHEERR, 0
|
|
|
|
li t1, 0x4
|
|
|
|
or t0, t1
|
2016-02-03 19:14:50 -07:00
|
|
|
mtc0 t0, CP0_CACHEERR, 0
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
/* enable Bus error for Load */
|
|
|
|
mfc0 t0, CP0_CACHEERR, 1
|
|
|
|
li t1, 0x4
|
|
|
|
or t0, t1
|
2016-02-03 19:14:50 -07:00
|
|
|
mtc0 t0, CP0_CACHEERR, 1
|
|
|
|
|
|
|
|
/* enable Bus Error for Store */
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_CACHEERR, 2
|
2016-02-03 19:14:50 -07:00
|
|
|
li t1, 0x4
|
|
|
|
or t0, t1
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 t0, CP0_CACHEERR, 2
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
.set reorder
|
|
|
|
END(set_other_config)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_branch_pred
|
|
|
|
* Arguments: none
|
|
|
|
* Returns: None
|
|
|
|
* Description:
|
|
|
|
* Trashes: t0, t1
|
|
|
|
*
|
|
|
|
* pseudo code:
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
LEAF(set_branch_pred)
|
|
|
|
.set noreorder
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_BRCM_MODE
|
2016-02-03 19:14:50 -07:00
|
|
|
li t1, ~(CP0_BRCM_MODE_BrPRED_MASK | CP0_BRCM_MODE_BrHIST_MASK )
|
|
|
|
and t0, t0, t1
|
|
|
|
|
|
|
|
/* enable Branch prediction */
|
|
|
|
li t1, BRCM_BrPRED_BHT_ENABLE
|
|
|
|
sll t1, CP0_BRCM_MODE_BrPRED_SHIFT
|
|
|
|
or t0, t0, t1
|
|
|
|
|
|
|
|
/* set history count to 8 */
|
|
|
|
li t1, 8
|
|
|
|
sll t1, CP0_BRCM_MODE_BrHIST_SHIFT
|
|
|
|
or t0, t0, t1
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 t0, CP0_BRCM_MODE
|
2016-02-03 19:14:50 -07:00
|
|
|
jr ra
|
|
|
|
nop
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
END(set_branch_pred)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_luc
|
|
|
|
* Arguments: set link uncached.
|
|
|
|
* Returns: None
|
|
|
|
* Description:
|
|
|
|
* Trashes: t0, t1
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
LEAF(set_luc)
|
|
|
|
.set noreorder
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_BRCM_MODE
|
2016-02-03 19:14:50 -07:00
|
|
|
li t1, ~(CP0_BRCM_MODE_Luc_MASK)
|
|
|
|
and t0, t0, t1
|
|
|
|
|
|
|
|
/* set Luc */
|
2016-04-12 17:17:57 -06:00
|
|
|
ori t0, t0, CP0_BRCM_MODE_Luc_MASK
|
2016-02-03 19:14:50 -07:00
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 t0, CP0_BRCM_MODE
|
2016-02-03 19:14:50 -07:00
|
|
|
jr ra
|
|
|
|
nop
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
END(set_luc)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_cwf_tse
|
|
|
|
* Arguments: set CWF and TSE bits
|
|
|
|
* Returns: None
|
|
|
|
* Description:
|
|
|
|
* Trashes: t0, t1
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
LEAF(set_cwf_tse)
|
|
|
|
.set noreorder
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_BRCM_CONFIG0
|
2016-02-03 19:14:50 -07:00
|
|
|
li t1, (CP0_BRCM_CONFIG0_CWF_MASK | CP0_BRCM_CONFIG0_TSE_MASK)
|
|
|
|
or t0, t0, t1
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 t0, CP0_BRCM_CONFIG0
|
2016-02-03 19:14:50 -07:00
|
|
|
jr ra
|
|
|
|
nop
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
END(set_cwf_tse)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_clock_ratio
|
2016-04-12 17:17:57 -06:00
|
|
|
* Arguments: set clock ratio specified by a0
|
2016-02-03 19:14:50 -07:00
|
|
|
* Returns: None
|
|
|
|
* Description:
|
|
|
|
* Trashes: v0, v1, a0, a1
|
|
|
|
*
|
|
|
|
* pseudo code:
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
LEAF(set_clock_ratio)
|
|
|
|
.set noreorder
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, CP0_BRCM_MODE
|
2016-02-03 19:14:50 -07:00
|
|
|
li t1, ~(CP0_BRCM_MODE_SET_MASK | CP0_BRCM_MODE_ClkRATIO_MASK)
|
|
|
|
and t0, t0, t1
|
|
|
|
li t1, CP0_BRCM_MODE_SET_MASK
|
|
|
|
or t0, t0, t1
|
|
|
|
or t0, t0, a0
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 t0, CP0_BRCM_MODE
|
2016-02-03 19:14:50 -07:00
|
|
|
jr ra
|
|
|
|
nop
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
END(set_clock_ratio)
|
|
|
|
/*
|
|
|
|
* Function: set_zephyr
|
2016-04-12 17:17:57 -06:00
|
|
|
* Arguments: None
|
|
|
|
* Returns: None
|
2016-02-03 19:14:50 -07:00
|
|
|
* Description: Set any zephyr bits
|
2016-04-12 17:17:57 -06:00
|
|
|
* Trashes: t0 & t1
|
2016-02-03 19:14:50 -07:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
LEAF(set_zephyr)
|
2016-04-12 17:17:57 -06:00
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
/* enable read/write of CP0 #22 sel. 8 */
|
|
|
|
li t0, 0x5a455048
|
|
|
|
.word 0x4088b00f /* mtc0 t0, $22, 15 */
|
2016-02-03 19:14:50 -07:00
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
.word 0x4008b008 /* mfc0 t0, $22, 8 */
|
|
|
|
li t1, 0x09008000 /* turn off pref, jtb */
|
|
|
|
or t0, t0, t1
|
|
|
|
.word 0x4088b008 /* mtc0 t0, $22, 8 */
|
|
|
|
sync
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
/* disable read/write of CP0 #22 sel 8 */
|
2016-04-12 17:17:57 -06:00
|
|
|
li t0, 0x0
|
|
|
|
.word 0x4088b00f /* mtc0 t0, $22, 15 */
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
jr ra
|
|
|
|
nop
|
2016-02-03 19:14:50 -07:00
|
|
|
.set reorder
|
|
|
|
|
|
|
|
END(set_zephyr)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2016-04-12 17:17:57 -06:00
|
|
|
* Function: set_llmb
|
|
|
|
* Arguments: a0=0 disable llmb, a0=1 enables llmb
|
|
|
|
* Returns: None
|
2016-02-03 19:14:50 -07:00
|
|
|
* Description:
|
2016-04-12 17:17:57 -06:00
|
|
|
* Trashes: t0, t1, t2
|
2016-02-03 19:14:50 -07:00
|
|
|
*
|
|
|
|
* pseudo code:
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
LEAF(set_llmb)
|
|
|
|
.set noreorder
|
|
|
|
|
|
|
|
li t2, 0x90000000 | BRCM_ZSC_ALL_REGS_SELECT | BRCM_ZSC_CONFIG_REG
|
|
|
|
sync
|
|
|
|
cache 0x7, 0x0(t2)
|
|
|
|
sync
|
|
|
|
mfc0 t0, CP0_D_SEC_CACHE_DATA_LO
|
|
|
|
li t1, ~(BRCM_ZSC_CONFIG_LMB1En | BRCM_ZSC_CONFIG_LMB0En)
|
|
|
|
and t0, t0, t1
|
|
|
|
|
|
|
|
beqz a0, svlmb
|
|
|
|
nop
|
|
|
|
|
|
|
|
enable_lmb:
|
|
|
|
li t1, (BRCM_ZSC_CONFIG_LMB1En | BRCM_ZSC_CONFIG_LMB0En)
|
|
|
|
or t0, t0, t1
|
|
|
|
|
|
|
|
svlmb:
|
|
|
|
mtc0 t0, CP0_D_SEC_CACHE_DATA_LO
|
|
|
|
sync
|
|
|
|
cache 0xb, 0x0(t2)
|
|
|
|
sync
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
jr ra
|
2016-02-03 19:14:50 -07:00
|
|
|
nop
|
|
|
|
.set reorder
|
|
|
|
|
|
|
|
END(set_llmb)
|
|
|
|
/*
|
|
|
|
* Function: core_init
|
|
|
|
* Arguments: none
|
|
|
|
* Returns: None
|
|
|
|
* Description: initialize core related configuration
|
|
|
|
* Trashes: v0,v1,a0,a1,t8
|
|
|
|
*
|
|
|
|
* pseudo code:
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
.globl core_init
|
2016-04-12 17:17:57 -06:00
|
|
|
.ent core_init
|
2016-02-03 19:14:50 -07:00
|
|
|
.set noreorder
|
|
|
|
core_init:
|
|
|
|
move t8, ra
|
|
|
|
|
|
|
|
/* set Zephyr bits. */
|
|
|
|
bal set_zephyr
|
|
|
|
nop
|
|
|
|
|
|
|
|
#if ENABLE_FPU==1
|
|
|
|
/* initialize the Floating point unit (both TPs) */
|
|
|
|
bal init_fpu
|
|
|
|
nop
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* set low latency memory bus */
|
2016-04-12 17:17:57 -06:00
|
|
|
li a0, 1
|
|
|
|
bal set_llmb
|
2016-02-03 19:14:50 -07:00
|
|
|
nop
|
|
|
|
|
|
|
|
/* set branch prediction (TP0 only) */
|
|
|
|
bal set_branch_pred
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* set link uncached */
|
|
|
|
bal set_luc
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* set CWF and TSE */
|
2016-04-12 17:17:57 -06:00
|
|
|
bal set_cwf_tse
|
2016-02-03 19:14:50 -07:00
|
|
|
nop
|
|
|
|
|
|
|
|
/*
|
|
|
|
*set clock ratio by setting 1 to 'set'
|
|
|
|
* and 0 to ClkRatio, (TP0 only)
|
|
|
|
*/
|
|
|
|
li a0, 0
|
|
|
|
bal set_clock_ratio
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* set other configuration to defaults */
|
|
|
|
bal set_other_config
|
|
|
|
nop
|
|
|
|
|
|
|
|
move ra, t8
|
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
|
|
|
|
.set reorder
|
|
|
|
.end core_init
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: clear_jump_target_buffer
|
2016-04-12 17:17:57 -06:00
|
|
|
* Arguments: None
|
|
|
|
* Returns: None
|
2016-02-03 19:14:50 -07:00
|
|
|
* Description:
|
2016-04-12 17:17:57 -06:00
|
|
|
* Trashes: t0, t1, t2
|
2016-02-03 19:14:50 -07:00
|
|
|
*
|
|
|
|
*/
|
2016-04-12 17:17:57 -06:00
|
|
|
#define RESET_CALL_RETURN_STACK_THIS_THREAD (0x06<<16)
|
|
|
|
#define RESET_JUMP_TARGET_BUFFER_THIS_THREAD (0x04<<16)
|
2016-02-03 19:14:50 -07:00
|
|
|
#define JTB_CS_CNTL_MASK (0xFF<<16)
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
.globl clear_jump_target_buffer
|
|
|
|
.ent clear_jump_target_buffer
|
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
clear_jump_target_buffer:
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mfc0 t0, $22, 2
|
|
|
|
nop
|
|
|
|
nop
|
|
|
|
|
|
|
|
li t1, ~JTB_CS_CNTL_MASK
|
|
|
|
and t0, t0, t1
|
|
|
|
li t2, RESET_CALL_RETURN_STACK_THIS_THREAD
|
|
|
|
or t0, t0, t2
|
|
|
|
mtc0 t0, $22, 2
|
|
|
|
nop
|
|
|
|
nop
|
|
|
|
|
|
|
|
and t0, t0, t1
|
|
|
|
li t2, RESET_JUMP_TARGET_BUFFER_THIS_THREAD
|
|
|
|
or t0, t0, t2
|
|
|
|
mtc0 t0, $22, 2
|
|
|
|
nop
|
|
|
|
nop
|
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
|
|
|
|
.end clear_jump_target_buffer
|
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
/*
|
|
|
|
* Function: bmips_cache_init
|
|
|
|
* Arguments: None
|
|
|
|
* Returns: None
|
|
|
|
* Description: Enable I and D caches, and initialize I and D-caches
|
|
|
|
* Trashes: v0, v1, t0, t1, t2, t5, t7, t8
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
.globl bmips_5xxx_init
|
|
|
|
.ent bmips_5xxx_init
|
2016-04-12 17:17:57 -06:00
|
|
|
.set noreorder
|
2016-02-03 19:14:50 -07:00
|
|
|
bmips_5xxx_init:
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
/* save return address and A0 */
|
|
|
|
move t7, ra
|
2016-02-03 19:14:50 -07:00
|
|
|
move t5, a0
|
|
|
|
|
|
|
|
jal l1_init
|
|
|
|
nop
|
|
|
|
|
|
|
|
jal core_init
|
|
|
|
nop
|
|
|
|
|
|
|
|
jal clear_jump_target_buffer
|
|
|
|
nop
|
|
|
|
|
2016-04-12 17:17:57 -06:00
|
|
|
mtc0 zero, CP0_CAUSE
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
move a0, t5
|
|
|
|
jr t7
|
|
|
|
nop
|
|
|
|
|
|
|
|
.end bmips_5xxx_init
|
2016-04-12 17:17:57 -06:00
|
|
|
.set reorder
|
2016-02-03 19:14:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
#endif
|