Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Paul Burton and committed by
Ralf Baechle
3ffc17d8 dabdc185

+5 -7
+1 -2
arch/mips/include/asm/addrspace.h
··· 126 126 #define PHYS_TO_XKSEG_UNCACHED(p) PHYS_TO_XKPHYS(K_CALG_UNCACHED, (p)) 127 127 #define PHYS_TO_XKSEG_CACHED(p) PHYS_TO_XKPHYS(K_CALG_COH_SHAREABLE, (p)) 128 128 #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)) 131 130 132 131 /* 133 132 * The ultimate limited of the 64-bit MIPS architecture: 2 bits for selecting
+3 -5
arch/mips/include/asm/mach-generic/spaces.h
··· 12 12 13 13 #include <linux/const.h> 14 14 15 + #include <asm/mipsregs.h> 16 + 15 17 /* 16 18 * This gives the physical RAM offset. 17 19 */ ··· 54 52 #ifdef CONFIG_64BIT 55 53 56 54 #ifndef CAC_BASE 57 - #ifdef CONFIG_DMA_NONCOHERENT 58 - #define CAC_BASE _AC(0x9800000000000000, UL) 59 - #else 60 - #define CAC_BASE _AC(0xa800000000000000, UL) 61 - #endif 55 + #define CAC_BASE PHYS_TO_XKPHYS(read_c0_config() & CONF_CM_CMASK, 0) 62 56 #endif 63 57 64 58 #ifndef IO_BASE
+1
arch/mips/include/asm/mach-ip27/spaces.h
··· 19 19 #define IO_BASE 0x9200000000000000 20 20 #define MSPEC_BASE 0x9400000000000000 21 21 #define UNCAC_BASE 0x9600000000000000 22 + #define CAC_BASE 0xa800000000000000 22 23 23 24 #define TO_MSPEC(x) (MSPEC_BASE | ((x) & TO_PHYS_MASK)) 24 25 #define TO_HSPEC(x) (HSPEC_BASE | ((x) & TO_PHYS_MASK))