1 1.2 riastrad /* $NetBSD: i810_drv.h,v 1.3 2021/12/18 23:45:27 riastradh Exp $ */ 2 1.2 riastrad 3 1.1 riastrad /* i810_drv.h -- Private header for the Matrox g200/g400 driver -*- linux-c -*- 4 1.1 riastrad * Created: Mon Dec 13 01:50:01 1999 by jhartmann (at) precisioninsight.com 5 1.1 riastrad * 6 1.1 riastrad * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 7 1.1 riastrad * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 8 1.1 riastrad * All rights reserved. 9 1.1 riastrad * 10 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 11 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 12 1.1 riastrad * to deal in the Software without restriction, including without limitation 13 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 15 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 16 1.1 riastrad * 17 1.1 riastrad * The above copyright notice and this permission notice (including the next 18 1.1 riastrad * paragraph) shall be included in all copies or substantial portions of the 19 1.1 riastrad * Software. 20 1.1 riastrad * 21 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24 1.1 riastrad * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 27 1.1 riastrad * DEALINGS IN THE SOFTWARE. 28 1.1 riastrad * 29 1.1 riastrad * Authors: Rickard E. (Rik) Faith <faith (at) valinux.com> 30 1.1 riastrad * Jeff Hartmann <jhartmann (at) valinux.com> 31 1.1 riastrad * 32 1.1 riastrad */ 33 1.1 riastrad 34 1.1 riastrad #ifndef _I810_DRV_H_ 35 1.1 riastrad #define _I810_DRV_H_ 36 1.1 riastrad 37 1.3 riastrad #include <drm/drm_ioctl.h> 38 1.2 riastrad #include <drm/drm_legacy.h> 39 1.3 riastrad #include <drm/i810_drm.h> 40 1.2 riastrad 41 1.1 riastrad /* General customization: 42 1.1 riastrad */ 43 1.1 riastrad 44 1.1 riastrad #define DRIVER_AUTHOR "VA Linux Systems Inc." 45 1.1 riastrad 46 1.1 riastrad #define DRIVER_NAME "i810" 47 1.1 riastrad #define DRIVER_DESC "Intel i810" 48 1.1 riastrad #define DRIVER_DATE "20030605" 49 1.1 riastrad 50 1.1 riastrad /* Interface history 51 1.1 riastrad * 52 1.1 riastrad * 1.1 - XFree86 4.1 53 1.1 riastrad * 1.2 - XvMC interfaces 54 1.1 riastrad * - XFree86 4.2 55 1.1 riastrad * 1.2.1 - Disable copying code (leave stub ioctls for backwards compatibility) 56 1.1 riastrad * - Remove requirement for interrupt (leave stubs again) 57 1.1 riastrad * 1.3 - Add page flipping. 58 1.1 riastrad * 1.4 - fix DRM interface 59 1.1 riastrad */ 60 1.1 riastrad #define DRIVER_MAJOR 1 61 1.1 riastrad #define DRIVER_MINOR 4 62 1.1 riastrad #define DRIVER_PATCHLEVEL 0 63 1.1 riastrad 64 1.1 riastrad typedef struct drm_i810_buf_priv { 65 1.1 riastrad u32 *in_use; 66 1.1 riastrad int my_use_idx; 67 1.1 riastrad int currently_mapped; 68 1.1 riastrad void *virtual; 69 1.1 riastrad void *kernel_virtual; 70 1.1 riastrad drm_local_map_t map; 71 1.1 riastrad } drm_i810_buf_priv_t; 72 1.1 riastrad 73 1.1 riastrad typedef struct _drm_i810_ring_buffer { 74 1.1 riastrad int tail_mask; 75 1.1 riastrad unsigned long Start; 76 1.1 riastrad unsigned long End; 77 1.1 riastrad unsigned long Size; 78 1.1 riastrad u8 *virtual_start; 79 1.1 riastrad int head; 80 1.1 riastrad int tail; 81 1.1 riastrad int space; 82 1.1 riastrad drm_local_map_t map; 83 1.1 riastrad } drm_i810_ring_buffer_t; 84 1.1 riastrad 85 1.1 riastrad typedef struct drm_i810_private { 86 1.1 riastrad struct drm_local_map *sarea_map; 87 1.1 riastrad struct drm_local_map *mmio_map; 88 1.1 riastrad 89 1.1 riastrad drm_i810_sarea_t *sarea_priv; 90 1.1 riastrad drm_i810_ring_buffer_t ring; 91 1.1 riastrad 92 1.1 riastrad void *hw_status_page; 93 1.1 riastrad unsigned long counter; 94 1.1 riastrad 95 1.1 riastrad dma_addr_t dma_status_page; 96 1.1 riastrad 97 1.1 riastrad struct drm_buf *mmap_buffer; 98 1.1 riastrad 99 1.1 riastrad u32 front_di1, back_di1, zi1; 100 1.1 riastrad 101 1.1 riastrad int back_offset; 102 1.1 riastrad int depth_offset; 103 1.1 riastrad int overlay_offset; 104 1.1 riastrad int overlay_physical; 105 1.1 riastrad int w, h; 106 1.1 riastrad int pitch; 107 1.1 riastrad int back_pitch; 108 1.1 riastrad int depth_pitch; 109 1.1 riastrad 110 1.1 riastrad int do_boxes; 111 1.1 riastrad int dma_used; 112 1.1 riastrad 113 1.1 riastrad int current_page; 114 1.1 riastrad int page_flipping; 115 1.1 riastrad 116 1.1 riastrad wait_queue_head_t irq_queue; 117 1.1 riastrad atomic_t irq_received; 118 1.1 riastrad atomic_t irq_emitted; 119 1.1 riastrad 120 1.1 riastrad int front_offset; 121 1.1 riastrad } drm_i810_private_t; 122 1.1 riastrad 123 1.1 riastrad /* i810_dma.c */ 124 1.1 riastrad extern int i810_driver_dma_quiescent(struct drm_device *dev); 125 1.1 riastrad void i810_driver_reclaim_buffers(struct drm_device *dev, 126 1.1 riastrad struct drm_file *file_priv); 127 1.1 riastrad extern int i810_driver_load(struct drm_device *, unsigned long flags); 128 1.1 riastrad extern void i810_driver_lastclose(struct drm_device *dev); 129 1.1 riastrad extern void i810_driver_preclose(struct drm_device *dev, 130 1.1 riastrad struct drm_file *file_priv); 131 1.1 riastrad 132 1.1 riastrad extern long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg); 133 1.2 riastrad extern const struct drm_ioctl_desc i810_ioctls[]; 134 1.1 riastrad extern int i810_max_ioctl; 135 1.1 riastrad 136 1.1 riastrad #define I810_BASE(reg) ((unsigned long) \ 137 1.1 riastrad dev_priv->mmio_map->handle) 138 1.1 riastrad #define I810_ADDR(reg) (I810_BASE(reg) + reg) 139 1.1 riastrad #define I810_DEREF(reg) (*(__volatile__ int *)I810_ADDR(reg)) 140 1.1 riastrad #define I810_READ(reg) I810_DEREF(reg) 141 1.1 riastrad #define I810_WRITE(reg, val) do { I810_DEREF(reg) = val; } while (0) 142 1.1 riastrad #define I810_DEREF16(reg) (*(__volatile__ u16 *)I810_ADDR(reg)) 143 1.1 riastrad #define I810_READ16(reg) I810_DEREF16(reg) 144 1.1 riastrad #define I810_WRITE16(reg, val) do { I810_DEREF16(reg) = val; } while (0) 145 1.1 riastrad 146 1.1 riastrad #define I810_VERBOSE 0 147 1.1 riastrad #define RING_LOCALS unsigned int outring, ringmask; \ 148 1.1 riastrad volatile char *virt; 149 1.1 riastrad 150 1.1 riastrad #define BEGIN_LP_RING(n) do { \ 151 1.1 riastrad if (I810_VERBOSE) \ 152 1.1 riastrad DRM_DEBUG("BEGIN_LP_RING(%d)\n", n); \ 153 1.1 riastrad if (dev_priv->ring.space < n*4) \ 154 1.1 riastrad i810_wait_ring(dev, n*4); \ 155 1.1 riastrad dev_priv->ring.space -= n*4; \ 156 1.1 riastrad outring = dev_priv->ring.tail; \ 157 1.1 riastrad ringmask = dev_priv->ring.tail_mask; \ 158 1.1 riastrad virt = dev_priv->ring.virtual_start; \ 159 1.1 riastrad } while (0) 160 1.1 riastrad 161 1.1 riastrad #define ADVANCE_LP_RING() do { \ 162 1.1 riastrad if (I810_VERBOSE) \ 163 1.1 riastrad DRM_DEBUG("ADVANCE_LP_RING\n"); \ 164 1.1 riastrad dev_priv->ring.tail = outring; \ 165 1.1 riastrad I810_WRITE(LP_RING + RING_TAIL, outring); \ 166 1.1 riastrad } while (0) 167 1.1 riastrad 168 1.1 riastrad #define OUT_RING(n) do { \ 169 1.1 riastrad if (I810_VERBOSE) \ 170 1.1 riastrad DRM_DEBUG(" OUT_RING %x\n", (int)(n)); \ 171 1.1 riastrad *(volatile unsigned int *)(virt + outring) = n; \ 172 1.1 riastrad outring += 4; \ 173 1.1 riastrad outring &= ringmask; \ 174 1.1 riastrad } while (0) 175 1.1 riastrad 176 1.1 riastrad #define GFX_OP_USER_INTERRUPT ((0<<29)|(2<<23)) 177 1.1 riastrad #define GFX_OP_BREAKPOINT_INTERRUPT ((0<<29)|(1<<23)) 178 1.1 riastrad #define CMD_REPORT_HEAD (7<<23) 179 1.1 riastrad #define CMD_STORE_DWORD_IDX ((0x21<<23) | 0x1) 180 1.1 riastrad #define CMD_OP_BATCH_BUFFER ((0x0<<29)|(0x30<<23)|0x1) 181 1.1 riastrad 182 1.1 riastrad #define INST_PARSER_CLIENT 0x00000000 183 1.1 riastrad #define INST_OP_FLUSH 0x02000000 184 1.1 riastrad #define INST_FLUSH_MAP_CACHE 0x00000001 185 1.1 riastrad 186 1.1 riastrad #define BB1_START_ADDR_MASK (~0x7) 187 1.1 riastrad #define BB1_PROTECTED (1<<0) 188 1.1 riastrad #define BB1_UNPROTECTED (0<<0) 189 1.1 riastrad #define BB2_END_ADDR_MASK (~0x7) 190 1.1 riastrad 191 1.1 riastrad #define I810REG_HWSTAM 0x02098 192 1.1 riastrad #define I810REG_INT_IDENTITY_R 0x020a4 193 1.1 riastrad #define I810REG_INT_MASK_R 0x020a8 194 1.1 riastrad #define I810REG_INT_ENABLE_R 0x020a0 195 1.1 riastrad 196 1.1 riastrad #define LP_RING 0x2030 197 1.1 riastrad #define HP_RING 0x2040 198 1.1 riastrad #define RING_TAIL 0x00 199 1.1 riastrad #define TAIL_ADDR 0x000FFFF8 200 1.1 riastrad #define RING_HEAD 0x04 201 1.1 riastrad #define HEAD_WRAP_COUNT 0xFFE00000 202 1.1 riastrad #define HEAD_WRAP_ONE 0x00200000 203 1.1 riastrad #define HEAD_ADDR 0x001FFFFC 204 1.1 riastrad #define RING_START 0x08 205 1.1 riastrad #define START_ADDR 0x00FFFFF8 206 1.1 riastrad #define RING_LEN 0x0C 207 1.1 riastrad #define RING_NR_PAGES 0x000FF000 208 1.1 riastrad #define RING_REPORT_MASK 0x00000006 209 1.1 riastrad #define RING_REPORT_64K 0x00000002 210 1.1 riastrad #define RING_REPORT_128K 0x00000004 211 1.1 riastrad #define RING_NO_REPORT 0x00000000 212 1.1 riastrad #define RING_VALID_MASK 0x00000001 213 1.1 riastrad #define RING_VALID 0x00000001 214 1.1 riastrad #define RING_INVALID 0x00000000 215 1.1 riastrad 216 1.1 riastrad #define GFX_OP_SCISSOR ((0x3<<29)|(0x1c<<24)|(0x10<<19)) 217 1.1 riastrad #define SC_UPDATE_SCISSOR (0x1<<1) 218 1.1 riastrad #define SC_ENABLE_MASK (0x1<<0) 219 1.1 riastrad #define SC_ENABLE (0x1<<0) 220 1.1 riastrad 221 1.1 riastrad #define GFX_OP_SCISSOR_INFO ((0x3<<29)|(0x1d<<24)|(0x81<<16)|(0x1)) 222 1.1 riastrad #define SCI_YMIN_MASK (0xffff<<16) 223 1.1 riastrad #define SCI_XMIN_MASK (0xffff<<0) 224 1.1 riastrad #define SCI_YMAX_MASK (0xffff<<16) 225 1.1 riastrad #define SCI_XMAX_MASK (0xffff<<0) 226 1.1 riastrad 227 1.1 riastrad #define GFX_OP_COLOR_FACTOR ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0) 228 1.1 riastrad #define GFX_OP_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16)) 229 1.1 riastrad #define GFX_OP_MAP_INFO ((0x3<<29)|(0x1d<<24)|0x2) 230 1.1 riastrad #define GFX_OP_DESTBUFFER_VARS ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0) 231 1.1 riastrad #define GFX_OP_DRAWRECT_INFO ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3)) 232 1.1 riastrad #define GFX_OP_PRIMITIVE ((0x3<<29)|(0x1f<<24)) 233 1.1 riastrad 234 1.1 riastrad #define CMD_OP_Z_BUFFER_INFO ((0x0<<29)|(0x16<<23)) 235 1.1 riastrad #define CMD_OP_DESTBUFFER_INFO ((0x0<<29)|(0x15<<23)) 236 1.1 riastrad #define CMD_OP_FRONTBUFFER_INFO ((0x0<<29)|(0x14<<23)) 237 1.1 riastrad #define CMD_OP_WAIT_FOR_EVENT ((0x0<<29)|(0x03<<23)) 238 1.1 riastrad 239 1.1 riastrad #define BR00_BITBLT_CLIENT 0x40000000 240 1.1 riastrad #define BR00_OP_COLOR_BLT 0x10000000 241 1.1 riastrad #define BR00_OP_SRC_COPY_BLT 0x10C00000 242 1.1 riastrad #define BR13_SOLID_PATTERN 0x80000000 243 1.1 riastrad 244 1.1 riastrad #define WAIT_FOR_PLANE_A_SCANLINES (1<<1) 245 1.1 riastrad #define WAIT_FOR_PLANE_A_FLIP (1<<2) 246 1.1 riastrad #define WAIT_FOR_VBLANK (1<<3) 247 1.1 riastrad 248 1.1 riastrad #endif 249