Commit e36f36e15fbd0fca6074461a256a9c9ab4ea0afa
1 parent
7b17d41e
mmio support for vga registers - line offset fix - (aka XFree86 4.3.0 fixes)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@894 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
108 additions
and
129 deletions
hw/cirrus_vga.c
... | ... | @@ -25,6 +25,8 @@ |
25 | 25 | #include "vl.h" |
26 | 26 | #include "vga_int.h" |
27 | 27 | |
28 | +//#define DEBUG_CIRRUS | |
29 | + | |
28 | 30 | /*************************************** |
29 | 31 | * |
30 | 32 | * definitions |
... | ... | @@ -204,7 +206,7 @@ typedef void (*cirrus_bitblt_handler_t) (void *opaque); |
204 | 206 | |
205 | 207 | typedef struct CirrusVGAState { |
206 | 208 | /* XXX: we use the anonymous struct/union gcc 3.x extension */ |
207 | - struct VGAState; | |
209 | + __extension__ struct VGAState; | |
208 | 210 | |
209 | 211 | int cirrus_linear_io_addr; |
210 | 212 | int cirrus_mmio_io_addr; |
... | ... | @@ -1036,7 +1038,7 @@ static void cirrus_get_offsets(VGAState *s1, |
1036 | 1038 | uint32_t line_offset; |
1037 | 1039 | |
1038 | 1040 | line_offset = s->cr[0x13] |
1039 | - | ((s->cr[0x1b] & 0x10) << 8); | |
1041 | + | ((s->cr[0x1b] & 0x10) << 4); | |
1040 | 1042 | line_offset <<= 3; |
1041 | 1043 | *pline_offset = line_offset; |
1042 | 1044 | |
... | ... | @@ -1821,31 +1823,6 @@ static void cirrus_mmio_blt_write(CirrusVGAState * s, unsigned address, |
1821 | 1823 | |
1822 | 1824 | /*************************************** |
1823 | 1825 | * |
1824 | - * memory-mapped I/O (vga) | |
1825 | - * | |
1826 | - ***************************************/ | |
1827 | - | |
1828 | -static uint8_t cirrus_mmio_vga_read(CirrusVGAState * s, unsigned address) | |
1829 | -{ | |
1830 | -#ifdef DEBUG_CIRRUS | |
1831 | - printf("cirrus: mmio vga read (unimplemented) - address 0x%04x\n", | |
1832 | - address); | |
1833 | -#endif | |
1834 | - return 0xff; | |
1835 | -} | |
1836 | - | |
1837 | -static void cirrus_mmio_vga_write(CirrusVGAState * s, unsigned address, | |
1838 | - uint8_t value) | |
1839 | -{ | |
1840 | -#ifdef DEBUG_CIRRUS | |
1841 | - printf | |
1842 | - ("cirrus: mmio vga write (unimplemented) - address 0x%04x, value 0x%02x\n", | |
1843 | - address, value); | |
1844 | -#endif | |
1845 | -} | |
1846 | - | |
1847 | -/*************************************** | |
1848 | - * | |
1849 | 1826 | * write mode 4/5 |
1850 | 1827 | * |
1851 | 1828 | * assume TARGET_PAGE_SIZE >= 16 |
... | ... | @@ -2221,108 +2198,6 @@ static CPUWriteMemoryFunc *cirrus_linear_write[3] = { |
2221 | 2198 | cirrus_linear_writel, |
2222 | 2199 | }; |
2223 | 2200 | |
2224 | -/*************************************** | |
2225 | - * | |
2226 | - * memory-mapped I/O access | |
2227 | - * | |
2228 | - ***************************************/ | |
2229 | - | |
2230 | -static uint32_t cirrus_mmio_readb(void *opaque, target_phys_addr_t addr) | |
2231 | -{ | |
2232 | - CirrusVGAState *s = (CirrusVGAState *) opaque; | |
2233 | - | |
2234 | - addr &= CIRRUS_PNPMMIO_SIZE - 1; | |
2235 | - /* ??? Does CLGD5430 have memory-mapped VGA registers ??? */ | |
2236 | - return (addr >= 0x100) ? | |
2237 | - cirrus_mmio_blt_read(s, addr - 0x100) : | |
2238 | - cirrus_mmio_vga_read(s, addr); | |
2239 | -} | |
2240 | - | |
2241 | -static uint32_t cirrus_mmio_readw(void *opaque, target_phys_addr_t addr) | |
2242 | -{ | |
2243 | - uint32_t v; | |
2244 | -#ifdef TARGET_WORDS_BIGENDIAN | |
2245 | - v = cirrus_mmio_readb(opaque, addr) << 8; | |
2246 | - v |= cirrus_mmio_readb(opaque, addr + 1); | |
2247 | -#else | |
2248 | - v = cirrus_mmio_readb(opaque, addr); | |
2249 | - v |= cirrus_mmio_readb(opaque, addr + 1) << 8; | |
2250 | -#endif | |
2251 | - return v; | |
2252 | -} | |
2253 | - | |
2254 | -static uint32_t cirrus_mmio_readl(void *opaque, target_phys_addr_t addr) | |
2255 | -{ | |
2256 | - uint32_t v; | |
2257 | -#ifdef TARGET_WORDS_BIGENDIAN | |
2258 | - v = cirrus_mmio_readb(opaque, addr) << 24; | |
2259 | - v |= cirrus_mmio_readb(opaque, addr + 1) << 16; | |
2260 | - v |= cirrus_mmio_readb(opaque, addr + 2) << 8; | |
2261 | - v |= cirrus_mmio_readb(opaque, addr + 3); | |
2262 | -#else | |
2263 | - v = cirrus_mmio_readb(opaque, addr); | |
2264 | - v |= cirrus_mmio_readb(opaque, addr + 1) << 8; | |
2265 | - v |= cirrus_mmio_readb(opaque, addr + 2) << 16; | |
2266 | - v |= cirrus_mmio_readb(opaque, addr + 3) << 24; | |
2267 | -#endif | |
2268 | - return v; | |
2269 | -} | |
2270 | - | |
2271 | -static void cirrus_mmio_writeb(void *opaque, target_phys_addr_t addr, | |
2272 | - uint32_t val) | |
2273 | -{ | |
2274 | - CirrusVGAState *s = (CirrusVGAState *) opaque; | |
2275 | - | |
2276 | - addr &= CIRRUS_PNPMMIO_SIZE - 1; | |
2277 | - /* ??? Does CLGD5430 have memory-mapped VGA registers ??? */ | |
2278 | - if (addr >= 0x100) { | |
2279 | - cirrus_mmio_blt_write(s, addr - 0x100, val); | |
2280 | - } else { | |
2281 | - cirrus_mmio_vga_write(s, addr, val); | |
2282 | - } | |
2283 | -} | |
2284 | - | |
2285 | -static void cirrus_mmio_writew(void *opaque, target_phys_addr_t addr, | |
2286 | - uint32_t val) | |
2287 | -{ | |
2288 | -#ifdef TARGET_WORDS_BIGENDIAN | |
2289 | - cirrus_mmio_writeb(opaque, addr, (val >> 8) & 0xff); | |
2290 | - cirrus_mmio_writeb(opaque, addr + 1, val & 0xff); | |
2291 | -#else | |
2292 | - cirrus_mmio_writeb(opaque, addr, val & 0xff); | |
2293 | - cirrus_mmio_writeb(opaque, addr + 1, (val >> 8) & 0xff); | |
2294 | -#endif | |
2295 | -} | |
2296 | - | |
2297 | -static void cirrus_mmio_writel(void *opaque, target_phys_addr_t addr, | |
2298 | - uint32_t val) | |
2299 | -{ | |
2300 | -#ifdef TARGET_WORDS_BIGENDIAN | |
2301 | - cirrus_mmio_writeb(opaque, addr, (val >> 24) & 0xff); | |
2302 | - cirrus_mmio_writeb(opaque, addr + 1, (val >> 16) & 0xff); | |
2303 | - cirrus_mmio_writeb(opaque, addr + 2, (val >> 8) & 0xff); | |
2304 | - cirrus_mmio_writeb(opaque, addr + 3, val & 0xff); | |
2305 | -#else | |
2306 | - cirrus_mmio_writeb(opaque, addr, val & 0xff); | |
2307 | - cirrus_mmio_writeb(opaque, addr + 1, (val >> 8) & 0xff); | |
2308 | - cirrus_mmio_writeb(opaque, addr + 2, (val >> 16) & 0xff); | |
2309 | - cirrus_mmio_writeb(opaque, addr + 3, (val >> 24) & 0xff); | |
2310 | -#endif | |
2311 | -} | |
2312 | - | |
2313 | - | |
2314 | -static CPUReadMemoryFunc *cirrus_mmio_read[3] = { | |
2315 | - cirrus_mmio_readb, | |
2316 | - cirrus_mmio_readw, | |
2317 | - cirrus_mmio_readl, | |
2318 | -}; | |
2319 | - | |
2320 | -static CPUWriteMemoryFunc *cirrus_mmio_write[3] = { | |
2321 | - cirrus_mmio_writeb, | |
2322 | - cirrus_mmio_writew, | |
2323 | - cirrus_mmio_writel, | |
2324 | -}; | |
2325 | - | |
2326 | 2201 | /* I/O ports */ |
2327 | 2202 | |
2328 | 2203 | static uint32_t vga_ioport_read(void *opaque, uint32_t addr) |
... | ... | @@ -2570,6 +2445,110 @@ static void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
2570 | 2445 | |
2571 | 2446 | /*************************************** |
2572 | 2447 | * |
2448 | + * memory-mapped I/O access | |
2449 | + * | |
2450 | + ***************************************/ | |
2451 | + | |
2452 | +static uint32_t cirrus_mmio_readb(void *opaque, target_phys_addr_t addr) | |
2453 | +{ | |
2454 | + CirrusVGAState *s = (CirrusVGAState *) opaque; | |
2455 | + | |
2456 | + addr &= CIRRUS_PNPMMIO_SIZE - 1; | |
2457 | + | |
2458 | + if (addr >= 0x100) { | |
2459 | + return cirrus_mmio_blt_read(s, addr - 0x100); | |
2460 | + } else { | |
2461 | + return vga_ioport_read(s, addr + 0x3c0); | |
2462 | + } | |
2463 | +} | |
2464 | + | |
2465 | +static uint32_t cirrus_mmio_readw(void *opaque, target_phys_addr_t addr) | |
2466 | +{ | |
2467 | + uint32_t v; | |
2468 | +#ifdef TARGET_WORDS_BIGENDIAN | |
2469 | + v = cirrus_mmio_readb(opaque, addr) << 8; | |
2470 | + v |= cirrus_mmio_readb(opaque, addr + 1); | |
2471 | +#else | |
2472 | + v = cirrus_mmio_readb(opaque, addr); | |
2473 | + v |= cirrus_mmio_readb(opaque, addr + 1) << 8; | |
2474 | +#endif | |
2475 | + return v; | |
2476 | +} | |
2477 | + | |
2478 | +static uint32_t cirrus_mmio_readl(void *opaque, target_phys_addr_t addr) | |
2479 | +{ | |
2480 | + uint32_t v; | |
2481 | +#ifdef TARGET_WORDS_BIGENDIAN | |
2482 | + v = cirrus_mmio_readb(opaque, addr) << 24; | |
2483 | + v |= cirrus_mmio_readb(opaque, addr + 1) << 16; | |
2484 | + v |= cirrus_mmio_readb(opaque, addr + 2) << 8; | |
2485 | + v |= cirrus_mmio_readb(opaque, addr + 3); | |
2486 | +#else | |
2487 | + v = cirrus_mmio_readb(opaque, addr); | |
2488 | + v |= cirrus_mmio_readb(opaque, addr + 1) << 8; | |
2489 | + v |= cirrus_mmio_readb(opaque, addr + 2) << 16; | |
2490 | + v |= cirrus_mmio_readb(opaque, addr + 3) << 24; | |
2491 | +#endif | |
2492 | + return v; | |
2493 | +} | |
2494 | + | |
2495 | +static void cirrus_mmio_writeb(void *opaque, target_phys_addr_t addr, | |
2496 | + uint32_t val) | |
2497 | +{ | |
2498 | + CirrusVGAState *s = (CirrusVGAState *) opaque; | |
2499 | + | |
2500 | + addr &= CIRRUS_PNPMMIO_SIZE - 1; | |
2501 | + | |
2502 | + if (addr >= 0x100) { | |
2503 | + cirrus_mmio_blt_write(s, addr - 0x100, val); | |
2504 | + } else { | |
2505 | + vga_ioport_write(s, addr + 0x3c0, val); | |
2506 | + } | |
2507 | +} | |
2508 | + | |
2509 | +static void cirrus_mmio_writew(void *opaque, target_phys_addr_t addr, | |
2510 | + uint32_t val) | |
2511 | +{ | |
2512 | +#ifdef TARGET_WORDS_BIGENDIAN | |
2513 | + cirrus_mmio_writeb(opaque, addr, (val >> 8) & 0xff); | |
2514 | + cirrus_mmio_writeb(opaque, addr + 1, val & 0xff); | |
2515 | +#else | |
2516 | + cirrus_mmio_writeb(opaque, addr, val & 0xff); | |
2517 | + cirrus_mmio_writeb(opaque, addr + 1, (val >> 8) & 0xff); | |
2518 | +#endif | |
2519 | +} | |
2520 | + | |
2521 | +static void cirrus_mmio_writel(void *opaque, target_phys_addr_t addr, | |
2522 | + uint32_t val) | |
2523 | +{ | |
2524 | +#ifdef TARGET_WORDS_BIGENDIAN | |
2525 | + cirrus_mmio_writeb(opaque, addr, (val >> 24) & 0xff); | |
2526 | + cirrus_mmio_writeb(opaque, addr + 1, (val >> 16) & 0xff); | |
2527 | + cirrus_mmio_writeb(opaque, addr + 2, (val >> 8) & 0xff); | |
2528 | + cirrus_mmio_writeb(opaque, addr + 3, val & 0xff); | |
2529 | +#else | |
2530 | + cirrus_mmio_writeb(opaque, addr, val & 0xff); | |
2531 | + cirrus_mmio_writeb(opaque, addr + 1, (val >> 8) & 0xff); | |
2532 | + cirrus_mmio_writeb(opaque, addr + 2, (val >> 16) & 0xff); | |
2533 | + cirrus_mmio_writeb(opaque, addr + 3, (val >> 24) & 0xff); | |
2534 | +#endif | |
2535 | +} | |
2536 | + | |
2537 | + | |
2538 | +static CPUReadMemoryFunc *cirrus_mmio_read[3] = { | |
2539 | + cirrus_mmio_readb, | |
2540 | + cirrus_mmio_readw, | |
2541 | + cirrus_mmio_readl, | |
2542 | +}; | |
2543 | + | |
2544 | +static CPUWriteMemoryFunc *cirrus_mmio_write[3] = { | |
2545 | + cirrus_mmio_writeb, | |
2546 | + cirrus_mmio_writew, | |
2547 | + cirrus_mmio_writel, | |
2548 | +}; | |
2549 | + | |
2550 | +/*************************************** | |
2551 | + * | |
2573 | 2552 | * initialize |
2574 | 2553 | * |
2575 | 2554 | ***************************************/ | ... | ... |