haiku/headers/private/graphics/s3/DriverInterface.h
Axel Dörfler c1379d357b Update for the S3 driver by Gerald:
* The hardware cursor is now disabled at 640x480 with a Virge VX (before it
  was just invisible).
* EDID info can now be read for all S3 chips.
* For the Savage IX, Savage MX, and SuperSavage chips the display is no 
  longer expanded to fill a laptop LCD display when the mode resolution is 
  less than the size of LCD display.
* Savage IX, Savage MX, and SuperSavage chips will now display mode 
  1400x1050 on a 1400x1050 laptop LCD display.  Previously the display was 
  blank at that resolution. 
* Previously about half the Savage chips would not draw properly at 
  1400x1050.  That is, the image was badly skewed and unusable.  All of 
  them now draw properly at 1400x1050.
* Some code was reorganized to remove unnecessary and redundant code.  


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27863 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-10-04 08:09:40 +00:00

225 lines
6.0 KiB
C

/*
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>
// This file contains info that is shared between the kernel driver and the
// accelerant, and info that is shared among the source files of the accelerant.
#define ENABLE_DEBUG_TRACE // if defined, turns on debug output to syslog
#define NUM_ELEMENTS(a) ((int)(sizeof(a) / sizeof(a[0]))) // for computing number of elements in an array
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,
};
// Chip type numbers. These are used to group the chips into related
// groups. See table S3_ChipTable in driver.c
enum ChipType {
S3_TRIO64 = 1,
S3_TRIO64_VP, // Trio64V+ has same ID as Trio64 but different revision number
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, // laptop LCD display
MT_DFP // DVI display
};
struct DisplayModeEx : display_mode {
uint32 bpp; // bits/pixel
uint32 bytesPerRow; // actual number of bytes in one line/row
};
struct SharedInfo {
// Device ID info.
uint16 vendorID; // PCI vendor ID, from pci_info
uint16 deviceID; // PCI device ID, from pci_info
uint8 revision; // PCI device revsion, from pci_info
uint32 chipType; // indicates group in which chip belongs (a group has similar functionality)
char chipName[32]; // user recognizable name of chip
bool bAccelerantInUse; // true = accelerant has been initialized
bool bInterruptAssigned; // card has a useable interrupt assigned to it
bool bDisableHdwCursor; // true = disable hardware cursor & use software cursor
bool bDisableAccelDraw; // true = disable accelerated drawing
sem_id vertBlankSem; // vertical blank semaphore; if < 0, there is no semaphore
// Memory mappings.
area_id regsArea; // area_id for the memory mapped registers. It will
// be cloned into accelerant's address space.
area_id videoMemArea; // video memory area_id. The addresses are shared with all teams.
void* videoMemAddr; // video memory addr as viewed from virtual memory
void* videoMemPCI; // video memory addr as viewed from the PCI bus (for DMA)
uint32 videoMemSize; // video memory size in bytes.
uint32 cursorOffset; // offset of cursor in video memory
uint32 frameBufferOffset; // offset of frame buffer in video memory
uint32 maxFrameBufferSize; // max available video memory for frame buffer
// Color spaces supported by current video chip/driver.
color_space colorSpaces[6];
uint32 colorSpaceCount; // number of color spaces in array colorSpaces
// List of screen modes.
area_id modeArea; // area containing list of display modes the driver supports
uint32 modeCount; // number of display modes in the list
uint16 cursorHotX; // Cursor hot spot. Top left corner of the cursor
uint16 cursorHotY; // is 0,0
// Current display mode configuration, and other parameters related to
// current display mode.
DisplayModeEx displayMode; // current display mode configuration
int32 commonCmd; // flags common to drawing commands of current display mode
edid1_info edidInfo;
bool bHaveEDID; // true = EDID info from device is in edidInfo
Benaphore engineLock; // for serializing access to the acceleration engine
int mclk;
MonitorType displayType;
uint16 panelX; // laptop LCD width
uint16 panelY; // laptop LCD height
// Command Overflow Buffer (COB) parameters for Savage chips.
uint32 cobSizeIndex; // size index
uint32 cobOffset; // offset in video memory
uint32 globalBitmapDesc; // Global Bitmap Descriptor for BCI
};
// Set some boolean condition (like enabling or disabling interrupts)
struct S3SetBoolState {
uint32 magic; // magic number
bool bEnable; // state to set
};
// Retrieve the area_id of the kernel/accelerant shared info
struct S3GetPrivateData {
uint32 magic; // magic number
area_id sharedInfoArea; // ID of area containing shared information
};
struct S3GetEDID {
uint32 magic; // magic number
edid1_raw rawEdid; // raw EDID info to obtain
};
struct S3GetSetPIO {
uint32 magic; // magic number
uint32 offset; // offset of PIO register to read/write
uint32 size; // number of bytes to transfer
uint32 value; // value to write or value that was read
};
#endif // DRIVERINTERFACE_H