Subversion Repositories Kolibri OS

Rev

Rev 881 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 881 Rev 883
Line 50... Line 50...
50
#	define RADEON_ISYNC_CPSCRATCH_IDLEGUI	(1 << 5)
50
#	define RADEON_ISYNC_CPSCRATCH_IDLEGUI	(1 << 5)
51
 
51
 
Line 52... Line 52...
52
#define R5XX_LOOP_COUNT 2000000
52
#define R5XX_LOOP_COUNT 2000000
Line 53... Line -...
53
 
-
 
54
#include "microcode.h"
-
 
55
 
53
 
Line 56... Line 54...
56
#define RADEON_CLOCK_CNTL_DATA              0x000c
54
#define RADEON_CLOCK_CNTL_DATA              0x000c
57
 
55
 
58
#define RADEON_CLOCK_CNTL_INDEX             0x0008
56
#define RADEON_CLOCK_CNTL_INDEX             0x0008
Line 70... Line 68...
70
#       define R300_DISABLE_MC_MCLKA        (1 << 21)
68
#       define R300_DISABLE_MC_MCLKA        (1 << 21)
71
#       define R300_DISABLE_MC_MCLKB        (1 << 21)
69
#       define R300_DISABLE_MC_MCLKB        (1 << 21)
72
 
70
 
Line 73... Line -...
73
 
-
 
74
void RADEONPllErrataAfterData()
-
 
75
{
-
 
76
 
-
 
77
    /* This function is required to workaround a hardware bug in some (all?)
-
 
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)
-
 
83
    {
-
 
84
        u32_t save, tmp;
-
 
85
 
-
 
86
	save = INREG(RADEON_CLOCK_CNTL_INDEX);
-
 
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
/* Read PLL register */
-
 
96
u32_t RADEONINPLL(int addr)
-
 
97
{
-
 
98
    u32_t       data;
-
 
99
 
-
 
100
    OUTREG8(RADEON_CLOCK_CNTL_INDEX, addr & 0x3f);
-
 
101
    //RADEONPllErrataAfterIndex();
-
 
102
    data = INREG(RADEON_CLOCK_CNTL_DATA);
-
 
103
    RADEONPllErrataAfterData();
-
 
104
 
-
 
105
    return data;
-
 
106
};
-
 
107
 
-
 
108
/* Write PLL information */
-
 
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
static Bool
-
 
121
R5xxFIFOWaitLocal(u32_t required)             //R100-R500
-
 
122
{
-
 
123
  int i;
-
 
124
 
-
 
125
  for (i = 0; i < R5XX_LOOP_COUNT; i++)
-
 
126
    if (required <= (INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK))
-
 
Line 127... Line -...
127
	    return TRUE;
-
 
128
 
-
 
129
  dbgprintf("%s: Timeout 0x%08X.\n", __func__,
-
 
130
         (unsigned int) INREG(R5XX_RBBM_STATUS));
-
 
Line 131... Line 71...
131
  return FALSE;
71
 
132
}
72
 
133
 
73
 
Line 178... Line 118...
178
    return FALSE;
118
    return FALSE;
179
 
119
 
Line 180... Line 120...
180
}
120
}
Line 181... Line -...
181
 
-
 
182
static void
-
 
183
R5xx2DReset()
-
 
