Subversion Repositories Kolibri OS

Rev

Rev 1233 | Rev 1246 | 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
9
 
10
#define CURSOR_HEIGHT 64
11
12
 
13
typedef struct tag_display display_t;
14
15
 
16
{
17
    uint32_t   magic;
18
    void      *destroy;
19
    kobj_t    *fd;
20
    kobj_t    *bk;
21
    uint32_t   pid;
22
};
23
24
 
25
{
26
    kobj_t     header;
27
28
 
29
    uint32_t   hot_x;
30
    uint32_t   hot_y;
31
32
 
33
    struct radeon_object *robj;
34
}cursor_t;
35
36
 
1230 serge 37
cursor_t*  __stdcall select_cursor(cursor_t *cursor);
38
void       __stdcall move_cursor(cursor_t *cursor, int x, int y);
39
void       __stdcall restore_cursor(int x, int y);
40
41
 
1221 serge 42
{
43
    int  x;
44
    int  y;
45
    int  width;
46
    int  height;
47
    int  bpp;
48
    int  vrefresh;
49
    int  pitch;
50
    int  lfb;
51
52
 
1239 serge 53
    struct drm_device *ddev;
1221 serge 54
    struct drm_connector *connector;
1239 serge 55
    struct drm_crtc   *crtc;
1221 serge 56
57
 
58
59
 
60
    int       (*init_cursor)(cursor_t*);
61
    cursor_t* (__stdcall *select_cursor)(cursor_t*);
1230 serge 62
    void      (*show_cursor)(int show);
1221 serge 63
    void      (__stdcall *move_cursor)(cursor_t *cursor, int x, int y);
1230 serge 64
    void      (__stdcall *restore_cursor)(int x, int y);
65
66
 
1221 serge 67
68
 
1233 serge 69
1221 serge 70
 
1230 serge 71
1221 serge 72
 
1230 serge 73
 
74
{
75
    ENTER();
76
    rdisplay->crtc = crtc;
77
    LEAVE();
78
}
79
80
 
1221 serge 81
{
82
    struct radeon_device *rdev;
83
84
 
85
    uint32_t *src;
86
87
 
88
    int       r;
89
90
 
91
92
 
93
                     false,
94
                     RADEON_GEM_DOMAIN_VRAM,
95
                     false, &cursor->robj);
96
97
 
98
        return r;
99
100
 
101
102
 
103
    if (r) {
104
         DRM_ERROR("radeon: failed to map cursor (%d).\n", r);
105
         return r;
106
    };
107
108
 
109
110
 
111
    {
112
        for(j = 0; j < 32; j++)
113
            *bits++ = *src++;
114
        for(j = 32; j < CURSOR_WIDTH; j++)
1230 serge 115
            *bits++ = 0;
1221 serge 116
    }
117
    for(i = 0; i < CURSOR_WIDTH*(CURSOR_HEIGHT-32); i++)
118
        *bits++ = 0;
119
120
 
121
122
 
123
};
124
125
 
1230 serge 126
{
1221 serge 127
    struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1230 serge 128
    struct radeon_device *rdev = crtc->dev->dev_private;
129
130
 
131
        WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset);
132
        WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN |
133
                 (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT));
134
    } else {
135
        switch (radeon_crtc->crtc_id) {
136
        case 0:
137
            WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL);
138
            break;
139
        case 1:
140
            WREG32(RADEON_MM_INDEX, RADEON_CRTC2_GEN_CNTL);
141
            break;
142
        default:
143
            return;
144
        }
145
146
 
147
                      (RADEON_CRTC_CUR_MODE_24BPP << RADEON_CRTC_CUR_MODE_SHIFT)),
148
             ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK));
149
    }
150
}
151
152
 
1221 serge 153
 
