From patchwork Wed Oct 5 10:51:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jani Nikula X-Patchwork-Id: 12999132 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 557F4C433FE for ; Wed, 5 Oct 2022 10:52:16 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id EDC8D10E46C; Wed, 5 Oct 2022 10:52:03 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 86D8910E0BB; Wed, 5 Oct 2022 10:51:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1664967116; x=1696503116; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pLHDWkvab6hfcOSp1Zqa4G44jjkF9mDxkZroGNIaDC8=; b=G1YDPZeZR1ZKeXvMl28gcp9d/Hp3YSPnyT8/+mSBLvkd/zx0OQNY/bSK G56wJw7RxF10vU8VpzcaPqH+WS+tguOJUmOZYXYlD+6MSLkicUcmdKpTE Q1QoquKA/0pDvYHLbWY/BX788bNxI++c05X0Xsh5+yK3x/vps1dA7BeP+ CEE+bet7IXbwB/xuJFnMrAZT6dcE1F+yzNmymZidvdjteZoU4XjNt5FdL pIIj2PFJBN5lgkh+y/LmVgebCpDZjIZrN5qEkMlFbIsIJI3b8bFQBwOdN jWKMUSlZrFm0fbbh1aIHiKo/xCfh9GEF/sa4pStCYDroa1KrqUMY/gC9y Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10490"; a="367247800" X-IronPort-AV: E=Sophos;i="5.95,159,1661842800"; d="scan'208";a="367247800" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2022 03:51:55 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10490"; a="766691436" X-IronPort-AV: E=Sophos;i="5.95,159,1661842800"; d="scan'208";a="766691436" Received: from gionescu-mobl2.ger.corp.intel.com (HELO localhost) ([10.252.39.173]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2022 03:51:53 -0700 From: Jani Nikula To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Subject: [RFC 1/2] drm/connector: add connector list iteration with filtering Date: Wed, 5 Oct 2022 13:51:43 +0300 Message-Id: <8d92019b6ae730d6dc019e03fbc103645a2cf203.1664966047.git.jani.nikula@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jani.nikula@intel.com, Suraj Kandpal , Arun R Murthy Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Add new function drm_connector_list_iter_filter_begin() to initialize connector list iterator with a filter function. Subsequent iteration on the list will only return connectors on which the filter function returns true. Cc: Arun R Murthy Cc: Suraj Kandpal Cc: Ville Syrjälä Signed-off-by: Jani Nikula Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/drm_connector.c | 57 ++++++++++++++++++++++++++------- include/drm/drm_connector.h | 9 ++++++ 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index e3142c8142b3..d54b4b54cecb 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -762,6 +762,29 @@ static struct lockdep_map connector_list_iter_dep_map = { }; #endif +/** + * drm_connector_list_iter_filter_begin - initialize a connector_list iterator with filter + * @dev: DRM device + * @iter: connector_list iterator + * @filter: connector filter function + * @filter_context: context to be passed to the filter function + * + * Same as drm_connector_list_iter_begin(), but sets up the iterator to only + * return connectors where filter(connector) returns true. + */ +void drm_connector_list_iter_filter_begin(struct drm_device *dev, + struct drm_connector_list_iter *iter, + drm_connector_list_iter_filter_fn filter, + void *filter_context) +{ + iter->dev = dev; + iter->conn = NULL; + iter->filter = filter; + iter->filter_context = filter_context; + lock_acquire_shared_recursive(&connector_list_iter_dep_map, 0, 1, NULL, _RET_IP_); +} +EXPORT_SYMBOL(drm_connector_list_iter_filter_begin); + /** * drm_connector_list_iter_begin - initialize a connector_list iterator * @dev: DRM device @@ -775,9 +798,7 @@ static struct lockdep_map connector_list_iter_dep_map = { void drm_connector_list_iter_begin(struct drm_device *dev, struct drm_connector_list_iter *iter) { - iter->dev = dev; - iter->conn = NULL; - lock_acquire_shared_recursive(&connector_list_iter_dep_map, 0, 1, NULL, _RET_IP_); + drm_connector_list_iter_filter_begin(dev, iter, NULL, NULL); } EXPORT_SYMBOL(drm_connector_list_iter_begin); @@ -800,15 +821,8 @@ __drm_connector_put_safe(struct drm_connector *conn) schedule_work(&config->connector_free_work); } -/** - * drm_connector_list_iter_next - return next connector - * @iter: connector_list iterator - * - * Returns: the next connector for @iter, or NULL when the list walk has - * completed. - */ -struct drm_connector * -drm_connector_list_iter_next(struct drm_connector_list_iter *iter) +static struct drm_connector * +__drm_connector_list_iter_next(struct drm_connector_list_iter *iter) { struct drm_connector *old_conn = iter->conn; struct drm_mode_config *config = &iter->dev->mode_config; @@ -836,6 +850,25 @@ drm_connector_list_iter_next(struct drm_connector_list_iter *iter) return iter->conn; } + +/** + * drm_connector_list_iter_next - return next connector + * @iter: connector_list iterator + * + * Returns: the next connector for @iter, or NULL when the list walk has + * completed. + */ +struct drm_connector * +drm_connector_list_iter_next(struct drm_connector_list_iter *iter) +{ + struct drm_connector *connector; + + while ((connector = __drm_connector_list_iter_next(iter)) && + iter->filter && !iter->filter(connector, iter->filter_context)) + ; + + return connector; +} EXPORT_SYMBOL(drm_connector_list_iter_next); /** diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 56aee949c6fa..497b98197d3a 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1868,6 +1868,9 @@ struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev, void drm_mode_put_tile_group(struct drm_device *dev, struct drm_tile_group *tg); +typedef bool (*drm_connector_list_iter_filter_fn)(const struct drm_connector *connector, + void *filter_context); + /** * struct drm_connector_list_iter - connector_list iterator * @@ -1886,10 +1889,16 @@ struct drm_connector_list_iter { /* private: */ struct drm_device *dev; struct drm_connector *conn; + drm_connector_list_iter_filter_fn filter; + void *filter_context; }; void drm_connector_list_iter_begin(struct drm_device *dev, struct drm_connector_list_iter *iter); +void drm_connector_list_iter_filter_begin(struct drm_device *dev, + struct drm_connector_list_iter *iter, + drm_connector_list_iter_filter_fn filter, + void *filter_context); struct drm_connector * drm_connector_list_iter_next(struct drm_connector_list_iter *iter); void drm_connector_list_iter_end(struct drm_connector_list_iter *iter); From patchwork Wed Oct 5 10:51:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jani Nikula X-Patchwork-Id: 12999133 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 84A96C433F5 for ; Wed, 5 Oct 2022 10:52:25 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4FC2910E46B; Wed, 5 Oct 2022 10:52:07 +0000 (UTC) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3FC6010E46B; Wed, 5 Oct 2022 10:52:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1664967121; x=1696503121; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ciuAKtGTW6uZVPEpxLUypZwPONSF3ZVJef6Opp4wa7c=; b=GxoGSxnh0dMhBjfvk/y6hhfiyJoe+xkOg6zG4PwZ0qptRvzO7CFDozNw vd0iUbdv+X/IPXBSupLf7r8Q995XcmjlTMx6h14bIc67Zp+7zqhO/DXfh 0U4X3BhvXqGFHMeutPopv7eo5JACddxBvFBRoUdRuMDHRjwx8TveNcK/L DNiqBGOyMZNdtLpI0Rln+3/u6O+GedCPBJrLkdcgeykPeZqkuVKdc6T7Z vlb0/+b+PEQ1MeNFpVWkxL8e7/9+Y5zKmsPTppRd5bD/nf5mCXZk+ZOGW x+2LocZGnEzx5x0ZV1zKZetEpn9/VFmJhPc6D9jE+y04FvbneJ+Ve4yVC g==; X-IronPort-AV: E=McAfee;i="6500,9779,10490"; a="304699849" X-IronPort-AV: E=Sophos;i="5.95,159,1661842800"; d="scan'208";a="304699849" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2022 03:52:00 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10490"; a="655131165" X-IronPort-AV: E=Sophos;i="5.95,159,1661842800"; d="scan'208";a="655131165" Received: from gionescu-mobl2.ger.corp.intel.com (HELO localhost) ([10.252.39.173]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2022 03:51:58 -0700 From: Jani Nikula To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Subject: [RFC 2/2] drm/i915: iterate intel_connectors only Date: Wed, 5 Oct 2022 13:51:44 +0300 Message-Id: <37625095998bff9c4f191a8b5a7f4780b90eb408.1664966047.git.jani.nikula@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jani.nikula@intel.com, Suraj Kandpal , Arun R Murthy Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The drm_connectors that are embedded in writeback connectors won't be embedded in intel_connectors, so we can't assume being able to convert a drm_connector to intel_connector when iterating all the connectors we have. Use the drm connector list filtering to skip writeback connectors. Note: We could also wrap the begin/end calls to intel specific macros to hide the boilerplate. Cc: Arun R Murthy Cc: Suraj Kandpal Cc: Ville Syrjälä Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_display.c | 3 ++- drivers/gpu/drm/i915/display/intel_display_types.h | 7 +++++++ drivers/gpu/drm/i915/display/intel_dp.c | 6 ++++-- drivers/gpu/drm/i915/display/intel_dp_mst.c | 3 ++- drivers/gpu/drm/i915/display/intel_hdcp.c | 3 ++- drivers/gpu/drm/i915/display/intel_hotplug.c | 12 ++++++++---- drivers/gpu/drm/i915/display/intel_modeset_setup.c | 6 ++++-- drivers/gpu/drm/i915/display/intel_opregion.c | 9 ++++++--- 8 files changed, 35 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 8c3bd9ba0d74..892a86c86fb4 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -8960,7 +8960,8 @@ static void intel_hpd_poll_fini(struct drm_i915_private *i915) struct drm_connector_list_iter conn_iter; /* Kill all the work that may have been queued by hpd. */ - drm_connector_list_iter_begin(&i915->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&i915->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { if (connector->modeset_retry_work.func) cancel_work_sync(&connector->modeset_retry_work); diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index e2b853e9e51d..49a5a1ddc4df 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -612,6 +612,13 @@ struct intel_connector { struct intel_hdcp hdcp; }; +static inline bool is_intel_connector(const struct drm_connector *connector, + void *unused_filter_context) +{ + /* writeback connectors aren't embedded in intel_connector */ + return connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK; +} + struct intel_digital_connector_state { struct drm_connector_state base; diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 70b06806ec0d..4cf934c51290 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4044,7 +4044,8 @@ static int intel_dp_prep_link_retrain(struct intel_dp *intel_dp, if (!intel_dp_needs_link_retrain(intel_dp)) return 0; - drm_connector_list_iter_begin(&i915->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&i915->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { struct drm_connector_state *conn_state = connector->base.state; @@ -4173,7 +4174,8 @@ static int intel_dp_prep_phy_test(struct intel_dp *intel_dp, *pipe_mask = 0; - drm_connector_list_iter_begin(&i915->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&i915->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { struct drm_connector_state *conn_state = connector->base.state; diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c index cd4e61026d98..e4f98cee8d81 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -272,7 +272,8 @@ intel_dp_mst_atomic_master_trans_check(struct intel_connector *connector, if (!intel_connector_needs_modeset(state, &connector->base)) return 0; - drm_connector_list_iter_begin(&dev_priv->drm, &connector_list_iter); + drm_connector_list_iter_filter_begin(&dev_priv->drm, &connector_list_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector_iter, &connector_list_iter) { struct intel_digital_connector_state *conn_iter_state; struct intel_crtc_state *crtc_state; diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c index 6406fd487ee5..36167e42a537 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c @@ -83,7 +83,8 @@ intel_hdcp_required_content_stream(struct intel_digital_port *dig_port) if (dig_port->hdcp_auth_status) return 0; - drm_connector_list_iter_begin(&i915->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&i915->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { if (connector->base.status == connector_status_disconnected) continue; diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.c b/drivers/gpu/drm/i915/display/intel_hotplug.c index 352a1b53b63e..3a9bf87907f5 100644 --- a/drivers/gpu/drm/i915/display/intel_hotplug.c +++ b/drivers/gpu/drm/i915/display/intel_hotplug.c @@ -185,7 +185,8 @@ intel_hpd_irq_storm_switch_to_polling(struct drm_i915_private *dev_priv) lockdep_assert_held(&dev_priv->irq_lock); - drm_connector_list_iter_begin(dev, &conn_iter); + drm_connector_list_iter_filter_begin(dev, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { enum hpd_pin pin; @@ -232,7 +233,8 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work) spin_lock_irq(&dev_priv->irq_lock); - drm_connector_list_iter_begin(dev, &conn_iter); + drm_connector_list_iter_filter_begin(dev, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { pin = intel_connector_hpd_pin(connector); if (pin == HPD_NONE || @@ -392,7 +394,8 @@ static void i915_hotplug_work_func(struct work_struct *work) spin_unlock_irq(&dev_priv->irq_lock); - drm_connector_list_iter_begin(dev, &conn_iter); + drm_connector_list_iter_filter_begin(dev, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { enum hpd_pin pin; u32 hpd_bit; @@ -624,7 +627,8 @@ static void i915_hpd_poll_init_work(struct work_struct *work) enabled = READ_ONCE(dev_priv->display.hotplug.poll_enabled); - drm_connector_list_iter_begin(dev, &conn_iter); + drm_connector_list_iter_filter_begin(dev, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { enum hpd_pin pin; diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index cbfabd58b75a..0bd145ad8f17 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -114,7 +114,8 @@ static void intel_modeset_update_connector_atomic_state(struct drm_i915_private struct intel_connector *connector; struct drm_connector_list_iter conn_iter; - drm_connector_list_iter_begin(&i915->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&i915->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { struct drm_connector_state *conn_state = connector->base.state; struct intel_encoder *encoder = @@ -498,7 +499,8 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915) intel_dpll_readout_hw_state(i915); - drm_connector_list_iter_begin(&i915->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&i915->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { if (connector->get_hw_state(connector)) { struct intel_crtc_state *crtc_state; diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c index caa07ef34f21..697d902a8d79 100644 --- a/drivers/gpu/drm/i915/display/intel_opregion.c +++ b/drivers/gpu/drm/i915/display/intel_opregion.c @@ -488,7 +488,8 @@ static u32 asle_set_backlight(struct drm_i915_private *dev_priv, u32 bclp) */ drm_dbg_kms(&dev_priv->drm, "updating opregion backlight %d/255\n", bclp); - drm_connector_list_iter_begin(dev, &conn_iter); + drm_connector_list_iter_filter_begin(dev, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) intel_backlight_set_acpi(connector->base.state, bclp, 255); drm_connector_list_iter_end(&conn_iter); @@ -709,7 +710,8 @@ static void intel_didl_outputs(struct drm_i915_private *dev_priv) intel_acpi_device_id_update(dev_priv); - drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&dev_priv->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { if (i < max_outputs) set_did(opregion, i, connector->acpi_device_id); @@ -746,7 +748,8 @@ static void intel_setup_cadls(struct drm_i915_private *dev_priv) * Note that internal panels should be at the front of the connector * list already, ensuring they're not left out. */ - drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter); + drm_connector_list_iter_filter_begin(&dev_priv->drm, &conn_iter, + is_intel_connector, NULL); for_each_intel_connector_iter(connector, &conn_iter) { if (i >= ARRAY_SIZE(opregion->acpi->cadl)) break;