184
{
-
 
185
    u32_t save, tmp;
-
 
186
    u32_t       clock_cntl_index;
-
 
187
    u32_t       mclk_cntl;
-
 
188
 
-
 
189
      /* The following RBBM_SOFT_RESET sequence can help un-wedge
-
 
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
    INREG(R5XX_RBBM_SOFT_RESET);
-
 
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
    INREG(R5XX_RBBM_SOFT_RESET);
-
 
206
    OUTREG(R5XX_RBBM_SOFT_RESET, save);
-
 
207
    INREG(R5XX_RBBM_SOFT_RESET);
-
 
208
 
-
 
209
    R5xx2DFlush();
-
 
210
 
-
 
211
#if 0
-
 
212
    clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX);
-
 
213
    RADEONPllErrataAfterIndex(info);
-
 
214
 
-
 
215
    mclk_cntl = RADEONINPLL(RADEON_MCLK_CNTL);
-
 
216
 
-
 
217
    RADEONOUTPLL(RADEON_MCLK_CNTL, (mclk_cntl |
-
 
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
      /* Soft resetting HDP thru RBBM_SOFT_RESET register can cause some
-
 
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
    tmp = INREG(R5XX_RBBM_SOFT_RESET);
-
 
232
    tmp |= R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2;
-
 
233
    OUTREG(R5XX_RBBM_SOFT_RESET, tmp);
-
 
234
 
-
 
235
    INREG(R5XX_RBBM_SOFT_RESET);
-
 
236
    OUTREG(R5XX_RBBM_SOFT_RESET, 0);
-
 
237
 
-
 
238
    MASKREG(R5XX_RB2D_DSTCACHE_MODE,
-
 
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
    OUTREG(R5XX_HOST_PATH_CNTL, save | R5XX_HDP_SOFT_RESET);
-
 
243
    INREG(R5XX_HOST_PATH_CNTL);
-
 
244
    OUTREG(R5XX_HOST_PATH_CNTL, save);
-
 
245
 
-
 
246
#if 0
-
 
247
    OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index);
-
 
248
    RADEONPllErrataAfterIndex(info);
-
 
249
    RADEONOUTPLL(RADEON_MCLK_CNTL, mclk_cntl);
-
 
250
#endif
-
 
Line 251... Line 121...
251
}
121
 
252
 
122
 
253
void
123
void
Line 266... Line 136...
266
    MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
136
    MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
267
 
137
 
Line 268... Line 138...
268
    OUTREG(R5XX_SURFACE_CNTL, rhd.surface_cntl);
138
    OUTREG(R5XX_SURFACE_CNTL, rhd.surface_cntl);
Line 269... Line 139...
269
 
139
 
-
 
140
    R5xxFIFOWaitLocal(3);
-
 
141
    OUTREG(R5XX_SC_TOP_LEFT, 0);
-
 
142
    OUTREG(R5XX_SC_BOTTOM_RIGHT,
270
    R5xxFIFOWaitLocal(1);
143
           RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX);
271
    OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT,
144
    OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT,
-
 
145
           RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX);
272
           R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX);
146
 
273
    R5xxFIFOWaitLocal(1);
147
    R5xxFIFOWaitLocal(1);
274
    OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control |
148
//    OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control |
-
 
149
//           R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR);
Line 275... Line 150...
275
           R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR);
150
    OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
276
 
151
 
277
    R5xxFIFOWaitLocal(5);
152
    R5xxFIFOWaitLocal(5);
278
    OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF);
153
    OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF);
Line 286... Line 161...
286
 
161
 
Line 287... Line 162...
287
void R5xxFIFOWait(u32_t required)
162
void R5xxFIFOWait(u32_t required)
288
{
163
{
289
    if (!R5xxFIFOWaitLocal(required)) {
164
    if (!R5xxFIFOWaitLocal(required)) {
290
      R5xx2DReset();
165
 //     R5xx2DReset();
291
      R5xx2DSetup();
166
      R5xx2DSetup();
292
    }
167
    }
293
}
168
}
Line 294... Line 169...
294
 
169
 
295
void R5xx2DIdle()
170
void R5xx2DIdle()
296
{
171
{
297
    if (!R5xx2DIdleLocal()) {
172
    if (!R5xx2DIdleLocal()) {
298
      R5xx2DReset();
173
  //    R5xx2DReset();
299
      R5xx2DSetup();
174
      R5xx2DSetup();
300
    }
175
    }
Line 301... Line -...
301
}
-
 
302
 
-
 
303
static void load_microcode()
-
 
304
{
-
 
305
  u32_t ifl;
-
 
306
  int i;
-
 
307
 
-
 
308
  ifl = safe_cli();
-
 
309
 
-
 
310
  OUTREG(RADEON_CP_ME_RAM_ADDR,0);
-
 
311
 
-
 
312
  R5xx2DIdleLocal();
-
 
313
 
-
 
314
  switch(rhd.ChipFamily)
-
 
315
  {
-
 
316
    case CHIP_FAMILY_R300:
-
 
317
    case CHIP_FAMILY_R350:
-
 
318
    case CHIP_FAMILY_RV350:
-
 
319
      dbgprintf("Loading R300 microcode\n");
-
 
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
/*
-
 
327
    case RHD_RV505:
-
 
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
*/
-
 
344
  }
-
 
Line 345... Line 176...
345
  safe_sti(ifl);
176
}
346
};
177
 
347
 
178
 
Line 367... Line 198...
367
    clip.ymin = 0;
198
    clip.ymin = 0;
368
    clip.xmax = rhd.displayWidth  - 1;
199
    clip.xmax = rhd.displayWidth  - 1;
369
    clip.ymax = rhd.displayHeight - 1;
200
    clip.ymax = rhd.displayHeight - 1;
370
 
201
 
Line 371... Line 202...
371
    dbgprintf("width  %d \n", rhd.displayWidth);
202
    dbgprintf("screen width  %d height %d\n",
372
    dbgprintf("height %d \n", rhd.displayHeight);
203
               rhd.displayWidth, rhd.displayHeight);
Line 373... Line 204...
373
 
204
 
