diff options
Diffstat (limited to 'drivers/gpu/drm/arm/display')
7 files changed, 57 insertions, 14 deletions
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c index 5a118984de33..9d4d5075cc64 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c @@ -8,6 +8,7 @@  #include <linux/iommu.h>  #include <linux/of_device.h>  #include <linux/of_graph.h> +#include <linux/of_reserved_mem.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h>  #ifdef CONFIG_DEBUG_FS @@ -126,7 +127,7 @@ static int komeda_parse_pipe_dt(struct komeda_dev *mdev, struct device_node *np)  	pipe->of_output_port =  		of_graph_get_port_by_id(np, KOMEDA_OF_PORT_OUTPUT); -	pipe->of_node = np; +	pipe->of_node = of_node_get(np);  	return 0;  } @@ -143,6 +144,12 @@ static int komeda_parse_dt(struct device *dev, struct komeda_dev *mdev)  		return mdev->irq;  	} +	/* Get the optional framebuffer memory resource */ +	ret = of_reserved_mem_device_init(dev); +	if (ret && ret != -ENODEV) +		return ret; +	ret = 0; +  	for_each_available_child_of_node(np, child) {  		if (of_node_cmp(child->name, "pipeline") == 0) {  			ret = komeda_parse_pipe_dt(mdev, child); @@ -289,6 +296,8 @@ void komeda_dev_destroy(struct komeda_dev *mdev)  	mdev->n_pipelines = 0; +	of_reserved_mem_device_release(dev); +  	if (funcs && funcs->cleanup)  		funcs->cleanup(mdev); diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c index cd4d9f53ddef..c9a1edb9a000 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c @@ -35,6 +35,25 @@ komeda_get_format_caps(struct komeda_format_caps_table *table,  	return NULL;  } +u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info, u64 modifier) +{ +	u32 bpp; + +	switch (info->format) { +	case DRM_FORMAT_YUV420_8BIT: +		bpp = 12; +		break; +	case DRM_FORMAT_YUV420_10BIT: +		bpp = 15; +		break; +	default: +		bpp = info->cpp[0] * 8; +		break; +	} + +	return bpp; +} +  /* Two assumptions   * 1. RGB always has YTR   * 2. Tiled RGB always has SC diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h index 3631910d33b5..32273cf18f7c 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h +++ b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h @@ -97,6 +97,9 @@ const struct komeda_format_caps *  komeda_get_format_caps(struct komeda_format_caps_table *table,  		       u32 fourcc, u64 modifier); +u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info, +			       u64 modifier); +  u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table,  				  u32 layer_type, u32 *n_fmts); diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c b/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c index 3b0a70ed6aa0..1b01a625f40e 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c @@ -43,7 +43,7 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file,  	struct drm_framebuffer *fb = &kfb->base;  	const struct drm_format_info *info = fb->format;  	struct drm_gem_object *obj; -	u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks; +	u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks, bpp;  	u64 min_size;  	obj = drm_gem_object_lookup(file, mode_cmd->handles[0]); @@ -88,8 +88,9 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file,  	kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE,  				    alignment_header); +	bpp = komeda_get_afbc_format_bpp(info, fb->modifier);  	kfb->afbc_size = kfb->offset_payload + n_blocks * -			 ALIGN(info->cpp[0] * AFBC_SUPERBLK_PIXELS, +			 ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8,  			       AFBC_SUPERBLK_ALIGNMENT);  	min_size = kfb->afbc_size + fb->offsets[0];  	if (min_size > obj->size) { diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c index 419a8b0e5de8..69d9e26c60c8 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c @@ -14,6 +14,7 @@  #include <drm/drm_gem_cma_helper.h>  #include <drm/drm_gem_framebuffer_helper.h>  #include <drm/drm_irq.h> +#include <drm/drm_probe_helper.h>  #include <drm/drm_vblank.h>  #include "komeda_dev.h" @@ -146,7 +147,6 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc,  	struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(crtc_st);  	struct komeda_plane_state *kplane_st;  	struct drm_plane_state *plane_st; -	struct drm_framebuffer *fb;  	struct drm_plane *plane;  	struct list_head zorder_list;  	int order = 0, err; @@ -172,7 +172,6 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc,  	list_for_each_entry(kplane_st, &zorder_list, zlist_node) {  		plane_st = &kplane_st->base; -		fb = plane_st->fb;  		plane = plane_st->plane;  		plane_st->normalized_zpos = order++; @@ -205,7 +204,7 @@ static int komeda_kms_check(struct drm_device *dev,  			    struct drm_atomic_state *state)  {  	struct drm_crtc *crtc; -	struct drm_crtc_state *old_crtc_st, *new_crtc_st; +	struct drm_crtc_state *new_crtc_st;  	int i, err;  	err = drm_atomic_helper_check_modeset(dev, state); @@ -216,7 +215,7 @@ static int komeda_kms_check(struct drm_device *dev,  	 * so need to add all affected_planes (even unchanged) to  	 * drm_atomic_state.  	 */ -	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_st, new_crtc_st, i) { +	for_each_new_crtc_in_state(state, crtc, new_crtc_st, i) {  		err = drm_atomic_add_affected_planes(state, crtc);  		if (err)  			return err; @@ -307,24 +306,33 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev)  			       komeda_kms_irq_handler, IRQF_SHARED,  			       drm->driver->name, drm);  	if (err) -		goto cleanup_mode_config; +		goto free_component_binding;  	err = mdev->funcs->enable_irq(mdev);  	if (err) -		goto cleanup_mode_config; +		goto free_component_binding;  	drm->irq_enabled = true; +	drm_kms_helper_poll_init(drm); +  	err = drm_dev_register(drm, 0);  	if (err) -		goto cleanup_mode_config; +		goto free_interrupts;  	return kms; -cleanup_mode_config: +free_interrupts: +	drm_kms_helper_poll_fini(drm);  	drm->irq_enabled = false; +	mdev->funcs->disable_irq(mdev); +free_component_binding: +	component_unbind_all(mdev->dev, drm); +cleanup_mode_config:  	drm_mode_config_cleanup(drm);  	komeda_kms_cleanup_private_objs(kms); +	drm->dev_private = NULL; +	drm_dev_put(drm);  free_kms:  	kfree(kms);  	return ERR_PTR(err); @@ -335,12 +343,14 @@ void komeda_kms_detach(struct komeda_kms_dev *kms)  	struct drm_device *drm = &kms->base;  	struct komeda_dev *mdev = drm->dev_private; +	drm_dev_unregister(drm); +	drm_kms_helper_poll_fini(drm); +	drm_atomic_helper_shutdown(drm);  	drm->irq_enabled = false;  	mdev->funcs->disable_irq(mdev); -	drm_dev_unregister(drm);  	component_unbind_all(mdev->dev, drm); -	komeda_kms_cleanup_private_objs(kms);  	drm_mode_config_cleanup(drm); +	komeda_kms_cleanup_private_objs(kms);  	drm->dev_private = NULL;  	drm_dev_put(drm);  } diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h index a90bcbb3cb23..14b683164544 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h +++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h @@ -480,6 +480,7 @@ void komeda_pipeline_dump_register(struct komeda_pipeline *pipe,  				   struct seq_file *sf);  /* component APIs */ +extern __printf(10, 11)  struct komeda_component *  komeda_component_add(struct komeda_pipeline *pipe,  		     size_t comp_sz, u32 id, u32 hw_id, diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c index 617e1f7b8472..2851cac94d86 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c @@ -148,7 +148,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,  	if (!kcrtc->master->wb_layer)  		return 0; -	kwb_conn = kzalloc(sizeof(*wb_conn), GFP_KERNEL); +	kwb_conn = kzalloc(sizeof(*kwb_conn), GFP_KERNEL);  	if (!kwb_conn)  		return -ENOMEM;  | 
