Rev 2004 | Rev 2997 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1221 | serge | 1 | |
2 | #include |
||
3 | #include |
||
4 | #include "radeon_drm.h" |
||
5 | #include "radeon.h" |
||
6 | #include "radeon_object.h" |
||
7 | #include "display.h" |
||
1246 | serge | 8 | |
1221 | serge | 9 | |
1428 | serge | 10 | |
11 | |||
12 | |||
1246 | serge | 13 | |
1221 | serge | 14 | |
1246 | serge | 15 | static void __stdcall move_cursor(cursor_t *cursor, int x, int y); |
16 | |||
1221 | serge | 17 | |
2175 | serge | 18 | |
1313 | serge | 19 | |
20 | {}; |
||
21 | |||
22 | |||
1221 | serge | 23 | { |
24 | struct radeon_device *rdev; |
||
25 | |||
26 | |||
27 | uint32_t *src; |
||
28 | |||
29 | |||
30 | int r; |
||
31 | |||
32 | |||
33 | |||
34 | |||
1963 | serge | 35 | PAGE_SIZE, false, RADEON_GEM_DOMAIN_VRAM, &cursor->robj); |
36 | |||
1221 | serge | 37 | |
38 | return r; |
||
39 | |||
40 | |||
1404 | serge | 41 | if (unlikely(r != 0)) |
42 | return r; |
||
43 | |||
1221 | serge | 44 | |
1404 | serge | 45 | if (unlikely(r != 0)) |
46 | return r; |
||
47 | |||
48 | |||
49 | if (r) { |
||
1221 | serge | 50 | DRM_ERROR("radeon: failed to map cursor (%d).\n", r); |
51 | return r; |
||
52 | }; |
||
53 | |||
54 | |||
55 | |||
56 | |||
57 | { |
||
58 | for(j = 0; j < 32; j++) |
||
59 | *bits++ = *src++; |
||
60 | for(j = 32; j < CURSOR_WIDTH; j++) |
||
1230 | serge | 61 | *bits++ = 0; |
1221 | serge | 62 | } |
63 | for(i = 0; i < CURSOR_WIDTH*(CURSOR_HEIGHT-32); i++) |
||
64 | *bits++ = 0; |
||
65 | |||
66 | |||
1404 | serge | 67 | |
1221 | serge | 68 | |
1963 | serge | 69 | |
1313 | serge | 70 | |
1221 | serge | 71 | }; |
72 | |||
73 | |||
2175 | serge | 74 | { |
1313 | serge | 75 | list_del(&cursor->list); |
76 | radeon_bo_unpin(cursor->robj); |
||
1404 | serge | 77 | KernelFree(cursor->data); |
1313 | serge | 78 | __DestroyObject(cursor); |
79 | }; |
||
80 | |||
81 | |||
1246 | serge | 82 | { |
1221 | serge | 83 | struct radeon_device *rdev = (struct radeon_device *)rdisplay->ddev->dev_private; |
1246 | serge | 84 | |
1230 | serge | 85 | |
2004 | serge | 86 | |
87 | WREG32(RADEON_MM_INDEX, EVERGREEN_CUR_CONTROL); |
||
88 | WREG32(RADEON_MM_DATA, EVERGREEN_CURSOR_EN | |
||
89 | EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT)); |
||
90 | } else if (ASIC_IS_AVIVO(rdev)) { |
||
91 | WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL); |
||
1246 | serge | 92 | WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN | |
1230 | serge | 93 | (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); |
94 | } else { |
||
95 | WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL); |
||
1275 | serge | 96 | WREG32_P(RADEON_MM_DATA, (RADEON_CRTC_CUR_EN | |
1230 | serge | 97 | (RADEON_CRTC_CUR_MODE_24BPP << RADEON_CRTC_CUR_MODE_SHIFT)), |
98 | ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK)); |
||
99 | } |
||
100 | } |
||
101 | |||
102 | |||
103 | { |
||
1221 | serge | 104 | struct radeon_device *rdev; |
105 | cursor_t *old; |
||
106 | uint32_t gpu_addr; |
||
107 | |||
108 | |||
109 | |||
110 | |||
1230 | serge | 111 | |
1221 | serge | 112 | |
1230 | serge | 113 | gpu_addr = radeon_bo_gpu_offset(cursor->robj); |
1404 | serge | 114 | |
1221 | serge | 115 | |
2004 | serge | 116 | { |
117 | WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH, 0); |
||
118 | WREG32(EVERGREEN_CUR_SURFACE_ADDRESS, gpu_addr); |
||
119 | } |
||
120 | else if (ASIC_IS_AVIVO(rdev)) |
||
121 | { |
||
122 | if (rdev->family >= CHIP_RV770) |
||
123 | WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, 0); |
||
124 | WREG32(AVIVO_D1CUR_SURFACE_ADDRESS, gpu_addr); |
||
1246 | serge | 125 | } |
2004 | serge | 126 | else { |
1221 | serge | 127 | WREG32(RADEON_CUR_OFFSET, gpu_addr - rdev->mc.vram_start); |
1430 | serge | 128 | } |
1221 | serge | 129 | |
1230 | serge | 130 | |
1221 | serge | 131 | }; |
132 | |||
133 | |||
1246 | serge | 134 | { |
135 | struct radeon_device *rdev; |
||
136 | |||
1221 | serge | 137 | |
1246 | serge | 138 | |
139 | |||
140 | |||
141 | |||
2004 | serge | 142 | cur_lock = RREG32(EVERGREEN_CUR_UPDATE); |
143 | if (lock) |
||
144 | cur_lock |= EVERGREEN_CURSOR_UPDATE_LOCK; |
||
145 | else |
||
146 | cur_lock &= ~EVERGREEN_CURSOR_UPDATE_LOCK; |
||
147 | WREG32(EVERGREEN_CUR_UPDATE, cur_lock); |
||
148 | } else if (ASIC_IS_AVIVO(rdev)) { |
||
149 | cur_lock = RREG32(AVIVO_D1CUR_UPDATE); |
||
1246 | serge | 150 | if (lock) |
151 | cur_lock |= AVIVO_D1CURSOR_UPDATE_LOCK; |
||
152 | else |
||
153 | cur_lock &= ~AVIVO_D1CURSOR_UPDATE_LOCK; |
||
154 | WREG32(AVIVO_D1CUR_UPDATE, cur_lock); |
||
155 | } else { |
||
156 | cur_lock = RREG32(RADEON_CUR_OFFSET); |
||
157 | if (lock) |
||
158 | cur_lock |= RADEON_CUR_LOCK; |
||
159 | else |
||
160 | cur_lock &= ~RADEON_CUR_LOCK; |
||
161 | WREG32(RADEON_CUR_OFFSET, cur_lock); |
||
162 | } |
||
163 | } |
||
164 | |||
165 | |||
166 | |||
1230 | serge | 167 | { |
1221 | serge | 168 | struct radeon_device *rdev; |
1230 | serge | 169 | rdev = (struct radeon_device *)rdisplay->ddev->dev_private; |
170 | |||
1221 | serge | 171 | |
1230 | serge | 172 | int hot_y = cursor->hot_y; |
173 | int w = 32; |
||
2004 | serge | 174 | |
1221 | serge | 175 | |
1246 | serge | 176 | |
1221 | serge | 177 | |
2004 | serge | 178 | WREG32(EVERGREEN_CUR_POSITION,(x << 16) | y); |
179 | WREG32(EVERGREEN_CUR_HOT_SPOT, (hot_x << 16) | hot_y); |
||
180 | WREG32(EVERGREEN_CUR_SIZE, ((w - 1) << 16) | 31); |
||
181 | } else if (ASIC_IS_AVIVO(rdev)) { |
||
182 | WREG32(AVIVO_D1CUR_POSITION, (x << 16) | y); |
||
1246 | serge | 183 | WREG32(AVIVO_D1CUR_HOT_SPOT, (hot_x << 16) | hot_y); |
184 | WREG32(AVIVO_D1CUR_SIZE, ((w - 1) << 16) | 31); |
||
185 | } else { |
||
1275 | serge | 186 | |
1404 | serge | 187 | |
1246 | serge | 188 | int xorg =0, yorg=0; |
1404 | serge | 189 | |
1221 | serge | 190 | |
1404 | serge | 191 | y = y - hot_y; |
192 | |||
193 | |||
194 | { |
||
195 | xorg = -x + 1; |
||
196 | x = 0; |
||
197 | } |
||
198 | |||
199 | |||
200 | { |
||
201 | yorg = -hot_y + 1; |
||
202 | y = 0; |
||
203 | }; |
||
204 | |||
205 | |||
1246 | serge | 206 | (RADEON_CUR_LOCK | (xorg << 16) | yorg )); |
1404 | serge | 207 | WREG32(RADEON_CUR_HORZ_VERT_POSN, |
1246 | serge | 208 | (RADEON_CUR_LOCK | (x << 16) | y)); |
1221 | serge | 209 | |
210 | |||
1404 | serge | 211 | |
1246 | serge | 212 | |
1221 | serge | 213 | WREG32(RADEON_CUR_OFFSET, |
1246 | serge | 214 | (gpu_addr - rdev->mc.vram_start + (yorg * 256))); |
1430 | serge | 215 | } |
1221 | serge | 216 | radeon_lock_cursor(false); |
1246 | serge | 217 | } |
1221 | serge | 218 | |
219 | |||
1230 | serge | 220 | { |
221 | }; |
||
222 | |||
1221 | serge | 223 | |
1233 | serge | 224 | |
1404 | serge | 225 | { |
1233 | serge | 226 | struct drm_device *dev; |
1275 | serge | 227 | |
1246 | serge | 228 | |
1275 | serge | 229 | bool retval = true; |
1268 | serge | 230 | u32_t ifl; |
1246 | serge | 231 | |
1233 | serge | 232 | |
233 | |||
234 | |||
235 | |||
236 | |||
1239 | serge | 237 | |
1233 | serge | 238 | |
1246 | serge | 239 | { |
240 | list_for_each_entry(cursor, &rdisplay->cursors, list) |
||
1275 | serge | 241 | { |
242 | init_cursor(cursor); |
||
243 | }; |
||
244 | |||
1233 | serge | 245 | |
1275 | serge | 246 | rdisplay->init_cursor = init_cursor; |
247 | rdisplay->select_cursor = select_cursor; |
||
248 | rdisplay->show_cursor = NULL; |
||
249 | rdisplay->move_cursor = move_cursor; |
||
250 | rdisplay->restore_cursor = restore_cursor; |
||
251 | rdisplay->disable_mouse = disable_mouse; |
||
1313 | serge | 252 | |
1233 | serge | 253 | |
1246 | serge | 254 | radeon_show_cursor(); |
255 | }; |
||
256 | safe_sti(ifl); |
||
257 | |||
258 | |||
1233 | serge | 259 | |
260 | |||
1239 | serge | 261 | }; |
1233 | serge | 262 | |
263 | |||
264 | |||
1404 | serge | 265 | { |
266 | #define BYTES_PER_LONG (BITS_PER_LONG/8) |
||
267 | #define PADDING (BYTES_PER_LONG - (sizeof(struct fb_info) % BYTES_PER_LONG)) |
||
268 | int fb_info_size = sizeof(struct fb_info); |
||
269 | struct fb_info *info; |
||
270 | char *p; |
||
271 | |||
1233 | serge | 272 | |
1404 | serge | 273 | fb_info_size += PADDING; |
274 | |||
275 | |||
276 | |||
277 | |||
278 | return NULL; |
||
279 | |||
280 | |||
281 | |||
282 | |||
283 | info->par = p + fb_info_size; |
||
284 | |||
285 | |||
286 | #undef PADDING |
||
287 | #undef BYTES_PER_LONG |
||
288 | } |
||
289 | |||
290 | |||
291 | { |
||
292 | kfree(info); |
||
293 | }><>><>>>><>><>><>><>><>><>><>><>>>>> |
||
294 |