Subversion Repositories Kolibri OS

Rev

Rev 6104 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1246 serge 1
 
2
#include 
5078 serge 3
#include "radeon.h"
1246 serge 4
#include "radeon_object.h"
5
#include "drm_fb_helper.h"
3120 serge 6
#include "hmm.h"
7
#include 
5354 serge 8
1246 serge 9
 
5078 serge 10
extern struct drm_gem_object  *main_fb_obj;
11
1246 serge 12
 
5078 serge 13
1986 serge 14
 
1246 serge 15
static void       __stdcall move_cursor_kms(cursor_t *cursor, int x, int y);
16
17
 
6321 serge 18
extern void __stdcall restore_cursor(int x, int y);
19
20
 
1246 serge 21
22
 
1313 serge 23
24
 
1246 serge 25
{
26
    struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
27
    struct radeon_device *rdev = crtc->dev->dev_private;
28
29
 
2004 serge 30
        WREG32(RADEON_MM_INDEX, EVERGREEN_CUR_CONTROL + radeon_crtc->crtc_offset);
31
        WREG32(RADEON_MM_DATA, EVERGREEN_CURSOR_EN |
32
               EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT));
33
    } else if (ASIC_IS_AVIVO(rdev)) {
34
        WREG32(RADEON_MM_INDEX, AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset);
1246 serge 35
        WREG32(RADEON_MM_DATA, AVIVO_D1CURSOR_EN |
36
                 (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT));
37
    } else {
38
        switch (radeon_crtc->crtc_id) {
39
        case 0:
40
            WREG32(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL);
41
            break;
42
        case 1:
43
            WREG32(RADEON_MM_INDEX, RADEON_CRTC2_GEN_CNTL);
44
            break;
45
        default:
46
            return;
47
        }
48
49
 
50
                      (RADEON_CRTC_CUR_MODE_24BPP << RADEON_CRTC_CUR_MODE_SHIFT)),
51
             ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK));
52
    }
53
}
54
55
 
56
{
57
    struct radeon_device *rdev = crtc->dev->dev_private;
58
    struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
59
    uint32_t cur_lock;
60
61
 
2004 serge 62
        cur_lock = RREG32(EVERGREEN_CUR_UPDATE + radeon_crtc->crtc_offset);
63
        if (lock)
64
            cur_lock |= EVERGREEN_CURSOR_UPDATE_LOCK;
65
        else
66
            cur_lock &= ~EVERGREEN_CURSOR_UPDATE_LOCK;
67
        WREG32(EVERGREEN_CUR_UPDATE + radeon_crtc->crtc_offset, cur_lock);
68
    } else if (ASIC_IS_AVIVO(rdev)) {
69
        cur_lock = RREG32(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset);
1246 serge 70
        if (lock)
71
            cur_lock |= AVIVO_D1CURSOR_UPDATE_LOCK;
72
        else
73
            cur_lock &= ~AVIVO_D1CURSOR_UPDATE_LOCK;
74
        WREG32(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset, cur_lock);
75
    } else {
76
        cur_lock = RREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset);
77
        if (lock)
78
            cur_lock |= RADEON_CUR_LOCK;
79
        else
80
            cur_lock &= ~RADEON_CUR_LOCK;
81
        WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, cur_lock);
82
    }
83
}
84
85
 
86
{
87
    struct radeon_device *rdev;
88
    struct radeon_crtc   *radeon_crtc;
89
    cursor_t *old;
90
    uint32_t  gpu_addr;
91
92
 
5078 serge 93
    radeon_crtc = to_radeon_crtc(os_display->crtc);
94
1246 serge 95
 
5078 serge 96
1246 serge 97
 
5078 serge 98
    gpu_addr = radeon_bo_gpu_offset(cursor->cobj);
5354 serge 99
1246 serge 100
 
2004 serge 101
        WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
102
               0);
103
        WREG32(EVERGREEN_CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
104
               gpu_addr);
105
    } else if (ASIC_IS_AVIVO(rdev)) {
106
        if (rdev->family >= CHIP_RV770)
107
            WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, 0);
108
        WREG32(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, gpu_addr);
1246 serge 109
    }
