Subversion Repositories Kolibri OS

Rev

Rev 1963 | Rev 2005 | 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
 
139
        dbgprintf("Illegal buffer object size.\n");
140
        return -EINVAL;
141
    }
142
143
 
144
    {
145
        mman = &mm_vram;
146
        bo_domain = RADEON_GEM_DOMAIN_VRAM;
147
    }
148
    else if(domain & RADEON_GEM_DOMAIN_GTT)
149
    {
150
        mman = &mm_gtt;
151
        bo_domain = RADEON_GEM_DOMAIN_GTT;
152
    }
153
    else return -EINVAL;
154
155
 
156
        type = ttm_bo_type_kernel;
157
    } else {
158
        type = ttm_bo_type_device;
159
    }
160
    *bo_ptr = NULL;
161
    bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
162
    if (bo == NULL)
163
        return -ENOMEM;
164
165
 
1986 serge 166
    if (unlikely(r)) {
167
		kfree(bo);
168
		return r;
169
	}
170
    bo->rdev = rdev;
1404 serge 171
	bo->gem_base.driver_private = NULL;
1986 serge 172
    bo->surface_reg = -1;
1404 serge 173
    bo->tbo.num_pages = num_pages;
174
    bo->domain = domain;
175
176
 
177
178
 
179
    /* Kernel allocation are uninterruptible */
180
181
 
182
    if (unlikely(r != 0))
183
        return r;
184
185
 
186
187
 
188
}
189
190
 
191
192
 
193
{
194
    int r=0, i;
195
196
 
197
        bo->pin_count++;
198
        if (gpu_addr)
199
            *gpu_addr = radeon_bo_gpu_offset(bo);
200
        return 0;
201
    }
202
203
 
204
205
 
206
    {
207
        bo->tbo.offset += (u64)bo->rdev->mc.vram_start;
1430 serge 208
    }
1404 serge 209
    else if (bo->domain & RADEON_GEM_DOMAIN_GTT)
210
    {
211
        u32_t *pagelist;
212
        bo->kptr  = KernelAlloc( bo->tbo.num_pages << PAGE_SHIFT );
213
        dbgprintf("kernel alloc %x\n", bo->kptr );
214
215
 
216
        dbgprintf("pagelist %x\n", pagelist);
217
        radeon_gart_bind(bo->rdev, bo->tbo.offset,
218
                         bo->tbo.vm_node->size,  pagelist);
219
        bo->tbo.offset += (u64)bo->rdev->mc.gtt_start;
1430 serge 220
    }
1404 serge 221
    else
222
    {
223
        DRM_ERROR("Unknown placement %x\n", bo->domain);
224
        bo->tbo.offset = -1;
225
        r = -1;
226
    };
227
228
 
229
        DRM_ERROR("radeon: failed to pin object.\n");
230
    }
231
232
 
233
        bo->pin_count = 1;
234
        if (gpu_addr != NULL)
235
            *gpu_addr = radeon_bo_gpu_offset(bo);
236
    }
237
238
 
239
        dev_err(bo->rdev->dev, "%p pin failed\n", bo);
240
    return r;
241
};
242
243
 
244
{
245
    int r = 0;
246
247
 
248
        dev_warn(bo->rdev->dev, "%p unpin not necessary\n", bo);
249
        return 0;
250
    }
251
    bo->pin_count--;
252
    if (bo->pin_count)
253
        return 0;
254
255
 
256
    {
257
        drm_mm_put_block(bo->tbo.vm_node);
258
        bo->tbo.vm_node = NULL;
259
    };
260
261
 
262
}
263
264
 
265
{
266
    bool is_iomem;
267
268
 
269
        if (ptr) {
270
            *ptr = bo->kptr;
271
        }
272
        return 0;
273
    }
274
275
 
276
    {
277
        bo->cpu_addr = bo->rdev->mc.aper_base +
278
                       (bo->tbo.vm_node->start << PAGE_SHIFT);
279
        bo->kptr = (void*)MapIoMem(bo->cpu_addr,
280
                        bo->tbo.vm_node->size << 12, PG_SW);
281
    }
282
    else
283
    {
284
        return -1;
285
    }
286
287
 
288
        *ptr = bo->kptr;
289
    }
290
291
 
292
}
293
294
 
295
{
296
    if (bo->kptr == NULL)
297
        return;
298
299
 
300
    {
301
        FreeKernelSpace(bo->kptr);
302
    }
303
304
 
305
306
 
307
308
 
309
{
310
    struct ttm_buffer_object *tbo;
311
312
 
313
        return;
314
315
 
316
}
317
318
 
319
 
320
                uint32_t *tiling_flags,
321
                uint32_t *pitch)
322
{
323
//    BUG_ON(!atomic_read(&bo->tbo.reserved));
324
    if (tiling_flags)
325
        *tiling_flags = bo->tiling_flags;
326
    if (pitch)
327
        *pitch = bo->pitch;
328
}
329
330
 
331
 
332
 * Allocate a GEM object of the specified size with shmfs backing store
333
 */
334
struct drm_gem_object *
335
drm_gem_object_alloc(struct drm_device *dev, size_t size)
336
{
337
    struct drm_gem_object *obj;
338
339
 
340
341
 
342
343
 
344
    obj->size = size;
345
    return obj;
346
}
347
348
 
349
 
350
            unsigned long size, bool kernel, u32 domain,
351
            struct radeon_bo **bo_ptr)
352
{
353
    enum ttm_bo_type    type;
354
355
 
356
    struct drm_mm       *mman;
357
    struct drm_mm_node  *vm_node;
358
359
 
360
    u32     bo_domain;
361
    int     r;
362
363
 
364
365
 
366
        dbgprintf("Illegal buffer object size.\n");
367
        return -EINVAL;
368
    }
369
370
 
371
        RADEON_GEM_DOMAIN_VRAM )
372
    {
373
        return -EINVAL;
374
    };
375
376
 
377
        type = ttm_bo_type_kernel;
378
    } else {
379
        type = ttm_bo_type_device;
380
    }
381
    *bo_ptr = NULL;
382
    bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
383
    if (bo == NULL)
384
        return -ENOMEM;
385
386
 
387
//    bo->gobj = gobj;
1963 serge 388
    bo->surface_reg = -1;
1404 serge 389
    bo->tbo.num_pages = num_pages;
390
    bo->domain = domain;
391
392
 
393
394
 
395
    /* Kernel allocation are uninterruptible */
396
397
 
398
399
 
400
    vm_node->start = 0;
401
    vm_node->mm = NULL;
402
403
 
404
    bo->tbo.offset  = bo->tbo.vm_node->start << PAGE_SHIFT;
405
    bo->tbo.offset += (u64)bo->rdev->mc.vram_start;
1430 serge 406
    bo->kptr        = (void*)0xFE000000;
1404 serge 407
    bo->pin_count   = 1;
408
409
 
410
411
 
412
}
413