blob: 9029092aa740df636c2be53033ae3c3399c337ee [file] [log] [blame]
David Daney5b3b1682009-01-08 16:46:40 -08001/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 2006 Cavium Networks
7 * Cache error handler
8 */
9
10#include <asm/asm.h>
11#include <asm/regdef.h>
12#include <asm/mipsregs.h>
13#include <asm/stackframe.h>
14
15/*
16 * Handle cache error. Indicate to the second level handler whether
17 * the exception is recoverable.
18 */
19 LEAF(except_vec2_octeon)
20
Ralf Baechle70342282013-01-22 12:59:30 +010021 .set push
David Daney5b3b1682009-01-08 16:46:40 -080022 .set mips64r2
23 .set noreorder
24 .set noat
25
26
27 /* due to an errata we need to read the COP0 CacheErr (Dcache)
28 * before any cache/DRAM access */
29
Ralf Baechle70342282013-01-22 12:59:30 +010030 rdhwr k0, $0 /* get core_id */
31 PTR_LA k1, cache_err_dcache
32 sll k0, k0, 3
David Daney5b3b1682009-01-08 16:46:40 -080033 PTR_ADDU k1, k0, k1 /* k1 = &cache_err_dcache[core_id] */
34
Ralf Baechle70342282013-01-22 12:59:30 +010035 dmfc0 k0, CP0_CACHEERR, 1
36 sd k0, (k1)
37 dmtc0 $0, CP0_CACHEERR, 1
David Daney5b3b1682009-01-08 16:46:40 -080038
Ralf Baechle70342282013-01-22 12:59:30 +010039 /* check whether this is a nested exception */
40 mfc0 k1, CP0_STATUS
41 andi k1, k1, ST0_EXL
42 beqz k1, 1f
David Daney5b3b1682009-01-08 16:46:40 -080043 nop
44 j cache_parity_error_octeon_non_recoverable
45 nop
46
47 /* exception is recoverable */
481: j handle_cache_err
49 nop
50
Ralf Baechle70342282013-01-22 12:59:30 +010051 .set pop
David Daney5b3b1682009-01-08 16:46:40 -080052 END(except_vec2_octeon)
53
54 /* We need to jump to handle_cache_err so that the previous handler
55 * can fit within 0x80 bytes. We also move from 0xFFFFFFFFAXXXXXXX
Ralf Baechle70342282013-01-22 12:59:30 +010056 * space (uncached) to the 0xFFFFFFFF8XXXXXXX space (cached). */
David Daney5b3b1682009-01-08 16:46:40 -080057 LEAF(handle_cache_err)
Ralf Baechle70342282013-01-22 12:59:30 +010058 .set push
59 .set noreorder
60 .set noat
David Daney5b3b1682009-01-08 16:46:40 -080061
62 SAVE_ALL
63 KMODE
Ralf Baechle70342282013-01-22 12:59:30 +010064 jal cache_parity_error_octeon_recoverable
David Daney5b3b1682009-01-08 16:46:40 -080065 nop
Ralf Baechle70342282013-01-22 12:59:30 +010066 j ret_from_exception
David Daney5b3b1682009-01-08 16:46:40 -080067 nop
68
69 .set pop
70 END(handle_cache_err)