2004 serge 110
    else {
1246 serge 111
        radeon_crtc->legacy_display_base_addr = gpu_addr - rdev->mc.vram_start;
6104 serge 112
        /* offset is from DISP(2)_BASE_ADDRESS */
1246 serge 113
        WREG32(RADEON_CUR_OFFSET + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
6104 serge 114
    }
1246 serge 115
116
 
117
};
118
119
 
120
{
121
    struct radeon_device *rdev;
122
    rdev = (struct radeon_device *)os_display->ddev->dev_private;
5078 serge 123
    struct drm_crtc *crtc = os_display->crtc;
124
    struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1246 serge 125
126
 
127
    int hot_y = cursor->hot_y;
128
    int w = 32;
2004 serge 129
1246 serge 130
 
131
132
 
2004 serge 133
        WREG32(EVERGREEN_CUR_POSITION + radeon_crtc->crtc_offset,
134
               (x << 16) | y);
135
        WREG32(EVERGREEN_CUR_HOT_SPOT + radeon_crtc->crtc_offset,
136
               (hot_x << 16) | hot_y);
137
        WREG32(EVERGREEN_CUR_SIZE + radeon_crtc->crtc_offset,
138
               ((w - 1) << 16) | 31);
139
    } else if (ASIC_IS_AVIVO(rdev)) {
140
        WREG32(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset,
1246 serge 141
               (x << 16) | y);
142
        WREG32(AVIVO_D1CUR_HOT_SPOT + radeon_crtc->crtc_offset,
143
               (hot_x << 16) | hot_y);
144
        WREG32(AVIVO_D1CUR_SIZE + radeon_crtc->crtc_offset,
145
               ((w - 1) << 16) | 31);
146
    } else {
147
        if (crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)
148
            y *= 2;
149
150
 
1404 serge 151
        int       xorg =0, yorg=0;
152
153
 
154
        y = y - hot_y;
155
156
 
157
        {
158
            xorg = -x + 1;
159
            x = 0;
160
        }
161
162
 
163
        {
164
            yorg = -hot_y + 1;
165
            y = 0;
166
        };
167
168
 
169
               (RADEON_CUR_LOCK | (xorg << 16) | yorg ));
170
        WREG32(RADEON_CUR_HORZ_VERT_POSN,
171
               (RADEON_CUR_LOCK | (x << 16) | y));
1246 serge 172
173
 
5354 serge 174
1404 serge 175
 
1246 serge 176
        WREG32(RADEON_CUR_OFFSET,
1404 serge 177
         (gpu_addr - rdev->mc.vram_start + (yorg * 256)));
1430 serge 178
    }
1246 serge 179
    radeon_lock_cursor_kms(crtc, false);
180
}
181
182
 
183
{
184
    static char name[4];
185
186
 
187
    name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@';
188
    name[2] = (x[1] & 0x1F) + '@';
189
    name[3] = 0;
190
191
 
192
}
193
194
 
5078 serge 195
                    struct drm_crtc *crtc, videomode_t *reqmode, bool strict)
196
{
1246 serge 197
    struct drm_display_mode  *mode = NULL, *tmpmode;
198
    struct drm_framebuffer  *fb         = NULL;
5078 serge 199
    struct drm_mode_set     set;
200
    const char *con_name;
201
    unsigned hdisplay, vdisplay;
202
    int ret;
203
1246 serge 204
 
5078 serge 205
1986 serge 206
 
1246 serge 207
    {
208
        if( (tmpmode->hdisplay == reqmode->width)  &&
5078 serge 209
            (tmpmode->vdisplay == reqmode->height) &&
210
            (drm_mode_vrefresh(tmpmode) == reqmode->freq) )
1246 serge 211
        {
212
            mode = tmpmode;
213
            goto do_set;
214
        }
215
	};
5078 serge 216
1246 serge 217
 
218
    {
219
        list_for_each_entry(tmpmode, &connector->modes, head)
220
        {
221
            if( (tmpmode->hdisplay == reqmode->width)  &&
5078 serge 222
                (tmpmode->vdisplay == reqmode->height) )
223
            {
1246 serge 224
                mode = tmpmode;
225
                goto do_set;
226
            }
227
       };
5078 serge 228
    };
1246 serge 229
230
 
5078 serge 231
232
 
233
234
 
1246 serge 235
236
 
5078 serge 237
1246 serge 238
 
5078 serge 239
              reqmode->width, reqmode->height, crtc->base.id,
240
              con_name);
