Subversion Repositories Kolibri OS

Rev

Rev 2361 | Rev 3037 | 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
 
3033 serge 19
 
2342 Serge 20
{
21
    dma_addr_t *pages = bitmap->obj->allocated_pages;;
3033 serge 22
    int i;
23
24
 
2344 Serge 25
    free_handle(&bm_mm, bitmap->handle);
3033 serge 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
 
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
    page_count = obj->base.size / PAGE_SIZE;
54
    BUG_ON(obj->allocated_pages == NULL);
55
    BUG_ON(obj->pages.page != NULL);
56
2340 Serge 57
 
3033 serge 58
    obj->pages.nents = page_count;
59
60
 
61
 
62
//       i915_gem_object_do_bit_17_swizzle(obj);
63
64
 
65
}
66
67
 
68
{
69
    int ret, i;
70
71
 
72
73
 
74
    if (ret) {
75
        /* In the event of a disaster, abandon all caches and
76
         * hope for the best.
77
         */
78
        WARN_ON(ret != -EIO);
79
        i915_gem_clflush_object(obj);
80
        obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
81
    }
82
83
 
84
        obj->dirty = 0;
85
86
 
87
}
88
89
 
90
    .get_pages = bitmap_get_pages_gtt,
91
    .put_pages = bitmap_put_pages_gtt,
92
};
2340 Serge 93
94
 
95
 
3033 serge 96
 
97
struct  io_call_10         /*     SRV_CREATE_SURFACE    */
98
{
2340 Serge 99
    u32     handle;       // ignored
3033 serge 100
    void   *data;         // ignored
101
102
 
103
    u32     height;
104
    u32     pitch;        // ignored
105
106
 
107
    u32     max_height;
108
    u32     format;       // reserved mbz
109
};
110
111
 
112
113
 
114
{
115
    struct drm_i915_gem_object *obj;
2340 Serge 116
117
 
118
    u32         handle;
119
    u32         width, max_width;
2344 Serge 120
    u32         height, max_height;
121
    u32         size,  max_size;
122
    u32         pitch, max_pitch;
123
    void       *uaddr;
2340 Serge 124
    dma_addr_t *pages;
3033 serge 125
    u32         page_count;
126
2340 Serge 127
 
3033 serge 128
129
 
2340 Serge 130
131
 
132
    pbitmap->data   = (void*)-1;
2344 Serge 133
2340 Serge 134
 
2344 Serge 135
    height = pbitmap->height;
2342 Serge 136
137
 
3033 serge 138
        goto err1;
2340 Serge 139
140
 
3033 serge 141
    if( ((pbitmap->max_width !=0 ) &&
2344 Serge 142
         (pbitmap->max_width < width)) ||
143
         (pbitmap->max_width > 4096) )
144
        goto err1;
145
146
 
147
         (pbitmap->max_height < width)) ||
148
         (pbitmap->max_height > 4096) )
149
        goto err1;
150
151
 
152
        goto err1;
153
*/
154
155
 
156
    max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height;
157
158
 
3033 serge 159
//    printf("%s %d\n",__FUNCTION__, handle);
2342 Serge 160
2340 Serge 161
 
162
        goto err1;
163
164
 
165
//    printf("bitmap %x\n", bitmap);
2361 Serge 166
    if( bitmap == NULL)
167
        goto err2;
3033 serge 168
2361 Serge 169
 
2342 Serge 170
    bitmap->header.destroy = destroy_bitmap;
171
    bitmap->obj    = NULL;
172
173
 
3033 serge 174
2340 Serge 175
 
176
    size =  roundup(pitch*height, PAGE_SIZE);
177
2344 Serge 178
 
2342 Serge 179
2340 Serge 180
 
2344 Serge 181
    max_size =  roundup(max_pitch*max_height, PAGE_SIZE);
182
183
 
3033 serge 184
185
 
2344 Serge 186
    if( uaddr == NULL)
2340 Serge 187
        goto err3;
3033 serge 188
    else
2340 Serge 189
    {
190
        u32           max_count;
3033 serge 191
        dma_addr_t    page;
192
        char *vaddr = uaddr;
193
2340 Serge 194
 
3033 serge 195
        max_count = max_size/PAGE_SIZE;
196
2340 Serge 197
 
3033 serge 198
        if( pages == NULL)
199
            goto err4;
200
2340 Serge 201
 
3033 serge 202
        {
2340 Serge 203
            page = AllocPage();
3033 serge 204
            if ( page == 0 )
205
                goto err4;
206
            pages[i] = page;
207
208
 
209
        };
2340 Serge 210
        bitmap->page_count = page_count;
3033 serge 211
        bitmap->max_count  = max_count;
212
    };
213
2340 Serge 214
 
3033 serge 215
    if (obj == NULL)
