Subversion Repositories Kolibri OS

Rev

Rev 879 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
808 serge 1
 
868 serge 2
812 serge 3
 
808 serge 4
5
 
6
#	define RADEON_BUS_MASTER_DIS		(1 << 6)
7
8
 
9
 
10
#define RADEON_SCRATCH_ADDR		0x0774
11
12
 
13
#define RADEON_CP_ME_RAM_RADDR		0x07d8
14
#define RADEON_CP_ME_RAM_DATAH		0x07dc
15
#define RADEON_CP_ME_RAM_DATAL		0x07e0
16
17
 
18
#define RADEON_PCIGART_TRANSLATE_EN      (1 << 0)
19
20
 
21
 
22
#define RADEON_CP_RB_CNTL		0x0704
23
#	define RADEON_BUF_SWAP_32BIT		(2 << 16)
24
#	define RADEON_RB_NO_UPDATE		(1 << 27)
25
#define RADEON_CP_RB_RPTR_ADDR		0x070c
26
#define RADEON_CP_RB_RPTR		0x0710
27
#define RADEON_CP_RB_WPTR		0x0714
28
29
 
30
#	define RADEON_PRE_WRITE_TIMER_SHIFT	0
31
#	define RADEON_PRE_WRITE_LIMIT_SHIFT	23
32
33
 
34
35
 
36
#	define RADEON_CSQ_CNT_PRIMARY_MASK	(0xff << 0)
37
#	define RADEON_CSQ_PRIDIS_INDDIS		(0 << 28)
38
#	define RADEON_CSQ_PRIPIO_INDDIS		(1 << 28)
39
#	define RADEON_CSQ_PRIBM_INDDIS		(2 << 28)
40
#	define RADEON_CSQ_PRIPIO_INDBM		(3 << 28)
41
#	define RADEON_CSQ_PRIBM_INDBM		(4 << 28)
42
#	define RADEON_CSQ_PRIPIO_INDPIO		(15 << 28)
43
44
 
45
#	define RADEON_ISYNC_ANY2D_IDLE3D	(1 << 0)
46
#	define RADEON_ISYNC_ANY3D_IDLE2D	(1 << 1)
47
#	define RADEON_ISYNC_TRIG2D_IDLE3D	(1 << 2)
48
#	define RADEON_ISYNC_TRIG3D_IDLE2D	(1 << 3)
49
#	define RADEON_ISYNC_WAIT_IDLEGUI	(1 << 4)
50
#	define RADEON_ISYNC_CPSCRATCH_IDLEGUI	(1 << 5)
51
52
 
53
54
 
55
56
 
813 serge 57
58
 
59
#       define RADEON_PLL_WR_EN             (1 << 7)
60
#       define RADEON_PLL_DIV_SEL           (3 << 8)
61
#       define RADEON_PLL2_DIV_SEL_MASK     ~(3 << 8)
62
63
 
64
#       define RADEON_FORCEON_MCLKA         (1 << 16)
65
#       define RADEON_FORCEON_MCLKB         (1 << 17)
66
#       define RADEON_FORCEON_YCLKA         (1 << 18)
67
#       define RADEON_FORCEON_YCLKB         (1 << 19)
68
#       define RADEON_FORCEON_MC            (1 << 20)
69
#       define RADEON_FORCEON_AIC           (1 << 21)
70
#       define R300_DISABLE_MC_MCLKA        (1 << 21)
71
#       define R300_DISABLE_MC_MCLKB        (1 << 21)
72
73
 
74
 
75
{
76
77
 
78
     * revisions of the R300.  This workaround should be called after every
79
     * CLOCK_CNTL_INDEX register access.  If not, register reads afterward
80
     * may not be correct.
81
     */
82
    if (rhd.ChipFamily <= CHIP_FAMILY_RV380)
881 serge 83
    {
813 serge 84
        u32_t save, tmp;
85
86
 
87
	tmp = save & ~(0x3f | RADEON_PLL_WR_EN);
88
	OUTREG(RADEON_CLOCK_CNTL_INDEX, tmp);
89
	tmp = INREG(RADEON_CLOCK_CNTL_DATA);
90
	OUTREG(RADEON_CLOCK_CNTL_INDEX, save);
91
    }
92
}
93
94
 