241
1246 serge 242
 
5078 serge 243
1246 serge 244
 
5078 serge 245
    vdisplay = mode->vdisplay;
246
1246 serge 247
 
5078 serge 248
1246 serge 249
 
5078 serge 250
    fb->height = reqmode->height;
251
1246 serge 252
 
5078 serge 253
    fb->pitches[1] =
254
    fb->pitches[2] =
255
    fb->pitches[3] = radeon_align_pitch(dev->dev_private, reqmode->width, 32, false) * ((32 + 1) / 8);
256
    fb->bits_per_pixel = 32;
257
    fb->depth = 24;
258
1246 serge 259
 
5078 serge 260
    os_display->crtc = crtc;
261
1986 serge 262
 
5078 serge 263
    set.x = 0;
264
    set.y = 0;
265
    set.mode = mode;
266
    set.connectors = &connector;
267
    set.num_connectors = 1;
268
    set.fb = fb;
269
2997 Serge 270
 
5078 serge 271
1246 serge 272
 
5078 serge 273
1246 serge 274
 
5078 serge 275
    radeon_show_cursor_kms(crtc);
276
1246 serge 277
 
5078 serge 278
    {
279
        os_display->width    = fb->width;
280
        os_display->height   = fb->height;
281
        os_display->vrefresh = drm_mode_vrefresh(mode);
282
1246 serge 283
 
5078 serge 284
1246 serge 285
 
5078 serge 286
                       fb->width, fb->height, fb->pitches[0]);
2997 Serge 287
    }
1246 serge 288
    else
5078 serge 289
        DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
290
                   fb->width, fb->height, crtc);
291
1246 serge 292
 
293
}
5078 serge 294
1246 serge 295
 
296
{
297
    struct drm_display_mode  *mode;
298
    int count = 0;
299
300
 
301
    {
302
        count++;
303
    };
304
    return count;
305
};
306
307
 
5078 serge 308
{
1246 serge 309
    struct drm_crtc *tmp_crtc;
5078 serge 310
    int crtc_mask = 1;
311
312
 
313
    {
314
        if (encoder->possible_crtcs & crtc_mask)
315
        {
316
            encoder->crtc = tmp_crtc;
317
            DRM_DEBUG_KMS("use CRTC %p ID %d\n", tmp_crtc, tmp_crtc->base.id);
318
            return tmp_crtc;
319
        };
320
        crtc_mask <<= 1;
321
    };
322
    return NULL;
323
};
324
325
 
326
                  struct drm_crtc **boot_crtc)
327
{
328
    struct drm_connector_helper_funcs *connector_funcs;
1963 serge 329
    struct drm_connector *connector;
5078 serge 330
    struct drm_encoder   *encoder;
331
    struct drm_crtc      *crtc;
332
1963 serge 333
 
1246 serge 334
    {
335
        if( connector->status != connector_status_connected)
336
            continue;
337
338
 
5078 serge 339
1246 serge 340
 
5078 serge 341
        {
342
            connector_funcs = connector->helper_private;
343
            encoder = connector_funcs->best_encoder(connector);
344
1963 serge 345
 
5078 serge 346
            {
347
                DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n",
348
                        connector, connector->base.id);
349
                continue;
350
            };
351
        }
352
353
 
1246 serge 354
        if(crtc == NULL)
5078 serge 355
            crtc = get_possible_crtc(dev, encoder);
356
1963 serge 357
 
5078 serge 358
        {
359
            *boot_connector = connector;
360
            *boot_crtc = crtc;
361
            connector->encoder = encoder;
362
            DRM_DEBUG_KMS("CONNECTOR %p ID:%d status:%d ENCODER %p ID: %d CRTC %p ID:%d\n",
363
                           connector, connector->base.id, connector->status,
364
                           encoder, encoder->base.id, crtc, crtc->base.id );
365
            return 0;
366
        }
367
        else
368
            DRM_DEBUG_KMS("No CRTC for encoder %d\n", encoder->base.id);
369
1246 serge 370
 
371
372
 
5078 serge 373
};
1246 serge 374
375
 
