All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lyude Paul <lyude@redhat.com>
To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	freedreno@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org,
	nouveau@lists.freedesktop.org, linux-arm-msm@vger.kernel.org,
	linux-hyperv@vger.kernel.org, linux-sunxi@lists.linux.dev,
	asahi@lists.linux.dev, linux-stm32@st-md-mailman.stormreply.com,
	linux-samsung-soc@vger.kernel.org,
	linux-amlogic@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	intel-gfx@lists.freedesktop.org, linux-aspeed@lists.ozlabs.org,
	linux-rockchip@lists.infradead.org, linux-tegra@vger.kernel.org,
	linux-renesas-soc@vger.kernel.org, linux-mips@vger.kernel.org,
	amd-gfx@lists.freedesktop.org, spice-devel@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org, imx@lists.linux.dev
Subject: [PATCH 2/5] drm/vblank: Remove drm->num_crtcs
Date: Fri, 14 Aug 2026 16:35:30 -0400	[thread overview]
Message-ID: <20260814203542.1405135-3-lyude@redhat.com> (raw)
In-Reply-To: <20260814203542.1405135-1-lyude@redhat.com>

While working on the Rust bindings for KMS, I asked myself "why does
drm_vblank_init() need the number of CRTCs with vblank support passed to
it?".

After some digging, I noticed the reason and it's silly and likely a
holdover from the pre-KMS days. We actually have ended up with two
different variables that claim to track the number of CRTCs a KMS device
has:

- dev->num_crtcs: Setup -from- drm_vblank_init(), meaning it's 0 if the
  driver has no vblank support.
- dev->mode_config.num_crtc: The correct one

There's no real need for this and it's probably confusing, and it's quite
easy to just drop this variable and convert everything over to
mode_config.num_crtc. So, let's do that with the following coccinelle
patch:

  virtual patch

  @depends on patch@
  struct drm_device *dev;
  @@

  - dev->num_crtcs
  + dev->mode_config.num_crtc

Signed-off-by: Lyude Paul <lyude@redhat.com>
Assisted-by: Coccinelle
---
 drivers/gpu/drm/drm_vblank.c                | 23 ++++++++++-----------
 drivers/gpu/drm/gma500/psb_irq.c            |  4 ++--
 drivers/gpu/drm/radeon/atombios_crtc.c      |  4 ++--
 drivers/gpu/drm/radeon/radeon_legacy_crtc.c |  4 ++--
 drivers/gpu/drm/vc4/vc4_kms.c               |  4 ++--
 include/drm/drm_device.h                    |  3 ---
 6 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index d317148af8cb3..c6f61a39b5d16 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -398,7 +398,7 @@ u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
 	struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
 	u64 count;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return 0;
 
 	count = atomic64_read(&vblank->count);
@@ -558,7 +558,6 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
 		return -ENOMEM;
 
 	dev->has_hw_vblank = true;
-	dev->num_crtcs = num_crtcs;
 
 	for (i = 0; i < num_crtcs; i++) {
 		struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, i);
@@ -645,7 +644,7 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
 	if (!drm_dev_has_vblank(dev))
 		return;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	/* Valid dotclock? */
@@ -729,7 +728,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
 	int vpos, hpos, i;
 	int delta_ns, duration_ns;
 
-	if (pipe >= dev->num_crtcs) {
+	if (pipe >= dev->mode_config.num_crtc) {
 		drm_err(dev, "Invalid crtc %u\n", pipe);
 		return false;
 	}
@@ -970,7 +969,7 @@ static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
 	u64 vblank_count;
 	unsigned int seq;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) {
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc)) {
 		*vblanktime = 0;
 		return 0;
 	}
@@ -1227,7 +1226,7 @@ int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
 	if (!drm_dev_has_vblank(dev))
 		return -EINVAL;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return -EINVAL;
 
 	spin_lock_irqsave(&dev->vbl_lock, irqflags);
@@ -1266,7 +1265,7 @@ void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
 	struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
 	int vblank_offdelay = vblank->config.offdelay_ms;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0))
