* Korli renamed the driver, but forgot to let the driver ask for the new accelerant name.

* Added a TRACE_S3SAVAGE macro that turns on debug output - should be set conditionally
  if DEBUG is defined (see DriverInterface.h), but is currently always on, as requested
  by Gerald.
* Some minor style fixes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21492 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2007-06-21 23:38:53 +00:00
parent b9c1e099e2
commit 4976138306
4 changed files with 54 additions and 77 deletions
@@ -5,10 +5,10 @@
Other authors:
Gerald Zajac 2006-2007
*/
#ifndef DRIVERINTERFACE_H
#define DRIVERINTERFACE_H
#include <Accelerant.h>
#include <GraphicsDefs.h>
#include <Drivers.h>
@@ -23,11 +23,14 @@
extern "C" {
#endif
#if 1 /* DEBUG */
# define TRACE_S3SAVAGE
// turns on debug output
#endif
#define NUM_ELEMENTS(a) ((int)(sizeof(a) / sizeof(a[0]))) // for computing number of elements in an array
typedef struct
{
typedef struct {
sem_id sem;
int32 ben;
} benaphore;
@@ -41,8 +44,7 @@ typedef struct
#define SAVAGE_PRIVATE_DATA_MAGIC 0x5791 // a private driver rev, of sorts
enum
{
enum {
SAVAGE_GET_PRIVATE_DATA = B_DEVICE_OP_CODES_END + 1,
SAVAGE_GET_PCI,
SAVAGE_SET_PCI,
@@ -54,8 +56,7 @@ enum
// Chip tags. These are used to group the adapters into related
// families. See table SavageChipsetTable in driver.c
enum S3ChipTags
{
enum S3ChipTags {
S3_UNKNOWN = 0,
S3_SAVAGE3D,
S3_SAVAGE_MX,
@@ -111,9 +112,7 @@ typedef union _BMPDESC {
} BMPDESC;
typedef struct
{
typedef struct {
// Device ID info.
uint16 vendorID; // PCI vendor ID, from pci_info
uint16 deviceID; // PCI device ID, from pci_info
@@ -147,8 +146,7 @@ typedef struct
int32 flags;
// Cursor info.
struct
{
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
@@ -164,8 +162,7 @@ typedef struct
frame_buffer_config fbc; // frame buffer addresses and bytes_per_row
// Acceleration engine.
struct
{
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
@@ -202,8 +199,7 @@ typedef struct
// Read or write a value in PCI configuration space
typedef struct
{
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
@@ -212,16 +208,14 @@ typedef struct
// Set some boolean condition (like enabling or disabling interrupts)
typedef struct
{
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
{
typedef struct {
uint32 magic; // magic number to make sure the caller groks us
area_id sharedInfoArea; // ID of area containing shared information
} SavageGetPrivateData;
@@ -229,8 +223,7 @@ typedef struct
// 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
{
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;
@@ -240,5 +233,4 @@ typedef struct
}
#endif
#endif
#endif /* DRIVERINTERFACE_H */
@@ -23,10 +23,10 @@ extern bool bAccelerantIsClone;// true if this is a cloned accelerant
void TraceLog(const char* fmt, ...);
#ifdef DEBUG
#define TRACE(a) TraceLog a
#ifdef TRACE_S3SAVAGE
# define TRACE(a) TraceLog a
#else
#define TRACE(a)
# define TRACE(a)
#endif
#endif // GLOBALDATA_H
@@ -269,7 +269,6 @@ UNINIT_ACCELERANT(void)
}
// Kernel function dprintf() is not available in user space; however,
// _sPrintf performs the same function in user space but is undefined
// in the OS header files. Thus, it is defined here.
@@ -20,11 +20,10 @@
#include <graphic_driver.h>
#ifdef DEBUG
#define TRACE(a) TraceLog a
#ifdef TRACE_S3SAVAGE
# define TRACE(a) TraceLog a
#else
#define TRACE(a)
# define TRACE(a)
#endif
@@ -46,8 +45,7 @@ int32 api_version = B_CUR_DRIVER_API_VERSION;
/* these structures are private to the kernel driver */
typedef struct
{
typedef struct {
uint16 chipID; // PCI device id of the chipset
uint16 chipset; // assigned chipset family identifier
char* chipName; // user recognizable name for chipset (must be < 32 chars)
@@ -55,8 +53,7 @@ typedef struct
/* This table maps a PCI device ID to a chipset family identifier and the chipset
name. */
static ChipInfo SavageChipTable[] =
{
static ChipInfo SavageChipTable[] = {
{ 0x8a20, S3_SAVAGE3D, "Savage3D" },
{ 0x8a21, S3_SAVAGE3D, "Savage3D-MV" },
{ 0x8a22, S3_SAVAGE4, "Savage4" },
@@ -86,19 +83,16 @@ static ChipInfo SavageChipTable[] =
#define VENDOR_ID_SAVAGE 0x5333 /* S3 Savage vendor ID */
static struct
{
static struct {
uint16 vendorID;
ChipInfo* devices;
} SupportedDevices[] =
{
} SupportedDevices[] = {
{ VENDOR_ID_SAVAGE, SavageChipTable },
{ 0x0000, NULL }
};
typedef struct
{
typedef struct {
uint32 is_open; /* a count of how many times the devices has been opened */
area_id sharedArea; /* the area shared between the driver and all of the accelerants */
SharedInfo *si; /* a pointer to the shared area, for convenience */
@@ -109,8 +103,7 @@ typedef struct
} DeviceInfo;
typedef struct
{
typedef struct {
uint32 count; /* number of devices actually found */
benaphore kernel; /* for serializing opens/closes */
char *deviceNames[MAX_DEVICES+1]; /* device name pointer storage */
@@ -146,11 +139,11 @@ static device_hooks graphics_device_hooks =
NULL
};
#ifdef DEBUG
#ifdef TRACE_S3SAVAGE
static void
TraceLog(const char *fmt, ...)
{
char string[1024];
char string[1024];
va_list args;
strcpy(string, "savage: ");
@@ -521,8 +514,11 @@ exit0:
}
// #pragma mark - Device Hooks
static status_t
open_hook (const char* name, uint32 flags, void** cookie)
open_hook(const char* name, uint32 flags, void** cookie)
{
int32 index = 0;
DeviceInfo *di;
@@ -642,9 +638,6 @@ done:
}
/* ----------
read_hook - does nothing, gracefully
----- */
static status_t
read_hook(void* dev, off_t pos, void* buf, size_t* len)
{
@@ -658,10 +651,6 @@ read_hook(void* dev, off_t pos, void* buf, size_t* len)
}
/* ----------
write_hook - does nothing, gracefully
----- */
static status_t
write_hook(void* dev, off_t pos, const void* buf, size_t* len)
{
@@ -675,9 +664,6 @@ write_hook(void* dev, off_t pos, const void* buf, size_t* len)
}
/* ----------
close_hook - does nothing, gracefully
----- */
static status_t
close_hook(void* dev)
{
@@ -689,9 +675,6 @@ close_hook(void* dev)
}
/* -----------
free_hook - close down the device
----------- */
static status_t
free_hook(void* dev)
{
@@ -738,11 +721,8 @@ unlock_and_exit:
}
/* -----------
control_hook - where the real work is done
----------- */
static status_t
control_hook (void* dev, uint32 msg, void *buf, size_t len)
control_hook(void* dev, uint32 msg, void *buf, size_t len)
{
DeviceInfo *di = (DeviceInfo *)dev;
status_t result = B_DEV_INVALID_IOCTL;
@@ -753,53 +733,59 @@ control_hook (void* dev, uint32 msg, void *buf, size_t len)
switch (msg) {
/* the only PUBLIC ioctl */
case B_GET_ACCELERANT_SIGNATURE: {
case B_GET_ACCELERANT_SIGNATURE:
{
char *sig = (char *)buf;
strcpy(sig, "savage.accelerant");
strcpy(sig, "s3savage.accelerant");
result = B_OK;
break;
}
break;
/* PRIVATE ioctl from here on */
case SAVAGE_GET_PRIVATE_DATA: {
case SAVAGE_GET_PRIVATE_DATA:
{
SavageGetPrivateData *gpd = (SavageGetPrivateData *)buf;
if (gpd->magic == SAVAGE_PRIVATE_DATA_MAGIC) {
gpd->sharedInfoArea = di->sharedArea;
result = B_OK;
}
break;
}
break;
case SAVAGE_GET_PCI: {
case SAVAGE_GET_PCI:
{
SavageGetSetPci *gsp = (SavageGetSetPci *)buf;
if (gsp->magic == SAVAGE_PRIVATE_DATA_MAGIC) {
pci_info *pcii = &(di->pcii);
gsp->value = get_pci(gsp->offset, gsp->size);
result = B_OK;
}
break;
}
break;
case SAVAGE_SET_PCI: {
case SAVAGE_SET_PCI:
{
SavageGetSetPci *gsp = (SavageGetSetPci *)buf;
if (gsp->magic == SAVAGE_PRIVATE_DATA_MAGIC) {
pci_info *pcii = &(di->pcii);
set_pci(gsp->offset, gsp->size, gsp->value);
result = B_OK;
}
break;
}
break;
case SAVAGE_DEVICE_NAME: {
case SAVAGE_DEVICE_NAME:
{
SavageDeviceName *dn = (SavageDeviceName *)buf;
if (dn->magic == SAVAGE_PRIVATE_DATA_MAGIC) {
strcpy(dn->name, di->name);
result = B_OK;
}
break;
}
break;
case SAVAGE_RUN_INTERRUPTS: {
case SAVAGE_RUN_INTERRUPTS:
{
SavageSetBoolState *ri = (SavageSetBoolState *)buf;
if (ri->magic == SAVAGE_PRIVATE_DATA_MAGIC) {
if (ri->bEnable) {
@@ -809,8 +795,8 @@ control_hook (void* dev, uint32 msg, void *buf, size_t len)
}
}
result = B_OK;
break;
}
break;
}
return result;
}