Commit e2f572aa authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Gerd Hoffmann
Browse files

drm/hisilicon: Convert hibmc-drm driver to |struct drm_gem_vram_object|



The data structure |struct drm_gem_vram_object| and its helpers replace
|struct hibmc_bo|. It's the same implementation; except for the type
names.

v4:
	* select config option DRM_VRAM_HELPER

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: http://patchwork.freedesktop.org/patch/msgid/20190508082630.15116-20-tzimmermann@suse.de


Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 94065bf5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ config DRM_HISI_HIBMC
	depends on DRM && PCI && MMU
	select DRM_KMS_HELPER
	select DRM_TTM
	select DRM_VRAM_HELPER

	help
	  Choose this option if you have a Hisilicon Hibmc soc chipset.
+13 −8
Original line number Diff line number Diff line
@@ -96,27 +96,32 @@ static void hibmc_plane_atomic_update(struct drm_plane *plane,
	struct drm_plane_state	*state	= plane->state;
	u32 reg;
	int ret;
	u64 gpu_addr = 0;
	s64 gpu_addr = 0;
	unsigned int line_l;
	struct hibmc_drm_private *priv = plane->dev->dev_private;
	struct hibmc_framebuffer *hibmc_fb;
	struct hibmc_bo *bo;
	struct drm_gem_vram_object *gbo;

	if (!state->fb)
		return;

	hibmc_fb = to_hibmc_framebuffer(state->fb);
	bo = gem_to_hibmc_bo(hibmc_fb->obj);
	ret = ttm_bo_reserve(&bo->bo, true, false, NULL);
	gbo = drm_gem_vram_of_gem(hibmc_fb->obj);
	ret = drm_gem_vram_reserve(gbo, false);
	if (ret) {
		DRM_ERROR("failed to reserve ttm_bo: %d", ret);
		DRM_ERROR("failed to reserve BO: %d", ret);
		return;
	}

	ret = hibmc_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
	ttm_bo_unreserve(&bo->bo);
	ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
	drm_gem_vram_unreserve(gbo);
	if (ret) {
		DRM_ERROR("failed to pin hibmc_bo: %d", ret);
		DRM_ERROR("failed to pin bo: %d", ret);
		return;
	}
	gpu_addr = drm_gem_vram_offset(gbo);
	if (gpu_addr < 0) {
		drm_gem_vram_unpin(gbo);
		return;
	}

+3 −2
Original line number Diff line number Diff line
@@ -63,9 +63,10 @@ static struct drm_driver hibmc_driver = {
	.desc			= "hibmc drm driver",
	.major			= 1,
	.minor			= 0,
	.gem_free_object_unlocked = hibmc_gem_free_object,
	.gem_free_object_unlocked =
		drm_gem_vram_driver_gem_free_object_unlocked,
	.dumb_create            = hibmc_dumb_create,
	.dumb_map_offset        = hibmc_dumb_mmap_offset,
	.dumb_map_offset        = drm_gem_vram_driver_dumb_mmap_offset,
	.irq_handler		= hibmc_drm_interrupt,
};

+1 −24
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_gem.h>
#include <drm/drm_gem_vram_helper.h>
#include <drm/ttm/ttm_bo_driver.h>

struct hibmc_framebuffer {
@@ -59,25 +60,6 @@ struct hibmc_drm_private {

#define to_hibmc_framebuffer(x) container_of(x, struct hibmc_framebuffer, fb)

struct hibmc_bo {
	struct ttm_buffer_object bo;
	struct ttm_placement placement;
	struct ttm_bo_kmap_obj kmap;
	struct drm_gem_object gem;
	struct ttm_place placements[3];
	int pin_count;
};

static inline struct hibmc_bo *hibmc_bo(struct ttm_buffer_object *bo)
{
	return container_of(bo, struct hibmc_bo, bo);
}

static inline struct hibmc_bo *gem_to_hibmc_bo(struct drm_gem_object *gem)
{
	return container_of(gem, struct hibmc_bo, gem);
}

void hibmc_set_power_mode(struct hibmc_drm_private *priv,
			  unsigned int power_mode);
void hibmc_set_current_gate(struct hibmc_drm_private *priv,
@@ -97,13 +79,8 @@ hibmc_framebuffer_init(struct drm_device *dev,

int hibmc_mm_init(struct hibmc_drm_private *hibmc);
void hibmc_mm_fini(struct hibmc_drm_private *hibmc);
int hibmc_bo_pin(struct hibmc_bo *bo, u32 pl_flag, u64 *gpu_addr);
int hibmc_bo_unpin(struct hibmc_bo *bo);
void hibmc_gem_free_object(struct drm_gem_object *obj);
int hibmc_dumb_create(struct drm_file *file, struct drm_device *dev,
		      struct drm_mode_create_dumb *args);
int hibmc_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
			   u32 handle, u64 *offset);
int hibmc_mmap(struct file *filp, struct vm_area_struct *vma);

extern const struct drm_mode_config_funcs hibmc_mode_funcs;
+16 −14
Original line number Diff line number Diff line
@@ -66,7 +66,8 @@ static int hibmc_drm_fb_create(struct drm_fb_helper *helper,
	int ret1;
	size_t size;
	unsigned int bytes_per_pixel;
	struct hibmc_bo *bo = NULL;
	struct drm_gem_vram_object *gbo = NULL;
	void *base;

	DRM_DEBUG_DRIVER("surface width(%d), height(%d) and bpp(%d)\n",
			 sizes->surface_width, sizes->surface_height,
@@ -88,26 +89,27 @@ static int hibmc_drm_fb_create(struct drm_fb_helper *helper,
		return -ENOMEM;
	}

	bo = gem_to_hibmc_bo(gobj);
	gbo = drm_gem_vram_of_gem(gobj);

	ret = ttm_bo_reserve(&bo->bo, true, false, NULL);
	ret = drm_gem_vram_reserve(gbo, false);
	if (ret) {
		DRM_ERROR("failed to reserve ttm_bo: %d\n", ret);
		DRM_ERROR("failed to reserve bo: %d\n", ret);
		goto out_unref_gem;
	}

	ret = hibmc_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
	ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
	if (ret) {
		DRM_ERROR("failed to pin fbcon: %d\n", ret);
		goto out_unreserve_ttm_bo;
	}

	ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &bo->kmap);
	if (ret) {
	base = drm_gem_vram_kmap(gbo, true, NULL);
	if (IS_ERR(base)) {
		ret = PTR_ERR(base);
		DRM_ERROR("failed to kmap fbcon: %d\n", ret);
		goto out_unpin_bo;
	}
	ttm_bo_unreserve(&bo->bo);
	drm_gem_vram_unreserve(gbo);

	info = drm_fb_helper_alloc_fbi(helper);
	if (IS_ERR(info)) {
@@ -131,24 +133,24 @@ static int hibmc_drm_fb_create(struct drm_fb_helper *helper,

	drm_fb_helper_fill_info(info, &priv->fbdev->helper, sizes);

	info->screen_base = bo->kmap.virtual;
	info->screen_base = base;
	info->screen_size = size;

	info->fix.smem_start = bo->bo.mem.bus.offset + bo->bo.mem.bus.base;
	info->fix.smem_start = gbo->bo.mem.bus.offset + gbo->bo.mem.bus.base;
	info->fix.smem_len = size;
	return 0;

out_release_fbi:
	ret1 = ttm_bo_reserve(&bo->bo, true, false, NULL);
	ret1 = drm_gem_vram_reserve(gbo, false);
	if (ret1) {
		DRM_ERROR("failed to rsv ttm_bo when release fbi: %d\n", ret1);
		goto out_unref_gem;
	}
	ttm_bo_kunmap(&bo->kmap);
	drm_gem_vram_kunmap(gbo);
out_unpin_bo:
	hibmc_bo_unpin(bo);
	drm_gem_vram_unpin(gbo);
out_unreserve_ttm_bo:
	ttm_bo_unreserve(&bo->bo);
	drm_gem_vram_unreserve(gbo);
out_unref_gem:
	drm_gem_object_put_unlocked(gobj);

Loading