Subversion Repositories Kolibri OS

Rev

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