Commit c2432a42fe13c3c6774f5443ac8f6f7261fe91d1

Authored by aurel32
1 parent 68af3f24

SH7750/51: add register BCR3, BCR4, PCR, RTCOR, RTCNT, RTCSR, SDMR2, SDMR3 and fix BCR2 support

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6548 c046a42c-6fe2-441c-8c8c-71466251a162
hw/sh7750.c
@@ -42,8 +42,12 @@ typedef struct SH7750State { @@ -42,8 +42,12 @@ typedef struct SH7750State {
42 uint32_t periph_freq; 42 uint32_t periph_freq;
43 /* SDRAM controller */ 43 /* SDRAM controller */
44 uint32_t bcr1; 44 uint32_t bcr1;
45 - uint32_t bcr2; 45 + uint16_t bcr2;
  46 + uint16_t bcr3;
  47 + uint32_t bcr4;
46 uint16_t rfcr; 48 uint16_t rfcr;
  49 + /* PCMCIA controller */
  50 + uint16_t pcr;
47 /* IO ports */ 51 /* IO ports */
48 uint16_t gpioic; 52 uint16_t gpioic;
49 uint32_t pctra; 53 uint32_t pctra;
@@ -66,7 +70,10 @@ typedef struct SH7750State { @@ -66,7 +70,10 @@ typedef struct SH7750State {
66 struct intc_desc intc; 70 struct intc_desc intc;
67 } SH7750State; 71 } SH7750State;
68 72
69 - 73 +static int inline has_bcr3_and_bcr4(SH7750State * s)
  74 +{
  75 + return (s->cpu->features & SH_FEATURE_BCR3_AND_BCR4);
  76 +}
70 /********************************************************************** 77 /**********************************************************************
71 I/O ports 78 I/O ports
72 **********************************************************************/ 79 **********************************************************************/
@@ -211,8 +218,14 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr) @@ -211,8 +218,14 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr)
211 switch (addr) { 218 switch (addr) {
212 case SH7750_BCR2_A7: 219 case SH7750_BCR2_A7:
213 return s->bcr2; 220 return s->bcr2;
  221 + case SH7750_BCR3_A7:
  222 + if(!has_bcr3_and_bcr4(s))
  223 + error_access("word read", addr);
  224 + return s->bcr3;
214 case SH7750_FRQCR_A7: 225 case SH7750_FRQCR_A7:
215 return 0; 226 return 0;
  227 + case SH7750_PCR_A7:
  228 + return s->pcr;
216 case SH7750_RFCR_A7: 229 case SH7750_RFCR_A7:
217 fprintf(stderr, 230 fprintf(stderr,
218 "Read access to refresh count register, incrementing\n"); 231 "Read access to refresh count register, incrementing\n");
@@ -221,6 +234,11 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr) @@ -221,6 +234,11 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr)
221 return porta_lines(s); 234 return porta_lines(s);
222 case SH7750_PDTRB_A7: 235 case SH7750_PDTRB_A7:
223 return portb_lines(s); 236 return portb_lines(s);
  237 + case SH7750_RTCOR_A7:
  238 + case SH7750_RTCNT_A7:
  239 + case SH7750_RTCSR_A7:
  240 + ignore_access("word read", addr);
  241 + return 0;
224 default: 242 default:
225 error_access("word read", addr); 243 error_access("word read", addr);
226 assert(0); 244 assert(0);
@@ -235,6 +253,9 @@ static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr) @@ -235,6 +253,9 @@ static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr)
235 case SH7750_BCR1_A7: 253 case SH7750_BCR1_A7:
236 return s->bcr1; 254 return s->bcr1;
237 case SH7750_BCR4_A7: 255 case SH7750_BCR4_A7:
  256 + if(!has_bcr3_and_bcr4(s))
  257 + error_access("long read", addr);
  258 + return s->bcr4;