154
{
155
    struct radeon_device *rdev = crtc->dev->dev_private;
156
    struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
157
    uint32_t cur_lock;
158
159
 
160
        cur_lock = RREG32(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset);
161
        if (lock)
162
            cur_lock |= AVIVO_D1CURSOR_UPDATE_LOCK;
163
        else
164
            cur_lock &= ~AVIVO_D1CURSOR_UPDATE_LOCK;
165
        WREG32(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset, cur_lock);
166
    } else {
167
        cur_lock = RREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset);
168
        if (lock)
169
            cur_lock |= RADEON_CUR_LOCK;
170
        else
171
            cur_lock &= ~RADEON_CUR_LOCK;
172
        WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, cur_lock);
173
    }
174
}
175
176
 
1230 serge 177
{
1221 serge 178
    struct radeon_device *rdev;
179
    struct radeon_crtc   *radeon_crtc;
180
    cursor_t *old;
181
    uint32_t  gpu_addr;
182
183
 
184
    radeon_crtc = to_radeon_crtc(rdisplay->crtc);
185
186
 
1230 serge 187
1221 serge 188
 
1230 serge 189
    gpu_addr = cursor->robj->gpu_addr;
1221 serge 190
191
 
192
        WREG32(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, gpu_addr);
193
    else {
194
        radeon_crtc->legacy_cursor_offset = gpu_addr - radeon_crtc->legacy_display_base_addr;
195
        /* offset is from DISP(2)_BASE_ADDRESS */
196
        WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, radeon_crtc->legacy_cursor_offset);
197
    }
198
1230 serge 199
 
1221 serge 200
};
201
202
 
203
 
1230 serge 204
{
1221 serge 205
    struct radeon_device *rdev;
1230 serge 206
    rdev = (struct radeon_device *)rdisplay->ddev->dev_private;
207
    struct drm_crtc *crtc = rdisplay->crtc;
1221 serge 208
    struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
209
210
 
1230 serge 211
    int hot_y = cursor->hot_y;
212
1221 serge 213
 
214
    if (ASIC_IS_AVIVO(rdev))
215
    {
216
        int w = 32;
217
        int i = 0;
218
        struct drm_crtc *crtc_p;
219
220
 
221
//        x += crtc->x;
1230 serge 222
//        y += crtc->y;
223
1221 serge 224
 
225
#if 0
226
        /* avivo cursor image can't end on 128 pixel boundry or
227
         * go past the end of the frame if both crtcs are enabled
228
         */
229
        list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) {
230
            if (crtc_p->enabled)
231
                i++;
232
        }
233
        if (i > 1) {
234
            int cursor_end, frame_end;
235
236
 
237
            frame_end = crtc->x + crtc->mode.crtc_hdisplay;
238
            if (cursor_end >= frame_end) {
239
                w = w - (cursor_end - frame_end);
240
                if (!(frame_end & 0x7f))
241
                    w--;
242
            } else {
243
                if (!(cursor_end & 0x7f))
244
                    w--;
245
            }
246
            if (w <= 0)
247
                w = 1;
248
        }
249
#endif
250
        WREG32(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset,
251
               (x << 16) | y);
252
        WREG32(AVIVO_D1CUR_HOT_SPOT + radeon_crtc->crtc_offset,
253
               (hot_x << 16) | hot_y);
1230 serge 254
        WREG32(AVIVO_D1CUR_SIZE + radeon_crtc->crtc_offset,
1221 serge 255
               ((w - 1) << 16) | 31);
256
    } else {
257
        if (crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)
258
            y *= 2;
259
260
 
261
               (RADEON_CUR_LOCK | (hot_x << 16) | (hot_y << 16)));
262
        WREG32(RADEON_CUR_HORZ_VERT_POSN + radeon_crtc->crtc_offset,
263
               (RADEON_CUR_LOCK | (x << 16) | y));
264
265
 
266
        WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset,
267
         (radeon_crtc->legacy_cursor_offset + (hot_y * 256)));
268
    }
269
    radeon_lock_cursor(crtc, false);
270
}
271
272
 
1230 serge 273
{
274
};
275
1221 serge 276
 
