Subversion Repositories Kolibri OS

Rev

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