[PATCH 4/4] drm: remove the raw_edid field from struct drm_display_info

InKi Dae inki.dae at samsung.com
Tue Aug 21 22:18:45 PDT 2012


Acked-by: Inki Dae <inki.dae at samsung.com>

2012/8/15 Jani Nikula <jani.nikula at intel.com>:
> Neither the drm core nor any of the drivers really need the raw_edid field
> of struct drm_display_info for anything. Instead of being useful, it
> creates confusion about who is responsible for freeing the memory it points
> to and setting the field to NULL afterwards, leading to memory leaks and
> dangling pointers.
>
> Remove the raw_edid field, and fix drivers as necessary.
>
> Reported-by: Russell King <linux at arm.linux.org.uk>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
>  drivers/gpu/drm/drm_edid.c                    |    3 ---
>  drivers/gpu/drm/drm_edid_load.c               |   23 +++++++++++++----------
>  drivers/gpu/drm/exynos/exynos_drm_connector.c |    4 +---
>  drivers/gpu/drm/exynos/exynos_drm_vidi.c      |   13 -------------
>  drivers/gpu/drm/gma500/cdv_intel_hdmi.c       |    2 --
>  drivers/gpu/drm/gma500/oaktrail_hdmi.c        |    1 -
>  drivers/gpu/drm/gma500/psb_intel_sdvo.c       |    3 ---
>  drivers/gpu/drm/i915/intel_dp.c               |    4 ----
>  drivers/gpu/drm/i915/intel_hdmi.c             |    3 ---
>  drivers/gpu/drm/i915/intel_modes.c            |    1 -
>  drivers/gpu/drm/i915/intel_sdvo.c             |    3 ---
>  drivers/gpu/drm/mgag200/mgag200_mode.c        |    1 -
>  drivers/gpu/drm/udl/udl_connector.c           |    3 ---
>  drivers/staging/omapdrm/omap_connector.c      |    5 +----
>  include/drm/drm_crtc.h                        |    2 --
>  15 files changed, 15 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index a8743c3..bcc4725 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -399,10 +399,7 @@ struct edid *drm_get_edid(struct drm_connector *connector,
>         if (drm_probe_ddc(adapter))
>                 edid = (struct edid *)drm_do_get_edid(connector, adapter);
>
> -       connector->display_info.raw_edid = (char *)edid;
> -
>         return edid;
> -
>  }
>  EXPORT_SYMBOL(drm_get_edid);
>
> diff --git a/drivers/gpu/drm/drm_edid_load.c b/drivers/gpu/drm/drm_edid_load.c
> index 0303935..186832e 100644
> --- a/drivers/gpu/drm/drm_edid_load.c
> +++ b/drivers/gpu/drm/drm_edid_load.c
> @@ -114,8 +114,8 @@ static u8 generic_edid[GENERIC_EDIDS][128] = {
>         },
>  };
>
> -static int edid_load(struct drm_connector *connector, char *name,
> -                    char *connector_name)
> +static u8 *edid_load(struct drm_connector *connector, char *name,
> +                       char *connector_name)
>  {
>         const struct firmware *fw;
>         struct platform_device *pdev;
> @@ -205,7 +205,6 @@ static int edid_load(struct drm_connector *connector, char *name,
>                 edid = new_edid;
>         }
>
> -       connector->display_info.raw_edid = edid;
>         DRM_INFO("Got %s EDID base block and %d extension%s from "
>             "\"%s\" for connector \"%s\"\n", builtin ? "built-in" :
>             "external", valid_extensions, valid_extensions == 1 ? "" : "s",
> @@ -215,7 +214,10 @@ relfw_out:
>         release_firmware(fw);
>
>  out:
> -       return err;
> +       if (err)
> +               return ERR_PTR(err);
> +
> +       return edid;
>  }
>
>  int drm_load_edid_firmware(struct drm_connector *connector)
> @@ -223,6 +225,7 @@ int drm_load_edid_firmware(struct drm_connector *connector)
>         char *connector_name = drm_get_connector_name(connector);
>         char *edidname = edid_firmware, *last, *colon;
>         int ret;
> +       struct edid *edid;
>
>         if (*edidname == '\0')
>                 return 0;
> @@ -240,13 +243,13 @@ int drm_load_edid_firmware(struct drm_connector *connector)
>         if (*last == '\n')
>                 *last = '\0';
>
> -       ret = edid_load(connector, edidname, connector_name);
> -       if (ret)
> +       edid = (struct edid *) edid_load(connector, edidname, connector_name);
> +       if (IS_ERR_OR_NULL(edid))
>                 return 0;
>
> -       drm_mode_connector_update_edid_property(connector,
> -           (struct edid *) connector->display_info.raw_edid);
> +       drm_mode_connector_update_edid_property(connector, edid);
> +       ret = drm_add_edid_modes(connector, edid);
> +       kfree(edid);
>
> -       return drm_add_edid_modes(connector, (struct edid *)
> -           connector->display_info.raw_edid);
> +       return ret;
>  }
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
> index d956819..9dce3b9 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
> @@ -147,9 +147,7 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
>
>                 drm_mode_connector_update_edid_property(connector, edid);
>                 count = drm_add_edid_modes(connector, edid);
> -
> -               kfree(connector->display_info.raw_edid);
> -               connector->display_info.raw_edid = edid;
> +               kfree(edid);
>         } else {
>                 struct drm_display_mode *mode = drm_mode_create(connector->dev);
>                 struct exynos_drm_panel_info *panel;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> index bb1550c..9239525 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> @@ -102,7 +102,6 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
>                                 u8 *edid, int len)
>  {
>         struct vidi_context *ctx = get_vidi_context(dev);
> -       struct edid *raw_edid;
>
>         DRM_DEBUG_KMS("%s\n", __FILE__);
>
> @@ -115,18 +114,6 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
>                 return -EFAULT;
>         }
>
> -       raw_edid = kzalloc(len, GFP_KERNEL);
> -       if (!raw_edid) {
> -               DRM_DEBUG_KMS("failed to allocate raw_edid.\n");
> -               return -ENOMEM;
> -       }
> -
> -       memcpy(raw_edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions)
> -                                               * EDID_LENGTH, len));
> -
> -       /* attach the edid data to connector. */
> -       connector->display_info.raw_edid = (char *)raw_edid;
> -
>         memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions)
>                                         * EDID_LENGTH, len));
>
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
> index a86f87b..9db0ef1 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
> @@ -157,8 +157,6 @@ static enum drm_connector_status cdv_hdmi_detect(
>                         hdmi_priv->has_hdmi_audio =
>                                                 drm_detect_monitor_audio(edid);
>                 }
> -
> -               psb_intel_connector->base.display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>         return status;
> diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi.c b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
> index 2eb3dc4..69e51e9 100644
> --- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c
> +++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
> @@ -252,7 +252,6 @@ static int oaktrail_hdmi_get_modes(struct drm_connector *connector)
>         if (edid) {
>                 drm_mode_connector_update_edid_property(connector, edid);
>                 ret = drm_add_edid_modes(connector, edid);
> -               connector->display_info.raw_edid = NULL;
>         }
>
>         /*
> diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
> index 0466c7b..a453d94 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
> @@ -1343,7 +1343,6 @@ psb_intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
>                         }
>                 } else
>                         status = connector_status_disconnected;
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>
> @@ -1404,7 +1403,6 @@ psb_intel_sdvo_detect(struct drm_connector *connector, bool force)
>                                 ret = connector_status_disconnected;
>                         else
>                                 ret = connector_status_connected;
> -                       connector->display_info.raw_edid = NULL;
>                         kfree(edid);
>                 } else
>                         ret = connector_status_connected;
> @@ -1453,7 +1451,6 @@ static void psb_intel_sdvo_get_ddc_modes(struct drm_connector *connector)
>                         drm_add_edid_modes(connector, edid);
>                 }
>
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>  }
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 0a56b9a..bffd8cc 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -2160,7 +2160,6 @@ intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *ada
>                 ret = drm_add_edid_modes(connector, intel_dp->edid);
>                 drm_edid_to_eld(connector,
>                                 intel_dp->edid);
> -               connector->display_info.raw_edid = NULL;
>                 return intel_dp->edid_mode_count;
>         }
>
> @@ -2206,7 +2205,6 @@ intel_dp_detect(struct drm_connector *connector, bool force)
>                 edid = intel_dp_get_edid(connector, &intel_dp->adapter);
>                 if (edid) {
>                         intel_dp->has_audio = drm_detect_monitor_audio(edid);
> -                       connector->display_info.raw_edid = NULL;
>                         kfree(edid);
>                 }
>         }
> @@ -2271,8 +2269,6 @@ intel_dp_detect_audio(struct drm_connector *connector)
>         edid = intel_dp_get_edid(connector, &intel_dp->adapter);
>         if (edid) {
>                 has_audio = drm_detect_monitor_audio(edid);
> -
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index 98f6024..6a29f72 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -737,7 +737,6 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
>                                                 drm_detect_hdmi_monitor(edid);
>                         intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
>                 }
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>
> @@ -778,8 +777,6 @@ intel_hdmi_detect_audio(struct drm_connector *connector)
>         if (edid) {
>                 if (edid->input & DRM_EDID_INPUT_DIGITAL)
>                         has_audio = drm_detect_monitor_audio(edid);
> -
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>
> diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c
> index 45848b9..7a5238f 100644
> --- a/drivers/gpu/drm/i915/intel_modes.c
> +++ b/drivers/gpu/drm/i915/intel_modes.c
> @@ -50,7 +50,6 @@ int intel_ddc_get_modes(struct drm_connector *connector,
>                 drm_mode_connector_update_edid_property(connector, edid);
>                 ret = drm_add_edid_modes(connector, edid);
>                 drm_edid_to_eld(connector, edid);
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>
> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
> index d81bb0b..7dad271 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
> @@ -1345,7 +1345,6 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>                         }
>                 } else
>                         status = connector_status_disconnected;
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>
> @@ -1419,7 +1418,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
>                         else
>                                 ret = connector_status_disconnected;
>
> -                       connector->display_info.raw_edid = NULL;
>                         kfree(edid);
>                 } else
>                         ret = connector_status_connected;
> @@ -1465,7 +1463,6 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
>                         drm_add_edid_modes(connector, edid);
>                 }
>
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>  }
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
> index b69642d..c7420e8 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> @@ -1399,7 +1399,6 @@ static int mga_vga_get_modes(struct drm_connector *connector)
>         if (edid) {
>                 drm_mode_connector_update_edid_property(connector, edid);
>                 ret = drm_add_edid_modes(connector, edid);
> -               connector->display_info.raw_edid = NULL;
>                 kfree(edid);
>         }
>         return ret;
> diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
> index ba055e9..2d98ff9 100644
> --- a/drivers/gpu/drm/udl/udl_connector.c
> +++ b/drivers/gpu/drm/udl/udl_connector.c
> @@ -57,11 +57,8 @@ static int udl_get_modes(struct drm_connector *connector)
>
>         edid = (struct edid *)udl_get_edid(udl);
>
> -       connector->display_info.raw_edid = (char *)edid;
> -
>         drm_mode_connector_update_edid_property(connector, edid);
>         ret = drm_add_edid_modes(connector, edid);
> -       connector->display_info.raw_edid = NULL;
>         kfree(edid);
>         return ret;
>  }
> diff --git a/drivers/staging/omapdrm/omap_connector.c b/drivers/staging/omapdrm/omap_connector.c
> index 5e2856c..9c2287b 100644
> --- a/drivers/staging/omapdrm/omap_connector.c
> +++ b/drivers/staging/omapdrm/omap_connector.c
> @@ -177,14 +177,11 @@ static int omap_connector_get_modes(struct drm_connector *connector)
>                         drm_mode_connector_update_edid_property(
>                                         connector, edid);
>                         n = drm_add_edid_modes(connector, edid);
> -                       kfree(connector->display_info.raw_edid);
> -                       connector->display_info.raw_edid = edid;
>                 } else {
>                         drm_mode_connector_update_edid_property(
>                                         connector, NULL);
> -                       connector->display_info.raw_edid = NULL;
> -                       kfree(edid);
>                 }
> +               kfree(edid);
>         } else {
>                 struct drm_display_mode *mode = drm_mode_create(dev);
>                 struct omap_video_timings timings;
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index a1a0386..0522044 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -216,8 +216,6 @@ struct drm_display_info {
>         u32 color_formats;
>
>         u8 cea_rev;
> -
> -       char *raw_edid; /* if any */
>  };
>
>  struct drm_framebuffer_funcs {
> --
> 1.7.4.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list