mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-11 13:04:03 +08:00
drm/radeon: introduce gem_to_radeon_bo helper
... and switch it to container_of upcasting. v2: converted new pageflip code-paths. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
441921d530
commit
7e4d15d90a
@ -1030,7 +1030,7 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
* just update base pointers
|
||||
*/
|
||||
obj = radeon_fb->obj;
|
||||
rbo = obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
@ -1145,7 +1145,7 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
|
||||
if (!atomic && fb && fb != crtc->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = radeon_fb->obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
@ -1191,7 +1191,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
}
|
||||
|
||||
obj = radeon_fb->obj;
|
||||
rbo = obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
@ -1308,7 +1308,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
|
||||
if (!atomic && fb && fb != crtc->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = radeon_fb->obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
@ -261,6 +261,7 @@ struct radeon_bo {
|
||||
struct drm_gem_object *gobj;
|
||||
struct drm_gem_object gem_base;
|
||||
};
|
||||
#define gem_to_radeon_bo(gobj) container_of((gobj), struct radeon_bo, gem_base)
|
||||
|
||||
struct radeon_bo_list {
|
||||
struct ttm_validate_buffer tv;
|
||||
|
@ -75,7 +75,7 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
||||
return -ENOENT;
|
||||
}
|
||||
p->relocs_ptr[i] = &p->relocs[i];
|
||||
p->relocs[i].robj = p->relocs[i].gobj->driver_private;
|
||||
p->relocs[i].robj = gem_to_radeon_bo(p->relocs[i].gobj);
|
||||
p->relocs[i].lobj.bo = p->relocs[i].robj;
|
||||
p->relocs[i].lobj.wdomain = r->write_domain;
|
||||
p->relocs[i].lobj.rdomain = r->read_domains;
|
||||
|
@ -860,7 +860,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
||||
if (rfb == NULL || rfb->obj == NULL) {
|
||||
continue;
|
||||
}
|
||||
robj = rfb->obj->driver_private;
|
||||
robj = gem_to_radeon_bo(rfb->obj);
|
||||
/* don't unpin kernel fb objects */
|
||||
if (!radeon_fbdev_robj_is_fb(rdev, robj)) {
|
||||
r = radeon_bo_reserve(robj, false);
|
||||
|
@ -371,7 +371,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
|
||||
new_radeon_fb = to_radeon_framebuffer(fb);
|
||||
/* schedule unpin of the old buffer */
|
||||
obj = old_radeon_fb->obj;
|
||||
rbo = obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
work->old_rbo = rbo;
|
||||
INIT_WORK(&work->work, radeon_unpin_work_func);
|
||||
|
||||
@ -391,7 +391,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
|
||||
|
||||
/* pin the new buffer */
|
||||
obj = new_radeon_fb->obj;
|
||||
rbo = obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
|
||||
DRM_DEBUG_DRIVER("flip-ioctl() cur_fbo = %p, cur_bbo = %p\n",
|
||||
work->old_rbo, rbo);
|
||||
|
@ -90,7 +90,7 @@ int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tile
|
||||
|
||||
static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj)
|
||||
{
|
||||
struct radeon_bo *rbo = gobj->driver_private;
|
||||
struct radeon_bo *rbo = gem_to_radeon_bo(gobj);
|
||||
int ret;
|
||||
|
||||
ret = radeon_bo_reserve(rbo, false);
|
||||
@ -128,7 +128,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
|
||||
aligned_size);
|
||||
return -ENOMEM;
|
||||
}
|
||||
rbo = gobj->driver_private;
|
||||
rbo = gem_to_radeon_bo(gobj);
|
||||
|
||||
if (fb_tiled)
|
||||
tiling_flags = RADEON_TILING_MACRO;
|
||||
@ -202,7 +202,7 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
|
||||
mode_cmd.depth = sizes->surface_depth;
|
||||
|
||||
ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj);
|
||||
rbo = gobj->driver_private;
|
||||
rbo = gem_to_radeon_bo(gobj);
|
||||
|
||||
/* okay we have an object now allocate the framebuffer */
|
||||
info = framebuffer_alloc(0, device);
|
||||
@ -403,14 +403,14 @@ int radeon_fbdev_total_size(struct radeon_device *rdev)
|
||||
struct radeon_bo *robj;
|
||||
int size = 0;
|
||||
|
||||
robj = rdev->mode_info.rfbdev->rfb.obj->driver_private;
|
||||
robj = gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj);
|
||||
size += radeon_bo_size(robj);
|
||||
return size;
|
||||
}
|
||||
|
||||
bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj)
|
||||
{
|
||||
if (robj == rdev->mode_info.rfbdev->rfb.obj->driver_private)
|
||||
if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
@ -39,9 +39,8 @@ int radeon_gem_object_init(struct drm_gem_object *obj)
|
||||
|
||||
void radeon_gem_object_free(struct drm_gem_object *gobj)
|
||||
{
|
||||
struct radeon_bo *robj = gobj->driver_private;
|
||||
struct radeon_bo *robj = gem_to_radeon_bo(gobj);
|
||||
|
||||
gobj->driver_private = NULL;
|
||||
if (robj) {
|
||||
radeon_bo_unref(&robj);
|
||||
}
|
||||
@ -79,7 +78,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size,
|
||||
int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
|
||||
uint64_t *gpu_addr)
|
||||
{
|
||||
struct radeon_bo *robj = obj->driver_private;
|
||||
struct radeon_bo *robj = gem_to_radeon_bo(obj);
|
||||
int r;
|
||||
|
||||
r = radeon_bo_reserve(robj, false);
|
||||
@ -92,7 +91,7 @@ int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
|
||||
|
||||
void radeon_gem_object_unpin(struct drm_gem_object *obj)
|
||||
{
|
||||
struct radeon_bo *robj = obj->driver_private;
|
||||
struct radeon_bo *robj = gem_to_radeon_bo(obj);
|
||||
int r;
|
||||
|
||||
r = radeon_bo_reserve(robj, false);
|
||||
@ -110,7 +109,7 @@ int radeon_gem_set_domain(struct drm_gem_object *gobj,
|
||||
int r;
|
||||
|
||||
/* FIXME: reeimplement */
|
||||
robj = gobj->driver_private;
|
||||
robj = gem_to_radeon_bo(gobj);
|
||||
/* work out where to validate the buffer to */
|
||||
domain = wdomain;
|
||||
if (!domain) {
|
||||
@ -224,7 +223,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,
|
||||
if (gobj == NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
robj = gobj->driver_private;
|
||||
robj = gem_to_radeon_bo(gobj);
|
||||
|
||||
r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
|
||||
|
||||
@ -243,7 +242,7 @@ int radeon_mode_dumb_mmap(struct drm_file *filp,
|
||||
if (gobj == NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
robj = gobj->driver_private;
|
||||
robj = gem_to_radeon_bo(gobj);
|
||||
*offset_p = radeon_bo_mmap_offset(robj);
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
return 0;
|
||||
@ -270,7 +269,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
|
||||
if (gobj == NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
robj = gobj->driver_private;
|
||||
robj = gem_to_radeon_bo(gobj);
|
||||
r = radeon_bo_wait(robj, &cur_placement, true);
|
||||
switch (cur_placement) {
|
||||
case TTM_PL_VRAM:
|
||||
@ -300,7 +299,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
|
||||
if (gobj == NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
robj = gobj->driver_private;
|
||||
robj = gem_to_radeon_bo(gobj);
|
||||
r = radeon_bo_wait(robj, NULL, false);
|
||||
/* callback hw specific functions if any */
|
||||
if (robj->rdev->asic->ioctl_wait_idle)
|
||||
@ -321,7 +320,7 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
|
||||
gobj = drm_gem_object_lookup(dev, filp, args->handle);
|
||||
if (gobj == NULL)
|
||||
return -ENOENT;
|
||||
robj = gobj->driver_private;
|
||||
robj = gem_to_radeon_bo(gobj);
|
||||
r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
return r;
|
||||
@ -339,7 +338,7 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
|
||||
gobj = drm_gem_object_lookup(dev, filp, args->handle);
|
||||
if (gobj == NULL)
|
||||
return -ENOENT;
|
||||
rbo = gobj->driver_private;
|
||||
rbo = gem_to_radeon_bo(gobj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
goto out;
|
||||
|
@ -415,7 +415,7 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
|
||||
/* Pin framebuffer & get tilling informations */
|
||||
obj = radeon_fb->obj;
|
||||
rbo = obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
@ -520,7 +520,7 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
|
||||
if (!atomic && fb && fb != crtc->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = radeon_fb->obj->driver_private;
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
@ -128,7 +128,7 @@ retry:
|
||||
}
|
||||
bo->rdev = rdev;
|
||||
bo->gobj = &bo->gem_base;
|
||||
bo->gem_base.driver_private = bo;
|
||||
bo->gem_base.driver_private = NULL;
|
||||
bo->surface_reg = -1;
|
||||
INIT_LIST_HEAD(&bo->list);
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
@ -282,7 +282,6 @@ void radeon_bo_force_delete(struct radeon_device *rdev)
|
||||
list_del_init(&bo->list);
|
||||
mutex_unlock(&bo->rdev->gem.mutex);
|
||||
radeon_bo_unref(&bo);
|
||||
gobj->driver_private = NULL;
|
||||
drm_gem_object_unreference(gobj);
|
||||
mutex_unlock(&rdev->ddev->struct_mutex);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user