@@ -1355,7 +1354,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
 	ktime_t now;
 	u64 seq;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	/*
@@ -1496,7 +1495,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
 	unsigned int pipe = drm_crtc_index(crtc);
 	struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	spin_lock_irq(&dev->vbl_lock);
@@ -1555,7 +1554,7 @@ static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe)
 	u32 cur_vblank, diff = 1;
 	u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	assert_spin_locked(&dev->vbl_lock);
@@ -1788,7 +1787,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
 		pipe = pipe_index;
 	}
 
-	if (pipe >= dev->num_crtcs)
+	if (pipe >= dev->mode_config.num_crtc)
 		return -EINVAL;
 
 	vblank = drm_vblank_crtc(dev, pipe);
@@ -1931,7 +1930,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
 	if (drm_WARN_ON_ONCE(dev, !drm_dev_has_vblank(dev)))
 		return false;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return false;
 
 	spin_lock_irqsave(&dev->event_lock, irqflags);
diff --git a/drivers/gpu/drm/gma500/psb_irq.c b/drivers/gpu/drm/gma500/psb_irq.c
index c224c7ff353ce..f0b234a84bd55 100644
--- a/drivers/gpu/drm/gma500/psb_irq.c
+++ b/drivers/gpu/drm/gma500/psb_irq.c
@@ -292,7 +292,7 @@ void gma_irq_postinstall(struct drm_device *dev)
 	PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	for (i = 0; i < dev->num_crtcs; ++i) {
+	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
 		if (dev->vblank[i].enabled)
 			gma_enable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
 		else
@@ -350,7 +350,7 @@ void gma_irq_uninstall(struct drm_device *dev)
 
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	for (i = 0; i < dev->num_crtcs; ++i) {
+	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
 		if (dev->vblank[i].enabled)
 			gma_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
 	}
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 2fc0334e0d6c5..054a24376aee0 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -277,14 +277,14 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
 		if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
 			atombios_enable_crtc_memreq(crtc, ATOM_ENABLE);
 		atombios_blank_crtc(crtc, ATOM_DISABLE);
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_on(crtc);
 		radeon_crtc_load_lut(crtc);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_off(crtc);
 		if (radeon_crtc->enabled)
 			atombios_blank_crtc(crtc, ATOM_ENABLE);
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index a1054c8094d46..954a877b1fad2 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -334,14 +334,14 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
 									 RADEON_CRTC_DISP_REQ_EN_B));
 			WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
 		}
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_on(crtc);
 		radeon_crtc_load_lut(crtc);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_off(crtc);
 		if (radeon_crtc->crtc_id)
 			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index b17e73bce3841..8f08567d28fc6 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -936,7 +936,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 	 * If the layout changes and doesn't give us that in the future,
 	 * we will need to have something smarter, but it works so far.
 	 */
-	sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->num_crtcs);
+	sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->mode_config.num_crtc);
 	if (!sorted_crtcs)
 		return -ENOMEM;
 
@@ -946,7 +946,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 
 	sort(sorted_crtcs, i, sizeof(*sorted_crtcs), cmp_vc4_crtc_hvs_output, NULL);
 
