Commit a21ae81d8ad647cb9b7869367edf646f37e4e4e5
1 parent
aeb3c85f
change ID to CLGD5446 - added solidfill support - fixed hidden dac access
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@899 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
205 additions
and
73 deletions
hw/cirrus_vga.c
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | #include "vga_int.h" |
| 31 | 31 | |
| 32 | 32 | //#define DEBUG_CIRRUS |
| 33 | +//#define DEBUG_BITBLT | |
| 33 | 34 | |
| 34 | 35 | /*************************************** |
| 35 | 36 | * |
| ... | ... | @@ -46,8 +47,14 @@ |
| 46 | 47 | #define CIRRUS_ID_CLGD5428 (0x26<<2) |
| 47 | 48 | #define CIRRUS_ID_CLGD5430 (0x28<<2) |
| 48 | 49 | #define CIRRUS_ID_CLGD5434 (0x2A<<2) |
| 50 | +#define CIRRUS_ID_CLGD5436 (0x2B<<2) | |
| 49 | 51 | #define CIRRUS_ID_CLGD5446 (0x2E<<2) |
| 50 | 52 | |
| 53 | +/* this define is used to select the exact CLGD implementation we | |
| 54 | + emulate. */ | |
| 55 | +//#define CIRRUS_ID CIRRUS_ID_CLGD5430 | |
| 56 | +#define CIRRUS_ID CIRRUS_ID_CLGD5446 | |
| 57 | + | |
| 51 | 58 | // sequencer 0x07 |
| 52 | 59 | #define CIRRUS_SR7_BPP_VGA 0x00 |
| 53 | 60 | #define CIRRUS_SR7_BPP_SVGA 0x01 |
| ... | ... | @@ -120,6 +127,9 @@ |
| 120 | 127 | #define CIRRUS_ROP_NOTSRC_OR_DST 0xd6 |
| 121 | 128 | #define CIRRUS_ROP_NOTSRC_AND_NOTDST 0xda |
| 122 | 129 | |
| 130 | +// control 0x33 | |
| 131 | +#define CIRRUS_BLTMODEEXT_SOLIDFILL 0x04 | |
| 132 | + | |
| 123 | 133 | // memory-mapped IO |
| 124 | 134 | #define CIRRUS_MMIO_BLTBGCOLOR 0x00 // dword |
| 125 | 135 | #define CIRRUS_MMIO_BLTFGCOLOR 0x04 // dword |
| ... | ... | @@ -153,12 +163,10 @@ |
| 153 | 163 | |
| 154 | 164 | // PCI 0x00: vendor, 0x02: device |
| 155 | 165 | #define PCI_VENDOR_CIRRUS 0x1013 |
| 156 | -#define PCI_DEVICE_CLGD5430 0x00a0 // CLGD5430 or CLGD5440 | |
| 157 | -#define PCI_DEVICE_CLGD5434 0x00a8 | |
| 158 | -#define PCI_DEVICE_CLGD5436 0x00ac | |
| 159 | -#define PCI_DEVICE_CLGD5446 0x00b8 | |
| 166 | +#define PCI_DEVICE_ID CIRRUS_ID | |
| 160 | 167 | #define PCI_DEVICE_CLGD5462 0x00d0 |
| 161 | 168 | #define PCI_DEVICE_CLGD5465 0x00d6 |
| 169 | + | |
| 162 | 170 | // PCI 0x04: command(word), 0x06(word): status |
| 163 | 171 | #define PCI_COMMAND_IOACCESS 0x0001 |
| 164 | 172 | #define PCI_COMMAND_MEMACCESS 0x0002 |
| ... | ... | @@ -195,7 +203,7 @@ |
| 195 | 203 | // PCI 0x38: reserved |
| 196 | 204 | // PCI 0x3c: 0x3c=int-line, 0x3d=int-pin, 0x3e=min-gnt, 0x3f=maax-lat |
| 197 | 205 | |
| 198 | -#define CIRRUS_PNPMMIO_SIZE 0x800 | |
| 206 | +#define CIRRUS_PNPMMIO_SIZE 0x1000 | |
| 199 | 207 | |
| 200 | 208 | |
| 201 | 209 | /* I/O and memory hook */ |
| ... | ... | @@ -264,7 +272,7 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); |
| 264 | 272 | * |
| 265 | 273 | ***************************************/ |
| 266 | 274 | |
| 267 | -#define IMPLEMENT_FORWARD_BITBLT(name,opline) \ | |
| 275 | +#define IMPLEMENT_BITBLT(name,opline) \ | |
| 268 | 276 | static void \ |
| 269 | 277 | cirrus_bitblt_rop_fwd_##name( \ |
| 270 | 278 | uint8_t *dst,const uint8_t *src, \ |
| ... | ... | @@ -283,9 +291,8 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); |
| 283 | 291 | dst += dstpitch; \ |
| 284 | 292 | src += srcpitch; \ |
| 285 | 293 | } \ |
| 286 | - } | |
| 287 | - | |
| 288 | -#define IMPLEMENT_BACKWARD_BITBLT(name,opline) \ | |
| 294 | + } \ | |
| 295 | + \ | |
| 289 | 296 | static void \ |
| 290 | 297 | cirrus_bitblt_rop_bkwd_##name( \ |
| 291 | 298 | uint8_t *dst,const uint8_t *src, \ |
| ... | ... | @@ -306,39 +313,22 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); |
| 306 | 313 | } \ |
| 307 | 314 | } |
| 308 | 315 | |
| 309 | -IMPLEMENT_FORWARD_BITBLT(0, *dst = 0) | |
| 310 | - IMPLEMENT_FORWARD_BITBLT(src_and_dst, *dst = (*src) & (*dst)) | |
| 311 | - IMPLEMENT_FORWARD_BITBLT(nop, (void) 0) | |
| 312 | - IMPLEMENT_FORWARD_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst))) | |
| 313 | - IMPLEMENT_FORWARD_BITBLT(notdst, *dst = ~(*dst)) | |
| 314 | - IMPLEMENT_FORWARD_BITBLT(src, *dst = *src) | |
| 315 | - IMPLEMENT_FORWARD_BITBLT(1, *dst = 0xff) | |
| 316 | - IMPLEMENT_FORWARD_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst)) | |
| 317 | - IMPLEMENT_FORWARD_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst)) | |
| 318 | - IMPLEMENT_FORWARD_BITBLT(src_or_dst, *dst = (*src) | (*dst)) | |
| 319 | - IMPLEMENT_FORWARD_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst))) | |
| 320 | - IMPLEMENT_FORWARD_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst))) | |
| 321 | - IMPLEMENT_FORWARD_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst))) | |
| 322 | - IMPLEMENT_FORWARD_BITBLT(notsrc, *dst = (~(*src))) | |
| 323 | - IMPLEMENT_FORWARD_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst)) | |
| 324 | - IMPLEMENT_FORWARD_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst))) | |
| 325 | - | |
| 326 | - IMPLEMENT_BACKWARD_BITBLT(0, *dst = 0) | |
| 327 | - IMPLEMENT_BACKWARD_BITBLT(src_and_dst, *dst = (*src) & (*dst)) | |
| 328 | - IMPLEMENT_BACKWARD_BITBLT(nop, (void) 0) | |
| 329 | - IMPLEMENT_BACKWARD_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst))) | |
| 330 | - IMPLEMENT_BACKWARD_BITBLT(notdst, *dst = ~(*dst)) | |
| 331 | - IMPLEMENT_BACKWARD_BITBLT(src, *dst = *src) | |
| 332 | - IMPLEMENT_BACKWARD_BITBLT(1, *dst = 0xff) | |
| 333 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst)) | |
| 334 | - IMPLEMENT_BACKWARD_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst)) | |
| 335 | - IMPLEMENT_BACKWARD_BITBLT(src_or_dst, *dst = (*src) | (*dst)) | |
| 336 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst))) | |
| 337 | - IMPLEMENT_BACKWARD_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst))) | |
| 338 | - IMPLEMENT_BACKWARD_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst))) | |
| 339 | - IMPLEMENT_BACKWARD_BITBLT(notsrc, *dst = (~(*src))) | |
| 340 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst)) | |
| 341 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst))) | |
| 316 | +IMPLEMENT_BITBLT(0, *dst = 0) | |
| 317 | +IMPLEMENT_BITBLT(src_and_dst, *dst = (*src) & (*dst)) | |
| 318 | +IMPLEMENT_BITBLT(nop, (void) 0) | |
| 319 | +IMPLEMENT_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst))) | |
| 320 | +IMPLEMENT_BITBLT(notdst, *dst = ~(*dst)) | |
| 321 | +IMPLEMENT_BITBLT(src, *dst = *src) | |
| 322 | +IMPLEMENT_BITBLT(1, *dst = 0xff) | |
| 323 | +IMPLEMENT_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst)) | |
| 324 | +IMPLEMENT_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst)) | |
| 325 | +IMPLEMENT_BITBLT(src_or_dst, *dst = (*src) | (*dst)) | |
| 326 | +IMPLEMENT_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst))) | |
| 327 | +IMPLEMENT_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst))) | |
| 328 | +IMPLEMENT_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst))) | |
| 329 | +IMPLEMENT_BITBLT(notsrc, *dst = (~(*src))) | |
| 330 | +IMPLEMENT_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst)) | |
| 331 | +IMPLEMENT_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst))) | |
| 342 | 332 | |
| 343 | 333 | static cirrus_bitblt_rop_t cirrus_get_fwd_rop_handler(uint8_t rop) |
| 344 | 334 | { |
| ... | ... | @@ -666,7 +656,7 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, |
| 666 | 656 | #endif |
| 667 | 657 | return 0; |
| 668 | 658 | } |
| 669 | - | |
| 659 | + | |
| 670 | 660 | dst = s->vram_ptr + s->cirrus_blt_dstaddr; |
| 671 | 661 | for (y = 0; y < s->cirrus_blt_height; y += 8) { |
| 672 | 662 | dstc = dst; |
| ... | ... | @@ -686,6 +676,120 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, |
| 686 | 676 | return 1; |
| 687 | 677 | } |
| 688 | 678 | |
| 679 | +/* fill */ | |
| 680 | + | |
| 681 | +static void cirrus_fill_8(CirrusVGAState *s, | |
| 682 | + uint8_t *dst, int dst_pitch, int width, int height) | |
| 683 | +{ | |
| 684 | + uint8_t *d, *d1; | |
| 685 | + uint32_t val; | |
| 686 | + int x, y; | |
| 687 | + | |
| 688 | + val = s->cirrus_shadow_gr1; | |
| 689 | + | |
| 690 | + d1 = dst; | |
| 691 | + for(y = 0; y < height; y++) { | |
| 692 | + d = d1; | |
| 693 | + for(x = 0; x < width; x++) { | |
| 694 | + *d++ = val; | |
| 695 | + } | |
| 696 | + d1 += dst_pitch; | |
| 697 | + } | |
| 698 | +} | |
| 699 | + | |
| 700 | +static void cirrus_fill_16(CirrusVGAState *s, | |
| 701 | + uint8_t *dst, int dst_pitch, int width, int height) | |
| 702 | +{ | |
| 703 | + uint8_t *d, *d1; | |
| 704 | + uint32_t val; | |
| 705 | + int x, y; | |
| 706 | + | |
| 707 | + val = s->cirrus_shadow_gr1 | (s->gr[0x11] << 8); | |
| 708 | + val = le16_to_cpu(val); | |
| 709 | + width >>= 1; | |
| 710 | + | |
| 711 | + d1 = dst; | |
| 712 | + for(y = 0; y < height; y++) { | |
| 713 | + d = d1; | |
| 714 | + for(x = 0; x < width; x++) { | |
| 715 | + ((uint16_t *)d)[0] = val; | |
| 716 | + d += 2; | |
| 717 | + } | |
| 718 | + d1 += dst_pitch; | |
| 719 | + } | |
| 720 | +} | |
| 721 | + | |
| 722 | +static void cirrus_fill_24(CirrusVGAState *s, | |
| 723 | + uint8_t *dst, int dst_pitch, int width, int height) | |
| 724 | +{ | |
| 725 | + uint8_t *d, *d1; | |
| 726 | + int x, y; | |
| 727 | + | |
| 728 | + d1 = dst; | |
| 729 | + for(y = 0; y < height; y++) { | |
| 730 | + d = d1; | |
| 731 | + for(x = 0; x < width; x += 3) { | |
| 732 | + *d++ = s->cirrus_shadow_gr1; | |
| 733 | + *d++ = s->gr[0x11]; | |
| 734 | + *d++ = s->gr[0x13]; | |
| 735 | + } | |
| 736 | + d1 += dst_pitch; | |
| 737 | + } | |
| 738 | +} | |
| 739 | + | |
| 740 | +static void cirrus_fill_32(CirrusVGAState *s, | |
| 741 | + uint8_t *dst, int dst_pitch, int width, int height) | |
| 742 | +{ | |
| 743 | + uint8_t *d, *d1; | |
| 744 | + uint32_t val; | |
| 745 | + int x, y; | |
| 746 | + | |
| 747 | + val = s->cirrus_shadow_gr1 | (s->gr[0x11] << 8) | | |
| 748 | + (s->gr[0x13] << 8) | (s->gr[0x15] << 8); | |
| 749 | + val = le32_to_cpu(val); | |
| 750 | + width >>= 2; | |
| 751 | + | |
| 752 | + d1 = dst; | |
| 753 | + for(y = 0; y < height; y++) { | |
| 754 | + d = d1; | |
| 755 | + for(x = 0; x < width; x++) { | |
| 756 | + ((uint32_t *)d)[0] = val; | |
| 757 | + d += 4; | |
| 758 | + } | |
| 759 | + d1 += dst_pitch; | |
| 760 | + } | |
| 761 | +} | |
| 762 | + | |
| 763 | +static int cirrus_bitblt_solidfill(CirrusVGAState *s) | |
| 764 | +{ | |
| 765 | + uint8_t *dst; | |
| 766 | + dst = s->vram_ptr + s->cirrus_blt_dstaddr; | |
| 767 | + switch (s->cirrus_blt_pixelwidth) { | |
| 768 | + case 1: | |
| 769 | + cirrus_fill_8(s, dst, s->cirrus_blt_dstpitch, | |
| 770 | + s->cirrus_blt_width, s->cirrus_blt_height); | |
| 771 | + break; | |
| 772 | + case 2: | |
| 773 | + cirrus_fill_16(s, dst, s->cirrus_blt_dstpitch, | |
| 774 | + s->cirrus_blt_width, s->cirrus_blt_height); | |
| 775 | + break; | |
| 776 | + case 3: | |
| 777 | + cirrus_fill_24(s, dst, s->cirrus_blt_dstpitch, | |
| 778 | + s->cirrus_blt_width, s->cirrus_blt_height); | |
| 779 | + break; | |
| 780 | + default: | |
| 781 | + case 4: | |
| 782 | + cirrus_fill_32(s, dst, s->cirrus_blt_dstpitch, | |
| 783 | + s->cirrus_blt_width, s->cirrus_blt_height); | |
| 784 | + break; | |
| 785 | + } | |
| 786 | + cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, | |
| 787 | + s->cirrus_blt_dstpitch, s->cirrus_blt_width, | |
| 788 | + s->cirrus_blt_height); | |
| 789 | + cirrus_bitblt_reset(s); | |
| 790 | + return 1; | |
| 791 | +} | |
| 792 | + | |
| 689 | 793 | /*************************************** |
| 690 | 794 | * |
| 691 | 795 | * bitblt (video-to-video) |
| ... | ... | @@ -952,6 +1056,19 @@ static void cirrus_bitblt_start(CirrusVGAState * s) |
| 952 | 1056 | s->cirrus_blt_mode = s->gr[0x30]; |
| 953 | 1057 | blt_rop = s->gr[0x32]; |
| 954 | 1058 | |
| 1059 | +#ifdef DEBUG_BITBLT | |
| 1060 | + printf("rop=%02x mode=%02x modeext=%02x w=%d h=%d dpitch=%d spicth=%d daddr=%08x saddr=%08x\n", | |
| 1061 | + blt_rop, | |
| 1062 | + s->cirrus_blt_mode, | |
| 1063 | + s->gr[0x33], | |
| 1064 | + s->cirrus_blt_width, | |
| 1065 | + s->cirrus_blt_height, | |
| 1066 | + s->cirrus_blt_dstpitch, | |
| 1067 | + s->cirrus_blt_srcpitch, | |
| 1068 | + s->cirrus_blt_dstaddr, | |
| 1069 | + s->cirrus_blt_srcaddr); | |
| 1070 | +#endif | |
| 1071 | + | |
| 955 | 1072 | switch (s->cirrus_blt_mode & CIRRUS_BLTMODE_PIXELWIDTHMASK) { |
| 956 | 1073 | case CIRRUS_BLTMODE_PIXELWIDTH8: |
| 957 | 1074 | s->cirrus_blt_pixelwidth = 1; |
| ... | ... | @@ -983,26 +1100,34 @@ static void cirrus_bitblt_start(CirrusVGAState * s) |
| 983 | 1100 | goto bitblt_ignore; |
| 984 | 1101 | } |
| 985 | 1102 | |
| 986 | - if (s->cirrus_blt_mode & CIRRUS_BLTMODE_BACKWARDS) { | |
| 987 | - s->cirrus_blt_dstpitch = -s->cirrus_blt_dstpitch; | |
| 988 | - s->cirrus_blt_srcpitch = -s->cirrus_blt_srcpitch; | |
| 989 | - s->cirrus_rop = cirrus_get_bkwd_rop_handler(blt_rop); | |
| 1103 | + if ((s->gr[0x33] & CIRRUS_BLTMODEEXT_SOLIDFILL) && | |
| 1104 | + (s->cirrus_blt_mode & (CIRRUS_BLTMODE_MEMSYSDEST | | |
| 1105 | + CIRRUS_BLTMODE_TRANSPARENTCOMP | | |
| 1106 | + CIRRUS_BLTMODE_PATTERNCOPY | | |
| 1107 | + CIRRUS_BLTMODE_COLOREXPAND)) == | |
| 1108 | + (CIRRUS_BLTMODE_PATTERNCOPY | CIRRUS_BLTMODE_COLOREXPAND)) { | |
| 1109 | + cirrus_bitblt_solidfill(s); | |
| 990 | 1110 | } else { |
| 991 | - s->cirrus_rop = cirrus_get_fwd_rop_handler(blt_rop); | |
| 1111 | + if (s->cirrus_blt_mode & CIRRUS_BLTMODE_BACKWARDS) { | |
| 1112 | + s->cirrus_blt_dstpitch = -s->cirrus_blt_dstpitch; | |
| 1113 | + s->cirrus_blt_srcpitch = -s->cirrus_blt_srcpitch; | |
| 1114 | + s->cirrus_rop = cirrus_get_bkwd_rop_handler(blt_rop); | |
| 1115 | + } else { | |
| 1116 | + s->cirrus_rop = cirrus_get_fwd_rop_handler(blt_rop); | |
| 1117 | + } | |
| 1118 | + | |
| 1119 | + // setup bitblt engine. | |
| 1120 | + if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSSRC) { | |
| 1121 | + if (!cirrus_bitblt_cputovideo(s)) | |
| 1122 | + goto bitblt_ignore; | |
| 1123 | + } else if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSDEST) { | |
| 1124 | + if (!cirrus_bitblt_videotocpu(s)) | |
| 1125 | + goto bitblt_ignore; | |
| 1126 | + } else { | |
| 1127 | + if (!cirrus_bitblt_videotovideo(s)) | |
| 1128 | + goto bitblt_ignore; | |
| 1129 | + } | |
| 992 | 1130 | } |
| 993 | - | |
| 994 | - // setup bitblt engine. | |
| 995 | - if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSSRC) { | |
| 996 | - if (!cirrus_bitblt_cputovideo(s)) | |
| 997 | - goto bitblt_ignore; | |
| 998 | - } else if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSDEST) { | |
| 999 | - if (!cirrus_bitblt_videotocpu(s)) | |
| 1000 | - goto bitblt_ignore; | |
| 1001 | - } else { | |
| 1002 | - if (!cirrus_bitblt_videotovideo(s)) | |
| 1003 | - goto bitblt_ignore; | |
| 1004 | - } | |
| 1005 | - | |
| 1006 | 1131 | return; |
| 1007 | 1132 | bitblt_ignore:; |
| 1008 | 1133 | cirrus_bitblt_reset(s); |
| ... | ... | @@ -1325,11 +1450,9 @@ cirrus_hook_write_sr(CirrusVGAState * s, unsigned reg_index, int reg_value) |
| 1325 | 1450 | static void cirrus_read_hidden_dac(CirrusVGAState * s, int *reg_value) |
| 1326 | 1451 | { |
| 1327 | 1452 | *reg_value = 0xff; |
| 1328 | - if (s->cirrus_hidden_dac_lockindex < 5) { | |
| 1329 | - if (s->cirrus_hidden_dac_lockindex == 4) { | |
| 1330 | - *reg_value = s->cirrus_hidden_dac_data; | |
| 1331 | - } | |
| 1332 | - s->cirrus_hidden_dac_lockindex++; | |
| 1453 | + if (++s->cirrus_hidden_dac_lockindex == 5) { | |
| 1454 | + *reg_value = s->cirrus_hidden_dac_data; | |
| 1455 | + s->cirrus_hidden_dac_lockindex = 0; | |
| 1333 | 1456 | } |
| 1334 | 1457 | } |
| 1335 | 1458 | |
| ... | ... | @@ -1337,7 +1460,7 @@ static void cirrus_write_hidden_dac(CirrusVGAState * s, int reg_value) |
| 1337 | 1460 | { |
| 1338 | 1461 | if (s->cirrus_hidden_dac_lockindex == 4) { |
| 1339 | 1462 | s->cirrus_hidden_dac_data = reg_value; |
| 1340 | -#ifdef DEBUG_CIRRUS | |
| 1463 | +#if defined(DEBUG_CIRRUS) | |
| 1341 | 1464 | printf("cirrus: outport hidden DAC, value %02x\n", reg_value); |
| 1342 | 1465 | #endif |
| 1343 | 1466 | } |
| ... | ... | @@ -1468,6 +1591,7 @@ cirrus_hook_write_gr(CirrusVGAState * s, unsigned reg_index, int reg_value) |
| 1468 | 1591 | case 0x2d: // BLT SRC ADDR 0x00ff00 |
| 1469 | 1592 | case 0x30: // BLT MODE |
| 1470 | 1593 | case 0x32: // RASTER OP |
| 1594 | + case 0x33: // BLT MODEEXT | |
| 1471 | 1595 | case 0x34: // BLT TRANSPARENT COLOR 0x00ff |
| 1472 | 1596 | case 0x35: // BLT TRANSPARENT COLOR 0xff00 |
| 1473 | 1597 | case 0x38: // BLT TRANSPARENT COLOR MASK 0x00ff |
| ... | ... | @@ -1703,6 +1827,9 @@ static uint8_t cirrus_mmio_blt_read(CirrusVGAState * s, unsigned address) |
| 1703 | 1827 | case CIRRUS_MMIO_BLTROP: |
| 1704 | 1828 | cirrus_hook_read_gr(s, 0x32, &value); |
| 1705 | 1829 | break; |
| 1830 | + case CIRRUS_MMIO_BLTMODEEXT: | |
| 1831 | + cirrus_hook_read_gr(s, 0x33, &value); | |
| 1832 | + break; | |
| 1706 | 1833 | case (CIRRUS_MMIO_BLTTRANSPARENTCOLOR + 0): |
| 1707 | 1834 | cirrus_hook_read_gr(s, 0x34, &value); |
| 1708 | 1835 | break; |
| ... | ... | @@ -1810,6 +1937,9 @@ static void cirrus_mmio_blt_write(CirrusVGAState * s, unsigned address, |
| 1810 | 1937 | case CIRRUS_MMIO_BLTROP: |
| 1811 | 1938 | cirrus_hook_write_gr(s, 0x32, value); |
| 1812 | 1939 | break; |
| 1940 | + case CIRRUS_MMIO_BLTMODEEXT: | |
| 1941 | + cirrus_hook_write_gr(s, 0x33, value); | |
| 1942 | + break; | |
| 1813 | 1943 | case (CIRRUS_MMIO_BLTTRANSPARENTCOLOR + 0): |
| 1814 | 1944 | cirrus_hook_write_gr(s, 0x34, value); |
| 1815 | 1945 | break; |
| ... | ... | @@ -2592,7 +2722,7 @@ static void cirrus_init_common(CirrusVGAState * s) |
| 2592 | 2722 | s->sr[0x0F] = CIRRUS_MEMSIZE_2M; |
| 2593 | 2723 | s->sr[0x1F] = 0x22; // MemClock |
| 2594 | 2724 | |
| 2595 | - s->cr[0x27] = CIRRUS_ID_CLGD5430; | |
| 2725 | + s->cr[0x27] = CIRRUS_ID; | |
| 2596 | 2726 | |
| 2597 | 2727 | s->cirrus_hidden_dac_lockindex = 5; |
| 2598 | 2728 | s->cirrus_hidden_dac_data = 0; |
| ... | ... | @@ -2670,8 +2800,8 @@ void pci_cirrus_vga_init(DisplayState *ds, uint8_t *vga_ram_base, |
| 2670 | 2800 | pci_conf = d->dev.config; |
| 2671 | 2801 | pci_conf[0x00] = (uint8_t) (PCI_VENDOR_CIRRUS & 0xff); |
| 2672 | 2802 | pci_conf[0x01] = (uint8_t) (PCI_VENDOR_CIRRUS >> 8); |
| 2673 | - pci_conf[0x02] = (uint8_t) (PCI_DEVICE_CLGD5430 & 0xff); | |
| 2674 | - pci_conf[0x03] = (uint8_t) (PCI_DEVICE_CLGD5430 >> 8); | |
| 2803 | + pci_conf[0x02] = (uint8_t) (PCI_DEVICE_ID & 0xff); | |
| 2804 | + pci_conf[0x03] = (uint8_t) (PCI_DEVICE_ID >> 8); | |
| 2675 | 2805 | pci_conf[0x04] = PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS; |
| 2676 | 2806 | pci_conf[0x0a] = PCI_CLASS_SUB_VGA; |
| 2677 | 2807 | pci_conf[0x0b] = PCI_CLASS_BASE_DISPLAY; |
| ... | ... | @@ -2689,8 +2819,10 @@ void pci_cirrus_vga_init(DisplayState *ds, uint8_t *vga_ram_base, |
| 2689 | 2819 | /* memory #1 memory-mapped I/O */ |
| 2690 | 2820 | /* XXX: s->vram_size must be a power of two */ |
| 2691 | 2821 | pci_register_io_region((PCIDevice *)d, 0, s->vram_size, |
| 2692 | - PCI_ADDRESS_SPACE_MEM, cirrus_pci_lfb_map); | |
| 2693 | - pci_register_io_region((PCIDevice *)d, 1, CIRRUS_PNPMMIO_SIZE, | |
| 2694 | - PCI_ADDRESS_SPACE_MEM, cirrus_pci_mmio_map); | |
| 2822 | + PCI_ADDRESS_SPACE_MEM_PREFETCH, cirrus_pci_lfb_map); | |
| 2823 | + if (CIRRUS_ID == CIRRUS_ID_CLGD5446) { | |
| 2824 | + pci_register_io_region((PCIDevice *)d, 1, CIRRUS_PNPMMIO_SIZE, | |
| 2825 | + PCI_ADDRESS_SPACE_MEM, cirrus_pci_mmio_map); | |
| 2826 | + } | |
| 2695 | 2827 | /* XXX: ROM BIOS */ |
| 2696 | 2828 | } | ... | ... |