[PATCH v2 5/9] drm/i915/display: add platforms "is" member to struct intel_display
Jani Nikula
jani.nikula at intel.com
Mon Aug 19 18:44:32 UTC 2024
Facilitate using display->is.HASWELL and display->is.HASWELL_ULT
etc. for identifying platforms and subplatforms. Merge platform and
subplatform members together.
v2:
- Use bitmap ops
- Add some sanity checks with warnings
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
.../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..3d3b4ed7940e 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(&subdesc->platforms) == 1);
}
if (ip_ver.ver || ip_ver.rel || ip_ver.step)
--
2.39.2
More information about the Intel-gfx
mailing list