Rev 876 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
813 | serge | 1 | |
877 | serge | 2 | |
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
808 | serge | 11 | #include "rhd_regs.h" |
12 | |||
13 | |||
813 | serge | 14 | #define IS_R500_3D 1 |
15 | |||
16 | |||
868 | serge | 17 | |
813 | serge | 18 | |
808 | serge | 19 | RHD_UNKNOWN = 0, |
20 | RHD_R300, |
||
812 | serge | 21 | RHD_R350, |
22 | RHD_RV350, |
||
23 | RHD_RV370, |
||
24 | RHD_RV380, |
||
25 | /* R500 */ |
||
808 | serge | 26 | RHD_RV505, |
27 | RHD_RV515, |
||
28 | RHD_RV516, |
||
29 | RHD_R520, |
||
30 | RHD_RV530, |
||
31 | RHD_RV535, |
||
32 | RHD_RV550, |
||
33 | RHD_RV560, |
||
34 | RHD_RV570, |
||
35 | RHD_R580, |
||
36 | /* R500 Mobility */ |
||
37 | RHD_M52, |
||
38 | RHD_M54, |
||
39 | RHD_M56, |
||
40 | RHD_M58, |
||
41 | RHD_M62, |
||
42 | RHD_M64, |
||
43 | RHD_M66, |
||
44 | RHD_M68, |
||
45 | RHD_M71, |
||
46 | /* R500 integrated */ |
||
47 | RHD_RS600, |
||
48 | RHD_RS690, |
||
49 | RHD_RS740, |
||
50 | /* R600 */ |
||
51 | RHD_R600, |
||
52 | RHD_RV610, |
||
53 | RHD_RV630, |
||
54 | /* R600 Mobility */ |
||
55 | RHD_M72, |
||
56 | RHD_M74, |
||
57 | RHD_M76, |
||
58 | /* RV670 came into existence after RV6x0 and M7x */ |
||
59 | RHD_RV670, |
||
60 | RHD_R680, |
||
61 | RHD_RV620, |
||
62 | RHD_M82, |
||
63 | RHD_RV635, |
||
64 | RHD_M86, |
||
65 | RHD_RS780, |
||
812 | serge | 66 | RHD_CHIP_END |
808 | serge | 67 | }; |
68 | |||
69 | |||
70 | RHD_FAMILY_UNKNOWN = 0, |
||
71 | |||
812 | serge | 72 | |
73 | |||
74 | |||
75 | RHD_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ |
||
76 | RHD_FAMILY_RV200, |
||
77 | RHD_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ |
||
78 | RHD_FAMILY_R200, |
||
79 | RHD_FAMILY_RV250, |
||
80 | RHD_FAMILY_RS300, /* RS300/RS350 */ |
||
81 | RHD_FAMILY_RV280, |
||
82 | |||
83 | |||
84 | RHD_FAMILY_R350, |
||
85 | RHD_FAMILY_RV350, |
||
86 | RHD_FAMILY_RV380, /* RV370/RV380/M22/M24 */ |
||
87 | RHD_FAMILY_R420, /* R420/R423/M18 */ |
||
88 | RHD_FAMILY_RV410, /* RV410, M26 */ |
||
89 | RHD_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ |
||
90 | RHD_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ |
||
91 | |||
92 | |||
808 | serge | 93 | RHD_FAMILY_R520, |
94 | RHD_FAMILY_RV530, |
||
95 | RHD_FAMILY_RV560, |
||
96 | RHD_FAMILY_RV570, |
||
97 | RHD_FAMILY_R580, |
||
98 | RHD_FAMILY_RS690, |
||
99 | RHD_FAMILY_R600, |
||
100 | RHD_FAMILY_RV610, |
||
101 | RHD_FAMILY_RV630, |
||
102 | RHD_FAMILY_RV670, |
||
103 | RHD_FAMILY_RV620, |
||
104 | RHD_FAMILY_RV635, |
||
812 | serge | 105 | RHD_FAMILY_RS780 |
106 | }; |
||
808 | serge | 107 | |
108 | |||
109 | #define RHD_MMIO_BAR 2 |
||
110 | |||
111 | |||
112 | #define RHD_MEM_FB 2 |
||
113 | |||
114 | |||
115 | { |
||
116 | u32_t MMIOBase; |
||
877 | serge | 117 | u32_t MMIOMapSize; |
118 | u32_t videoRam; |
||
119 | |||
808 | serge | 120 | |
817 | serge | 121 | u32_t PhisBase; |
877 | serge | 122 | u32_t FbIntAddress; /* card internal address of FB */ |
123 | u32_t FbMapSize; |
||
124 | |||
808 | serge | 125 | |
877 | serge | 126 | u32_t FbFreeSize; |
127 | |||
808 | serge | 128 | |
129 | unsigned int FbScanoutStart; |
||
130 | unsigned int FbScanoutSize; |
||
131 | |||
132 | |||
133 | enum RHD_FAMILIES ChipFamily; |
||
812 | serge | 134 | |
135 | |||
808 | serge | 136 | |
137 | |||
138 | |||
139 | |||
877 | serge | 140 | u32_t devfn; |
141 | |||
808 | serge | 142 | |
143 | u16_t PciDeviceID; |
||
877 | serge | 144 | |
808 | serge | 145 | |
877 | serge | 146 | u16_t subdevice_id; |
147 | |||
808 | serge | 148 | |
877 | serge | 149 | u32_t ioBase[6]; |
150 | u32_t memtype[6]; |
||
151 | u32_t memsize[6]; |
||
152 | |||
808 | serge | 153 | |
154 | struct mem_block *gart_heap; |
||
155 | |||
156 | |||
877 | serge | 157 | u32_t displayHeight; |
158 | |||
808 | serge | 159 | |
877 | serge | 160 | int __ymin; |
161 | int __xmax; |
||
162 | int __ymax; |
||
163 | |||
808 | serge | 164 | |
877 | serge | 165 | u32_t dst_pitch_offset; |
166 | u32_t surface_cntl; |
||
167 | |||
808 | serge | 168 | |
877 | serge | 169 | u32_t ring_rp; |
170 | u32_t ring_wp; |
||
171 | |||
808 | serge | 172 | |
811 | serge | 173 | Bool has_tcl; |
174 | }RHD_t, *RHDPtr; |
||
808 | serge | 175 | |
176 | |||
177 | |||
178 | |||
179 | |||
815 | serge | 180 | |
876 | serge | 181 | #define R5XX_DP_BRUSH_FRGD_CLR 0x147c |
182 | #define R5XX_BRUSH_DATA0 0x1480 |
||
183 | #define R5XX_BRUSH_DATA1 0x1484 |
||
184 | |||
815 | serge | 185 | |
876 | serge | 186 | # define RADEON_GMC_DST_PITCH_OFFSET_CNTL (1 << 1) |
187 | # define RADEON_GMC_BRUSH_SOLID_COLOR (13 << 4) |
||
188 | # define RADEON_GMC_BRUSH_NONE (15 << 4) |
||
189 | # define RADEON_GMC_DST_16BPP (4 << 8) |
||
190 | # define RADEON_GMC_DST_24BPP (5 << 8) |
||
191 | # define RADEON_GMC_DST_32BPP (6 << 8) |
||
192 | # define RADEON_GMC_DST_DATATYPE_SHIFT 8 |
||
193 | # define RADEON_GMC_SRC_DATATYPE_COLOR (3 << 12) |
||
194 | # define RADEON_DP_SRC_SOURCE_MEMORY (2 << 24) |
||
195 | # define RADEON_DP_SRC_SOURCE_HOST_DATA (3 << 24) |
||
196 | # define RADEON_GMC_CLR_CMP_CNTL_DIS (1 << 28) |
||
197 | # define RADEON_GMC_WR_MSK_DIS (1 << 30) |
||
198 | # define RADEON_ROP3_S 0x00cc0000 |
||
199 | # define RADEON_ROP3_P 0x00f00000 |
||
200 | |||
815 | serge | 201 | |
876 | serge | 202 | #define RADEON_CP_PACKET1 0x40000000 |
203 | #define RADEON_CP_PACKET2 0x80000000 |
||
204 | #define RADEON_CP_PACKET3 0xC0000000 |
||
205 | |||
206 | |||
207 | # define RADEON_CNTL_BITBLT 0x00009200 |
||
208 | # define RADEON_CNTL_TRANBLT 0x00009C00 |
||
209 | |||
210 | |||
211 | # define RADEON_CNTL_PAINT_MULTI 0x00009A00 |
||
212 | |||
213 | |||
214 | (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) |
||
215 | |||
216 | |||
217 | (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) |
||
218 | |||
219 | |||
220 | (RADEON_CP_PACKET2) |
||
221 | |||
222 | |||
223 | (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) |
||
224 | |||
225 | |||
226 | ring = rhd.ring_base; \ |
||
227 | write = rhd.ring_wp; \ |
||
228 | } while (0) |
||
229 | |||
230 | |||
231 | |||
232 | |||
233 | ring[write++] = (x); \ |
||
234 | } while (0) |
||
235 | |||
236 | |||
237 | do { \ |
||
238 | OUT_RING(CP_PACKET0(reg, 0)); \ |
||
239 | OUT_RING(val); \ |
||
240 | } while (0) |
||
241 | |||
242 | |||
243 | |||
244 | |||
245 | rhd.ring_wp = write & 0x1FFF; \ |
||
246 | /* Flush writes to ring */ \ |
||
247 | DRM_MEMORYBARRIER(); \ |
||
248 | /*GET_RING_HEAD( dev_priv ); */ \ |
||
249 | OUTREG( RADEON_CP_RB_WPTR, rhd.ring_wp); \ |
||
250 | /* read from PCI bus to ensure correct posting */ \ |
||
251 | INREG( RADEON_CP_RB_RPTR ); \ |
||
252 | } while (0) |
||
253 | |||
254 | |||
255 | |||
256 | |||
808 | serge | 257 | int token; /* id of the token */ |
258 | const char * name; /* token name */ |
||
259 | } SymTabRec, *SymTabPtr; |
||
260 | |||
261 | |||
813 | serge | 262 | |
263 | |||
264 | OUTREG8(u16_t offset, u8_t value) |
||
877 | serge | 265 | { |
813 | serge | 266 | *(volatile u8_t *)((u8_t *)(rhd.MMIOBase + offset)) = value; |
877 | serge | 267 | } |
813 | serge | 268 | |
269 | |||
270 | |||
877 | serge | 271 | { |
808 | serge | 272 | return *(volatile u32_t *)((u8_t*)(rhd.MMIOBase + offset)); |
877 | serge | 273 | } |
808 | serge | 274 | |
275 | |||
276 | |||
277 | |||
278 | OUTREG(u16_t offset, u32_t value) |
||
877 | serge | 279 | { |
808 | serge | 280 | *(volatile u32_t *)((u8_t *)(rhd.MMIOBase + offset)) = value; |
877 | serge | 281 | } |
808 | serge | 282 | |
283 | |||
877 | serge | 284 | { |
808 | serge | 285 | return *(volatile u32_t *)((u8_t*)(rhdPtr->MMIOBase + offset)); |
877 | serge | 286 | } |
808 | serge | 287 | |
288 | |||
289 | MASKREG(u16_t offset, u32_t value, u32_t mask) |
||
877 | serge | 290 | { |
808 | serge | 291 | u32_t tmp; |
877 | serge | 292 | |
808 | serge | 293 | |
294 | tmp &= ~mask; |
||
295 | tmp |= (value & mask); |
||
296 | OUTREG(offset, tmp); |
||
297 | }; |
||
298 | |||
299 | |||
300 | _RHDRegWrite(RHDPtr rhdPtr, u16_t offset, u32_t value) |
||
877 | serge | 301 | { |
808 | serge | 302 | *(volatile u32_t *)((u8_t *)(rhdPtr->MMIOBase + offset)) = value; |
877 | serge | 303 | } |
808 | serge | 304 | |
305 | |||
306 | _RHDRegMask(RHDPtr rhdPtr, u16_t offset, u32_t value, u32_t mask) |
||
877 | serge | 307 | { |
808 | serge | 308 | u32_t tmp; |
877 | serge | 309 | |
808 | serge | 310 | |
311 | tmp &= ~mask; |
||
312 | tmp |= (value & mask); |
||
313 | _RHDRegWrite(rhdPtr, offset, tmp); |
||
314 | }; |
||
315 | |||
316 | |||
317 | |||
318 | |||
319 | #define RHDRegWrite(ptr, offset, value) _RHDRegWrite((ptr)->rhdPtr, (offset), (value)) |
||
320 | #define RHDRegMask(ptr, offset, value, mask) _RHDRegMask((ptr)->rhdPtr, (offset), (value), (mask)) |
||
321 | |||
322 | |||
323 | |||
324 | |||
325 | |||
326 | int rhdInitHeap(RHDPtr rhdPtr); |
||
327 | |||
328 | |||
329 | |||
330 | |||
331 | // #define DBG(x) |
||
332 | |||
333 | |||
334 | typedef struct s_cursor |
||
335 | { |
||
336 | u32_t magic; // 'CURS' |
||
877 | serge | 337 | void (*destroy)(struct s_cursor*); // destructor |
808 | serge | 338 | u32_t fd; // next object in list |
877 | serge | 339 | u32_t bk; // prev object in list |
340 | u32_t pid; // owner id |
||
341 | |||
808 | serge | 342 | |
343 | u32_t hot_x; // hotspot coords |
||
877 | serge | 344 | u32_t hot_y; |
345 | }cursor_t; |
||
808 | serge | 346 | #pragma pack (pop) |
347 | |||
348 | |||
349 | #define LOAD_FROM_MEM 1 |
||
350 | #define LOAD_INDIRECT 2 |
||
351 | |||
352 | |||
877 | serge | 353 | void __stdcall copy_cursor(void *img, void *src); |
808 | serge | 354 | void destroy_cursor(cursor_t *cursor); |
355 | void __destroy_cursor(cursor_t *cursor); // wrap |
||
356 | |||
357 | |||
358 | void __stdcall r500_SetCursor(cursor_t *cursor, int x, int y); |
||
359 | void __stdcall r500_CursorRestore(int x, int y); |
||
360 | |||
361 | |||
362 | |||
813 | serge | 363 | |
364 | |||
365 | u32_t x ; |
||
366 | u32_t y ; |
||
367 | } xPointFixed; |
||
368 | |||
369 | |||
370 | |||
371 | |||
372 | |||
373 | |||
374 | |||
375 | |||
376 | #define IntToxFixed(i) ((xFixed) (i) << XFIXED_BITS) |
||
377 | |||
378 | |||
379 | |||
380 | |||
381 | ((type) << 16) | \ |
||
382 | ((a) << 12) | \ |
||
383 | ((r) << 8) | \ |
||
384 | ((g) << 4) | \ |
||
385 | ((b))) |
||
386 | |||
387 | |||
388 | #define PICT_FORMAT_RGB(f) (((f) ) & 0xfff) |
||
389 | |||
390 | |||
391 | #define PICT_TYPE_A 1 |
||
392 | #define PICT_TYPE_ARGB 2 |
||
393 | #define PICT_TYPE_ABGR 3 |
||
394 | #define PICT_TYPE_COLOR 4 |
||
395 | #define PICT_TYPE_GRAY 5 |
||
396 | |||
397 | |||
398 | PICT_a8r8g8b8 = PICT_FORMAT(32,PICT_TYPE_ARGB,8,8,8,8), |
||
399 | PICT_x8r8g8b8 = PICT_FORMAT(32,PICT_TYPE_ARGB,0,8,8,8), |
||
400 | PICT_a8b8g8r8 = PICT_FORMAT(32,PICT_TYPE_ABGR,8,8,8,8), |
||
401 | PICT_x8b8g8r8 = PICT_FORMAT(32,PICT_TYPE_ABGR,0,8,8,8), |
||
402 | |||
403 | |||
404 | PICT_r8g8b8 = PICT_FORMAT(24,PICT_TYPE_ARGB,0,8,8,8), |
||
405 | PICT_b8g8r8 = PICT_FORMAT(24,PICT_TYPE_ABGR,0,8,8,8), |
||
406 | |||
407 | |||
408 | PICT_r5g6b5 = PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,6,5), |
||
409 | PICT_b5g6r5 = PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,6,5), |
||
410 | |||
411 | |||
412 | PICT_x1r5g5b5 = PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,5,5), |
||
413 | PICT_a1b5g5r5 = PICT_FORMAT(16,PICT_TYPE_ABGR,1,5,5,5), |
||
414 | PICT_x1b5g5r5 = PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,5,5), |
||
415 | PICT_a4r4g4b4 = PICT_FORMAT(16,PICT_TYPE_ARGB,4,4,4,4), |
||
416 | PICT_x4r4g4b4 = PICT_FORMAT(16,PICT_TYPE_ARGB,0,4,4,4), |
||
417 | PICT_a4b4g4r4 = PICT_FORMAT(16,PICT_TYPE_ABGR,4,4,4,4), |
||
418 | PICT_x4b4g4r4 = PICT_FORMAT(16,PICT_TYPE_ABGR,0,4,4,4), |
||
419 | |||
420 | |||
421 | PICT_a8 = PICT_FORMAT(8,PICT_TYPE_A,8,0,0,0), |
||
422 | PICT_r3g3b2 = PICT_FORMAT(8,PICT_TYPE_ARGB,0,3,3,2), |
||
423 | PICT_b2g3r3 = PICT_FORMAT(8,PICT_TYPE_ABGR,0,3,3,2), |
||
424 | PICT_a2r2g2b2 = PICT_FORMAT(8,PICT_TYPE_ARGB,2,2,2,2), |
||
425 | PICT_a2b2g2r2 = PICT_FORMAT(8,PICT_TYPE_ABGR,2,2,2,2), |
||
426 | |||
427 | |||
428 | PICT_g8 = PICT_FORMAT(8,PICT_TYPE_GRAY,0,0,0,0), |
||
429 | |||
430 | |||
431 | |||
432 | |||
433 | PICT_x4g4 = PICT_FORMAT(8,PICT_TYPE_GRAY,0,0,0,0), |
||
434 | |||
435 | |||
436 | PICT_a4 = PICT_FORMAT(4,PICT_TYPE_A,4,0,0,0), |
||
437 | PICT_r1g2b1 = PICT_FORMAT(4,PICT_TYPE_ARGB,0,1,2,1), |
||
438 | PICT_b1g2r1 = PICT_FORMAT(4,PICT_TYPE_ABGR,0,1,2,1), |
||
439 | PICT_a1r1g1b1 = PICT_FORMAT(4,PICT_TYPE_ARGB,1,1,1,1), |
||
440 | PICT_a1b1g1r1 = PICT_FORMAT(4,PICT_TYPE_ABGR,1,1,1,1), |
||
441 | |||
442 | |||
443 | PICT_g4 = PICT_FORMAT(4,PICT_TYPE_GRAY,0,0,0,0), |
||
444 | |||
445 | |||
446 | PICT_a1 = PICT_FORMAT(1,PICT_TYPE_A,1,0,0,0), |
||
447 | |||
448 | |||
449 | } PictFormatShort; |
||
450 | |||
451 | |||
829 | serge | 452 |