Subversion Repositories Kolibri OS

Rev

Rev 3120 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3120 serge 1
 
2
#include 
3
#include "radeon.h"
4
#include "hmm.h"
5
#include "bitmap.h"
6
7
 
8
9
 
10
#define DRIVER_CAPS_1   0
11
12
 
13
14
 
15
16
 
17
18
 
19
 
20
{
21
//    dma_addr_t *pages = bitmap->obj->allocated_pages;
22
    int i;
23
24
 
25
    bitmap->handle = 0;
26
//    bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT;
27
//    bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU;
28
29
 
30
//    drm_gem_object_unreference(&bitmap->obj->base);
31
//    mutex_unlock(&main_device->struct_mutex);
32
33
 
34
//    {
35
//        for (i = 0; i < bitmap->page_count; i++)
36
//            FreePage(pages[i]);
37
38
 
39
40
 
41
//    };
42
    UserFree(bitmap->uaddr);
43
    __DestroyObject(bitmap);
44
};
45
46
 
47
static int bitmap_get_pages_gtt(struct drm_i915_gem_object *obj)
48
{
49
    int page_count;
50
51
 
52
     * at this point until we release them.
53
     */
54
55
 
56
    BUG_ON(obj->allocated_pages == NULL);
57
    BUG_ON(obj->pages.page != NULL);
58
59
 
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
};
95
96
 
97
 
98
 
99
{
100
    u32     handle;       // ignored
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 radeon_device *rdev = dev->dev_private;
117
    struct radeon_bo     *obj = NULL;
118
119
 
120
    u32         handle;
121
    u32         width, max_width;
122
    u32         height, max_height;
123
    u32         size,  max_size;
124
    u32         pitch, max_pitch;
125
    void       *uaddr;
126
    dma_addr_t *pages;
127
    u32         page_count;
128
129
 
130
131
 
132
133
 
134
    pbitmap->data   = (void*)-1;
135
136
 
137
    height = pbitmap->height;
138
139
 
140
        goto err1;
141
142
 
143
    max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height;
144
145
 
146
//    printf("%s %d\n",__FUNCTION__, handle);
147
148
 
149
        goto err1;
150
151
 
152
//    printf("bitmap %x\n", bitmap);
153
    if( bitmap == NULL)
154
        goto err2;
155
156
 
157
    bitmap->header.destroy = destroy_bitmap;
158
    bitmap->obj    = NULL;
159
160
 
161
162
 
163
    size =  roundup(pitch*height, PAGE_SIZE);
164
165
 
166
167
 
168
    max_size =  roundup(max_pitch*max_height, PAGE_SIZE);
169
170
 
171
172
 
173
174
 
175
        goto err3;
176
177
 
178
    if (unlikely(ret != 0))
179
        goto err3;
180
181
 
182
    if (unlikely(ret != 0))
183
        goto err3;
184
185
 
186
    if (unlikely(ret != 0))
187
        goto err3;
188
189
 
190
    bitmap->max_count  =  max_size/PAGE_SIZE;
191
192
 
3192 Serge 193
3120 serge 194
 
195
    bitmap->uaddr  = uaddr;
196
    bitmap->pitch  = pitch;
197
    bitmap->gaddr  = radeon_bo_gpu_offset(obj);
198
199
 
200
    bitmap->height = height;
201
    bitmap->max_width  = max_width;
202
    bitmap->max_height = max_height;
203
204
 
205
    bitmap->header.destroy = destroy_bitmap;
206
207
 
208
    pbitmap->data   = uaddr;
209
    pbitmap->pitch  = pitch;
210
211
 
212
 
213
            __FUNCTION__, handle, pitch, bitmap->gaddr, uaddr);
214
215
 
216
217
 
218
//    mutex_lock(&dev->struct_mutex);
219
//    drm_gem_object_unreference(&obj->base);
220
//    mutex_unlock(&dev->struct_mutex);
221
222
 
223
//    while (i--)
224
//        FreePage(pages[i]);
225
//    free(pages);
226
//    UserFree(uaddr);
227
228
 
229
    __DestroyObject(bitmap);
230
err2:
231
    free_handle(&bm_mm, handle);
232
err1:
233
    return -1;
234
};
235
236
 
237
 
238
{
239
    int ret;
240
241
 
242
243
 
244
        return -1;
245
246
 
247
248
 
249
        return -1;
250
/*
251
    mutex_lock(&main_device->struct_mutex);
252
    ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true);
253
    mutex_unlock(&main_device->struct_mutex);
254
255
 
256
    {
257
        pbitmap->data  = NULL;
258
        pbitmap->pitch = 0;
259
260
 
261
        return ret;
262
    };
263
*/
264
    pbitmap->data  = bitmap->uaddr;
265
    pbitmap->pitch = bitmap->pitch;
266
267
 
268
};
269
270
 
