Commit 05b4ff435717e6b8355f6cd73ea17f2d9eaa9a55
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 | 23 | */ |
24 | 24 | |
25 | 25 | #include "vl.h" |
26 | + | |
26 | 27 | typedef target_phys_addr_t pci_addr_t; |
27 | 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 | 38 | #define GT_REGS (0x1000 >> 2) |
30 | 39 | |
31 | 40 | /* CPU Configuration */ |
... | ... | @@ -45,8 +54,6 @@ typedef target_phys_addr_t pci_addr_t; |
45 | 54 | #define GT_PCI0IOHD (0x050 >> 2) |
46 | 55 | #define GT_PCI0M0LD (0x058 >> 2) |
47 | 56 | #define GT_PCI0M0HD (0x060 >> 2) |
48 | -#define GT_ISD (0x068 >> 2) | |
49 | - | |
50 | 57 | #define GT_PCI0M1LD (0x080 >> 2) |
51 | 58 | #define GT_PCI0M1HD (0x088 >> 2) |
52 | 59 | #define GT_PCI1IOLD (0x090 >> 2) |
... | ... | @@ -55,8 +62,7 @@ typedef target_phys_addr_t pci_addr_t; |
55 | 62 | #define GT_PCI1M0HD (0x0a8 >> 2) |
56 | 63 | #define GT_PCI1M1LD (0x0b0 >> 2) |
57 | 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 | 67 | #define GT_SCS10AR (0x0d0 >> 2) |
62 | 68 | #define GT_SCS32AR (0x0d8 >> 2) |
... | ... | @@ -330,6 +336,45 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
330 | 336 | /* Read-only registers, do nothing */ |
331 | 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 | 378 | /* ECC */ |
334 | 379 | case GT_ECC_ERRDATALO: |
335 | 380 | case GT_ECC_ERRDATAHI: |
... | ... | @@ -339,16 +384,131 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
339 | 384 | /* Read-only registers, do nothing */ |
340 | 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 | 437 | /* PCI Internal */ |
343 | 438 | case GT_PCI0_CMD: |
344 | 439 | case GT_PCI1_CMD: |
345 | 440 | s->regs[saddr] = val & 0x0401fc0f; |
346 | 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 | 476 | case GT_PCI0_CFGADDR: |
348 | 477 | s->pci->config_reg = val & 0x80fffffc; |
349 | 478 | break; |
350 | 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 | 512 | break; |
353 | 513 | |
354 | 514 | /* SDRAM Parameters */ |
... | ... | @@ -362,9 +522,7 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, |
362 | 522 | break; |
363 | 523 | |
364 | 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 | 526 | break; |
369 | 527 | } |
370 | 528 | } |
... | ... | @@ -420,6 +578,18 @@ static uint32_t gt64120_readl (void *opaque, |
420 | 578 | break; |
421 | 579 | |
422 | 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 | 593 | case GT_PCI0IOLD: |
424 | 594 | case GT_PCI0M0LD: |
425 | 595 | case GT_PCI0M1LD: |
... | ... | @@ -432,14 +602,13 @@ static uint32_t gt64120_readl (void *opaque, |
432 | 602 | case GT_PCI1IOHD: |
433 | 603 | case GT_PCI1M0HD: |
434 | 604 | case GT_PCI1M1HD: |
435 | - case GT_PCI0_CMD: | |
436 | - case GT_PCI1_CMD: | |
437 | 605 | case GT_PCI0IOREMAP: |
438 | 606 | case GT_PCI0M0REMAP: |
439 | 607 | case GT_PCI0M1REMAP: |
440 | 608 | case GT_PCI1IOREMAP: |
441 | 609 | case GT_PCI1M0REMAP: |
442 | 610 | case GT_PCI1M1REMAP: |
611 | + case GT_ISD: | |
443 | 612 | val = s->regs[saddr]; |
444 | 613 | break; |
445 | 614 | case GT_PCI0_IACK: |
... | ... | @@ -447,6 +616,37 @@ static uint32_t gt64120_readl (void *opaque, |
447 | 616 | val = pic_read_irq(isa_pic); |
448 | 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 | 650 | /* SDRAM Parameters */ |
451 | 651 | case GT_SDRAM_B0: |
452 | 652 | case GT_SDRAM_B1: |
... | ... | @@ -457,27 +657,146 @@ static uint32_t gt64120_readl (void *opaque, |
457 | 657 | val = s->regs[saddr]; |
458 | 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 | 715 | /* PCI Internal */ |
461 | 716 | case GT_PCI0_CFGADDR: |
462 | 717 | val = s->pci->config_reg; |
463 | 718 | break; |
464 | 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 | 788 | break; |
467 | 789 | |
468 | 790 | default: |
469 | 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 | 793 | break; |
474 | 794 | } |
475 | 795 | |
476 | 796 | #ifdef TARGET_WORDS_BIGENDIAN |
477 | - return bswap32(val); | |
478 | -#else | |
479 | - return val; | |
797 | + val = bswap32(val); | |
480 | 798 | #endif |
799 | + return val; | |
481 | 800 | } |
482 | 801 | |
483 | 802 | static CPUWriteMemoryFunc *gt64120_write[] = { | ... | ... |