/* * sierra.c: * * RAMDAC definition for basic Sierra, SC15025 and SC1148x. */ #include #include #include "libvga.h" #include "timing.h" #include "vgaregs.h" #include "driver.h" /* for __svgalib_driver_report */ #include "ramdac.h" /* * RAMDAC definition for basic Sierra-type DAC * that can do 32K (5-5-5) color mode (16bpp) with doubled VCLK. * A value of 0x80 is written to the Hidden DAC register for this mode. */ #ifdef INCLUDE_SIERRA_DAC_TEST static int Sierra_32K_probe(void) { /* Should return 1 for any Sierra-type DAC. */ return 0; } #else #define Sierra_32K_probe 0 #endif #ifdef INCLUDE_SIERRA_DAC static void Sierra_32K_init(void) { /* Should probe the exact DAC type. */ if (__svgalib_driver_report) printf("svgalib: Using Sierra 32K DAC.\n"); } static int Sierra_32K_map_clock(int bpp, int pixelclock) { if (bpp == 16) return pixelclock * 2; return pixelclock; } static int Sierra_32K_map_horizontal_crtc(int bpp, int pixelclock, int htiming) { if (bpp == 16) return htiming * 2; return htiming; } #endif #if defined(INCLUDE_SIERRA_DAC) || defined(INCLUDE_ICW_DAC) || \ defined(INCLUDE_ATT20C490_DAC) || defined(INCLUDE_ATT20C498_DAC) void __svgalib_Sierra_32K_savestate(unsigned char *regs) { _ramdac_dactocomm(); regs[0] = inb(PEL_MSK); } void __svgalib_Sierra_32K_restorestate(const unsigned char *regs) { _ramdac_dactocomm(); outb(PEL_MSK, regs[0]); } #endif #ifdef INCLUDE_SIERRA_DAC static void Sierra_32K_initializestate(unsigned char *regs, int bpp, int colormode, int pixelclock) { regs[0] = 0; if (colormode == RGB16_555) regs[0] = 0x80; } static void Sierra_32K_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed) { dacspeed = __svgalib_setDacSpeed(dacspeed, 80000); cardspecs->maxPixelClock4bpp = dacspeed; cardspecs->maxPixelClock8bpp = dacspeed; cardspecs->maxPixelClock16bpp = dacspeed / 2; cardspecs->maxPixelClock24bpp = 0; cardspecs->maxPixelClock32bpp = 0; cardspecs->mapClock = Sierra_32K_map_clock; cardspecs->mapHorizontalCrtc = Sierra_32K_map_horizontal_crtc; cardspecs->flags |= NO_RGB16_565; } DacMethods __svgalib_Sierra_32K_methods = { SIERRA_32K, "Sierra 32K colors VGA DAC", 0, Sierra_32K_probe, Sierra_32K_init, Sierra_32K_qualify_cardspecs, __svgalib_Sierra_32K_savestate, __svgalib_Sierra_32K_restorestate, Sierra_32K_initializestate, 1 /* State size. */ }; #endif /* * RAMDAC definition for Sierra 15025/26 */ #ifdef INCLUDE_SC15025_DAC_TEST static unsigned char SC15025_Rev; static int SC15025_probe(void) { unsigned char c, id[4]; int i, flag = 0; _ramdac_dactocomm(); c = inb(PEL_MSK); _ramdac_setcomm(c | 0x10); for (i = 0; i < 4; i++) { outb(PEL_IR, 0x9 + i); id[i] = inb(PEL_IW); } _ramdac_setcomm(c); _ramdac_dactopel(); if (id[0] == 'S' && /* Sierra */ ((id[1] << 8) | id[2]) == 15025) { /* unique for the SC 15025/26 */ flag = 1; SC15025_Rev = id[3]; } return flag; } #else #define SC15025_probe 0 #define SC15025_Rev ' ' #endif #ifdef INCLUDE_SC15025_DAC static void SC15025_init(void) { if (__svgalib_driver_report) printf("svgalib: Using Sierra 15025/26%c truecolor DAC.\n", SC15025_Rev); } static void SC15025_initializestate(unsigned char *regs, int bpp, int colormode, int pixelclock) { regs[0] = 0; regs[1] = 0; regs[2] = 0; if (colormode == RGB16_555) { regs[0] = 0x80; regs[1] = 1; } else if (colormode == RGB16_565) { regs[0] = 0xC0; regs[1] = 1; } else if (colormode == RGB32_888_B) { regs[0] = 0x40; regs[1] = 1; regs[2] = 1; } /* ARI: FIXME: regs[1] should be 1 for CLUT8_8 */ /* also: OR 8 to regs[0] to enable gamma correction */ } static void SC15025_savestate(unsigned char *regs) { _ramdac_dactocomm(); regs[0] = inb(PEL_MSK); _ramdac_setcomm(regs[0] | 0x10); _ramdac_dactocomm(); outb(PEL_IR, 8); regs[1] = inb(PEL_IW); /* Aux control */ outb(PEL_IR, 16); regs[2] = inb(PEL_IW); /* Pixel Repack */ _ramdac_setcomm(regs[0]); } static void SC15025_restorestate(const unsigned char *regs) { unsigned char c; _ramdac_dactocomm(); c = inb(PEL_MSK); _ramdac_setcomm(c | 0x10); _ramdac_dactocomm(); outb(PEL_IR, 8); outb(PEL_IW, regs[1]); /* Aux control */ outb(PEL_IR, 16); outb(PEL_IW, regs[2]); /* Pixel Repack */ _ramdac_setcomm(c); _ramdac_setcomm(regs[0]); } static int SC15025_map_clock(int bpp, int pixelclock) { if (bpp == 32) return pixelclock * 2; return pixelclock; } static int SC15025_map_horizontal_crtc(int bpp, int pixelclock, int htiming) { if (bpp == 16) return htiming * 2; if (bpp == 32) return htiming * 4; return htiming; } static void SC15025_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed) { dacspeed = __svgalib_setDacSpeed(dacspeed, 110000); cardspecs->maxPixelClock4bpp = dacspeed; cardspecs->maxPixelClock8bpp = dacspeed; cardspecs->maxPixelClock16bpp = dacspeed / 2; cardspecs->maxPixelClock24bpp = 0; cardspecs->maxPixelClock32bpp = dacspeed / 3; cardspecs->mapClock = SC15025_map_clock; cardspecs->mapHorizontalCrtc = SC15025_map_horizontal_crtc; } DacMethods __svgalib_SC15025_methods = { SIERRA_15025, "Sierra SC15025/6 DAC", 0, SC15025_probe, SC15025_init, SC15025_qualify_cardspecs, SC15025_savestate, SC15025_restorestate, SC15025_initializestate, 3 /* State size. */ }; #endif /* * RAMDAC definition for Sierra 1148x Series. * 11482, 83, and 84 (Mark 2) can do 32K (5-5-5) color mode (16bpp). * 11485, 87, and 89 (Mark 3) additionally can do 64K (5-6-5) color mode, * but are not autodetected since they cannot be distinguished from Mark 2. * 11486 really is a Sierra 32K dac, and should have been set by user. * * Note that these dacs are different from 'Sierra 32K', since they can be * detected as such, while there are clones that work compatible to the * Sierra dacs, but cannot be autodetected. To avoid such dacs to fail * the type 'Sierra 32K' still refers to them, while this new type * 'SC1148x Series' refers to original Sierra dacs. * * ATTENTION: THIS TEST MUST BE LAST IN CHAIN, SINCE MANY BETTER DACS * IMPLEMENT 32K MODES COMPATIBLE TO THIS ONE AND WOULD BE DETECTED AS * SIERRA! * */ #ifdef INCLUDE_SC1148X_DAC_TEST static int SC1148X_probe(void) { unsigned char oc, op, tmp, tmp2; int flag = 0; _ramdac_dactopel(); tmp = inb(PEL_MSK); do { tmp2 = tmp; tmp = inb(PEL_MSK); } while (tmp2 != tmp); inb(PEL_IW); inb(PEL_MSK); inb(PEL_MSK); inb(PEL_MSK); for (tmp2 = 9; tmp != 0x8E && tmp2 > 0; tmp2--) tmp = inb(PEL_MSK); if (tmp != 0x8E) { _ramdac_dactocomm(); oc = inb(PEL_MSK); _ramdac_dactopel(); op = inb(PEL_MSK); tmp = oc ^ 0xFF; outb(PEL_MSK, tmp); _ramdac_dactocomm(); tmp2 = inb(PEL_MSK); if (tmp2 != tmp) { tmp = _ramdac_setcomm(tmp = oc ^ 0x60); if ((tmp & 0xe0) == (tmp2 & 0xe0)) { tmp = inb(PEL_MSK); _ramdac_dactopel(); if (tmp != inb(PEL_MSK)) flag = 1; /* Sierra Mark 2 or 3 */ } else { /* We have a Sierra SC11486 */ #ifdef INCLUDE_SIERRA_DAC flag = 1; /* We do some ugly trickery here to patch SC1148X Series descriptor with values from Sierra 32K descriptor, since this is what whe really have detected! */ __svgalib_SC1148X_methods.id = SIERRA_32K; __svgalib_SC1148X_methods.name = __svgalib_Sierra_32K_methods.name; __svgalib_SC1148X_methods.initialize = __svgalib_Sierra_32K_methods.initialize; __svgalib_SC1148X_methods.qualifyCardSpecs = __svgalib_Sierra_32K_methods.qualifyCardSpecs ; __svgalib_SC1148X_methods.initializeState = __svgalib_Sierra_32K_methods.initializeState ; #endif } _ramdac_dactocomm(); outb(PEL_MSK, oc); } _ramdac_dactopel(); outb(PEL_MSK, op); } else { _ramdac_dactopel(); /* Diamond SS2410 */ } return flag; } #else #define SC1148x_probe 0 #endif #ifdef INCLUDE_SC1148X_DAC static void SC1148X_init(void) { if (__svgalib_driver_report) printf("svgalib: Using Sierra 1148x series 32K DAC.\n"); } static void SC1148X_initializestate(unsigned char *regs, int bpp, int colormode, int pixelclock) { regs[0] = 0; if (colormode == RGB16_555) regs[0] = 0xA0; /* Mark 3 (not autodetected) */ else if (colormode == RGB16_565) regs[0] = 0xE0; } static void SC1148X_qualify_cardspecs(CardSpecs * cardspecs, int dacspeed) { dacspeed = __svgalib_setDacSpeed(dacspeed, 110000); cardspecs->maxPixelClock4bpp = dacspeed; cardspecs->maxPixelClock8bpp = dacspeed; cardspecs->maxPixelClock16bpp = dacspeed / 2; cardspecs->maxPixelClock24bpp = 0; cardspecs->maxPixelClock32bpp = 0; cardspecs->mapClock = Sierra_32K_map_clock; cardspecs->mapHorizontalCrtc = Sierra_32K_map_horizontal_crtc; cardspecs->flags |= NO_RGB16_565; /* Mark 3 (11485,87, and higher) can */ } DacMethods __svgalib_SC1148X_methods = { SIERRA_1148X, "Sierra SC1148x series 32K colors VGA DAC", 0, SC1148X_probe, SC1148X_init, SC1148X_qualify_cardspecs, __svgalib_Sierra_32K_savestate, __svgalib_Sierra_32K_restorestate, SC1148X_initializestate, 1 /* State size. */ }; #endif