Subversion Repositories Kolibri OS

Rev

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