boot3/DeclData/DeclVideo/ATI/ATIPrimaryInit.c
Elliot Nunn 5b0f0cc134 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 10:02:57 +08:00

547 lines
13 KiB
C

/*
File: ATIPrimaryInit.c
Contains: xxx put contents here xxx
Written by: xxx put writers here xxx
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<1> 11/5/93 fau first checked in
<1> 10/27/93 fau first checked in
<1> 10/19/93 fau first checked in
*/
/*-------------------------------------------------------------------------
*start
*
*Name: PrimaryInit.c
*Creator: George D. Wilson Jr.
*Date: 4/23/92
*
*Purpose: Main interface file for ATI video driver primary init.
*
*Category: Macintosh driver
*File: PrimaryInit.c
*
*Exports: main - Main entry point for primary init.
*
*Detailed:
*
*Note:
*
*History:
*
* Date Programmer Modification
* -------- ---------- -----------------------------------------
*
*stop
*-----------------------------------------------------------------------*/
/*-------------------------------------------------------------------------
*
* Includes
*
*-----------------------------------------------------------------------*/
#include <Types.h>
#include <Video.h>
#include <Devices.h>
#include <Errors.h>
#include <OSUtils.h>
#include <Slots.h>
#include <Memory.h>
#include "ATIStdTypes.h"
#include "ATI.h"
#include "ATIDrvr.h"
#include "ATIVideo.h"
/*-------------------------------------------------------------------------
*
* Imported Procedures
*
*-----------------------------------------------------------------------*/
extern void PruneMonitors(UInt16 cardType, UInt8 theSlot);
extern UInt16 GetRowBytes(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot);
extern UInt16 GetNumLines(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot);
extern void DoProgramTiming(UInt32 slotNum, Ptr baseAddr, UInt8 monitorID,
UInt8 videoMode, UInt8 ourSlot, UInt16 rowBytes,
Boolean enableInterrupts);
extern void DoEnableVideo(UInt32 theSlot);
/*-------------------------------------------------------------------------
*start
*
*Name: SenseLineCheck
*Creator: George D. Wilson Jr.
*Date: 5/21/92
*
*Purpose: Returns the currently connected monitor code.
*
*Category:
*File: PrimaryInit.c
*
*Calls:
*
*Called By:
*
*Entry:
*
*Alters:
*
*Exit: UInt8 - Returns the sRsrc id of the monitor family connected.
*
*Detailed:
*
*Algorithm:
*
*Note:
*
*History:
*
* Date Programmer Modification
* -------- ---------- -----------------------------------------
* 9/28/93 George W. Added default return of 13" display.
*
*stop
*-----------------------------------------------------------------------*/
UInt8
SenseLineCheck(UInt32 theSlot)
{
UInt32 *SenseRegPtr;
UInt32 senseLineVal1,senseLineVal2,senseLineVal3;
// DebugStr("\pSenseLineCheck");
return(kRGB1312Connected); // ¥¥¥ ATI hack
SenseRegPtr = (UInt32 *) (theSlot | kATISenseLineBase);
senseLineVal1 = *SenseRegPtr; // Read the sense lines
senseLineVal1 &= kSenseLineMask; // Mask off the sense line bits
senseLineVal1 >= kSenseLineShift;
switch ( senseLineVal1 ) {
case kMonitorNotConnected:
*SenseRegPtr = (kSenseLineAMask); // Set all lines to ones
// *SenseRegPtr = (kSenseLinesReg); // Causes sense lines to be read
senseLineVal1 = *SenseRegPtr; // Read the sense lines
senseLineVal1 &= kSenseLineMask; // Mask off the sense line bits
senseLineVal1 >= kSenseLineShift; // Move bits to bottom
*SenseRegPtr = (kSenseLineBMask); // Set all lines to ones
// *SenseRegPtr = (kSenseLinesReg); // Causes sense lines to be read
senseLineVal2 = *SenseRegPtr; // Read the sense lines
senseLineVal2 &= kSenseLineMask; // Mask off the sense line bits
senseLineVal2 >= kSenseLineShift; // Move bits to bottom
*SenseRegPtr = (kSenseLineCMask); // Set all lines to ones
// *SenseRegPtr = (kSenseLinesReg); // Causes sense lines to be read
senseLineVal3 = *SenseRegPtr; // Read the sense lines
senseLineVal3 &= kSenseLineMask; // Mask off the sense line bits
senseLineVal3 >= kSenseLineShift; // Move bits to bottom
if ( (senseLineVal1 == kSenseLineAMask) &&
(senseLineVal2 == kSenseLineBMask) &&
(senseLineVal3 == kSenseLineCMask) ) {
return(kMonitorNotConnected);
}
if ( (senseLineVal1 == k16SenseACode) &&
(senseLineVal2 == k16SenseBCode) &&
(senseLineVal3 == k16SenseCCode) ) {
return(kRGB16Connected);
}
return(kMonitorNotConnected);
break;
case kRGB1312:
return(kRGB1312Connected);
break;
default: return(kMonitorNotConnected);
}
} /* End of SenseLineCheck */
void RampCLUT (UInt8 devID, UInt16 cardType)
{
UInt32 i;
UInt8 *clutAddrReg;
UInt8 *clutData;
// UInt32 dummy;
// DebugStr("\pRampClut");
IOLongWrite(0xF2800000, (devID << 12) | 4);
*(unsigned char *)(0xF2C00000) = 0x3;
PerformPCIHack();
if (cardType == kATIVendorID) {
clutAddrReg = (UInt8 *) kDAC_W_INDEX;
clutData = (UInt8 *) kDAC_DATA; // Point to data register
*clutAddrReg = 0; // Point to the first entry
PerformPCIHack();
for ( i = 0; i < 256; i++ ) {
*clutData = kGrayCLUTValue;
PerformPCIHack();
*clutData = kGrayCLUTValue;
PerformPCIHack();
*clutData = kGrayCLUTValue;
PerformPCIHack();
}
}
if (cardType == kDiamondVendorID) {
unsigned char *writeReg;
unsigned char *dataReg;
writeReg = (unsigned char *)(0xF20003C8); // kRamWrite
dataReg = (unsigned char *)(0xF20003C9); // kPaletteData
*writeReg = 0;
PerformPCIHack();
for (i = 0; i < 256; i++) {
*dataReg = (unsigned char)i; // red
PerformPCIHack();
*dataReg = (unsigned char)i; // green
PerformPCIHack();
*dataReg = (unsigned char)i; // blue
PerformPCIHack();
}
}
IOLongWrite(0xF2800000, (devID << 12) | 4);
*(unsigned char *)(0xF2C00000) = 0x2;
PerformPCIHack();
} /* End of RampClut */
/*-------------------------------------------------------------------------
*start
*
*Name: GrayPage
*Creator: George D. Wilson Jr.
*Date: 3/30/92
*
*Purpose:
*
*Category:
*File: PrimaryInit.c
*
*Calls:
*
*Called By:
*
*Entry:
*
*Alters:
*
*Exit:
*
*Detailed:
*
*Algorithm:
*
*Note:
*
*History:
*
* Date Programmer Modification
* -------- ---------- -----------------------------------------
*
*stop
*-----------------------------------------------------------------------*/
OSErr GrayPage(Ptr baseAddr, UInt16 rowBytes, UInt8 depth, UInt16 numLines)
{
UInt32 grayPattern;
UInt32 numWrites;
Ptr linePtr;
UInt32 *dumbPtr;
UInt16 i,j;
#if 0
Ptr myPtr;
UInt16 k, huh, huh1;
#endif
// DebugStr("\pGrayPage");
switch ( depth ) {
case 1: grayPattern = kOneBitPattern; break;
case 2: grayPattern = kTwoBitPattern; break;
case 4: grayPattern = kFourBitPattern; break;
case 8: grayPattern = kEightBitPattern; break;
case 16: grayPattern = kSixTeenBitPattern; break;
case 32: grayPattern = kThirtyTwoBitPattern; break;
}
numWrites = rowBytes / 4;
linePtr = (Ptr) baseAddr;
if ( depth == 32 ) {
for ( i = 0; i < numLines; i++ ) {
dumbPtr = (UInt32 *) linePtr;
for ( j = 0; j < numWrites; j++ ) {
*dumbPtr++ = grayPattern;
grayPattern = ~grayPattern;
}
linePtr += rowBytes;
grayPattern = ~grayPattern;
}
} else {
for ( i = 0; i < numLines; i++ ) {
dumbPtr = (UInt32 *) linePtr;
for ( j = 0; j < numWrites; j++ ) {
*dumbPtr++ = grayPattern;
}
linePtr += rowBytes;
grayPattern = ~grayPattern;
}
}
// code to dump the DACs into the frame buffer.
// 16x16 rectangles each with a different pixel value.
#if 0
huh = 0;
for (i = 0; i < numLines; i++) {
linePtr = (Ptr) baseAddr + (i * rowBytes);
myPtr = linePtr;
huh1 = huh;
for (j = 0; j < 16; j++) {
for (k = 0; k < 40; k++) {
*myPtr = huh1;
myPtr++;
}
huh1++;
}
if (i % 30 == 0 && i > 0) {
huh += 16;
}
}
#endif
return(noErr);
} /* End of GrayPage */
void CalcSlotBaseAddr (UInt8 slot, UInt32 *baseAddr32, UInt32 *baseAddrFB32)
{
UInt8 slotNum;
slotNum = slot;
*baseAddr32 = ((UInt32) (0x0F0 | slotNum) << 24);
*baseAddrFB32 = (UInt32) ((0x0F00 | (slotNum << 4) | slotNum) << 20);
}
/*-------------------------------------------------------------------------
*start
*
*Name: REALMAIN
*Creator: George D. Wilson Jr.
*Date: 5/21/92
*
*Purpose: Main entry point for the ATI primary init.
*
*Category: Entry Point
*File: PrimaryInit.c
*
*Calls:
*
*Called By:
*
*Entry:
*
*Alters:
*
*Exit: UInt8
*
*Detailed:
*
*Algorithm:
*
*Note:
*
*History:
*
* Date Programmer Modification
* -------- ---------- -----------------------------------------
* 5/21/92 George W. Added sense line logic.
*
*stop
*-----------------------------------------------------------------------*/
void REALMAIN (SEBlock *aSEBlockPtr)
{
Ptr baseAddr=0;
Ptr baseAddrFB;
UInt16 rowBytes;
UInt32 slotNum;
UInt8 slot;
UInt8 mmuMode;
UInt8 theMonitorID;
SpBlock spPb;
OSErr err;
SPRAMRecord sPRAM;
UInt8 videoMode=0;
UInt16 numLines;
UInt16 depth;
UInt16 cardType;
mmuMode = true32b;
SwapMMUMode(&mmuMode);
slot = aSEBlockPtr->seSlot; // Get out slot number
slotNum = kMySuperSlot;
#if 0
PruneMonitors(theMonitorID,slot);
if ( (theMonitorID < kRGB1312Connected) ||
(theMonitorID > kRGB16Connected) ) { // We only support 13"
aSEBlockPtr->seStatus = -1;
return; // All done get out
}
// CalcSlotBaseAddr(slot,&baseAddr,&baseAddrFB);
baseAddr = (Ptr) (kBaseAddress | kMySuperSlot);
baseAddrFB = (Ptr) (kBaseAddress | kMySlot | 0xF0000000);
videoMode = kFirstVideoMode;
spPb.spSlot = slot;
spPb.spResult = &sPRAM;
err = SReadPRAMRec(&spPb);
if ( err == noErr ) { // Did we get our PRAM?
if ( sPRAM.vendorUse4 != theMonitorID ) { // Is this the same monitor as last time?
sPRAM.vendorUse4 = theMonitorID; // No save the monitor ID
spPb.spsPointer = (Ptr) &sPRAM; // Heres the PRAM record to save
err = SPutPRAMRec(&spPb); // Save it for ever
} else { // Yes
if ( (sPRAM.vendorUse1 >= kFirstVideoMode) || // Range check mode value
(sPRAM.vendorUse1 >= kFifthVideoMode) ) {
videoMode = sPRAM.vendorUse1; // If mode value is funny save default.
}
}
}
rowBytes = GetRowBytes(theMonitorID,videoMode,slot);
numLines = GetNumLines(theMonitorID,videoMode,slot);
DoProgramTiming(kMySuperSlot,(Ptr) kBaseAddress,
theMonitorID,videoMode,slot, rowBytes,false);
depth = GetBitDepth(theMonitorID,videoMode,slot);
GrayPage(baseAddrFB,rowBytes,8,numLines);
RampCLUT();
DoEnableVideo(slotNum);
#else
//====================================================
// New funky code for ATI card
//====================================================
slot = FindPCICard(&cardType); // Search some slots for ATI
if ( slot == 0x00 ) {
aSEBlockPtr->seStatus = -1;
return; // All done get out
}
err = EnableIOAccess(slot, true, cardType);
if ( err != noErr ) {
aSEBlockPtr->seStatus = -1;
return; // All done get out
}
{
OSErr err;
SpBlock spPb;
char *p;
short i;
p = (char *) &spPb;
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
spPb.spSlot = 0x00;
if ( cardType == kATIVendorID) { // look for ATI
spPb.spID = 0x90; // id of board sRsrc to delete
}
if ( cardType == kDiamondVendorID) { // look for Diamond
spPb.spID = 0x80; // The id of the board sRsrc
}
err = SDeleteSRTRec(&spPb);
}
theMonitorID = SenseLineCheck(slotNum);
if ( theMonitorID == kNoMonitorConnected ) { // No monitor
aSEBlockPtr->seStatus = -1;
return; // All done get out
}
videoMode = kFirstVideoMode;
spPb.spSlot = slot;
spPb.spResult = &sPRAM;
#if 0
err = SReadPRAMRec(&spPb);
if ( err == noErr ) { // Did we get our PRAM?
if ( sPRAM.vendorUse4 != theMonitorID ) { // Is this the same monitor as last time?
sPRAM.vendorUse4 = theMonitorID; // No save the monitor ID
spPb.spsPointer = (Ptr) &sPRAM; // Heres the PRAM record to save
err = SPutPRAMRec(&spPb); // Save it for ever
} else { // Yes
if ( (sPRAM.vendorUse1 >= kFirstVideoMode) || // Range check mode value
(sPRAM.vendorUse1 >= kFifthVideoMode) ) {
videoMode = sPRAM.vendorUse1; // If mode value is funny save default.
}
}
}
#endif
if (cardType == kATIVendorID) {
UInt32 data;
UInt16 *ioReg;
ioReg = (UInt16 *) kMEM_CFG; // Memory config IO register
data = WByteSwap(*ioReg); // Get existing data
data |= (kATIVRAMAddr >> 16) | k4MegAperture; // Set the VRAM base address
data &= 0x0000FFFF;
*ioReg = WByteSwap(data); // Write new stuff
PerformPCIHack();
ioReg = (UInt16 *) kLOCAL_CNTL; //
*ioReg = WByteSwap(0x00A2); // Write new stuff
PerformPCIHack();
baseAddr = (Ptr) kATIVRAMAddr; // should equal kDiamondFBBase
baseAddrFB = (Ptr) kATIVRAMAddr;
depth = 8; // Default for now is 8bpp
rowBytes = 1024;
numLines = 480;
GrayPage(baseAddrFB,rowBytes,depth,numLines);
RampCLUT(slot,kATIVendorID);
SlamRegisters(slot);
}
else {
baseAddr = (Ptr) kDiamondFBBase; // should equal kATIVRAMAddr
baseAddrFB = (Ptr) kDiamondFBBase;
depth = 8; // Default for now is 8bpp
rowBytes = 640;
numLines = 480;
GoDiamond640x480x8Apple(slot);
GrayPage(baseAddrFB,rowBytes,depth,numLines);
}
#endif
aSEBlockPtr->seStatus = noErr;
SwapMMUMode(&mmuMode);
}