Copyright 2007-2008 Haiku, Inc. All rights reserved.
Distributed under the terms of the MIT license.
Authors:
Gerald Zajac 2007-2008
*/
#ifndef DRIVERINTERFACE_H
#define DRIVERINTERFACE_H
#include <Accelerant.h>
#include <GraphicsDefs.h>
#include <Drivers.h>
#include <edid.h>
#define ENABLE_DEBUG_TRACE
struct Benaphore {
sem_id sem;
int32 count;
status_t Init(const char* name)
{
count = 0;
sem = create_sem(0, name);
return sem < 0 ? sem : B_OK;
}
status_t Acquire()
{
if (atomic_add(&count, 1) > 0)
return acquire_sem(sem);
return B_OK;
}
status_t Release()
{
if (atomic_add(&count, -1) > 1)
return release_sem(sem);
return B_OK;
}
void Delete() { delete_sem(sem); }
};
#define S3_PRIVATE_DATA_MAGIC 0x4521 // a private driver rev, of sorts
enum {
S3_GET_PRIVATE_DATA = B_DEVICE_OP_CODES_END + 1,
S3_DEVICE_NAME,
S3_GET_EDID,
S3_GET_PIO,
S3_SET_PIO,
S3_RUN_INTERRUPTS,
};
enum ChipType {
S3_TRIO64 = 1,
S3_TRIO64_VP,
S3_TRIO64_UVP,
S3_TRIO64_V2,
Trio64ChipsEnd,
S3_VIRGE,
S3_VIRGE_VX,
S3_VIRGE_DXGX,
S3_VIRGE_GX2,
S3_VIRGE_MX,
S3_VIRGE_MXP,
S3_TRIO_3D,
S3_TRIO_3D_2X,
VirgeChipsEnd,
S3_SAVAGE_3D,
S3_SAVAGE_MX,
S3_SAVAGE4,
S3_PROSAVAGE,
S3_TWISTER,
S3_PROSAVAGE_DDR,
S3_SUPERSAVAGE,
S3_SAVAGE2000,
};
#define S3_TRIO64_FAMILY(chip) (chip < Trio64ChipsEnd)
#define S3_VIRGE_FAMILY(chip) (chip > Trio64ChipsEnd && chip < VirgeChipsEnd)
#define S3_SAVAGE_FAMILY(chip) (chip > VirgeChipsEnd)
#define S3_VIRGE_GX2_SERIES(chip) (chip == S3_VIRGE_GX2 || chip == S3_TRIO_3D_2X)
#define S3_VIRGE_MX_SERIES(chip) (chip == S3_VIRGE_MX || chip == S3_VIRGE_MXP)
#define S3_SAVAGE_3D_SERIES(chip) ((chip == S3_SAVAGE_3D) || (chip == S3_SAVAGE_MX))
#define S3_SAVAGE4_SERIES(chip) ((chip == S3_SAVAGE4) \
|| (chip == S3_PROSAVAGE) \
|| (chip == S3_TWISTER) \
|| (chip == S3_PROSAVAGE_DDR))
#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip == S3_SAVAGE_MX) \
|| (chip == S3_SUPERSAVAGE))
#define S3_MOBILE_TWISTER_SERIES(chip) ((chip == S3_TWISTER) \
|| (chip == S3_PROSAVAGE_DDR))
enum MonitorType {
MT_CRT,
MT_LCD,
MT_DFP
};
struct DisplayModeEx : display_mode {
uint32 bpp;
uint32 bytesPerRow;
};
struct SharedInfo {
uint16 vendorID;
uint16 deviceID;
uint8 revision;
uint32 chipType;
char chipName[32];
bool bAccelerantInUse;
bool bInterruptAssigned;
bool bDisableHdwCursor;
bool bDisableAccelDraw;
sem_id vertBlankSem;
area_id regsArea;
area_id videoMemArea;
void* videoMemAddr;
void* videoMemPCI;
uint32 videoMemSize;
uint32 cursorOffset;
uint32 frameBufferOffset;
uint32 maxFrameBufferSize;
color_space colorSpaces[6];
uint32 colorSpaceCount;
area_id modeArea;
uint32 modeCount;
uint16 cursorHotX;
uint16 cursorHotY;
DisplayModeEx displayMode;
int32 commonCmd;
edid1_info edidInfo;
bool bHaveEDID;
Benaphore engineLock;
int mclk;
MonitorType displayType;
uint16 panelX;
uint16 panelY;
uint32 cobSizeIndex;
uint32 cobOffset;
uint32 globalBitmapDesc;
};
struct S3SetBoolState {
uint32 magic;
bool bEnable;
};
struct S3GetPrivateData {
uint32 magic;
area_id sharedInfoArea;
};
struct S3GetEDID {
uint32 magic;
edid1_raw rawEdid;
};
struct S3GetSetPIO {
uint32 magic;
uint32 offset;
uint32 size;
uint32 value;
};
#endif