5078 serge 376
{
377
    struct drm_display_mode *mode;
378
1986 serge 379
 
5078 serge 380
    {
381
        DRM_DEBUG_KMS("check mode w:%d h:%d %dHz\n",
382
                mode->hdisplay, mode->vdisplay,
383
                drm_mode_vrefresh(mode));
384
1986 serge 385
 
5078 serge 386
            os_display->height == mode->vdisplay &&
387
            drm_mode_vrefresh(mode) == 60)
388
        {
389
            usermode->width  = os_display->width;
390
            usermode->height = os_display->height;
391
            usermode->freq   = 60;
392
            return 1;
393
        }
394
    }
395
    return 0;
396
}
397
398
 
399
{
1246 serge 400
    struct drm_connector_helper_funcs *connector_funcs;
2997 Serge 401
    struct drm_connector    *connector = NULL;
5078 serge 402
    struct drm_crtc         *crtc = NULL;
2997 Serge 403
    struct drm_framebuffer  *fb;
404
405
 
5271 serge 406
    u32        ifl;
407
    int        ret;
5078 serge 408
1246 serge 409
 
5078 serge 410
1986 serge 411
 
5078 serge 412
    if(ret)
413
    {
2997 Serge 414
        DRM_DEBUG_KMS("No active connectors!\n");
5078 serge 415
        mutex_unlock(&dev->mode_config.mutex);
416
        return -1;
2997 Serge 417
    };
418
419
 
420
        struct drm_display_mode *tmp, *native = NULL;
5078 serge 421
        struct radeon_device *rdev = dev->dev_private;
422
2997 Serge 423
 
424
            if (tmp->hdisplay > 16384 ||
5078 serge 425
                tmp->vdisplay > 16384)
426
                continue;
2997 Serge 427
            if (tmp->type & DRM_MODE_TYPE_PREFERRED)
428
            {
429
                native = tmp;
430
                break;
431
            };
432
        }
433
434
 
5078 serge 435
        {
1246 serge 436
            struct radeon_encoder *radeon_encoder = to_radeon_encoder(connector->encoder);
5078 serge 437
            radeon_encoder->rmx_type = RMX_FULL;
438
            radeon_encoder->native_mode = *native;
439
        };
1246 serge 440
    }
5078 serge 441
1246 serge 442
 
5078 serge 443
    mutex_lock(&dev->object_name_lock);
444
    idr_preload(GFP_KERNEL);
445
1986 serge 446
 
5078 serge 447
        ret = idr_alloc(&dev->object_name_idr, &main_fb_obj, 1, 0, GFP_NOWAIT);
448
1986 serge 449
 
5078 serge 450
1986 serge 451
 
5078 serge 452
        drm_gem_object_reference(main_fb_obj);
453
1986 serge 454
 
5078 serge 455
    }
456
1986 serge 457
 
5078 serge 458
    mutex_unlock(&dev->object_name_lock);
459
    drm_gem_object_unreference(main_fb_obj);
460
#endif
461
1986 serge 462
 
5078 serge 463
    os_display->ddev = dev;
464
    os_display->connector = connector;
465
    os_display->crtc = crtc;
466
1986 serge 467
 
5078 serge 468
1986 serge 469
 
2997 Serge 470
    {
471
        list_for_each_entry(cursor, &os_display->cursors, list)
5078 serge 472
        {
2997 Serge 473
            init_cursor(cursor);
474
        };
475
1986 serge 476
 
5078 serge 477
        os_display->init_cursor    = init_cursor;
478
        os_display->select_cursor  = select_cursor_kms;
479
        os_display->show_cursor    = NULL;
480
        os_display->move_cursor    = move_cursor_kms;
481
        os_display->restore_cursor = restore_cursor;
482
        os_display->disable_mouse  = disable_mouse;
483
        select_cursor_kms(os_display->cursor);
484
    };
1246 serge 485
    safe_sti(ifl);
2997 Serge 486
1246 serge 487
 
1986 serge 488
 
5078 serge 489
//              os_display->width, os_display->height, os_display->vrefresh);
490
//    dbgprintf("user mode mode %d x %d x %d\n",
491
//              usermode->width, usermode->height, usermode->freq);
492
1268 serge 493
 
