blob: 045f5af618ffae17ec197dc45886ef25b90fffff [file] [log] [blame]
/*-------------------------------------------------------------------------
*
* Copyright (c) 2014, Microchip Technology Inc. and its subsidiaries ("Microchip")
* All rights reserved.
*
* This software is developed by Microchip Technology Inc. and its
* subsidiaries ("Microchip").
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* 3. Microchip's name may not be used to endorse or promote products
* derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY MICROCHIP "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL MICROCHIP BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING BUT NOT LIMITED TO
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWSOEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*-------------------------------------------------------------------------*/
#include <xc.h>
#include <cp0defs.h>
#define CFG1_MMUSSHIFT 25
.weak __pic32_tlb_init_values_count
.weak __pic32_tlb_init_values_begin
.weak __pic32_tlb_init_values_end
.section .tlb.__pic32_tlb_init_ebi_sqi, code, keep
.set nomips16
.set noreorder
.global __pic32_tlb_init_ebi_sqi
.ent __pic32_tlb_init_ebi_sqi
__pic32_tlb_init_ebi_sqi:
/* Determine if we have a TLB */
/* Read C0 Config0 */
mfc0 v1, _CP0_CONFIG
/* check MT field */
ext v1, v1, 7, 3
li a3, 0x1
bne v1, a3, __done_init_tlb
/* read C0 Config1 */
mfc0 v0, _CP0_CONFIG1
__start_init_tlb:
/* Extract MMU Size */
ext v1, v0, CFG1_MMUSSHIFT, 6
mtc0 zero, _CP0_ENTRYLO0
mtc0 zero, _CP0_ENTRYLO1
mtc0 zero, _CP0_PAGEMASK
mtc0 zero, _CP0_WIRED
move a0, $0
lui a0, 0x8000
__next_tlb_entry_pair:
mtc0 v1, _CP0_INDEX
mtc0 a0, _CP0_ENTRYHI
ehb
tlbwi
add a0, (2<<13)
add v1, -1
bne v1, zero, __next_tlb_entry_pair
nop
/* Get the count of the entries in the table from a linker-script symbol */
__count_tlb_init_values:
lui a0, %hi(__pic32_tlb_init_values_count)
ori a0, %lo(__pic32_tlb_init_values_count)
__device_tlb_entries:
/* Set lowest count (a0) TLB entries as fixed (entry 0 and entry 1) */
mtc0 a0, _CP0_WIRED
/* Point a1 to the beginning of the linker-script generated table */
la a1, __pic32_tlb_init_values_begin
la a2, __pic32_tlb_init_values_end
move a3, zero /* index */
/* Loop through the tables until we have done the correct number of iterations. */
/* When the current pointer (a1) points to the end of the table (a2) we are done. */
1:
beq a1, a2, __done_init_tlb /* done */
/* Create one page table entry consisting of two 16MB physical pages */
/* 16MB page mask for Entry 0 */
lui t1,0x01FF /* in branch delay slot */
ori t1,t1,0xE000
mtc0 t1, _CP0_PAGEMASK
/* TLB entry index */
mtc0 a3, _CP0_INDEX
/* Each entry consists of three words */
lw t0, 0(a1) /* ENTRYHI */
lw t1, 4(a1) /* ENTRYLO0 */
lw t2, 8(a1) /* ENTRYLO1 */
/* physical base address <31:12>, cacheable (write back), dirty, global set */
/* First 32MB page in Entrylo0 */
mtc0 t1, _CP0_ENTRYLO0
/* Second 32MB page in EntryLo1 */
mtc0 t2, _CP0_ENTRYLO1
/* virtual base address (ASID 0) */
mtc0 t0, _CP0_ENTRYHI
ehb
tlbwi
/* Next entry */
add a1, 12 /* Point to next entry (WORD_SIZE * 3) */
add a3, 1 /* Increment index */
b 1b
nop
__done_init_tlb:
jr ra
nop
.size __pic32_tlb_init_ebi_sqi,.-__pic32_tlb_init_ebi_sqi; .end __pic32_tlb_init_ebi_sqi;