95
 
96
u32_t RADEONINPLL(int addr)
97
{
98
    u32_t       data;
99
100
 
101
    //RADEONPllErrataAfterIndex();
102
    data = INREG(RADEON_CLOCK_CNTL_DATA);
103
    RADEONPllErrataAfterData();
104
105
 
106
};
107
108
 
109
void RADEONOUTPLL(int addr, u32_t data)
110
{
111
    OUTREG8(RADEON_CLOCK_CNTL_INDEX, (((addr) & 0x3f) |
112
				      RADEON_PLL_WR_EN));
113
//    RADEONPllErrataAfterIndex(info);
114
    OUTREG(RADEON_CLOCK_CNTL_DATA, data);
115
    RADEONPllErrataAfterData();
116
}
117
118
 
119
 
120
 
808 serge 121
R5xxFIFOWaitLocal(u32_t required)             //R100-R500
877 serge 122
{
808 serge 123
  int i;
124
125
 
126
    if (required <= (INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK))
127
	    return TRUE;
128
129
 
130
         (unsigned int) INREG(R5XX_RBBM_STATUS));
131
  return FALSE;
132
}
133
134
 
135
 * Flush all dirty data in the Pixel Cache to memory.
136
 */
137
138
 
139
R5xx2DFlush()
140
{
141
    int i;
142
143
 
144
                R5XX_DSTCACHE_FLUSH_ALL, R5XX_DSTCACHE_FLUSH_ALL);
145
146
 
147
      if (!(INREG(R5XX_DSTCACHE_CTLSTAT) & R5XX_DSTCACHE_BUSY))
148
        return TRUE;
149
150
 
151
         (unsigned int)INREG(R5XX_DSTCACHE_CTLSTAT));
152
    return FALSE;
153
}
154
155
 
156
R5xx2DIdleLocal()                                //R100-R500
157
{
158
    int i;
159
160
 
161
    for (i = 0; i < R5XX_LOOP_COUNT; i++)
162
      if (64 == (INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK))
163
        break;
164
165
 
166
      dbgprintf("%s: FIFO Timeout 0x%08X.\n", __func__,INREG(R5XX_RBBM_STATUS));
167
      return FALSE;
168
    }
169
170
 
171
    for (i = 0; i < R5XX_LOOP_COUNT; i++) {
172
      if (!(INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_ACTIVE)) {
173
        R5xx2DFlush();
174
        return TRUE;
175
      }
176
    }
177
    dbgprintf("%s: Idle Timeout 0x%08X.\n", __func__,INREG(R5XX_RBBM_STATUS));
178
    return FALSE;
179
180
 
181
182
 
183
R5xx2DReset()
184
{
185
    u32_t save, tmp;
877 serge 186
    u32_t       clock_cntl_index;
813 serge 187
    u32_t       mclk_cntl;
188
808 serge 189
 
190
       * an R300 after the command processor got stuck. */
191
    save = INREG(R5XX_RBBM_SOFT_RESET);
192
    tmp = save | R5XX_SOFT_RESET_CP |
193
      R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_SE |
194
      R5XX_SOFT_RESET_RE | R5XX_SOFT_RESET_PP |
195
      R5XX_SOFT_RESET_E2 | R5XX_SOFT_RESET_RB;
196
    OUTREG(R5XX_RBBM_SOFT_RESET, tmp);
197
198
 
199
    tmp &= ~(R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI |
200
         R5XX_SOFT_RESET_SE | R5XX_SOFT_RESET_RE |
201
         R5XX_SOFT_RESET_PP | R5XX_SOFT_RESET_E2 |
202
         R5XX_SOFT_RESET_RB);
203
    OUTREG(R5XX_RBBM_SOFT_RESET, tmp);
204
205
 
206
    OUTREG(R5XX_RBBM_SOFT_RESET, save);
207
    INREG(R5XX_RBBM_SOFT_RESET);
208
209
 
210
211
 
813 serge 212
    clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX);
