#include "xf86.h"
#include "xf86_ansic.h"
#include "xf86_OSproc.h"
#include "compiler.h"
#include "tdfx.h"
#define minb(b, p) MMIO_IN8((b), (p))
#define moutb(b, p,v) MMIO_OUT8((b), (p),(v))
#define minl(b, p) MMIO_IN32((b), (p))
#define moutl(b, p,v) MMIO_OUT32((b), (p),(v))
static void TDFXWriteControlPIO(TDFXPtr pTDFX, int addr, char index, char val) {
outb(pTDFX->PIOBase[0]+addr, index);
outb(pTDFX->PIOBase[0]+addr+1, val);
}
static char TDFXReadControlPIO(TDFXPtr pTDFX, int addr, char index) {
outb(pTDFX->PIOBase[0]+addr, index);
return inb(pTDFX->PIOBase[0]+addr+1);
}
static void TDFXWriteChipLongPIO(TDFXPtr pTDFX, int chip, int addr, int val) {
outl(pTDFX->PIOBase[chip]+addr, val);
}
static int TDFXReadChipLongPIO(TDFXPtr pTDFX, int chip, int addr) {
return inl(pTDFX->PIOBase[chip]+addr);
}
static void TDFXWriteLongPIO(TDFXPtr pTDFX, int addr, int val) {
TDFXWriteChipLongPIO(pTDFX, 0, addr, val);
}
static int TDFXReadLongPIO(TDFXPtr pTDFX, int addr) {
return TDFXReadChipLongPIO(pTDFX, 0, addr);
}
void TDFXSetPIOAccess(TDFXPtr pTDFX) {
if (!pTDFX->PIOBase[0])
ErrorF("Can not set PIO Access before PIOBase[0]\n");
pTDFX->writeControl=TDFXWriteControlPIO;
pTDFX->readControl=TDFXReadControlPIO;
pTDFX->writeLong=TDFXWriteLongPIO;
pTDFX->readLong=TDFXReadLongPIO;
pTDFX->readChipLong=TDFXReadChipLongPIO;
pTDFX->writeChipLong=TDFXWriteChipLongPIO;
}
static void TDFXWriteControlMMIO(TDFXPtr pTDFX, int addr, char index, char val) {
moutb(pTDFX->MMIOBase[0], addr, index);
moutb(pTDFX->MMIOBase[0], addr+1, val);
}
static char TDFXReadControlMMIO(TDFXPtr pTDFX, int addr, char index) {
moutb(pTDFX->MMIOBase[0], addr, index);
return minb(pTDFX->MMIOBase[0], addr+1);
}
void TDFXWriteChipLongMMIO(TDFXPtr pTDFX, int chip, int addr, int val) {
moutl(pTDFX->MMIOBase[chip], addr, val);
}
static int TDFXReadChipLongMMIO(TDFXPtr pTDFX, int chip, int addr) {
return minl(pTDFX->MMIOBase[chip], addr);
}
void TDFXWriteLongMMIO(TDFXPtr pTDFX, int addr, int val) {
TDFXWriteChipLongMMIO(pTDFX, 0, addr, val);
}
int TDFXReadLongMMIO(TDFXPtr pTDFX, int addr) {
return TDFXReadChipLongMMIO(pTDFX, 0, addr);
}
void TDFXSetMMIOAccess(TDFXPtr pTDFX) {
if (!pTDFX->MMIOBase[0])
ErrorF("Can not set MMIO access before MMIOBase[0]\n");
pTDFX->writeControl=TDFXWriteControlMMIO;
pTDFX->readControl=TDFXReadControlMMIO;
pTDFX->writeLong=TDFXWriteLongMMIO;
pTDFX->readLong=TDFXReadLongMMIO;
pTDFX->writeChipLong=TDFXWriteChipLongMMIO;
pTDFX->readChipLong=TDFXReadChipLongMMIO;
}