Commit 0da75eb13524d5aa426486d015d63e1b6ce34aa2
1 parent
605686cd
Big endian support for Gallileo, by Aurelien Jarno.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2330 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
67 additions
and
5 deletions
hw/gt64xxx.c
| ... | ... | @@ -240,14 +240,19 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
| 240 | 240 | GT64120State *s = opaque; |
| 241 | 241 | uint32_t saddr; |
| 242 | 242 | |
| 243 | +#ifdef TARGET_WORDS_BIGENDIAN | |
| 244 | + val = bswap32(val); | |
| 245 | +#endif | |
| 246 | + | |
| 243 | 247 | saddr = (addr & 0xfff) >> 2; |
| 244 | 248 | switch (saddr) { |
| 245 | - /* CPU Configuration Register */ | |
| 249 | + | |
| 250 | + /* CPU Configuration */ | |
| 246 | 251 | case GT_CPU: |
| 247 | 252 | s->regs[GT_CPU] = val; |
| 248 | - gt64120_pci_mapping(s); | |
| 249 | 253 | break; |
| 250 | 254 | case GT_MULTI: |
| 255 | + /* Read-only register as only one GT64xxx is present on the CPU bus */ | |
| 251 | 256 | break; |
| 252 | 257 | |
| 253 | 258 | /* CPU Address Decode */ |
| ... | ... | @@ -306,6 +311,13 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
| 306 | 311 | case GT_CPUERR_DATALO: |
| 307 | 312 | case GT_CPUERR_DATAHI: |
| 308 | 313 | case GT_CPUERR_PARITY: |
| 314 | + /* Read-only registers, do nothing */ | |
| 315 | + break; | |
| 316 | + | |
| 317 | + /* CPU Sync Barrier */ | |
| 318 | + case GT_PCI0SYNC: | |
| 319 | + case GT_PCI1SYNC: | |
| 320 | + /* Read-only registers, do nothing */ | |
| 309 | 321 | break; |
| 310 | 322 | |
| 311 | 323 | /* ECC */ |
| ... | ... | @@ -314,6 +326,7 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
| 314 | 326 | case GT_ECC_MEM: |
| 315 | 327 | case GT_ECC_CALC: |
| 316 | 328 | case GT_ECC_ERRADDR: |
| 329 | + /* Read-only registers, do nothing */ | |
| 317 | 330 | break; |
| 318 | 331 | |
| 319 | 332 | /* PCI Internal */ |
| ... | ... | @@ -328,6 +341,16 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
| 328 | 341 | pci_host_data_writel(s->pci, 0, val); |
| 329 | 342 | break; |
| 330 | 343 | |
| 344 | + /* SDRAM Parameters */ | |
| 345 | + case GT_SDRAM_B0: | |
| 346 | + case GT_SDRAM_B1: | |
| 347 | + case GT_SDRAM_B2: | |
| 348 | + case GT_SDRAM_B3: | |
| 349 | + /* We don't simulate electrical parameters of the SDRAM. | |
| 350 | + Accept, but ignore the values. */ | |
| 351 | + s->regs[saddr] = val; | |
| 352 | + break; | |
| 353 | + | |
| 331 | 354 | default: |
| 332 | 355 | #if 0 |
| 333 | 356 | printf ("gt64120_writel: Bad register offset 0x%x\n", (int)addr); |
| ... | ... | @@ -348,13 +371,31 @@ static uint32_t gt64120_readl (void *opaque, |
| 348 | 371 | |
| 349 | 372 | switch (saddr) { |
| 350 | 373 | |
| 374 | + /* CPU Configuration */ | |
| 375 | + case GT_MULTI: | |
| 376 | + /* Only one GT64xxx is present on the CPU bus, return | |
| 377 | + the initial value */ | |
| 378 | + val = s->regs[saddr]; | |
| 379 | + break; | |
| 380 | + | |
| 351 | 381 | /* CPU Error Report */ |
| 352 | 382 | case GT_CPUERR_ADDRLO: |
| 353 | 383 | case GT_CPUERR_ADDRHI: |
| 354 | 384 | case GT_CPUERR_DATALO: |
| 355 | 385 | case GT_CPUERR_DATAHI: |
| 356 | 386 | case GT_CPUERR_PARITY: |
| 357 | - return 0; | |
| 387 | + /* Emulated memory has no error, always return the initial | |
| 388 | + values */ | |
| 389 | + val = s->regs[saddr]; | |
| 390 | + break; | |
| 391 | + | |
| 392 | + /* CPU Sync Barrier */ | |
| 393 | + case GT_PCI0SYNC: | |
| 394 | + case GT_PCI1SYNC: | |
| 395 | + /* Reading those register should empty all FIFO on the PCI | |
| 396 | + bus, which are not emulated. The return value should be | |
| 397 | + a random value that should be ignored. */ | |
| 398 | + val = 0xc000ffee; | |
| 358 | 399 | break; |
| 359 | 400 | |
| 360 | 401 | /* ECC */ |
| ... | ... | @@ -363,11 +404,12 @@ static uint32_t gt64120_readl (void *opaque, |
| 363 | 404 | case GT_ECC_MEM: |
| 364 | 405 | case GT_ECC_CALC: |
| 365 | 406 | case GT_ECC_ERRADDR: |
| 366 | - return 0; | |
| 407 | + /* Emulated memory has no error, always return the initial | |
| 408 | + values */ | |
| 409 | + val = s->regs[saddr]; | |
| 367 | 410 | break; |
| 368 | 411 | |
| 369 | 412 | case GT_CPU: |
| 370 | - case GT_MULTI: | |
| 371 | 413 | case GT_PCI0IOLD: |
| 372 | 414 | case GT_PCI0M0LD: |
| 373 | 415 | case GT_PCI0M1LD: |
| ... | ... | @@ -394,6 +436,16 @@ static uint32_t gt64120_readl (void *opaque, |
| 394 | 436 | val = pic_intack_read(isa_pic); |
| 395 | 437 | break; |
| 396 | 438 | |
| 439 | + /* SDRAM Parameters */ | |
| 440 | + case GT_SDRAM_B0: | |
| 441 | + case GT_SDRAM_B1: | |
| 442 | + case GT_SDRAM_B2: | |
| 443 | + case GT_SDRAM_B3: | |
| 444 | + /* We don't simulate electrical parameters of the SDRAM. | |
| 445 | + Just return the last written value. */ | |
| 446 | + val = s->regs[saddr]; | |
| 447 | + break; | |
| 448 | + | |
| 397 | 449 | /* PCI Internal */ |
| 398 | 450 | case GT_PCI0_CFGADDR: |
| 399 | 451 | val = s->pci->config_reg; |
| ... | ... | @@ -410,7 +462,11 @@ static uint32_t gt64120_readl (void *opaque, |
| 410 | 462 | break; |
| 411 | 463 | } |
| 412 | 464 | |
| 465 | +#ifdef TARGET_WORDS_BIGENDIAN | |
| 466 | + return bswap32(val); | |
| 467 | +#else | |
| 413 | 468 | return val; |
| 469 | +#endif | |
| 414 | 470 | } |
| 415 | 471 | |
| 416 | 472 | static CPUWriteMemoryFunc *gt64120_write[] = { |
| ... | ... | @@ -521,6 +577,12 @@ void gt64120_reset(void *opaque) |
| 521 | 577 | s->regs[GT_ECC_CALC] = 0x00000000; |
| 522 | 578 | s->regs[GT_ECC_ERRADDR] = 0x00000000; |
| 523 | 579 | |
| 580 | + /* SDRAM Parameters */ | |
| 581 | + s->regs[GT_SDRAM_B0] = 0x00000005; | |
| 582 | + s->regs[GT_SDRAM_B1] = 0x00000005; | |
| 583 | + s->regs[GT_SDRAM_B2] = 0x00000005; | |
| 584 | + s->regs[GT_SDRAM_B3] = 0x00000005; | |
| 585 | + | |
| 524 | 586 | /* PCI Internal FIXME: not complete*/ |
| 525 | 587 | #ifdef TARGET_WORDS_BIGENDIAN |
| 526 | 588 | s->regs[GT_PCI0_CMD] = 0x00000000; | ... | ... |