Module Name: src Committed By: skrll Date: Sun May 21 06:49:13 UTC 2017
Modified Files: src/sys/arch/evbmips/ingenic: clock.c cpu.c intr.c machdep.c mainbus.c src/sys/arch/mips/conf: files.ingenic src/sys/arch/mips/ingenic: ingenic_regs.h ingenic_var.h Added Files: src/sys/arch/mips/ingenic: ingenic_coreregs.h src/sys/arch/mips/mips: locore_ingenic.S Log Message: Provide and use some CP0 accessor functions instead of M[TF]C0 macros for readability. While here convert some other M[TF]C0 uses to already exising accessor functions, e.g. mipsNN_cp0_ebase_read To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbmips/ingenic/clock.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbmips/ingenic/cpu.c cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbmips/ingenic/intr.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/evbmips/ingenic/machdep.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/evbmips/ingenic/mainbus.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/mips/conf/files.ingenic cvs rdiff -u -r0 -r1.1 src/sys/arch/mips/ingenic/ingenic_coreregs.h cvs rdiff -u -r1.24 -r1.25 src/sys/arch/mips/ingenic/ingenic_regs.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/mips/ingenic/ingenic_var.h cvs rdiff -u -r0 -r1.1 src/sys/arch/mips/mips/locore_ingenic.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbmips/ingenic/clock.c diff -u src/sys/arch/evbmips/ingenic/clock.c:1.9 src/sys/arch/evbmips/ingenic/clock.c:1.10 --- src/sys/arch/evbmips/ingenic/clock.c:1.9 Fri May 19 07:40:58 2017 +++ src/sys/arch/evbmips/ingenic/clock.c Sun May 21 06:49:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: clock.c,v 1.9 2017/05/19 07:40:58 skrll Exp $ */ +/* $NetBSD: clock.c,v 1.10 2017/05/21 06:49:12 skrll Exp $ */ /*- * Copyright (c) 2014 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.9 2017/05/19 07:40:58 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.10 2017/05/21 06:49:12 skrll Exp $"); #include "opt_multiprocessor.h" @@ -38,6 +38,7 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1. #include <sys/systm.h> #include <sys/timetc.h> +#include <mips/ingenic/ingenic_var.h> #include <mips/ingenic/ingenic_regs.h> #include "opt_ingenic.h" @@ -236,7 +237,7 @@ ingenic_clockintr(struct clockframe *cf) * XXX * needs to take the IPI lock and ping all online CPUs, not just core 1 */ - MTC0(1 << IPI_CLOCK, 20, 1); + mips_cp0_corembox_write(1, 1 << IPI_CLOCK); #endif hardclock(cf); splx(s); Index: src/sys/arch/evbmips/ingenic/cpu.c diff -u src/sys/arch/evbmips/ingenic/cpu.c:1.3 src/sys/arch/evbmips/ingenic/cpu.c:1.4 --- src/sys/arch/evbmips/ingenic/cpu.c:1.3 Fri May 19 07:40:58 2017 +++ src/sys/arch/evbmips/ingenic/cpu.c Sun May 21 06:49:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.3 2017/05/19 07:40:58 skrll Exp $ */ +/* $NetBSD: cpu.c,v 1.4 2017/05/21 06:49:12 skrll Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.3 2017/05/19 07:40:58 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.4 2017/05/21 06:49:12 skrll Exp $"); #include "opt_ingenic.h" #include "opt_multiprocessor.h" @@ -47,8 +47,9 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.3 #include <sys/cpu.h> #include <mips/locore.h> -#include <mips/asm.h> +#include <mips/ingenic/ingenic_coreregs.h> #include <mips/ingenic/ingenic_regs.h> +#include <mips/ingenic/ingenic_var.h> static int cpu_match(device_t, cfdata_t, void *); static void cpu_attach(device_t, device_t, void *); @@ -85,14 +86,16 @@ cpu_attach(device_t parent, device_t sel ci = startup_cpu_info; wbflush(); vec = (uint32_t)&ingenic_wakeup; - reg = MFC0(12, 4); /* reset entry reg */ + reg = mips_cp0_corereim_read(); reg &= ~REIM_ENTRY_M; reg |= vec; - MTC0(reg, 12, 4); - reg = MFC0(12, 2); /* core control reg */ + mips_cp0_corereim_write(reg); + + reg = mips_cp0_corectrl_read(); reg |= CC_RPC1; /* use our exception vector */ reg &= ~CC_SW_RST1; /* get core 1 out of reset */ - MTC0(reg, 12, 2); + mips_cp0_corectrl_write(reg); + while ((!kcpuset_isset(cpus_hatched, cpu_index(startup_cpu_info))) && (bail > 0)) { delay(1000); bail--; Index: src/sys/arch/evbmips/ingenic/intr.c diff -u src/sys/arch/evbmips/ingenic/intr.c:1.12 src/sys/arch/evbmips/ingenic/intr.c:1.13 --- src/sys/arch/evbmips/ingenic/intr.c:1.12 Sat Aug 27 05:52:43 2016 +++ src/sys/arch/evbmips/ingenic/intr.c Sun May 21 06:49:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.c,v 1.12 2016/08/27 05:52:43 skrll Exp $ */ +/* $NetBSD: intr.c,v 1.13 2017/05/21 06:49:12 skrll Exp $ */ /*- * Copyright (c) 2014 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.12 2016/08/27 05:52:43 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.13 2017/05/21 06:49:12 skrll Exp $"); #define __INTR_PRIVATE @@ -44,7 +44,9 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.1 #include <mips/locore.h> #include <machine/intr.h> +#include <mips/ingenic/ingenic_var.h> #include <mips/ingenic/ingenic_regs.h> +#include <mips/ingenic/ingenic_coreregs.h> #include "opt_ingenic.h" @@ -126,14 +128,15 @@ evbmips_intr_init(void) writereg(JZ_ICMR1, 0xffffffff); /* allow peripheral interrupts to core 0 only */ - reg = MFC0(12, 4); /* reset entry and interrupts */ + reg = mips_cp0_corereim_read(); reg &= 0xffff0000; reg |= REIM_IRQ0_M | REIM_MIRQ0_M; #ifdef MULTIPROCESSOR reg |= REIM_MIRQ1_M; #endif - MTC0(reg, 12, 4); - MTC0(0, 20, 1); /* ping the 2nd core */ + mips_cp0_corereim_write(reg); + + mips_cp0_corembox_write(1, 0); /* ping the 2nd core */ DPRINTF("%s %08x\n", __func__, reg); } @@ -146,12 +149,12 @@ evbmips_iointr(int ipl, uint32_t ipendin #if 0 snprintf(buffer, 256, "pending: %08x CR %08x\n", ipending, - MFC0(MIPS_COP_0_CAUSE, 0)); + mipsNN_cp0_cause_read()); ingenic_puts(buffer); #endif #endif /* see which core we're on */ - id = MFC0(15, 1) & 7; + id = mipsNN_cp0_ebase_read() & 7; /* * XXX @@ -166,12 +169,12 @@ evbmips_iointr(int ipl, uint32_t ipendin int s = splsched(); /* read pending IPIs */ - reg = MFC0(12, 3); + reg = mips_cp0_corestatus_read(); if (id == 0) { if (reg & CS_MIRQ0_P) { #ifdef MULTIPROCESSOR uint32_t tag; - tag = MFC0(CP0_CORE_MBOX, 0); + tag = mips_cp0_corembox_read(id); ipi_process(curcpu(), tag); #ifdef INGENIC_INTR_DEBUG @@ -182,13 +185,13 @@ evbmips_iointr(int ipl, uint32_t ipendin #endif reg &= (~CS_MIRQ0_P); /* clear it */ - MTC0(reg, 12, 3); + mips_cp0_corestatus_write(reg); } } else if (id == 1) { if (reg & CS_MIRQ1_P) { #ifdef MULTIPROCESSOR uint32_t tag; - tag = MFC0(CP0_CORE_MBOX, 1); + tag = mips_cp0_corembox_read(id); ingenic_puts("1"); if (tag & 0x400) hardclock(cf); @@ -201,7 +204,7 @@ evbmips_iointr(int ipl, uint32_t ipendin #endif reg &= (~CS_MIRQ1_P); /* clear it */ - MTC0(reg, 12, 3); + mips_cp0_corestatus_write(reg); } } splx(s); Index: src/sys/arch/evbmips/ingenic/machdep.c diff -u src/sys/arch/evbmips/ingenic/machdep.c:1.13 src/sys/arch/evbmips/ingenic/machdep.c:1.14 --- src/sys/arch/evbmips/ingenic/machdep.c:1.13 Fri May 19 07:40:58 2017 +++ src/sys/arch/evbmips/ingenic/machdep.c Sun May 21 06:49:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.13 2017/05/19 07:40:58 skrll Exp $ */ +/* $NetBSD: machdep.c,v 1.14 2017/05/21 06:49:12 skrll Exp $ */ /*- * Copyright (c) 2014 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.13 2017/05/19 07:40:58 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.14 2017/05/21 06:49:12 skrll Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -61,6 +61,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v #include <mips/locore.h> #include <mips/cpuregs.h> +#include <mips/ingenic/ingenic_coreregs.h> #include <mips/ingenic/ingenic_regs.h> #include <mips/ingenic/ingenic_var.h> @@ -128,12 +129,12 @@ ingenic_cpu_init(struct cpu_info *ci) uint32_t reg; /* enable IPIs for this core */ - reg = MFC0(12, 4); /* reset entry and interrupts */ + reg = mips_cp0_corereim_read(); if (cpu_index(ci) == 1) { reg |= REIM_MIRQ1_M; } else reg |= REIM_MIRQ0_M; - MTC0(reg, 12, 4); + mips_cp0_corereim_write(reg); printf("%s %d %08x\n", __func__, cpu_index(ci), reg); } @@ -147,9 +148,9 @@ ingenic_send_ipi(struct cpu_info *ci, in mutex_enter(&ingenic_ipi_lock); if (kcpuset_isset(cpus_running, cpu_index(ci))) { if (cpu_index(ci) == 0) { - MTC0(msg, CP0_CORE_MBOX, 0); + mips_cp0_corembox_write(msg, 0); } else { - MTC0(msg, CP0_CORE_MBOX, 1); + mips_cp0_corembox_write(msg, 1); } } mutex_exit(&ingenic_ipi_lock); Index: src/sys/arch/evbmips/ingenic/mainbus.c diff -u src/sys/arch/evbmips/ingenic/mainbus.c:1.6 src/sys/arch/evbmips/ingenic/mainbus.c:1.7 --- src/sys/arch/evbmips/ingenic/mainbus.c:1.6 Fri May 19 07:40:58 2017 +++ src/sys/arch/evbmips/ingenic/mainbus.c Sun May 21 06:49:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mainbus.c,v 1.6 2017/05/19 07:40:58 skrll Exp $ */ +/* $NetBSD: mainbus.c,v 1.7 2017/05/21 06:49:12 skrll Exp $ */ /*- * Copyright (c) 2014 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.6 2017/05/19 07:40:58 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.7 2017/05/21 06:49:12 skrll Exp $"); #include "opt_multiprocessor.h" @@ -95,11 +95,11 @@ mainbus_attach(device_t parent, device_t printf("TMR: %08x\n", readreg(JZ_TC_TMR)); /* send ourselves an IPI */ - MTC0(0x12345678, CP0_CORE_MBOX, 0); + mips_cp0_corembox_write(0x12345678, 0); delay(1000); /* send the other core an IPI */ - MTC0(0x12345678, CP0_CORE_MBOX, 1); + mips_cp0_corembox_write(0x12345678, 1); delay(1000); #endif } Index: src/sys/arch/mips/conf/files.ingenic diff -u src/sys/arch/mips/conf/files.ingenic:1.9 src/sys/arch/mips/conf/files.ingenic:1.10 --- src/sys/arch/mips/conf/files.ingenic:1.9 Fri May 19 07:30:24 2017 +++ src/sys/arch/mips/conf/files.ingenic Sun May 21 06:49:13 2017 @@ -1,6 +1,7 @@ -# $NetBSD: files.ingenic,v 1.9 2017/05/19 07:30:24 skrll Exp $ +# $NetBSD: files.ingenic,v 1.10 2017/05/21 06:49:13 skrll Exp $ file arch/mips/mips/bus_dma.c +file arch/mips/mips/locore_ingenic.S include "dev/scsipi/files.scsipi" # SCSI devices include "dev/ata/files.ata" # ATA devices Index: src/sys/arch/mips/ingenic/ingenic_regs.h diff -u src/sys/arch/mips/ingenic/ingenic_regs.h:1.24 src/sys/arch/mips/ingenic/ingenic_regs.h:1.25 --- src/sys/arch/mips/ingenic/ingenic_regs.h:1.24 Sat Aug 27 05:56:33 2016 +++ src/sys/arch/mips/ingenic/ingenic_regs.h Sun May 21 06:49:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ingenic_regs.h,v 1.24 2016/08/27 05:56:33 skrll Exp $ */ +/* $NetBSD: ingenic_regs.h,v 1.25 2017/05/21 06:49:13 skrll Exp $ */ /*- * Copyright (c) 2014 Michael Lorenz @@ -129,47 +129,6 @@ readreg(uint32_t reg) return *(volatile int32_t *)MIPS_PHYS_TO_KSEG1(reg); } -/* extra CP0 registers */ -static inline uint32_t -MFC0(uint32_t r, uint32_t s) -{ - uint32_t ret = 0x12345678; - - __asm volatile("mfc0 %0, $%1, %2; nop;" : "=r"(ret) : "i"(r), "i"(s)); - return ret; -} - -#define MTC0(v, r, s) __asm volatile("mtc0 %0, $%1, %2; nop;" :: "r"(v), "i"(r), "i"(s)) - -#define CP0_CORE_CTRL 12 /* select 2 */ - #define CC_SW_RST0 1 /* reset core 0 */ - #define CC_SW_RST1 2 /* reset core 1 */ - #define CC_RPC0 0x100 /* dedicated reset entry core 0 */ - #define CC_RPC1 0x200 /* -- || -- core 1 */ - #define CC_SLEEP0M 0x10000 /* mask sleep core 0 */ - #define CC_SLEEP1M 0x20000 /* mask sleep core 1 */ - -/* cores status, 12 select 3 */ -#define CS_MIRQ0_P 0x00001 /* mailbox IRQ for 0 pending */ -#define CS_MIRQ1_P 0x00002 /* || core 1 */ -#define CS_IRQ0_P 0x00100 /* peripheral IRQ for core 0 */ -#define CS_IRQ1_P 0x00200 /* || core 1 */ -#define CS_SLEEP0 0x10000 /* core 0 sleeping */ -#define CS_SLEEP1 0x20000 /* core 1 sleeping */ - -/* cores reset entry & IRQ masks - 12 select 4 */ -#define REIM_MIRQ0_M 0x00001 /* allow mailbox IRQ for core 0 */ -#define REIM_MIRQ1_M 0x00002 /* allow mailbox IRQ for core 1 */ -#define REIM_IRQ0_M 0x00100 /* allow peripheral IRQ for core 0 */ -#define REIM_IRQ1_M 0x00200 /* allow peripheral IRQ for core 1 */ -#define REIM_ENTRY_M 0xfffff000 /* reset exception entry if RPCn=1 */ - -#define CP0_CORE_MBOX 20 /* select 0 for core 0, 1 for 1 */ - -#define CP0_CORE0_MBOX _(20), 0 -#define CP0_CORE1_MBOX _(20), 1 - - /* power management */ #define JZ_CPCCR 0x10000000 /* Clock Control Register */ Index: src/sys/arch/mips/ingenic/ingenic_var.h diff -u src/sys/arch/mips/ingenic/ingenic_var.h:1.5 src/sys/arch/mips/ingenic/ingenic_var.h:1.6 --- src/sys/arch/mips/ingenic/ingenic_var.h:1.5 Mon May 18 15:07:52 2015 +++ src/sys/arch/mips/ingenic/ingenic_var.h Sun May 21 06:49:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ingenic_var.h,v 1.5 2015/05/18 15:07:52 macallan Exp $ */ +/* $NetBSD: ingenic_var.h,v 1.6 2017/05/21 06:49:13 skrll Exp $ */ /*- * Copyright (c) 2014 Michael Lorenz @@ -45,4 +45,14 @@ struct apbus_attach_args { extern bus_space_tag_t ingenic_memt; void apbus_init(void); +uint32_t mips_cp0_corectrl_read(void); +uint32_t mips_cp0_corestatus_read(void); +uint32_t mips_cp0_corereim_read(void); +uint32_t mips_cp0_corembox_read(u_int); + +void mips_cp0_corectrl_write(uint32_t); +void mips_cp0_corestatus_write(uint32_t); +void mips_cp0_corereim_write(uint32_t); +void mips_cp0_corembox_write(u_int, uint32_t); + #endif /* INGENIC_VAR_H */ Added files: Index: src/sys/arch/mips/ingenic/ingenic_coreregs.h diff -u /dev/null src/sys/arch/mips/ingenic/ingenic_coreregs.h:1.1 --- /dev/null Sun May 21 06:49:13 2017 +++ src/sys/arch/mips/ingenic/ingenic_coreregs.h Sun May 21 06:49:13 2017 @@ -0,0 +1,70 @@ +/* $NetBSD: ingenic_coreregs.h,v 1.1 2017/05/21 06:49:13 skrll Exp $ */ + +/*- + * Copyright (c) 2014 Michael Lorenz + * All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * 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) HOWEVER 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. + */ + +#ifndef INGENIC_COREREGS_H +#define INGENIC_COREREGS_H + +#ifdef _LOCORE +#define _(n) __CONCAT($,n) +#else +#define _(n) n +#endif + +/* cores status, 12 select 3 */ +#define CP0_CORE_CTRL _(12), 2 /* select 2 */ +#define CC_SW_RST0 __BIT(0) /* reset core 0 */ +#define CC_SW_RST1 __BIT(1) /* reset core 1 */ +#define CC_RPC0 __BIT(8) /* dedicated reset entry core 0 */ +#define CC_RPC1 __BIT(9) /* -- || -- core 1 */ +#define CC_SLEEP0M __BIT(16) /* mask sleep core 0 */ +#define CC_SLEEP1M __BIT(17) /* mask sleep core 1 */ + +/* cores status, 12 select 3 */ +#define CP0_CORE_STATUS _(12), 3 +#define CS_MIRQ0_P __BIT(0) /* mailbox IRQ for 0 pending */ +#define CS_MIRQ1_P __BIT(1) /* || core 1 */ +#define CS_IRQ0_P __BIT(8) /* peripheral IRQ for core 0 */ +#define CS_IRQ1_P __BIT(9) /* || core 1 */ +#define CS_SLEEP0 __BIT(16) /* core 0 sleeping */ +#define CS_SLEEP1 __BIT(17) /* core 1 sleeping */ + +/* cores reset entry & IRQ masks - 12 select 4 */ +#define CP0_CORE_REIM _(12), 4 +#define REIM_MIRQ0_M __BIT(0) /* allow mailbox IRQ for core 0 */ +#define REIM_MIRQ1_M __BIT(1) /* allow mailbox IRQ for core 1 */ +#define REIM_IRQ0_M __BIT(8) /* allow peripheral IRQ for core 0 */ +#define REIM_IRQ1_M __BIT(9) /* allow peripheral IRQ for core 1 */ +#define REIM_ENTRY_M __BITS(31,16) /* reset exception entry if RPCn=1 */ + +#define CP0_SPINLOCK _(12), 5 +#define CP0_SPINATOMIC _(12), 6 + +#define CP0_CORE0_MBOX _(20), 0 +#define CP0_CORE1_MBOX _(20), 1 + +#endif /* INGENIC_COREREGS_H */ Index: src/sys/arch/mips/mips/locore_ingenic.S diff -u /dev/null src/sys/arch/mips/mips/locore_ingenic.S:1.1 --- /dev/null Sun May 21 06:49:13 2017 +++ src/sys/arch/mips/mips/locore_ingenic.S Sun May 21 06:49:13 2017 @@ -0,0 +1,150 @@ +/* $NetBSD: locore_ingenic.S,v 1.1 2017/05/21 06:49:13 skrll Exp $ */ + +/*- + * Copyright (c) 2017 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * 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) HOWEVER 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 <mips/asm.h> +RCSID("$NetBSD: locore_ingenic.S,v 1.1 2017/05/21 06:49:13 skrll Exp $") + +#include <mips/cpuregs.h> +#include <mips/ingenic/ingenic_coreregs.h> + +#include "assym.h" + + .set noreorder + .set noat + .set arch=mips32r2 + + .text + +/* + * uint32_t mips_cp0_corectrl_read(void) + * + * Return the current value of the CP0 Core Control register. + */ +LEAF(mips_cp0_corectrl_read) + mfc0 v0, CP0_CORE_CTRL + jr ra + nop +END(mips_cp0_corectrl_read) + +/* + * void mips_cp0_corectrl_write(uint32_t) + * + * Set the value of the CP0 Core Control register. + */ +LEAF(mips_cp0_corectrl_write) + mtc0 a0, CP0_CORE_CTRL + jr.hb ra + nop +END(mips_cp0_corectrl_write) + +/* + * uint32_t mips_cp0_corestatus_read(void) + * + * Return the current value of the CP0 Core Status register. + */ +LEAF(mips_cp0_corestatus_read) + mfc0 v0, CP0_CORE_STATUS + jr ra + nop +END(mips_cp0_corestatus_read) + +/* + * void mips_cp0_corestatus_write(uint32_t) + * + * Set the value of the CP0 Core Status register. + */ +LEAF(mips_cp0_corestatus_write) + mtc0 a0, CP0_CORE_STATUS + jr.hb ra + nop +END(mips_cp0_corestatus_write) + + +/* + * uint32_t mips_cp0_corereim_read(void) + * + * Return the current value of the CP0 Reset Entry & IRQ Mask register. + */ +LEAF(mips_cp0_corereim_read) + mfc0 v0, CP0_CORE_REIM + jr ra + nop +END(mips_cp0_corereim_read) + +/* + * void mips_cp0_corereim_write(uint32_t) + * + * Set the value of the CP0 Core Reset Entry & IRQ Mask register. + */ +LEAF(mips_cp0_corereim_write) + mtc0 a0, CP0_CORE_REIM + jr.hb ra + nop +END(mips_cp0_corereim_write) + + +/* + * uintptr_t mips_cp0_corembox_read(u_int sel) + * + * Return the current value of the selected CP0 Mailbox register. + */ +LEAF(mips_cp0_corembox_read) + sll a0, 2 + PTR_LA t9, 1f + PTR_ADDU t9, a0 + jr t9 + nop +1: + jr ra + mfc0 v0, CP0_CORE0_MBOX + jr ra + mfc0 v0, CP0_CORE1_MBOX + jr ra +END(mips_cp0_corembox_read) + +/* + * void mips_cp0_watchlo_write(u_int sel, uinte32_t val) + * + * Set the current value of the selected CP0 Mailbox register. + */ +LEAF(mips_cp0_corembox_write) + sll a0, 2 + PTR_LA t9, 1f + PTR_ADDU t9, a0 + jr t9 + nop +1: + jr.hb ra + mtc0 a1, CP0_CORE0_MBOX + jr.hb ra + mtc0 a1, CP0_CORE1_MBOX + jr.hb ra +END(mips_cp0_corembox_write)