|
|
1.1 ! root 1: /* Copyright (c) 1993 by NeXT Computer, Inc. ! 2: * All rights reserved. ! 3: * ! 4: * S3.m -- driver for S3 86C805 and 86C928 Graphics Accelerators ! 5: * ! 6: * Created by Peter Graffagnino 1/31/93 ! 7: * Modified by Derek B Clegg 21 May 1993 ! 8: */ ! 9: #import <driverkit/i386/IOEISADeviceDescription.h> ! 10: #import "S3.h" ! 11: ! 12: @implementation S3 ! 13: ! 14: /* Put the display into linear framebuffer mode. This typically happens ! 15: * when the window server starts running. ! 16: */ ! 17: - (void)enterLinearMode ! 18: { ! 19: /* Set up the chip to use the selected mode. */ ! 20: [self initializeMode]; ! 21: ! 22: /* Set the gamma-corrected gray-scale palette if necessary. */ ! 23: [self setGammaTable]; ! 24: ! 25: /* Enter linear mode. */ ! 26: if ([self enableLinearFrameBuffer] == nil) { ! 27: IOLog("%s: Failed to enter linear mode.\n", [self name]); ! 28: return; ! 29: } ! 30: } ! 31: ! 32: /* Get the device out of whatever advanced linear mode it was using and back ! 33: * into a state where it can be used as a standard VGA device. ! 34: */ ! 35: - (void)revertToVGAMode ! 36: { ! 37: /* Reset the VGA parameters. */ ! 38: [self resetVGA]; ! 39: ! 40: /* Let the superclass do whatever work it needs to do. */ ! 41: [super revertToVGAMode]; ! 42: } ! 43: ! 44: /* Set the brightness to `level'. ! 45: */ ! 46: - setBrightness:(int)level token:(int)t ! 47: { ! 48: if (level < EV_SCREEN_MIN_BRIGHTNESS || level > EV_SCREEN_MAX_BRIGHTNESS) { ! 49: IOLog("QVision: Invalid brightness level `%d'.\n", level); ! 50: return nil; ! 51: } ! 52: brightnessLevel = level; ! 53: [self setGammaTable]; ! 54: return self; ! 55: } ! 56: ! 57: /* Set the transfer tables. ! 58: */ ! 59: - setTransferTable:(const unsigned int *)table count:(int)numEntries ! 60: { ! 61: int k; ! 62: IOBitsPerPixel bpp; ! 63: IOColorSpace cspace; ! 64: ! 65: if (redTransferTable != 0) ! 66: IOFree(redTransferTable, 3 * transferTableCount); ! 67: ! 68: transferTableCount = numEntries; ! 69: ! 70: redTransferTable = IOMalloc(3 * numEntries); ! 71: greenTransferTable = redTransferTable + numEntries; ! 72: blueTransferTable = greenTransferTable + numEntries; ! 73: ! 74: bpp = [self displayInfo]->bitsPerPixel; ! 75: cspace = [self displayInfo]->colorSpace; ! 76: ! 77: if (bpp == IO_8BitsPerPixel && cspace == IO_OneIsWhiteColorSpace) { ! 78: for (k = 0; k < numEntries; k++) { ! 79: redTransferTable[k] = greenTransferTable[k] = ! 80: blueTransferTable[k] = table[k] & 0xFF; ! 81: } ! 82: } else if (cspace == IO_RGBColorSpace && ! 83: (bpp == IO_8BitsPerPixel || ! 84: bpp == IO_15BitsPerPixel || ! 85: bpp == IO_24BitsPerPixel)) { ! 86: for (k = 0; k < numEntries; k++) { ! 87: redTransferTable[k] = (table[k] >> 24) & 0xFF; ! 88: greenTransferTable[k] = (table[k] >> 16) & 0xFF; ! 89: blueTransferTable[k] = (table[k] >> 8) & 0xFF; ! 90: } ! 91: } else { ! 92: IOFree(redTransferTable, 3 * numEntries); ! 93: redTransferTable = 0; ! 94: } ! 95: [self setGammaTable]; ! 96: return self; ! 97: } ! 98: ! 99: - initFromDeviceDescription:deviceDescription ! 100: { ! 101: IODisplayInfo *displayInfo; ! 102: const IORange *range; ! 103: const S3Mode *s3mode; ! 104: const char *s; ! 105: ! 106: if ([super initFromDeviceDescription:deviceDescription] == nil) ! 107: return [super free]; ! 108: ! 109: if ([self determineConfiguration] == nil) ! 110: return [super free]; ! 111: ! 112: if ([self selectMode] == nil) ! 113: return [super free]; ! 114: ! 115: range = [deviceDescription memoryRangeList]; ! 116: if (range == 0) { ! 117: IOLog("%s: No memory range set.\n", [self name]); ! 118: return [super free]; ! 119: } ! 120: videoRamAddress = range[0].start; ! 121: ! 122: redTransferTable = greenTransferTable = blueTransferTable = 0; ! 123: transferTableCount = 0; ! 124: brightnessLevel = EV_SCREEN_MAX_BRIGHTNESS; ! 125: ! 126: displayInfo = [self displayInfo]; ! 127: s3mode = displayInfo->parameters; ! 128: displayInfo->flags = 0; ! 129: ! 130: /* Some S3 805 cards have a lot of flicker when write-posting or ! 131: * read-ahead is enabled. We disable both, but provide a way to ! 132: * turn them on from the config table. It's a good idea to enable ! 133: * both if possible, since it speeds up the display a good deal. ! 134: */ ! 135: ! 136: writePostingEnabled = [self booleanForStringKey:"WritePostingEnabled" ! 137: withDefault:(adapter == S3_805 ? NO : YES)]; ! 138: readAheadCacheEnabled = [self booleanForStringKey:"ReadAheadCacheEnabled" ! 139: withDefault:(adapter == S3_805 ? NO : YES)]; ! 140: ! 141: /* Turn on s/w gamma correction. (This is only necessary for the 555/16 ! 142: * modes.) */ ! 143: ! 144: if ([self hasTransferTable]) ! 145: displayInfo->flags |= IO_DISPLAY_HAS_TRANSFER_TABLE; ! 146: ! 147: if ([self needsSoftwareGammaCorrection]) ! 148: displayInfo->flags |= IO_DISPLAY_NEEDS_SOFTWARE_GAMMA_CORRECTION; ! 149: ! 150: if (adapter == S3_805) { ! 151: /* On the 805, always turn the cache off. */ ! 152: displayInfo->flags |= IO_DISPLAY_CACHE_OFF; ! 153: } else { ! 154: s = [self valueForStringKey:"DisplayCacheMode"]; ! 155: if (s != 0) { ! 156: if (strcmp(s, "Off") == 0) ! 157: displayInfo->flags |= IO_DISPLAY_CACHE_OFF; ! 158: else if (strcmp(s, "WriteThrough") == 0) ! 159: displayInfo->flags |= IO_DISPLAY_CACHE_WRITETHROUGH; ! 160: else if (strcmp(s, "CopyBack") == 0) ! 161: displayInfo->flags |= IO_DISPLAY_CACHE_COPYBACK; ! 162: else ! 163: IOLog("%s: Unrecognized value for key `DisplayCacheMode': " ! 164: "`%s'.\n", [self name], s); ! 165: } ! 166: } ! 167: ! 168: displayInfo->frameBuffer = ! 169: (void *)[self mapFrameBufferAtPhysicalAddress:videoRamAddress ! 170: length:s3mode->memSize]; ! 171: if (displayInfo->frameBuffer == 0) ! 172: return [super free]; ! 173: ! 174: IOLog("%s: Initialized `%s' @ %d Hz.\n", [self name], s3mode->name, ! 175: displayInfo->refreshRate); ! 176: ! 177: return self; ! 178: } ! 179: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.