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