1233 serge 277
{
278
    static char name[4];
279
280
 
281
    name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@';
282
    name[2] = (x[1] & 0x1F) + '@';
283
    name[3] = 0;
284
285
 
286
}
287
288
 
1239 serge 289
              mode_t *reqmode, bool strict)
290
{
1233 serge 291
    struct drm_display_mode  *mode = NULL, *tmpmode;
1239 serge 292
1233 serge 293
 
294
295
 
296
297
 
1239 serge 298
    {
1233 serge 299
        if( (drm_mode_width(tmpmode)    == reqmode->width)  &&
1239 serge 300
            (drm_mode_height(tmpmode)   == reqmode->height) &&
301
            (drm_mode_vrefresh(tmpmode) == reqmode->freq) )
302
        {
303
            mode = tmpmode;
304
            break;
305
        }
306
    };
307
1233 serge 308
 
1239 serge 309
    {
310
        list_for_each_entry(tmpmode, &connector->modes, head)
311
        {
312
            if( (drm_mode_width(tmpmode)    == reqmode->width)  &&
313
                (drm_mode_height(tmpmode)   == reqmode->height) )
314
            {
315
                mode = tmpmode;
316
                break;
317
            }
318
        };
319
    };
320
321
 
322
    {
323
        struct drm_framebuffer   *fb;
324
        struct drm_encoder  *encoder;
1233 serge 325
        struct drm_crtc     *crtc;
326
327
 
1239 serge 328
        char *con_name;
329
        char *enc_name;
330
1233 serge 331
 
332
        crtc = encoder->crtc;
333
334
 
335
                                      struct drm_framebuffer, filp_head);
336
337
 
338
339
 
340
                manufacturer_name(con_edid + 0x08),
341
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
342
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
343
                    + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
344
345
 
346
 
347
                enc_name = drm_get_encoder_name(encoder);
348
349
 
350
                   reqmode->width, reqmode->height, con_name, enc_name);
1239 serge 351
1233 serge 352
 
1239 serge 353
        fb->height = reqmode->height;
354
        fb->pitch  = radeon_align_pitch(dev->dev_private, reqmode->width, 32, false) * ((32 + 1) / 8);
355
1233 serge 356
 
357
                crtc->enabled = true;
358
                rdisplay->crtc = crtc;
359
360
 
361
362
 
1239 serge 363
        {
364
                rdisplay->width  = fb->width;
1233 serge 365
                rdisplay->height = fb->height;
366
                rdisplay->pitch  = fb->pitch;
367
            rdisplay->vrefresh = drm_mode_vrefresh(mode);
1239 serge 368
1233 serge 369
 
370
371
 
1239 serge 372
                       fb->width, fb->height, fb->pitch);
373
                }
1233 serge 374
                else
375
                    DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
376
                               fb->width, fb->height, crtc);
377
    }
1239 serge 378
379
 
380
    return ret;
381
};
382
383
 
384
{
385
    struct drm_display_mode  *mode;
386
    int count = 0;
387
388
 
389
    {
390
        count++;
391
                };
1233 serge 392
    return count;
1239 serge 393
};
394
1233 serge 395
 
1239 serge 396
{
397
    struct drm_connector  *connector;
398
    struct drm_connector  *def_connector = NULL;
399
1233 serge 400
 
1239 serge 401
    {
402
        struct drm_encoder  *encoder;
403
        struct drm_crtc     *crtc;
404
405
 
406
            continue;
407
408
 
409
        if( encoder == NULL)
410
            continue;
411
412
 
413
        {
414
            dbgprintf("skip tvdac encoder %s connector %s\n",
415
                      drm_get_encoder_name(encoder),
416
                      drm_get_connector_name(connector));
417
            continue;
418
            };
1233 serge 419
1239 serge 420
 
421
        if(crtc == NULL)
422
            continue;
423
424
 
425
        break;
426
    };
1233 serge 427
1239 serge 428
 
429
};
1233 serge 430
431
 