5078 serge 494
        (usermode->height == 0))
495
    {
1246 serge 496
        if( !get_boot_mode(connector, usermode))
5078 serge 497
        {
498
            struct drm_display_mode *mode;
499
1246 serge 500
 
5078 serge 501
            usermode->width  = mode->hdisplay;
502
            usermode->height = mode->vdisplay;
503
            usermode->freq   = drm_mode_vrefresh(mode);
504
        };
505
    };
2997 Serge 506
1246 serge 507
 
5078 serge 508
1268 serge 509
 
5078 serge 510
1246 serge 511
 
5078 serge 512
3120 serge 513
 
5078 serge 514
};
1246 serge 515
516
 
5078 serge 517
 
518
{
1246 serge 519
    int err = -1;
520
521
 
522
    {
523
        *count = os_display->supported_modes;
5078 serge 524
        err = 0;
1246 serge 525
    }
526
    else if( mode != NULL )
527
    {
528
        struct drm_display_mode  *drmmode;
529
        int i = 0;
530
531
 
5078 serge 532
            *count = os_display->supported_modes;
533
1246 serge 534
 
5078 serge 535
        {
1246 serge 536
            if( i < *count)
537
            {
538
                mode->width  = drmmode->hdisplay;
5078 serge 539
                mode->height = drmmode->vdisplay;
540
                mode->bpp    = 32;
1246 serge 541
                mode->freq   = drm_mode_vrefresh(drmmode);
542
                i++;
543
                mode++;
544
            }
545
            else break;
546
        };
547
        *count = i;
548
        err = 0;
549
    };
550
    return err;
551
};
5078 serge 552
1246 serge 553
 
1403 serge 554
{
1246 serge 555
    int err = -1;
556
557
 
558
        (mode->height != 0)  &&
559
        (mode->freq   != 0 ) &&
560
        ( (mode->width   != os_display->width)  ||
5078 serge 561
          (mode->height  != os_display->height) ||
562
          (mode->freq    != os_display->vrefresh) ) )
563
    {
1246 serge 564
        return set_mode(os_display->ddev, os_display->connector, os_display->crtc, mode, true);
5078 serge 565
    };
1246 serge 566
567
 
5078 serge 568
};
1246 serge 569
570
 
1986 serge 571
 
1404 serge 572
 
1986 serge 573
 
2997 Serge 574
 
3764 Serge 575
typedef struct
3120 serge 576
{
577
    int left;
578
    int top;
579
    int right;
580
    int bottom;
581
}rect_t;
582
583
 
584
struct drm_device *main_device;
5078 serge 585
3120 serge 586
 
587
588
 
589
590
 
591
{
592
    u32_t   addr;
593
594
 
5078 serge 595
    addr+= sizeof(display_t);            /*  shoot me  */
3120 serge 596
    return *(u32_t*)addr;
597
}
598
599
 
600
#include "r100d.h"
601
602
 
3764 Serge 603
# define PACKET3_TRANS_BITBLT           0x9C
3124 serge 604
# define R5XX_SRC_CMP_EQ_COLOR      (4 <<  0)
605
# define R5XX_SRC_CMP_NEQ_COLOR     (5 <<  0)
606
# define R5XX_CLR_CMP_SRC_SOURCE    (1 << 24)
607
3120 serge 608
 
609
               int src_x, int src_y, u32 w, u32 h)
610
{
611
    struct context *context;
612
613
 
614
    rect_t     winrc;
615
    clip_t     dst_clip;
616
    clip_t     src_clip;
617
    u32_t      width;
618
    u32_t      height;
619
620
 
621
    u32_t      offset;
622
    u8         slot;
623
    int        n=0;
624
    int        ret;
625
626
 
627
        return -1;
628
629
 
630
631
 
632
        return -1;
633
634
 
635
    if(unlikely(context == NULL))
636
        return -1;
637
638
 
639
    {
640
        static warn_count;
641
642
 
643
        {
644
            printf("left %d top %d right %d bottom %d\n",
645
                    winrc.left, winrc.top, winrc.right, winrc.bottom);
646
            printf("bitmap width %d height %d\n", w, h);
647
            warn_count++;
648
        };
649
    };
650
651
 
652
 
653
    dst_clip.ymin   = 0;
654
    dst_clip.xmax   = winrc.right-winrc.left;
655
    dst_clip.ymax   = winrc.bottom -winrc.top;
656
657
 
658
    src_clip.ymin   = 0;
659
    src_clip.xmax   = bitmap->width  - 1;
660
    src_clip.ymax   = bitmap->height - 1;
661
662
 
663
    height = h;
664
665
 
666
                  &src_clip, &src_x, &src_y,
667
                  &width, &height) )
