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 |