Revision 97bf4851 hw/eccmemctl.c
b/hw/eccmemctl.c | ||
---|---|---|
23 | 23 |
*/ |
24 | 24 |
|
25 | 25 |
#include "sysbus.h" |
26 |
|
|
27 |
//#define DEBUG_ECC |
|
28 |
|
|
29 |
#ifdef DEBUG_ECC |
|
30 |
#define DPRINTF(fmt, ...) \ |
|
31 |
do { printf("ECC: " fmt , ## __VA_ARGS__); } while (0) |
|
32 |
#else |
|
33 |
#define DPRINTF(fmt, ...) |
|
34 |
#endif |
|
26 |
#include "trace.h" |
|
35 | 27 |
|
36 | 28 |
/* There are 3 versions of this chip used in SMP sun4m systems: |
37 | 29 |
* MCC (version 0, implementation 0) SS-600MP |
... | ... | |
148 | 140 |
s->regs[ECC_MER] = s->version | (val & ECC_MER_MASK_1); |
149 | 141 |
else if (s->version == ECC_SMC) |
150 | 142 |
s->regs[ECC_MER] = s->version | (val & ECC_MER_MASK_2); |
151 |
DPRINTF("Write memory enable %08x\n", val);
|
|
143 |
trace_ecc_mem_writel_mer(val);
|
|
152 | 144 |
break; |
153 | 145 |
case ECC_MDR: |
154 | 146 |
s->regs[ECC_MDR] = val & ECC_MDR_MASK; |
155 |
DPRINTF("Write memory delay %08x\n", val);
|
|
147 |
trace_ecc_mem_writel_mdr(val);
|
|
156 | 148 |
break; |
157 | 149 |
case ECC_MFSR: |
158 | 150 |
s->regs[ECC_MFSR] = val; |
159 | 151 |
qemu_irq_lower(s->irq); |
160 |
DPRINTF("Write memory fault status %08x\n", val);
|
|
152 |
trace_ecc_mem_writel_mfsr(val);
|
|
161 | 153 |
break; |
162 | 154 |
case ECC_VCR: |
163 | 155 |
s->regs[ECC_VCR] = val; |
164 |
DPRINTF("Write slot configuration %08x\n", val);
|
|
156 |
trace_ecc_mem_writel_vcr(val);
|
|
165 | 157 |
break; |
166 | 158 |
case ECC_DR: |
167 | 159 |
s->regs[ECC_DR] = val; |
168 |
DPRINTF("Write diagnostic %08x\n", val);
|
|
160 |
trace_ecc_mem_writel_dr(val);
|
|
169 | 161 |
break; |
170 | 162 |
case ECC_ECR0: |
171 | 163 |
s->regs[ECC_ECR0] = val; |
172 |
DPRINTF("Write event count 1 %08x\n", val);
|
|
164 |
trace_ecc_mem_writel_ecr0(val);
|
|
173 | 165 |
break; |
174 | 166 |
case ECC_ECR1: |
175 | 167 |
s->regs[ECC_ECR0] = val; |
176 |
DPRINTF("Write event count 2 %08x\n", val);
|
|
168 |
trace_ecc_mem_writel_ecr1(val);
|
|
177 | 169 |
break; |
178 | 170 |
} |
179 | 171 |
} |
... | ... | |
186 | 178 |
switch (addr >> 2) { |
187 | 179 |
case ECC_MER: |
188 | 180 |
ret = s->regs[ECC_MER]; |
189 |
DPRINTF("Read memory enable %08x\n", ret);
|
|
181 |
trace_ecc_mem_readl_mer(ret);
|
|
190 | 182 |
break; |
191 | 183 |
case ECC_MDR: |
192 | 184 |
ret = s->regs[ECC_MDR]; |
193 |
DPRINTF("Read memory delay %08x\n", ret);
|
|
185 |
trace_ecc_mem_readl_mdr(ret);
|
|
194 | 186 |
break; |
195 | 187 |
case ECC_MFSR: |
196 | 188 |
ret = s->regs[ECC_MFSR]; |
197 |
DPRINTF("Read memory fault status %08x\n", ret);
|
|
189 |
trace_ecc_mem_readl_mfsr(ret);
|
|
198 | 190 |
break; |
199 | 191 |
case ECC_VCR: |
200 | 192 |
ret = s->regs[ECC_VCR]; |
201 |
DPRINTF("Read slot configuration %08x\n", ret);
|
|
193 |
trace_ecc_mem_readl_vcr(ret);
|
|
202 | 194 |
break; |
203 | 195 |
case ECC_MFAR0: |
204 | 196 |
ret = s->regs[ECC_MFAR0]; |
205 |
DPRINTF("Read memory fault address 0 %08x\n", ret);
|
|
197 |
trace_ecc_mem_readl_mfar0(ret);
|
|
206 | 198 |
break; |
207 | 199 |
case ECC_MFAR1: |
208 | 200 |
ret = s->regs[ECC_MFAR1]; |
209 |
DPRINTF("Read memory fault address 1 %08x\n", ret);
|
|
201 |
trace_ecc_mem_readl_mfar1(ret);
|
|
210 | 202 |
break; |
211 | 203 |
case ECC_DR: |
212 | 204 |
ret = s->regs[ECC_DR]; |
213 |
DPRINTF("Read diagnostic %08x\n", ret);
|
|
205 |
trace_ecc_mem_readl_dr(ret);
|
|
214 | 206 |
break; |
215 | 207 |
case ECC_ECR0: |
216 | 208 |
ret = s->regs[ECC_ECR0]; |
217 |
DPRINTF("Read event count 1 %08x\n", ret);
|
|
209 |
trace_ecc_mem_readl_ecr0(ret);
|
|
218 | 210 |
break; |
219 | 211 |
case ECC_ECR1: |
220 | 212 |
ret = s->regs[ECC_ECR0]; |
221 |
DPRINTF("Read event count 2 %08x\n", ret);
|
|
213 |
trace_ecc_mem_readl_ecr1(ret);
|
|
222 | 214 |
break; |
223 | 215 |
} |
224 | 216 |
return ret; |
... | ... | |
241 | 233 |
{ |
242 | 234 |
ECCState *s = opaque; |
243 | 235 |
|
244 |
DPRINTF("Write diagnostic[%d] = %02x\n", (int)addr, val);
|
|
236 |
trace_ecc_diag_mem_writeb(addr, val);
|
|
245 | 237 |
s->diag[addr & ECC_DIAG_MASK] = val; |
246 | 238 |
} |
247 | 239 |
|
... | ... | |
250 | 242 |
ECCState *s = opaque; |
251 | 243 |
uint32_t ret = s->diag[(int)addr]; |
252 | 244 |
|
253 |
DPRINTF("Read diagnostic[%d] = %02x\n", (int)addr, ret);
|
|
245 |
trace_ecc_diag_mem_readb(addr, ret);
|
|
254 | 246 |
return ret; |
255 | 247 |
} |
256 | 248 |
|
Also available in: Unified diff