/* savage_drm.h -- Public header for the savage driver1*2* Copyright 2004 Felix Kuehling3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the "Software"),7* to deal in the Software without restriction, including without limitation8* the rights to use, copy, modify, merge, publish, distribute, sub license,9* and/or sell copies of the Software, and to permit persons to whom the10* Software is furnished to do so, subject to the following conditions:11*12* The above copyright notice and this permission notice (including the13* next paragraph) shall be included in all copies or substantial portions14* of the Software.15*16* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,17* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF18* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND19* NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR20* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF21* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION22* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.23*/2425#ifndef __SAVAGE_DRM_H__26#define __SAVAGE_DRM_H__2728#ifndef __SAVAGE_SAREA_DEFINES__29#define __SAVAGE_SAREA_DEFINES__3031/* 2 heaps (1 for card, 1 for agp), each divided into up to 12832* regions, subject to a minimum region size of (1<<16) == 64k.33*34* Clients may subdivide regions internally, but when sharing between35* clients, the region size is the minimum granularity.36*/3738#define SAVAGE_CARD_HEAP 039#define SAVAGE_AGP_HEAP 140#define SAVAGE_NR_TEX_HEAPS 241#define SAVAGE_NR_TEX_REGIONS 1642#define SAVAGE_LOG_MIN_TEX_REGION_SIZE 164344#endif /* __SAVAGE_SAREA_DEFINES__ */4546typedef struct _drm_savage_sarea {47/* LRU lists for texture memory in agp space and on the card.48*/49struct drm_tex_region texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS +501];51unsigned int texAge[SAVAGE_NR_TEX_HEAPS];5253/* Mechanism to validate card state.54*/55int ctxOwner;56} drm_savage_sarea_t, *drm_savage_sarea_ptr;5758/* Savage-specific ioctls59*/60#define DRM_SAVAGE_BCI_INIT 0x0061#define DRM_SAVAGE_BCI_CMDBUF 0x0162#define DRM_SAVAGE_BCI_EVENT_EMIT 0x0263#define DRM_SAVAGE_BCI_EVENT_WAIT 0x036465#define DRM_IOCTL_SAVAGE_BCI_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_INIT, drm_savage_init_t)66#define DRM_IOCTL_SAVAGE_BCI_CMDBUF DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_CMDBUF, drm_savage_cmdbuf_t)67#define DRM_IOCTL_SAVAGE_BCI_EVENT_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_EMIT, drm_savage_event_emit_t)68#define DRM_IOCTL_SAVAGE_BCI_EVENT_WAIT DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_WAIT, drm_savage_event_wait_t)6970#define SAVAGE_DMA_PCI 171#define SAVAGE_DMA_AGP 372typedef struct drm_savage_init {73enum {74SAVAGE_INIT_BCI = 1,75SAVAGE_CLEANUP_BCI = 276} func;77unsigned int sarea_priv_offset;7879/* some parameters */80unsigned int cob_size;81unsigned int bci_threshold_lo, bci_threshold_hi;82unsigned int dma_type;8384/* frame buffer layout */85unsigned int fb_bpp;86unsigned int front_offset, front_pitch;87unsigned int back_offset, back_pitch;88unsigned int depth_bpp;89unsigned int depth_offset, depth_pitch;9091/* local textures */92unsigned int texture_offset;93unsigned int texture_size;9495/* physical locations of non-permanent maps */96unsigned long status_offset;97unsigned long buffers_offset;98unsigned long agp_textures_offset;99unsigned long cmd_dma_offset;100} drm_savage_init_t;101102typedef union drm_savage_cmd_header drm_savage_cmd_header_t;103typedef struct drm_savage_cmdbuf {104/* command buffer in client's address space */105drm_savage_cmd_header_t __user *cmd_addr;106unsigned int size; /* size of the command buffer in 64bit units */107108unsigned int dma_idx; /* DMA buffer index to use */109int discard; /* discard DMA buffer when done */110/* vertex buffer in client's address space */111unsigned int __user *vb_addr;112unsigned int vb_size; /* size of client vertex buffer in bytes */113unsigned int vb_stride; /* stride of vertices in 32bit words */114/* boxes in client's address space */115struct drm_clip_rect __user *box_addr;116unsigned int nbox; /* number of clipping boxes */117} drm_savage_cmdbuf_t;118119#define SAVAGE_WAIT_2D 0x1 /* wait for 2D idle before updating event tag */120#define SAVAGE_WAIT_3D 0x2 /* wait for 3D idle before updating event tag */121#define SAVAGE_WAIT_IRQ 0x4 /* emit or wait for IRQ, not implemented yet */122typedef struct drm_savage_event {123unsigned int count;124unsigned int flags;125} drm_savage_event_emit_t, drm_savage_event_wait_t;126127/* Commands for the cmdbuf ioctl128*/129#define SAVAGE_CMD_STATE 0 /* a range of state registers */130#define SAVAGE_CMD_DMA_PRIM 1 /* vertices from DMA buffer */131#define SAVAGE_CMD_VB_PRIM 2 /* vertices from client vertex buffer */132#define SAVAGE_CMD_DMA_IDX 3 /* indexed vertices from DMA buffer */133#define SAVAGE_CMD_VB_IDX 4 /* indexed vertices client vertex buffer */134#define SAVAGE_CMD_CLEAR 5 /* clear buffers */135#define SAVAGE_CMD_SWAP 6 /* swap buffers */136137/* Primitive types138*/139#define SAVAGE_PRIM_TRILIST 0 /* triangle list */140#define SAVAGE_PRIM_TRISTRIP 1 /* triangle strip */141#define SAVAGE_PRIM_TRIFAN 2 /* triangle fan */142#define SAVAGE_PRIM_TRILIST_201 3 /* reorder verts for correct flat143* shading on s3d */144145/* Skip flags (vertex format)146*/147#define SAVAGE_SKIP_Z 0x01148#define SAVAGE_SKIP_W 0x02149#define SAVAGE_SKIP_C0 0x04150#define SAVAGE_SKIP_C1 0x08151#define SAVAGE_SKIP_S0 0x10152#define SAVAGE_SKIP_T0 0x20153#define SAVAGE_SKIP_ST0 0x30154#define SAVAGE_SKIP_S1 0x40155#define SAVAGE_SKIP_T1 0x80156#define SAVAGE_SKIP_ST1 0xc0157#define SAVAGE_SKIP_ALL_S3D 0x3f158#define SAVAGE_SKIP_ALL_S4 0xff159160/* Buffer names for clear command161*/162#define SAVAGE_FRONT 0x1163#define SAVAGE_BACK 0x2164#define SAVAGE_DEPTH 0x4165166/* 64-bit command header167*/168union drm_savage_cmd_header {169struct {170unsigned char cmd; /* command */171unsigned char pad0;172unsigned short pad1;173unsigned short pad2;174unsigned short pad3;175} cmd; /* generic */176struct {177unsigned char cmd;178unsigned char global; /* need idle engine? */179unsigned short count; /* number of consecutive registers */180unsigned short start; /* first register */181unsigned short pad3;182} state; /* SAVAGE_CMD_STATE */183struct {184unsigned char cmd;185unsigned char prim; /* primitive type */186unsigned short skip; /* vertex format (skip flags) */187unsigned short count; /* number of vertices */188unsigned short start; /* first vertex in DMA/vertex buffer */189} prim; /* SAVAGE_CMD_DMA_PRIM, SAVAGE_CMD_VB_PRIM */190struct {191unsigned char cmd;192unsigned char prim;193unsigned short skip;194unsigned short count; /* number of indices that follow */195unsigned short pad3;196} idx; /* SAVAGE_CMD_DMA_IDX, SAVAGE_CMD_VB_IDX */197struct {198unsigned char cmd;199unsigned char pad0;200unsigned short pad1;201unsigned int flags;202} clear0; /* SAVAGE_CMD_CLEAR */203struct {204unsigned int mask;205unsigned int value;206} clear1; /* SAVAGE_CMD_CLEAR data */207};208209#endif210211212