Subversion Repositories Kolibri OS

Rev

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