238 case SH7750_WCR1_A7: 259 case SH7750_WCR1_A7:
239 case SH7750_WCR2_A7: 260 case SH7750_WCR2_A7:
240 case SH7750_WCR3_A7: 261 case SH7750_WCR3_A7:
@@ -271,19 +292,19 @@ static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr) @@ -271,19 +292,19 @@ static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr)
271 } 292 }
272 } 293 }
273 294
  295 +#define is_in_sdrmx(a, x) (a >= SH7750_SDMR ## x ## _A7 \
  296 + && a <= (SH7750_SDMR ## x ## _A7 + SH7750_SDMR ## x ## _REGNB))
274 static void sh7750_mem_writeb(void *opaque, target_phys_addr_t addr, 297 static void sh7750_mem_writeb(void *opaque, target_phys_addr_t addr,
275 uint32_t mem_value) 298 uint32_t mem_value)
276 { 299 {
277 - switch (addr) {  
278 - /* PRECHARGE ? XXXXX */  
279 - case SH7750_PRECHARGE0_A7:  
280 - case SH7750_PRECHARGE1_A7: 300 +
  301 + if (is_in_sdrmx(addr, 2) || is_in_sdrmx(addr, 3)) {
281 ignore_access("byte write", addr); 302 ignore_access("byte write", addr);
282 return; 303 return;
283 - default:  
284 - error_access("byte write", addr);  
285 - assert(0);  
286 } 304 }
  305 +
  306 + error_access("byte write", addr);
  307 + assert(0);
287 } 308 }
288 309
289 static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr, 310 static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr,
@@ -298,8 +319,15 @@ static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr, @@ -298,8 +319,15 @@ static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr,
298 s->bcr2 = mem_value; 319 s->bcr2 = mem_value;
299 return; 320 return;
300 case SH7750_BCR3_A7: 321 case SH7750_BCR3_A7:
301 - case SH7750_RTCOR_A7: 322 + if(!has_bcr3_and_bcr4(s))
  323 + error_access("word write", addr);
  324 + s->bcr3 = mem_value;
  325 + return;
  326 + case SH7750_PCR_A7:
  327 + s->pcr = mem_value;
  328 + return;
302 case SH7750_RTCNT_A7: 329 case SH7750_RTCNT_A7:
  330 + case SH7750_RTCOR_A7:
303 case SH7750_RTCSR_A7: 331 case SH7750_RTCSR_A7:
304 ignore_access("word write", addr); 332 ignore_access("word write", addr);
305 return; 333 return;
@@ -343,6 +371,10 @@ static void sh7750_mem_writel(void *opaque, target_phys_addr_t addr, @@ -343,6 +371,10 @@ static void sh7750_mem_writel(void *opaque, target_phys_addr_t addr,
343 s->bcr1 = mem_value; 371 s->bcr1 = mem_value;
344 return; 372 return;
345 case SH7750_BCR4_A7: 373 case SH7750_BCR4_A7:
  374 + if(!has_bcr3_and_bcr4(s))
  375 + error_access("long write", addr);
  376 + s->bcr4 = mem_value;
  377 + return;
346 case SH7750_WCR1_A7: 378 case SH7750_WCR1_A7:
347 case SH7750_WCR2_A7: 379 case SH7750_WCR2_A7:
348 case SH7750_WCR3_A7: 380 case SH7750_WCR3_A7:
hw/sh7750_regnames.c
@@ -80,8 +80,8 @@ static regname_t regnames[] = { @@ -80,8 +80,8 @@ static regname_t regnames[] = {
80 REGNAME(SH7750_ICR_A7) 80 REGNAME(SH7750_ICR_A7)
81 REGNAME(SH7750_BCR3_A7) 81 REGNAME(SH7750_BCR3_A7)
82 REGNAME(SH7750_BCR4_A7) 82 REGNAME(SH7750_BCR4_A7)
83 - REGNAME(SH7750_PRECHARGE0_A7)  
84 - REGNAME(SH7750_PRECHARGE1_A7) {(uint32_t) - 1, 0} 83 + REGNAME(SH7750_SDMR2_A7)
  84 + REGNAME(SH7750_SDMR3_A7) {(uint32_t) - 1, 0}
85 }; 85 };
86 86
87 const char *regname(uint32_t addr) 87 const char *regname(uint32_t addr)
hw/sh7750_regs.h
@@ -979,6 +979,17 @@ @@ -979,6 +979,17 @@
979 979
980 #define SH7750_RFCR_KEY 0xA400 /* RFCR write key */ 980 #define SH7750_RFCR_KEY 0xA400 /* RFCR write key */
981 981
  982 +/* Synchronous DRAM mode registers - SDMR */
  983 +#define SH7750_SDMR2_REGOFS 0x900000 /* base offset */
  984 +#define SH7750_SDMR2_REGNB 0x0FFC /* nb of register */
  985 +#define SH7750_SDMR2 SH7750_P4_REG32(SH7750_SDMR2_REGOFS)
  986 +#define SH7750_SDMR2_A7 SH7750_A7_REG32(SH7750_SDMR2_REGOFS)
  987 +
  988 +#define SH7750_SDMR3_REGOFS 0x940000 /* offset */
  989 +#define SH7750_SDMR3_REGNB 0x0FFC /* nb of register */
  990 +#define SH7750_SDMR3 SH7750_P4_REG32(SH7750_SDMR3_REGOFS)
  991 +#define SH7750_SDMR3_A7 SH7750_A7_REG32(SH7750_SDMR3_REGOFS)
  992 +
982 /* 993 /*
983 * Direct Memory Access Controller (DMAC) 994 * Direct Memory Access Controller (DMAC)
984 */ 995 */
@@ -1262,7 +1273,5 @@ @@ -1262,7 +1273,5 @@
1262 */ 1273 */
1263 #define SH7750_BCR3_A7 0x1f800050 1274 #define SH7750_BCR3_A7 0x1f800050
1264 #define SH7750_BCR4_A7 0x1e0a00f0 1275 #define SH7750_BCR4_A7 0x1e0a00f0
1265 -#define SH7750_PRECHARGE0_A7 0x1f900088  
1266 -#define SH7750_PRECHARGE1_A7 0x1f940088  
1267 1276
1268 #endif 1277 #endif
target-sh4/cpu.h
@@ -95,6 +95,7 @@ typedef struct tlb_t { @@ -95,6 +95,7 @@ typedef struct tlb_t {
95 95
96 enum sh_features { 96 enum sh_features {
97 SH_FEATURE_SH4A = 1, 97 SH_FEATURE_SH4A = 1,
  98 + SH_FEATURE_BCR3_AND_BCR4 = 2,
98 }; 99 };
99 100
100 typedef struct CPUSH4State { 101 typedef struct CPUSH4State {
target-sh4/translate.c
@@ -222,12 +222,14 @@ static sh4_def_t sh4_defs[] = { @@ -222,12 +222,14 @@ static sh4_def_t sh4_defs[] = {
222 .pvr = 0x00050000, 222 .pvr = 0x00050000,
223 .prr = 0x00000100, 223 .prr = 0x00000100,
224 .cvr = 0x00110000, 224 .cvr = 0x00110000,
  225 + .features = SH_FEATURE_BCR3_AND_BCR4,
225 }, { 226 }, {
226 .name = "SH7751R", 227 .name = "SH7751R",
227 .id = SH_CPU_SH7751R, 228 .id = SH_CPU_SH7751R,
228 .pvr = 0x04050005, 229 .pvr = 0x04050005,
229 .prr = 0x00000113, 230 .prr = 0x00000113,
230 .cvr = 0x00110000, /* Neutered caches, should be 0x20480000 */ 231 .cvr = 0x00110000, /* Neutered caches, should be 0x20480000 */
  232 + .features = SH_FEATURE_BCR3_AND_BCR4,
231 }, { 233 }, {
232 .name = "SH7785", 234 .name = "SH7785",
233 .id = SH_CPU_SH7785, 235 .id = SH_CPU_SH7785,