summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2004-08-03 21:24:44 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2004-08-03 21:24:44 +0000
commitc4ff925e03496c0e376318832d4d48fbff514ad6 (patch)
tree60b19452a99f3b134117acd9d63d965724bb946b
parenta0432862942e545579c0c8c4eabda9b6806569e1 (diff)
Overhaul of the MVME188 logic:
- change the split CMMU strategy from splitting on user/supervisor, then A14/A14*, to A12/A12*, then A14/A14*. I believe this arrangment, being more symmetrical, uses the extra CMMUs better. - correctly handle 88204 - they will split on A14 and A16 instead of A12 and A14. - fix the addressing logic, when we need to know if a specific CMMU manages a certain address, or not. Code is even smaller now! - since the strategy choice makes user/supervisor distinction obsolete, remove the associated logic in m8820x_cmmu_set(). We now run multiuser on a 2P128 (4:1 88200) HYPERmodule. All 4:1 configurations should work; 8:1 configurations (1P128 with 88200, and 1P512) could not been tested due to lack of such hardware.
-rw-r--r--sys/arch/mvme88k/mvme88k/m8820x.c609
1 files changed, 222 insertions, 387 deletions
diff --git a/sys/arch/mvme88k/mvme88k/m8820x.c b/sys/arch/mvme88k/mvme88k/m8820x.c
index cb4ff6a378a..722c142d521 100644
--- a/sys/arch/mvme88k/mvme88k/m8820x.c
+++ b/sys/arch/mvme88k/mvme88k/m8820x.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: m8820x.c,v 1.34 2004/08/02 08:35:00 miod Exp $ */
+/* $OpenBSD: m8820x.c,v 1.35 2004/08/03 21:24:43 miod Exp $ */
/*
* Copyright (c) 2004, Miodrag Vallat.
*
@@ -91,16 +91,18 @@
#include <machine/cmmu.h>
#include <machine/m8820x.h>
-#include <machine/mvme188.h> /* VME_CMMU_ */
#ifdef MVME187
#include <machine/mvme187.h>
#endif
+#ifdef MVME188
+#include <machine/mvme188.h>
+#endif
#include <uvm/uvm_extern.h>
#ifdef DDB
#include <ddb/db_output.h> /* db_printf() */
-#endif /* DDB */
+#endif
/*
* On some versions of the 88200, page size flushes don't work. I am using
@@ -110,20 +112,7 @@
#undef SHADOW_BATC /* don't use BATCs for now XXX nivas */
-#ifdef DEBUG
-unsigned int m8820x_debuglevel;
-#define dprintf(_X_) \
- do { \
- if (m8820x_debuglevel != 0) { \
- unsigned int psr = disable_interrupts_return_psr(); \
- printf("%d: ", cpu_number()); \
- printf _X_; \
- set_psr(psr); \
- } \
- } while (0)
-#else
-#define dprintf(_X_) do { } while (0)
-#endif
+u_int max_cmmus;
void m8820x_cmmu_init(void);
void m8820x_setup_board_config(void);
@@ -179,51 +168,49 @@ struct cmmu_p cmmu8820x = {
};
/*
- * This code was initially designed for the Omron Luna 88K layout consisting
- * of up to 4 CPUs with 2 CMMUs each, one for data and one for instructions.
- *
- * Trying to support a few more board configurations for the
- * Motorola MVME188, we have the following layouts:
- *
+ * There are 6 possible MVME188 HYPERmodule configurations:
* - config 0: 4 CPUs, 8 CMMUs
* - config 1: 2 CPUs, 8 CMMUs
* - config 2: 1 CPUs, 8 CMMUs
* - config 5: 2 CPUs, 4 CMMUs
* - config 6: 1 CPU, 4 CMMUs
* - config A: 1 CPU, 2 CMMUs
+ * which can exist either with MC88200 or MC88204 CMMUs.
+ *
+ * Systems with more than 2 CMMUs per CPU use programmable split schemes,
+ * through PCNFA (for code CMMUs) and PCNFB (for data CMMUs) configuration
+ * registers.
+ *
+ * The following schemes are available:
+ * - split on A12 address bit (A14 for 88204)
+ * - split on supervisor/user access
+ * - split on SRAM/non-SRAM addresses, with either supervisor-only or all
+ * access to SRAM.
+ *
+ * Configuration 6, with 4 CMMUs par CPU, also forces a split on A14 address
+ * bit.
*
- * We use these splitup schemes:
- * - split between data and instructions (always enabled)
- * - split between user/spv (and A14 in config 2)
- * - split because of A12 (and A14 in config 2)
- * - one SRAM supervisor, other rest
- * - one whole SRAM, other rest
+ * Under OpenBSD, we will only split on A12 and A14 address bits, since we
+ * do not want to waste CMMU resources on the SRAM, and our supervisor
+ * address space does not have A31 set.
*
- * The main problem is to find the right suited CMMU for a given
- * CPU number at those configurations.
- * em, 10.5.94
+ * The really nasty part of this choice is in the exception handling code,
+ * when it needs to get error information from up to 4 CMMUs. See eh.S for
+ * the gory details.
*/
/*
* CMMU kernel information
*/
struct m8820x_cmmu {
- unsigned *volatile cmmu_regs; /* CMMU "base" area */
+ volatile u_int32_t *cmmu_regs; /* CMMU "base" area */
unsigned int cmmu_cpu; /* cpu number it is attached to */
unsigned int cmmu_type;
-#define INST_CMMU 0
-#define DATA_CMMU 1
- unsigned int cmmu_access;
-#define CMMU_ACS_USER 0
-#define CMMU_ACS_SUPER 1
-#define CMMU_ACS_BOTH 2
- unsigned int cmmu_alive;
-#define CMMU_DEAD 0 /* This cmmu is not there */
-#define CMMU_AVAILABLE 1 /* It's there, but which cpu's? */
-#define CMMU_MARRIED 2 /* Know which cpu it belongs to. */
+#define NO_CMMU 0x00
+#define INST_CMMU 0x01
+#define DATA_CMMU 0x02
vaddr_t cmmu_addr; /* address range */
vaddr_t cmmu_addr_mask; /* address mask */
- int cmmu_addr_match;/* return value of address comparison */
#ifdef SHADOW_BATC
unsigned batc[BATC_MAX];
#endif
@@ -240,45 +227,22 @@ struct m8820x_cmmu {
#define MAX_CMMUS (2 * MAX_CPUS) /* maximum cmmus on the board */
-struct m8820x_cmmu m8820x_cmmu[MAX_CMMUS] =
-{
- /* address, cpu, mode, access, alive, addr, mask */
- {(unsigned *volatile)VME_CMMU_I0, -1, INST_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_D0, -1, DATA_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_I1, -1, INST_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_D1, -1, DATA_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_I2, -1, INST_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_D2, -1, DATA_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_I3, -1, INST_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0},
- {(unsigned *volatile)VME_CMMU_D3, -1, DATA_CMMU, CMMU_ACS_BOTH, CMMU_DEAD, 0, 0}
+struct m8820x_cmmu m8820x_cmmu[MAX_CMMUS] = {
+ /* address, cpu, mode, addr, mask */
+ { NULL, -1, INST_CMMU, 0, 0 },
+ { NULL, -1, DATA_CMMU, 0, 0 },
+ { NULL, -1, INST_CMMU, 0, 0 },
+ { NULL, -1, DATA_CMMU, 0, 0 },
+ { NULL, -1, INST_CMMU, 0, 0 },
+ { NULL, -1, DATA_CMMU, 0, 0 },
+ { NULL, -1, INST_CMMU, 0, 0 },
+ { NULL, -1, DATA_CMMU, 0, 0 }
};
struct cpu_cmmu {
struct m8820x_cmmu *pair[2];
} cpu_cmmu[MAX_CPUS];
-/*
- * CMMU per CPU split strategies
- */
-
-#define CMMU_SPLIT_ADDRESS 0x00
-#define CMMU_SPLIT_SPV 0x01
-#define CMMU_SPLIT_SRAM_SPV 0x02
-#define CMMU_SPLIT_SRAM_ALL 0x03
-
-#define CMMU_SPLIT_MASK 0x03
-
-struct cmmu_strategy {
- int inst;
- int data;
-} cpu_cmmu_strategy[] = {
- /* inst data */
- { CMMU_SPLIT_SPV, CMMU_SPLIT_SPV}, /* CPU 0 */
- { CMMU_SPLIT_SPV, CMMU_SPLIT_SPV}, /* CPU 1 */
- { CMMU_SPLIT_ADDRESS, CMMU_SPLIT_ADDRESS}, /* CPU 2 */
- { CMMU_SPLIT_ADDRESS, CMMU_SPLIT_ADDRESS} /* CPU 3 */
-};
-
unsigned int cmmu_shift;
#ifdef MVME188
@@ -289,7 +253,7 @@ unsigned int cmmu_shift;
const struct board_config {
int ncpus;
int ncmmus;
-} bd_config[] = {
+} bd_config[16] = {
{ 4, 8 }, /* 4P128 - 4P512 */
{ 2, 8 }, /* 2P128 - 2P512 */
{ 1, 8 }, /* 1P128 - 1P512 */
@@ -310,7 +274,7 @@ const struct board_config {
#endif
/* local prototypes */
-void m8820x_cmmu_set(int, unsigned, int, int, int, int, vaddr_t);
+void m8820x_cmmu_set(int, unsigned, int, int, int, vaddr_t);
void m8820x_cmmu_wait(int);
void m8820x_cmmu_sync_cache(paddr_t, psize_t);
void m8820x_cmmu_sync_inval_cache(paddr_t, psize_t);
@@ -318,8 +282,7 @@ void m8820x_cmmu_inval_cache(paddr_t, psize_t);
/* Flags passed to m8820x_cmmu_set() */
#define MODE_VAL 0x01
-#define ACCESS_VAL 0x02
-#define ADDR_VAL 0x04
+#define ADDR_VAL 0x02
#ifdef DEBUG
void
@@ -345,14 +308,11 @@ m8820x_show_apr(value)
void
m8820x_setup_board_config()
{
+ volatile unsigned *cr;
int num, cmmu_num;
int vme188_config;
- unsigned *volatile cr;
#ifdef MVME188
- int val1, val2;
u_int32_t *volatile whoami;
- unsigned long *volatile pcnfa;
- unsigned long *volatile pcnfb;
#endif
master_cpu = 0; /* temp to get things going */
@@ -361,7 +321,7 @@ m8820x_setup_board_config()
case BRD_187:
case BRD_8120:
/* There is no WHOAMI reg on MVME187 - fake it... */
- vme188_config = 10;
+ vme188_config = 0x0a;
m8820x_cmmu[0].cmmu_regs = (void *)SBC_CMMU_I;
m8820x_cmmu[0].cmmu_cpu = 0;
m8820x_cmmu[1].cmmu_regs = (void *)SBC_CMMU_D;
@@ -372,22 +332,27 @@ m8820x_setup_board_config()
m8820x_cmmu[5].cmmu_regs = (void *)NULL;
m8820x_cmmu[6].cmmu_regs = (void *)NULL;
m8820x_cmmu[7].cmmu_regs = (void *)NULL;
- max_cpus = 1;
- max_cmmus = 2;
break;
#endif /* MVME187 */
#ifdef MVME188
case BRD_188:
whoami = (u_int32_t *volatile)MVME188_WHOAMI;
vme188_config = (*whoami & 0xf0) >> 4;
- dprintf(("m8820x_setup_board_config: WHOAMI @ 0x%08x holds value 0x%08x vme188_config = %d\n",
- whoami, *whoami, vme188_config));
- max_cpus = bd_config[vme188_config].ncpus;
- max_cmmus = bd_config[vme188_config].ncmmus;
+ m8820x_cmmu[0].cmmu_regs = (void *)VME_CMMU_I0;
+ m8820x_cmmu[1].cmmu_regs = (void *)VME_CMMU_D0;
+ m8820x_cmmu[2].cmmu_regs = (void *)VME_CMMU_I1;
+ m8820x_cmmu[3].cmmu_regs = (void *)VME_CMMU_D1;
+ m8820x_cmmu[4].cmmu_regs = (void *)VME_CMMU_I2;
+ m8820x_cmmu[5].cmmu_regs = (void *)VME_CMMU_D2;
+ m8820x_cmmu[6].cmmu_regs = (void *)VME_CMMU_I3;
+ m8820x_cmmu[7].cmmu_regs = (void *)VME_CMMU_D3;
break;
#endif /* MVME188 */
}
+ max_cpus = bd_config[vme188_config].ncpus;
+ max_cmmus = bd_config[vme188_config].ncmmus;
+
cmmu_shift = ff1(max_cmmus / max_cpus);
#ifdef MVME188
@@ -404,6 +369,7 @@ m8820x_setup_board_config()
}
#endif
+#ifdef DIAGNOSTIC
/*
* Probe for available MMUs
*/
@@ -413,108 +379,45 @@ m8820x_setup_board_config()
int type;
type = CMMU_TYPE(cr[CMMU_IDR]);
-#ifdef DIAGNOSTIC
if (type != M88200_ID && type != M88204_ID) {
printf("WARNING: non M8820x circuit found "
"at CMMU address %p\n", cr);
continue; /* will probably die quickly */
}
-#endif
- m8820x_cmmu[cmmu_num].cmmu_alive = CMMU_AVAILABLE;
- dprintf(("m8820x_setup_cmmu_config: CMMU %d found at %p\n",
- cmmu_num, cr));
- }
+ } else
+ m8820x_cmmu[cmmu_num].cmmu_type = NO_CMMU;
}
+#endif
/*
* Now that we know which CMMUs are there, let's report on which
* CPU/CMMU sets seem complete (hopefully all)
*/
for (num = 0; num < max_cpus; num++) {
- int i, type;
+ int type;
- for (i = 0; i < (1 << cmmu_shift); i++) {
- dprintf(("cmmu_init: testing CMMU %d for CPU %d\n",
- (num << cmmu_shift) | i, num));
-#ifdef DIAGNOSTIC
- if (m8820x_cmmu[(num << cmmu_shift) | i].cmmu_alive == CMMU_DEAD) {
- printf("CMMU %d attached to CPU %d is not working\n",
- (num << cmmu_shift) | i, num);
- continue; /* will probably die quickly */
- }
-#endif
- }
cpu_sets[num] = 1; /* This cpu installed... */
type = CMMU_TYPE(m8820x_cmmu[num << cmmu_shift].
cmmu_regs[CMMU_IDR]);
- printf("CPU%d is attached with %d MC%x CMMUs\n",
- num, 1 << cmmu_shift, type == M88204_ID ? 0x88204 : 0x88200);
+ printf("CPU%d is attached with %d MC8820%c CMMUs\n",
+ num, 1 << cmmu_shift, type == M88204_ID ? '4' : '0');
}
- for (num = 0; num < max_cpus; num++) {
- cpu_cmmu_strategy[num].inst &= CMMU_SPLIT_MASK;
- cpu_cmmu_strategy[num].data &= CMMU_SPLIT_MASK;
- dprintf(("m8820x_setup_cmmu_config: CPU %d inst strat %d data strat %d\n",
- num, cpu_cmmu_strategy[num].inst, cpu_cmmu_strategy[num].data));
- }
- switch (vme188_config) {
- /*
- * These configurations have hardwired CPU/CMMU configurations.
- */
-#ifdef MVME188
- case 0x00:
- case 0x05:
-#endif
- case 0x0a:
- dprintf(("m8820x_setup_cmmu_config: resetting strategies\n"));
- for (num = 0; num < max_cpus; num++)
- cpu_cmmu_strategy[num].inst = CMMU_SPLIT_ADDRESS;
- cpu_cmmu_strategy[num].data = CMMU_SPLIT_ADDRESS;
- break;
#ifdef MVME188
/*
* Configure CPU/CMMU strategy into PCNFA and PCNFB board registers.
+ * We should theoretically only set these on configurations 1, 2
+ * and 6, since the other ones do not have P bus decoders.
+ * However, is it safe to write them anyways - the values will be
+ * discarded. Just don't do this on a 187...
*/
- case 0x01:
- pcnfa = (unsigned long *volatile)MVME188_PCNFA;
- pcnfb = (unsigned long *volatile)MVME188_PCNFB;
- val1 = (cpu_cmmu_strategy[0].inst << 2) |
- cpu_cmmu_strategy[0].data;
- val2 = (cpu_cmmu_strategy[1].inst << 2) |
- cpu_cmmu_strategy[1].data;
- *pcnfa = val1;
- *pcnfb = val2;
- dprintf(("m8820x_setup_cmmu_config: 2P128: PCNFA = 0x%x, PCNFB = 0x%x\n", val1, val2));
- break;
- case 0x02:
- pcnfa = (unsigned long *volatile)MVME188_PCNFA;
- pcnfb = (unsigned long *volatile)MVME188_PCNFB;
- val1 = (cpu_cmmu_strategy[0].inst << 2) |
- cpu_cmmu_strategy[0].inst;
- val2 = (cpu_cmmu_strategy[0].data << 2) |
- cpu_cmmu_strategy[0].data;
- *pcnfa = val1;
- *pcnfb = val2;
- dprintf(("m8820x_setup_cmmu_config: 1P128: PCNFA = 0x%x, PCNFB = 0x%x\n", val1, val2));
- break;
- case 0x06:
- pcnfa = (unsigned long *volatile)MVME188_PCNFA;
- val1 = (cpu_cmmu_strategy[0].inst << 2) |
- cpu_cmmu_strategy[0].data;
- *pcnfa = val1;
- dprintf(("m8820x_setup_cmmu_config: 1P64: PCNFA = 0x%x\n", val1));
- break;
-#endif /* MVME188 */
- default:
- panic("m8820x_setup_cmmu_config: unsupported configuration");
- break;
+ if (brdtyp == BRD_188) {
+ *(volatile unsigned long *)MVME188_PCNFA = 0;
+ *(volatile unsigned long *)MVME188_PCNFB = 0;
}
-
-#ifdef MVME188
- dprintf(("m8820x_setup_cmmu_config: PCNFA = 0x%x, PCNFB = 0x%x\n", *pcnfa, *pcnfb));
-#endif /* MVME188 */
+#endif
/*
* Calculate the CMMU<->CPU connections
@@ -522,104 +425,61 @@ m8820x_setup_board_config()
for (cmmu_num = 0; cmmu_num < max_cmmus; cmmu_num++) {
m8820x_cmmu[cmmu_num].cmmu_cpu =
(cmmu_num * max_cpus) / max_cmmus;
- dprintf(("m8820x_setup_cmmu_config: CMMU %d connected with CPU %d\n",
- cmmu_num, m8820x_cmmu[cmmu_num].cmmu_cpu));
}
/*
- * Now set m8820x_cmmu[].cmmu_access and addr
+ * Now set up addressing limits
*/
for (cmmu_num = 0; cmmu_num < max_cmmus; cmmu_num++) {
- /*
- * We don't set up anything for the hardwired configurations.
- */
- if (cmmu_shift == 1) {
- m8820x_cmmu[cmmu_num].cmmu_addr = 0;
- m8820x_cmmu[cmmu_num].cmmu_addr_mask = 0;
- m8820x_cmmu[cmmu_num].cmmu_addr_match = 1;
- m8820x_cmmu[cmmu_num].cmmu_access = CMMU_ACS_BOTH;
- continue;
- }
+ num = cmmu_num >> 1; /* CPU view of the CMMU */
- /*
- * First we set the address/mask pairs for the exact address
- * matches.
- */
- switch ((m8820x_cmmu[cmmu_num].cmmu_type == INST_CMMU) ?
- cpu_cmmu_strategy[m8820x_cmmu[cmmu_num].cmmu_cpu].inst :
- cpu_cmmu_strategy[m8820x_cmmu[cmmu_num].cmmu_cpu].data) {
- case CMMU_SPLIT_ADDRESS:
- m8820x_cmmu[cmmu_num].cmmu_addr =
- ((cmmu_num & 0x2) ^ 0x2) << 11;
- m8820x_cmmu[cmmu_num].cmmu_addr_mask = CMMU_A12_MASK;
- m8820x_cmmu[cmmu_num].cmmu_addr_match = 1;
+ switch (cmmu_shift) {
+ case 3:
+ /*
+ * A14 split (configuration 2 only).
+ * CMMU numbers 0 and 1 match on A14 set,
+ * 2 and 3 on A14 clear
+ */
+ m8820x_cmmu[cmmu_num].cmmu_addr |=
+ (num < 2 ? CMMU_A14_MASK : 0);
+ m8820x_cmmu[cmmu_num].cmmu_addr_mask |= CMMU_A14_MASK;
+ /* FALLTHROUGH */
+
+ case 2:
+ /*
+ * A12 split.
+ * CMMU numbers 0 and 2 match on A12 set,
+ * 1 and 3 on A12 clear.
+ */
+ m8820x_cmmu[cmmu_num].cmmu_addr |=
+ (num & 1 ? 0 : CMMU_A12_MASK);
+ m8820x_cmmu[cmmu_num].cmmu_addr_mask |= CMMU_A12_MASK;
break;
- case CMMU_SPLIT_SPV:
+
+ case 1:
+ /*
+ * We don't need to set up anything for the hardwired
+ * configurations.
+ */
m8820x_cmmu[cmmu_num].cmmu_addr = 0;
m8820x_cmmu[cmmu_num].cmmu_addr_mask = 0;
- m8820x_cmmu[cmmu_num].cmmu_addr_match = 1;
break;
- case CMMU_SPLIT_SRAM_ALL:
- m8820x_cmmu[cmmu_num].cmmu_addr = CMMU_SRAM;
- m8820x_cmmu[cmmu_num].cmmu_addr_mask = CMMU_SRAM_MASK;
- m8820x_cmmu[cmmu_num].cmmu_addr_match =
- (cmmu_num & 0x2) ? 1 : 0;
- break;
- case CMMU_SPLIT_SRAM_SPV:
- if (cmmu_num & 0x2) {
- m8820x_cmmu[cmmu_num].cmmu_addr = CMMU_SRAM;
- m8820x_cmmu[cmmu_num].cmmu_addr_mask =
- CMMU_SRAM_MASK;
- } else {
- m8820x_cmmu[cmmu_num].cmmu_addr = 0;
- m8820x_cmmu[cmmu_num].cmmu_addr_mask = 0;
- }
- m8820x_cmmu[cmmu_num].cmmu_addr_match = 1;
- break;
- }
-
- /*
- * For MVME188 single processors, we've got to look at A14.
- * This bit splits the CMMUs independent of the enabled strategy
- */
- if (cmmu_shift >= 2) {
- m8820x_cmmu[cmmu_num].cmmu_addr |=
- ((cmmu_num & 0x4) ^ 0x4) << 12;
- m8820x_cmmu[cmmu_num].cmmu_addr_mask |= CMMU_A14_MASK;
}
/*
- * Next we cope with the various access modes.
+ * If these CMMUs are 88204, these splitting address lines
+ * need to be shifted two bits.
*/
- switch ((m8820x_cmmu[cmmu_num].cmmu_type == INST_CMMU) ?
- cpu_cmmu_strategy[m8820x_cmmu[cmmu_num].cmmu_cpu].inst :
- cpu_cmmu_strategy[m8820x_cmmu[cmmu_num].cmmu_cpu].data) {
- case CMMU_SPLIT_SPV:
- m8820x_cmmu[cmmu_num].cmmu_access =
- (cmmu_num & 0x2) ? CMMU_ACS_USER : CMMU_ACS_SUPER;
- break;
- case CMMU_SPLIT_SRAM_SPV:
- m8820x_cmmu[cmmu_num].cmmu_access =
- (cmmu_num & 0x2) ? CMMU_ACS_SUPER : CMMU_ACS_BOTH;
- break;
- default:
- m8820x_cmmu[cmmu_num].cmmu_access = CMMU_ACS_BOTH;
- break;
+ if (CMMU_TYPE(m8820x_cmmu[cmmu_num].cmmu_regs[CMMU_IDR]) ==
+ M88204_ID) {
+ m8820x_cmmu[cmmu_num].cmmu_addr <<= 2;
+ m8820x_cmmu[cmmu_num].cmmu_addr_mask <<= 2;
}
}
}
#ifdef DDB
-#ifdef MVME188
-const char *cmmu_strat_string[] = {
- "address split ",
- "user/spv split",
- "spv SRAM split",
- "all SRAM split"
-};
-#endif
-
void
m8820x_cmmu_dump_config()
{
@@ -639,19 +499,12 @@ m8820x_cmmu_dump_config()
db_printf("VME188 address decoder: PCNFA = 0x%1lx, PCNFB = 0x%1lx\n\n",
*pcnfa & 0xf, *pcnfb & 0xf);
for (cmmu_num = 0; cmmu_num < max_cmmus; cmmu_num++) {
- db_printf("CMMU #%d: %s CMMU for CPU %d:\n Strategy: %s\n %s access addr 0x%08lx mask 0x%08lx match %s\n",
+ db_printf("CMMU #%d: %s CMMU for CPU %d:\n addr 0x%08lx mask 0x%08lx\n",
cmmu_num,
(m8820x_cmmu[cmmu_num].cmmu_type == INST_CMMU) ? "inst" : "data",
m8820x_cmmu[cmmu_num].cmmu_cpu,
- cmmu_strat_string[(m8820x_cmmu[cmmu_num].cmmu_type == INST_CMMU) ?
- cpu_cmmu_strategy[m8820x_cmmu[cmmu_num].cmmu_cpu].inst :
- cpu_cmmu_strategy[m8820x_cmmu[cmmu_num].cmmu_cpu].data],
- (m8820x_cmmu[cmmu_num].cmmu_access == CMMU_ACS_BOTH) ? "User and spv" :
- ((m8820x_cmmu[cmmu_num].cmmu_access == CMMU_ACS_USER) ? "User " :
- "Supervisor "),
m8820x_cmmu[cmmu_num].cmmu_addr,
- m8820x_cmmu[cmmu_num].cmmu_addr_mask,
- m8820x_cmmu[cmmu_num].cmmu_addr_match ? "TRUE" : "FALSE");
+ m8820x_cmmu[cmmu_num].cmmu_addr_mask);
}
#endif /* MVME188 */
}
@@ -662,10 +515,10 @@ m8820x_cmmu_dump_config()
* into the CMMU's registers.
*/
void
-m8820x_cmmu_set(reg, val, flags, num, mode, access, addr)
+m8820x_cmmu_set(reg, val, flags, cpu, mode, addr)
int reg;
unsigned val;
- int flags, num, mode, access;
+ int flags, cpu, mode;
vaddr_t addr;
{
int mmu;
@@ -674,20 +527,17 @@ m8820x_cmmu_set(reg, val, flags, num, mode, access, addr)
* We scan all CMMUs to find the matching ones and store the
* values there.
*/
- for (mmu = num << cmmu_shift;
- mmu < (num + 1) << cmmu_shift; mmu++) {
- if (((flags & MODE_VAL)) &&
- (m8820x_cmmu[mmu].cmmu_type != mode))
- continue;
- if (((flags & ACCESS_VAL)) &&
- (m8820x_cmmu[mmu].cmmu_access != access) &&
- (m8820x_cmmu[mmu].cmmu_access != CMMU_ACS_BOTH))
- continue;
- if (flags & ADDR_VAL) {
- if (((addr & m8820x_cmmu[mmu].cmmu_addr_mask) == m8820x_cmmu[mmu].cmmu_addr)
- != m8820x_cmmu[mmu].cmmu_addr_match) {
+ for (mmu = cpu << cmmu_shift;
+ mmu < (cpu + 1) << cmmu_shift; mmu++) {
+ if ((flags & MODE_VAL) != 0) {
+ if (m8820x_cmmu[mmu].cmmu_type != mode)
+ continue;
+ }
+ if ((flags & ADDR_VAL) != 0) {
+ if (m8820x_cmmu[mmu].cmmu_addr_mask != 0 &&
+ (addr & m8820x_cmmu[mmu].cmmu_addr_mask) !=
+ m8820x_cmmu[mmu].cmmu_addr)
continue;
- }
}
m8820x_cmmu[mmu].cmmu_regs[reg] = val;
}
@@ -772,7 +622,6 @@ m8820x_cpu_configuration_print(master)
mmu++) {
int idr = m8820x_cmmu[mmu].cmmu_regs[CMMU_IDR];
int mmuid = CMMU_TYPE(idr);
- int access = m8820x_cmmu[mmu].cmmu_access;
if (mmu % 2 == 0)
printf("\ncpu%d: ", cpu);
@@ -783,10 +632,8 @@ m8820x_cpu_configuration_print(master)
printf("unknown model id 0x%x", mmuid);
else
printf("%s", mmutypes[mmuid]);
- printf(" rev 0x%x, %s %scache",
+ printf(" rev 0x%x, %scache",
CMMU_VERSION(idr),
- access == CMMU_ACS_BOTH ? "global" :
- (access == CMMU_ACS_USER ? "user" : "sup"),
m8820x_cmmu[mmu].cmmu_type == INST_CMMU ? "I" : "D");
}
printf("\n");
@@ -816,7 +663,7 @@ m8820x_cmmu_init()
unsigned int line, cmmu_num;
int cssp, cpu, type;
u_int32_t apr;
- unsigned *volatile cr;
+ volatile unsigned *cr;
for (cpu = 0; cpu < max_cpus; cpu++) {
cpu_cmmu[cpu].pair[INST_CMMU] = 0;
@@ -824,7 +671,7 @@ m8820x_cmmu_init()
}
for (cmmu_num = 0; cmmu_num < max_cmmus; cmmu_num++) {
- if (m8820x_cmmu[cmmu_num].cmmu_alive != CMMU_DEAD) {
+ if (m8820x_cmmu[cmmu_num].cmmu_type != NO_CMMU) {
cr = m8820x_cmmu[cmmu_num].cmmu_regs;
type = CMMU_TYPE(cr[CMMU_IDR]);
@@ -893,12 +740,12 @@ m8820x_cmmu_init()
continue;
m8820x_cmmu_set(CMMU_SCTR, CMMU_SCTR_SE, MODE_VAL, cpu,
- DATA_CMMU, 0, 0);
+ DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCTR, CMMU_SCTR_SE, MODE_VAL, cpu,
- INST_CMMU, 0, 0);
+ INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_SUPER_ALL,
- ACCESS_VAL, cpu, 0, CMMU_ACS_SUPER, 0);
+ 0, cpu, 0, 0);
m8820x_cmmu_wait(cpu);
/* Icache gets flushed just below */
}
@@ -918,9 +765,9 @@ m8820x_cmmu_init()
apr = ((0x00000 << PG_BITS) | CACHE_WT | CACHE_GLOBAL)
& ~(CACHE_INH | APR_V);
- m8820x_cmmu_set(CMMU_SAPR, apr, MODE_VAL, cpu, INST_CMMU, 0, 0);
+ m8820x_cmmu_set(CMMU_SAPR, apr, MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_SUPER_ALL,
- ACCESS_VAL, cpu, 0, CMMU_ACS_SUPER, 0);
+ 0, cpu, 0, 0);
m8820x_cmmu_wait(cpu);
}
}
@@ -932,11 +779,11 @@ void
m8820x_cmmu_shutdown_now()
{
unsigned cmmu_num;
- unsigned *volatile cr;
+ volatile unsigned *cr;
CMMU_LOCK;
for (cmmu_num = 0; cmmu_num < MAX_CMMUS; cmmu_num++)
- if (m8820x_cmmu[cmmu_num].cmmu_alive != CMMU_DEAD) {
+ if (m8820x_cmmu[cmmu_num].cmmu_type != NO_CMMU) {
cr = m8820x_cmmu[cmmu_num].cmmu_regs;
cr[CMMU_SCTR] &=
@@ -955,12 +802,12 @@ void
m8820x_cmmu_parity_enable()
{
unsigned cmmu_num;
- unsigned *volatile cr;
+ volatile unsigned *cr;
CMMU_LOCK;
for (cmmu_num = 0; cmmu_num < max_cmmus; cmmu_num++)
- if (m8820x_cmmu[cmmu_num].cmmu_alive != CMMU_DEAD) {
+ if (m8820x_cmmu[cmmu_num].cmmu_type != NO_CMMU) {
cr = m8820x_cmmu[cmmu_num].cmmu_regs;
cr[CMMU_SCTR] |= CMMU_SCTR_PE;
}
@@ -989,7 +836,7 @@ m8820x_cmmu_cpu_number()
#endif
#ifdef MVME188
- whoami = *(u_int32_t *volatile)MVME188_WHOAMI;
+ whoami = *(volatile u_int32_t *)MVME188_WHOAMI;
switch ((whoami & 0xf0) >> 4) {
/* 2 CMMU per CPU multiprocessor modules */
case 0:
@@ -1019,7 +866,7 @@ m8820x_cmmu_set_sapr(cpu, ap)
unsigned cpu, ap;
{
CMMU_LOCK;
- m8820x_cmmu_set(CMMU_SAPR, ap, ACCESS_VAL, cpu, 0, CMMU_ACS_SUPER, 0);
+ m8820x_cmmu_set(CMMU_SAPR, ap, 0, cpu, 0, 0);
CMMU_UNLOCK;
}
@@ -1032,7 +879,7 @@ m8820x_cmmu_set_uapr(ap)
CMMU_LOCK;
/* this functionality also mimiced in m8820x_cmmu_pmap_activate() */
- m8820x_cmmu_set(CMMU_UAPR, ap, ACCESS_VAL, cpu, 0, CMMU_ACS_USER, 0);
+ m8820x_cmmu_set(CMMU_UAPR, ap, 0, cpu, 0, 0);
CMMU_UNLOCK;
splx(s);
}
@@ -1051,13 +898,11 @@ m8820x_cmmu_set_pair_batc_entry(cpu, entry_no, value)
{
CMMU_LOCK;
- m8820x_cmmu_set(CMMU_BWP(entry_no), value, MODE_VAL | ACCESS_VAL,
- cpu, DATA_CMMU, CMMU_ACS_USER, 0);
+ m8820x_cmmu_set(CMMU_BWP(entry_no), value, MODE_VAL, cpu, DATA_CMMU, 0);
#ifdef SHADOW_BATC
CMMU(cpu,DATA_CMMU)->batc[entry_no] = value;
#endif
- m8820x_cmmu_set(CMMU_BWP(entry_no), value, MODE_VAL | ACCESS_VAL,
- cpu, INST_CMMU, CMMU_ACS_USER, 0);
+ m8820x_cmmu_set(CMMU_BWP(entry_no), value, MODE_VAL, cpu, INST_CMMU, 0);
#ifdef SHADOW_BATC
CMMU(cpu,INST_CMMU)->batc[entry_no] = value;
#endif
@@ -1091,26 +936,21 @@ m8820x_cmmu_flush_tlb(unsigned cpu, unsigned kernel, vaddr_t vaddr,
*/
if (size == PAGE_SIZE) { /* most frequent situation */
m8820x_cmmu_set(CMMU_SAR, vaddr,
- ADDR_VAL | ACCESS_VAL, cpu, 0,
- kernel ? CMMU_ACS_SUPER : CMMU_ACS_USER, vaddr);
+ ADDR_VAL, cpu, 0, vaddr);
m8820x_cmmu_set(CMMU_SCR,
kernel ? CMMU_FLUSH_SUPER_PAGE : CMMU_FLUSH_USER_PAGE,
- ADDR_VAL | ACCESS_VAL, cpu, 0,
- kernel ? CMMU_ACS_SUPER : CMMU_ACS_USER, vaddr);
+ ADDR_VAL, cpu, 0, vaddr);
} else if (size > 3 * PAGE_SIZE) {
m8820x_cmmu_set(CMMU_SCR,
kernel ? CMMU_FLUSH_SUPER_ALL : CMMU_FLUSH_USER_ALL,
- ACCESS_VAL, cpu, 0,
- kernel ? CMMU_ACS_SUPER : CMMU_ACS_USER, 0);
+ 0, cpu, 0, 0);
} else
while (size != 0) {
m8820x_cmmu_set(CMMU_SAR, vaddr,
- ADDR_VAL | ACCESS_VAL, cpu, 0,
- kernel ? CMMU_ACS_SUPER : CMMU_ACS_USER, vaddr);
+ ADDR_VAL, cpu, 0, vaddr);
m8820x_cmmu_set(CMMU_SCR,
kernel ? CMMU_FLUSH_SUPER_PAGE : CMMU_FLUSH_USER_PAGE,
- ADDR_VAL | ACCESS_VAL, cpu, 0,
- kernel ? CMMU_ACS_SUPER : CMMU_ACS_USER, vaddr);
+ ADDR_VAL, cpu, 0, vaddr);
size -= PAGE_SIZE;
vaddr += PAGE_SIZE;
@@ -1136,14 +976,13 @@ m8820x_cmmu_pmap_activate(cpu, uapr, i_batc, d_batc)
CMMU_LOCK;
/* the following is from m8820x_cmmu_set_uapr */
- m8820x_cmmu_set(CMMU_UAPR, uapr, ACCESS_VAL,
- cpu, 0, CMMU_ACS_USER, 0);
+ m8820x_cmmu_set(CMMU_UAPR, uapr, 0, cpu, 0, 0);
for (entry_no = 0; entry_no < BATC_MAX; entry_no++) {
m8820x_cmmu_set(CMMU_BWP(entry_no), i_batc[entry_no],
- MODE_VAL | ACCESS_VAL, cpu, INST_CMMU, CMMU_ACS_USER, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_BWP(entry_no), d_batc[entry_no],
- MODE_VAL | ACCESS_VAL, cpu, DATA_CMMU, CMMU_ACS_USER, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
#ifdef SHADOW_BATC
CMMU(cpu,INST_CMMU)->batc[entry_no] = i_batc[entry_no];
CMMU(cpu,DATA_CMMU)->batc[entry_no] = d_batc[entry_no];
@@ -1155,8 +994,7 @@ m8820x_cmmu_pmap_activate(cpu, uapr, i_batc, d_batc)
* IF THE KERNEL WILL EVER CARE ABOUT THE BATC ENTRIES,
* THE SUPERVISOR TLBs SHOULD BE FLUSHED AS WELL.
*/
- m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_USER_ALL, ACCESS_VAL,
- cpu, 0, CMMU_ACS_USER, 0);
+ m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_USER_ALL, 0, cpu, 0, 0);
CMMU_UNLOCK;
}
@@ -1187,26 +1025,25 @@ m8820x_cmmu_flush_cache(int cpu, paddr_t physaddr, psize_t size)
#if !defined(BROKEN_MMU_MASK)
if (size > NBSG) {
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, 0,
- cpu, 0, 0, 0);
+ cpu, 0, 0);
} else if (size <= MC88200_CACHE_LINE) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr, ADDR_VAL,
- cpu, 0, 0, (unsigned)physaddr);
+ cpu, 0, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_LINE, ADDR_VAL,
- cpu, 0, 0, (unsigned)physaddr);
+ cpu, 0, (unsigned)physaddr);
} else if (size <= NBPG) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr, ADDR_VAL,
- cpu, 0, 0, (unsigned)physaddr);
+ cpu, 0, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_PAGE, ADDR_VAL,
- cpu, 0, 0, (unsigned)physaddr);
+ cpu, 0, (unsigned)physaddr);
} else {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr, 0,
- cpu, 0, 0, 0);
+ cpu, 0, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_SEGMENT, 0,
- cpu, 0, 0, 0);
+ cpu, 0, 0);
}
#else
- m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, 0,
- cpu, 0, 0, 0);
+ m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, 0, cpu, 0, 0);
#endif /* !BROKEN_MMU_MASK */
m8820x_cmmu_wait(cpu);
@@ -1227,26 +1064,26 @@ m8820x_cmmu_flush_inst_cache(int cpu, paddr_t physaddr, psize_t size)
#if !defined(BROKEN_MMU_MASK)
if (size > NBSG) {
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
} else if (size <= MC88200_CACHE_LINE) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_LINE,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
} else if (size <= NBPG) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_PAGE,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
} else {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_SEGMENT,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
}
#else
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
#endif /* !BROKEN_MMU_MASK */
m8820x_cmmu_wait(cpu);
@@ -1264,26 +1101,26 @@ m8820x_cmmu_flush_data_cache(int cpu, paddr_t physaddr, psize_t size)
#if !defined(BROKEN_MMU_MASK)
if (size > NBSG) {
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
} else if (size <= MC88200_CACHE_LINE) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_LINE,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
} else if (size <= NBPG) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_PAGE,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
} else {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_SEGMENT,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
}
#else
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
#endif /* !BROKEN_MMU_MASK */
m8820x_cmmu_wait(cpu);
@@ -1306,42 +1143,42 @@ m8820x_cmmu_sync_cache(paddr_t physaddr, psize_t size)
#if !defined(BROKEN_MMU_MASK)
if (size > NBSG) {
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CB_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CB_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
} else if (size <= MC88200_CACHE_LINE) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CB_LINE,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CB_LINE,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
} else if (size <= NBPG) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CB_PAGE,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CB_PAGE,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
} else {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CB_SEGMENT,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CB_SEGMENT,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
}
#else
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CB_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CB_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
#endif /* !BROKEN_MMU_MASK */
m8820x_cmmu_wait(cpu);
@@ -1361,42 +1198,42 @@ m8820x_cmmu_sync_inval_cache(paddr_t physaddr, psize_t size)
#if !defined(BROKEN_MMU_MASK)
if (size > NBSG) {
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
} else if (size <= MC88200_CACHE_LINE) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CBI_LINE,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CBI_LINE,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
} else if (size <= NBPG) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CBI_PAGE,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CBI_PAGE,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
} else {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CBI_SEGMENT,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_CBI_SEGMENT,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
}
#else
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_CBI_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
#endif /* !BROKEN_MMU_MASK */
m8820x_cmmu_wait(cpu);
@@ -1416,42 +1253,42 @@ m8820x_cmmu_inval_cache(paddr_t physaddr, psize_t size)
#if !defined(BROKEN_MMU_MASK)
if (size > NBSG) {
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_INV_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_INV_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
} else if (size <= MC88200_CACHE_LINE) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_INV_LINE,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_INV_LINE,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
} else if (size <= NBPG) {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_INV_PAGE,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_INV_PAGE,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
} else {
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, INST_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, INST_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_INV_SEGMENT,
- MODE_VAL, cpu, INST_CMMU, 0, 0);
+ MODE_VAL, cpu, INST_CMMU, 0);
m8820x_cmmu_set(CMMU_SAR, (unsigned)physaddr,
- MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, 0, (unsigned)physaddr);
+ MODE_VAL | ADDR_VAL, cpu, DATA_CMMU, (unsigned)physaddr);
m8820x_cmmu_set(CMMU_SAR, CMMU_FLUSH_CACHE_INV_SEGMENT,
- MODE_VAL, cpu, DATA_CMMU, 0, 0);
+ MODE_VAL, cpu, DATA_CMMU, 0);
}
#else
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_INV_ALL, MODE_VAL,
- cpu, DATA_CMMU, 0, 0);
+ cpu, DATA_CMMU, 0);
m8820x_cmmu_set(CMMU_SCR, CMMU_FLUSH_CACHE_INV_ALL, MODE_VAL,
- cpu, INST_CMMU, 0, 0);
+ cpu, INST_CMMU, 0);
#endif /* !BROKEN_MMU_MASK */
m8820x_cmmu_wait(cpu);
@@ -1668,11 +1505,9 @@ m8820x_cmmu_show_translation(address, supervisor_flag, verbose_flag, cmmu_num)
return;
}
- if (m8820x_cmmu[cmmu_num].cmmu_alive == CMMU_DEAD) {
+ if (m8820x_cmmu[cmmu_num].cmmu_type == NO_CMMU) {
db_printf("warning: cmmu %d is not alive.\n", cmmu_num);
-#if 0
return;
-#endif
}
if (!verbose_flag) {
@@ -1682,7 +1517,7 @@ m8820x_cmmu_show_translation(address, supervisor_flag, verbose_flag, cmmu_num)
} else {
int i;
for (i = 0; i < MAX_CMMUS; i++)
- if ((i == cmmu_num || m8820x_cmmu[i].cmmu_alive != CMMU_DEAD) &&
+ if ((i == cmmu_num || m8820x_cmmu[i].cmmu_type != NO_CMMU) &&
(verbose_flag > 1 || !(m8820x_cmmu[i].cmmu_regs[CMMU_SCTR] & CMMU_SCTR_SE))) {
db_printf("CMMU#%d (cpu %d %s) snooping %s\n", i,
m8820x_cmmu[i].cmmu_cpu, m8820x_cmmu[i].cmmu_type ? "data" : "inst",
@@ -1720,7 +1555,7 @@ m8820x_cmmu_show_translation(address, supervisor_flag, verbose_flag, cmmu_num)
/******* SEE WHAT A PROBE SAYS (if not a thread) ***********/
{
union ssr ssr;
- unsigned *volatile cmmu_regs = m8820x_cmmu[cmmu_num].cmmu_regs;
+ volatile unsigned *cmmu_regs = m8820x_cmmu[cmmu_num].cmmu_regs;
cmmu_regs[CMMU_SAR] = address;
cmmu_regs[CMMU_SCR] = supervisor_flag ? CMMU_PROBE_SUPER : CMMU_PROBE_USER;
ssr.bits = cmmu_regs[CMMU_SSR];