Commit 05b4ff435717e6b8355f6cd73ea17f2d9eaa9a55

Authored by ths
1 parent 9566782b

Implement some more Gallileo registers.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2953 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 336 additions and 17 deletions
hw/gt64xxx.c
@@ -23,9 +23,18 @@ @@ -23,9 +23,18 @@
23 */ 23 */
24 24
25 #include "vl.h" 25 #include "vl.h"
  26 +
26 typedef target_phys_addr_t pci_addr_t; 27 typedef target_phys_addr_t pci_addr_t;
27 #include "pci_host.h" 28 #include "pci_host.h"
28 29
  30 +//#define DEBUG
  31 +
  32 +#ifdef DEBUG
  33 +#define dprintf(fmt, ...) fprintf(stderr, "%s: " fmt, __FUNCTION__, ##__VA_ARGS__)
  34 +#else
  35 +#define dprintf(fmt, ...)
  36 +#endif
  37 +
29 #define GT_REGS (0x1000 >> 2) 38 #define GT_REGS (0x1000 >> 2)
30 39
31 /* CPU Configuration */ 40 /* CPU Configuration */
@@ -45,8 +54,6 @@ typedef target_phys_addr_t pci_addr_t; @@ -45,8 +54,6 @@ typedef target_phys_addr_t pci_addr_t;
45 #define GT_PCI0IOHD (0x050 >> 2) 54 #define GT_PCI0IOHD (0x050 >> 2)
46 #define GT_PCI0M0LD (0x058 >> 2) 55 #define GT_PCI0M0LD (0x058 >> 2)
47 #define GT_PCI0M0HD (0x060 >> 2) 56 #define GT_PCI0M0HD (0x060 >> 2)
48 -#define GT_ISD (0x068 >> 2)  
49 -  
50 #define GT_PCI0M1LD (0x080 >> 2) 57 #define GT_PCI0M1LD (0x080 >> 2)
51 #define GT_PCI0M1HD (0x088 >> 2) 58 #define GT_PCI0M1HD (0x088 >> 2)
52 #define GT_PCI1IOLD (0x090 >> 2) 59 #define GT_PCI1IOLD (0x090 >> 2)
@@ -55,8 +62,7 @@ typedef target_phys_addr_t pci_addr_t; @@ -55,8 +62,7 @@ typedef target_phys_addr_t pci_addr_t;
55 #define GT_PCI1M0HD (0x0a8 >> 2) 62 #define GT_PCI1M0HD (0x0a8 >> 2)
56 #define GT_PCI1M1LD (0x0b0 >> 2) 63 #define GT_PCI1M1LD (0x0b0 >> 2)
57 #define GT_PCI1M1HD (0x0b8 >> 2) 64 #define GT_PCI1M1HD (0x0b8 >> 2)
58 -#define GT_PCI1M1LD (0x0b0 >> 2)  
59 -#define GT_PCI1M1HD (0x0b8 >> 2) 65 +#define GT_ISD (0x068 >> 2)
60 66
61 #define GT_SCS10AR (0x0d0 >> 2) 67 #define GT_SCS10AR (0x0d0 >> 2)
62 #define GT_SCS32AR (0x0d8 >> 2) 68 #define GT_SCS32AR (0x0d8 >> 2)
@@ -330,6 +336,45 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, @@ -330,6 +336,45 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr,
330 /* Read-only registers, do nothing */ 336 /* Read-only registers, do nothing */
331 break; 337 break;
332 338
  339 + /* SDRAM and Device Address Decode */
  340 + case GT_SCS0LD:
  341 + case GT_SCS0HD:
  342 + case GT_SCS1LD:
  343 + case GT_SCS1HD:
  344 + case GT_SCS2LD:
  345 + case GT_SCS2HD:
  346 + case GT_SCS3LD:
  347 + case GT_SCS3HD:
  348 + case GT_CS0LD:
  349 + case GT_CS0HD:
  350 + case GT_CS1LD:
  351 + case GT_CS1HD:
  352 + case GT_CS2LD:
  353 + case GT_CS2HD:
  354 + case GT_CS3LD:
  355 + case GT_CS3HD:
  356 + case GT_BOOTLD:
  357 + case GT_BOOTHD:
  358 + case GT_ADERR:
  359 + /* SDRAM Configuration */
  360 + case GT_SDRAM_CFG:
  361 + case GT_SDRAM_OPMODE:
  362 + case GT_SDRAM_BM:
  363 + case GT_SDRAM_ADDRDECODE:
  364 + /* Accept and ignore SDRAM interleave configuration */
  365 + s->regs[saddr] = val;
  366 + break;
  367 +
  368 + /* Device Parameters */
  369 + case GT_DEV_B0:
  370 + case GT_DEV_B1:
  371 + case GT_DEV_B2:
  372 + case GT_DEV_B3:
  373 + case GT_DEV_BOOT:
  374 + /* Not implemented */
  375 + dprintf ("Unimplemented device register offset 0x%x\n", saddr << 2);
  376 + break;
  377 +
