Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2340 Serge 1
 
3033 serge 2
#include 
3
#include "i915_drv.h"
2340 Serge 4
#include "intel_drv.h"
5
#include "hmm.h"
3033 serge 6
#include "bitmap.h"
2340 Serge 7
8
 
3243 Serge 9
10
 
11
#define DRIVER_CAPS_1   0
3033 serge 12
2352 Serge 13
 
3033 serge 14
2352 Serge 15
 
3033 serge 16
2351 Serge 17
 
18
19
 
20
 
2342 Serge 21
{
22
    dma_addr_t *pages = bitmap->obj->allocated_pages;
3037 serge 23
    int i;
3033 serge 24
25
 
26
    bitmap->handle = 0;
2344 Serge 27
    bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT;
2351 Serge 28
    bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU;
29
30
 
31
    drm_gem_object_unreference(&bitmap->obj->base);
2344 Serge 32
    mutex_unlock(&main_device->struct_mutex);
2351 Serge 33
34
 
3033 serge 35
    {
36
        for (i = 0; i < bitmap->page_count; i++)
37
            FreePage(pages[i]);
38
39
 
3039 serge 40
3037 serge 41
 
3033 serge 42
    };
43
    UserFree(bitmap->uaddr);
44
    __DestroyObject(bitmap);
2342 Serge 45
};
46
47
 
3033 serge 48
 
49
{
2340 Serge 50
    int page_count;
3033 serge 51
2340 Serge 52
 
3033 serge 53
     * at this point until we release them.
54
     */
55
3039 serge 56
 
3033 serge 57
    BUG_ON(obj->allocated_pages == NULL);
58
    BUG_ON(obj->pages.page != NULL);
59
2340 Serge 60
 
3033 serge 61
    obj->pages.nents = page_count;
62
63
 
64
 
65
//       i915_gem_object_do_bit_17_swizzle(obj);
66
67
 
68
}
69
70
 
71
{
72
    int ret, i;
73
74
 
75
76
 
77
    if (ret) {
78
        /* In the event of a disaster, abandon all caches and
79
         * hope for the best.
80
         */
81
        WARN_ON(ret != -EIO);
82
        i915_gem_clflush_object(obj);
83
        obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
84
    }
85
86
 
87
        obj->dirty = 0;
88
89
 
90
}
91
92
 
93
    .get_pages = bitmap_get_pages_gtt,
94
    .put_pages = bitmap_put_pages_gtt,
95
};
2340 Serge 96
97
 
98
 
3033 serge 99
 
100
struct  io_call_10         /*     SRV_CREATE_SURFACE    */
101
{
2340 Serge 102
    u32     handle;       // ignored
3033 serge 103
    void   *data;         // ignored
104
105
 
106
    u32     height;
107
    u32     pitch;        // ignored
108
109
 
110
    u32     max_height;
111
    u32     format;       // reserved mbz
112
};
113
114
 
115
116
 
117
{
118
    struct drm_i915_gem_object *obj;
2340 Serge 119
120
 
121
    u32         handle;
122
    u32         width, max_width;
2344 Serge 123
    u32         height, max_height;
124
    u32         size,  max_size;
125
    u32         pitch, max_pitch;
126
    void       *uaddr;
2340 Serge 127
    dma_addr_t *pages;
3033 serge 128
    u32         page_count;
129
2340 Serge 130
 
3033 serge 131
132
 
2340 Serge 133
134
 
135
    pbitmap->data   = (void*)-1;
2344 Serge 136
2340 Serge 137
 
2344 Serge 138
    height = pbitmap->height;
2342 Serge 139
140
 
3033 serge 141
        goto err1;
2340 Serge 142
143
 
3033 serge 144
    if( ((pbitmap->max_width !=0 ) &&
2344 Serge 145
         (pbitmap->max_width < width)) ||
146
         (pbitmap->max_width > 4096) )
147
        goto err1;
148
149
 
150
         (pbitmap->max_height < width)) ||
151
         (pbitmap->max_height > 4096) )
152
        goto err1;
153
154
 
155
        goto err1;
156
*/
157
158
 
159
    max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height;
160
161
 
3033 serge 162
//    printf("%s %d\n",__FUNCTION__, handle);
2342 Serge 163
2340 Serge 164
 
165
        goto err1;
166
167
 
168
//    printf("bitmap %x\n", bitmap);
2361 Serge 169
    if( bitmap == NULL)
170
        goto err2;
3033 serge 171
2361 Serge 172
 
2342 Serge 173
    bitmap->header.destroy = destroy_bitmap;
174
    bitmap->obj    = NULL;
175
176
 
