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
This commit is contained in:
skrll 2017-05-21 06:49:12 +00:00
parent 21f81d6b53
commit ed6f73360e
10 changed files with 274 additions and 76 deletions

View File

@ -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.9 2017/05/19 07:40:58 skrll Exp $");
#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);

View File

@ -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 2017/05/19 07:40:58 skrll Exp $");
#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 self, void *aux)
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--;

View File

@ -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.12 2016/08/27 05:52:43 skrll Exp $");
#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 ipending, struct clockframe *cf)
#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 ipending, struct clockframe *cf)
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 ipending, struct clockframe *cf)
#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 ipending, struct clockframe *cf)
#endif
reg &= (~CS_MIRQ1_P);
/* clear it */
MTC0(reg, 12, 3);
mips_cp0_corestatus_write(reg);
}
}
splx(s);

View File

@ -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 1.13 2017/05/19 07:40:58 skrll Exp $");
#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, int tag)
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);

View File

@ -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 self, void *aux)
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
}

View File

@ -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

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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)