333 /* ECC */ 378 /* ECC */
334 case GT_ECC_ERRDATALO: 379 case GT_ECC_ERRDATALO:
335 case GT_ECC_ERRDATAHI: 380 case GT_ECC_ERRDATAHI:
@@ -339,16 +384,131 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, @@ -339,16 +384,131 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr,
339 /* Read-only registers, do nothing */ 384 /* Read-only registers, do nothing */
340 break; 385 break;
341 386
  387 + /* DMA Record */
  388 + case GT_DMA0_CNT:
  389 + case GT_DMA1_CNT:
  390 + case GT_DMA2_CNT:
  391 + case GT_DMA3_CNT:
  392 + case GT_DMA0_SA:
  393 + case GT_DMA1_SA:
  394 + case GT_DMA2_SA:
  395 + case GT_DMA3_SA:
  396 + case GT_DMA0_DA:
  397 + case GT_DMA1_DA:
  398 + case GT_DMA2_DA:
  399 + case GT_DMA3_DA:
  400 + case GT_DMA0_NEXT:
  401 + case GT_DMA1_NEXT:
  402 + case GT_DMA2_NEXT:
  403 + case GT_DMA3_NEXT:
  404 + case GT_DMA0_CUR:
  405 + case GT_DMA1_CUR:
  406 + case GT_DMA2_CUR:
  407 + case GT_DMA3_CUR:
  408 + /* Not implemented */
  409 + dprintf ("Unimplemented DMA register offset 0x%x\n", saddr << 2);
  410 + break;
  411 +
  412 + /* DMA Channel Control */
  413 + case GT_DMA0_CTRL:
  414 + case GT_DMA1_CTRL:
  415 + case GT_DMA2_CTRL:
  416 + case GT_DMA3_CTRL:
  417 + /* Not implemented */
  418 + dprintf ("Unimplemented DMA register offset 0x%x\n", saddr << 2);
  419 + break;
  420 +
  421 + /* DMA Arbiter */
  422 + case GT_DMA_ARB:
  423 + /* Not implemented */
  424 + dprintf ("Unimplemented DMA register offset 0x%x\n", saddr << 2);
  425 + break;
  426 +
  427 + /* Timer/Counter */
  428 + case GT_TC0:
  429 + case GT_TC1:
  430 + case GT_TC2:
  431 + case GT_TC3:
  432 + case GT_TC_CONTROL:
  433 + /* Not implemented */
  434 + dprintf ("Unimplemented timer register offset 0x%x\n", saddr << 2);
  435 + break;
  436 +
342 /* PCI Internal */ 437 /* PCI Internal */
343 case GT_PCI0_CMD: 438 case GT_PCI0_CMD:
344 case GT_PCI1_CMD: 439 case GT_PCI1_CMD:
345 s->regs[saddr] = val & 0x0401fc0f; 440 s->regs[saddr] = val & 0x0401fc0f;
346 break; 441 break;
  442 + case GT_PCI0_TOR:
  443 + case GT_PCI0_BS_SCS10:
  444 + case GT_PCI0_BS_SCS32:
  445 + case GT_PCI0_BS_CS20:
  446 + case GT_PCI0_BS_CS3BT:
  447 + case GT_PCI1_IACK:
  448 + case GT_PCI0_IACK:
  449 + case GT_PCI0_BARE:
  450 + case GT_PCI0_PREFMBR:
  451 + case GT_PCI0_SCS10_BAR:
  452 + case GT_PCI0_SCS32_BAR:
  453 + case GT_PCI0_CS20_BAR:
  454 + case GT_PCI0_CS3BT_BAR:
  455 + case GT_PCI0_SSCS10_BAR:
  456 + case GT_PCI0_SSCS32_BAR:
  457 + case GT_PCI0_SCS3BT_BAR:
  458 + case GT_PCI1_TOR:
  459 + case GT_PCI1_BS_SCS10:
  460 + case GT_PCI1_BS_SCS32:
  461 + case GT_PCI1_BS_CS20:
  462 + case GT_PCI1_BS_CS3BT:
  463 + case GT_PCI1_BARE:
  464 + case GT_PCI1_PREFMBR:
  465 + case GT_PCI1_SCS10_BAR:
  466 + case GT_PCI1_SCS32_BAR:
  467 + case GT_PCI1_CS20_BAR:
  468 + case GT_PCI1_CS3BT_BAR:
  469 + case GT_PCI1_SSCS10_BAR:
  470 + case GT_PCI1_SSCS32_BAR:
  471 + case GT_PCI1_SCS3BT_BAR:
  472 + case GT_PCI1_CFGADDR:
  473 + case GT_PCI1_CFGDATA:
  474 + /* not implemented */
  475 + break;
