Subversion Repositories Kolibri OS

Rev

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

Rev 885 Rev 1002
Line 18... Line 18...
18
#	define RADEON_ISYNC_WAIT_IDLEGUI	(1 << 4)
18
#	define RADEON_ISYNC_WAIT_IDLEGUI	(1 << 4)
19
#	define RADEON_ISYNC_CPSCRATCH_IDLEGUI	(1 << 5)
19
#	define RADEON_ISYNC_CPSCRATCH_IDLEGUI	(1 << 5)
Line 20... Line 20...
20
 
20
 
21
 
21
 
Line 22... Line -...
22
#define RADEON_IDLE_RETRY      16 /* Fall out of idle loops after this count */
-
 
23
#define RADEON_TIMEOUT    2000000 /* Fall out of wait loops after this count */
-
 
24
 
-
 
25
 
-
 
26
void RADEONPllErrataAfterIndex()
-
 
27
{
-
 
28
    if (!(rhd.ChipErrata & CHIP_ERRATA_PLL_DUMMYREADS))
-
 
29
       return;
-
 
30
 
-
 
31
    /* This workaround is necessary on rv200 and RS200 or PLL
-
 
32
     * reads may return garbage (among others...)
-
 
33
     */
-
 
34
    (void)INREG(RADEON_CLOCK_CNTL_DATA);
-
 
35
    (void)INREG(RADEON_CRTC_GEN_CNTL);
-
 
36
}
-
 
37
 
-
 
38
 
-
 
39
void RADEONPllErrataAfterData()
-
 
40
{
-
 
41
 
-
 
42
    /* This function is required to workaround a hardware bug in some (all?)
-
 
43
     * revisions of the R300.  This workaround should be called after every
-
 
44
     * CLOCK_CNTL_INDEX register access.  If not, register reads afterward
-
 
45
     * may not be correct.
-
 
46
     */
-
 
47
    if (rhd.ChipFamily <= CHIP_FAMILY_RV380)
-
 
48
    {
-
 
49
        u32_t save, tmp;
-
 
50
 
-
 
51
	save = INREG(RADEON_CLOCK_CNTL_INDEX);
-
 
52
	tmp = save & ~(0x3f | RADEON_PLL_WR_EN);
-
 
53
	OUTREG(RADEON_CLOCK_CNTL_INDEX, tmp);
-
 
54
	tmp = INREG(RADEON_CLOCK_CNTL_DATA);
-
 
55
	OUTREG(RADEON_CLOCK_CNTL_INDEX, save);
-
 
56
    }
-
 
57
}
-
 
58
 
-
 
59
 
-
 
60
/* Read PLL register */
-
 
61
u32_t RADEONINPLL(int addr)
-
 
62
{
-
 
63
    u32_t       data;
-
 
64
 
-
 
65
    OUTREG8(RADEON_CLOCK_CNTL_INDEX, addr & 0x3f);
-
 
66
    RADEONPllErrataAfterIndex();
-
 
67
    data = INREG(RADEON_CLOCK_CNTL_DATA);
-
 
68
    RADEONPllErrataAfterData();
-
 
69
 
-
 
70
    return data;
-
 
71
};
-
 
72
 
-
 
73
/* Write PLL information */
-
 
74
void RADEONOUTPLL(int addr, u32_t data)
-
 
75
{
-
 
76
    OUTREG8(RADEON_CLOCK_CNTL_INDEX, (((addr) & 0x3f) |
-
 
77
				      RADEON_PLL_WR_EN));
-
 
Line 78... Line 22...
78
    RADEONPllErrataAfterIndex();
22
#define RADEON_IDLE_RETRY      16 /* Fall out of idle loops after this count */
79
    OUTREG(RADEON_CLOCK_CNTL_DATA, data);
23
#define RADEON_TIMEOUT    4000000 /* Fall out of wait loops after this count */
80
    RADEONPllErrataAfterData();
24
 
Line 146... Line 90...
146
 
90
 
147
    return 1;
91
    return 1;
Line 148... Line -...
148
}
-
 
149
 
-
 
150
 
-
 
151
static void init_pipes(RHDPtr info)
-
 
152
{
-
 
153
     u32_t gb_tile_config = 0;
-
 
154
 
-
 
155
     if ( (info->ChipFamily == CHIP_FAMILY_RV410) ||
-
 
156
          (info->ChipFamily == CHIP_FAMILY_R420)  ||
-
 
157
          (info->ChipFamily == CHIP_FAMILY_RS600) ||
-
 
158
          (info->ChipFamily == CHIP_FAMILY_RS690) ||
-
 
159
          (info->ChipFamily == CHIP_FAMILY_RS740) ||
-
 
160
          (info->ChipFamily == CHIP_FAMILY_RS400) ||
-
 
161
          (info->ChipFamily == CHIP_FAMILY_RS480) || IS_R500_3D)
-
 
162
     {
-
 
163
         u32_t gb_pipe_sel = INREG(R400_GB_PIPE_SELECT);
-
 
164
 
-
 
165
         info->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1;
-
 
166
         if (IS_R500_3D)
-
 
167
            OUTPLL(R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4));
-
 
168
     }
-
 
169
     else
-
 
170
     {
-
 
171
        if ((info->ChipFamily == CHIP_FAMILY_R300) ||
-
 
172
            (info->ChipFamily == CHIP_FAMILY_R350))
-
 
173
        {
-
 
174
         /* R3xx chips */
-
 
175
            info->num_gb_pipes = 2;
-
 
176
        }
-
 
177
        else {
-
 
178
         /* RV3xx chips */
-
 
179
           info->num_gb_pipes = 1;
-
 
180
        }
-
 
181
     }
-
 
182
 
-
 
183
     if (IS_R300_3D || IS_R500_3D)
-
 
184
     {
-
 
185
 
-
 
186
        dbgprintf("num quad-pipes is %d\n", info->num_gb_pipes);
-
 
187
 
-
 
188
        switch(info->num_gb_pipes) {
-
 
189
           case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break;
-
 
190
           case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break;
-
 
191
           case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break;
-
 
192
           default:
-
 
193
           case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break;
-
 
194
        }
-
 
195
 
-
 
196
        OUTREG(R300_GB_TILE_CONFIG, gb_tile_config);
-
 
197
        OUTREG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
-
 
198
        OUTREG(R300_DST_PIPE_CONFIG, INREG(R300_DST_PIPE_CONFIG) | R300_PIPE_AUTO_CONFIG);
-
 
199
        OUTREG(R300_RB2D_DSTCACHE_MODE, (INREG(R300_RB2D_DSTCACHE_MODE) |
-
 
200
                                        R300_DC_AUTOFLUSH_ENABLE |
-
 
201
                                        R300_DC_DC_DISABLE_IGNORE_PE));
-
 
202
    }
-
 
Line 203... Line 92...
203
    else
92
}
204
       OUTREG(RADEON_RB3D_CNTL, 0);
93
 
205
};
94
 
Line 499... Line 388...
499
     rhd.ring_rp = rhd.ring_wp = INREG(RADEON_CP_RB_RPTR);
388
     rhd.ring_rp = rhd.ring_wp = INREG(RADEON_CP_RB_RPTR);
500
     OUTREG(RADEON_CP_RB_WPTR, rhd.ring_rp);
389
     OUTREG(RADEON_CP_RB_WPTR, rhd.ring_rp);
Line 501... Line 390...
501
 
390
 
Line -... Line 391...
-
 
391
     radeon_cp_start(&rhd);
502
     radeon_cp_start(&rhd);
392