3033 serge 177
2340 Serge 178
 
179
    size =  roundup(pitch*height, PAGE_SIZE);
180
2344 Serge 181
 
2342 Serge 182
2340 Serge 183
 
2344 Serge 184
    max_size =  roundup(max_pitch*max_height, PAGE_SIZE);
185
186
 
3033 serge 187
188
 
2344 Serge 189
    if( uaddr == NULL)
2340 Serge 190
        goto err3;
3033 serge 191
    else
2340 Serge 192
    {
193
        u32           max_count;
3033 serge 194
        dma_addr_t    page;
195
        char *vaddr = uaddr;
196
2340 Serge 197
 
3033 serge 198
        max_count = max_size/PAGE_SIZE;
199
2340 Serge 200
 
3033 serge 201
        if( pages == NULL)
202
            goto err4;
203
2340 Serge 204
 
3033 serge 205
        {
2340 Serge 206
            page = AllocPage();
3033 serge 207
            if ( page == 0 )
208
                goto err4;
209
            pages[i] = page;
210
211
 
212
        };
2340 Serge 213
        for(;i < max_count; i++, vaddr+= PAGE_SIZE)
3051 serge 214
        {
215
            MapPage(vaddr, 0, 0);        //map as shared page
216
        };
217
218
 
3033 serge 219
        bitmap->max_count  = max_count;
220
    };
221
2340 Serge 222
 
3037 serge 223
224
 
3033 serge 225
    if (obj == NULL)
226
        goto err4;
227
228
 
229
    obj->allocated_pages = pages;
230
231
 
232
    if (ret)
233
        goto err5;
234
235
 
3243 Serge 236
2351 Serge 237
 
2340 Serge 238
    bitmap->uaddr  = uaddr;
2344 Serge 239
    bitmap->pitch  = pitch;
240
    bitmap->gaddr  = obj->gtt_offset;
241
242
 
2340 Serge 243
    bitmap->height = height;
244
    bitmap->max_width  = max_width;
2344 Serge 245
    bitmap->max_height = max_height;
246
247
 
2340 Serge 248
    bitmap->header.destroy = destroy_bitmap;
2342 Serge 249
2340 Serge 250
 
251
    pbitmap->data   = uaddr;
252
    pbitmap->pitch  = pitch;
2344 Serge 253
2342 Serge 254
 
255
 
3037 serge 256
            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
2344 Serge 257
258
 
2340 Serge 259
260
 
3033 serge 261
    mutex_lock(&dev->struct_mutex);
262
    drm_gem_object_unreference(&obj->base);
263
    mutex_unlock(&dev->struct_mutex);
264
265
 
2340 Serge 266
    while (i--)
3033 serge 267
        FreePage(pages[i]);
268
    free(pages);
269
    UserFree(uaddr);
270
271
 
2340 Serge 272
    __DestroyObject(bitmap);
3033 serge 273
err2:
2340 Serge 274
    free_handle(&bm_mm, handle);
3033 serge 275
err1:
2340 Serge 276
    return -1;
277
};
278
279
 
280
 
2352 Serge 281
{
282
    int ret;
283
2344 Serge 284
 
2352 Serge 285
286
 
287
        return -1;
288
289
 
3033 serge 290
2352 Serge 291
 
292
        return -1;
293
294
 
3037 serge 295
    ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true);
3033 serge 296
    mutex_unlock(&main_device->struct_mutex);
3037 serge 297
3033 serge 298
 
299
    {
2352 Serge 300
        pbitmap->data  = NULL;
301
        pbitmap->pitch = 0;
302
303
 
304
        return ret;
305
    };
306
307
 
308
    pbitmap->pitch = bitmap->pitch;
309
310
 
311
};
312
313
 
2361 Serge 314
 
3039 serge 315
{
316
    bitmap_t  *bitmap;
317
    dma_addr_t page, *pages;
318
    u32        size, page_count;
319
    u32        width, height;
320
    u32        pitch;
321
    int        i;
322
    int        ret = 0;
323
2340 Serge 324
 
325
 
3039 serge 326
        return -1;
327
328
 
329
330
 
331
        return -1;
332
333
 
334
        pbitmap->new_height > bitmap->max_height)
335
        return -1;
336
337
 
338
    height = pbitmap->new_height;
339
340
 
341
    size =  roundup(pitch * height, PAGE_SIZE);
342
    page_count = size/PAGE_SIZE;
343
344
 
345
            width, height, pitch, size);
346
347
 
3051 serge 348
    {
3039 serge 349
        char *vaddr = bitmap->uaddr + PAGE_SIZE * bitmap->page_count;
350
351
 
352
353
 
354
                bitmap->page_count, page_count, vaddr);
