Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1029 | serge | 1 | |
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | # define RADEON_PLL_WR_EN (1 << 7) |
||
12 | # define RADEON_PLL_DIV_SEL (3 << 8) |
||
13 | # define RADEON_PLL2_DIV_SEL_MASK ~(3 << 8) |
||
14 | |||
15 | |||
16 | # define RADEON_FORCEON_MCLKA (1 << 16) |
||
17 | # define RADEON_FORCEON_MCLKB (1 << 17) |
||
18 | # define RADEON_FORCEON_YCLKA (1 << 18) |
||
19 | # define RADEON_FORCEON_YCLKB (1 << 19) |
||
20 | # define RADEON_FORCEON_MC (1 << 20) |
||
21 | # define RADEON_FORCEON_AIC (1 << 21) |
||
22 | # define R300_DISABLE_MC_MCLKA (1 << 21) |
||
23 | # define R300_DISABLE_MC_MCLKB (1 << 21) |
||
24 | |||
25 | |||
26 | { |
||
27 | u32_t clock_cntl_index; |
||
28 | u32_t mclk_cntl; |
||
29 | u32_t rbbm_soft_reset; |
||
30 | u32_t host_path_cntl; |
||
31 | |||
32 | |||
33 | { |
||
34 | /* may need something similar for newer chips */ |
||
35 | clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX); |
||
36 | mclk_cntl = INPLL( RADEON_MCLK_CNTL); |
||
37 | |||
38 | |||
39 | RADEON_FORCEON_MCLKA | |
||
40 | RADEON_FORCEON_MCLKB | |
||
41 | RADEON_FORCEON_YCLKA | |
||
42 | RADEON_FORCEON_YCLKB | |
||
43 | RADEON_FORCEON_MC | |
||
44 | RADEON_FORCEON_AIC)); |
||
45 | } |
||
46 | |||
47 | |||
48 | |||
49 | |||
50 | RADEON_SOFT_RESET_CP | |
||
51 | RADEON_SOFT_RESET_HI | |
||
52 | RADEON_SOFT_RESET_SE | |
||
53 | RADEON_SOFT_RESET_RE | |
||
54 | RADEON_SOFT_RESET_PP | |
||
55 | RADEON_SOFT_RESET_E2 | |
||
56 | RADEON_SOFT_RESET_RB)); |
||
57 | INREG(RADEON_RBBM_SOFT_RESET); |
||
58 | OUTREG(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset & |
||
59 | ~(RADEON_SOFT_RESET_CP | |
||
60 | RADEON_SOFT_RESET_HI | |
||
61 | RADEON_SOFT_RESET_SE | |
||
62 | RADEON_SOFT_RESET_RE | |
||
63 | RADEON_SOFT_RESET_PP | |
||
64 | RADEON_SOFT_RESET_E2 | |
||
65 | RADEON_SOFT_RESET_RB))); |
||
66 | INREG(RADEON_RBBM_SOFT_RESET); |
||
67 | |||
68 | |||
69 | OUTPLL(RADEON_MCLK_CNTL, mclk_cntl); |
||
70 | OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); |
||
71 | OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); |
||
72 | } |
||
73 | }; |
||
74 | |||
75 | |||
76 | { |
||
77 | int i; |
||
78 | |||
79 | |||
80 | if (required <= (INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK)) |
||
81 | return TRUE; |
||
82 | |||
83 | |||
84 | return FALSE; |
||
85 | } |
||
86 | |||
87 | |||
88 | { |
||
89 | int i; |
||
90 | for (i = 0; i < 200; i++) |
||
91 | { |
||
92 | if (required <= (INREG(RADEON_RBBM_STATUS) & |
||
93 | RADEON_RBBM_FIFOCNT_MASK)) |
||
94 | return ; |
||
95 | delay(2); |
||
96 | }; |
||
97 | }; |
||
98 | |||
99 | |||
100 | |||
101 | * Flush all dirty data in the Pixel Cache to memory. |
||
102 | */ |
||
103 | |||
104 | |||
105 | R5xx2DFlush() |
||
106 | { |
||
107 | int i; |
||
108 | |||
109 | |||
110 | R5XX_DSTCACHE_FLUSH_ALL, R5XX_DSTCACHE_FLUSH_ALL); |
||
111 | |||
112 | |||
113 | if (!(INREG(R5XX_DSTCACHE_CTLSTAT) & R5XX_DSTCACHE_BUSY)) |
||
114 | return TRUE; |
||
115 | |||
116 | |||
117 | (unsigned int)INREG(R5XX_DSTCACHE_CTLSTAT)); |
||
118 | return FALSE; |
||
119 | } |
||
120 | |||
121 | |||
122 | R5xx2DIdleLocal() //R100-R500 |
||
123 | { |
||
124 | int i; |
||
125 | |||
126 | |||
127 | for (i = 0; i < R5XX_LOOP_COUNT; i++) |
||
128 | if (64 == (INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK)) |
||
129 | break; |
||
130 | |||
131 | |||
132 | dbgprintf("%s: FIFO Timeout 0x%08X.\n", __func__,INREG(R5XX_RBBM_STATUS)); |
||
133 | return FALSE; |
||
134 | } |
||
135 | |||
136 | |||
137 | for (i = 0; i < R5XX_LOOP_COUNT; i++) { |
||
138 | if (!(INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_ACTIVE)) { |
||
139 | R5xx2DFlush(); |
||
140 | return TRUE; |
||
141 | } |
||
142 | } |
||
143 | dbgprintf("%s: Idle Timeout 0x%08X.\n", __func__,INREG(R5XX_RBBM_STATUS)); |
||
144 | return FALSE; |
||
145 | } |
||
146 | |||
147 | |||
148 | |||
149 | R5xx2DSetup() |
||
150 | { |
||
151 | |||
152 | |||
153 | * set them appropriately before any accel ops, but let's avoid |
||
154 | * random bogus DMA in case we inadvertently trigger the engine |
||
155 | * in the wrong place (happened). */ |
||
156 | R5xxFIFOWaitLocal(2); |
||
157 | OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset); |
||
158 | OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset); |
||
159 | |||
160 | |||
161 | MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN); |
||
162 | |||
163 | |||
164 | |||
165 | |||
166 | OUTREG(R5XX_SC_TOP_LEFT, 0); |
||
167 | OUTREG(R5XX_SC_BOTTOM_RIGHT, |
||
168 | RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX); |
||
169 | OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT, |
||
170 | RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX); |
||
171 | |||
172 | |||
173 | // OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | |
||
174 | // R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR); |
||
175 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
176 | |||
177 | |||
178 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF); |
||
179 | OUTREG(R5XX_DP_BRUSH_BKGD_CLR, 0x00000000); |
||
180 | OUTREG(R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF); |
||
181 | OUTREG(R5XX_DP_SRC_BKGD_CLR, 0x00000000); |
||
182 | OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF); |
||
183 | |||
184 | |||
185 | } |
||
186 | |||
187 | |||
188 | { |
||
189 | if (!R5xxFIFOWaitLocal(required)) { |
||
190 | radeon_engine_reset(&rhd); |
||
191 | R5xx2DSetup(); |
||
192 | } |
||
193 | } |
||
194 | |||
195 | |||
196 | { |
||
197 | if (!R5xx2DIdleLocal()) { |
||
198 | // R5xx2DReset(); |
||
199 | R5xx2DSetup(); |
||
200 | } |
||
201 | } |
||
202 | |||
203 | |||
204 | |||
205 | { |
||
206 | u32_t base; |
||
207 | int screensize; |
||
208 | int screenpitch; |
||
209 | |||
210 | |||
211 | screenpitch = GetScreenPitch(); |
||
212 | |||
213 | |||
214 | rhd.displayHeight = screensize & 0xFFFF; |
||
215 | |||
216 | |||
217 | rhd.__ymin = 0; |
||
218 | rhd.__xmax = rhd.displayWidth - 1; |
||
219 | rhd.__ymax = rhd.displayHeight - 1; |
||
220 | |||
221 | |||
222 | clip.ymin = 0; |
||
223 | clip.xmax = rhd.displayWidth - 1; |
||
224 | clip.ymax = rhd.displayHeight - 1; |
||
225 | |||
226 | |||
227 | rhd.displayWidth, rhd.displayHeight); |
||
228 | |||
229 | |||
230 | | RADEON_GMC_CLR_CMP_CNTL_DIS |
||
231 | | RADEON_GMC_DST_PITCH_OFFSET_CNTL); |
||
232 | |||
233 | |||
234 | |||
235 | |||
236 | |||
237 | |||
238 | (rhd.fbLocation >> 10)); |
||
239 | |||
240 | |||
241 | |||
242 | |||
243 | |||
244 | scr_pixmap.height = rhd.displayHeight; |
||
245 | scr_pixmap.format = PICT_a8r8g8b8; |
||
246 | scr_pixmap.flags = PX_MEM_LOCAL; |
||
247 | scr_pixmap.pitch = rhd.displayWidth * 4 ;//screenpitch; |
||
248 | scr_pixmap.local = rhd.fbLocation; |
||
249 | scr_pixmap.pitch_offset = rhd.dst_pitch_offset; |
||
250 | scr_pixmap.mapped = 0; |
||
251 | |||
252 | |||
253 | OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset); |
||
254 | OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset); |
||
255 | |||
256 | |||
257 | MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN); |
||
258 | |||
259 | |||
260 | |||
261 | |||
262 | |||
263 | |||
264 | |||
265 | |||
266 | |||
267 | |||
268 | |||
269 | |||
270 |