213
    RADEONPllErrataAfterIndex(info);
214
215
 
216
217
 
218
			      RADEON_FORCEON_MCLKA |
219
			      RADEON_FORCEON_MCLKB |
220
			      RADEON_FORCEON_YCLKA |
221
			      RADEON_FORCEON_YCLKB |
222
			      RADEON_FORCEON_MC |
223
			      RADEON_FORCEON_AIC));
224
#endif
225
226
 
808 serge 227
       * unexpected behaviour on some machines.  Here we use
228
       * R5XX_HOST_PATH_CNTL to reset it. */
229
    save = INREG(R5XX_HOST_PATH_CNTL);
230
231
 
232
    tmp |= R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2;
233
    OUTREG(R5XX_RBBM_SOFT_RESET, tmp);
234
235
 
236
    OUTREG(R5XX_RBBM_SOFT_RESET, 0);
237
238
 
239
	       R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE,
240
	       R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE);
241
242
 
243
    INREG(R5XX_HOST_PATH_CNTL);
244
    OUTREG(R5XX_HOST_PATH_CNTL, save);
245
813 serge 246
 
247
    OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index);
248
    RADEONPllErrataAfterIndex(info);
249
    RADEONOUTPLL(RADEON_MCLK_CNTL, mclk_cntl);
250
#endif
251
}
808 serge 252
253
 
254
R5xx2DSetup()
255
{
256
257
 
258
     * set them appropriately before any accel ops, but let's avoid
259
     * random bogus DMA in case we inadvertently trigger the engine
260
     * in the wrong place (happened). */
261
    R5xxFIFOWaitLocal(2);
262
    OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset);
263
    OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset);
264
265
 
266
    MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
267
268
 
269
270
 
271
    OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT,
272
           R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX);
273
    R5xxFIFOWaitLocal(1);
274
    OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control |
275
           R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR);
276
277
 
278
    OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF);
279
    OUTREG(R5XX_DP_BRUSH_BKGD_CLR, 0x00000000);
280
    OUTREG(R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF);
281
    OUTREG(R5XX_DP_SRC_BKGD_CLR, 0x00000000);
282
    OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
283
284
 
285
}
286
287
 
877 serge 288
{
808 serge 289
    if (!R5xxFIFOWaitLocal(required)) {
290
      R5xx2DReset();
291
      R5xx2DSetup();
292
    }
293
}
294
295
 
296
{
297
    if (!R5xx2DIdleLocal()) {
298
      R5xx2DReset();
299
      R5xx2DSetup();
300
    }
301
}
302
303
 
304
{
305
  u32_t ifl;
877 serge 306
  int i;
808 serge 307
308
 
309
310
 
812 serge 311
312
 
808 serge 313
812 serge 314
 
881 serge 315
  {
808 serge 316
    case CHIP_FAMILY_R300:
881 serge 317
    case CHIP_FAMILY_R350:
318
    case CHIP_FAMILY_RV350:
319
      dbgprintf("Loading R300 microcode\n");
812 serge 320
      for (i = 0; i < 256; i++)
321
      {
322
        OUTREG(RADEON_CP_ME_RAM_DATAH, R300_cp_microcode[i][1]);
323
        OUTREG(RADEON_CP_ME_RAM_DATAL, R300_cp_microcode[i][0]);
324
      }
325
      break;
326
/*
881 serge 327
    case RHD_RV505:
812 serge 328
    case RHD_RV515:
329
    case RHD_RV516:
330
    case RHD_R520:
331
    case RHD_RV530:
332
    case RHD_RV535:
333
    case RHD_RV550:
334
    case RHD_RV560:
335
    case RHD_RV570:
336
    case RHD_R580:
337
      dbgprintf("Loading R500 microcode\n");
338
      for (i = 0; i < 256; i++)
339
      {
340
        OUTREG(RADEON_CP_ME_RAM_DATAH, R520_cp_microcode[i][1]);
341
        OUTREG(RADEON_CP_ME_RAM_DATAL, R520_cp_microcode[i][0]);
342
      }
343
*/
881 serge 344
  }
808 serge 345
  safe_sti(ifl);
346
};
347
348
 