-
 
205
    rhd.gui_control = ((6 << RADEON_GMC_DST_DATATYPE_SHIFT)
374
    rhd.gui_control = (R5XX_DATATYPE_ARGB8888 << R5XX_GMC_DST_DATATYPE_SHIFT) |
206
                      | RADEON_GMC_CLR_CMP_CNTL_DIS
Line 375... Line 207...
375
                       R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_DST_PITCH_OFFSET_CNTL;
207
                      | RADEON_GMC_DST_PITCH_OFFSET_CNTL);
Line 376... Line 208...
376
 
208
 
377
    dbgprintf("gui_control %x \n", rhd.gui_control);
209
    dbgprintf("gui_control %x \n", rhd.gui_control);
-
 
210
 
-
 
211
    rhd.surface_cntl = 0;
-
 
212
//    rhd.dst_pitch_offset = ((screenpitch / 64) << 22) | (rhd.fbLocation >> 10);
Line 378... Line -...
378
 
-
 
Line -... Line 213...
-
 
213
 
Line 379... Line 214...
379
    rhd.surface_cntl = 0;
214
    rhd.dst_pitch_offset = (((rhd.displayWidth * 4 / 64)<< 22) |
380
    rhd.dst_pitch_offset = ((screenpitch / 64) << 22) | (rhd.fbLocation >> 10);
215
                               (rhd.fbLocation  >> 10));
381
 
216
 
382
    dbgprintf("dst_pitch_offset %x \n", rhd.dst_pitch_offset);
217
 
383
 
218
    dbgprintf("dst_pitch_offset %x \n", rhd.dst_pitch_offset);
384
 
219
 
385
    scr_pixmap.width  = rhd.displayWidth;
220
    scr_pixmap.width  = rhd.displayWidth;
Line -... Line 221...
-
 
221
    scr_pixmap.height = rhd.displayHeight;
-
 
222
    scr_pixmap.format = PICT_a8r8g8b8;
-
 
223
    scr_pixmap.pitch  = screenpitch;
Line 386... Line -...
386
    scr_pixmap.height = rhd.displayHeight;
-
 
387
    scr_pixmap.format = PICT_a8r8g8b8;
-
 
388
    scr_pixmap.pitch  = screenpitch;
-
 
389
    scr_pixmap.local  = (void*)rhd.fbLocation;
-
 
390
    scr_pixmap.pitch_offset =  rhd.dst_pitch_offset;
-
 
391
    scr_pixmap.mapped = (void*)0;
-
 
392
 
-
 
393
 
-
 
394
    MASKREG(R5XX_GB_TILE_CONFIG, 0, R5XX_ENABLE_TILING);
224
    scr_pixmap.local  = (void*)rhd.fbLocation;
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,
225
    scr_pixmap.pitch_offset =  rhd.dst_pitch_offset;
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
    R5xx2DReset();
-
 
403
    R5xx2DSetup();
-
 
404
 
-
 
405
    MASKREG( RADEON_AIC_CNTL,0, RADEON_PCIGART_TRANSLATE_EN);
-
 
406
 
-
 
407
  //  load_microcode();
-
 
408
 
-
 
409
 //   rhd.ring_base = CreateRingBuffer(0x8000, PG_SW | PG_NOCACHE);
-
 
410
 //   dbgprintf("create cp ring buffer %x\n", rhd.ring_base);
-
 
411
 //   base = GetPgAddr(rhd.ring_base);
-
 
412
 
-
 
413
 //   OUTREG(RADEON_CP_RB_BASE, base);
-
 
414
 //   dbgprintf("ring base %x\n", base);
-
 
415
 
-
 
416
 //   OUTREG(RADEON_CP_RB_WPTR_DELAY, 0);
-
 
417
 
-
 
418
 //   rhd.ring_rp = rhd.ring_wp = INREG(RADEON_CP_RB_RPTR);
-
 
Line 419... Line 226...
419
 //   OUTREG(RADEON_CP_RB_WPTR,rhd.ring_rp);
226
    scr_pixmap.mapped = (void*)0;
Line 420... Line -...
420
 
-
 
421
 //   OUTREG(RADEON_CP_RB_RPTR_ADDR, 0); // ring buffer read pointer no update
-
 
422
 
227
 
-
 
228
    R5xxFIFOWaitLocal(2);
423
 //   OUTREG(RADEON_CP_RB_CNTL, RADEON_RB_NO_UPDATE | 12);
229
    OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset);
-
 
230
    OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset);
Line 424... Line 231...
424
 //   OUTREG(RADEON_SCRATCH_UMSK, 0);          // no scratch update
231
 
Line 425... Line 232...
425
 
232
    R5xxFIFOWaitLocal(1);