Subversion Repositories Kolibri OS

Rev

Rev 3033 | 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
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
 
3037 serge 39
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
    page_count = obj->base.size / PAGE_SIZE;
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
        bitmap->page_count = page_count;
3033 serge 212
        bitmap->max_count  = max_count;
213
    };
214
2340 Serge 215
 
3037 serge 216
217
 
3033 serge 218
    if (obj == NULL)
219
        goto err4;
220
221
 
222
    obj->allocated_pages = pages;
223
224
 
225
    if (ret)
226
        goto err5;
227
228
 
2351 Serge 229
230
 
2340 Serge 231
    bitmap->uaddr  = uaddr;
2344 Serge 232
    bitmap->pitch  = pitch;
233
    bitmap->gaddr  = obj->gtt_offset;
234
235
 
2340 Serge 236
    bitmap->height = height;
237
    bitmap->max_width  = max_width;
2344 Serge 238
    bitmap->max_height = max_height;
239
240
 
2340 Serge 241
    bitmap->header.destroy = destroy_bitmap;
2342 Serge 242
2340 Serge 243
 
244
    pbitmap->data   = uaddr;
245
    pbitmap->pitch  = pitch;
2344 Serge 246
2342 Serge 247
 
248
 
3037 serge 249
            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
2344 Serge 250
251
 
2340 Serge 252
253
 
3033 serge 254
    mutex_lock(&dev->struct_mutex);
255
    drm_gem_object_unreference(&obj->base);
256
    mutex_unlock(&dev->struct_mutex);
257
258
 
2340 Serge 259
    while (i--)
3033 serge 260
        FreePage(pages[i]);
261
    free(pages);
262
    UserFree(uaddr);
263
264
 
2340 Serge 265
    __DestroyObject(bitmap);
3033 serge 266
err2:
2340 Serge 267
    free_handle(&bm_mm, handle);
3033 serge 268
err1:
2340 Serge 269
    return -1;
270
};
271
272
 
273
 
2352 Serge 274
{
275
    int ret;
276
2344 Serge 277
 
2352 Serge 278
279
 
280
        return -1;
281
282
 
3033 serge 283
2352 Serge 284
 
285
        return -1;
286
287
 
3037 serge 288
    ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true);
3033 serge 289
    mutex_unlock(&main_device->struct_mutex);
3037 serge 290
3033 serge 291
 
292
    {
2352 Serge 293
        pbitmap->data  = NULL;
294
        pbitmap->pitch = 0;
295
296
 
297
        return ret;
298
    };
299
300
 
301
    pbitmap->pitch = bitmap->pitch;
302
303
 
304
};
305
306
 
2361 Serge 307
 
2340 Serge 308
 
309
 
3033 serge 310
{
311
    int ret;
312
2340 Serge 313
 
3033 serge 314
2340 Serge 315
 
3033 serge 316
};
2340 Serge 317
318
 
319
 
320
 
3033 serge 321
{
2340 Serge 322
    int ret = 0;
3033 serge 323
2340 Serge 324
 
3033 serge 325
    {
326
        case 0:
327
            caps->opt[0] = DRIVER_CAPS_0;
328
            caps->opt[1] = DRIVER_CAPS_1;
329
            break;
330
2340 Serge 331
 
3033 serge 332
            caps->cap1.max_tex_width  = 4096;
333
            caps->cap1.max_tex_height = 4096;
334
            break;
335
        default:
336
            ret = 1;
337
    };
2340 Serge 338
    caps->idx = 1;
3033 serge 339
    return ret;
2340 Serge 340
}
3033 serge 341
2340 Serge 342
 
343
 
3033 serge 344
{
2351 Serge 345
    DRM_DEBUG("destroy context %x\n", context);
3037 serge 346
2351 Serge 347
 
3033 serge 348
2351 Serge 349
 
3033 serge 350
    drm_gem_object_unreference(&context->obj->base);
351
    mutex_unlock(&main_device->struct_mutex);
352
2351 Serge 353
 
3033 serge 354
};
355
2351 Serge 356
 
357
 
3033 serge 358
2351 Serge 359
 
3033 serge 360
{
2351 Serge 361
    struct context *context;
3033 serge 362
    struct io_call_10 io_10;
363
    int    slot = *((u8*)CURRENT_TASK);
364
    int    ret;
2351 Serge 365
366
 
3033 serge 367
2351 Serge 368
 
3033 serge 369
        return context;
370
371
 
372
3037 serge 373
 
3033 serge 374
    {
2351 Serge 375
        drm_i915_private_t *dev_priv = dev->dev_private;
3033 serge 376
        struct drm_i915_gem_object *obj;
377
2351 Serge 378
 
3033 serge 379
        i915_gem_object_pin(obj, 4096, true, true);
380
2351 Serge 381
 
3033 serge 382
        context->cmd_buffer = MapIoMem((addr_t)obj->pages.page[0], 4096, PG_SW|PG_NOCACHE);
383
        context->cmd_offset = obj->gtt_offset;
384
2351 Serge 385
 
3033 serge 386
        context->mask  = NULL;
387
        context->seqno = 0;
388
        context->slot  = slot;
389
2351 Serge 390
 
3033 serge 391
    };
2351 Serge 392
    return context;
3033 serge 393
};
394