Skip to content

Commit 3ffc17d

Browse files
paulburtonralfbaechle
authored andcommitted
MIPS: Adjust MIPS64 CAC_BASE to reflect Config.K0
On MIPS64 we define the default CAC_BASE as one of the xkphys regions of the virtual address space. Since the CCA is encoded in bits 61:59 of xkphys addresses, fixing CAC_BASE to any particular one prevents us from dynamically changing the CCA as we do for MIPS32 where CAC_BASE is placed within kseg0. In order to make the kernel more generic, drop the current kludge that gives CAC_BASE CCA=3 if CONFIG_DMA_NONCOHERENT is selected (disregarding CONFIG_DMA_MAYBE_COHERENT) & CCA=5 (which is not standardised by the architecture) otherwise. Instead read Config.K0 and generate the appropriate offset into xkphys, presuming that either the bootloader or early kernel code will have configured Config.K0 appropriately. This seems like the best option for a generic implementation. The ip27 spaces.h is adjusted to set its former value of CAC_BASE, since it's the only user of CAC_BASE from assembly (in its smp_slave_setup macro). This allows the generic case to focus solely on C code without breaking ip27. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/14351/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
1 parent dabdc18 commit 3ffc17d

File tree

3 files changed

+5
-7
lines changed

3 files changed

+5
-7
lines changed

arch/mips/include/asm/addrspace.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@
126126
#define PHYS_TO_XKSEG_UNCACHED(p) PHYS_TO_XKPHYS(K_CALG_UNCACHED, (p))
127127
#define PHYS_TO_XKSEG_CACHED(p) PHYS_TO_XKPHYS(K_CALG_COH_SHAREABLE, (p))
128128
#define XKPHYS_TO_PHYS(p) ((p) & TO_PHYS_MASK)
129-
#define PHYS_TO_XKPHYS(cm, a) (_CONST64_(0x8000000000000000) | \
130-
(_CONST64_(cm) << 59) | (a))
129+
#define PHYS_TO_XKPHYS(cm, a) (XKPHYS | (_ACAST64_(cm) << 59) | (a))
131130

132131
/*
133132
* The ultimate limited of the 64-bit MIPS architecture: 2 bits for selecting

arch/mips/include/asm/mach-generic/spaces.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
#include <linux/const.h>
1414

15+
#include <asm/mipsregs.h>
16+
1517
/*
1618
* This gives the physical RAM offset.
1719
*/
@@ -52,11 +54,7 @@
5254
#ifdef CONFIG_64BIT
5355

5456
#ifndef CAC_BASE
55-
#ifdef CONFIG_DMA_NONCOHERENT
56-
#define CAC_BASE _AC(0x9800000000000000, UL)
57-
#else
58-
#define CAC_BASE _AC(0xa800000000000000, UL)
59-
#endif
57+
#define CAC_BASE PHYS_TO_XKPHYS(read_c0_config() & CONF_CM_CMASK, 0)
6058
#endif
6159

6260
#ifndef IO_BASE

arch/mips/include/asm/mach-ip27/spaces.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define IO_BASE 0x9200000000000000
2020
#define MSPEC_BASE 0x9400000000000000
2121
#define UNCAC_BASE 0x9600000000000000
22+
#define CAC_BASE 0xa800000000000000
2223

2324
#define TO_MSPEC(x) (MSPEC_BASE | ((x) & TO_PHYS_MASK))
2425
#define TO_HSPEC(x) (HSPEC_BASE | ((x) & TO_PHYS_MASK))

0 commit comments

Comments
 (0)