349
 
350
{
351
    u32_t base;
877 serge 352
    int screensize;
878 serge 353
    int screenpitch;
354
808 serge 355
 
878 serge 356
    screenpitch = GetScreenPitch();
357
808 serge 358
 
878 serge 359
    rhd.displayHeight = screensize & 0xFFFF;
360
361
 
808 serge 362
    rhd.__ymin = 0;
363
    rhd.__xmax = rhd.displayWidth  - 1;
364
    rhd.__ymax = rhd.displayHeight - 1;
365
366
 
367
    clip.ymin = 0;
368
    clip.xmax = rhd.displayWidth  - 1;
369
    clip.ymax = rhd.displayHeight - 1;
370
371
 
372
    dbgprintf("height %d \n", rhd.displayHeight);
373
374
 
375
                       R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_DST_PITCH_OFFSET_CNTL;
376
377
 
378
379
 
380
    rhd.dst_pitch_offset = ((screenpitch / 64) << 22) | (rhd.fbLocation >> 10);
881 serge 381
808 serge 382
 
383
384
 
815 serge 385
 
386
    scr_pixmap.height = rhd.displayHeight;
387
    scr_pixmap.format = PICT_a8r8g8b8;
388
    scr_pixmap.pitch  = screenpitch;
878 serge 389
    scr_pixmap.local  = (void*)rhd.fbLocation;
881 serge 390
    scr_pixmap.pitch_offset =  rhd.dst_pitch_offset;
815 serge 391
    scr_pixmap.mapped = (void*)0;
876 serge 392
815 serge 393
 
394
 
808 serge 395
    OUTREG (R5XX_WAIT_UNTIL, R5XX_WAIT_2D_IDLECLEAN | R5XX_WAIT_3D_IDLECLEAN);
396
    MASKREG(R5XX_DST_PIPE_CONFIG, R5XX_PIPE_AUTO_CONFIG, R5XX_PIPE_AUTO_CONFIG);
397
    MASKREG(R5XX_RB2D_DSTCACHE_MODE,
398
            R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE,
399
            R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE);
400
401
 
402
 
403
    R5xx2DSetup();
404
405
 
406
407
 
868 serge 408
808 serge 409
 
879 serge 410
 //   dbgprintf("create cp ring buffer %x\n", rhd.ring_base);
411
 //   base = GetPgAddr(rhd.ring_base);
412
808 serge 413
 
879 serge 414
 //   dbgprintf("ring base %x\n", base);
415
808 serge 416
 
879 serge 417
808 serge 418
 
879 serge 419
 //   OUTREG(RADEON_CP_RB_WPTR,rhd.ring_rp);
420
808 serge 421
 
879 serge 422
808 serge 423
 
879 serge 424
 //   OUTREG(RADEON_SCRATCH_UMSK, 0);          // no scratch update
425
808 serge 426
 
879 serge 427
808 serge 428
 
879 serge 429
808 serge 430
 
879 serge 431
 //                             RADEON_ISYNC_ANY3D_IDLE2D |
432
 //                             RADEON_ISYNC_WAIT_IDLEGUI |
433
 //                             RADEON_ISYNC_CPSCRATCH_IDLEGUI);
434
808 serge 435
 
879 serge 436
808 serge 437
 
438