1 /*        $NetBSD: summitreg.h,v 1.16 2025/01/29 15:35:22 macallan Exp $        */
2 
3 /*
4  * Copyright (c) 2024 Michael Lorenz
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  * THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /* HP Visualize FX 4 and related hardware, aka Summit */
30 
31 /*
32  * register values, found by disassembling the ROM
33  * some found by Sven Schnelle
34  * ( see https://patchwork.kernel.org/project/linux-parisc/patch/20211031204952.25678-2-svens@stackframe.org/ )
35  * some by me
36  */
37 
38 #ifndef SUMMITREG_H
39 #define SUMMITREG_H
40 
41 #define VISFX_CONTROL                   0x641000
42           #define CONTROL_WFC 0x00000200          // FIFO when 0, direct when 1
43 #define VISFX_FC              0x641040  // Fault Control
44 #define VISFX_STATUS                    0x641400  // zero when idle
45 /*
46  * about the FIFO register:
47  * - on FX4, there are 0x800 FIFO slots, quite a lot
48  * - based on observation, every register write seems to occupy *two* slots
49  * - we need to write 0 to VISFX_CONTROL to enable FIFO pacing
50  * - the FIFO is quite difficult to overrun but things like x11perf copywinwin
51  *   will do it if we're not careful
52  */
53 #define VISFX_FIFO            0x641440
54 #define VISFX_FOE             0x920404  // Fragment Operation Enable
55           #define FOE_TEXTURE 0x00000001
56           #define FOE_SPECULAR          0x00000002
57           #define FOE_DEPTHCUE          0x00000004
58           #define FOE_ALPHATEST         0x00000008
59           #define FOE_STENCIL 0x00000010
60           #define FOE_Z_TEST  0x00000020
61           #define FOE_BLEND_ROP         0x00000040          // IBO is used
62           #define FOE_DITHER  0x00000080
63 #define VISFX_IBO             0x921110  // ROP in lowest nibble
64 #define VISFX_CBR             0x92111c  // constant colour for blending
65 #define VISFX_IAA0            0x921200  // XLUT, 16 entries
66 #define VISFX_IAA(n)                    (0x921200 + ((n) << 2))
67 #define VISFX_OTR             0x921148  // overlay transparency
68 
69 #define VISFX_VRAM_WRITE_MODE 0xa00808
70 #define VISFX_VRAM_READ_MODE  0xa0080c
71 #define VISFX_PIXEL_MASK      0xa0082c
72 #define VISFX_FG_COLOUR                 0xa0083c
73 #define VISFX_BG_COLOUR                 0xa00844
74 #define VISFX_PLANE_MASK      0xa0084c
75 /* this controls what we see in the FB aperture */
76 #define VISFX_APERTURE_ACCESS 0xa00858
77           #define VISFX_DEPTH_8         0x30
78           #define VISFX_DEPTH_32        0x50
79 #define VISFX_RPH             0xa0085c  // read prefetch hint
80           #define VISFX_RPH_RTL         0x80000000          // right-to-left
81           #define VISFX_RPH_LTR         0x00000000          // left-to-right
82 
83 #define VISFX_READ_DATA                 0xa41480
84 
85 #define VISFX_VRAM_WRITE_DATA_INCRX     0xa60000
86 #define VISFX_VRAM_WRITE_DATA_INCRY     0xa68000
87 #define VISFX_VRAM_WRITE_DEST           0xac1000
88 #define VISFX_TCR                       0xac1024  /* throttle control */
89 #define VISFX_CLIP_TL                   0xac1050  /* clipping rect, top/left */
90 #define VISFX_CLIP_WH                   0xac1054  /* clipping rect, w/h */
91 
92 #define VISFX_WRITE_MODE_PLAIN          0x02000000
93 #define VISFX_WRITE_MODE_EXPAND         0x050004c0
94 #define VISFX_WRITE_MODE_FILL 0x050008c0
95 #define VISFX_WRITE_MODE_TRANSPARENT    0x00000800          /* bg is tansparent */
96 #define VISFX_WRITE_MODE_MASK           0x00000400          /* apply pixel mask */
97 /* 0x00000200 - some pattern */
98 /* looks like 0x000000c0 enables fb/bg colours to be applied */
99 
100 #define VISFX_READ_MODE_COPY  0x02000400
101 
102 #define OTC01       0x00000000          /* one pixel per 32bit write */
103 #define OTC04       0x02000000          /* 4 pixels per 32bit write */
104 #define OTC32       0x05000000          /* 32 pixels per 32bit write */
105 #define BIN8I       0x00000000          /* 8bit indexed */
106 #define BIN12I      0x00010000          /* 12bit indexed */
107 #define BIN332F     0x00040000          /* R3G3B2 */
108 #define BIN8F       0x00070000          /* ARGB8 */
109 #define BINapln     0x00110000          /* attribute plane */
110 #define BINhost     0x00300000          /* DMA to host */
111 #define BUFovl      0x00000000          /* 8bit overlay */
112 #define BUFBL       0x00008000          /* back/left */
113 #define BUFFL       0x00004000          /* front/left */
114 #define BUFBR       0x00002000          /* back/right */
115 #define BUFFR       0x00001000          /* front/right */
116 
117 /* attribute table, this only selects depth and CFS */
118 #define IAA_8I                0x00000000          /* 8bit CI */
119 #define IAA_8F                0x00000070          /* RGB8 */
120 #define IAA_CFS0    0x00000000          /* CFS select */
121 #define IAA_CFS1    0x00000100          /* CFS 1 etc. */
122 
123 #define OTR_T       0x00010000          /* when set 0 is transparent, otherwise 0xff */
124 #define OTR_A       0x00000100          /* always transparent */
125 #define OTR_L1      0x00000002          /* transparency controlled by CFS17 */
126 #define OTR_L0      0x00000001          /* transparency controlled by CFS16 */
127 
128 /*
129  * for STI colour change mode:
130  * set VISFX_FG_COLOUR, VISFX_BG_COLOUR
131  * set VISFX_VRAM_READ_MODE 0x05000400
132  * set VISFX_VRAM_WRITE_MODE 0x050000c0
133  */
134 
135 /* fill */
136 #define VISFX_START           0xb3c000
137 #define VISFX_SIZE            0xb3c808  /* start, FX4 uses 0xb3c908 */
138 
139 /* copy */
140 #define VISFX_COPY_SRC                  0xb3c010
141 #define VISFX_COPY_WH                   0xb3c008
142 #define VISFX_COPY_DST                  0xb3cc00
143 /*
144  * looks like ORing 0x800 to the register address starts a command
145  * - 0x800 - fill
146  * - 0xc00 - copy
147  * 0x100 and 0x200 seem to have functions as well, not sure what though
148  * for example, the FX4 ROM uses 0xb3c908 to start a rectangle fill, but
149  * it also works with 0xb3c808 and 0xb3ca08
150  * same with copy, 0xc00 seems to be what matters, setting 0x100 or 0x200
151  * doesn't seem to make a difference
152  * 0x400 or 0x100 by themselves don't start a command either
153  */
154 
155 /*
156  * alpha blending operations
157  * source and destination blend functions are in 0xf0 and 0x0f
158  * how they're combined is in 0x700
159  */
160 #define IBO_ROP               0         /* ROP in lower 4 bit */
161 #define IBO_ADD               0x200
162 #define IBO_S_MINUS_D         0x400     /* source - dest */
163 #define IBO_D_MINUS_S         0x500     /* dest - source */
164 #define IBO_MIN               0x600
165 #define IBO_MAX               0x700
166 
167 /*
168  * here are the blend functions I identified
169  * apparently the upper byte in 32bit mode is not implemented on FX2/4/6, and
170  * neither is any blend mode that takes the colour value from CBR
171  * so no blending with screen-to-screen blits, alpha will always read zero
172  * the only ways to actually use alpha blending is with fills ( the alpha part
173  * of the FG register is used ) and BINC writes, or when using constant alpha
174  */
175 #define IBO_ZERO              0
176 #define IBO_ONE                         1
177 #define IBO_SRC                         4         /* src alpha */
178 #define IBO_ONE_MINUS_SRC     5         /* 1 - src alpha */
179 #define IBO_CBR                         14        /* alpha from CBR */
180 #define IBO_ONE_MINUS_CBR     15        /* 1 - alpha from CBR */
181 
182 #define SRC(n) ((n) << 4)
183 #define DST(n) (n)
184 /*
185  * use unbuffered space for cursor registers
186  * The _POS, _INDEX and _DATA registers work exactly like on HCRX
187  */
188 
189 #define VISFX_CURSOR_POS      0x400000
190 #define VISFX_CURSOR_ENABLE   0x80000000
191 #define VISFX_CURSOR_INDEX    0x400004
192 #define VISFX_CURSOR_DATA     0x400008
193 #define VISFX_CURSOR_FG                 0x40000c
194 #define VISFX_CURSOR_BG                 0x400010
195 #define VISFX_COLOR_MASK      0x800018
196 #define VISFX_COLOR_INDEX     0x800020
197 #define VISFX_COLOR_VALUE     0x800024
198 #define VISFX_FATTR           0x80003c  /* force attribute */
199 #define VISFX_MPC             0x80004c
200           #define MPC_VIDEO_ON          0x0c
201           #define MPC_VSYNC_OFF         0x02
202           #define MPC_HSYNC_OFF         0x01
203 #define VISFX_CFS0            0x800100  /* colour function select */
204 #define VISFX_CFS(n)                    (VISFX_CFS0 + ((n) << 2))
205 /* 0 ... 6 for image planes, 7 or bypass, 16 and 17 for overlay */
206 #define CFS_CR                0x80      // enable color recovery
207 #define CFS_332               0x00      // R3G3B2
208 #define CFS_8I                0x40      // 8bit indexed
209 #define CFS_8F                0x70      // ARGB8
210 #define CFS_LUT0    0x00      // use LUT 0
211 #define CFS_LUT1    0x01      // LUT 1 etc.
212 #define CFS_BYPASS  0x07      // bypass LUT
213 
214 #endif    /* SUMMITREG_H */
215