347 case GT_PCI0_CFGADDR: 476 case GT_PCI0_CFGADDR:
348 s->pci->config_reg = val & 0x80fffffc; 477 s->pci->config_reg = val & 0x80fffffc;
349 break; 478 break;
350 case GT_PCI0_CFGDATA: 479 case GT_PCI0_CFGDATA:
351 - pci_host_data_writel(s->pci, 0, val); 480 + if (s->pci->config_reg & (1u << 31))
  481 + pci_host_data_writel(s->pci, 0, val);
  482 + break;
  483 +
  484 + /* Interrupts */
  485 + case GT_INTRCAUSE:
  486 + /* not really implemented */
  487 + s->regs[saddr] = ~(~(s->regs[saddr]) | ~(val & 0xfffffffe));
  488 + s->regs[saddr] |= !!(s->regs[saddr] & 0xfffffffe);
  489 + dprintf("INTRCAUSE %x\n", val);
  490 + break;
  491 + case GT_INTRMASK:
  492 + s->regs[saddr] = val & 0x3c3ffffe;
  493 + dprintf("INTRMASK %x\n", val);
  494 + break;
  495 + case GT_PCI0_ICMASK:
  496 + s->regs[saddr] = val & 0x03fffffe;
  497 + dprintf("ICMASK %x\n", val);
  498 + break;
  499 + case GT_PCI0_SERR0MASK:
  500 + s->regs[saddr] = val & 0x0000003f;
  501 + dprintf("SERR0MASK %x\n", val);
  502 + break;
  503 +
  504 + /* Reserved when only PCI_0 is configured. */
  505 + case GT_HINTRCAUSE:
  506 + case GT_CPU_INTSEL:
  507 + case GT_PCI0_INTSEL:
  508 + case GT_HINTRMASK:
  509 + case GT_PCI0_HICMASK:
  510 + case GT_PCI1_SERR1MASK:
  511 + /* not implemented */
