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