-	for (i = 0; i < dev->num_crtcs; i++) {
+	for (i = 0; i < dev->mode_config.num_crtc; i++) {
 		struct vc4_crtc_state *old_vc4_crtc_state, *new_vc4_crtc_state;
 		struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 		struct vc4_crtc *vc4_crtc;
diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
index 2df08c756afd3..2a9115da90ae7 100644
--- a/include/drm/drm_device.h
+++ b/include/drm/drm_device.h
@@ -340,9 +340,6 @@ struct drm_device {
 	 */
 	spinlock_t event_lock;
 
-	/** @num_crtcs: Number of CRTCs on this device */
-	unsigned int num_crtcs;
-
 	/** @mode_config: Current mode config */
 	struct drm_mode_config mode_config;
 
-- 
2.55.0


WARNING: multiple messages have this Message-ID (diff)
From: Lyude Paul <lyude@redhat.com>
To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	freedreno@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org,
	nouveau@lists.freedesktop.org, linux-arm-msm@vger.kernel.org,
	linux-hyperv@vger.kernel.org, linux-sunxi@lists.linux.dev,
	asahi@lists.linux.dev, linux-stm32@st-md-mailman.stormreply.com,
	linux-samsung-soc@vger.kernel.org,
	linux-amlogic@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	intel-gfx@lists.freedesktop.org, linux-aspeed@lists.ozlabs.org,
	linux-rockchip@lists.infradead.org, linux-tegra@vger.kernel.org,
	linux-renesas-soc@vger.kernel.org, linux-mips@vger.kernel.org,
	amd-gfx@lists.freedesktop.org, spice-devel@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org, imx@lists.linux.dev
Subject: [PATCH 2/5] drm/vblank: Remove drm->num_crtcs
Date: Fri, 14 Aug 2026 16:35:30 -0400	[thread overview]
Message-ID: <20260814203542.1405135-3-lyude@redhat.com> (raw)
In-Reply-To: <20260814203542.1405135-1-lyude@redhat.com>

While working on the Rust bindings for KMS, I asked myself "why does
drm_vblank_init() need the number of CRTCs with vblank support passed to
it?".

After some digging, I noticed the reason and it's silly and likely a
holdover from the pre-KMS days. We actually have ended up with two
different variables that claim to track the number of CRTCs a KMS device
has:

- dev->num_crtcs: Setup -from- drm_vblank_init(), meaning it's 0 if the
  driver has no vblank support.
- dev->mode_config.num_crtc: The correct one

There's no real need for this and it's probably confusing, and it's quite
easy to just drop this variable and convert everything over to
mode_config.num_crtc. So, let's do that with the following coccinelle
patch:

  virtual patch

  @depends on patch@
  struct drm_device *dev;
  @@

  - dev->num_crtcs
  + dev->mode_config.num_crtc

Signed-off-by: Lyude Paul <lyude@redhat.com>
Assisted-by: Coccinelle
---
 drivers/gpu/drm/drm_vblank.c                | 23 ++++++++++-----------
 drivers/gpu/drm/gma500/psb_irq.c            |  4 ++--
 drivers/gpu/drm/radeon/atombios_crtc.c      |  4 ++--
 drivers/gpu/drm/radeon/radeon_legacy_crtc.c |  4 ++--
 drivers/gpu/drm/vc4/vc4_kms.c               |  4 ++--
 include/drm/drm_device.h                    |  3 ---
 6 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index d317148af8cb3..c6f61a39b5d16 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -398,7 +398,7 @@ u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
 	struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
 	u64 count;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return 0;
 
 	count = atomic64_read(&vblank->count);
@@ -558,7 +558,6 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
 		return -ENOMEM;
 
 	dev->has_hw_vblank = true;
-	dev->num_crtcs = num_crtcs;
 
 	for (i = 0; i < num_crtcs; i++) {
 		struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, i);
@@ -645,7 +644,7 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
 	if (!drm_dev_has_vblank(dev))
 		return;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	/* Valid dotclock? */
@@ -729,7 +728,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
 	int vpos, hpos, i;
 	int delta_ns, duration_ns;
 
-	if (pipe >= dev->num_crtcs) {
+	if (pipe >= dev->mode_config.num_crtc) {
 		drm_err(dev, "Invalid crtc %u\n", pipe);
 		return false;
 	}
@@ -970,7 +969,7 @@ static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
 	u64 vblank_count;
 	unsigned int seq;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) {
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc)) {
 		*vblanktime = 0;
 		return 0;
 	}
@@ -1227,7 +1226,7 @@ int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
 	if (!drm_dev_has_vblank(dev))
 		return -EINVAL;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return -EINVAL;
 
 	spin_lock_irqsave(&dev->vbl_lock, irqflags);
@@ -1266,7 +1265,7 @@ void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
 	struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
 	int vblank_offdelay = vblank->config.offdelay_ms;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0))