271
 
272
273
 
274
{
275
    bitmap_t  *bitmap;
276
    dma_addr_t page, *pages;
277
    u32        size, page_count;
278
    u32        width, height;
279
    u32        pitch;
280
    int        i;
281
    int        ret = 0;
282
283
 
284
 
285
        return -1;
286
287
 
288
289
 
290
        return -1;
291
292
 
293
        pbitmap->new_height > bitmap->max_height)
294
        return -1;
295
296
 
297
    height = pbitmap->new_height;
298
299
 
300
    size =  roundup(pitch * height, PAGE_SIZE);
301
    page_count = size/PAGE_SIZE;
302
303
 
304
            width, height, pitch, size);
305
306
 
307
    {
308
        char *vaddr = bitmap->uaddr + PAGE_SIZE * bitmap->page_count;
309
310
 
311
312
 
313
                bitmap->page_count, page_count, vaddr);
314
315
 
316
        {
317
            page = AllocPage();
318
            if ( page == 0 )
319
                goto err4;
320
            pages[i] = page;
321
            MapPage(vaddr, page, 0x207);        //map as shared page
322
        };
323
324
 
325
                  page_count - bitmap->page_count);
326
327
 
328
        i915_gem_object_unbind(bitmap->obj);
329
        bitmap->obj->base.size = size;
330
        bitmap->obj->pages.nents = page_count;
331
332
 
333
        if (ret)
334
            goto err4;
335
336
 
337
        bitmap->gaddr  = bitmap->obj->gtt_offset;
338
    }
339
    else if(page_count < bitmap->page_count)
340
    {
341
        char *vaddr = bitmap->uaddr + PAGE_SIZE * page_count;
342
343
 
344
        i915_gem_object_unbind(bitmap->obj);
345
346
 
347
348
 
349
                bitmap->page_count, page_count, vaddr);
350
351
 
352
        {
353
            MapPage(vaddr, 0, 0);        //unmap
354
355
 
356
            pages[i] = 0;
357
        };
358
359
 
360
                  bitmap->page_count - page_count);
361
362
 
363
        bitmap->obj->pages.nents = page_count;
364
365
 
366
        if (ret)
367
            goto err3;
368
369
 
370
        bitmap->gaddr  = bitmap->obj->gtt_offset;
371
    };
372
373
 
374
    bitmap->height = height;
375
    bitmap->pitch  = pitch;
376
377
 
378
 
379
    pbitmap->pitch = bitmap->pitch;
380
381
 
382
383
 
384
    while (i-- > bitmap->page_count)
385
        FreePage(pages[i]);
386
387
 
388
    return -1;
389
};
390
#endif
391
392
 
393
 
394
{
395
    int ret;
396
397
 
398
399
 
400
};
401
402
 
403
 
404
 
405
{
406
    int ret = 0;
407
408
 
409
    switch(caps->idx)
410
    {
411
        case 0:
412
            caps->opt[0] = DRIVER_CAPS_0;
413
            caps->opt[1] = DRIVER_CAPS_1;
414
            break;
415
416
 
417
            caps->cap1.max_tex_width  = 4096;
418
            caps->cap1.max_tex_height = 4096;
419
            break;
420
        default:
421
            ret = 1;
422
    };
423
    caps->idx = 1;
424
    LEAVE();
425
    return ret;
426
}
427
428
 
429
 
430
{
431
    struct radeon_device *rdev = main_drm_device->dev_private;
432
433
 
434
435
 
436
437
 
438
439
 
440
};
441
442
 
443
 
444
445
 
446
{
447
    struct radeon_device *rdev = dev->dev_private;
448
    struct context *context;
449
    struct io_call_10 io_10;
450
    int    slot = *((u8*)CURRENT_TASK);
451
    int    ret;
452
453
 
454
455
 
456
        return context;
457
458
 
459
460
 
461
    {
462
        ret = radeon_ib_get(rdev, RADEON_RING_TYPE_GFX_INDEX, &context->ib, NULL, 4096);
463
        if (ret) {
464
            DRM_ERROR("radeon: failed to get ib (%d).\n", ret);
465
            goto err;
466
        };
467
468
 
469
470
 
471
        context->mask  = NULL;
472
        context->seqno = 0;
473
        context->slot  = slot;
474
475
 
476
    };
477
    return context;
478
479
 
480
    __DestroyObject(context);
481
    return NULL;
482
};
483