diff mbox series

[v3,2/7] drm/i915/display: add generic to_intel_display() macro

Message ID 11bb764f479cd3638f0701d4466ae47dfd8def81.1712665176.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: better high level abstraction for display | expand

Commit Message

Jani Nikula April 9, 2024, 12:26 p.m. UTC
Convert various pointers to struct intel_display * using _Generic().

Add some macro magic to make adding new conversions easier, and somewhat
abstract the need to cast each generic association. The cast is required
because all associations needs to compile, regardless of the type and
the generic selection.

The use of *p in the generic selection assignment expression removes the
need to add separate associations for const pointers.

Note: This intentionally does *not* cover struct drm_i915_private or
struct xe_device. They are not to be used in the long run, so avoid
using this macro for them.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 .../drm/i915/display/intel_display_types.h    | 37 +++++++++++++++++++
 1 file changed, 37 insertions(+)

Comments

Rodrigo Vivi April 16, 2024, 4:06 p.m. UTC | #1
On Tue, Apr 09, 2024 at 03:26:44PM +0300, Jani Nikula wrote:
> Convert various pointers to struct intel_display * using _Generic().
> 
> Add some macro magic to make adding new conversions easier, and somewhat
> abstract the need to cast each generic association. The cast is required
> because all associations needs to compile, regardless of the type and
> the generic selection.
> 
> The use of *p in the generic selection assignment expression removes the
> need to add separate associations for const pointers.
> 
> Note: This intentionally does *not* cover struct drm_i915_private or
> struct xe_device. They are not to be used in the long run, so avoid
> using this macro for them.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

I also missed this. This magic is great, let move with this already

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

> ---
>  .../drm/i915/display/intel_display_types.h    | 37 +++++++++++++++++++
>  1 file changed, 37 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 0f4bd5710796..1be98c4219b0 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -2197,4 +2197,41 @@ static inline int to_bpp_x16(int bpp)
>  	return bpp << 4;
>  }
>  
> +/*
> + * Conversion functions/macros from various pointer types to struct
> + * intel_display pointer.
> + */
> +#define __drm_device_to_intel_display(p) \
> +	(&to_i915(p)->display)
> +#define __intel_connector_to_intel_display(p)		\
> +	__drm_device_to_intel_display((p)->base.dev)
> +#define __intel_crtc_to_intel_display(p)		\
> +	__drm_device_to_intel_display((p)->base.dev)
> +#define __intel_crtc_state_to_intel_display(p)			\
> +	__drm_device_to_intel_display((p)->uapi.crtc->dev)
> +#define __intel_digital_port_to_intel_display(p)		\
> +	__drm_device_to_intel_display((p)->base.base.dev)
> +#define __intel_dp_to_intel_display(p)	\
> +	__drm_device_to_intel_display(dp_to_dig_port(p)->base.base.dev)
> +#define __intel_encoder_to_intel_display(p)		\
> +	__drm_device_to_intel_display((p)->base.dev)
> +#define __intel_hdmi_to_intel_display(p)	\
> +	__drm_device_to_intel_display(hdmi_to_dig_port(p)->base.base.dev)
> +
> +/* Helper for generic association. Map types to conversion functions/macros. */
> +#define __assoc(type, p) \
> +	struct type: __##type##_to_intel_display((struct type *)(p))
> +
> +/* Convert various pointer types to struct intel_display pointer. */
> +#define to_intel_display(p)				\
> +	_Generic(*p,					\
> +		 __assoc(drm_device, p),		\
> +		 __assoc(intel_connector, p),		\
> +		 __assoc(intel_crtc, p),		\
> +		 __assoc(intel_crtc_state, p),		\
> +		 __assoc(intel_digital_port, p),	\
> +		 __assoc(intel_dp, p),			\
> +		 __assoc(intel_encoder, p),		\
> +		 __assoc(intel_hdmi, p))
> +
>  #endif /*  __INTEL_DISPLAY_TYPES_H__ */
> -- 
> 2.39.2
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 0f4bd5710796..1be98c4219b0 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -2197,4 +2197,41 @@  static inline int to_bpp_x16(int bpp)
 	return bpp << 4;
 }
 
+/*
+ * Conversion functions/macros from various pointer types to struct
+ * intel_display pointer.
+ */
+#define __drm_device_to_intel_display(p) \
+	(&to_i915(p)->display)
+#define __intel_connector_to_intel_display(p)		\
+	__drm_device_to_intel_display((p)->base.dev)
+#define __intel_crtc_to_intel_display(p)		\
+	__drm_device_to_intel_display((p)->base.dev)
+#define __intel_crtc_state_to_intel_display(p)			\
+	__drm_device_to_intel_display((p)->uapi.crtc->dev)
+#define __intel_digital_port_to_intel_display(p)		\
+	__drm_device_to_intel_display((p)->base.base.dev)
+#define __intel_dp_to_intel_display(p)	\
+	__drm_device_to_intel_display(dp_to_dig_port(p)->base.base.dev)
+#define __intel_encoder_to_intel_display(p)		\
+	__drm_device_to_intel_display((p)->base.dev)
+#define __intel_hdmi_to_intel_display(p)	\
+	__drm_device_to_intel_display(hdmi_to_dig_port(p)->base.base.dev)
+
+/* Helper for generic association. Map types to conversion functions/macros. */
+#define __assoc(type, p) \
+	struct type: __##type##_to_intel_display((struct type *)(p))
+
+/* Convert various pointer types to struct intel_display pointer. */
+#define to_intel_display(p)				\
+	_Generic(*p,					\
+		 __assoc(drm_device, p),		\
+		 __assoc(intel_connector, p),		\
+		 __assoc(intel_crtc, p),		\
+		 __assoc(intel_crtc_state, p),		\
+		 __assoc(intel_digital_port, p),	\
+		 __assoc(intel_dp, p),			\
+		 __assoc(intel_encoder, p),		\
+		 __assoc(intel_hdmi, p))
+
 #endif /*  __INTEL_DISPLAY_TYPES_H__ */