Subversion Repositories Kolibri OS

Rev

Rev 1986 | Rev 2007 | 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
 
297
{
298
    if (bo->kptr == NULL)
299
        return;
300
301
 
302
    {
303
        FreeKernelSpace(bo->kptr);
304
    }
305
306
 
307
308
 
309
310
 
311
{
312
    struct ttm_buffer_object *tbo;
313
314
 
315
        return;
316
317
 
318
}
319
320
 
321
 
322
                uint32_t *tiling_flags,
323
                uint32_t *pitch)
324
{
325
//    BUG_ON(!atomic_read(&bo->tbo.reserved));
326
    if (tiling_flags)
327
        *tiling_flags = bo->tiling_flags;
328
    if (pitch)
329
        *pitch = bo->pitch;
330
}
331
332
 
333
 
334
 * Allocate a GEM object of the specified size with shmfs backing store
335
 */
336
struct drm_gem_object *
337
drm_gem_object_alloc(struct drm_device *dev, size_t size)
338
{
339
    struct drm_gem_object *obj;
340
341
 
342
343
 
344
345
 
346
    obj->size = size;
347
    return obj;
348
}
349
350
 
351
 
352
            unsigned long size, bool kernel, u32 domain,
353
            struct radeon_bo **bo_ptr)
354
{
355
    enum ttm_bo_type    type;
356
357
 
358
    struct drm_mm       *mman;
359
    struct drm_mm_node  *vm_node;
360
361
 
362
    u32     bo_domain;
363
    int     r;
364
365
 
366
367
 
368
        dbgprintf("Illegal buffer object size.\n");
369
        return -EINVAL;
370
    }
371
372
 
373
        RADEON_GEM_DOMAIN_VRAM )
374
    {
375
        return -EINVAL;
376
    };
377
378
 
379
        type = ttm_bo_type_kernel;
380
    } else {
381
        type = ttm_bo_type_device;
382
    }
383
    *bo_ptr = NULL;
384
    bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
385
    if (bo == NULL)
386
        return -ENOMEM;
387
388
 
389
//    bo->gobj = gobj;
1963 serge 390
    bo->surface_reg = -1;
1404 serge 391
    bo->tbo.num_pages = num_pages;
392
    bo->domain = domain;
393
394
 
395
396
 
397
    /* Kernel allocation are uninterruptible */
398
399
 
400
401
 
402
    vm_node->start = 0;
403
    vm_node->mm = NULL;
404
405
 
406
    bo->tbo.offset  = bo->tbo.vm_node->start << PAGE_SHIFT;
407
    bo->tbo.offset += (u64)bo->rdev->mc.vram_start;
1430 serge 408
    bo->kptr        = (void*)0xFE000000;
1404 serge 409
    bo->pin_count   = 1;
410
411
 
412
413
 
414
}
415