352 break; 512 break;
353 513
354 /* SDRAM Parameters */ 514 /* SDRAM Parameters */
@@ -362,9 +522,7 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, @@ -362,9 +522,7 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr,
362 break; 522 break;
363 523
364 default: 524 default:
365 -#if 0  
366 - printf ("gt64120_writel: Bad register offset 0x%x\n", (int)addr);  
367 -#endif 525 + dprintf ("Bad register offset 0x%x\n", (int)addr);
368 break; 526 break;
369 } 527 }
370 } 528 }
@@ -420,6 +578,18 @@ static uint32_t gt64120_readl (void *opaque, @@ -420,6 +578,18 @@ static uint32_t gt64120_readl (void *opaque,
420 break; 578 break;
421 579
422 case GT_CPU: 580 case GT_CPU:
  581 + case GT_SCS10LD:
  582 + case GT_SCS10HD:
  583 + case GT_SCS32LD:
  584 + case GT_SCS32HD:
  585 + case GT_CS20LD:
  586 + case GT_CS20HD:
  587 + case GT_CS3BOOTLD:
  588 + case GT_CS3BOOTHD:
  589 + case GT_SCS10AR:
  590 + case GT_SCS32AR:
  591 + case GT_CS20R:
  592 + case GT_CS3BOOTR:
423 case GT_PCI0IOLD: 593 case GT_PCI0IOLD:
424 case GT_PCI0M0LD: 594 case GT_PCI0M0LD:
425 case GT_PCI0M1LD: 595 case GT_PCI0M1LD:
@@ -432,14 +602,13 @@ static uint32_t gt64120_readl (void *opaque, @@ -432,14 +602,13 @@ static uint32_t gt64120_readl (void *opaque,
432 case GT_PCI1IOHD: 602 case GT_PCI1IOHD:
433 case GT_PCI1M0HD: 603 case GT_PCI1M0HD:
434 case GT_PCI1M1HD: 604 case GT_PCI1M1HD:
435 - case GT_PCI0_CMD:  
436 - case GT_PCI1_CMD:  
437 case GT_PCI0IOREMAP: 605 case GT_PCI0IOREMAP:
438 case GT_PCI0M0REMAP: 606 case GT_PCI0M0REMAP:
439 case GT_PCI0M1REMAP: 607 case GT_PCI0M1REMAP:
440 case GT_PCI1IOREMAP: 608 case GT_PCI1IOREMAP:
441 case GT_PCI1M0REMAP: 609 case GT_PCI1M0REMAP:
442 case GT_PCI1M1REMAP: 610 case GT_PCI1M1REMAP:
  611 + case GT_ISD:
443 val = s->regs[saddr]; 612 val = s->regs[saddr];
444 break; 613 break;
445 case GT_PCI0_IACK: 614 case GT_PCI0_IACK:
@@ -447,6 +616,37 @@ static uint32_t gt64120_readl (void *opaque, @@ -447,6 +616,37 @@ static uint32_t gt64120_readl (void *opaque,
447 val = pic_read_irq(isa_pic); 616 val = pic_read_irq(isa_pic);
448 break; 617 break;
449 618
  619 + /* SDRAM and Device Address Decode */
  620 + case GT_SCS0LD:
  621 + case GT_SCS0HD:
  622 + case GT_SCS1LD:
  623 + case GT_SCS1HD:
  624 + case GT_SCS2LD:
  625 + case GT_SCS2HD:
  626 + case GT_SCS3LD:
  627 + case GT_SCS3HD:
  628 + case GT_CS0LD:
  629 + case GT_CS0HD:
  630 + case GT_CS1LD:
  631 + case GT_CS1HD:
  632 + case GT_CS2LD:
  633 + case GT_CS2HD:
  634 + case GT_CS3LD:
  635 + case GT_CS3HD:
  636 + case GT_BOOTLD:
  637 + case GT_BOOTHD:
  638 + case GT_ADERR:
  639 + val = s->regs[saddr];
  640 + break;
  641 +
  642 + /* SDRAM Configuration */
  643 + case GT_SDRAM_CFG:
  644 + case GT_SDRAM_OPMODE:
  645 + case GT_SDRAM_BM:
  646 + case GT_SDRAM_ADDRDECODE:
  647 + val = s->regs[saddr];
  648 + break;
  649 +
450 /* SDRAM Parameters */ 650 /* SDRAM Parameters */
451 case GT_SDRAM_B0: 651 case GT_SDRAM_B0:
452 case GT_SDRAM_B1: 652 case GT_SDRAM_B1:
@@ -457,27 +657,146 @@ static uint32_t gt64120_readl (void *opaque, @@ -457,27 +657,146 @@ static uint32_t gt64120_readl (void *opaque,
457 val = s->regs[saddr]; 657 val = s->regs[saddr];
458 break; 658 break;
459 659
  660 + /* Device Parameters */
  661 + case GT_DEV_B0:
  662 + case GT_DEV_B1:
  663 + case GT_DEV_B2:
  664 + case GT_DEV_B3:
  665 + case GT_DEV_BOOT:
  666 + val = s->regs[saddr];
  667 + break;
  668 +
  669 + /* DMA Record */
  670 + case GT_DMA0_CNT:
  671 + case GT_DMA1_CNT:
  672 + case GT_DMA2_CNT:
  673 + case GT_DMA3_CNT:
  674 + case GT_DMA0_SA:
  675 + case GT_DMA1_SA:
  676 + case GT_DMA2_SA:
  677 + case GT_DMA3_SA:
  678 + case GT_DMA0_DA:
  679 + case GT_DMA1_DA:
  680 + case GT_DMA2_DA:
  681 + case GT_DMA3_DA:
  682 + case GT_DMA0_NEXT:
  683 + case GT_DMA1_NEXT:
  684 + case GT_DMA2_NEXT:
  685 + case GT_DMA3_NEXT:
  686 + case GT_DMA0_CUR:
  687 + case GT_DMA1_CUR:
  688 + case GT_DMA2_CUR:
  689 + case GT_DMA3_CUR:
  690 + val = s->regs[saddr];
  691 + break;
  692 +
  693 + /* DMA Channel Control */
  694 + case GT_DMA0_CTRL:
  695 + case GT_DMA1_CTRL:
  696 + case GT_DMA2_CTRL:
  697 + case GT_DMA3_CTRL:
  698 + val = s->regs[saddr];
  699 + break;
  700 +
  701 + /* DMA Arbiter */
  702 + case GT_DMA_ARB:
  703 + val = s->regs[saddr];
  704 + break;
  705 +
  706 + /* Timer/Counter */
  707 + case GT_TC0:
  708 + case GT_TC1:
  709 + case GT_TC2:
  710 + case GT_TC3:
  711 + case GT_TC_CONTROL:
  712 + val = s->regs[saddr];
  713 + break;
  714 +
460 /* PCI Internal */ 715 /* PCI Internal */
461 case GT_PCI0_CFGADDR: 716 case GT_PCI0_CFGADDR:
462 val = s->pci->config_reg; 717 val = s->pci->config_reg;
463 break; 718 break;
464 case GT_PCI0_CFGDATA: 719 case GT_PCI0_CFGDATA:
465 - val = pci_host_data_readl(s->pci, 0); 720 + if (!(s->pci->config_reg & (1u << 31)))
  721 + val = 0xffffffff;
  722 + else
  723 + val = pci_data_read(s->pci->bus, s->pci->config_reg, 4);
  724 + break;
  725 +
  726 + case GT_PCI0_CMD:
  727 + case GT_PCI0_TOR:
  728 + case GT_PCI0_BS_SCS10:
  729 + case GT_PCI0_BS_SCS32:
  730 + case GT_PCI0_BS_CS20:
  731 + case GT_PCI0_BS_CS3BT:
  732 + case GT_PCI1_IACK:
  733 + case GT_PCI0_BARE:
  734 + case GT_PCI0_PREFMBR:
  735 + case GT_PCI0_SCS10_BAR:
  736 + case GT_PCI0_SCS32_BAR:
  737 + case GT_PCI0_CS20_BAR:
  738 + case GT_PCI0_CS3BT_BAR:
  739 + case GT_PCI0_SSCS10_BAR:
  740 + case GT_PCI0_SSCS32_BAR:
  741 + case GT_PCI0_SCS3BT_BAR:
  742 + case GT_PCI1_CMD:
  743 + case GT_PCI1_TOR:
  744 + case GT_PCI1_BS_SCS10:
  745 + case GT_PCI1_BS_SCS32:
  746 + case GT_PCI1_BS_CS20:
  747 + case GT_PCI1_BS_CS3BT:
  748 + case GT_PCI1_BARE:
  749 + case GT_PCI1_PREFMBR:
  750 + case GT_PCI1_SCS10_BAR:
  751 + case GT_PCI1_SCS32_BAR:
  752 + case GT_PCI1_CS20_BAR:
  753 + case GT_PCI1_CS3BT_BAR:
  754 + case GT_PCI1_SSCS10_BAR:
  755 + case GT_PCI1_SSCS32_BAR:
  756 + case GT_PCI1_SCS3BT_BAR:
  757 + case GT_PCI1_CFGADDR:
  758 + case GT_PCI1_CFGDATA:
  759 + val = s->regs[saddr];
  760 + break;
  761 +
  762 + /* Interrupts */
  763 + case GT_INTRCAUSE:
  764 + val = s->regs[saddr];
  765 + dprintf("INTRCAUSE %x\n", val);
  766 + break;
  767 + case GT_INTRMASK:
  768 + val = s->regs[saddr];
  769 + dprintf("INTRMASK %x\n", val);
  770 + break;
  771 + case GT_PCI0_ICMASK:
  772 + val = s->regs[saddr];
  773 + dprintf("ICMASK %x\n", val);
  774 + break;
  775 + case GT_PCI0_SERR0MASK:
  776 + val = s->regs[saddr];
  777 + dprintf("SERR0MASK %x\n", val);
  778 + break;
  779 +
  780 + /* Reserved when only PCI_0 is configured. */
  781 + case GT_HINTRCAUSE:
  782 + case GT_CPU_INTSEL:
  783 + case GT_PCI0_INTSEL:
  784 + case GT_HINTRMASK:
  785 + case GT_PCI0_HICMASK:
  786 + case GT_PCI1_SERR1MASK:
  787 + val = s->regs[saddr];
466 break; 788 break;
467 789
468 default: 790 default:
469 val = s->regs[saddr]; 791 val = s->regs[saddr];
470 -#if 0  
471 - printf ("gt64120_readl: Bad register offset 0x%x\n", (int)addr);  
472 -#endif 792 + dprintf ("Bad register offset 0x%x\n", (int)addr);
473 break; 793 break;
474 } 794 }
475 795
476 #ifdef TARGET_WORDS_BIGENDIAN 796 #ifdef TARGET_WORDS_BIGENDIAN
477 - return bswap32(val);  
478 -#else  
479 - return val; 797 + val = bswap32(val);
480 #endif 798 #endif
  799 + return val;
481 } 800 }
482 801
483 static CPUWriteMemoryFunc *gt64120_write[] = { 802 static CPUWriteMemoryFunc *gt64120_write[] = {