VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-45956

CVE-2026-45956

Description

In the Linux kernel, the following vulnerability has been resolved:

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

vidi_connection_ioctl() retrieves the driver_data from drm_dev->dev to obtain a struct vidi_context pointer. However, drm_dev->dev is the exynos-drm master device, and the driver_data contained therein is not the vidi component device, but a completely different device.

This can lead to various bugs, ranging from null pointer dereferences and garbage value accesses to, in unlucky cases, out-of-bounds errors, use-after-free errors, and more.

To resolve this issue, we need to store/delete the vidi device pointer in exynos_drm_private->vidi_dev during bind/unbind, and then read this exynos_drm_private->vidi_dev within ioctl() to obtain the correct struct vidi_context pointer.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

A pointer misuse in the Linux kernel's Exynos DRM vidi driver allows local attackers to trigger memory corruption via a crafted ioctl.

Vulnerability

In the Linux kernel's Exynos DRM driver, the vidi_connection_ioctl() function in the vidi component incorrectly retrieves a struct vidi_context pointer by reading driver_data from drm_dev->dev, which is the exynos-drm master device rather than the vidi component device. This leads to the use of an invalid pointer. The vulnerability affects all kernel versions prior to the inclusion of commit 21ca24ba51a2c [1].

Exploitation

An attacker with local access and the ability to open the Exynos DRM device can call the vidi_connection_ioctl() function. Because the function dereferences a pointer obtained from the wrong device's driver_data, the attacker can trigger a null pointer dereference, access to garbage values, or more severe memory corruption depending on the state of the memory at that location.

Impact

Successful exploitation can result in various forms of memory corruption, including out-of-bounds reads/writes and use-after-free errors. This can lead to a denial of service (system crash) or, in some cases, privilege escalation if the corruption is leveraged to gain control of kernel memory.

Mitigation

The vulnerability is fixed in Linux kernel commit 21ca24ba51a2c [1]. Users should update to a kernel version that includes this commit. No workaround is available; the fix requires updating the kernel.

AI Insight generated on May 27, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

1

Patches