216
        goto err4;
217
218
 
219
    obj->allocated_pages = pages;
220
221
 
222
    if (ret)
223
        goto err5;
224
225
 
2351 Serge 226
227
 
2340 Serge 228
    bitmap->uaddr  = uaddr;
2344 Serge 229
    bitmap->pitch  = pitch;
230
    bitmap->gaddr  = obj->gtt_offset;
231
232
 
2340 Serge 233
    bitmap->height = height;
234
    bitmap->max_width  = max_width;
2344 Serge 235
    bitmap->max_height = max_height;
236
237
 
2340 Serge 238
    bitmap->header.destroy = destroy_bitmap;
2342 Serge 239
2340 Serge 240
 
241
    pbitmap->data   = uaddr;
242
    pbitmap->pitch  = pitch;
2344 Serge 243
2342 Serge 244
 
245
 
2344 Serge 246
            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
247
248
 
2340 Serge 249
250
 
3033 serge 251
    mutex_lock(&dev->struct_mutex);
252
    drm_gem_object_unreference(&obj->base);
253
    mutex_unlock(&dev->struct_mutex);
254
255
 
2340 Serge 256
    while (i--)
3033 serge 257
        FreePage(pages[i]);
258
    free(pages);
259
    UserFree(uaddr);
260
261
 
2340 Serge 262
    __DestroyObject(bitmap);
3033 serge 263
err2:
2340 Serge 264
    free_handle(&bm_mm, handle);
3033 serge 265
err1:
2340 Serge 266
    return -1;
267
};
268
269
 
270
 
2352 Serge 271
{
272
    int ret;
273
2344 Serge 274
 
2352 Serge 275
276
 
277
        return -1;
278
279
 
3033 serge 280
2352 Serge 281
 
282
        return -1;
283
284
 
3033 serge 285
286
 
287
    {
2352 Serge 288
        pbitmap->data  = NULL;
289
        pbitmap->pitch = 0;
290
291
 
292
        return ret;
293
    };
294
295
 
296
    pbitmap->pitch = bitmap->pitch;
297
298
 
299
};
300
301
 
2361 Serge 302
 
2340 Serge 303
 
304
 
3033 serge 305
{
306
    int ret;
307
2340 Serge 308
 
3033 serge 309
2340 Serge 310
 
3033 serge 311
};
2340 Serge 312
313
 
314
 
315
 
3033 serge 316
{
2340 Serge 317
    int ret = 0;
3033 serge 318
2340 Serge 319
 
3033 serge 320
    {
321
        case 0:
322
            caps->opt[0] = DRIVER_CAPS_0;
323
            caps->opt[1] = DRIVER_CAPS_1;
324
            break;
325
2340 Serge 326
 
3033 serge 327
            caps->cap1.max_tex_width  = 4096;
328
            caps->cap1.max_tex_height = 4096;
329
            break;
330
        default:
331
            ret = 1;
332
    };
2340 Serge 333
    caps->idx = 1;
3033 serge 334
    return ret;
2340 Serge 335
}
3033 serge 336
2340 Serge 337
 
338
 
3033 serge 339
{
2351 Serge 340
    printf("destroy context %x\n", context);
3033 serge 341
2351 Serge 342
 
3033 serge 343
2351 Serge 344
 
3033 serge 345
    drm_gem_object_unreference(&context->obj->base);
346
    mutex_unlock(&main_device->struct_mutex);
347
2351 Serge 348
 
3033 serge 349
};
350
2351 Serge 351
 
352
 
3033 serge 353
2351 Serge 354
 
3033 serge 355
{
2351 Serge 356
    struct context *context;
3033 serge 357
    struct io_call_10 io_10;
358
    int    slot = *((u8*)CURRENT_TASK);
359
    int    ret;
2351 Serge 360
361
 
3033 serge 362
2351 Serge 363
 
3033 serge 364
        return context;
365
366
 
367
    printf("context %x\n", context);
368
    if( context != NULL)
369
    {
2351 Serge 370
        drm_i915_private_t *dev_priv = dev->dev_private;
3033 serge 371
        struct drm_i915_gem_object *obj;
372
2351 Serge 373
 
3033 serge 374
        i915_gem_object_pin(obj, 4096, true, true);
375
2351 Serge 376
 
3033 serge 377
        context->cmd_buffer = MapIoMem((addr_t)obj->pages.page[0], 4096, PG_SW|PG_NOCACHE);
378
        context->cmd_offset = obj->gtt_offset;
379
2351 Serge 380
 
3033 serge 381
        context->mask  = NULL;
382
        context->seqno = 0;
383
        context->slot  = slot;
384
2351 Serge 385
 
3033 serge 386
    };
2351 Serge 387
    return context;
3033 serge 388
};
389