Subversion Repositories Kolibri OS

Rev

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