incorporated savage driver sources from Gerald Zajac. I hope it's the good place for this.

fixed warnings and code style. Please, from now on, provide *patches* to this version.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21421 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2007-06-15 21:02:08 +00:00
parent 60b8b10331
commit de050c6029
27 changed files with 4504 additions and 3996 deletions
@@ -1,192 +1,239 @@
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
Other authors:
Gerald Zajac 2006-2007
*/
#ifndef DRIVERINTERFACE_H
#define DRIVERINTERFACE_H
#include <Accelerant.h>
#include <GraphicsDefs.h>
#include <Drivers.h>
#include <PCI.h>
#include <OS.h>
/*
This is the info that needs to be shared between the kernel driver and
the accelerant for the sample driver.
This is the info that needs to be shared between the kernel driver and
the accelerant for the sample driver.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define NUM_ELEMENTS(a) ((int)(sizeof(a) / sizeof(a[0]))) // for computing number of elements in an array
typedef struct
{
sem_id sem;
int32 ben;
sem_id sem;
int32 ben;
} benaphore;
#define INIT_BEN(x) x.sem = create_sem(0, "SAVAGE "#x" benaphore"); x.ben = 0;
#define AQUIRE_BEN(x) if((atomic_add(&(x.ben), 1)) >= 1) acquire_sem(x.sem);
#define RELEASE_BEN(x) if((atomic_add(&(x.ben), -1)) > 1) release_sem(x.sem);
#define DELETE_BEN(x) delete_sem(x.sem);
#define INIT_BEN(x) x.sem = create_sem(0, "SAVAGE "#x" benaphore"); x.ben = 0;
#define AQUIRE_BEN(x) if((atomic_add(&(x.ben), 1)) >= 1) acquire_sem(x.sem);
#define RELEASE_BEN(x) if((atomic_add(&(x.ben), -1)) > 1) release_sem(x.sem);
#define DELETE_BEN(x) delete_sem(x.sem);
#define SAVAGE_PRIVATE_DATA_MAGIC 0x1234 /* a private driver rev, of sorts */
#define SAVAGE_PRIVATE_DATA_MAGIC 0x5791 // a private driver rev, of sorts
#define MAX_SAVAGE_DEVICE_NAME_LENGTH 32
#define SKD_MOVE_CURSOR 0x00000001
#define SKD_PROGRAM_CLUT 0x00000002
#define SKD_SET_START_ADDR 0x00000004
#define SKD_SET_CURSOR 0x00000008
#define SKD_HANDLER_INSTALLED 0x80000000
enum
{
SAVAGE_GET_PRIVATE_DATA = B_DEVICE_OP_CODES_END + 1,
SAVAGE_GET_PCI,
SAVAGE_SET_PCI,
SAVAGE_DEVICE_NAME,
SAVAGE_RUN_INTERRUPTS,
SAVAGE_DPRINTF
SAVAGE_GET_PRIVATE_DATA = B_DEVICE_OP_CODES_END + 1,
SAVAGE_GET_PCI,
SAVAGE_SET_PCI,
SAVAGE_DEVICE_NAME,
SAVAGE_RUN_INTERRUPTS,
};
typedef struct
// Chip tags. These are used to group the adapters into related
// families. See table SavageChipsetTable in driver.c
enum S3ChipTags
{
uint16 vendor_id; /* PCI vendor ID, from pci_info */
uint16 device_id; /* PCI device ID, from pci_info */
uint8 revision; /* PCI device revsion, from pci_info */
area_id regs_area; /* Kernel's area_id for the memory mapped registers.
It will be cloned into the accelerant's address
space. */
area_id fb_area; /* Frame buffer's area_id. The addresses are shared
with all teams. */
void *framebuffer; /* As viewed from virtual memory */
void *framebuffer_pci; /* As viewed from the PCI bus (for DMA) */
area_id rom_area; /* Mapped ROM's area_id */
void *rom; /* As viewed from virtual memory. Shared by all teams */
area_id mode_area; /* Contains the list of display modes the driver supports */
uint32 mode_count; /* Number of display modes in the list */
sem_id vblank; /* The vertical blank semaphore. Ownership will be
transfered to the team opening the device first */
int32 flags;
int32 start_addr;
struct
{
uint8* data; /* Pointer into the frame buffer to where the
cursor data starts */
uint16 hot_x; /* Cursor hot spot. The top left corner of the cursor */
uint16 hot_y; /* is 0,0 */
uint16 x; /* The location of the cursor hot spot on the */
uint16 y; /* display (or desktop?) */
uint16 width; /* Width and height of the cursor shape */
uint16 height;
bool is_visible; /* Is the cursor currently displayed? */
} cursor;
uint16 first_color;
uint16 color_count;
bigtime_t refresh_period; /* Duration of one frame (ie 1/refresh rate) */
bigtime_t blank_period; /* Duration of the blanking period. These are
usefull when faking vertical blanking
interrupts. */
uint8 color_data[3 * 256]; /* */
uint8 cursor0[64*64/8]; /* AND mask for a 64x64 cursor */
uint8 cursor1[512]; /* XOR mask for a 64x64 cursor */
display_mode dm; /* current display mode configuration */
frame_buffer_config
fbc; /* bytes_per_row and start of frame buffer */
struct
{
uint64 count; /* last fifo slot used */
uint64 last_idle; /* last fifo slot we *know* the engine was idle after */
benaphore lock; /* for serializing access to the acceleration engine */
} engine;
uint32 pix_clk_max8; /* The maximum speed the pixel clock should run */
uint32 pix_clk_max16; /* at for a given pixel width. Usually a function */
uint32 pix_clk_max32; /* of memory and DAC bandwidths. */
uint32 mem_size; /* Frame buffer memory, in bytes. */
} shared_info;
/* Read or write a value in PCI configuration space */
typedef struct
{
uint32 magic; /* magic number to make sure the caller groks us */
uint32 offset; /* Offset to read/write */
uint32 size; /* Number of bytes to transfer */
uint32 value; /* The value read or written */
} savage_get_set_pci;
/* Set some boolean condition (like enabling or disabling interrupts) */
typedef struct
{
uint32 magic; /* magic number to make sure the caller groks us */
bool do_it; /* state to set */
} savage_set_bool_state;
/* Retrieve the area_id of the kernel/accelerant shared info */
typedef struct
{
uint32 magic; /* magic number to make sure the caller groks us */
area_id shared_info_area; /* area_id containing the shared information */
} savage_get_private_data;
/* Retrieve the device name. Usefull for when we have a file handle, but want
to know the device name (like when we are cloning the accelerant) */
typedef struct
{
uint32 magic; /* magic number to make sure the caller groks us */
char *name; /* The name of the device, less the /dev root */
} savage_device_name;
enum
{
SAVAGE_WAIT_FOR_VBLANK = (0 << 0)
S3_UNKNOWN = 0,
S3_SAVAGE3D,
S3_SAVAGE_MX,
S3_SAVAGE4,
S3_PROSAVAGE,
S3_TWISTER,
S3_PROSAVAGEDDR,
S3_SUPERSAVAGE,
S3_SAVAGE2000,
};
enum
#define S3_SAVAGE3D_SERIES(chip) ((chip==S3_SAVAGE3D) || (chip==S3_SAVAGE_MX))
#define S3_SAVAGE4_SERIES(chip) ((chip==S3_SAVAGE4) \
|| (chip==S3_PROSAVAGE) \
|| (chip==S3_TWISTER) \
|| (chip==S3_PROSAVAGEDDR))
#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE))
#define S3_MOBILE_TWISTER_SERIES(chip) ((chip==S3_TWISTER) || (chip==S3_PROSAVAGEDDR))
typedef enum {
MT_NONE,
MT_CRT,
MT_LCD,
MT_DFP,
MT_TV
} SavageMonitorType;
// Bitmap descriptor structures for BCI
typedef struct _HIGH {
unsigned short Stride;
unsigned char Bpp;
unsigned char ResBWTile;
} HIGH;
typedef struct _BMPDESC1 {
unsigned long Offset;
HIGH HighPart;
} BMPDESC1;
typedef struct _BMPDESC2 {
unsigned long LoPart;
unsigned long HiPart;
} BMPDESC2;
typedef union _BMPDESC {
BMPDESC1 bd1;
BMPDESC2 bd2;
} BMPDESC;
typedef struct
{
/* Savage3D series */
PCI_PID_SAVAGE3D = 0x8a20, /* Savage3D */
PCI_PID_SAVAGE3DMV = 0x8a21, /* Savage3D/MV */
PCI_PID_SAVAGEMXMV = 0x8c10, /* Savage/MX-MV */
PCI_PID_SAVAGEMX = 0x8c11, /* Savage/MX */
PCI_PID_SAVAGEIXMV = 0x8c12, /* Savage/IX-MV */
PCI_PID_SAVAGEIX = 0x8c13, /* Savage/IX */
// 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 chipset; // indicates family in which chipset belongs (a family has similar functionality)
char chipsetName[32]; // user recognizable name of chipset
/* Savage4 series */
PCI_PID_SAVAGE4_2 = 0x8a22, /* Savage4 */
PCI_PID_SAVAGE4_3 = 0x8a23, /* Savage4 */
PCI_PID_SAVAGE2000 = 0x9102, /* Savage2000 */
PCI_PID_PM133 = 0x8a25, /* ProSavage PM133 */
PCI_PID_KM133 = 0x8a26, /* ProSavage KM133 */
PCI_PID_PN133 = 0x8d01, /* ProSavage PN133, 86C380 [ProSavageDDR K4M266] */
PCI_PID_KN133 = 0x8d02, /* ProSavage KN133/TwisterK AGP4X VT8636A */
PCI_PID_KM266 = 0x8d04, /* ProSavage8 KM266/KL266 VT8375 */
PCI_PID_PN266 = 0x8d03, /* VT8751 [ProSavageDDR P4M266] */
bool bAccelerantInUse; // true = accelerant has been initialized
bool bInterruptAssigned; // card has a useable interrupt assigned to it
/* SuperSavage series (unsupported) */
PCI_PID_SUPERSAVAGE_MX128 = 0x8c22, /* SuperSavage MX/128 */
PCI_PID_SUPERSAVAGE_MX64 = 0x8c24, /* SuperSavage MX/64 */
PCI_PID_SUPERSAVAGE_MX64C = 0x8c26, /* SuperSavage MX/64C */
PCI_PID_SUPERSAVAGE_IX128_SDR = 0x8c2a, /* SuperSavage IX/128 SDR */
PCI_PID_SUPERSAVAGE_IX128_DDR = 0x8c2b, /* SuperSavage IX/128 DDR */
PCI_PID_SUPERSAVAGE_IX64_SDR = 0x8c2c, /* SuperSavage IX/64 SDR */
PCI_PID_SUPERSAVAGE_IX64_DDR = 0x8c2d, /* SuperSavage IX/64 DDR */
PCI_PID_SUPERSAVAGE_IXC_SDR = 0x8c2e, /* SuperSavage IX/C SDR */
PCI_PID_SUPERSAVAGE_IXC_DDR = 0x8c2f, /* SuperSavage IX/C DDR */
};
// 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.
#define isSavage4Family(p) \
((p) == PCI_PID_SAVAGE4_2 || \
(p) == PCI_PID_SAVAGE4_3 || \
(p) == PCI_PID_SAVAGE2000 || \
(p) == PCI_PID_PM133 || \
(p) == PCI_PID_KM133 || \
(p) == PCI_PID_PN133 || \
(p) == PCI_PID_KN133 || \
(p) == PCI_PID_KM266)
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
// List of screen modes.
area_id modeArea; // Contains the list of display modes the driver supports
uint32 modeCount; // Number of display modes in the list
// Vertical blank semaphore.
sem_id vblank; // vertical blank semaphore; if < 0, there is no semaphore
// Ownership will be transfered to team opening device first
// Flags used by driver.
int32 flags;
// Cursor info.
struct
{
uint16 hot_x; // Cursor hot spot. The top left corner of the cursor
uint16 hot_y; // is 0,0
uint16 x; // The location of the cursor hot spot on the
uint16 y; // display (or desktop?)
uint16 width; // Width and height of the cursor shape
uint16 height;
bool bIsVisible; // Is the cursor currently displayed?
} cursor;
display_mode dm; // current display mode configuration
int bitsPerPixel; // bits per pixel of current display mode
frame_buffer_config fbc; // frame buffer addresses and bytes_per_row
// Acceleration engine.
struct
{
uint64 count; // last fifo slot used
uint64 lastIdle; // last fifo slot we *know* the engine was idle after
benaphore lock; // for serializing access to the acceleration engine
} engine;
int mclk;
uint32 pix_clk_max8; // The maximum speed the pixel clock should run
uint32 pix_clk_max16; // at for a given pixel width. Usually a function
uint32 pix_clk_max32; // of memory and DAC bandwidths.
// Command Overflow Buffer (COB) parameters.
bool bDisableCOB; // enable/disable COB for Savage 4 & ProSavage
uint32 cobIndex; // size index
uint32 cobSize; // size in bytes
uint32 cobOffset; // offset in video memory
uint32 bciThresholdLo; // low and high thresholds for
uint32 bciThresholdHi; // shadow status update (32bit words)
BMPDESC GlobalBD; // Bitmap Descriptor for BCI
int panelX; // LCD panel width
int panelY; // LCD panel height
int frameX0; // viewport position
int frameY0;
// The various Savage wait handlers.
bool (*WaitQueue)(int);
bool (*WaitIdleEmpty)();
SavageMonitorType displayType;
} SharedInfo;
// Read or write a value in PCI configuration space
typedef struct
{
uint32 magic; // magic number to make sure the caller groks us
uint32 offset; // Offset to read/write
uint32 size; // Number of bytes to transfer
uint32 value; // The value read or written
} SavageGetSetPci;
// Set some boolean condition (like enabling or disabling interrupts)
typedef struct
{
uint32 magic; // magic number to make sure the caller groks us
bool bEnable; // state to set
} SavageSetBoolState;
// Retrieve the area_id of the kernel/accelerant shared info
typedef struct
{
uint32 magic; // magic number to make sure the caller groks us
area_id sharedInfoArea; // ID of area containing shared information
} SavageGetPrivateData;
// Retrieve the device name. Usefull for when we have a file handle, but want
// to know the device name (like when we are cloning the accelerant)
typedef struct
{
uint32 magic; // magic number to make sure the caller groks us
char *name; // The name of the device, less the /dev root
} SavageDeviceName;
#if defined(__cplusplus)