@@ -1355,7 +1354,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
 	ktime_t now;
 	u64 seq;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	/*
@@ -1496,7 +1495,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
 	unsigned int pipe = drm_crtc_index(crtc);
 	struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	spin_lock_irq(&dev->vbl_lock);
@@ -1555,7 +1554,7 @@ static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe)
 	u32 cur_vblank, diff = 1;
 	u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	assert_spin_locked(&dev->vbl_lock);
@@ -1788,7 +1787,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
 		pipe = pipe_index;
 	}
 
-	if (pipe >= dev->num_crtcs)
+	if (pipe >= dev->mode_config.num_crtc)
 		return -EINVAL;
 
 	vblank = drm_vblank_crtc(dev, pipe);
@@ -1931,7 +1930,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
 	if (drm_WARN_ON_ONCE(dev, !drm_dev_has_vblank(dev)))
 		return false;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return false;
 
 	spin_lock_irqsave(&dev->event_lock, irqflags);
diff --git a/drivers/gpu/drm/gma500/psb_irq.c b/drivers/gpu/drm/gma500/psb_irq.c
index c224c7ff353ce..f0b234a84bd55 100644
--- a/drivers/gpu/drm/gma500/psb_irq.c
+++ b/drivers/gpu/drm/gma500/psb_irq.c
@@ -292,7 +292,7 @@ void gma_irq_postinstall(struct drm_device *dev)
 	PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	for (i = 0; i < dev->num_crtcs; ++i) {
+	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
 		if (dev->vblank[i].enabled)
 			gma_enable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
 		else
@@ -350,7 +350,7 @@ void gma_irq_uninstall(struct drm_device *dev)
 
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	for (i = 0; i < dev->num_crtcs; ++i) {
+	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
 		if (dev->vblank[i].enabled)
 			gma_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
 	}
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 2fc0334e0d6c5..054a24376aee0 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -277,14 +277,14 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
 		if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
 			atombios_enable_crtc_memreq(crtc, ATOM_ENABLE);
 		atombios_blank_crtc(crtc, ATOM_DISABLE);
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_on(crtc);
 		radeon_crtc_load_lut(crtc);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_off(crtc);
 		if (radeon_crtc->enabled)
 			atombios_blank_crtc(crtc, ATOM_ENABLE);
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index a1054c8094d46..954a877b1fad2 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -334,14 +334,14 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
 									 RADEON_CRTC_DISP_REQ_EN_B));
 			WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
 		}
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_on(crtc);
 		radeon_crtc_load_lut(crtc);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_off(crtc);
 		if (radeon_crtc->crtc_id)
 			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index b17e73bce3841..8f08567d28fc6 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -936,7 +936,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 	 * If the layout changes and doesn't give us that in the future,
 	 * we will need to have something smarter, but it works so far.
 	 */
-	sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->num_crtcs);
+	sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->mode_config.num_crtc);
 	if (!sorted_crtcs)
 		return -ENOMEM;
 
@@ -946,7 +946,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 
 	sort(sorted_crtcs, i, sizeof(*sorted_crtcs), cmp_vc4_crtc_hvs_output, NULL);
 