14
21ca24ba51a2

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkFeb 27, 2026Fixed in 6.6.130via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 81d501efd01330..5e4788db07b947 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 81d501efd01330..5e4788db07b947 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
d3968a0d85b2

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkJan 19, 2026Fixed in 7.0via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index 64c69dd2966ec9..480c99a8f9f757 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -372,6 +377,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -379,6 +385,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -424,8 +432,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index 64c69dd2966ec9..480c99a8f9f757 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -372,6 +377,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -379,6 +385,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -424,8 +432,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
2987642c5213

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkJan 19, 2026Fixed in 5.10.253via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
65d1213baffa

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkJan 19, 2026Fixed in 5.15.203via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
875fa28690e9

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkJan 19, 2026Fixed in 6.1.167via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
b5fc86d753dd

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkJan 19, 2026Fixed in 6.18.14via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index b80410a3e4aadb..bf5ba545891746 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -231,9 +231,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -393,6 +398,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -400,6 +406,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -445,8 +453,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index b80410a3e4aadb..bf5ba545891746 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -231,9 +231,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -393,6 +398,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -400,6 +406,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -445,8 +453,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
a540f767642f

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJeongjun ParkJan 19, 2026Fixed in 6.19.4via kernel-cna
4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index aa255a7ddd855d..02e22806450577 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -232,9 +232,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -394,6 +399,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -401,6 +407,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -446,8 +454,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index aa255a7ddd855d..02e22806450577 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -232,9 +232,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -394,6 +399,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -401,6 +407,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -446,8 +454,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
21ca24ba51a2

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 81d501efd01330..5e4788db07b947 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 81d501efd01330..5e4788db07b947 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
a540f767642f

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index aa255a7ddd855d..02e22806450577 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -232,9 +232,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -394,6 +399,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -401,6 +407,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -446,8 +454,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index aa255a7ddd855d..02e22806450577 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -232,9 +232,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -394,6 +399,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -401,6 +407,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -446,8 +454,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
b5fc86d753dd

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index b80410a3e4aadb..bf5ba545891746 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -231,9 +231,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -393,6 +398,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -400,6 +406,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -445,8 +453,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index b80410a3e4aadb..bf5ba545891746 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -231,9 +231,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -393,6 +398,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -400,6 +406,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -445,8 +453,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
875fa28690e9

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index e17f9c5c9c90e6..d0e394397eca81 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -386,6 +391,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -393,6 +399,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -438,8 +446,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
2987642c5213

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
65d1213baffa

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 6ae9056e7a18f7..72b72b81468a8e 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -201,6 +201,7 @@ struct exynos_drm_private {
     
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index d87ab8ecb02334..89a0a7e74473a9 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -223,9 +223,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -385,6 +390,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -392,6 +398,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -437,8 +445,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	del_timer_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
d3968a0d85b2

drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()

4 files changed · +28 4
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_drv.h+1 0 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    index 23646e55f142c3..06c29ff2aac0e1 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
    +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
    @@ -199,6 +199,7 @@ struct drm_exynos_file_private {
     struct exynos_drm_private {
     	struct device *g2d_dev;
     	struct device *dma_dev;
    +	struct device *vidi_dev;
     	void *mapping;
     
     	/* for atomic commit */
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index 64c69dd2966ec9..480c99a8f9f757 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -372,6 +377,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -379,6 +385,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -424,8 +432,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/exynos/exynos_drm_vidi.c+13 2 modified
    diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    index 64c69dd2966ec9..480c99a8f9f757 100644
    --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
    @@ -224,9 +224,14 @@ ATTRIBUTE_GROUPS(vidi);
     int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
     				struct drm_file *file_priv)
     {
    -	struct vidi_context *ctx = dev_get_drvdata(drm_dev->dev);
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
    +	struct device *dev = priv ? priv->vidi_dev : NULL;
    +	struct vidi_context *ctx = dev ? dev_get_drvdata(dev) : NULL;
     	struct drm_exynos_vidi_connection *vidi = data;
     
    +	if (!ctx)
    +		return -ENODEV;
    +
     	if (!vidi) {
     		DRM_DEV_DEBUG_KMS(ctx->dev,
     				  "user data for vidi is null.\n");
    @@ -372,6 +377,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
     	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     	struct drm_encoder *encoder = &ctx->encoder;
     	struct exynos_drm_plane *exynos_plane;
     	struct exynos_drm_plane_config plane_config = { 0 };
    @@ -379,6 +385,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     	int ret;
     
     	ctx->drm_dev = drm_dev;
    +	if (priv)
    +		priv->vidi_dev = dev;
     
     	plane_config.pixel_formats = formats;
     	plane_config.num_pixel_formats = ARRAY_SIZE(formats);
    @@ -424,8 +432,12 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
     static void vidi_unbind(struct device *dev, struct device *master, void *data)
     {
     	struct vidi_context *ctx = dev_get_drvdata(dev);
    +	struct drm_device *drm_dev = data;
    +	struct exynos_drm_private *priv = drm_dev->dev_private;
     
     	timer_delete_sync(&ctx->timer);
    +	if (priv)
    +		priv->vidi_dev = NULL;
     }
     
     static const struct component_ops vidi_component_ops = {
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Incorrect device pointer used for context lookup in vidi_connection_ioctl() — the function called dev_get_drvdata(drm_dev->dev) but drm_dev->dev is the exynos-drm master device, not the vidi component device, so the returned driver_data is a completely different structure."

Attack vector

An attacker with access to the DRM subsystem can invoke the VIDI_CONNECTION ioctl on an Exynos DRM device. The ioctl handler vidi_connection_ioctl() previously called dev_get_drvdata(drm_dev->dev), where drm_dev->dev is the exynos-drm master device. The driver_data stored on that master device is not a struct vidi_context pointer but belongs to a different device entirely. This causes the ioctl to operate on arbitrary memory as if it were a vidi_context, leading to undefined behavior including null pointer dereferences, out-of-bounds accesses, and use-after-free errors [patch_id=2661010].

Affected code

The vulnerable code is in drivers/gpu/drm/exynos/exynos_drm_vidi.c in the function vidi_connection_ioctl(), which originally called dev_get_drvdata(drm_dev->dev) to obtain a vidi_context pointer. The fix also modifies vidi_bind() and vidi_unbind() in the same file, and adds a vidi_dev field to struct exynos_drm_private in drivers/gpu/drm/exynos/exynos_drm_drv.h [patch_id=2661010].

What the fix does

The patch adds a new field vidi_dev to struct exynos_drm_private in exynos_drm_drv.h [patch_id=2661010]. During vidi_bind(), the vidi component device pointer is stored in priv->vidi_dev, and during vidi_unbind() it is cleared to NULL. In vidi_connection_ioctl(), the lookup now goes through priv->vidi_dev (obtained from drm_dev->dev_private) and then calls dev_get_drvdata() on that correct device pointer. A NULL check on ctx is added, returning -ENODEV if the vidi component is not bound. This ensures the ioctl always operates on the correct vidi_context structure.

Preconditions

  • authThe attacker must be able to open a DRM file descriptor and issue the VIDI_CONNECTION ioctl on an Exynos DRM device.
  • configThe exynos-drm master device must be present and the vidi component may or may not be bound.

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

7

News mentions

0

No linked articles in our index yet.