Subversion Repositories Kolibri OS

Rev

Rev 1403 | Rev 1430 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1403 Rev 1404
Line 144... Line 144...
144
	struct radeon_fb_device *rfbdev;
144
	struct radeon_fb_device *rfbdev;
145
	struct drm_framebuffer *fb = NULL;
145
	struct drm_framebuffer *fb = NULL;
146
	struct radeon_framebuffer *rfb;
146
	struct radeon_framebuffer *rfb;
147
	struct drm_mode_fb_cmd mode_cmd;
147
	struct drm_mode_fb_cmd mode_cmd;
148
	struct drm_gem_object *gobj = NULL;
148
	struct drm_gem_object *gobj = NULL;
149
	struct radeon_object *robj = NULL;
149
	struct radeon_bo *rbo = NULL;
150
    void   *device = NULL; //&rdev->pdev->dev;
150
  //  struct device *device = &rdev->pdev->dev;
151
	int size, aligned_size, ret;
151
	int size, aligned_size, ret;
152
	u64 fb_gpuaddr;
152
	u64 fb_gpuaddr;
153
	void *fbptr = NULL;
153
	void *fbptr = NULL;
154
	unsigned long tmp;
154
	unsigned long tmp;
155
	bool fb_tiled = false; /* useful for testing */
155
	bool fb_tiled = false; /* useful for testing */
Line 161... Line 161...
161
 
161
 
162
	/* avivo can't scanout real 24bpp */
162
	/* avivo can't scanout real 24bpp */
163
	if ((surface_bpp == 24) && ASIC_IS_AVIVO(rdev))
163
	if ((surface_bpp == 24) && ASIC_IS_AVIVO(rdev))
Line 164... Line 164...
164
		surface_bpp = 32;
164
		surface_bpp = 32;
165
 
165
 
166
	mode_cmd.bpp = 32;
166
	mode_cmd.bpp = surface_bpp;
167
	/* need to align pitch with crtc limits */
167
	/* need to align pitch with crtc limits */
Line 168... Line 168...
168
	mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8);
168
	mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8);
169
	mode_cmd.depth = surface_depth;
169
	mode_cmd.depth = surface_depth;
Line 170... Line 170...
170
 
170
 
171
	size = mode_cmd.pitch * mode_cmd.height;
171
	size = mode_cmd.pitch * mode_cmd.height;
172
	aligned_size = ALIGN(size, PAGE_SIZE);
172
	aligned_size = ALIGN(size, PAGE_SIZE);
173
 
173
 
174
    ret = radeon_gem_fb_object_create(rdev, aligned_size, 0,
174
	ret = radeon_gem_object_create(rdev, aligned_size, 0,
175
			RADEON_GEM_DOMAIN_VRAM,
175
			RADEON_GEM_DOMAIN_VRAM,
176
            false, 0,
176
			false, ttm_bo_type_kernel,
177
			false, &gobj);
177
			&gobj);
178
	if (ret) {
178
	if (ret) {
179
		printk(KERN_ERR "failed to allocate framebuffer (%d %d)\n",
179
		printk(KERN_ERR "failed to allocate framebuffer (%d %d)\n",
180
		       surface_width, surface_height);
180
		       surface_width, surface_height);
Line -... Line 181...
-
 
181
		ret = -ENOMEM;
-
 
182
		goto out;
-
 
183
	}
-
 
184
	rbo = gobj->driver_private;
-
 
185
 
-
 
186
	if (fb_tiled)
-
 
187
		tiling_flags = RADEON_TILING_MACRO;
-
 
188
 
-
 
189
#ifdef __BIG_ENDIAN
-
 
190
	switch (mode_cmd.bpp) {
-
 
191
	case 32:
-
 
192
		tiling_flags |= RADEON_TILING_SWAP_32BIT;
-
 
193
		break;
-
 
194
	case 16:
-
 
195
		tiling_flags |= RADEON_TILING_SWAP_16BIT;
-
 
196
	default:
-
 
197
		break;
-
 
198
	}
-
 
199
#endif
-
 
200
 
-
 
201
	if (tiling_flags) {
-
 
202
		ret = radeon_bo_set_tiling_flags(rbo,
181
		ret = -ENOMEM;
203
					tiling_flags | RADEON_TILING_SURFACE,
182
		goto out;
204
					mode_cmd.pitch);
183
	}
205
		if (ret)
184
	robj = gobj->driver_private;
206
			dev_err(rdev->dev, "FB failed to set tiling flags\n");
185
 
207
	}
