Subversion Repositories Kolibri OS

Rev

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