* Copyright 2010 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* Gerald Zajac
*/
#include "accelerant.h"
#include "3dfx.h"
uint32
TDFX_GetVideoMemorySize(void)
{
uint32 chipSize;
uint32 dramInit0 = INREG32(DRAM_INIT0);
uint32 dramInit1 = INREG32(DRAM_INIT1);
uint32 numChips = (dramInit0 & SGRAM_NUM_CHIPSETS) ? 8 : 4;
int memType = (dramInit1 & MCTL_TYPE_SDRAM) ? MEM_TYPE_SDRAM : MEM_TYPE_SGRAM;
if (gInfo.sharedInfo->chipType == VOODOO_5) {
chipSize = 1 << ((dramInit0 >> 27) & 0x7);
} else {
if (memType == MEM_TYPE_SDRAM)
chipSize = 2;
else
chipSize = (dramInit0 & SGRAM_TYPE) ? 2 : 1;
}
uint32 miscInit1 = INREG32(MISC_INIT1);
if (memType == MEM_TYPE_SDRAM) {
miscInit1 |= DISABLE_2D_BLOCK_WRITE;
}
miscInit1 |= 1;
OUTREG32(MISC_INIT1, miscInit1);
return chipSize * numChips * 1024 * 1024;
}
status_t
TDFX_Init(void)
{
TRACE("TDFX_Init()\n");
SharedInfo& si = *gInfo.sharedInfo;
si.videoMemSize = TDFX_GetVideoMemorySize();
si.cursorOffset = 0;
si.frameBufferOffset = si.cursorOffset + CURSOR_BYTES;
si.maxFrameBufferSize = si.videoMemSize - si.frameBufferOffset;
TRACE("Video Memory size: %d MB\n", si.videoMemSize / 1024 / 1024);
TRACE("frameBufferOffset: 0x%x cursorOffset: 0x%x\n",
si.frameBufferOffset, si.cursorOffset);
switch (si.chipType) {
case BANSHEE:
si.maxPixelClock = 270000;
break;
case VOODOO_3:
si.maxPixelClock = 300000;
break;
case VOODOO_5:
si.maxPixelClock = 350000;
break;
default:
TRACE("Undefined chip type: %d\n", si.chipType);
return B_ERROR;
}
si.colorSpaces[0] = B_CMAP8;
si.colorSpaces[1] = B_RGB16;
si.colorSpaces[2] = B_RGB32;
si.colorSpaceCount = 3;
return CreateModeList(IsModeUsable);
}