-	for (i = 0; i < dev->num_crtcs; i++) {
+	for (i = 0; i < dev->mode_config.num_crtc; i++) {
 		struct vc4_crtc_state *old_vc4_crtc_state, *new_vc4_crtc_state;
 		struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 		struct vc4_crtc *vc4_crtc;
diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
index 2df08c756afd3..2a9115da90ae7 100644
--- a/include/drm/drm_device.h
+++ b/include/drm/drm_device.h
@@ -340,9 +340,6 @@ struct drm_device {
 	 */
 	spinlock_t event_lock;
 
-	/** @num_crtcs: Number of CRTCs on this device */
-	unsigned int num_crtcs;
-
 	/** @mode_config: Current mode config */
 	struct drm_mode_config mode_config;
 
-- 
2.55.0


_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

WARNING: multiple messages have this Message-ID (diff)
From: Lyude Paul <lyude@redhat.com>
To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	freedreno@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org,
	nouveau@lists.freedesktop.org, linux-arm-msm@vger.kernel.org,
	linux-hyperv@vger.kernel.org, linux-sunxi@lists.linux.dev,
	asahi@lists.linux.dev, linux-stm32@st-md-mailman.stormreply.com,
	linux-samsung-soc@vger.kernel.org,
	linux-amlogic@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	intel-gfx@lists.freedesktop.org, linux-aspeed@lists.ozlabs.org,
	linux-rockchip@lists.infradead.org, linux-tegra@vger.kernel.org,
	linux-renesas-soc@vger.kernel.org, linux-mips@vger.kernel.org,
	amd-gfx@lists.freedesktop.org, spice-devel@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org, imx@lists.linux.dev
Subject: [PATCH 2/5] drm/vblank: Remove drm->num_crtcs
Date: Fri, 14 Aug 2026 16:35:30 -0400	[thread overview]
Message-ID: <20260814203542.1405135-3-lyude@redhat.com> (raw)
In-Reply-To: <20260814203542.1405135-1-lyude@redhat.com>

While working on the Rust bindings for KMS, I asked myself "why does
drm_vblank_init() need the number of CRTCs with vblank support passed to
it?".

After some digging, I noticed the reason and it's silly and likely a
holdover from the pre-KMS days. We actually have ended up with two
different variables that claim to track the number of CRTCs a KMS device
has:

- dev->num_crtcs: Setup -from- drm_vblank_init(), meaning it's 0 if the
  driver has no vblank support.
- dev->mode_config.num_crtc: The correct one

There's no real need for this and it's probably confusing, and it's quite
easy to just drop this variable and convert everything over to
mode_config.num_crtc. So, let's do that with the following coccinelle
patch:

  virtual patch

  @depends on patch@
  struct drm_device *dev;
  @@

  - dev->num_crtcs
  + dev->mode_config.num_crtc

Signed-off-by: Lyude Paul <lyude@redhat.com>
Assisted-by: Coccinelle
---
 drivers/gpu/drm/drm_vblank.c                | 23 ++++++++++-----------
 drivers/gpu/drm/gma500/psb_irq.c            |  4 ++--
 drivers/gpu/drm/radeon/atombios_crtc.c      |  4 ++--
 drivers/gpu/drm/radeon/radeon_legacy_crtc.c |  4 ++--
 drivers/gpu/drm/vc4/vc4_kms.c               |  4 ++--
 include/drm/drm_device.h                    |  3 ---
 6 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index d317148af8cb3..c6f61a39b5d16 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -398,7 +398,7 @@ u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
 	struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
 	u64 count;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return 0;
 
 	count = atomic64_read(&vblank->count);
@@ -558,7 +558,6 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
 		return -ENOMEM;
 
 	dev->has_hw_vblank = true;
-	dev->num_crtcs = num_crtcs;
 
 	for (i = 0; i < num_crtcs; i++) {
 		struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, i);
@@ -645,7 +644,7 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
 	if (!drm_dev_has_vblank(dev))
 		return;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	/* Valid dotclock? */
@@ -729,7 +728,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
 	int vpos, hpos, i;
 	int delta_ns, duration_ns;
 
-	if (pipe >= dev->num_crtcs) {
+	if (pipe >= dev->mode_config.num_crtc) {
 		drm_err(dev, "Invalid crtc %u\n", pipe);
 		return false;
 	}
@@ -970,7 +969,7 @@ static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
 	u64 vblank_count;
 	unsigned int seq;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) {
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc)) {
 		*vblanktime = 0;
 		return 0;
 	}
@@ -1227,7 +1226,7 @@ int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
 	if (!drm_dev_has_vblank(dev))
 		return -EINVAL;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return -EINVAL;
 
 	spin_lock_irqsave(&dev->vbl_lock, irqflags);
@@ -1266,7 +1265,7 @@ void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
 	struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
 	int vblank_offdelay = vblank->config.offdelay_ms;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0))
@@ -1355,7 +1354,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
 	ktime_t now;
 	u64 seq;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	/*
@@ -1496,7 +1495,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
 	unsigned int pipe = drm_crtc_index(crtc);
 	struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	spin_lock_irq(&dev->vbl_lock);
@@ -1555,7 +1554,7 @@ static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe)
 	u32 cur_vblank, diff = 1;
 	u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return;
 
 	assert_spin_locked(&dev->vbl_lock);
@@ -1788,7 +1787,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
 		pipe = pipe_index;
 	}
 
-	if (pipe >= dev->num_crtcs)
+	if (pipe >= dev->mode_config.num_crtc)
 		return -EINVAL;
 
 	vblank = drm_vblank_crtc(dev, pipe);
@@ -1931,7 +1930,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
 	if (drm_WARN_ON_ONCE(dev, !drm_dev_has_vblank(dev)))
 		return false;
 
-	if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+	if (drm_WARN_ON(dev, pipe >= dev->mode_config.num_crtc))
 		return false;
 
 	spin_lock_irqsave(&dev->event_lock, irqflags);
diff --git a/drivers/gpu/drm/gma500/psb_irq.c b/drivers/gpu/drm/gma500/psb_irq.c
index c224c7ff353ce..f0b234a84bd55 100644
--- a/drivers/gpu/drm/gma500/psb_irq.c
+++ b/drivers/gpu/drm/gma500/psb_irq.c
@@ -292,7 +292,7 @@ void gma_irq_postinstall(struct drm_device *dev)
 	PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	for (i = 0; i < dev->num_crtcs; ++i) {
+	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
 		if (dev->vblank[i].enabled)
 			gma_enable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
 		else
@@ -350,7 +350,7 @@ void gma_irq_uninstall(struct drm_device *dev)
 
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	for (i = 0; i < dev->num_crtcs; ++i) {
+	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
 		if (dev->vblank[i].enabled)
 			gma_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
 	}
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 2fc0334e0d6c5..054a24376aee0 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -277,14 +277,14 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
 		if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
 			atombios_enable_crtc_memreq(crtc, ATOM_ENABLE);
 		atombios_blank_crtc(crtc, ATOM_DISABLE);
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_on(crtc);
 		radeon_crtc_load_lut(crtc);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_off(crtc);
 		if (radeon_crtc->enabled)
 			atombios_blank_crtc(crtc, ATOM_ENABLE);
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index a1054c8094d46..954a877b1fad2 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -334,14 +334,14 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
 									 RADEON_CRTC_DISP_REQ_EN_B));
 			WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
 		}
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_on(crtc);
 		radeon_crtc_load_lut(crtc);
 		break;
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		if (dev->num_crtcs > radeon_crtc->crtc_id)
+		if (dev->mode_config.num_crtc > radeon_crtc->crtc_id)
 			drm_crtc_vblank_off(crtc);
 		if (radeon_crtc->crtc_id)
 			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index b17e73bce3841..8f08567d28fc6 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -936,7 +936,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 	 * If the layout changes and doesn't give us that in the future,
 	 * we will need to have something smarter, but it works so far.
 	 */