186
	mutex_lock(&rdev->ddev->struct_mutex);
208
	mutex_lock(&rdev->ddev->struct_mutex);
187
	fb = radeon_framebuffer_create(rdev->ddev, &mode_cmd, gobj);
209
	fb = radeon_framebuffer_create(rdev->ddev, &mode_cmd, gobj);
-
 
210
	if (fb == NULL) {
-
 
211
		DRM_ERROR("failed to allocate fb.\n");
-
 
212
		ret = -ENOMEM;
188
	if (fb == NULL) {
213
		goto out_unref;
-
 
214
	}
-
 
215
	ret = radeon_bo_reserve(rbo, false);
-
 
216
	if (unlikely(ret != 0))
-
 
217
		goto out_unref;
-
 
218
	ret = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_gpuaddr);
-
 
219
	if (ret) {
-
 
220
		radeon_bo_unreserve(rbo);
-
 
221
		goto out_unref;
189
		DRM_ERROR("failed to allocate fb.\n");
222
	}
190
		ret = -ENOMEM;
-
 
191
		goto out_unref;
-
 
192
	}
223
	if (fb_tiled)
193
	ret = radeon_object_pin(robj, RADEON_GEM_DOMAIN_VRAM, &fb_gpuaddr);
224
		radeon_bo_check_tiling(rbo, 0, 0);
Line 194... Line 225...
194
	if (ret) {
225
	ret = radeon_bo_kmap(rbo, &fbptr);
Line 195... Line 226...
195
		printk(KERN_ERR "failed to pin framebuffer\n");
226
	radeon_bo_unreserve(rbo);
196
		ret = -ENOMEM;
227
	if (ret) {
197
		goto out_unref;
228
		goto out_unref;
198
	}
229
	}
Line 199... Line 230...
199
 
230
 
200
    list_add(&fb->filp_head, &rdev->ddev->mode_config.fb_kernel_list);
231
    list_add(&fb->filp_head, &rdev->ddev->mode_config.fb_kernel_list);
201
 
232
 
202
	*fb_p = fb;
233
	*fb_p = fb;
203
	rfb = to_radeon_framebuffer(fb);
234
	rfb = to_radeon_framebuffer(fb);
Line 221... Line 252...
221
	ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, crtc_count,
252
	ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, crtc_count,
222
					    RADEONFB_CONN_LIMIT);
253
					    RADEONFB_CONN_LIMIT);
223
	if (ret)
254
	if (ret)
224
		goto out_unref;
255
		goto out_unref;
Line 225... Line -...
225
 
-
 
226
//   ret = radeon_object_kmap(robj, &fbptr);
-
 
227
//   if (ret) {
-
 
228
//       goto out_unref;
-
 
229
//   }
-
 
230
 
-
 
231
 
-
 
Line 232... Line 256...
232
    fbptr = (void*)0xFE000000; // LFB_BASE
256
 
Line 233... Line 257...
233
 
257
    
Line 275... Line 299...
275
 
299
 
276
	mutex_unlock(&rdev->ddev->struct_mutex);
300
	mutex_unlock(&rdev->ddev->struct_mutex);
Line 277... Line 301...
277
	return 0;
301
	return 0;
278
 
302
 
-
 
303
out_unref:
-
 
304
	if (rbo) {
279
out_unref:
305
		ret = radeon_bo_reserve(rbo, false);
-
 
306
		if (likely(ret == 0)) {
-
 
307
			radeon_bo_kunmap(rbo);
280
	if (robj) {
308
			radeon_bo_unreserve(rbo);
281
//       radeon_object_kunmap(robj);
309
		}
282
	}
310
	}