1239 serge 432
{
1233 serge 433
    struct drm_device  *dev;
1239 serge 434
    cursor_t  *cursor;
1233 serge 435
    bool                retval = false;
1239 serge 436
1233 serge 437
 
438
439
 
440
441
 
1239 serge 442
1233 serge 443
 
444
    {
445
        init_cursor(cursor);
446
    };
447
448
 
1239 serge 449
450
 
451
        return false;
452
453
 
454
455
 
1233 serge 456
        (usermode->height != 0) )
457
    {
458
        retval = set_mode(dev, rdisplay->connector, usermode, false);
1239 serge 459
    }
1233 serge 460
    else
461
    {
1239 serge 462
        mode_t mode;
463
        mode.width  = rdisplay->width;
464
        mode.height = rdisplay->height;
465
        mode.bpp    = 32;
466
        mode.freq   = 60;
467
1233 serge 468
 
1239 serge 469
    };
470
471
 
1233 serge 472
    radeon_show_cursor(rdisplay->crtc);
473
474
 
475
    rdisplay->select_cursor = select_cursor;
476
    rdisplay->show_cursor   = NULL;
477
    rdisplay->move_cursor   = move_cursor;
478
    rdisplay->restore_cursor = restore_cursor;
479
480
 
481
482
 
1239 serge 483
};
1233 serge 484
485
 
486
{
487
    char* p = *cmd;
488
    int val = 0;
489
490
 
491
        switch (*p) {
492
        case '0' ... '9':
493
            val = 10*val+(*p-'0');
494
            break;
495
        default:
496
            *cmd = p;
497
            return val;
498
        }
499
    }
500
}
501
502
 
503
{
504
    char c;
505
506
 
507
508
 
509
    {
510
        p--;
511
512
 
513
        if(*p == 'x') p++;
1239 serge 514
1233 serge 515
 
516
        if(*p == 'x') p++;
1239 serge 517
1233 serge 518
 
1239 serge 519
520
 
1233 serge 521
1239 serge 522
 
523
            mode->freq = 60;
524
    }
1233 serge 525
526
 
527
};
528
529
 
530
{
531
    char  c;
532
533
 
534
    p--;
535
    while( (c = *log++ = *p++) && (c != ' '));
536
    *log = 0;
537
538
 
539
};
540
541
 
542
{
543
    char *p = cmdline;
544
545
 
546
547
 
548
    {
549
        if( c == '-')
550
        {
551
            switch(*p++)
552
            {
553
                case 'm':
554
                    p = parse_mode(p, mode);
555
                    break;
556
557
 
558
                    p = parse_path(p, log);
559
                    break;
560
            };
561
        };
562
        c = *p++;
563
    };
564
};
565
566
 
1239 serge 567
 
568
{
569
    int err = -1;
570
571
 
572
573
 
574
575
 
576
    {
577
        *count = rdisplay->supported_modes;
578
        err = 0;
579
    }
580
    else if( mode != NULL )
581
    {
582
        struct drm_display_mode  *drmmode;
583
        int i = 0;
584
585
 
586
            *count = rdisplay->supported_modes;
587
588
 
589
        {
590
            if( i < *count)
591
            {
592
                mode->width  = drm_mode_width(drmmode);
593
                mode->height = drm_mode_height(drmmode);
594
                mode->bpp    = 32;
595
                mode->freq   = drm_mode_vrefresh(drmmode);
596
                i++;
597
                mode++;
598
            }
599
            else break;
600
        };
601
        *count = i;
602
        err = 0;
603
    };
604
    LEAVE();
605
    return err;
606
}
607
608
 
609
 
610
{
611
    int err = -1;
612
613
 
614
        (mode->height != 0)  &&
615
        (mode->freq   != 0 ) )
616
    {
617
        if( set_mode(rdisplay->ddev, rdisplay->connector, mode, true) )
618
            err = 0;
619
    };
620
621
 
622
};
623