Subversion Repositories Kolibri OS

Rev

Rev 2997 | Rev 3764 | 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 "bitmap.h"
3120 serge 8
#include "display.h"
1246 serge 9
1221 serge 10
 
1428 serge 11
12
 
13
 
1246 serge 14
1221 serge 15
 
1246 serge 16
static void       __stdcall move_cursor(cursor_t *cursor, int x, int y);
17
1221 serge 18
 
2175 serge 19
1313 serge 20
 
21
{};
22
23
 
1221 serge 24
{
25
    struct radeon_device *rdev;
26
27
 
28
    uint32_t *src;
29
30
 
31
    int       r;
32
33
 
34
35
 
1963 serge 36
                     PAGE_SIZE, false, RADEON_GEM_DOMAIN_VRAM, NULL, &cursor->robj);
2997 Serge 37
1221 serge 38
 
39
        return r;
40
41
 
1404 serge 42
    if (unlikely(r != 0))
43
        return r;
44
1221 serge 45
 
1404 serge 46
    if (unlikely(r != 0))
47
        return r;
48
49
 
50
    if (r) {
1221 serge 51
         DRM_ERROR("radeon: failed to map cursor (%d).\n", r);
52
         return r;
53
    };
54
55
 
56
57
 
58
    {
59
        for(j = 0; j < 32; j++)
60
            *bits++ = *src++;
61
        for(j = 32; j < CURSOR_WIDTH; j++)
1230 serge 62
            *bits++ = 0;
1221 serge 63
    }
64
    for(i = 0; i < CURSOR_WIDTH*(CURSOR_HEIGHT-32); i++)
65
        *bits++ = 0;
66
67
 
1404 serge 68
1221 serge 69
 
1963 serge 70
1313 serge 71
 
1221 serge 72
};
73
74
 
2175 serge 75
{
1313 serge 76
    list_del(&cursor->list);
77
    radeon_bo_unpin(cursor->robj);
1404 serge 78
    KernelFree(cursor->data);
1313 serge 79
    __DestroyObject(cursor);
80
};
81
82
 
1246 serge 83
{
1221 serge 84
    struct radeon_device *rdev = (struct radeon_device *)rdisplay->ddev->dev_private;
1246 serge 85
1230 serge 86
 
2004 serge 87
 
88
        WREG32(RADEON_MM_INDEX, EVERGREEN_CUR_CONTROL);
89
        WREG32(RADEON_MM_DATA, EVERGREEN_CURSOR_EN |
90
               EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT));
91
    } else if (ASIC_IS_AVIVO(rdev)) {
92
        WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL);
1246 serge 93
        WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN |
1230 serge 94
                 (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT));
95
    } else {
96
        WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL);
1275 serge 97
        WREG32_P(RADEON_MM_DATA, (RADEON_CRTC_CUR_EN |
1230 serge 98
                      (RADEON_CRTC_CUR_MODE_24BPP << RADEON_CRTC_CUR_MODE_SHIFT)),
99
             ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK));
100
    }
101
}
102
103
 
104
{
1221 serge 105
    struct radeon_device *rdev;
106
    cursor_t *old;
107
    uint32_t  gpu_addr;
108
109
 
110
111
 
1230 serge 112
1221 serge 113
 
1230 serge 114
    gpu_addr = radeon_bo_gpu_offset(cursor->robj);
1404 serge 115
1221 serge 116
 
2004 serge 117
    {
118
        WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH, 0);
119
        WREG32(EVERGREEN_CUR_SURFACE_ADDRESS, gpu_addr);
120
    }
121
    else if (ASIC_IS_AVIVO(rdev))
122
    {
123
        if (rdev->family >= CHIP_RV770)
124
            WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, 0);
125
        WREG32(AVIVO_D1CUR_SURFACE_ADDRESS,  gpu_addr);
1246 serge 126
    }
2004 serge 127
    else {
1221 serge 128
        WREG32(RADEON_CUR_OFFSET, gpu_addr - rdev->mc.vram_start);
1430 serge 129
    }
1221 serge 130
1230 serge 131
 
1221 serge 132
};
133
134
 
1246 serge 135
{
136
    struct radeon_device *rdev;
137
1221 serge 138
 
1246 serge 139
140
 
141
142
 
2004 serge 143
		cur_lock = RREG32(EVERGREEN_CUR_UPDATE);
144
		if (lock)
145
			cur_lock |= EVERGREEN_CURSOR_UPDATE_LOCK;
146
		else
147
			cur_lock &= ~EVERGREEN_CURSOR_UPDATE_LOCK;
148
        WREG32(EVERGREEN_CUR_UPDATE, cur_lock);
149
	} else if (ASIC_IS_AVIVO(rdev)) {
150
        cur_lock = RREG32(AVIVO_D1CUR_UPDATE);
1246 serge 151
        if (lock)
152
            cur_lock |= AVIVO_D1CURSOR_UPDATE_LOCK;
153
        else
154
            cur_lock &= ~AVIVO_D1CURSOR_UPDATE_LOCK;
155
        WREG32(AVIVO_D1CUR_UPDATE, cur_lock);
156
    } else {
157
        cur_lock = RREG32(RADEON_CUR_OFFSET);
158
        if (lock)
159
            cur_lock |= RADEON_CUR_LOCK;
160
        else
161
            cur_lock &= ~RADEON_CUR_LOCK;
162
        WREG32(RADEON_CUR_OFFSET, cur_lock);
163
    }