283
	if (fb && ret) {
311
	if (fb && ret) {
284
		list_del(&fb->filp_head);
312
		list_del(&fb->filp_head);
Line 292... Line 320...
292
	return ret;
320
	return ret;
293
}
321
}
Line 294... Line 322...
294
 
322
 
295
int radeonfb_probe(struct drm_device *dev)
323
int radeonfb_probe(struct drm_device *dev)
-
 
324
{
-
 
325
	struct radeon_device *rdev = dev->dev_private;
-
 
326
	int bpp_sel = 32;
-
 
327
 
-
 
328
	/* select 8 bpp console on RN50 or 16MB cards */
-
 
329
	if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32*1024*1024))
-
 
330
		bpp_sel = 8;
296
{
331
 
297
	return drm_fb_helper_single_fb_probe(dev, 32, &radeonfb_create);
332
	return drm_fb_helper_single_fb_probe(dev, 32, &radeonfb_create);
Line 298... Line 333...
298
}
333
}
299
 
334
 
300
int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb)
335
int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb)
301
{
336
{
302
	struct fb_info *info;
337
	struct fb_info *info;
-
 
338
	struct radeon_framebuffer *rfb = to_radeon_framebuffer(fb);
Line 303... Line 339...
303
	struct radeon_framebuffer *rfb = to_radeon_framebuffer(fb);
339
	struct radeon_bo *rbo;
304
	struct radeon_object *robj;
340
	int r;
305
 
341
 
306
	if (!fb) {
342
	if (!fb) {
307
		return -EINVAL;
343
		return -EINVAL;
308
	}
344
	}
309
	info = fb->fbdev;
345
	info = fb->fbdev;
310
	if (info) {
346
	if (info) {
-
 
347
		struct radeon_fb_device *rfbdev = info->par;
-
 
348
		rbo = rfb->obj->driver_private;
311
		struct radeon_fb_device *rfbdev = info->par;
349
//       unregister_framebuffer(info);
312
		robj = rfb->obj->driver_private;
350
		r = radeon_bo_reserve(rbo, false);
-
 
351
		if (likely(r == 0)) {
-
 
352
			radeon_bo_kunmap(rbo);
-
 
353
			radeon_bo_unpin(rbo);
313
//       unregister_framebuffer(info);
354
			radeon_bo_unreserve(rbo);
314
//       radeon_object_kunmap(robj);
355
		}
Line 315... Line 356...
315
//       radeon_object_unpin(robj);
356
		drm_fb_helper_free(&rfbdev->helper);
Line 316... Line 357...
316
//       framebuffer_release(info);
357
		framebuffer_release(info);
317
	}
358
	}
318
 
359
 
Line 319... Line -...
319
	printk(KERN_INFO "unregistered panic notifier\n");
-
 
320
 
-
 
321
	return 0;
-
 
322
}
-
 
323
EXPORT_SYMBOL(radeonfb_remove);
-
 
324
 
-
 
325
 
-
 
326
/**
-
 
327
 * Allocate a GEM object of the specified size with shmfs backing store
-
 
328
 */
-
 
329
struct drm_gem_object *
-
 
330
drm_gem_object_alloc(struct drm_device *dev, size_t size)
-
 
331
{
-
 
332
    struct drm_gem_object *obj;
-
 
333
 
-
 
334
    BUG_ON((size & (PAGE_SIZE - 1)) != 0);
-
 
335
 
-
 
336
    obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
 
337
 
-
 
338
    obj->dev = dev;
-
 
339
//    obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
-
 
340
//    if (IS_ERR(obj->filp)) {
-
 
341
//        kfree(obj);
-
 
342
//        return NULL;
-
 
343
//    }
-
 
344
 
-
 
345
//    kref_init(&obj->refcount);
-
 
346
//    kref_init(&obj->handlecount);
-
 
347
    obj->size = size;
-
 
348
 
-
 
349
//    if (dev->driver->gem_init_object != NULL &&
-
 
350
//        dev->driver->gem_init_object(obj) != 0) {
-
 
351
//        fput(obj->filp);
-
 
352
//        kfree(obj);
-
 
353
//        return NULL;
-
 
354
//    }
-
 
355
//    atomic_inc(&dev->object_count);
-
 
356
//    atomic_add(obj->size, &dev->object_memory);
-
 
357
    return obj;
-
 
358
}
-
 
359
 
-
 
360
 
-
 
361
int radeon_gem_fb_object_create(struct radeon_device *rdev, int size,
-
 
362
                 int alignment, int initial_domain,
-
 
363
                 bool discardable, bool kernel,
-
 
364
                 bool interruptible,
-
 
365
                 struct drm_gem_object **obj)
-
 
366
{
-
 
367
    struct drm_gem_object *gobj;
-
 
368
    struct radeon_object *robj;
-
 
369
 
-
 
370
    *obj = NULL;
-
 
371
    gobj = drm_gem_object_alloc(rdev->ddev, size);
-
 
372
    if (!gobj) {
-
 
373
        return -ENOMEM;
-
 
374
    }
-
 
375
    /* At least align on page size */
-
 
376
    if (alignment < PAGE_SIZE) {
-
 
377
        alignment = PAGE_SIZE;
-
 
378
    }
-
 
379
 
-
 
380
    robj = kzalloc(sizeof(struct radeon_object), GFP_KERNEL);
-
 
381
    if (!robj) {
-
 
382
        DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n",
-
 
383
              size, initial_domain, alignment);
-
 
384
//       mutex_lock(&rdev->ddev->struct_mutex);
-
 
385
//       drm_gem_object_unreference(gobj);
-
 
386
//       mutex_unlock(&rdev->ddev->struct_mutex);
-
 
387
        return -ENOMEM;;
-
 
388
    }
-
 
389
    robj->rdev = rdev;
-
 
390
    robj->gobj = gobj;
-
 
391
    INIT_LIST_HEAD(&robj->list);
-
 
392
 
-
 
393
    robj->flags = TTM_PL_FLAG_VRAM;
-
 
394
 
-
 
395
    struct drm_mm_node *vm_node;
-
 
396
 
-
 
397
    vm_node = kzalloc(sizeof(*vm_node),0);
-
 
398
 
-
 
399
    vm_node->free = 0;
-
 
400
    vm_node->size = 0xC00000 >> 12;
-
 
401
    vm_node->start = 0;
-
 
402
    vm_node->mm = NULL;
-
 
403
 
-
 
404
    robj->mm_node = vm_node;
-
 
405
 
-
 
406
    robj->vm_addr = ((uint32_t)robj->mm_node->start);
-
 
407
 
-
 
408
    gobj->driver_private = robj;
-
 
409
    *obj = gobj;
-
 
410
    return 0;
-
 
411
}
-
 
412
 
-
 
413
 
-
 
414
struct fb_info *framebuffer_alloc(size_t size, void *dev)
-
 
415
{
-
 
416
#define BYTES_PER_LONG (BITS_PER_LONG/8)
-
 
417
#define PADDING (BYTES_PER_LONG - (sizeof(struct fb_info) % BYTES_PER_LONG))
-
 
418
        int fb_info_size = sizeof(struct fb_info);
-
 
419
        struct fb_info *info;
-
 
420
        char *p;
-
 
421
 
-
 
422
        if (size)
-
 
423
                fb_info_size += PADDING;
-
 
424
 
-
 
425
        p = kzalloc(fb_info_size + size, GFP_KERNEL);
-
 
426
 
-
 
427
        if (!p)
-
 
428
                return NULL;
-
 
429
 
-
 
430
        info = (struct fb_info *) p;
-
 
431
 
-
 
432
        if (size)
-
 
433
                info->par = p + fb_info_size;
-
 
434
 
-