Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1404 serge 1
 
2
#include 
3
#include "radeon_drm.h"
4
#include "radeon.h"
5
6
 
7
 
8
static struct drm_mm   mm_vram;
9
10
 
1986 serge 11
 
12
 * Initialize an already allocate GEM object of the specified size with
13
 * shmfs backing store.
14
 */
15
int drm_gem_object_init(struct drm_device *dev,
16
            struct drm_gem_object *obj, size_t size)
17
{
18
    BUG_ON((size & (PAGE_SIZE - 1)) != 0);
19
20
 
21
    obj->filp = NULL;
22
23
 
24
    obj->size = size;
25
26
 
27
}
28
29
 
30
 
1404 serge 31
                 struct drm_mm_node **node)
32
{
33
    struct drm_mm_node *vm_node;
34
    int    r;
35
36
 
37
38
 
39
40
 
41
       return r;
42
43
 
44
45
 
46
        r = -ENOMEM;
47
        return r;
48
    }
49
50
 
51
52
 
53
            goto retry_pre_get;
54
    }
55
56
 
57
};
58
59
 
60
 
1986 serge 61
 
1404 serge 62
{
63
    u32 c = 0;
64
65
 
66
    rbo->placement.lpfn = 0;
67
    rbo->placement.placement = rbo->placements;
68
    rbo->placement.busy_placement = rbo->placements;
69
    if (domain & RADEON_GEM_DOMAIN_VRAM)
70
        rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
71
                    TTM_PL_FLAG_VRAM;
72
    if (domain & RADEON_GEM_DOMAIN_GTT)
73
        rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
74
    if (domain & RADEON_GEM_DOMAIN_CPU)
75
        rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
76
    if (!c)
77
        rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
78
    rbo->placement.num_placement = c;
79
    rbo->placement.num_busy_placement = c;
80
}
81
82
 
83
 
84
{
85
    int r;
86
87
 
88
        rdev->mc.mc_vram_size >> 20,
89
        (unsigned long long)rdev->mc.aper_size >> 20);
90
    DRM_INFO("RAM width %dbits %cDR\n",
91
            rdev->mc.vram_width, rdev->mc.vram_is_ddr ? 'D' : 'S');
92
93
 
94
               ((rdev->mc.real_vram_size - 0xC00000) >> PAGE_SHIFT));
95
    if (r) {
96
        DRM_ERROR("Failed initializing VRAM heap.\n");
97
        return r;
98
    };
99
100
 
101
    if (r) {
102
        DRM_ERROR("Failed initializing GTT heap.\n");
103
        return r;
104
    }
105
106
 
107
}
108
109
 
110
 
111
{
112
    int r;
113
114
 
115
116
 
117
}
118
119
 
120
{
121
    bo->reserved.counter = 1;
122
}
123
124
 
1963 serge 125
		     unsigned long size, int byte_align, bool kernel, u32 domain,
1986 serge 126
                struct radeon_bo **bo_ptr)
1963 serge 127
{
1404 serge 128
	struct radeon_bo *bo;
1986 serge 129
    enum ttm_bo_type type;
1404 serge 130
131
 
132
    struct drm_mm      *mman;
133
    u32                 bo_domain;
134
    int r;
135
136
 
137
138
 
2005 serge 139
140
 
1404 serge 141
        dbgprintf("Illegal buffer object size.\n");
142
        return -EINVAL;
143
    }
144
145
 
146
    {
147
        mman = &mm_vram;
148
        bo_domain = RADEON_GEM_DOMAIN_VRAM;
149
    }
150
    else if(domain & RADEON_GEM_DOMAIN_GTT)
151
    {
152
        mman = &mm_gtt;
153
        bo_domain = RADEON_GEM_DOMAIN_GTT;
154
    }
155
    else return -EINVAL;
156
157
 
158
        type = ttm_bo_type_kernel;
159
    } else {
160
        type = ttm_bo_type_device;
161
    }
162
    *bo_ptr = NULL;
163
    bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
164
    if (bo == NULL)
165
        return -ENOMEM;
166
167
 
1986 serge 168
    if (unlikely(r)) {
169
		kfree(bo);
170
		return r;
171
	}
172
    bo->rdev = rdev;
1404 serge 173
	bo->gem_base.driver_private = NULL;
1986 serge 174
    bo->surface_reg = -1;
1404 serge 175
    bo->tbo.num_pages = num_pages;
176
    bo->domain = domain;
177
178
 
179
180
 
181
    /* Kernel allocation are uninterruptible */
182
183
 
184
    if (unlikely(r != 0))
185
        return r;
186
187
 
188
189
 
190
}
191
192
 
193
194
 
195
{
196
    int r=0, i;
197
198
 
199
        bo->pin_count++;
200
        if (gpu_addr)
201
            *gpu_addr = radeon_bo_gpu_offset(bo);
202
        return 0;
203
    }
204
205
 
206
207
 
208
    {
209
        bo->tbo.offset += (u64)bo->rdev->mc.vram_start;
1430 serge 210
    }
1404 serge 211
    else if (bo->domain & RADEON_GEM_DOMAIN_GTT)
212
    {
213
        u32_t *pagelist;
214
        bo->kptr  = KernelAlloc( bo->tbo.num_pages << PAGE_SHIFT );
215
        dbgprintf("kernel alloc %x\n", bo->kptr );
216
217
 
218
        dbgprintf("pagelist %x\n", pagelist);
219
        radeon_gart_bind(bo->rdev, bo->tbo.offset,
220
                         bo->tbo.vm_node->size,  pagelist);
221
        bo->tbo.offset += (u64)bo->rdev->mc.gtt_start;
1430 serge 222
    }