164
}
165
166
 
167
 
1230 serge 168
{
1221 serge 169
    struct radeon_device *rdev;
1230 serge 170
    rdev = (struct radeon_device *)rdisplay->ddev->dev_private;
171
1221 serge 172
 
1230 serge 173
    int hot_y = cursor->hot_y;
174
    int w     = 32;
2004 serge 175
1221 serge 176
 
1246 serge 177
1221 serge 178
 
2004 serge 179
        WREG32(EVERGREEN_CUR_POSITION,(x << 16) | y);
180
        WREG32(EVERGREEN_CUR_HOT_SPOT, (hot_x << 16) | hot_y);
181
        WREG32(EVERGREEN_CUR_SIZE, ((w - 1) << 16) | 31);
182
    } else if (ASIC_IS_AVIVO(rdev)) {
183
        WREG32(AVIVO_D1CUR_POSITION, (x << 16) | y);
1246 serge 184
        WREG32(AVIVO_D1CUR_HOT_SPOT, (hot_x << 16) | hot_y);
185
        WREG32(AVIVO_D1CUR_SIZE, ((w - 1) << 16) | 31);
186
    } else {
1275 serge 187
1404 serge 188
 
1246 serge 189
        int       xorg =0, yorg=0;
1404 serge 190
1221 serge 191
 
1404 serge 192
        y = y - hot_y;
193
194
 
195
        {
196
            xorg = -x + 1;
197
            x = 0;
198
        }
199
200
 
201
        {
202
            yorg = -hot_y + 1;
203
            y = 0;
204
        };
205
206
 
1246 serge 207
               (RADEON_CUR_LOCK | (xorg << 16) | yorg ));
1404 serge 208
        WREG32(RADEON_CUR_HORZ_VERT_POSN,
1246 serge 209
               (RADEON_CUR_LOCK | (x << 16) | y));
1221 serge 210
211
 
1404 serge 212
1246 serge 213
 
1221 serge 214
        WREG32(RADEON_CUR_OFFSET,
1246 serge 215
         (gpu_addr - rdev->mc.vram_start + (yorg * 256)));
1430 serge 216
    }
1221 serge 217
    radeon_lock_cursor(false);
1246 serge 218
}
1221 serge 219
220
 
1230 serge 221
{
222
};
223
1221 serge 224
 
1233 serge 225
 
1404 serge 226
{
1233 serge 227
    struct drm_device   *dev;
1275 serge 228
1246 serge 229
 
1275 serge 230
    bool                 retval = true;
1268 serge 231
    u32_t                ifl;
1246 serge 232
1233 serge 233
 
234
235
 
236
237
 
1239 serge 238
1233 serge 239
 
1246 serge 240
    {
241
        list_for_each_entry(cursor, &rdisplay->cursors, list)
1275 serge 242
        {
243
            init_cursor(cursor);
244
        };
245
1233 serge 246
 
1275 serge 247
        rdisplay->init_cursor    = init_cursor;
248
        rdisplay->select_cursor  = select_cursor;
249
        rdisplay->show_cursor    = NULL;
250
        rdisplay->move_cursor    = move_cursor;
251
        rdisplay->restore_cursor = restore_cursor;
252
        rdisplay->disable_mouse  = disable_mouse;
1313 serge 253
1233 serge 254
 
1246 serge 255
        radeon_show_cursor();
256
    };
257
    safe_sti(ifl);
258
259
 
3120 serge 260
261
 
1233 serge 262
263
 
1239 serge 264
};
1233 serge 265
266
 
267
 
1404 serge 268
{
269
#define BYTES_PER_LONG (BITS_PER_LONG/8)
270
#define PADDING (BYTES_PER_LONG - (sizeof(struct fb_info) % BYTES_PER_LONG))
271
    int fb_info_size = sizeof(struct fb_info);
272
    struct fb_info *info;
273
    char *p;
274
1233 serge 275
 
1404 serge 276
        fb_info_size += PADDING;
277
278
 
279
280
 
281
        return NULL;
282
283
 
284
285
 
286
        info->par = p + fb_info_size;
287
288
 
289
#undef PADDING
290
#undef BYTES_PER_LONG
291
}
292
293
 
294
{
295
    kfree(info);
296
}
297
298
 
1963 serge 299
 
2997 Serge 300
#define I2F_FRAC_BITS  23
301
#define I2F_MASK ((1 << I2F_FRAC_BITS) - 1)
302
303
 
304
 * Converts unsigned integer into 32-bit IEEE floating point representation.
305
 * Will be exact from 0 to 2^24.  Above that, we round towards zero
306
 * as the fractional bits will not fit in a float.  (It would be better to
307
 * round towards even as the fpu does, but that is slower.)
308
 */
309
__pure uint32_t int2float(uint32_t x)
310
{
311
    uint32_t msb, exponent, fraction;
312
313
 
314
    if (!x) return 0;
315
316
 
317
    msb = __fls(x);
318
319
 
320
     * Use a rotate instead of a shift because that works both leftwards
321
     * and rightwards due to the mod(32) behaviour.  This means we don't
322
     * need to check to see if we are above 2^24 or not.
323
     */
324
    fraction = ror32(x, (msb - I2F_FRAC_BITS) & 0x1f) & I2F_MASK;
325
    exponent = (127 + msb) << I2F_FRAC_BITS;
326
327
 
328
}
329