Rev 1313 | Rev 1404 | 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 | |||
32 | false, |
||
33 | RADEON_GEM_DOMAIN_VRAM, |
||
34 | false, &cursor->robj); |
||
35 | |||
36 | |||
37 | return r; |
||
38 | |||
39 | |||
1246 | serge | 40 | |
1221 | serge | 41 | |
42 | if (r) { |
||
43 | DRM_ERROR("radeon: failed to map cursor (%d).\n", r); |
||
44 | return r; |
||
45 | }; |
||
46 | |||
47 | |||
48 | |||
49 | |||
50 | { |
||
51 | for(j = 0; j < 32; j++) |
||
52 | *bits++ = *src++; |
||
53 | for(j = 32; j < CURSOR_WIDTH; j++) |
||
1230 | serge | 54 | *bits++ = 0; |
1221 | serge | 55 | } |
56 | for(i = 0; i < CURSOR_WIDTH*(CURSOR_HEIGHT-32); i++) |
||
57 | *bits++ = 0; |
||
58 | |||
59 | |||
60 | |||
61 | |||
1403 | serge | 62 | |
1313 | serge | 63 | |
1221 | serge | 64 | }; |
65 | |||
66 | |||
1313 | serge | 67 | { |
68 | list_del(&cursor->list); |
||
69 | radeon_object_unpin(cursor->robj); |
||
70 | KernelFree(cursor->data); |
||
71 | __DestroyObject(cursor); |
||
72 | }; |
||
73 | |||
74 | |||
75 | |||
1246 | serge | 76 | { |
1221 | serge | 77 | struct radeon_device *rdev = (struct radeon_device *)rdisplay->ddev->dev_private; |
1246 | serge | 78 | |
1230 | serge | 79 | |
80 | WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL); |
||
1246 | serge | 81 | WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN | |
1230 | serge | 82 | (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); |
83 | } else { |
||
84 | WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL); |
||
1275 | serge | 85 | WREG32_P(RADEON_MM_DATA, (RADEON_CRTC_CUR_EN | |
1230 | serge | 86 | (RADEON_CRTC_CUR_MODE_24BPP << RADEON_CRTC_CUR_MODE_SHIFT)), |
87 | ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK)); |
||
88 | } |
||
89 | } |
||
90 | |||
91 | |||
92 | { |
||
1221 | serge | 93 | struct radeon_device *rdev; |
94 | cursor_t *old; |
||
95 | uint32_t gpu_addr; |
||
96 | |||
97 | |||
98 | |||
99 | |||
1230 | serge | 100 | |
1221 | serge | 101 | |
1230 | serge | 102 | // gpu_addr = cursor->robj->gpu_addr; |
1403 | serge | 103 | |
1221 | serge | 104 | |
105 | WREG32(AVIVO_D1CUR_SURFACE_ADDRESS, gpu_addr); |
||
1246 | serge | 106 | else { |
1221 | serge | 107 | WREG32(RADEON_CUR_OFFSET, gpu_addr - rdev->mc.vram_location); |
1246 | serge | 108 | } |
1221 | serge | 109 | |
1230 | serge | 110 | |
1221 | serge | 111 | }; |
112 | |||
113 | |||
1246 | serge | 114 | { |
115 | struct radeon_device *rdev; |
||
116 | |||
1221 | serge | 117 | |
1246 | serge | 118 | |
119 | |||
120 | |||
121 | |||
122 | cur_lock = RREG32(AVIVO_D1CUR_UPDATE); |
||
123 | if (lock) |
||
124 | cur_lock |= AVIVO_D1CURSOR_UPDATE_LOCK; |
||
125 | else |
||
126 | cur_lock &= ~AVIVO_D1CURSOR_UPDATE_LOCK; |
||
127 | WREG32(AVIVO_D1CUR_UPDATE, cur_lock); |
||
128 | } else { |
||
129 | cur_lock = RREG32(RADEON_CUR_OFFSET); |
||
130 | if (lock) |
||
131 | cur_lock |= RADEON_CUR_LOCK; |
||
132 | else |
||
133 | cur_lock &= ~RADEON_CUR_LOCK; |
||
134 | WREG32(RADEON_CUR_OFFSET, cur_lock); |
||
135 | } |
||
136 | } |
||
137 | |||
138 | |||
139 | |||
1230 | serge | 140 | { |
1221 | serge | 141 | struct radeon_device *rdev; |
1230 | serge | 142 | rdev = (struct radeon_device *)rdisplay->ddev->dev_private; |
143 | |||
1221 | serge | 144 | |
1230 | serge | 145 | int hot_y = cursor->hot_y; |
146 | |||
1221 | serge | 147 | |
1246 | serge | 148 | if (ASIC_IS_AVIVO(rdev)) |
1221 | serge | 149 | { |
150 | int w = 32; |
||
151 | int i = 0; |
||
152 | |||
153 | |||
1246 | serge | 154 | WREG32(AVIVO_D1CUR_HOT_SPOT, (hot_x << 16) | hot_y); |
155 | WREG32(AVIVO_D1CUR_SIZE, ((w - 1) << 16) | 31); |
||
156 | } else { |
||
1275 | serge | 157 | uint32_t gpu_addr; |
1246 | serge | 158 | |
1221 | serge | 159 | |
1246 | serge | 160 | (RADEON_CUR_LOCK | (hot_x << 16) | hot_y )); |
1275 | serge | 161 | WREG32(RADEON_CUR_HORZ_VERT_POSN, |
1246 | serge | 162 | (RADEON_CUR_LOCK | (x << 16) | y)); |
1221 | serge | 163 | |
164 | |||
1403 | serge | 165 | |
1246 | serge | 166 | |
1221 | serge | 167 | WREG32(RADEON_CUR_OFFSET, |
1246 | serge | 168 | (gpu_addr - rdev->mc.vram_location + (hot_y * 256))); |
169 | } |
||
1221 | serge | 170 | radeon_lock_cursor(false); |
1246 | serge | 171 | } |
1221 | serge | 172 | |
173 | |||
1230 | serge | 174 | { |
175 | }; |
||
176 | |||
1221 | serge | 177 | |
1233 | serge | 178 | |
1239 | serge | 179 | { |
1233 | serge | 180 | struct drm_device *dev; |
1275 | serge | 181 | |
1246 | serge | 182 | |
1275 | serge | 183 | bool retval = true; |
1268 | serge | 184 | u32_t ifl; |
1246 | serge | 185 | |
1233 | serge | 186 | |
187 | |||
188 | |||
189 | |||
190 | |||
1239 | serge | 191 | |
1233 | serge | 192 | |
1246 | serge | 193 | { |
194 | list_for_each_entry(cursor, &rdisplay->cursors, list) |
||
1275 | serge | 195 | { |
196 | init_cursor(cursor); |
||
197 | }; |
||
198 | |||
1233 | serge | 199 | |
1275 | serge | 200 | rdisplay->init_cursor = init_cursor; |
201 | rdisplay->select_cursor = select_cursor; |
||
202 | rdisplay->show_cursor = NULL; |
||
203 | rdisplay->move_cursor = move_cursor; |
||
204 | rdisplay->restore_cursor = restore_cursor; |
||
205 | rdisplay->disable_mouse = disable_mouse; |
||
1313 | serge | 206 | |
1233 | serge | 207 | |
1246 | serge | 208 | radeon_show_cursor(); |
209 | }; |
||
210 | safe_sti(ifl); |
||
211 | |||
212 | |||
1233 | serge | 213 | |
214 | |||
1239 | serge | 215 | };><>><>><>><>><>><>><>>>>> |
1233 | serge | 216 |