1 /*        $NetBSD: stireg.h,v 1.17 2025/05/01 18:00:27 tsutsui Exp $  */
2 
3 /*        $OpenBSD: stireg.h,v 1.14 2015/04/05 23:25:57 miod Exp $    */
4 
5 /*
6  * Copyright (c) 2000 Michael Shalayeff
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
22  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28  * THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef _IC_STIREG_H_
32 #define _IC_STIREG_H_
33 
34 /* #define          STIDEBUG */
35 
36 #define   STI_REGION_MAX      8
37 #define   STI_MONITOR_MAX     256
38 #define   STI_DEVNAME_LEN     32
39 #define   STI_NCMAP 256
40 
41 /* code ROM definitions */
42 #define   STI_BEGIN 0
43 #define   STI_INIT_GRAPH      0
44 #define   STI_STATE_MGMT      1
45 #define   STI_FONT_UNPMV      2
46 #define   STI_BLOCK_MOVE      3
47 #define   STI_SELF_TEST       4
48 #define   STI_EXCEP_HDLR      5
49 #define   STI_INQ_CONF        6
50 #define   STI_SCM_ENT         7
51 #define   STI_DMA_CTRL        8
52 #define   STI_FLOW_CTRL       9
53 #define   STI_UTIMING         10
54 #define   STI_PROC_MGR        11
55 #define   STI_UTIL  12
56 #define   STI_END             13
57 #define   STI_CODECNT         16
58 
59 #define   STI_CODEBASE_MAIN   0x40
60 #define   STI_CODEBASE_ALT    0x80
61 
62 #define   STI_CODEBASE_PA               STI_CODEBASE_MAIN
63 #define   STI_CODEBASE_M68K   STI_CODEBASE_ALT
64 #define   STI_CODEBASE_PA64   STI_CODEBASE_ALT
65 
66 /* sti returns */
67 #define   STI_OK              0
68 #define   STI_FAIL  -1
69 #define   STI_NRDY  1
70 
71 /* sti errno */
72 #define   STI_NOERRNO                   0         /* no error */
73 #define   STI_BADREENTLVL               1         /* bad reentry level */
74 #define   STI_NOREGIONSDEF    2         /* region table is not setup */
75 #define   STI_ILLNPLANES                3         /* invalid num of text planes */
76 #define   STI_ILLINDEX                  4         /* invalid font index */
77 #define   STI_ILLLOC                    5         /* invalid font location */
78 #define   STI_ILLCOLOUR                 6         /* invalid colour */
79 #define   STI_ILLBLKMVFROM    7         /* invalid from in blkmv */
80 #define   STI_ILLBLKMVTO                8         /* invalid to in blkmv */
81 #define   STI_ILLBLKMVSIZE    9         /* invalid size in blkmv */
82 #define   STI_BEIUNSUPP                 10        /* bus error ints unsupported */
83 #define   STI_UNXPBE                    11        /* unexpected bus error */
84 #define   STI_UNXHWF                    12        /* unexpected hardware failure */
85 #define   STI_NEGCFG                    13        /* no ext global config struct */
86 #define   STI_NEIG            14        /* no ext init struct */
87 #define   STI_ILLSCME                   15        /* invalid set cmap entry */
88 #define   STI_ILLCMVAL                  16        /* invalid cmap value */
89 #define   STI_NORESMEM                  17        /* no requested global memory */
90 #define   STI_RESMEMCORR                18        /* reserved memory corrupted */
91 #define   STI_ILLNTBLKMV                19        /* invalid non-text blkmv */
92 #define   STI_ILLMONITOR                20        /* monitor selection is out of range */
93 #define   STI_ILLEXCADDR                21        /* invalid excpt handler addr */
94 #define   STI_ILLEXCFLAGS               22        /* invalid excpt handler flags */
95 #define   STI_NOEHE           23        /* no ext exhdl struct */
96 #define   STI_NOINQCE                   24        /* no ext inq cfg struct */
97 #define   STI_ILLRGNPTR                 25        /* invalid region pointer */
98 #define   STI_ILLUTLOP                  26        /* invalid util opcode */
99 #define   STI_UNKNOWN                   250       /* unknown error */
100 #define   STI_NOCFGPTR                  251       /* no config ptr defined */
101 #define   STI_NOFLPTR                   252       /* no flag ptr defined */
102 #define   STI_NOINPTR                   253       /* no in ptr defined */
103 #define   STI_NOOUTPTR                  254       /* no way you can get it */
104 #define   STI_NOLOCK                    255       /* kernel dishonour graphics lock */
105 
106 /* colours */
107 #define   STI_COLOUR_BLACK    0
108 #define   STI_COLOUR_WHITE    1
109 #define   STI_COLOUR_RED                2
110 #define   STI_COLOUR_YELLOW   3
111 #define   STI_COLOUR_GREEN    4
112 #define   STI_COLOUR_CYAN               5
113 #define   STI_COLOUR_BLUE               6
114 #define   STI_COLOUR_MAGENTA  7
115 
116           /* LSB high */
117 struct    sti_dd {
118           uint32_t  dd_type;  /* 0x00 device type */
119 #define   STI_DEVTYPE1        1
120 #define   STI_DEVTYPE4        3
121           uint8_t             dd_unused;
122           uint8_t             dd_nmon;  /* 0x05 number monitor rates */
123           uint8_t             dd_grrev; /* 0x06 global rom revision */
124           uint8_t             dd_lrrev; /* 0x07 local rom revision */
125           uint32_t  dd_grid[2];         /* 0x08 graphics id */
126 #define   STI_DD_CRX                    0x26D1482A          /* single-head CRX */
127 #define   STI_DD_GRX                    0x26D1488C          /* gray-scale GRX */
128 #define   STI_DD_CRX24                  0x26D148EE          /* CRX+ */
129 #define   STI_DD_382C                   0x27134C8E          /* 382 on-board mid-res */
130 #define   STI_DD_EVRX                   0x27134C9F          /* 425e on-board */
131 #define   STI_DD_3X2V                   0x27134CB4          /* 362/382 on-board VGA-res */
132 #define   STI_DD_TIMBER                 0x27F12392          /* on-board 710, older 715 */
133 #define   STI_DD_DUAL_CRX               0x27FCCB6D          /* dual-head CRX */
134 #define   STI_DD_ARTIST                 0x2B4DED6D          /* on-board 712/715, also GSC */
135 #define   STI_DD_HCRX                   0x2BCB015A
136 #define   STI_DD_EG           0x2D08C0A7          /* Visualize EG */
137 #define   STI_DD_SUMMIT                 0x2FC1066B          /* Visualize FX2, FX4, FX6 */
138 #define   STI_DD_PINNACLE               0x35ACDA16          /* Visualize FXe */
139 #define   STI_DD_LEGO                   0x35ACDA30          /* Visualize FX5, FX10 */
140 #define STI_DEV4_DD_GRID      0x08      /* offset for STI_DEVTYPE4 */
141 #define STI_DEV1_DD_GRID      0x10      /* offset for STI_DEVTYPE1 */
142           uint32_t  dd_fntaddr;         /* 0x10 font start address */
143           uint32_t  dd_maxst; /* 0x14 max state storage */
144           uint32_t  dd_romend;          /* 0x18 rom last address */
145 #define STI_DEV4_DD_ROMEND    0x18      /* offset for STI_DEVTYPE4 */
146 #define STI_DEV1_DD_ROMEND    0x50      /* offset for STI_DEVTYPE1 */
147           uint32_t  dd_reglst;          /* 0x1c device region list */
148           uint16_t  dd_maxreent;        /* 0x20 max reent storage */
149           uint16_t  dd_maxtimo;         /* 0x22 max execution timeout .1 sec */
150           uint32_t  dd_montbl;          /* 0x24 mon table address, array of
151                                                             names num of dd_nmon */
152           uint32_t  dd_udaddr;          /* 0x28 user data address */
153           uint32_t  dd_stimemreq;       /* 0x2c sti memory request */
154           uint32_t  dd_udsize;          /* 0x30 user data size */
155           uint16_t  dd_pwruse;          /* 0x34 power usage */
156           uint8_t             dd_bussup;          /* 0x36 bus support */
157 #define   STI_BUSSUPPORT_GSCINTL        0x01      /*        supports pulling INTL for int */
158 #define   STI_BUSSUPPORT_GSC15X         0x02      /*        supports GSC 1.5X */
159 #define   STI_BUSSUPPORT_GSC2X          0x04      /*        supports GSC 2.X */
160 #define   STI_BUSSUPPORT_PCIIOEIM       0x08      /*        will use directed int */
161 #define   STI_BUSSUPPORT_PCISTD         0x10      /*        will use std PCI int */
162 #define   STI_BUSSUPPORT_ILOCK          0x20      /*        supports implicit locking */
163 #define   STI_BUSSUPPORT_ROMMAP         0x40      /*        rom is only in pci erom space */
164 #define   STI_BUSSUPPORT_2DECODE        0x80      /*        single address decoder */
165           uint8_t             dd_ebussup;         /* 0x37 extended bus support */
166 #define   STI_EBUSSUPPORT_DMA 0x01      /*        supports dma */
167 #define   STI_EBUSSUPPORT_PIOLOCK       0x02      /*        no implicit locking for dma */
168           uint8_t             dd_altcodet;        /* 0x38 alternate code type */
169 #define   STI_ALTCODE_UNKNOWN 0x00
170 #define   STI_ALTCODE_PA64    0x01      /*        alt code is in pa64 */
171           uint8_t             dd_eddst[3];        /* 0x39 extended DD struct */
172           uint32_t  dd_cfbaddr;         /* 0x3c CFB address, location of
173                                                             X11 driver to be used for
174                                                             servers w/o accel */
175           uint32_t  dd_pacode[16];      /* 0x40 routines for pa-risc */
176           uint32_t  dd_altcode[16];     /* 0x80 routines for m68k/i386 */
177 } __packed;
178 
179 #define   STI_REVISION(maj, min)        (((maj) << 4) | ((min) & 0x0f))
180 
181 /* after the last region there is one indirect list ptr */
182 struct sti_region {
183           u_int     offset  :14;        /* page offset dev io space relative */
184           u_int     sys_only: 1;        /* whether allow user access */
185           u_int     cache   : 1;        /* map in cache */
186           u_int     btlb    : 1;        /* should use BTLB if available */
187           u_int     last    : 1;        /* last region in the list */
188           u_int     length  :14;        /* size in pages */
189 }  __packed;
190 
191 struct sti_font {
192           uint16_t  first;
193           uint16_t  last;
194           uint8_t             width;
195           uint8_t             height;
196           uint8_t             type;
197 #define   STI_FONT_HPROMAN8   1
198 #define   STI_FONT_KANA8                2
199           uint8_t             bpc;
200           uint32_t  next;
201           uint8_t             uheight;
202           uint8_t             uoffset;
203           uint8_t             unused[2];
204 }  __packed;
205 
206 struct sti_fontcfg {
207           uint16_t  first;
208           uint16_t  last;
209           uint8_t             width;
210           uint8_t             height;
211           uint8_t             type;
212           uint8_t             bpc;
213           uint8_t             uheight;
214           uint8_t             uoffset;
215 }  __packed;
216 
217 typedef struct sti_mon {
218           uint32_t  width: 12;
219           uint32_t  height: 12;
220           uint32_t  hz: 7;              /* low 7 bits of refresh rate */
221           uint32_t  flat: 1;  /* flatpanel */
222           uint32_t  vesa: 1;  /* vesa mode */
223           uint32_t  grey: 1;  /* greyscale */
224           uint32_t  dblbuf: 1;          /* double buffered */
225           uint32_t  user: 1;  /* user-defined mode */
226           uint32_t  stereo: 1;          /* stereo display */
227           uint32_t  sam: 1;             /* ? */
228           uint32_t  : 15;
229           uint32_t  hz_upper: 3;        /* upper 3 bits of refresh rate */
230           uint32_t  font: 8;  /* rom font index */
231 } __packed *sti_mon_t;
232 
233 typedef struct sti_ecfg {
234           uint8_t             current_monitor;
235           uint8_t             uf_boot;
236           uint16_t  power;              /* power dissipation Watts */
237           uint32_t  freq_ref;
238           uint32_t  *addr;              /* memory block of size dd_stimemreq */
239           void                *future;
240 } __packed *sti_ecfg_t;
241 
242 typedef struct sti_cfg {
243           uint32_t  text_planes;
244           uint16_t  scr_width;
245           uint16_t  scr_height;
246           uint16_t  oscr_width;
247           uint16_t  oscr_height;
248           uint16_t  fb_width;
249           uint16_t  fb_height;
250           uint32_t  regions[STI_REGION_MAX];
251           uint32_t  reent_level;
252           uint32_t  *save_addr;
253           sti_ecfg_t          ext_cfg;
254 }  __packed *sti_cfg_t;
255 
256 
257 /* routine types */
258 #define   STI_DEP(n) \
259           typedef int (*sti_##n##_t)( \
260             sti_##n##flags_t, sti_##n##in_t, sti_##n##out_t, sti_cfg_t);
261 
262 typedef struct sti_initflags {
263           uint32_t  flags;
264 #define   STI_INITF_WAIT      0x80000000
265 #define   STI_INITF_RESET     0x40000000
266 #define   STI_INITF_TEXT      0x20000000
267 #define   STI_INITF_NTEXT     0x10000000
268 #define   STI_INITF_CLEAR     0x08000000
269 #define   STI_INITF_CMB       0x04000000          /* non-text planes cmap black */
270 #define   STI_INITF_EBET      0x02000000          /* enable bus error timer */
271 #define   STI_INITF_EBETI     0x01000000          /* enable bus error timer interrupt */
272 #define   STI_INITF_PTS       0x00800000          /* preserve text settings */
273 #define   STI_INITF_PNTS      0x00400000          /* preserve non-text settings */
274 #define   STI_INITF_PBET      0x00200000          /* preserve BET settings */
275 #define   STI_INITF_PBETI     0x00100000          /* preserve BETI settings */
276 #define   STI_INITF_ICMT      0x00080000          /* init cmap for text planes */
277 #define   STI_INITF_SCMT      0x00040000          /* change current monitor type */
278 #define   STI_INITF_RIE       0x00020000          /* retain int enables */
279           void *future;
280 } __packed *sti_initflags_t;
281 
282 typedef struct sti_einitin {
283           uint8_t             mon_type;
284           uint8_t             pad;
285           uint16_t  inflight; /* possible on pci */
286           void                *future;
287 } __packed *sti_einitin_t;
288 
289 typedef struct sti_initin {
290           uint32_t  text_planes;        /* number of planes for text */
291           sti_einitin_t       ext_in;
292 } __packed *sti_initin_t;
293 
294 typedef struct sti_initout {
295           int32_t             errno;
296           uint32_t  text_planes;        /* number of planes used for text */
297           void                *future;
298 } __packed *sti_initout_t;
299 
300 STI_DEP(init);
301 
302 typedef struct sti_mgmtflags {
303           uint32_t  flags;
304 #define   STI_MGMTF_WAIT      0x80000000
305 #define   STI_MGMTF_SAVE      0x40000000
306 #define   STI_MGMTF_RALL      0x20000000          /* restore all display planes */
307           void *future;
308 } __packed *sti_mgmtflags_t;
309 
310 typedef struct sti_mgmtin {
311           void      *addr;
312           void      *future;
313 } __packed *sti_mgmtin_t;
314 
315 typedef struct sti_mgmtout {
316           int32_t             errno;
317           void                *future;
318 } __packed *sti_mgmtout_t;
319 
320 STI_DEP(mgmt);
321 
322 typedef struct sti_unpmvflags {
323           uint32_t  flags;
324 #define   STI_UNPMVF_WAIT     0x80000000
325 #define   STI_UNPMVF_NTXT     0x40000000          /* intp non-text planes */
326           void                *future;
327 } __packed *sti_unpmvflags_t;
328 
329 typedef struct sti_unpmvin {
330           uint32_t  *font_addr;         /* font */
331           uint16_t  index;              /* character index in the font */
332           uint8_t             fg_colour;
333           uint8_t             bg_colour;
334           uint16_t  x, y;
335           void                *future;
336 } __packed *sti_unpmvin_t;
337 
338 typedef struct sti_unpmvout {
339           uint32_t  errno;
340           void                *future;
341 } __packed *sti_unpmvout_t;
342 
343 STI_DEP(unpmv);
344 
345 typedef struct sti_blkmvflags {
346           uint32_t  flags;
347 #define   STI_BLKMVF_WAIT     0x80000000
348 #define   STI_BLKMVF_COLR     0x40000000          /* change colour on move */
349 #define   STI_BLKMVF_CLR      0x20000000          /* clear on move */
350 #define   STI_BLKMVF_NTXT     0x10000000          /* move in non-text planes */
351           void                *future;
352 } __packed *sti_blkmvflags_t;
353 
354 typedef struct sti_blkmvin {
355           uint8_t             fg_colour;
356           uint8_t             bg_colour;
357           uint16_t  srcx, srcy, dstx, dsty;
358           uint16_t  width, height;
359           uint16_t  pad;
360           void                *future;
361 } __packed *sti_blkmvin_t;
362 
363 typedef struct sti_blkmvout {
364           uint32_t  errno;
365           void                *future;
366 } __packed *sti_blkmvout_t;
367 
368 STI_DEP(blkmv);
369 
370 typedef struct sti_testflags {
371           uint32_t  flags;
372 #define   STI_TESTF_WAIT      0x80000000
373 #define   STI_TESTF_ETST      0x40000000
374           void                *future;
375 } __packed *sti_testflags_t;
376 
377 typedef struct sti_testin {
378           void                *future;
379 } __packed *sti_testin_t;
380 
381 typedef struct sti_testout {
382           uint32_t  errno;
383           uint32_t  result;
384           void                *future;
385 } __packed *sti_testout_t;
386 
387 STI_DEP(test);
388 
389 typedef struct sti_exhdlflags {
390           uint32_t  flags;
391 #define   STI_EXHDLF_WAIT     0x80000000
392 #define   STI_EXHDLF_CINT     0x40000000          /* clear int */
393 #define   STI_EXHDLF_CBE      0x20000000          /* clear BE */
394 #define   STI_EXHDLF_PINT     0x10000000          /* preserve int */
395 #define   STI_EXHDLF_RINT     0x08000000          /* restore int */
396 #define   STI_EXHDLF_WEIM     0x04000000          /* write eim w/ sti_eexhdlin */
397 #define   STI_EXHDLF_REIM     0x02000000          /* read eim to sti_eexhdlout */
398 #define   STI_EXHDLF_GIE      0x01000000          /* global int enable */
399 #define   STI_EXHDLF_PGIE     0x00800000
400 #define   STI_EXHDLF_WIEM     0x00400000
401 #define   STI_EXHDLF_EIEM     0x00200000
402 #define   STI_EXHDLF_BIC      0x00100000          /* begin int cycle */
403 #define   STI_EXHDLF_EIC      0x00080000          /* end int cycle */
404 #define   STI_EXHDLF_RIE      0x00040000          /* reset do not clear int enables */
405           void                *future;
406 } __packed *sti_exhdlflags_t;
407 
408 typedef struct sti_eexhdlin {
409           uint32_t  eim_addr;
410           uint32_t  eim_data;
411           uint32_t  iem;                /* enable mask */
412           uint32_t  icm;                /* clear mask */
413           void                *future;
414 } __packed *sti_eexhdlin_t;
415 
416 typedef struct sti_exhdlint {
417           uint32_t  flags;
418 #define   STI_EXHDLINT_BET    0x80000000          /* bus error timer */
419 #define   STI_EXHDLINT_HW               0x40000000          /* high water */
420 #define   STI_EXHDLINT_LW               0x20000000          /* low water */
421 #define   STI_EXHDLINT_TM               0x10000000          /* texture map */
422 #define   STI_EXHDLINT_VB               0x08000000          /* vertical blank */
423 #define   STI_EXHDLINT_UDC    0x04000000          /* unbuffered dma complete */
424 #define   STI_EXHDLINT_BDC    0x02000000          /* buffered dma complete */
425 #define   STI_EXHDLINT_UDPC   0x01000000          /* unbuf priv dma complete */
426 #define   STI_EXHDLINT_BDPC   0x00800000          /* buffered priv dma complete */
427 } __packed *sti_exhdlint_t;
428 
429 typedef struct sti_exhdlin {
430           sti_exhdlint_t      addr;
431           sti_eexhdlin_t      ext;
432 } __packed *sti_exhdlin_t;
433 
434 typedef struct sti_eexhdlout {
435           uint32_t  eim_addr;
436           uint32_t  eim_data;
437           uint32_t  iem;                /* enable mask */
438           uint32_t  icm;                /* clear mask */
439           void                *future;
440 } __packed *sti_eexhdlout_t;
441 
442 typedef struct sti_exhdlout {
443           uint32_t  errno;
444           uint32_t  flags;
445 #define   STI_EXHDLO_BE       0x80000000          /* BE was intercepted */
446 #define   STI_EXHDLO_IP       0x40000000          /* there is int pending */
447 #define   STI_EXHDLO_IE       0x20000000          /* global enable set */
448           sti_eexhdlout_t     ext;
449 } __packed *sti_exhdlout_t;
450 
451 STI_DEP(exhdl);
452 
453 typedef struct sti_inqconfflags {
454           uint32_t  flags;
455 #define   STI_INQCONFF_WAIT   0x80000000
456           void                *future;
457 } __packed *sti_inqconfflags_t;
458 
459 typedef struct sti_inqconfin {
460           void      *future;
461 } __packed *sti_inqconfin_t;
462 
463 typedef struct sti_einqconfout {
464           uint32_t  crt_config[3];
465           uint32_t  crt_hw[3];
466           void                *future;
467 } __packed *sti_einqconfout_t;
468 
469 typedef struct sti_inqconfout {
470           uint32_t  errno;
471           uint16_t  width, height, owidth, oheight, fbwidth, fbheight;
472           uint32_t  bpp;      /* bits per pixel */
473           uint32_t  bppu;     /* accessible bpp */
474           uint32_t  planes;
475           uint8_t             name[STI_DEVNAME_LEN];
476           uint32_t  attributes;
477 #define   STI_INQCONF_Y2X               0x0001    /* pixel is higher than wider */
478 #define   STI_INQCONF_HWBLKMV 0x0002    /* hw blkmv is present */
479 #define   STI_INQCONF_AHW               0x0004    /* adv hw accel */
480 #define   STI_INQCONF_INT               0x0008    /* can interrupt */
481 #define   STI_INQCONF_GONOFF  0x0010    /* supports on/off */
482 #define   STI_INQCONF_AONOFF  0x0020    /* supports alpha on/off */
483 #define   STI_INQCONF_VARY    0x0040    /* variable fb height */
484 #define   STI_INQCONF_ODDBYTES          0x0080    /* use only odd fb bytes */
485 #define   STI_INQCONF_FLUSH   0x0100    /* fb cache requires flushing */
486 #define   STI_INQCONF_DMA               0x0200    /* supports dma */
487 #define   STI_INQCONF_VDMA    0x0400    /* supports vdma */
488 #define   STI_INQCONF_YUV1    0x2000    /* supports YUV type 1 */
489 #define   STI_INQCONF_YUV2    0x4000    /* supports YUV type 2 */
490 #define   STI_INQCONF_BITS \
491     "\020\001y2x\002hwblkmv\003ahw\004int\005gonoff\006aonoff\007vary"\
492     "\010oddb\011flush\012dma\013vdma\016yuv1\017yuv2"
493           sti_einqconfout_t ext;
494 } __packed *sti_inqconfout_t;
495 
496 STI_DEP(inqconf);
497 
498 typedef struct sti_scmentflags {
499           uint32_t  flags;
500 #define   STI_SCMENTF_WAIT    0x80000000
501           void                *future;
502 } __packed *sti_scmentflags_t;
503 
504 typedef struct sti_scmentin {
505           uint32_t  entry;
506           uint32_t  value;
507           void                *future;
508 } __packed *sti_scmentin_t;
509 
510 typedef struct sti_scmentout {
511           uint32_t  errno;
512           void                *future;
513 } __packed *sti_scmentout_t;
514 
515 STI_DEP(scment);
516 
517 typedef struct sti_dmacflags {
518           uint32_t  flags;
519 #define   STI_DMACF_WAIT      0x80000000
520 #define   STI_DMACF_PRIV      0x40000000          /* priv dma */
521 #define   STI_DMACF_DIS       0x20000000          /* disable */
522 #define   STI_DMACF_BUF       0x10000000          /* buffered */
523 #define   STI_DMACF_MRK       0x08000000          /* write a marker */
524 #define   STI_DMACF_ABRT      0x04000000          /* abort dma xfer */
525           void                *future;
526 } __packed *sti_dmacflags_t;
527 
528 typedef struct sti_dmacin {
529           uint32_t  pa_upper;
530           uint32_t  pa_lower;
531           uint32_t  len;
532           uint32_t  mrk_data;
533           uint32_t  mrk_off;
534           void                *future;
535 } __packed *sti_dmacin_t;
536 
537 typedef struct sti_dmacout {
538           uint32_t  errno;
539           void                *future;
540 } __packed *sti_dmacout_t;
541 
542 STI_DEP(dmac);
543 
544 typedef struct sti_flowcflags {
545           uint32_t  flags;
546 #define   STI_FLOWCF_WAIT     0x80000000
547 #define   STI_FLOWCF_CHW      0x40000000          /* check high water */
548 #define   STI_FLOWCF_WHW      0x20000000          /* write high water */
549 #define   STI_FLOWCF_WLW      0x10000000          /* write low water */
550 #define   STI_FLOWCF_PCSE     0x08000000          /* preserve cse */
551 #define   STI_FLOWCF_CSE      0x04000000
552 #define   STI_FLOWCF_CSWF     0x02000000          /* cs write fine */
553 #define   STI_FLOWCF_CSWC     0x01000000          /* cs write coarse */
554 #define   STI_FLOWCF_CSWQ     0x00800000          /* cs write fifo */
555           void                *future;
556 } __packed *sti_flowcflags_t;
557 
558 typedef struct sti_flowcin {
559           uint32_t  retry;
560           uint32_t  bufz;
561           uint32_t  hwcnt;
562           uint32_t  lwcnt;
563           uint32_t  csfv;     /* cs fine value */
564           uint32_t  cscv;     /* cs coarse value */
565           uint32_t  csqc;     /* cs fifo count */
566           void                *future;
567 } __packed *sti_flowcin_t;
568 
569 typedef struct sti_flowcout {
570           uint32_t  errno;
571           uint32_t  retry_result;
572           uint32_t  fifo_size;
573           void                *future;
574 } __packed *sti_flowcout_t;
575 
576 STI_DEP(flowc);
577 
578 typedef struct sti_utimingflags {
579           uint32_t  flags;
580 #define   STI_UTIMF_WAIT      0x80000000
581 #define   STI_UTIMF_HKS       0x40000000          /* has kbuf_size */
582           void                *future;
583 } __packed *sti_utimingflags_t;
584 
585 typedef struct sti_utimingin {
586           void                *data;
587           void                *kbuf;
588           void                *future;
589 } __packed *sti_utimingin_t;
590 
591 typedef struct sti_utimingout {
592           uint32_t  errno;
593           uint32_t  kbuf_size;          /* buffer required size */
594           void                *future;
595 } __packed *sti_utimingout_t;
596 
597 STI_DEP(utiming);
598 
599 typedef struct sti_pmgrflags {
600           uint32_t  flags;
601 #define   STI_UTIMF_WAIT      0x80000000
602 #define   STI_UTIMOP_CLEANUP  0x00000000
603 #define   STI_UTIMOP_BAC                0x10000000
604 #define   STI_UTIMF_CRIT      0x04000000
605 #define   STI_UTIMF_BUFF      0x02000000
606 #define   STI_UTIMF_IBUFF     0x01000000
607           void                *future;
608 } __packed *sti_pmgrflags_t;
609 
610 typedef struct sti_pmgrin {
611           uint32_t  reserved[4];
612           void                *future;
613 } __packed *sti_pmgrin_t;
614 
615 typedef struct sti_pmgrout {
616           int32_t             errno;
617           void                *future;
618 } __packed *sti_pmgrout_t;
619 
620 STI_DEP(pmgr);
621 
622 typedef struct sti_utilflags {
623           uint32_t  flags;
624 #define   STI_UTILF_ROOT      0x80000000          /* was called as root */
625           void                *future;
626 } __packed *sti_utilflags_t;
627 
628 typedef struct sti_utilin {
629           uint32_t  in_size;
630           uint32_t  out_size;
631           uint8_t             *buf;
632 } __packed *sti_utilin_t;
633 
634 typedef struct sti_utilout {
635           int32_t             errno;
636           void                *future;
637 } __packed *sti_utilout_t;
638 
639 STI_DEP(util);
640 
641 /*
642  * NGLE register layout.
643  * Based upon xc/programs/Xserver/hw/hp/ngle/dregs.h
644  */
645 
646 #define BA(F,C,S,A,J,B,I)                                                       \
647           (((F)<<31)|((C)<<27)|((S)<<24)|((A)<<21)|((J)<<16)|((B)<<12)|(I))
648           /* FCCC CSSS AAAJ JJJJ BBBB IIII IIII IIII */
649 
650 /* F */
651 #define       IndexedDcd      0         /* Pixel data is indexed (pseudo) color */
652 #define       FractDcd        1         /* Pixel data is Fractional 8-8-8 */
653 /* C */
654 #define       Otc04 2         /* Pixels in each longword transfer (4) */
655 #define       Otc32 5         /* Pixels in each longword transfer (32) */
656 #define       Otc24 7         /* NGLE uses this for 24bit blits */
657 /* S */
658 #define       Ots08 3         /* Each pixel is size (8)d transfer (1) */
659 #define       OtsIndirect     6         /* Each bit goes through FG/BG color(8) */
660 /* A */
661 #define       AddrByte        3         /* byte access? Used by NGLE for direct fb */
662 #define       AddrLong        5         /* FB address is Long aligned (pixel) */
663 #define     Addr24  7         /* used for colour map access */
664 /* B */
665 #define       BINapp0I        0x0       /* Application Buffer 0, Indexed */
666 #define       BINapp1I        0x1       /* Application Buffer 1, Indexed */
667 #define       BINovly         0x2       /* 8 bit overlay */
668 #define       BINcursor       0x6       /* cursor bitmap on EG */
669 #define       BINcmask        0x7       /* cursor mask on EG */
670 #define       BINapp0F8       0xa       /* Application Buffer 0, Fractional 8-8-8 */
671 #define       BINattr         0xd       /* Attribute Bitmap */
672 #define       BINcmap         0xf       /* colour map(s) */
673 /* other buffers are unknown */
674 /* J - 'BA just point' - function unknown */
675 /* I - 'BA index base' - function unknown */
676 
677 #define IBOvals(R,M,X,S,D,L,B,F)                                                \
678           (((R)<<8)|((M)<<16)|((X)<<24)|((S)<<29)|((D)<<28)|((L)<<31)|((B)<<1)|(F))
679           /* LSSD XXXX MMMM MMMM RRRR RRRR ???? ??BF */
680 
681 /* R is a standard X11 ROP, no idea if the other bits areused for anything  */
682 #define       RopClr          0x0
683 #define       RopSrc          0x3
684 #define       RopInv          0xc
685 #define       RopSet          0xf
686 /* M: 'mask addr offset' - function unknown */
687 /* X */
688 #define       BitmapExtent08  3         /* Each write hits ( 8) bits in depth */
689 #define       BitmapExtent32  5         /* Each write hits (32) bits in depth */
690 /* S: 'static reg' flag, NGLE sets it for blits, function is unknown but
691       we get occasional garbage in 8bit blits without it  */
692 /* D */
693 #define       DataDynamic         0     /* Data register reloaded by direct access */
694 /* L */
695 #define       MaskDynamic         1     /* Mask register reloaded by direct access */
696 #define       MaskOtc             0     /* Mask contains Object Count valid bits */
697 /* B = 1 -> background transparency for masked fills */
698 /* F probably the same for foreground */
699 
700 #define   NGLE_REG_1                    0x000118  /* Artist LUT blt ctrl */
701 #define   NGLE_REG_28                   0x000420  /* HCRX video bus access */
702 #define   NGLE_REG_2                    0x000480  /* BINC src */
703 #define   NGLE_REG_3                    0x0004a0  /* BINC dst */
704 #define   NGLE_REG_22                   0x0005a0  /* BINC dst mask */
705 #define   NGLE_REG_23                   0x0005c0  /* BINC data */
706 #define   NGLE_REG_4                    0x000600  /* palette data */
707 #define   NGLE_REG_5                    0x0006a0  /* cursor data */
708 #define   NGLE_REG_6                    0x000800  /* rectfill XY */
709 #define   NGLE_REG_7                    0x000804  /* bitblt size WH */
710 #define   NGLE_REG_24                   0x000808  /* bitblt src XY */
711 #define   NGLE_REG_8                    0x000820  /* 'transfer data' - this is */
712                                                             /* a pixel mask on fills */
713 #define   NGLE_REG_37                   0x000944  /* HCRX fast rect fill, size */
714 #define   NGLE_REG_9                    0x000a04  /* rect fill size, start */
715 #define   NGLE_REG_25                   0x000b00  /* bitblt dst XY, start */
716 #define   NGLE_REG_RAMDAC               0x001000
717 #define   NGLE_REG_10                   0x018000  /* buffer ctl */
718 #define   NGLE_REG_11                   0x018004  /* dest bitmap access */
719 #define   NGLE_REG_12                   0x01800c  /* control plane register */
720 #define   NGLE_REG_35                   0x018010  /* fg colour */
721 #define   NGLE_REG_36                   0x018014  /* bg colour */
722 #define   NGLE_REG_13                   0x018018  /* image planemask */
723 #define   NGLE_REG_14                   0x01801c  /* raster op */
724 #define   NGLE_REG_15                   0x200000  /* 'busy dodger' idle */
725           #define DODGER_IDLE 0x1000    /* or 0x10000, likely tpyo */
726 #define   NGLE_REG_15b0                 0x200000  /* busy register */
727 #define   NGLE_REG_16                   0x200004
728 #define   NGLE_REG_16b1                 0x200005  /* setup copyarea */
729 #define   NGLE_REG_16b3                 0x200007  /* ROM table index on CRX */
730 #define   NGLE_REG_34                   0x200008  /* # of fifo slots */
731 #define   NGLE_REG_17                   0x200100  /* cursor coordinates */
732 #define   NGLE_REG_18                   0x200104  /* cursor enable */
733 #define   NGLE_REG_26                   0x200118  /* EG LUT blt ctrl */
734 #define   NGLE_REG_19                   0x200200  /* artist sprite size */
735 #define   NGLE_REG_20                   0x200208  /* cursor geometry */
736 #define   NGLE_REG_21                   0x200218  /* Artist misc video */
737 #define   NGLE_REG_27                   0x200308  /* Artist misc ctrl */
738 #define   NGLE_REG_29                   0x210000  /* HCRX cursor coord & enable */
739           #define HCRX_ENABLE_CURSOR    0x80000000
740 #define   NGLE_REG_30                   0x210004  /* HCRX cursor address */
741 #define   NGLE_REG_31                   0x210008  /* HCRX cursor data */
742 #define   NGLE_REG_38                   0x210020  /* HCRX LUT blt ctrl */
743           /* EWRRRROO OOOOOOOO TTRRRRLL LLLLLLLL */
744           #define LBC_ENABLE  0x80000000
745           #define LBC_WAIT_BLANK        0x40000000
746           #define LBS_OFFSET_SHIFT      16
747           #define LBC_TYPE_MASK                   0xc000
748           #define LBC_TYPE_CMAP                   0
749           #define LBC_TYPE_CURSOR                 0x8000
750           #define LBC_TYPE_OVERLAY      0xc000
751           #define LBC_LENGTH_SHIFT      0
752 #define   NGLE_REG_41                   0x210024
753 #define   NGLE_REG_42                   0x210028  /* these seem to control */
754 #define   NGLE_REG_43                   0x21002c  /* how the 24bit planes */
755 #define   NGLE_REG_44                   0x210030  /* are displayed on HCRX - */
756 #define   NGLE_REG_45                   0x210034  /* no info on bits */
757 #define   NGLE_REG_32                   0x21003c  /* HCRX plane enable */
758 #define   NGLE_REG_33                   0x210040  /* HCRX misc video */
759           #define HCRX_VIDEO_ENABLE     0x0A000000
760 #define   NGLE_REG_39                   0x210120  /* HCRX 'hyperbowl' mode 2 */
761           #define HYPERBOWL_MODE2_8_24                                          15
762 #define   NGLE_REG_40                   0x210130  /* HCRX 'hyperbowl' */
763           #define HYPERBOWL_MODE_FOR_8_OVER_88_LUT0_NO_TRANSPARENCIES 4
764           #define HYPERBOWL_MODE01_8_24_LUT0_TRANSPARENT_LUT1_OPAQUE  8
765           #define HYPERBOWL_MODE01_8_24_LUT0_OPAQUE_LUT1_OPAQUE                 10
766 
767 #define   NGLE_BUFF0_CMAP0    0x00001e02
768 #define   NGLE_BUFF1_CMAP0    0x02001e02
769 #define   NGLE_BUFF1_CMAP3    0x0c001e02
770 #define   NGLE_ARTIST_CMAP0   0x00000102
771 
772 /* mimic HP/UX, this will return the device's graphics ID */
773 #define   GCID      _IOR('G', 40, u_int)
774 
775 #endif /* _IC_STIREG_H_ */
776