On Mon, Aug 19, 2024 at 09:48:40PM +0300, Jani Nikula wrote:
> Facilitate using display->is.HASWELL and display->is.HASWELL_ULT
> etc. for identifying platforms and subplatforms. Merge platform and
> subplatform members together.
> 
> v3:
> - Fix sanity check on display->is after merging subplatform members

ops, add my rv-b here instead of v2

> 
> v2:
> - Use bitmap ops
> - Add some sanity checks with warnings
> 
> Signed-off-by: Jani Nikula <[email protected]>
> ---
>  .../gpu/drm/i915/display/intel_display_core.h |  3 ++
>  .../drm/i915/display/intel_display_device.c   | 31 +++++++++++++++++--
>  2 files changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h 
> b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 0a711114ff2b..b2907894fa28 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -286,6 +286,9 @@ struct intel_display {
>       /* drm device backpointer */
>       struct drm_device *drm;
>  
> +     /* Platform (and subplatform, if any) identification */
> +     struct intel_display_platforms is;
> +
>       /* Display functions */
>       struct {
>               /* Top level crtc-ish functions */
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.c 
> b/drivers/gpu/drm/i915/display/intel_display_device.c
> index 55ab1923c8b3..d0b7cf63bc9f 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.c
> @@ -1269,8 +1269,28 @@ find_subplatform_desc(struct pci_dev *pdev, const 
> struct platform_desc *desc)
>       return NULL;
>  }
>  
> +/* Size of the entire bitmap, not the number of platforms */
> +static unsigned int display_platforms_num_bits(void)
> +{
> +     return sizeof(((struct intel_display_platforms *)0)->bitmap) * 
> BITS_PER_BYTE;
> +}
> +
> +/* Number of platform bits set */
> +static unsigned int display_platforms_weight(const struct 
> intel_display_platforms *p)
> +{
> +     return bitmap_weight(p->bitmap, display_platforms_num_bits());
> +}
> +
> +/* Merge the subplatform information from src to dst */
> +static void display_platforms_or(struct intel_display_platforms *dst,
> +                              const struct intel_display_platforms *src)
> +{
> +     bitmap_or(dst->bitmap, dst->bitmap, src->bitmap, 
> display_platforms_num_bits());
> +}
> +
>  void intel_display_device_probe(struct drm_i915_private *i915)
>  {
> +     struct intel_display *display = &i915->display;
>       struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
>       const struct intel_display_device_info *info;
>       struct intel_display_ip_ver ip_ver = {};
> @@ -1306,13 +1326,20 @@ void intel_display_device_probe(struct 
> drm_i915_private *i915)
>              &DISPLAY_INFO(i915)->__runtime_defaults,
>              sizeof(*DISPLAY_RUNTIME_INFO(i915)));
>  
> -     drm_WARN_ON(&i915->drm, !desc->platform || !desc->name);
> +     drm_WARN_ON(&i915->drm, !desc->platform || !desc->name ||
> +                 display_platforms_weight(&desc->platforms) != 1);
>       DISPLAY_RUNTIME_INFO(i915)->platform = desc->platform;
> +     display->is = desc->platforms;
>  
>       subdesc = find_subplatform_desc(pdev, desc);
>       if (subdesc) {
> -             drm_WARN_ON(&i915->drm, !subdesc->subplatform || 
> !subdesc->name);
> +             drm_WARN_ON(&i915->drm, !subdesc->subplatform || !subdesc->name 
> ||
> +                         display_platforms_weight(&subdesc->platforms) != 1);
>               DISPLAY_RUNTIME_INFO(i915)->subplatform = subdesc->subplatform;
> +             display_platforms_or(&display->is, &subdesc->platforms);
> +
> +             /* Ensure platform and subplatform are distinct */
> +             drm_WARN_ON(&i915->drm, display_platforms_weight(&display->is) 
> == 1);
>       }
>  
>       if (ip_ver.ver || ip_ver.rel || ip_ver.step)
> -- 
> 2.39.2
> 

Reply via email to