Subversion Repositories Kolibri OS

Rev

Rev 1963 | Rev 2004 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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