Subversion Repositories Kolibri OS

Rev

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