Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* savage_drm.h -- Public header for the savage driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright 2004  Felix Kuehling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Permission is hereby granted, free of charge, to any person obtaining a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * copy of this software and associated documentation files (the "Software"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * to deal in the Software without restriction, including without limitation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * the rights to use, copy, modify, merge, publish, distribute, sub license,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * and/or sell copies of the Software, and to permit persons to whom the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  * Software is furnished to do so, subject to the following conditions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * The above copyright notice and this permission notice (including the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  * next paragraph) shall be included in all copies or substantial portions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * of the Software.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #ifndef __SAVAGE_DRM_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define __SAVAGE_DRM_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #include "drm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #if defined(__cplusplus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) extern "C" {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #ifndef __SAVAGE_SAREA_DEFINES__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define __SAVAGE_SAREA_DEFINES__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) /* 2 heaps (1 for card, 1 for agp), each divided into up to 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  * regions, subject to a minimum region size of (1<<16) == 64k.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  * Clients may subdivide regions internally, but when sharing between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * clients, the region size is the minimum granularity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define SAVAGE_CARD_HEAP		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #define SAVAGE_AGP_HEAP			1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define SAVAGE_NR_TEX_HEAPS		2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define SAVAGE_NR_TEX_REGIONS		16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) #define SAVAGE_LOG_MIN_TEX_REGION_SIZE	16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #endif				/* __SAVAGE_SAREA_DEFINES__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) typedef struct _drm_savage_sarea {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	/* LRU lists for texture memory in agp space and on the card.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	struct drm_tex_region texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 						      1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	unsigned int texAge[SAVAGE_NR_TEX_HEAPS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	/* Mechanism to validate card state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	int ctxOwner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) } drm_savage_sarea_t, *drm_savage_sarea_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) /* Savage-specific ioctls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #define DRM_SAVAGE_BCI_INIT		0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) #define DRM_SAVAGE_BCI_CMDBUF           0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #define DRM_SAVAGE_BCI_EVENT_EMIT	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) #define DRM_SAVAGE_BCI_EVENT_WAIT	0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) #define DRM_IOCTL_SAVAGE_BCI_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_INIT, drm_savage_init_t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) #define DRM_IOCTL_SAVAGE_BCI_CMDBUF		DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_CMDBUF, drm_savage_cmdbuf_t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) #define DRM_IOCTL_SAVAGE_BCI_EVENT_EMIT	DRM_IOWR(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_EMIT, drm_savage_event_emit_t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) #define DRM_IOCTL_SAVAGE_BCI_EVENT_WAIT	DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_WAIT, drm_savage_event_wait_t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #define SAVAGE_DMA_PCI	1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) #define SAVAGE_DMA_AGP	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) typedef struct drm_savage_init {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		SAVAGE_INIT_BCI = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		SAVAGE_CLEANUP_BCI = 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	} func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	unsigned int sarea_priv_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	/* some parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	unsigned int cob_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	unsigned int bci_threshold_lo, bci_threshold_hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	unsigned int dma_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	/* frame buffer layout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	unsigned int fb_bpp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	unsigned int front_offset, front_pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	unsigned int back_offset, back_pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	unsigned int depth_bpp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	unsigned int depth_offset, depth_pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	/* local textures */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	unsigned int texture_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	unsigned int texture_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	/* physical locations of non-permanent maps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	unsigned long status_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	unsigned long buffers_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	unsigned long agp_textures_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	unsigned long cmd_dma_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) } drm_savage_init_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) typedef union drm_savage_cmd_header drm_savage_cmd_header_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) typedef struct drm_savage_cmdbuf {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	/* command buffer in client's address space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	drm_savage_cmd_header_t __user *cmd_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	unsigned int size;	/* size of the command buffer in 64bit units */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	unsigned int dma_idx;	/* DMA buffer index to use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	int discard;		/* discard DMA buffer when done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	/* vertex buffer in client's address space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	unsigned int __user *vb_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	unsigned int vb_size;	/* size of client vertex buffer in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	unsigned int vb_stride;	/* stride of vertices in 32bit words */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	/* boxes in client's address space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	struct drm_clip_rect __user *box_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	unsigned int nbox;	/* number of clipping boxes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) } drm_savage_cmdbuf_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define SAVAGE_WAIT_2D  0x1	/* wait for 2D idle before updating event tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SAVAGE_WAIT_3D  0x2	/* wait for 3D idle before updating event tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SAVAGE_WAIT_IRQ 0x4	/* emit or wait for IRQ, not implemented yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) typedef struct drm_savage_event {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	unsigned int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	unsigned int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) } drm_savage_event_emit_t, drm_savage_event_wait_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* Commands for the cmdbuf ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SAVAGE_CMD_STATE	0	/* a range of state registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define SAVAGE_CMD_DMA_PRIM	1	/* vertices from DMA buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define SAVAGE_CMD_VB_PRIM	2	/* vertices from client vertex buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define SAVAGE_CMD_DMA_IDX	3	/* indexed vertices from DMA buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SAVAGE_CMD_VB_IDX	4	/* indexed vertices client vertex buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define SAVAGE_CMD_CLEAR	5	/* clear buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SAVAGE_CMD_SWAP		6	/* swap buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* Primitive types
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SAVAGE_PRIM_TRILIST	0	/* triangle list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define SAVAGE_PRIM_TRISTRIP	1	/* triangle strip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SAVAGE_PRIM_TRIFAN	2	/* triangle fan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define SAVAGE_PRIM_TRILIST_201	3	/* reorder verts for correct flat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 					 * shading on s3d */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* Skip flags (vertex format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SAVAGE_SKIP_Z		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define SAVAGE_SKIP_W		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define SAVAGE_SKIP_C0		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SAVAGE_SKIP_C1		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SAVAGE_SKIP_S0		0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define SAVAGE_SKIP_T0		0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define SAVAGE_SKIP_ST0		0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define SAVAGE_SKIP_S1		0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define SAVAGE_SKIP_T1		0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define SAVAGE_SKIP_ST1		0xc0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define SAVAGE_SKIP_ALL_S3D	0x3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define SAVAGE_SKIP_ALL_S4	0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* Buffer names for clear command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define SAVAGE_FRONT		0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define SAVAGE_BACK		0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define SAVAGE_DEPTH		0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /* 64-bit command header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) union drm_savage_cmd_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		unsigned char cmd;	/* command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		unsigned char pad0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		unsigned short pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		unsigned short pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		unsigned short pad3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	} cmd;			/* generic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		unsigned char cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		unsigned char global;	/* need idle engine? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		unsigned short count;	/* number of consecutive registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		unsigned short start;	/* first register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		unsigned short pad3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	} state;		/* SAVAGE_CMD_STATE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 		unsigned char cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		unsigned char prim;	/* primitive type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		unsigned short skip;	/* vertex format (skip flags) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		unsigned short count;	/* number of vertices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 		unsigned short start;	/* first vertex in DMA/vertex buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	} prim;			/* SAVAGE_CMD_DMA_PRIM, SAVAGE_CMD_VB_PRIM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		unsigned char cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		unsigned char prim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		unsigned short skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		unsigned short count;	/* number of indices that follow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		unsigned short pad3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	} idx;			/* SAVAGE_CMD_DMA_IDX, SAVAGE_CMD_VB_IDX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		unsigned char cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		unsigned char pad0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 		unsigned short pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		unsigned int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	} clear0;		/* SAVAGE_CMD_CLEAR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	} clear1;		/* SAVAGE_CMD_CLEAR data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #if defined(__cplusplus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #endif