355
356
 
357
        {
358
            page = AllocPage();
359
            if ( page == 0 )
360
                goto err4;
361
            pages[i] = page;
362
            MapPage(vaddr, page, 0x207);        //map as shared page
363
        };
364
365
 
366
                  page_count - bitmap->page_count);
367
368
 
369
        i915_gem_object_unbind(bitmap->obj);
370
        bitmap->obj->base.size = size;
371
        bitmap->obj->pages.nents = page_count;
372
373
 
374
        if (ret)
375
            goto err4;
376
377
 
378
        bitmap->gaddr  = bitmap->obj->gtt_offset;
379
    }
3051 serge 380
    else if(page_count < bitmap->page_count)
381
    {
382
        char *vaddr = bitmap->uaddr + PAGE_SIZE * page_count;
383
384
 
385
        i915_gem_object_unbind(bitmap->obj);
386
387
 
388
389
 
390
                bitmap->page_count, page_count, vaddr);
391
392
 
393
        {
394
            MapPage(vaddr, 0, 0);        //unmap
395
396
 
397
            pages[i] = 0;
398
        };
3243 Serge 399
3039 serge 400
 
3051 serge 401
                  bitmap->page_count - page_count);
402
3039 serge 403
 
3051 serge 404
        bitmap->obj->pages.nents = page_count;
405
406
 
407
        if (ret)
408
            goto err3;
409
410
 
411
        bitmap->gaddr  = bitmap->obj->gtt_offset;
412
    };
3039 serge 413
414
 
3051 serge 415
    bitmap->height = height;
416
    bitmap->pitch  = pitch;
417
418
 
419
 
3039 serge 420
    pbitmap->pitch = bitmap->pitch;
421
422
 
423
424
 
425
    while (i-- > bitmap->page_count)
426
        FreePage(pages[i]);
427
428
 
3051 serge 429
    return -1;
3039 serge 430
};
431
432
 
433
 
3033 serge 434
{
435
    int ret;
436
2340 Serge 437
 
3033 serge 438
2340 Serge 439
 
3033 serge 440
};
2340 Serge 441
442
 
443
 
444
 
3033 serge 445
{
2340 Serge 446
    int ret = 0;
3033 serge 447
2340 Serge 448
 
3033 serge 449
    {
450
        case 0:
451
            caps->opt[0] = DRIVER_CAPS_0;
452
            caps->opt[1] = DRIVER_CAPS_1;
453
            break;
454
2340 Serge 455
 
3033 serge 456
            caps->cap1.max_tex_width  = 4096;
457
            caps->cap1.max_tex_height = 4096;
458
            break;
459
        default:
460
            ret = 1;
461
    };
2340 Serge 462
    caps->idx = 1;
3033 serge 463
    return ret;
2340 Serge 464
}
3033 serge 465
2340 Serge 466
 
467
 
3033 serge 468
{
2351 Serge 469
    DRM_DEBUG("destroy context %x\n", context);
3037 serge 470
2351 Serge 471
 
3033 serge 472
2351 Serge 473
 
3051 serge 474
475
 
3033 serge 476
    drm_gem_object_unreference(&context->obj->base);
477
    mutex_unlock(&main_device->struct_mutex);
478
2351 Serge 479
 
3033 serge 480
};
481
2351 Serge 482
 
483
 
3033 serge 484
2351 Serge 485
 
3033 serge 486
{
2351 Serge 487
    struct context *context;
3033 serge 488
    struct io_call_10 io_10;
489
    int    slot = *((u8*)CURRENT_TASK);
490
    int    ret;
2351 Serge 491
492
 
3033 serge 493
2351 Serge 494
 
3033 serge 495
        return context;
496
497
 
498
3037 serge 499
 
3033 serge 500
    {
2351 Serge 501
        drm_i915_private_t *dev_priv = dev->dev_private;
3033 serge 502
        struct drm_i915_gem_object *obj;
503
2351 Serge 504
 
3033 serge 505
        i915_gem_object_pin(obj, 4096, true, true);
506
2351 Serge 507
 
3033 serge 508
        context->cmd_buffer = MapIoMem((addr_t)obj->pages.page[0], 4096, PG_SW|PG_NOCACHE);
509
        context->cmd_offset = obj->gtt_offset;
510
2351 Serge 511
 
3033 serge 512
        context->mask  = NULL;
513
        context->seqno = 0;
514
        context->slot  = slot;
515
2351 Serge 516
 
3033 serge 517
    };
2351 Serge 518
    return context;
3033 serge 519
};
520