668
        return 0;
669
670
 
671
    dst_y+= winrc.top;
672
673
 
674
675
 
676
677
 
678
#if 0
3124 serge 679
#else
3120 serge 680
        u8* src_offset;
681
        u8* dst_offset;
682
        u32 color;
3124 serge 683
684
 
3120 serge 685
686
 
687
        src_offset += (u32)bitmap->uaddr;
688
689
 
5078 serge 690
        dst_offset+= get_display_map();
3120 serge 691
692
 
693
694
 
695
        while( tmp_h--)
696
        {
697
            u32 tmp_w = width;
3124 serge 698
3120 serge 699
 
3124 serge 700
            u8*  tmp_dst = dst_offset;
3764 Serge 701
3120 serge 702
 
703
            dst_offset+= os_display->width;
5078 serge 704
3120 serge 705
 
706
            {
707
                color = *tmp_src;
3124 serge 708
709
 
710
                    color |= 0xFF000000;
711
                else
712
                    color = 0x00;
713
714
 
715
                tmp_src++;
716
                tmp_dst++;
3120 serge 717
            };
718
        };
719
      safe_sti(ifl);
720
#endif
721
    }
722
723
 
724
        static warn_count;
725
726
 
727
        {
728
            printf("blit width %d height %d\n",
729
                    width, height);
730
            warn_count++;
731
        };
732
    };
733
734
 
735
 
736
//        context->cmd_buffer&= 0xFFFFF000;
737
738
 
739
740
 
741
742
 
743
 
744
745
 
746
    struct radeon_ib *ib = &context->ib;
747
748
 
3124 serge 749
    ib->ptr[1] = 0xFFFFFFFF;
750
    ib->ptr[2] = PACKET3(PACKET3_TRANS_BITBLT, 11);
751
    ib->ptr[3] =  RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
752
                  RADEON_GMC_DST_PITCH_OFFSET_CNTL |
3120 serge 753
                  RADEON_GMC_SRC_CLIPPING |
754
                  RADEON_GMC_DST_CLIPPING |
755
                  RADEON_GMC_BRUSH_NONE |
756
                  (RADEON_COLOR_FORMAT_ARGB8888 << 8) |
757
                  RADEON_GMC_SRC_DATATYPE_COLOR |
758
                  RADEON_ROP3_S |
759
                  RADEON_DP_SRC_SOURCE_MEMORY |
760
                  RADEON_GMC_WR_MSK_DIS;
761
762
 
3124 serge 763
    ib->ptr[5] = ((os_display->pitch/64) << 22) | (rdev->mc.vram_start >> 10);
5078 serge 764
    ib->ptr[6] = (0x1fff) | (0x1fff << 16);
3120 serge 765
    ib->ptr[7] = 0;
3124 serge 766
    ib->ptr[8] = (0x1fff) | (0x1fff << 16);
767
3120 serge 768
 
3124 serge 769
    ib->ptr[10] = 0x00000000;
770
    ib->ptr[11] = 0xFFFFFFFF;
771
3120 serge 772
 
3124 serge 773
    ib->ptr[13] = (dst_x << 16) | dst_y;
774
    ib->ptr[14] = (width << 16) | height;
775
776
 
3120 serge 777
778
 
779
780
 
781
    if (ret) {
782
        DRM_ERROR("radeon: failed to schedule ib (%d).\n", ret);
783
        goto fail;
784
    }
785
786
 
787
    if (ret) {
788
        DRM_ERROR("radeon: fence wait failed (%d).\n", ret);
789
        goto fail;
790
    }
791
792
 
3192 Serge 793
794
 
3120 serge 795
    return ret;
796
};
797
798
 
3764 Serge 799