[PATCH] drm/tidss: implement WA for AM65xx erratum i2000

Jyri Sarha jsarha at ti.com
Wed Aug 12 13:32:37 UTC 2020


On 12/08/2020 14:26, Tomi Valkeinen wrote:
> This patch implements WA for AM65xx erratum i2000, which causes YUV
> formats to show wrong colors.
> 
> An earlier patch removed a partial WA:
> 
> a8d9d7da1546349f18eb2d6b6b3a04bdeb38719d ("drm/tidss: remove AM65x PG1 YUV erratum code")
> 
> The patch explains the reasoning for removal. The change in plans has
> been that it has become clear that there are and will be users for PG1
> SoCs and as such it's good to implement the WA for PG1s.
> 
> This patch adds the WA back so that it is only used on SR1.0 (which is
> the new name for PG1). The previous WA code didn't check the SoC
> revision, which this patch does.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>

Reviewed-by: Jyri Sarha <jsarha at ti.com>

> ---
>  drivers/gpu/drm/tidss/tidss_dispc.c | 32 +++++++++++++++++++++++++----
>  drivers/gpu/drm/tidss/tidss_dispc.h |  4 ++++
>  2 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c b/drivers/gpu/drm/tidss/tidss_dispc.c
> index 629dd06393f6..a3e8caf319bb 100644
> --- a/drivers/gpu/drm/tidss/tidss_dispc.c
> +++ b/drivers/gpu/drm/tidss/tidss_dispc.c
> @@ -19,6 +19,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/pm_runtime.h>
>  #include <linux/regmap.h>
> +#include <linux/sys_soc.h>
>  
>  #include <drm/drm_fourcc.h>
>  #include <drm/drm_fb_cma_helper.h>
> @@ -302,6 +303,8 @@ struct dispc_device {
>  	u32 num_fourccs;
>  
>  	u32 memory_bandwidth_limit;
> +
> +	struct dispc_errata errata;
>  };
>  
>  static void dispc_write(struct dispc_device *dispc, u16 reg, u32 val)
> @@ -2641,6 +2644,19 @@ static int dispc_init_am65x_oldi_io_ctrl(struct device *dev,
>  	return 0;
>  }
>  
> +static void dispc_init_errata(struct dispc_device *dispc)
> +{
> +	static const struct soc_device_attribute am65x_sr10_soc_devices[] = {
> +		{ .family = "AM65X", .revision = "SR1.0" },
> +		{ /* sentinel */ }
> +	};
> +
> +	if (soc_device_match(am65x_sr10_soc_devices)) {
> +		dispc->errata.i2000 = true;
> +		dev_info(dispc->dev, "WA for erratum i2000: YUV formats disabled\n");
> +	}
> +}
> +
>  int dispc_init(struct tidss_device *tidss)
>  {
>  	struct device *dev = tidss->dev;
> @@ -2664,19 +2680,27 @@ int dispc_init(struct tidss_device *tidss)
>  	if (!dispc)
>  		return -ENOMEM;
>  
> +	dispc->tidss = tidss;
> +	dispc->dev = dev;
> +	dispc->feat = feat;
> +
> +	dispc_init_errata(dispc);
> +
>  	dispc->fourccs = devm_kcalloc(dev, ARRAY_SIZE(dispc_color_formats),
>  				      sizeof(*dispc->fourccs), GFP_KERNEL);
>  	if (!dispc->fourccs)
>  		return -ENOMEM;
>  
>  	num_fourccs = 0;
> -	for (i = 0; i < ARRAY_SIZE(dispc_color_formats); ++i)
> +	for (i = 0; i < ARRAY_SIZE(dispc_color_formats); ++i) {
> +		if (dispc->errata.i2000 &&
> +		    dispc_fourcc_is_yuv(dispc_color_formats[i].fourcc)) {
> +			continue;
> +		}
>  		dispc->fourccs[num_fourccs++] = dispc_color_formats[i].fourcc;
> +	}
>  
>  	dispc->num_fourccs = num_fourccs;
> -	dispc->tidss = tidss;
> -	dispc->dev = dev;
> -	dispc->feat = feat;
>  
>  	dispc_common_regmap = dispc->feat->common_regs;
>  
> diff --git a/drivers/gpu/drm/tidss/tidss_dispc.h b/drivers/gpu/drm/tidss/tidss_dispc.h
> index 902e612ff7ac..353972fe658a 100644
> --- a/drivers/gpu/drm/tidss/tidss_dispc.h
> +++ b/drivers/gpu/drm/tidss/tidss_dispc.h
> @@ -46,6 +46,10 @@ struct dispc_features_scaling {
>  	u32 xinc_max;
>  };
>  
> +struct dispc_errata {
> +	bool i2000; /* DSS Does Not Support YUV Pixel Data Formats */
> +};
> +
>  enum dispc_vp_bus_type {
>  	DISPC_VP_DPI,		/* DPI output */
>  	DISPC_VP_OLDI,		/* OLDI (LVDS) output */
> 


-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


More information about the dri-devel mailing list