-	sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->num_crtcs);
+	sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->mode_config.num_crtc);
 	if (!sorted_crtcs)
 		return -ENOMEM;
 
@@ -946,7 +946,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 
 	sort(sorted_crtcs, i, sizeof(*sorted_crtcs), cmp_vc4_crtc_hvs_output, NULL);
 
-	for (i = 0; i < dev->num_crtcs; i++) {
+	for (i = 0; i < dev->mode_config.num_crtc; i++) {
 		struct vc4_crtc_state *old_vc4_crtc_state, *new_vc4_crtc_state;
 		struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 		struct vc4_crtc *vc4_crtc;
diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
index 2df08c756afd3..2a9115da90ae7 100644
--- a/include/drm/drm_device.h
+++ b/include/drm/drm_device.h
@@ -340,9 +340,6 @@ struct drm_device {
 	 */
 	spinlock_t event_lock;
 
-	/** @num_crtcs: Number of CRTCs on this device */
-	unsigned int num_crtcs;
-
 	/** @mode_config: Current mode config */
 	struct drm_mode_config mode_config;
 
-- 
2.55.0


_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

  parent reply	other threads:[~2026-08-14 20:36 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-14 20:35 [PATCH 0/5] drm/vblank: Enforce all-or-nothing vblank support Lyude Paul
2026-08-14 20:35 ` Lyude Paul
2026-08-14 20:35 ` Lyude Paul
2026-08-14 20:35 ` [PATCH 1/5] drm/vblank: Add drm_device.has_hw_vblank Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:35 ` Lyude Paul [this message]
2026-08-14 20:35   ` [PATCH 2/5] drm/vblank: Remove drm->num_crtcs Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:35 ` [PATCH 3/5] drm/vblank: Remove num_crtcs argument from drm_vblank_init() Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:51   ` sashiko-bot
2026-08-14 20:51     ` sashiko-bot
2026-08-14 20:35 ` [PATCH 4/5] drm/vblank: Use drm_for_each_crtc() in drm_vblank_init() Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:56   ` sashiko-bot
2026-08-14 20:56     ` sashiko-bot
2026-08-14 20:35 ` [PATCH 5/5] drm/vblank: Require all CRTCs implement vblank support " Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 20:35   ` Lyude Paul
2026-08-14 21:08   ` sashiko-bot
2026-08-14 21:08     ` sashiko-bot
2026-08-14 21:43 ` ✗ Fi.CI.BUILD: failure for drm/vblank: Enforce all-or-nothing vblank support Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260814203542.1405135-3-lyude@redhat.com \
    --to=lyude@redhat.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=asahi@lists.linux.dev \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=imx@lists.linux.dev \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=linux-sunxi@lists.linux.dev \
    --cc=linux-tegra@vger.kernel.org \
    --cc=nouveau@lists.freedesktop.org \
    --cc=spice-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.