1404 serge 223
    else
224
    {
225
        DRM_ERROR("Unknown placement %x\n", bo->domain);
226
        bo->tbo.offset = -1;
227
        r = -1;
228
    };
229
230
 
231
        DRM_ERROR("radeon: failed to pin object.\n");
232
    }
233
234
 
235
        bo->pin_count = 1;
236
        if (gpu_addr != NULL)
237
            *gpu_addr = radeon_bo_gpu_offset(bo);
238
    }
239
240
 
241
        dev_err(bo->rdev->dev, "%p pin failed\n", bo);
242
    return r;
243
};
244
245
 
246
{
247
    int r = 0;
248
249
 
250
        dev_warn(bo->rdev->dev, "%p unpin not necessary\n", bo);
251
        return 0;
252
    }
253
    bo->pin_count--;
254
    if (bo->pin_count)
255
        return 0;
256
257
 
258
    {
259
        drm_mm_put_block(bo->tbo.vm_node);
260
        bo->tbo.vm_node = NULL;
261
    };
262
263
 
264
}
265
266
 
267
{
268
    bool is_iomem;
269
270
 
271
        if (ptr) {
272
            *ptr = bo->kptr;
273
        }
274
        return 0;
275
    }
276
277
 
278
    {
279
        bo->cpu_addr = bo->rdev->mc.aper_base +
280
                       (bo->tbo.vm_node->start << PAGE_SHIFT);
281
        bo->kptr = (void*)MapIoMem(bo->cpu_addr,
282
                        bo->tbo.vm_node->size << 12, PG_SW);
283
    }
284
    else
285
    {
286
        return -1;
287
    }
288
289
 
290
        *ptr = bo->kptr;
291
    }
292
293
 
294
}
295
296
 
2007 serge 297
{
298
    bool is_iomem;
299
300
 
301
        if (ptr) {
302
            *ptr = bo->uptr;
303
        }
304
        return 0;
305
    }
306
307
 
308
    {
309
        return -1;
310
    }
311
    else
312
    {
313
        bo->uptr = UserAlloc(bo->tbo.num_pages << PAGE_SHIFT);
314
        if(bo->uptr)
315
        {
316
            u32_t *src, *dst;
317
            int count;
318
            src =  &((u32_t*)page_tabs)[(u32_t)bo->kptr >> 12];
319
            dst =  &((u32_t*)page_tabs)[(u32_t)bo->uptr >> 12];
320
            count = bo->tbo.num_pages;
321
322
 
323
            {
324
              *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
325
            };
326
        }
327
        else
328
            return -1;
329
    }
330
331
 
332
        *ptr = bo->uptr;
333
    }
334
335
 
336
}
337
338
 
1404 serge 339
{
340
    if (bo->kptr == NULL)
341
        return;
342
343
 
344
    {
345
        FreeKernelSpace(bo->kptr);
346
    }
347
348
 
349
350
 
351
352
 
353
{
354
    struct ttm_buffer_object *tbo;
355
356
 
357
        return;
358
359
 
360
}
361
362
 
363
 
364
                uint32_t *tiling_flags,
365
                uint32_t *pitch)
366
{
367
//    BUG_ON(!atomic_read(&bo->tbo.reserved));
368
    if (tiling_flags)
369
        *tiling_flags = bo->tiling_flags;
370
    if (pitch)
371
        *pitch = bo->pitch;
372
}
373
374
 
375
 
376
 * Allocate a GEM object of the specified size with shmfs backing store
377
 */
378
struct drm_gem_object *
379
drm_gem_object_alloc(struct drm_device *dev, size_t size)
380
{
381
    struct drm_gem_object *obj;
382
383
 
384
385
 
386
387
 
388
    obj->size = size;
389
    return obj;
390
}
391
392
 
393
 
394
            unsigned long size, bool kernel, u32 domain,
395
            struct radeon_bo **bo_ptr)
396
{
397
    enum ttm_bo_type    type;
398
399
 
400
    struct drm_mm       *mman;
401
    struct drm_mm_node  *vm_node;
402
403
 
404
    u32     bo_domain;
405
    int     r;
406
407
 
408
409
 
410
        dbgprintf("Illegal buffer object size.\n");
411
        return -EINVAL;
412
    }
413
414
 
415
        RADEON_GEM_DOMAIN_VRAM )
416
    {
417
        return -EINVAL;
418
    };
419
420
 
421
        type = ttm_bo_type_kernel;
422
    } else {
423
        type = ttm_bo_type_device;
424
    }
425
    *bo_ptr = NULL;
426
    bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
427
    if (bo == NULL)
428
        return -ENOMEM;
429
430
 
431
//    bo->gobj = gobj;
1963 serge 432
    bo->surface_reg = -1;
1404 serge 433
    bo->tbo.num_pages = num_pages;
434
    bo->domain = domain;
435
436
 
437
438
 
439
    /* Kernel allocation are uninterruptible */
440
441
 
442
443
 
444
    vm_node->start = 0;
445
    vm_node->mm = NULL;
446
447
 
448
    bo->tbo.offset  = bo->tbo.vm_node->start << PAGE_SHIFT;
449
    bo->tbo.offset += (u64)bo->rdev->mc.vram_start;
1430 serge 450
    bo->kptr        = (void*)0xFE000000;
1404 serge 451
    bo->pin_count   = 1;
452
453
 
454
455
 
456
}
457