All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector
@ 2019-09-05 21:09 José Roberto de Souza
       [not found] ` <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: José Roberto de Souza @ 2019-09-05 21:09 UTC (permalink / raw)
  To: intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	José Roberto de Souza,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Alex Deucher,
	Ville Syrjälä,
	Dhinakaran Pandiyan

From: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>

Currently we restrict the number of encoders that can be linked to
a connector to 3, increase it to match the maximum number of encoders
that can be initialized(32).

To more effiently do that lets switch from an array of encoder ids to
bitmask.

Also removing the best_encoder hook from the drivers that only have
one encoder per connector(this ones have one encoder in the whole
driver), pick_single_encoder_for_connector() will do the same job
with no functional change.

v2: Fixing missed return on amdgpu_dm_connector_to_encoder()

Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: dri-devel@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org
Cc: nouveau@lists.freedesktop.org
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 23 +++++---------
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c      |  5 ++-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  6 +++-
 drivers/gpu/drm/ast/ast_mode.c                | 12 -------
 drivers/gpu/drm/drm_atomic_helper.c           |  9 ++++--
 drivers/gpu/drm/drm_client_modeset.c          |  3 +-
 drivers/gpu/drm/drm_connector.c               | 31 +++++--------------
 drivers/gpu/drm/drm_probe_helper.c            |  3 +-
 drivers/gpu/drm/mgag200/mgag200_mode.c        | 11 -------
 drivers/gpu/drm/nouveau/dispnv04/disp.c       |  2 +-
 drivers/gpu/drm/nouveau/dispnv50/disp.c       |  2 +-
 drivers/gpu/drm/nouveau/nouveau_connector.c   |  7 ++---
 drivers/gpu/drm/radeon/radeon_connectors.c    | 27 ++++++----------
 drivers/gpu/drm/udl/udl_connector.c           |  8 -----
 include/drm/drm_connector.h                   | 18 +++++------
 15 files changed, 53 insertions(+), 114 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index ece55c8fa673..d8729285f731 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -217,11 +217,10 @@ amdgpu_connector_update_scratch_regs(struct drm_connector *connector,
 	struct drm_encoder *encoder;
 	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 	bool connected;
-	int i;
 
 	best_encoder = connector_funcs->best_encoder(connector);
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if ((encoder == best_encoder) && (status == connector_status_connected))
 			connected = true;
 		else
@@ -236,9 +235,8 @@ amdgpu_connector_find_encoder(struct drm_connector *connector,
 			       int encoder_type)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->encoder_type == encoder_type)
 			return encoder;
 	}
@@ -347,10 +345,9 @@ static struct drm_encoder *
 amdgpu_connector_best_single_encoder(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
-	int i;
 
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -1065,9 +1062,8 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
 	/* find analog encoder */
 	if (amdgpu_connector->dac_load_detect) {
 		struct drm_encoder *encoder;
-		int i;
 
-		drm_connector_for_each_possible_encoder(connector, encoder, i) {
+		drm_connector_for_each_possible_encoder(connector, encoder) {
 			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
 			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
 				continue;
@@ -1117,9 +1113,8 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
 {
 	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (amdgpu_connector->use_digital == true) {
 			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
 				return encoder;
@@ -1134,7 +1129,7 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
 
 	/* then check use digitial */
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -1271,9 +1266,8 @@ u16 amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
 {
 	struct drm_encoder *encoder;
 	struct amdgpu_encoder *amdgpu_encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		amdgpu_encoder = to_amdgpu_encoder(encoder);
 
 		switch (amdgpu_encoder->encoder_id) {
@@ -1292,10 +1286,9 @@ static bool amdgpu_connector_encoder_is_hbr2(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
 	struct amdgpu_encoder *amdgpu_encoder;
-	int i;
 	bool found = false;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		amdgpu_encoder = to_amdgpu_encoder(encoder);
 		if (amdgpu_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
 			found = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index f1fadb5ba191..99d12e88de92 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -260,15 +260,14 @@ static struct drm_encoder *
 dce_virtual_encoder(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
 			return encoder;
 	}
 
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0a71ed1e7762..d6e3925ca633 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4822,7 +4822,11 @@ static int to_drm_connector_type(enum signal_type st)
 
 static struct drm_encoder *amdgpu_dm_connector_to_encoder(struct drm_connector *connector)
 {
-	return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
+	struct drm_encoder *encoder;
+
+	/* There is only one encoder per connector */
+	drm_connector_for_each_possible_encoder(connector, encoder)
+		return encoder;
 }
 
 static void amdgpu_dm_get_native_mode(struct drm_connector *connector)
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index d349c721501c..eef95e1af06b 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -687,17 +687,6 @@ static void ast_encoder_destroy(struct drm_encoder *encoder)
 	kfree(encoder);
 }
 
-
-static struct drm_encoder *ast_best_single_encoder(struct drm_connector *connector)
-{
-	int enc_id = connector->encoder_ids[0];
-	/* pick the encoder ids */
-	if (enc_id)
-		return drm_encoder_find(connector->dev, NULL, enc_id);
-	return NULL;
-}
-
-
 static const struct drm_encoder_funcs ast_enc_funcs = {
 	.destroy = ast_encoder_destroy,
 };
@@ -847,7 +836,6 @@ static void ast_connector_destroy(struct drm_connector *connector)
 static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
 	.mode_valid = ast_mode_valid,
 	.get_modes = ast_get_modes,
-	.best_encoder = ast_best_single_encoder,
 };
 
 static const struct drm_connector_funcs ast_connector_funcs = {
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 4706439fb490..c440027cb537 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -104,8 +104,13 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
 static struct drm_encoder *
 pick_single_encoder_for_connector(struct drm_connector *connector)
 {
-	WARN_ON(connector->encoder_ids[1]);
-	return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
+	struct drm_encoder *encoder;
+
+	WARN_ON(hweight32(connector->possible_encoders) > 1);
+	drm_connector_for_each_possible_encoder(connector, encoder)
+		return encoder;
+
+	return NULL;
 }
 
 static int handle_conflicting_encoders(struct drm_atomic_state *state,
diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c
index c8922b7cac09..895b73f23079 100644
--- a/drivers/gpu/drm/drm_client_modeset.c
+++ b/drivers/gpu/drm/drm_client_modeset.c
@@ -415,9 +415,8 @@ static bool connector_has_possible_crtc(struct drm_connector *connector,
 					struct drm_crtc *crtc)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->possible_crtcs & drm_crtc_mask(crtc))
 			return true;
 	}
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 4c766624b20d..43896c711b50 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -365,8 +365,6 @@ EXPORT_SYMBOL(drm_connector_attach_edid_property);
 int drm_connector_attach_encoder(struct drm_connector *connector,
 				 struct drm_encoder *encoder)
 {
-	int i;
-
 	/*
 	 * In the past, drivers have attempted to model the static association
 	 * of connector to encoder in simple connector/encoder devices using a
@@ -381,18 +379,15 @@ int drm_connector_attach_encoder(struct drm_connector *connector,
 	if (WARN_ON(connector->encoder))
 		return -EINVAL;
 
-	for (i = 0; i < ARRAY_SIZE(connector->encoder_ids); i++) {
-		if (connector->encoder_ids[i] == 0) {
-			connector->encoder_ids[i] = encoder->base.id;
-			return 0;
-		}
-	}
-	return -ENOMEM;
+	connector->possible_encoders |= drm_encoder_mask(encoder);
+
+	return 0;
 }
 EXPORT_SYMBOL(drm_connector_attach_encoder);
 
 /**
- * drm_connector_has_possible_encoder - check if the connector and encoder are assosicated with each other
+ * drm_connector_has_possible_encoder - check if the connector and encoder are
+ * associated with each other
  * @connector: the connector
  * @encoder: the encoder
  *
@@ -402,15 +397,7 @@ EXPORT_SYMBOL(drm_connector_attach_encoder);
 bool drm_connector_has_possible_encoder(struct drm_connector *connector,
 					struct drm_encoder *encoder)
 {
-	struct drm_encoder *enc;
-	int i;
-
-	drm_connector_for_each_possible_encoder(connector, enc, i) {
-		if (enc == encoder)
-			return true;
-	}
-
-	return false;
+	return connector->possible_encoders & drm_encoder_mask(encoder);
 }
 EXPORT_SYMBOL(drm_connector_has_possible_encoder);
 
@@ -2121,7 +2108,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 	int encoders_count = 0;
 	int ret = 0;
 	int copied = 0;
-	int i;
 	struct drm_mode_modeinfo u_mode;
 	struct drm_mode_modeinfo __user *mode_ptr;
 	uint32_t __user *encoder_ptr;
@@ -2136,14 +2122,13 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 	if (!connector)
 		return -ENOENT;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
-		encoders_count++;
+	encoders_count = hweight32(connector->possible_encoders);
 
 	if ((out_resp->count_encoders >= encoders_count) && encoders_count) {
 		copied = 0;
 		encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr);
 
-		drm_connector_for_each_possible_encoder(connector, encoder, i) {
+		drm_connector_for_each_possible_encoder(connector, encoder) {
 			if (put_user(encoder->base.id, encoder_ptr + copied)) {
 				ret = -EFAULT;
 				goto out;
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index 351cbc40f0f8..a7c87abe88d0 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -93,7 +93,6 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
 	struct drm_device *dev = connector->dev;
 	enum drm_mode_status ret = MODE_OK;
 	struct drm_encoder *encoder;
-	int i;
 
 	/* Step 1: Validate against connector */
 	ret = drm_connector_mode_valid(connector, mode);
@@ -101,7 +100,7 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
 		return ret;
 
 	/* Step 2: Validate against encoders and crtcs */
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		struct drm_crtc *crtc;
 
 		ret = drm_encoder_mode_valid(encoder, mode);
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
index 5e778b5f1a10..68226556044b 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -1638,16 +1638,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
 	return MODE_OK;
 }
 
-static struct drm_encoder *mga_connector_best_encoder(struct drm_connector
-						  *connector)
-{
-	int enc_id = connector->encoder_ids[0];
-	/* pick the encoder ids */
-	if (enc_id)
-		return drm_encoder_find(connector->dev, NULL, enc_id);
-	return NULL;
-}
-
 static void mga_connector_destroy(struct drm_connector *connector)
 {
 	struct mga_connector *mga_connector = to_mga_connector(connector);
@@ -1659,7 +1649,6 @@ static void mga_connector_destroy(struct drm_connector *connector)
 static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
 	.get_modes = mga_vga_get_modes,
 	.mode_valid = mga_vga_mode_valid,
-	.best_encoder = mga_connector_best_encoder,
 };
 
 static const struct drm_connector_funcs mga_vga_connector_funcs = {
diff --git a/drivers/gpu/drm/nouveau/dispnv04/disp.c b/drivers/gpu/drm/nouveau/dispnv04/disp.c
index dc64863b5fd8..44ee82d0c9b6 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv04/disp.c
@@ -256,7 +256,7 @@ nv04_display_create(struct drm_device *dev)
 
 	list_for_each_entry_safe(connector, ct,
 				 &dev->mode_config.connector_list, head) {
-		if (!connector->encoder_ids[0]) {
+		if (!connector->possible_encoders) {
 			NV_WARN(drm, "%s has no encoders, removing\n",
 				connector->name);
 			connector->funcs->destroy(connector);
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index 307584107d77..98c87195d711 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -2391,7 +2391,7 @@ nv50_display_create(struct drm_device *dev)
 
 	/* cull any connectors we created that don't have an encoder */
 	list_for_each_entry_safe(connector, tmp, &dev->mode_config.connector_list, head) {
-		if (connector->encoder_ids[0])
+		if (connector->possible_encoders)
 			continue;
 
 		NV_WARN(drm, "%s has no encoders, removing\n",
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 56871d34e3fb..3a5db17bc5c7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -365,9 +365,8 @@ find_encoder(struct drm_connector *connector, int type)
 {
 	struct nouveau_encoder *nv_encoder;
 	struct drm_encoder *enc;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, enc, i) {
+	drm_connector_for_each_possible_encoder(connector, enc) {
 		nv_encoder = nouveau_encoder(enc);
 
 		if (type == DCB_OUTPUT_ANY ||
@@ -414,10 +413,10 @@ nouveau_connector_ddc_detect(struct drm_connector *connector)
 	struct drm_device *dev = connector->dev;
 	struct nouveau_encoder *nv_encoder = NULL, *found = NULL;
 	struct drm_encoder *encoder;
-	int i, ret;
+	int ret;
 	bool switcheroo_ddc = false;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		nv_encoder = nouveau_encoder(encoder);
 
 		switch (nv_encoder->dcb->type) {
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index b684cd719612..c07427d3c199 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -249,11 +249,10 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
 	struct drm_encoder *encoder;
 	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 	bool connected;
-	int i;
 
 	best_encoder = connector_funcs->best_encoder(connector);
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if ((encoder == best_encoder) && (status == connector_status_connected))
 			connected = true;
 		else
@@ -269,9 +268,8 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
 static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->encoder_type == encoder_type)
 			return encoder;
 	}
@@ -380,10 +378,9 @@ static int radeon_ddc_get_modes(struct drm_connector *connector)
 static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
-	int i;
 
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -428,14 +425,13 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
 
 	list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
 		struct drm_encoder *enc;
-		int i;
 
 		if (conflict == connector)
 			continue;
 
 		radeon_conflict = to_radeon_connector(conflict);
 
-		drm_connector_for_each_possible_encoder(conflict, enc, i) {
+		drm_connector_for_each_possible_encoder(conflict, enc) {
 			/* if the IDs match */
 			if (enc == encoder) {
 				if (conflict->status != connector_status_connected)
@@ -1363,9 +1359,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
 
 	/* find analog encoder */
 	if (radeon_connector->dac_load_detect) {
-		int i;
-
-		drm_connector_for_each_possible_encoder(connector, encoder, i) {
+		drm_connector_for_each_possible_encoder(connector, encoder) {
 			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
 			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
 				continue;
@@ -1443,9 +1437,8 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 {
 	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (radeon_connector->use_digital == true) {
 			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
 				return encoder;
@@ -1460,7 +1453,7 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 
 	/* then check use digitial */
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -1603,9 +1596,8 @@ u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
 {
 	struct drm_encoder *encoder;
 	struct radeon_encoder *radeon_encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		radeon_encoder = to_radeon_encoder(encoder);
 
 		switch (radeon_encoder->encoder_id) {
@@ -1624,10 +1616,9 @@ static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
 	struct radeon_encoder *radeon_encoder;
-	int i;
 	bool found = false;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		radeon_encoder = to_radeon_encoder(encoder);
 		if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
 			found = true;
diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
index ddb61a60c610..b4ae3e89a7b4 100644
--- a/drivers/gpu/drm/udl/udl_connector.c
+++ b/drivers/gpu/drm/udl/udl_connector.c
@@ -90,13 +90,6 @@ udl_detect(struct drm_connector *connector, bool force)
 	return connector_status_connected;
 }
 
-static struct drm_encoder*
-udl_best_single_encoder(struct drm_connector *connector)
-{
-	int enc_id = connector->encoder_ids[0];
-	return drm_encoder_find(connector->dev, NULL, enc_id);
-}
-
 static int udl_connector_set_property(struct drm_connector *connector,
 				      struct drm_property *property,
 				      uint64_t val)
@@ -120,7 +113,6 @@ static void udl_connector_destroy(struct drm_connector *connector)
 static const struct drm_connector_helper_funcs udl_connector_helper_funcs = {
 	.get_modes = udl_get_modes,
 	.mode_valid = udl_mode_valid,
-	.best_encoder = udl_best_single_encoder,
 };
 
 static const struct drm_connector_funcs udl_connector_funcs = {
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 681cb590f952..c6e993e78dbd 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1288,12 +1288,12 @@ struct drm_connector {
 	/** @override_edid: has the EDID been overwritten through debugfs for testing? */
 	bool override_edid;
 
-#define DRM_CONNECTOR_MAX_ENCODER 3
 	/**
-	 * @encoder_ids: Valid encoders for this connector. Please only use
-	 * drm_connector_for_each_possible_encoder() to enumerate these.
+	 * @possible_encoders: Bit mask of encoders that can drive this
+	 * connector, drm_encoder_index() determines the index into the bitfield
+	 * and the bits are set with drm_connector_attach_encoder().
 	 */
-	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
+	u32 possible_encoders;
 
 	/**
 	 * @encoder: Currently bound encoder driving this connector, if any.
@@ -1608,13 +1608,9 @@ bool drm_connector_has_possible_encoder(struct drm_connector *connector,
  * drm_connector_for_each_possible_encoder - iterate connector's possible encoders
  * @connector: &struct drm_connector pointer
  * @encoder: &struct drm_encoder pointer used as cursor
- * @__i: int iteration cursor, for macro-internal use
  */
-#define drm_connector_for_each_possible_encoder(connector, encoder, __i) \
-	for ((__i) = 0; (__i) < ARRAY_SIZE((connector)->encoder_ids) && \
-		     (connector)->encoder_ids[(__i)] != 0; (__i)++) \
-		for_each_if((encoder) = \
-			    drm_encoder_find((connector)->dev, NULL, \
-					     (connector)->encoder_ids[(__i)])) \
+#define drm_connector_for_each_possible_encoder(connector, encoder) \
+	drm_for_each_encoder_mask(encoder, (connector)->dev, \
+				  (connector)->possible_encoders)
 
 #endif
-- 
2.23.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2.1] drm/connector: Allow max possible encoders to attach to a connector
       [not found] ` <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2019-09-05 21:12   ` José Roberto de Souza
  2019-09-06 11:27   ` [PATCH v2] " Ville Syrjälä
  1 sibling, 0 replies; 7+ messages in thread
From: José Roberto de Souza @ 2019-09-05 21:12 UTC (permalink / raw)
  To: intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	José Roberto de Souza,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Alex Deucher,
	Ville Syrjälä,
	Dhinakaran Pandiyan

From: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>

Currently we restrict the number of encoders that can be linked to
a connector to 3, increase it to match the maximum number of encoders
that can be initialized(32).

To more effiently do that lets switch from an array of encoder ids to
bitmask.

Also removing the best_encoder hook from the drivers that only have
one encoder per connector(this ones have one encoder in the whole
driver), pick_single_encoder_for_connector() will do the same job
with no functional change.

v2: Fixing missed return on amdgpu_dm_connector_to_encoder()

Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: dri-devel@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org
Cc: nouveau@lists.freedesktop.org
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 23 +++++---------
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c      |  5 ++-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  8 ++++-
 drivers/gpu/drm/ast/ast_mode.c                | 12 -------
 drivers/gpu/drm/drm_atomic_helper.c           |  9 ++++--
 drivers/gpu/drm/drm_client_modeset.c          |  3 +-
 drivers/gpu/drm/drm_connector.c               | 31 +++++--------------
 drivers/gpu/drm/drm_probe_helper.c            |  3 +-
 drivers/gpu/drm/mgag200/mgag200_mode.c        | 11 -------
 drivers/gpu/drm/nouveau/dispnv04/disp.c       |  2 +-
 drivers/gpu/drm/nouveau/dispnv50/disp.c       |  2 +-
 drivers/gpu/drm/nouveau/nouveau_connector.c   |  7 ++---
 drivers/gpu/drm/radeon/radeon_connectors.c    | 27 ++++++----------
 drivers/gpu/drm/udl/udl_connector.c           |  8 -----
 include/drm/drm_connector.h                   | 18 +++++------
 15 files changed, 55 insertions(+), 114 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index ece55c8fa673..d8729285f731 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -217,11 +217,10 @@ amdgpu_connector_update_scratch_regs(struct drm_connector *connector,
 	struct drm_encoder *encoder;
 	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 	bool connected;
-	int i;
 
 	best_encoder = connector_funcs->best_encoder(connector);
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if ((encoder == best_encoder) && (status == connector_status_connected))
 			connected = true;
 		else
@@ -236,9 +235,8 @@ amdgpu_connector_find_encoder(struct drm_connector *connector,
 			       int encoder_type)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->encoder_type == encoder_type)
 			return encoder;
 	}
@@ -347,10 +345,9 @@ static struct drm_encoder *
 amdgpu_connector_best_single_encoder(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
-	int i;
 
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -1065,9 +1062,8 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
 	/* find analog encoder */
 	if (amdgpu_connector->dac_load_detect) {
 		struct drm_encoder *encoder;
-		int i;
 
-		drm_connector_for_each_possible_encoder(connector, encoder, i) {
+		drm_connector_for_each_possible_encoder(connector, encoder) {
 			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
 			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
 				continue;
@@ -1117,9 +1113,8 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
 {
 	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (amdgpu_connector->use_digital == true) {
 			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
 				return encoder;
@@ -1134,7 +1129,7 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
 
 	/* then check use digitial */
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -1271,9 +1266,8 @@ u16 amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
 {
 	struct drm_encoder *encoder;
 	struct amdgpu_encoder *amdgpu_encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		amdgpu_encoder = to_amdgpu_encoder(encoder);
 
 		switch (amdgpu_encoder->encoder_id) {
@@ -1292,10 +1286,9 @@ static bool amdgpu_connector_encoder_is_hbr2(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
 	struct amdgpu_encoder *amdgpu_encoder;
-	int i;
 	bool found = false;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		amdgpu_encoder = to_amdgpu_encoder(encoder);
 		if (amdgpu_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
 			found = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index f1fadb5ba191..99d12e88de92 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -260,15 +260,14 @@ static struct drm_encoder *
 dce_virtual_encoder(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
 			return encoder;
 	}
 
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0a71ed1e7762..664367423a51 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4822,7 +4822,13 @@ static int to_drm_connector_type(enum signal_type st)
 
 static struct drm_encoder *amdgpu_dm_connector_to_encoder(struct drm_connector *connector)
 {
-	return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
+	struct drm_encoder *encoder;
+
+	/* There is only one encoder per connector */
+	drm_connector_for_each_possible_encoder(connector, encoder)
+		return encoder;
+
+	return NULL;
 }
 
 static void amdgpu_dm_get_native_mode(struct drm_connector *connector)
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index d349c721501c..eef95e1af06b 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -687,17 +687,6 @@ static void ast_encoder_destroy(struct drm_encoder *encoder)
 	kfree(encoder);
 }
 
-
-static struct drm_encoder *ast_best_single_encoder(struct drm_connector *connector)
-{
-	int enc_id = connector->encoder_ids[0];
-	/* pick the encoder ids */
-	if (enc_id)
-		return drm_encoder_find(connector->dev, NULL, enc_id);
-	return NULL;
-}
-
-
 static const struct drm_encoder_funcs ast_enc_funcs = {
 	.destroy = ast_encoder_destroy,
 };
@@ -847,7 +836,6 @@ static void ast_connector_destroy(struct drm_connector *connector)
 static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
 	.mode_valid = ast_mode_valid,
 	.get_modes = ast_get_modes,
-	.best_encoder = ast_best_single_encoder,
 };
 
 static const struct drm_connector_funcs ast_connector_funcs = {
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 4706439fb490..c440027cb537 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -104,8 +104,13 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
 static struct drm_encoder *
 pick_single_encoder_for_connector(struct drm_connector *connector)
 {
-	WARN_ON(connector->encoder_ids[1]);
-	return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
+	struct drm_encoder *encoder;
+
+	WARN_ON(hweight32(connector->possible_encoders) > 1);
+	drm_connector_for_each_possible_encoder(connector, encoder)
+		return encoder;
+
+	return NULL;
 }
 
 static int handle_conflicting_encoders(struct drm_atomic_state *state,
diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c
index c8922b7cac09..895b73f23079 100644
--- a/drivers/gpu/drm/drm_client_modeset.c
+++ b/drivers/gpu/drm/drm_client_modeset.c
@@ -415,9 +415,8 @@ static bool connector_has_possible_crtc(struct drm_connector *connector,
 					struct drm_crtc *crtc)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->possible_crtcs & drm_crtc_mask(crtc))
 			return true;
 	}
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 4c766624b20d..43896c711b50 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -365,8 +365,6 @@ EXPORT_SYMBOL(drm_connector_attach_edid_property);
 int drm_connector_attach_encoder(struct drm_connector *connector,
 				 struct drm_encoder *encoder)
 {
-	int i;
-
 	/*
 	 * In the past, drivers have attempted to model the static association
 	 * of connector to encoder in simple connector/encoder devices using a
@@ -381,18 +379,15 @@ int drm_connector_attach_encoder(struct drm_connector *connector,
 	if (WARN_ON(connector->encoder))
 		return -EINVAL;
 
-	for (i = 0; i < ARRAY_SIZE(connector->encoder_ids); i++) {
-		if (connector->encoder_ids[i] == 0) {
-			connector->encoder_ids[i] = encoder->base.id;
-			return 0;
-		}
-	}
-	return -ENOMEM;
+	connector->possible_encoders |= drm_encoder_mask(encoder);
+
+	return 0;
 }
 EXPORT_SYMBOL(drm_connector_attach_encoder);
 
 /**
- * drm_connector_has_possible_encoder - check if the connector and encoder are assosicated with each other
+ * drm_connector_has_possible_encoder - check if the connector and encoder are
+ * associated with each other
  * @connector: the connector
  * @encoder: the encoder
  *
@@ -402,15 +397,7 @@ EXPORT_SYMBOL(drm_connector_attach_encoder);
 bool drm_connector_has_possible_encoder(struct drm_connector *connector,
 					struct drm_encoder *encoder)
 {
-	struct drm_encoder *enc;
-	int i;
-
-	drm_connector_for_each_possible_encoder(connector, enc, i) {
-		if (enc == encoder)
-			return true;
-	}
-
-	return false;
+	return connector->possible_encoders & drm_encoder_mask(encoder);
 }
 EXPORT_SYMBOL(drm_connector_has_possible_encoder);
 
@@ -2121,7 +2108,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 	int encoders_count = 0;
 	int ret = 0;
 	int copied = 0;
-	int i;
 	struct drm_mode_modeinfo u_mode;
 	struct drm_mode_modeinfo __user *mode_ptr;
 	uint32_t __user *encoder_ptr;
@@ -2136,14 +2122,13 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 	if (!connector)
 		return -ENOENT;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
-		encoders_count++;
+	encoders_count = hweight32(connector->possible_encoders);
 
 	if ((out_resp->count_encoders >= encoders_count) && encoders_count) {
 		copied = 0;
 		encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr);
 
-		drm_connector_for_each_possible_encoder(connector, encoder, i) {
+		drm_connector_for_each_possible_encoder(connector, encoder) {
 			if (put_user(encoder->base.id, encoder_ptr + copied)) {
 				ret = -EFAULT;
 				goto out;
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index 351cbc40f0f8..a7c87abe88d0 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -93,7 +93,6 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
 	struct drm_device *dev = connector->dev;
 	enum drm_mode_status ret = MODE_OK;
 	struct drm_encoder *encoder;
-	int i;
 
 	/* Step 1: Validate against connector */
 	ret = drm_connector_mode_valid(connector, mode);
@@ -101,7 +100,7 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
 		return ret;
 
 	/* Step 2: Validate against encoders and crtcs */
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		struct drm_crtc *crtc;
 
 		ret = drm_encoder_mode_valid(encoder, mode);
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
index 5e778b5f1a10..68226556044b 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -1638,16 +1638,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
 	return MODE_OK;
 }
 
-static struct drm_encoder *mga_connector_best_encoder(struct drm_connector
-						  *connector)
-{
-	int enc_id = connector->encoder_ids[0];
-	/* pick the encoder ids */
-	if (enc_id)
-		return drm_encoder_find(connector->dev, NULL, enc_id);
-	return NULL;
-}
-
 static void mga_connector_destroy(struct drm_connector *connector)
 {
 	struct mga_connector *mga_connector = to_mga_connector(connector);
@@ -1659,7 +1649,6 @@ static void mga_connector_destroy(struct drm_connector *connector)
 static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
 	.get_modes = mga_vga_get_modes,
 	.mode_valid = mga_vga_mode_valid,
-	.best_encoder = mga_connector_best_encoder,
 };
 
 static const struct drm_connector_funcs mga_vga_connector_funcs = {
diff --git a/drivers/gpu/drm/nouveau/dispnv04/disp.c b/drivers/gpu/drm/nouveau/dispnv04/disp.c
index dc64863b5fd8..44ee82d0c9b6 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv04/disp.c
@@ -256,7 +256,7 @@ nv04_display_create(struct drm_device *dev)
 
 	list_for_each_entry_safe(connector, ct,
 				 &dev->mode_config.connector_list, head) {
-		if (!connector->encoder_ids[0]) {
+		if (!connector->possible_encoders) {
 			NV_WARN(drm, "%s has no encoders, removing\n",
 				connector->name);
 			connector->funcs->destroy(connector);
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index 307584107d77..98c87195d711 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -2391,7 +2391,7 @@ nv50_display_create(struct drm_device *dev)
 
 	/* cull any connectors we created that don't have an encoder */
 	list_for_each_entry_safe(connector, tmp, &dev->mode_config.connector_list, head) {
-		if (connector->encoder_ids[0])
+		if (connector->possible_encoders)
 			continue;
 
 		NV_WARN(drm, "%s has no encoders, removing\n",
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 56871d34e3fb..3a5db17bc5c7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -365,9 +365,8 @@ find_encoder(struct drm_connector *connector, int type)
 {
 	struct nouveau_encoder *nv_encoder;
 	struct drm_encoder *enc;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, enc, i) {
+	drm_connector_for_each_possible_encoder(connector, enc) {
 		nv_encoder = nouveau_encoder(enc);
 
 		if (type == DCB_OUTPUT_ANY ||
@@ -414,10 +413,10 @@ nouveau_connector_ddc_detect(struct drm_connector *connector)
 	struct drm_device *dev = connector->dev;
 	struct nouveau_encoder *nv_encoder = NULL, *found = NULL;
 	struct drm_encoder *encoder;
-	int i, ret;
+	int ret;
 	bool switcheroo_ddc = false;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		nv_encoder = nouveau_encoder(encoder);
 
 		switch (nv_encoder->dcb->type) {
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index b684cd719612..c07427d3c199 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -249,11 +249,10 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
 	struct drm_encoder *encoder;
 	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 	bool connected;
-	int i;
 
 	best_encoder = connector_funcs->best_encoder(connector);
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if ((encoder == best_encoder) && (status == connector_status_connected))
 			connected = true;
 		else
@@ -269,9 +268,8 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
 static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
 {
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (encoder->encoder_type == encoder_type)
 			return encoder;
 	}
@@ -380,10 +378,9 @@ static int radeon_ddc_get_modes(struct drm_connector *connector)
 static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
-	int i;
 
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -428,14 +425,13 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
 
 	list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
 		struct drm_encoder *enc;
-		int i;
 
 		if (conflict == connector)
 			continue;
 
 		radeon_conflict = to_radeon_connector(conflict);
 
-		drm_connector_for_each_possible_encoder(conflict, enc, i) {
+		drm_connector_for_each_possible_encoder(conflict, enc) {
 			/* if the IDs match */
 			if (enc == encoder) {
 				if (conflict->status != connector_status_connected)
@@ -1363,9 +1359,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
 
 	/* find analog encoder */
 	if (radeon_connector->dac_load_detect) {
-		int i;
-
-		drm_connector_for_each_possible_encoder(connector, encoder, i) {
+		drm_connector_for_each_possible_encoder(connector, encoder) {
 			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
 			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
 				continue;
@@ -1443,9 +1437,8 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 {
 	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
 	struct drm_encoder *encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		if (radeon_connector->use_digital == true) {
 			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
 				return encoder;
@@ -1460,7 +1453,7 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 
 	/* then check use digitial */
 	/* pick the first one */
-	drm_connector_for_each_possible_encoder(connector, encoder, i)
+	drm_connector_for_each_possible_encoder(connector, encoder)
 		return encoder;
 
 	return NULL;
@@ -1603,9 +1596,8 @@ u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
 {
 	struct drm_encoder *encoder;
 	struct radeon_encoder *radeon_encoder;
-	int i;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		radeon_encoder = to_radeon_encoder(encoder);
 
 		switch (radeon_encoder->encoder_id) {
@@ -1624,10 +1616,9 @@ static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
 {
 	struct drm_encoder *encoder;
 	struct radeon_encoder *radeon_encoder;
-	int i;
 	bool found = false;
 
-	drm_connector_for_each_possible_encoder(connector, encoder, i) {
+	drm_connector_for_each_possible_encoder(connector, encoder) {
 		radeon_encoder = to_radeon_encoder(encoder);
 		if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
 			found = true;
diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
index ddb61a60c610..b4ae3e89a7b4 100644
--- a/drivers/gpu/drm/udl/udl_connector.c
+++ b/drivers/gpu/drm/udl/udl_connector.c
@@ -90,13 +90,6 @@ udl_detect(struct drm_connector *connector, bool force)
 	return connector_status_connected;
 }
 
-static struct drm_encoder*
-udl_best_single_encoder(struct drm_connector *connector)
-{
-	int enc_id = connector->encoder_ids[0];
-	return drm_encoder_find(connector->dev, NULL, enc_id);
-}
-
 static int udl_connector_set_property(struct drm_connector *connector,
 				      struct drm_property *property,
 				      uint64_t val)
@@ -120,7 +113,6 @@ static void udl_connector_destroy(struct drm_connector *connector)
 static const struct drm_connector_helper_funcs udl_connector_helper_funcs = {
 	.get_modes = udl_get_modes,
 	.mode_valid = udl_mode_valid,
-	.best_encoder = udl_best_single_encoder,
 };
 
 static const struct drm_connector_funcs udl_connector_funcs = {
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 681cb590f952..c6e993e78dbd 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1288,12 +1288,12 @@ struct drm_connector {
 	/** @override_edid: has the EDID been overwritten through debugfs for testing? */
 	bool override_edid;
 
-#define DRM_CONNECTOR_MAX_ENCODER 3
 	/**
-	 * @encoder_ids: Valid encoders for this connector. Please only use
-	 * drm_connector_for_each_possible_encoder() to enumerate these.
+	 * @possible_encoders: Bit mask of encoders that can drive this
+	 * connector, drm_encoder_index() determines the index into the bitfield
+	 * and the bits are set with drm_connector_attach_encoder().
 	 */
-	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
+	u32 possible_encoders;
 
 	/**
 	 * @encoder: Currently bound encoder driving this connector, if any.
@@ -1608,13 +1608,9 @@ bool drm_connector_has_possible_encoder(struct drm_connector *connector,
  * drm_connector_for_each_possible_encoder - iterate connector's possible encoders
  * @connector: &struct drm_connector pointer
  * @encoder: &struct drm_encoder pointer used as cursor
- * @__i: int iteration cursor, for macro-internal use
  */
-#define drm_connector_for_each_possible_encoder(connector, encoder, __i) \
-	for ((__i) = 0; (__i) < ARRAY_SIZE((connector)->encoder_ids) && \
-		     (connector)->encoder_ids[(__i)] != 0; (__i)++) \
-		for_each_if((encoder) = \
-			    drm_encoder_find((connector)->dev, NULL, \
-					     (connector)->encoder_ids[(__i)])) \
+#define drm_connector_for_each_possible_encoder(connector, encoder) \
+	drm_for_each_encoder_mask(encoder, (connector)->dev, \
+				  (connector)->possible_encoders)
 
 #endif
-- 
2.23.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* ✗ Fi.CI.CHECKPATCH: warning for drm/connector: Allow max possible encoders to attach to a connector (rev4)
  2019-09-05 21:09 [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector José Roberto de Souza
       [not found] ` <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2019-09-05 21:37 ` Patchwork
  2019-09-05 22:06 ` ✓ Fi.CI.BAT: success " Patchwork
  2019-09-06  4:29 ` ✓ Fi.CI.IGT: " Patchwork
  3 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-09-05 21:37 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

== Series Details ==

Series: drm/connector: Allow max possible encoders to attach to a connector (rev4)
URL   : https://patchwork.freedesktop.org/series/62743/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
6e68968b4d13 drm/connector: Allow max possible encoders to attach to a connector
-:586: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'connector' - possible side-effects?
#586: FILE: include/drm/drm_connector.h:1612:
+#define drm_connector_for_each_possible_encoder(connector, encoder) \
+	drm_for_each_encoder_mask(encoder, (connector)->dev, \
+				  (connector)->possible_encoders)

total: 0 errors, 0 warnings, 1 checks, 457 lines checked

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* ✓ Fi.CI.BAT: success for drm/connector: Allow max possible encoders to attach to a connector (rev4)
  2019-09-05 21:09 [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector José Roberto de Souza
       [not found] ` <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
  2019-09-05 21:37 ` ✗ Fi.CI.CHECKPATCH: warning for drm/connector: Allow max possible encoders to attach to a connector (rev4) Patchwork
@ 2019-09-05 22:06 ` Patchwork
  2019-09-06  4:29 ` ✓ Fi.CI.IGT: " Patchwork
  3 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-09-05 22:06 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

== Series Details ==

Series: drm/connector: Allow max possible encoders to attach to a connector (rev4)
URL   : https://patchwork.freedesktop.org/series/62743/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6839 -> Patchwork_14297
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/

Known issues
------------

  Here are the changes found in Patchwork_14297 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@i915_selftest@live_execlists:
    - fi-skl-gvtdvm:      [PASS][1] -> [DMESG-FAIL][2] ([fdo#111108])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-skl-gvtdvm/igt@i915_selftest@live_execlists.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-skl-gvtdvm/igt@i915_selftest@live_execlists.html

  * igt@kms_chamelium@dp-crc-fast:
    - fi-cml-u2:          [PASS][3] -> [FAIL][4] ([fdo#110627])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-cml-u2/igt@kms_chamelium@dp-crc-fast.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-cml-u2/igt@kms_chamelium@dp-crc-fast.html

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-icl-u2:          [PASS][5] -> [FAIL][6] ([fdo#109483])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-icl-u2/igt@kms_chamelium@hdmi-hpd-fast.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-icl-u2/igt@kms_chamelium@hdmi-hpd-fast.html

  
#### Possible fixes ####

  * igt@gem_ctx_create@basic-files:
    - fi-icl-u3:          [INCOMPLETE][7] ([fdo#107713] / [fdo#109100]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-icl-u3/igt@gem_ctx_create@basic-files.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-icl-u3/igt@gem_ctx_create@basic-files.html

  * igt@i915_module_load@reload:
    - fi-blb-e6850:       [INCOMPLETE][9] ([fdo#107718]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-blb-e6850/igt@i915_module_load@reload.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-blb-e6850/igt@i915_module_load@reload.html

  * igt@i915_selftest@live_requests:
    - {fi-icl-guc}:       [INCOMPLETE][11] ([fdo#107713] / [fdo#109644] / [fdo#110464]) -> [PASS][12]
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-icl-guc/igt@i915_selftest@live_requests.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-icl-guc/igt@i915_selftest@live_requests.html

  * igt@kms_busy@basic-flip-c:
    - fi-skl-6770hq:      [SKIP][13] ([fdo#109271] / [fdo#109278]) -> [PASS][14] +2 similar issues
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-skl-6770hq/igt@kms_busy@basic-flip-c.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-skl-6770hq/igt@kms_busy@basic-flip-c.html

  * igt@kms_flip@basic-flip-vs-dpms:
    - fi-skl-6770hq:      [SKIP][15] ([fdo#109271]) -> [PASS][16] +23 similar issues
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-skl-6770hq/igt@kms_flip@basic-flip-vs-dpms.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-skl-6770hq/igt@kms_flip@basic-flip-vs-dpms.html

  * igt@kms_frontbuffer_tracking@basic:
    - fi-icl-u2:          [FAIL][17] ([fdo#103167]) -> [PASS][18]
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-icl-u2/igt@kms_frontbuffer_tracking@basic.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-icl-u2/igt@kms_frontbuffer_tracking@basic.html

  
#### Warnings ####

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       [FAIL][19] ([fdo#111096]) -> [FAIL][20] ([fdo#111407])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107718]: https://bugs.freedesktop.org/show_bug.cgi?id=107718
  [fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
  [fdo#109483]: https://bugs.freedesktop.org/show_bug.cgi?id=109483
  [fdo#109644]: https://bugs.freedesktop.org/show_bug.cgi?id=109644
  [fdo#110464]: https://bugs.freedesktop.org/show_bug.cgi?id=110464
  [fdo#110627]: https://bugs.freedesktop.org/show_bug.cgi?id=110627
  [fdo#111096]: https://bugs.freedesktop.org/show_bug.cgi?id=111096
  [fdo#111108]: https://bugs.freedesktop.org/show_bug.cgi?id=111108
  [fdo#111407]: https://bugs.freedesktop.org/show_bug.cgi?id=111407


Participating hosts (55 -> 46)
------------------------------

  Missing    (9): fi-ilk-m540 fi-tgl-u fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-icl-y fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * CI: CI-20190529 -> None
  * Linux: CI_DRM_6839 -> Patchwork_14297

  CI-20190529: 20190529
  CI_DRM_6839: d3d45e02f5adaa9b9dae212460b3d93cc6e28a4b @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5171: 1911564805fe454919e8a5846534a0c1ef376a33 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_14297: 6e68968b4d13e3f0eebc00cfbee0e1aa5156b803 @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

6e68968b4d13 drm/connector: Allow max possible encoders to attach to a connector

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* ✓ Fi.CI.IGT: success for drm/connector: Allow max possible encoders to attach to a connector (rev4)
  2019-09-05 21:09 [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector José Roberto de Souza
                   ` (2 preceding siblings ...)
  2019-09-05 22:06 ` ✓ Fi.CI.BAT: success " Patchwork
@ 2019-09-06  4:29 ` Patchwork
  3 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-09-06  4:29 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

== Series Details ==

Series: drm/connector: Allow max possible encoders to attach to a connector (rev4)
URL   : https://patchwork.freedesktop.org/series/62743/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6839_full -> Patchwork_14297_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Known issues
------------

  Here are the changes found in Patchwork_14297_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_schedule@preempt-other-chain-bsd:
    - shard-iclb:         [PASS][1] -> [SKIP][2] ([fdo#111325]) +7 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb3/igt@gem_exec_schedule@preempt-other-chain-bsd.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb1/igt@gem_exec_schedule@preempt-other-chain-bsd.html

  * igt@gem_workarounds@suspend-resume-context:
    - shard-kbl:          [PASS][3] -> [INCOMPLETE][4] ([fdo#103665])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-kbl6/igt@gem_workarounds@suspend-resume-context.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-kbl6/igt@gem_workarounds@suspend-resume-context.html

  * igt@i915_pm_rc6_residency@rc6-accuracy:
    - shard-kbl:          [PASS][5] -> [SKIP][6] ([fdo#109271])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-kbl3/igt@i915_pm_rc6_residency@rc6-accuracy.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-kbl3/igt@i915_pm_rc6_residency@rc6-accuracy.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-iclb:         [PASS][7] -> [INCOMPLETE][8] ([fdo#107713] / [fdo#109507])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb2/igt@kms_flip@flip-vs-suspend-interruptible.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb3/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-suspend:
    - shard-apl:          [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +2 similar issues
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-apl6/igt@kms_frontbuffer_tracking@fbc-suspend.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-apl8/igt@kms_frontbuffer_tracking@fbc-suspend.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render:
    - shard-iclb:         [PASS][11] -> [FAIL][12] ([fdo#103167]) +1 similar issue
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb6/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb2/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
    - shard-snb:          [PASS][13] -> [FAIL][14] ([fdo#103375]) +2 similar issues
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-snb7/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-snb1/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html

  * igt@kms_psr2_su@frontbuffer:
    - shard-iclb:         [PASS][15] -> [SKIP][16] ([fdo#109642] / [fdo#111068])
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb2/igt@kms_psr2_su@frontbuffer.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb3/igt@kms_psr2_su@frontbuffer.html

  * igt@kms_psr@psr2_sprite_plane_move:
    - shard-iclb:         [PASS][17] -> [SKIP][18] ([fdo#109441]) +3 similar issues
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb3/igt@kms_psr@psr2_sprite_plane_move.html

  * igt@prime_busy@after-bsd2:
    - shard-iclb:         [PASS][19] -> [SKIP][20] ([fdo#109276]) +11 similar issues
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb2/igt@prime_busy@after-bsd2.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb3/igt@prime_busy@after-bsd2.html

  
#### Possible fixes ####

  * igt@gem_cs_tlb@vcs0:
    - shard-apl:          [INCOMPLETE][21] ([fdo#103927]) -> [PASS][22]
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-apl6/igt@gem_cs_tlb@vcs0.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-apl7/igt@gem_cs_tlb@vcs0.html

  * igt@gem_ctx_shared@exec-single-timeline-bsd:
    - shard-iclb:         [SKIP][23] ([fdo#110841]) -> [PASS][24]
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb4/igt@gem_ctx_shared@exec-single-timeline-bsd.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb6/igt@gem_ctx_shared@exec-single-timeline-bsd.html

  * igt@gem_exec_balancer@smoke:
    - shard-iclb:         [SKIP][25] ([fdo#110854]) -> [PASS][26]
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb6/igt@gem_exec_balancer@smoke.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb2/igt@gem_exec_balancer@smoke.html

  * igt@gem_exec_schedule@reorder-wide-bsd:
    - shard-iclb:         [SKIP][27] ([fdo#111325]) -> [PASS][28] +3 similar issues
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb2/igt@gem_exec_schedule@reorder-wide-bsd.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb7/igt@gem_exec_schedule@reorder-wide-bsd.html

  * igt@gem_exec_suspend@basic-s4-devices:
    - shard-hsw:          [FAIL][29] ([fdo#111550]) -> [PASS][30]
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-hsw7/igt@gem_exec_suspend@basic-s4-devices.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-hsw7/igt@gem_exec_suspend@basic-s4-devices.html

  * igt@gem_mmap_gtt@hang:
    - shard-iclb:         [INCOMPLETE][31] ([fdo#107713]) -> [PASS][32]
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb7/igt@gem_mmap_gtt@hang.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb4/igt@gem_mmap_gtt@hang.html

  * igt@gem_tiled_swapping@non-threaded:
    - shard-glk:          [DMESG-WARN][33] ([fdo#108686]) -> [PASS][34]
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-glk3/igt@gem_tiled_swapping@non-threaded.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-glk5/igt@gem_tiled_swapping@non-threaded.html

  * igt@gem_workarounds@suspend-resume-context:
    - shard-apl:          [DMESG-WARN][35] ([fdo#108566]) -> [PASS][36] +3 similar issues
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-apl5/igt@gem_workarounds@suspend-resume-context.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-apl6/igt@gem_workarounds@suspend-resume-context.html

  * igt@i915_pm_rpm@pm-tiling:
    - shard-hsw:          [FAIL][37] ([fdo#111548]) -> [PASS][38] +4 similar issues
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-hsw7/igt@i915_pm_rpm@pm-tiling.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-hsw4/igt@i915_pm_rpm@pm-tiling.html

  * igt@i915_suspend@fence-restore-tiled2untiled:
    - shard-apl:          [FAIL][39] ([fdo#103375]) -> [PASS][40] +2 similar issues
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-apl3/igt@i915_suspend@fence-restore-tiled2untiled.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-apl7/igt@i915_suspend@fence-restore-tiled2untiled.html

  * igt@i915_suspend@forcewake:
    - shard-snb:          [FAIL][41] ([fdo#103375]) -> [PASS][42] +3 similar issues
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-snb5/igt@i915_suspend@forcewake.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-snb5/igt@i915_suspend@forcewake.html

  * igt@kms_flip@flip-vs-expired-vblank:
    - shard-skl:          [FAIL][43] ([fdo#105363]) -> [PASS][44]
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-skl9/igt@kms_flip@flip-vs-expired-vblank.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-skl10/igt@kms_flip@flip-vs-expired-vblank.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite:
    - shard-iclb:         [FAIL][45] ([fdo#103167]) -> [PASS][46] +3 similar issues
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
    - shard-hsw:          [FAIL][47] ([fdo#103375]) -> [PASS][48] +4 similar issues
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-hsw7/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-hsw4/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html

  * igt@kms_psr@psr2_sprite_mmap_gtt:
    - shard-iclb:         [SKIP][49] ([fdo#109441]) -> [PASS][50] +1 similar issue
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb6/igt@kms_psr@psr2_sprite_mmap_gtt.html
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb2/igt@kms_psr@psr2_sprite_mmap_gtt.html

  * igt@kms_setmode@basic:
    - shard-hsw:          [FAIL][51] ([fdo#99912]) -> [PASS][52]
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-hsw2/igt@kms_setmode@basic.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-hsw6/igt@kms_setmode@basic.html

  * igt@perf_pmu@rc6:
    - shard-apl:          [FAIL][53] ([fdo#111545]) -> [PASS][54] +9 similar issues
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-apl3/igt@perf_pmu@rc6.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-apl6/igt@perf_pmu@rc6.html

  * igt@prime_busy@hang-bsd2:
    - shard-iclb:         [SKIP][55] ([fdo#109276]) -> [PASS][56] +13 similar issues
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb6/igt@prime_busy@hang-bsd2.html
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb2/igt@prime_busy@hang-bsd2.html

  
#### Warnings ####

  * igt@gem_ctx_isolation@vcs1-nonpriv:
    - shard-iclb:         [FAIL][57] ([fdo#111329]) -> [SKIP][58] ([fdo#109276])
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb4/igt@gem_ctx_isolation@vcs1-nonpriv.html
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb6/igt@gem_ctx_isolation@vcs1-nonpriv.html

  * igt@gem_mocs_settings@mocs-reset-bsd2:
    - shard-iclb:         [FAIL][59] ([fdo#111330]) -> [SKIP][60] ([fdo#109276])
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb2/igt@gem_mocs_settings@mocs-reset-bsd2.html
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb3/igt@gem_mocs_settings@mocs-reset-bsd2.html

  * igt@gem_mocs_settings@mocs-settings-bsd2:
    - shard-iclb:         [SKIP][61] ([fdo#109276]) -> [FAIL][62] ([fdo#111330])
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-iclb3/igt@gem_mocs_settings@mocs-settings-bsd2.html
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-iclb4/igt@gem_mocs_settings@mocs-settings-bsd2.html

  * igt@i915_pm_rpm@modeset-lpsp:
    - shard-hsw:          [FAIL][63] ([fdo#111548]) -> [SKIP][64] ([fdo#109271]) +1 similar issue
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-hsw7/igt@i915_pm_rpm@modeset-lpsp.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-hsw1/igt@i915_pm_rpm@modeset-lpsp.html

  * igt@i915_suspend@debugfs-reader:
    - shard-apl:          [FAIL][65] ([fdo#103375]) -> [DMESG-WARN][66] ([fdo#108566]) +2 similar issues
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-apl3/igt@i915_suspend@debugfs-reader.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-apl6/igt@i915_suspend@debugfs-reader.html

  * igt@perf_pmu@cpu-hotplug:
    - shard-hsw:          [TIMEOUT][67] ([fdo#111546]) -> [INCOMPLETE][68] ([fdo#103540])
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6839/shard-hsw7/igt@perf_pmu@cpu-hotplug.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/shard-hsw4/igt@perf_pmu@cpu-hotplug.html

  
  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
  [fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
  [fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
  [fdo#105363]: https://bugs.freedesktop.org/show_bug.cgi?id=105363
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
  [fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109276]: https://bugs.freedesktop.org/show_bug.cgi?id=109276
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109507]: https://bugs.freedesktop.org/show_bug.cgi?id=109507
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110841]: https://bugs.freedesktop.org/show_bug.cgi?id=110841
  [fdo#110854]: https://bugs.freedesktop.org/show_bug.cgi?id=110854
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111325]: https://bugs.freedesktop.org/show_bug.cgi?id=111325
  [fdo#111329]: https://bugs.freedesktop.org/show_bug.cgi?id=111329
  [fdo#111330]: https://bugs.freedesktop.org/show_bug.cgi?id=111330
  [fdo#111545]: https://bugs.freedesktop.org/show_bug.cgi?id=111545
  [fdo#111546]: https://bugs.freedesktop.org/show_bug.cgi?id=111546
  [fdo#111548]: https://bugs.freedesktop.org/show_bug.cgi?id=111548
  [fdo#111550]: https://bugs.freedesktop.org/show_bug.cgi?id=111550
  [fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912


Participating hosts (10 -> 10)
------------------------------

  No changes in participating hosts


Build changes
-------------

  * CI: CI-20190529 -> None
  * Linux: CI_DRM_6839 -> Patchwork_14297

  CI-20190529: 20190529
  CI_DRM_6839: d3d45e02f5adaa9b9dae212460b3d93cc6e28a4b @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5171: 1911564805fe454919e8a5846534a0c1ef376a33 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_14297: 6e68968b4d13e3f0eebc00cfbee0e1aa5156b803 @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14297/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector
       [not found] ` <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
  2019-09-05 21:12   ` [PATCH v2.1] " José Roberto de Souza
@ 2019-09-06 11:27   ` Ville Syrjälä
       [not found]     ` <20190906112751.GQ7482-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 7+ messages in thread
From: Ville Syrjälä @ 2019-09-06 11:27 UTC (permalink / raw)
  To: José Roberto de Souza
  Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Alex Deucher,
	Dhinakaran Pandiyan

On Thu, Sep 05, 2019 at 02:09:27PM -0700, José Roberto de Souza wrote:
> From: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
> 
> Currently we restrict the number of encoders that can be linked to
> a connector to 3, increase it to match the maximum number of encoders
> that can be initialized(32).
> 
> To more effiently do that lets switch from an array of encoder ids to
> bitmask.
> 
> Also removing the best_encoder hook from the drivers that only have
> one encoder per connector(this ones have one encoder in the whole
> driver), pick_single_encoder_for_connector() will do the same job
> with no functional change.

I don't think non-atomic drivers have that fallback in place.
They probable should...

Apart from that lgtm
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> 
> v2: Fixing missed return on amdgpu_dm_connector_to_encoder()
> 
> Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>
> Cc: dri-devel@lists.freedesktop.org
> Cc: intel-gfx@lists.freedesktop.org
> Cc: nouveau@lists.freedesktop.org
> Cc: amd-gfx@lists.freedesktop.org
> Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> ---
>  .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 23 +++++---------
>  drivers/gpu/drm/amd/amdgpu/dce_virtual.c      |  5 ++-
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  6 +++-
>  drivers/gpu/drm/ast/ast_mode.c                | 12 -------
>  drivers/gpu/drm/drm_atomic_helper.c           |  9 ++++--
>  drivers/gpu/drm/drm_client_modeset.c          |  3 +-
>  drivers/gpu/drm/drm_connector.c               | 31 +++++--------------
>  drivers/gpu/drm/drm_probe_helper.c            |  3 +-
>  drivers/gpu/drm/mgag200/mgag200_mode.c        | 11 -------
>  drivers/gpu/drm/nouveau/dispnv04/disp.c       |  2 +-
>  drivers/gpu/drm/nouveau/dispnv50/disp.c       |  2 +-
>  drivers/gpu/drm/nouveau/nouveau_connector.c   |  7 ++---
>  drivers/gpu/drm/radeon/radeon_connectors.c    | 27 ++++++----------
>  drivers/gpu/drm/udl/udl_connector.c           |  8 -----
>  include/drm/drm_connector.h                   | 18 +++++------
>  15 files changed, 53 insertions(+), 114 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> index ece55c8fa673..d8729285f731 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> @@ -217,11 +217,10 @@ amdgpu_connector_update_scratch_regs(struct drm_connector *connector,
>  	struct drm_encoder *encoder;
>  	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
>  	bool connected;
> -	int i;
>  
>  	best_encoder = connector_funcs->best_encoder(connector);
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if ((encoder == best_encoder) && (status == connector_status_connected))
>  			connected = true;
>  		else
> @@ -236,9 +235,8 @@ amdgpu_connector_find_encoder(struct drm_connector *connector,
>  			       int encoder_type)
>  {
>  	struct drm_encoder *encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if (encoder->encoder_type == encoder_type)
>  			return encoder;
>  	}
> @@ -347,10 +345,9 @@ static struct drm_encoder *
>  amdgpu_connector_best_single_encoder(struct drm_connector *connector)
>  {
>  	struct drm_encoder *encoder;
> -	int i;
>  
>  	/* pick the first one */
> -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> +	drm_connector_for_each_possible_encoder(connector, encoder)
>  		return encoder;
>  
>  	return NULL;
> @@ -1065,9 +1062,8 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
>  	/* find analog encoder */
>  	if (amdgpu_connector->dac_load_detect) {
>  		struct drm_encoder *encoder;
> -		int i;
>  
> -		drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +		drm_connector_for_each_possible_encoder(connector, encoder) {
>  			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
>  			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
>  				continue;
> @@ -1117,9 +1113,8 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
>  {
>  	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>  	struct drm_encoder *encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if (amdgpu_connector->use_digital == true) {
>  			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
>  				return encoder;
> @@ -1134,7 +1129,7 @@ amdgpu_connector_dvi_encoder(struct drm_connector *connector)
>  
>  	/* then check use digitial */
>  	/* pick the first one */
> -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> +	drm_connector_for_each_possible_encoder(connector, encoder)
>  		return encoder;
>  
>  	return NULL;
> @@ -1271,9 +1266,8 @@ u16 amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
>  {
>  	struct drm_encoder *encoder;
>  	struct amdgpu_encoder *amdgpu_encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		amdgpu_encoder = to_amdgpu_encoder(encoder);
>  
>  		switch (amdgpu_encoder->encoder_id) {
> @@ -1292,10 +1286,9 @@ static bool amdgpu_connector_encoder_is_hbr2(struct drm_connector *connector)
>  {
>  	struct drm_encoder *encoder;
>  	struct amdgpu_encoder *amdgpu_encoder;
> -	int i;
>  	bool found = false;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		amdgpu_encoder = to_amdgpu_encoder(encoder);
>  		if (amdgpu_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
>  			found = true;
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index f1fadb5ba191..99d12e88de92 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -260,15 +260,14 @@ static struct drm_encoder *
>  dce_virtual_encoder(struct drm_connector *connector)
>  {
>  	struct drm_encoder *encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
>  			return encoder;
>  	}
>  
>  	/* pick the first one */
> -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> +	drm_connector_for_each_possible_encoder(connector, encoder)
>  		return encoder;
>  
>  	return NULL;
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 0a71ed1e7762..d6e3925ca633 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -4822,7 +4822,11 @@ static int to_drm_connector_type(enum signal_type st)
>  
>  static struct drm_encoder *amdgpu_dm_connector_to_encoder(struct drm_connector *connector)
>  {
> -	return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
> +	struct drm_encoder *encoder;
> +
> +	/* There is only one encoder per connector */
> +	drm_connector_for_each_possible_encoder(connector, encoder)
> +		return encoder;
>  }
>  
>  static void amdgpu_dm_get_native_mode(struct drm_connector *connector)
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index d349c721501c..eef95e1af06b 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -687,17 +687,6 @@ static void ast_encoder_destroy(struct drm_encoder *encoder)
>  	kfree(encoder);
>  }
>  
> -
> -static struct drm_encoder *ast_best_single_encoder(struct drm_connector *connector)
> -{
> -	int enc_id = connector->encoder_ids[0];
> -	/* pick the encoder ids */
> -	if (enc_id)
> -		return drm_encoder_find(connector->dev, NULL, enc_id);
> -	return NULL;
> -}
> -
> -
>  static const struct drm_encoder_funcs ast_enc_funcs = {
>  	.destroy = ast_encoder_destroy,
>  };
> @@ -847,7 +836,6 @@ static void ast_connector_destroy(struct drm_connector *connector)
>  static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
>  	.mode_valid = ast_mode_valid,
>  	.get_modes = ast_get_modes,
> -	.best_encoder = ast_best_single_encoder,
>  };
>  
>  static const struct drm_connector_funcs ast_connector_funcs = {
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index 4706439fb490..c440027cb537 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -104,8 +104,13 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
>  static struct drm_encoder *
>  pick_single_encoder_for_connector(struct drm_connector *connector)
>  {
> -	WARN_ON(connector->encoder_ids[1]);
> -	return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
> +	struct drm_encoder *encoder;
> +
> +	WARN_ON(hweight32(connector->possible_encoders) > 1);
> +	drm_connector_for_each_possible_encoder(connector, encoder)
> +		return encoder;
> +
> +	return NULL;
>  }
>  
>  static int handle_conflicting_encoders(struct drm_atomic_state *state,
> diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c
> index c8922b7cac09..895b73f23079 100644
> --- a/drivers/gpu/drm/drm_client_modeset.c
> +++ b/drivers/gpu/drm/drm_client_modeset.c
> @@ -415,9 +415,8 @@ static bool connector_has_possible_crtc(struct drm_connector *connector,
>  					struct drm_crtc *crtc)
>  {
>  	struct drm_encoder *encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if (encoder->possible_crtcs & drm_crtc_mask(crtc))
>  			return true;
>  	}
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 4c766624b20d..43896c711b50 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -365,8 +365,6 @@ EXPORT_SYMBOL(drm_connector_attach_edid_property);
>  int drm_connector_attach_encoder(struct drm_connector *connector,
>  				 struct drm_encoder *encoder)
>  {
> -	int i;
> -
>  	/*
>  	 * In the past, drivers have attempted to model the static association
>  	 * of connector to encoder in simple connector/encoder devices using a
> @@ -381,18 +379,15 @@ int drm_connector_attach_encoder(struct drm_connector *connector,
>  	if (WARN_ON(connector->encoder))
>  		return -EINVAL;
>  
> -	for (i = 0; i < ARRAY_SIZE(connector->encoder_ids); i++) {
> -		if (connector->encoder_ids[i] == 0) {
> -			connector->encoder_ids[i] = encoder->base.id;
> -			return 0;
> -		}
> -	}
> -	return -ENOMEM;
> +	connector->possible_encoders |= drm_encoder_mask(encoder);
> +
> +	return 0;
>  }
>  EXPORT_SYMBOL(drm_connector_attach_encoder);
>  
>  /**
> - * drm_connector_has_possible_encoder - check if the connector and encoder are assosicated with each other
> + * drm_connector_has_possible_encoder - check if the connector and encoder are
> + * associated with each other
>   * @connector: the connector
>   * @encoder: the encoder
>   *
> @@ -402,15 +397,7 @@ EXPORT_SYMBOL(drm_connector_attach_encoder);
>  bool drm_connector_has_possible_encoder(struct drm_connector *connector,
>  					struct drm_encoder *encoder)
>  {
> -	struct drm_encoder *enc;
> -	int i;
> -
> -	drm_connector_for_each_possible_encoder(connector, enc, i) {
> -		if (enc == encoder)
> -			return true;
> -	}
> -
> -	return false;
> +	return connector->possible_encoders & drm_encoder_mask(encoder);
>  }
>  EXPORT_SYMBOL(drm_connector_has_possible_encoder);
>  
> @@ -2121,7 +2108,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
>  	int encoders_count = 0;
>  	int ret = 0;
>  	int copied = 0;
> -	int i;
>  	struct drm_mode_modeinfo u_mode;
>  	struct drm_mode_modeinfo __user *mode_ptr;
>  	uint32_t __user *encoder_ptr;
> @@ -2136,14 +2122,13 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
>  	if (!connector)
>  		return -ENOENT;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> -		encoders_count++;
> +	encoders_count = hweight32(connector->possible_encoders);
>  
>  	if ((out_resp->count_encoders >= encoders_count) && encoders_count) {
>  		copied = 0;
>  		encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr);
>  
> -		drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +		drm_connector_for_each_possible_encoder(connector, encoder) {
>  			if (put_user(encoder->base.id, encoder_ptr + copied)) {
>  				ret = -EFAULT;
>  				goto out;
> diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
> index 351cbc40f0f8..a7c87abe88d0 100644
> --- a/drivers/gpu/drm/drm_probe_helper.c
> +++ b/drivers/gpu/drm/drm_probe_helper.c
> @@ -93,7 +93,6 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
>  	struct drm_device *dev = connector->dev;
>  	enum drm_mode_status ret = MODE_OK;
>  	struct drm_encoder *encoder;
> -	int i;
>  
>  	/* Step 1: Validate against connector */
>  	ret = drm_connector_mode_valid(connector, mode);
> @@ -101,7 +100,7 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
>  		return ret;
>  
>  	/* Step 2: Validate against encoders and crtcs */
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		struct drm_crtc *crtc;
>  
>  		ret = drm_encoder_mode_valid(encoder, mode);
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
> index 5e778b5f1a10..68226556044b 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> @@ -1638,16 +1638,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
>  	return MODE_OK;
>  }
>  
> -static struct drm_encoder *mga_connector_best_encoder(struct drm_connector
> -						  *connector)
> -{
> -	int enc_id = connector->encoder_ids[0];
> -	/* pick the encoder ids */
> -	if (enc_id)
> -		return drm_encoder_find(connector->dev, NULL, enc_id);
> -	return NULL;
> -}
> -
>  static void mga_connector_destroy(struct drm_connector *connector)
>  {
>  	struct mga_connector *mga_connector = to_mga_connector(connector);
> @@ -1659,7 +1649,6 @@ static void mga_connector_destroy(struct drm_connector *connector)
>  static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
>  	.get_modes = mga_vga_get_modes,
>  	.mode_valid = mga_vga_mode_valid,
> -	.best_encoder = mga_connector_best_encoder,
>  };
>  
>  static const struct drm_connector_funcs mga_vga_connector_funcs = {
> diff --git a/drivers/gpu/drm/nouveau/dispnv04/disp.c b/drivers/gpu/drm/nouveau/dispnv04/disp.c
> index dc64863b5fd8..44ee82d0c9b6 100644
> --- a/drivers/gpu/drm/nouveau/dispnv04/disp.c
> +++ b/drivers/gpu/drm/nouveau/dispnv04/disp.c
> @@ -256,7 +256,7 @@ nv04_display_create(struct drm_device *dev)
>  
>  	list_for_each_entry_safe(connector, ct,
>  				 &dev->mode_config.connector_list, head) {
> -		if (!connector->encoder_ids[0]) {
> +		if (!connector->possible_encoders) {
>  			NV_WARN(drm, "%s has no encoders, removing\n",
>  				connector->name);
>  			connector->funcs->destroy(connector);
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
> index 307584107d77..98c87195d711 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
> @@ -2391,7 +2391,7 @@ nv50_display_create(struct drm_device *dev)
>  
>  	/* cull any connectors we created that don't have an encoder */
>  	list_for_each_entry_safe(connector, tmp, &dev->mode_config.connector_list, head) {
> -		if (connector->encoder_ids[0])
> +		if (connector->possible_encoders)
>  			continue;
>  
>  		NV_WARN(drm, "%s has no encoders, removing\n",
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
> index 56871d34e3fb..3a5db17bc5c7 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> @@ -365,9 +365,8 @@ find_encoder(struct drm_connector *connector, int type)
>  {
>  	struct nouveau_encoder *nv_encoder;
>  	struct drm_encoder *enc;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, enc, i) {
> +	drm_connector_for_each_possible_encoder(connector, enc) {
>  		nv_encoder = nouveau_encoder(enc);
>  
>  		if (type == DCB_OUTPUT_ANY ||
> @@ -414,10 +413,10 @@ nouveau_connector_ddc_detect(struct drm_connector *connector)
>  	struct drm_device *dev = connector->dev;
>  	struct nouveau_encoder *nv_encoder = NULL, *found = NULL;
>  	struct drm_encoder *encoder;
> -	int i, ret;
> +	int ret;
>  	bool switcheroo_ddc = false;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		nv_encoder = nouveau_encoder(encoder);
>  
>  		switch (nv_encoder->dcb->type) {
> diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
> index b684cd719612..c07427d3c199 100644
> --- a/drivers/gpu/drm/radeon/radeon_connectors.c
> +++ b/drivers/gpu/drm/radeon/radeon_connectors.c
> @@ -249,11 +249,10 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
>  	struct drm_encoder *encoder;
>  	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
>  	bool connected;
> -	int i;
>  
>  	best_encoder = connector_funcs->best_encoder(connector);
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if ((encoder == best_encoder) && (status == connector_status_connected))
>  			connected = true;
>  		else
> @@ -269,9 +268,8 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
>  static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
>  {
>  	struct drm_encoder *encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if (encoder->encoder_type == encoder_type)
>  			return encoder;
>  	}
> @@ -380,10 +378,9 @@ static int radeon_ddc_get_modes(struct drm_connector *connector)
>  static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
>  {
>  	struct drm_encoder *encoder;
> -	int i;
>  
>  	/* pick the first one */
> -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> +	drm_connector_for_each_possible_encoder(connector, encoder)
>  		return encoder;
>  
>  	return NULL;
> @@ -428,14 +425,13 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
>  
>  	list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
>  		struct drm_encoder *enc;
> -		int i;
>  
>  		if (conflict == connector)
>  			continue;
>  
>  		radeon_conflict = to_radeon_connector(conflict);
>  
> -		drm_connector_for_each_possible_encoder(conflict, enc, i) {
> +		drm_connector_for_each_possible_encoder(conflict, enc) {
>  			/* if the IDs match */
>  			if (enc == encoder) {
>  				if (conflict->status != connector_status_connected)
> @@ -1363,9 +1359,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
>  
>  	/* find analog encoder */
>  	if (radeon_connector->dac_load_detect) {
> -		int i;
> -
> -		drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +		drm_connector_for_each_possible_encoder(connector, encoder) {
>  			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
>  			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
>  				continue;
> @@ -1443,9 +1437,8 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
>  {
>  	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
>  	struct drm_encoder *encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		if (radeon_connector->use_digital == true) {
>  			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
>  				return encoder;
> @@ -1460,7 +1453,7 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
>  
>  	/* then check use digitial */
>  	/* pick the first one */
> -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> +	drm_connector_for_each_possible_encoder(connector, encoder)
>  		return encoder;
>  
>  	return NULL;
> @@ -1603,9 +1596,8 @@ u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
>  {
>  	struct drm_encoder *encoder;
>  	struct radeon_encoder *radeon_encoder;
> -	int i;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		radeon_encoder = to_radeon_encoder(encoder);
>  
>  		switch (radeon_encoder->encoder_id) {
> @@ -1624,10 +1616,9 @@ static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
>  {
>  	struct drm_encoder *encoder;
>  	struct radeon_encoder *radeon_encoder;
> -	int i;
>  	bool found = false;
>  
> -	drm_connector_for_each_possible_encoder(connector, encoder, i) {
> +	drm_connector_for_each_possible_encoder(connector, encoder) {
>  		radeon_encoder = to_radeon_encoder(encoder);
>  		if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
>  			found = true;
> diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
> index ddb61a60c610..b4ae3e89a7b4 100644
> --- a/drivers/gpu/drm/udl/udl_connector.c
> +++ b/drivers/gpu/drm/udl/udl_connector.c
> @@ -90,13 +90,6 @@ udl_detect(struct drm_connector *connector, bool force)
>  	return connector_status_connected;
>  }
>  
> -static struct drm_encoder*
> -udl_best_single_encoder(struct drm_connector *connector)
> -{
> -	int enc_id = connector->encoder_ids[0];
> -	return drm_encoder_find(connector->dev, NULL, enc_id);
> -}
> -
>  static int udl_connector_set_property(struct drm_connector *connector,
>  				      struct drm_property *property,
>  				      uint64_t val)
> @@ -120,7 +113,6 @@ static void udl_connector_destroy(struct drm_connector *connector)
>  static const struct drm_connector_helper_funcs udl_connector_helper_funcs = {
>  	.get_modes = udl_get_modes,
>  	.mode_valid = udl_mode_valid,
> -	.best_encoder = udl_best_single_encoder,
>  };
>  
>  static const struct drm_connector_funcs udl_connector_funcs = {
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 681cb590f952..c6e993e78dbd 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1288,12 +1288,12 @@ struct drm_connector {
>  	/** @override_edid: has the EDID been overwritten through debugfs for testing? */
>  	bool override_edid;
>  
> -#define DRM_CONNECTOR_MAX_ENCODER 3
>  	/**
> -	 * @encoder_ids: Valid encoders for this connector. Please only use
> -	 * drm_connector_for_each_possible_encoder() to enumerate these.
> +	 * @possible_encoders: Bit mask of encoders that can drive this
> +	 * connector, drm_encoder_index() determines the index into the bitfield
> +	 * and the bits are set with drm_connector_attach_encoder().
>  	 */
> -	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
> +	u32 possible_encoders;
>  
>  	/**
>  	 * @encoder: Currently bound encoder driving this connector, if any.
> @@ -1608,13 +1608,9 @@ bool drm_connector_has_possible_encoder(struct drm_connector *connector,
>   * drm_connector_for_each_possible_encoder - iterate connector's possible encoders
>   * @connector: &struct drm_connector pointer
>   * @encoder: &struct drm_encoder pointer used as cursor
> - * @__i: int iteration cursor, for macro-internal use
>   */
> -#define drm_connector_for_each_possible_encoder(connector, encoder, __i) \
> -	for ((__i) = 0; (__i) < ARRAY_SIZE((connector)->encoder_ids) && \
> -		     (connector)->encoder_ids[(__i)] != 0; (__i)++) \
> -		for_each_if((encoder) = \
> -			    drm_encoder_find((connector)->dev, NULL, \
> -					     (connector)->encoder_ids[(__i)])) \
> +#define drm_connector_for_each_possible_encoder(connector, encoder) \
> +	drm_for_each_encoder_mask(encoder, (connector)->dev, \
> +				  (connector)->possible_encoders)
>  
>  #endif
> -- 
> 2.23.0

-- 
Ville Syrjälä
Intel
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector
       [not found]     ` <20190906112751.GQ7482-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2019-09-06 17:23       ` Souza, Jose
  0 siblings, 0 replies; 7+ messages in thread
From: Souza, Jose @ 2019-09-06 17:23 UTC (permalink / raw)
  To: ville.syrjala-VuQAYsv1563Yd54FQh9/CA
  Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	alexander.deucher-5C7GfCeVMHo, Pandiyan, Dhinakaran

On Fri, 2019-09-06 at 14:27 +0300, Ville Syrjälä wrote:
> On Thu, Sep 05, 2019 at 02:09:27PM -0700, José Roberto de Souza
> wrote:
> > From: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
> > 
> > Currently we restrict the number of encoders that can be linked to
> > a connector to 3, increase it to match the maximum number of
> > encoders
> > that can be initialized(32).
> > 
> > To more effiently do that lets switch from an array of encoder ids
> > to
> > bitmask.
> > 
> > Also removing the best_encoder hook from the drivers that only have
> > one encoder per connector(this ones have one encoder in the whole
> > driver), pick_single_encoder_for_connector() will do the same job
> > with no functional change.
> 
> I don't think non-atomic drivers have that fallback in place.
> They probable should...

Nice catch, thanks I will bring it back as it was removed from non-
atomic drivers.

> 
> Apart from that lgtm
> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> > v2: Fixing missed return on amdgpu_dm_connector_to_encoder()
> > 
> > Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Alex Deucher <alexander.deucher@amd.com>
> > Cc: dri-devel@lists.freedesktop.org
> > Cc: intel-gfx@lists.freedesktop.org
> > Cc: nouveau@lists.freedesktop.org
> > Cc: amd-gfx@lists.freedesktop.org
> > Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > ---
> >  .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 23 +++++---------
> >  drivers/gpu/drm/amd/amdgpu/dce_virtual.c      |  5 ++-
> >  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  6 +++-
> >  drivers/gpu/drm/ast/ast_mode.c                | 12 -------
> >  drivers/gpu/drm/drm_atomic_helper.c           |  9 ++++--
> >  drivers/gpu/drm/drm_client_modeset.c          |  3 +-
> >  drivers/gpu/drm/drm_connector.c               | 31 +++++--------
> > ------
> >  drivers/gpu/drm/drm_probe_helper.c            |  3 +-
> >  drivers/gpu/drm/mgag200/mgag200_mode.c        | 11 -------
> >  drivers/gpu/drm/nouveau/dispnv04/disp.c       |  2 +-
> >  drivers/gpu/drm/nouveau/dispnv50/disp.c       |  2 +-
> >  drivers/gpu/drm/nouveau/nouveau_connector.c   |  7 ++---
> >  drivers/gpu/drm/radeon/radeon_connectors.c    | 27 ++++++---------
> > -
> >  drivers/gpu/drm/udl/udl_connector.c           |  8 -----
> >  include/drm/drm_connector.h                   | 18 +++++------
> >  15 files changed, 53 insertions(+), 114 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > index ece55c8fa673..d8729285f731 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > @@ -217,11 +217,10 @@ amdgpu_connector_update_scratch_regs(struct
> > drm_connector *connector,
> >  	struct drm_encoder *encoder;
> >  	const struct drm_connector_helper_funcs *connector_funcs =
> > connector->helper_private;
> >  	bool connected;
> > -	int i;
> >  
> >  	best_encoder = connector_funcs->best_encoder(connector);
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if ((encoder == best_encoder) && (status ==
> > connector_status_connected))
> >  			connected = true;
> >  		else
> > @@ -236,9 +235,8 @@ amdgpu_connector_find_encoder(struct
> > drm_connector *connector,
> >  			       int encoder_type)
> >  {
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if (encoder->encoder_type == encoder_type)
> >  			return encoder;
> >  	}
> > @@ -347,10 +345,9 @@ static struct drm_encoder *
> >  amdgpu_connector_best_single_encoder(struct drm_connector
> > *connector)
> >  {
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> >  	/* pick the first one */
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> >  		return encoder;
> >  
> >  	return NULL;
> > @@ -1065,9 +1062,8 @@ amdgpu_connector_dvi_detect(struct
> > drm_connector *connector, bool force)
> >  	/* find analog encoder */
> >  	if (amdgpu_connector->dac_load_detect) {
> >  		struct drm_encoder *encoder;
> > -		int i;
> >  
> > -		drm_connector_for_each_possible_encoder(connector,
> > encoder, i) {
> > +		drm_connector_for_each_possible_encoder(connector,
> > encoder) {
> >  			if (encoder->encoder_type !=
> > DRM_MODE_ENCODER_DAC &&
> >  			    encoder->encoder_type !=
> > DRM_MODE_ENCODER_TVDAC)
> >  				continue;
> > @@ -1117,9 +1113,8 @@ amdgpu_connector_dvi_encoder(struct
> > drm_connector *connector)
> >  {
> >  	struct amdgpu_connector *amdgpu_connector =
> > to_amdgpu_connector(connector);
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if (amdgpu_connector->use_digital == true) {
> >  			if (encoder->encoder_type ==
> > DRM_MODE_ENCODER_TMDS)
> >  				return encoder;
> > @@ -1134,7 +1129,7 @@ amdgpu_connector_dvi_encoder(struct
> > drm_connector *connector)
> >  
> >  	/* then check use digitial */
> >  	/* pick the first one */
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> >  		return encoder;
> >  
> >  	return NULL;
> > @@ -1271,9 +1266,8 @@ u16
> > amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct
> > drm_connector *conn
> >  {
> >  	struct drm_encoder *encoder;
> >  	struct amdgpu_encoder *amdgpu_encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		amdgpu_encoder = to_amdgpu_encoder(encoder);
> >  
> >  		switch (amdgpu_encoder->encoder_id) {
> > @@ -1292,10 +1286,9 @@ static bool
> > amdgpu_connector_encoder_is_hbr2(struct drm_connector *connector)
> >  {
> >  	struct drm_encoder *encoder;
> >  	struct amdgpu_encoder *amdgpu_encoder;
> > -	int i;
> >  	bool found = false;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		amdgpu_encoder = to_amdgpu_encoder(encoder);
> >  		if (amdgpu_encoder->caps &
> > ATOM_ENCODER_CAP_RECORD_HBR2)
> >  			found = true;
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > index f1fadb5ba191..99d12e88de92 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > @@ -260,15 +260,14 @@ static struct drm_encoder *
> >  dce_virtual_encoder(struct drm_connector *connector)
> >  {
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
> >  			return encoder;
> >  	}
> >  
> >  	/* pick the first one */
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> >  		return encoder;
> >  
> >  	return NULL;
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > index 0a71ed1e7762..d6e3925ca633 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > @@ -4822,7 +4822,11 @@ static int to_drm_connector_type(enum
> > signal_type st)
> >  
> >  static struct drm_encoder *amdgpu_dm_connector_to_encoder(struct
> > drm_connector *connector)
> >  {
> > -	return drm_encoder_find(connector->dev, NULL, connector-
> > >encoder_ids[0]);
> > +	struct drm_encoder *encoder;
> > +
> > +	/* There is only one encoder per connector */
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> > +		return encoder;
> >  }
> >  
> >  static void amdgpu_dm_get_native_mode(struct drm_connector
> > *connector)
> > diff --git a/drivers/gpu/drm/ast/ast_mode.c
> > b/drivers/gpu/drm/ast/ast_mode.c
> > index d349c721501c..eef95e1af06b 100644
> > --- a/drivers/gpu/drm/ast/ast_mode.c
> > +++ b/drivers/gpu/drm/ast/ast_mode.c
> > @@ -687,17 +687,6 @@ static void ast_encoder_destroy(struct
> > drm_encoder *encoder)
> >  	kfree(encoder);
> >  }
> >  
> > -
> > -static struct drm_encoder *ast_best_single_encoder(struct
> > drm_connector *connector)
> > -{
> > -	int enc_id = connector->encoder_ids[0];
> > -	/* pick the encoder ids */
> > -	if (enc_id)
> > -		return drm_encoder_find(connector->dev, NULL, enc_id);
> > -	return NULL;
> > -}
> > -
> > -
> >  static const struct drm_encoder_funcs ast_enc_funcs = {
> >  	.destroy = ast_encoder_destroy,
> >  };
> > @@ -847,7 +836,6 @@ static void ast_connector_destroy(struct
> > drm_connector *connector)
> >  static const struct drm_connector_helper_funcs
> > ast_connector_helper_funcs = {
> >  	.mode_valid = ast_mode_valid,
> >  	.get_modes = ast_get_modes,
> > -	.best_encoder = ast_best_single_encoder,
> >  };
> >  
> >  static const struct drm_connector_funcs ast_connector_funcs = {
> > diff --git a/drivers/gpu/drm/drm_atomic_helper.c
> > b/drivers/gpu/drm/drm_atomic_helper.c
> > index 4706439fb490..c440027cb537 100644
> > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > @@ -104,8 +104,13 @@ drm_atomic_helper_plane_changed(struct
> > drm_atomic_state *state,
> >  static struct drm_encoder *
> >  pick_single_encoder_for_connector(struct drm_connector *connector)
> >  {
> > -	WARN_ON(connector->encoder_ids[1]);
> > -	return drm_encoder_find(connector->dev, NULL, connector-
> > >encoder_ids[0]);
> > +	struct drm_encoder *encoder;
> > +
> > +	WARN_ON(hweight32(connector->possible_encoders) > 1);
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> > +		return encoder;
> > +
> > +	return NULL;
> >  }
> >  
> >  static int handle_conflicting_encoders(struct drm_atomic_state
> > *state,
> > diff --git a/drivers/gpu/drm/drm_client_modeset.c
> > b/drivers/gpu/drm/drm_client_modeset.c
> > index c8922b7cac09..895b73f23079 100644
> > --- a/drivers/gpu/drm/drm_client_modeset.c
> > +++ b/drivers/gpu/drm/drm_client_modeset.c
> > @@ -415,9 +415,8 @@ static bool connector_has_possible_crtc(struct
> > drm_connector *connector,
> >  					struct drm_crtc *crtc)
> >  {
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if (encoder->possible_crtcs & drm_crtc_mask(crtc))
> >  			return true;
> >  	}
> > diff --git a/drivers/gpu/drm/drm_connector.c
> > b/drivers/gpu/drm/drm_connector.c
> > index 4c766624b20d..43896c711b50 100644
> > --- a/drivers/gpu/drm/drm_connector.c
> > +++ b/drivers/gpu/drm/drm_connector.c
> > @@ -365,8 +365,6 @@
> > EXPORT_SYMBOL(drm_connector_attach_edid_property);
> >  int drm_connector_attach_encoder(struct drm_connector *connector,
> >  				 struct drm_encoder *encoder)
> >  {
> > -	int i;
> > -
> >  	/*
> >  	 * In the past, drivers have attempted to model the static
> > association
> >  	 * of connector to encoder in simple connector/encoder devices
> > using a
> > @@ -381,18 +379,15 @@ int drm_connector_attach_encoder(struct
> > drm_connector *connector,
> >  	if (WARN_ON(connector->encoder))
> >  		return -EINVAL;
> >  
> > -	for (i = 0; i < ARRAY_SIZE(connector->encoder_ids); i++) {
> > -		if (connector->encoder_ids[i] == 0) {
> > -			connector->encoder_ids[i] = encoder->base.id;
> > -			return 0;
> > -		}
> > -	}
> > -	return -ENOMEM;
> > +	connector->possible_encoders |= drm_encoder_mask(encoder);
> > +
> > +	return 0;
> >  }
> >  EXPORT_SYMBOL(drm_connector_attach_encoder);
> >  
> >  /**
> > - * drm_connector_has_possible_encoder - check if the connector and
> > encoder are assosicated with each other
> > + * drm_connector_has_possible_encoder - check if the connector and
> > encoder are
> > + * associated with each other
> >   * @connector: the connector
> >   * @encoder: the encoder
> >   *
> > @@ -402,15 +397,7 @@ EXPORT_SYMBOL(drm_connector_attach_encoder);
> >  bool drm_connector_has_possible_encoder(struct drm_connector
> > *connector,
> >  					struct drm_encoder *encoder)
> >  {
> > -	struct drm_encoder *enc;
> > -	int i;
> > -
> > -	drm_connector_for_each_possible_encoder(connector, enc, i) {
> > -		if (enc == encoder)
> > -			return true;
> > -	}
> > -
> > -	return false;
> > +	return connector->possible_encoders &
> > drm_encoder_mask(encoder);
> >  }
> >  EXPORT_SYMBOL(drm_connector_has_possible_encoder);
> >  
> > @@ -2121,7 +2108,6 @@ int drm_mode_getconnector(struct drm_device
> > *dev, void *data,
> >  	int encoders_count = 0;
> >  	int ret = 0;
> >  	int copied = 0;
> > -	int i;
> >  	struct drm_mode_modeinfo u_mode;
> >  	struct drm_mode_modeinfo __user *mode_ptr;
> >  	uint32_t __user *encoder_ptr;
> > @@ -2136,14 +2122,13 @@ int drm_mode_getconnector(struct drm_device
> > *dev, void *data,
> >  	if (!connector)
> >  		return -ENOENT;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > -		encoders_count++;
> > +	encoders_count = hweight32(connector->possible_encoders);
> >  
> >  	if ((out_resp->count_encoders >= encoders_count) &&
> > encoders_count) {
> >  		copied = 0;
> >  		encoder_ptr = (uint32_t __user *)(unsigned
> > long)(out_resp->encoders_ptr);
> >  
> > -		drm_connector_for_each_possible_encoder(connector,
> > encoder, i) {
> > +		drm_connector_for_each_possible_encoder(connector,
> > encoder) {
> >  			if (put_user(encoder->base.id, encoder_ptr +
> > copied)) {
> >  				ret = -EFAULT;
> >  				goto out;
> > diff --git a/drivers/gpu/drm/drm_probe_helper.c
> > b/drivers/gpu/drm/drm_probe_helper.c
> > index 351cbc40f0f8..a7c87abe88d0 100644
> > --- a/drivers/gpu/drm/drm_probe_helper.c
> > +++ b/drivers/gpu/drm/drm_probe_helper.c
> > @@ -93,7 +93,6 @@ drm_mode_validate_pipeline(struct
> > drm_display_mode *mode,
> >  	struct drm_device *dev = connector->dev;
> >  	enum drm_mode_status ret = MODE_OK;
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> >  	/* Step 1: Validate against connector */
> >  	ret = drm_connector_mode_valid(connector, mode);
> > @@ -101,7 +100,7 @@ drm_mode_validate_pipeline(struct
> > drm_display_mode *mode,
> >  		return ret;
> >  
> >  	/* Step 2: Validate against encoders and crtcs */
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		struct drm_crtc *crtc;
> >  
> >  		ret = drm_encoder_mode_valid(encoder, mode);
> > diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c
> > b/drivers/gpu/drm/mgag200/mgag200_mode.c
> > index 5e778b5f1a10..68226556044b 100644
> > --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> > +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> > @@ -1638,16 +1638,6 @@ static enum drm_mode_status
> > mga_vga_mode_valid(struct drm_connector *connector,
> >  	return MODE_OK;
> >  }
> >  
> > -static struct drm_encoder *mga_connector_best_encoder(struct
> > drm_connector
> > -						  *connector)
> > -{
> > -	int enc_id = connector->encoder_ids[0];
> > -	/* pick the encoder ids */
> > -	if (enc_id)
> > -		return drm_encoder_find(connector->dev, NULL, enc_id);
> > -	return NULL;
> > -}
> > -
> >  static void mga_connector_destroy(struct drm_connector *connector)
> >  {
> >  	struct mga_connector *mga_connector =
> > to_mga_connector(connector);
> > @@ -1659,7 +1649,6 @@ static void mga_connector_destroy(struct
> > drm_connector *connector)
> >  static const struct drm_connector_helper_funcs
> > mga_vga_connector_helper_funcs = {
> >  	.get_modes = mga_vga_get_modes,
> >  	.mode_valid = mga_vga_mode_valid,
> > -	.best_encoder = mga_connector_best_encoder,
> >  };
> >  
> >  static const struct drm_connector_funcs mga_vga_connector_funcs =
> > {
> > diff --git a/drivers/gpu/drm/nouveau/dispnv04/disp.c
> > b/drivers/gpu/drm/nouveau/dispnv04/disp.c
> > index dc64863b5fd8..44ee82d0c9b6 100644
> > --- a/drivers/gpu/drm/nouveau/dispnv04/disp.c
> > +++ b/drivers/gpu/drm/nouveau/dispnv04/disp.c
> > @@ -256,7 +256,7 @@ nv04_display_create(struct drm_device *dev)
> >  
> >  	list_for_each_entry_safe(connector, ct,
> >  				 &dev->mode_config.connector_list,
> > head) {
> > -		if (!connector->encoder_ids[0]) {
> > +		if (!connector->possible_encoders) {
> >  			NV_WARN(drm, "%s has no encoders, removing\n",
> >  				connector->name);
> >  			connector->funcs->destroy(connector);
> > diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c
> > b/drivers/gpu/drm/nouveau/dispnv50/disp.c
> > index 307584107d77..98c87195d711 100644
> > --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
> > +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
> > @@ -2391,7 +2391,7 @@ nv50_display_create(struct drm_device *dev)
> >  
> >  	/* cull any connectors we created that don't have an encoder */
> >  	list_for_each_entry_safe(connector, tmp, &dev-
> > >mode_config.connector_list, head) {
> > -		if (connector->encoder_ids[0])
> > +		if (connector->possible_encoders)
> >  			continue;
> >  
> >  		NV_WARN(drm, "%s has no encoders, removing\n",
> > diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c
> > b/drivers/gpu/drm/nouveau/nouveau_connector.c
> > index 56871d34e3fb..3a5db17bc5c7 100644
> > --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> > +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> > @@ -365,9 +365,8 @@ find_encoder(struct drm_connector *connector,
> > int type)
> >  {
> >  	struct nouveau_encoder *nv_encoder;
> >  	struct drm_encoder *enc;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, enc, i) {
> > +	drm_connector_for_each_possible_encoder(connector, enc) {
> >  		nv_encoder = nouveau_encoder(enc);
> >  
> >  		if (type == DCB_OUTPUT_ANY ||
> > @@ -414,10 +413,10 @@ nouveau_connector_ddc_detect(struct
> > drm_connector *connector)
> >  	struct drm_device *dev = connector->dev;
> >  	struct nouveau_encoder *nv_encoder = NULL, *found = NULL;
> >  	struct drm_encoder *encoder;
> > -	int i, ret;
> > +	int ret;
> >  	bool switcheroo_ddc = false;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		nv_encoder = nouveau_encoder(encoder);
> >  
> >  		switch (nv_encoder->dcb->type) {
> > diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c
> > b/drivers/gpu/drm/radeon/radeon_connectors.c
> > index b684cd719612..c07427d3c199 100644
> > --- a/drivers/gpu/drm/radeon/radeon_connectors.c
> > +++ b/drivers/gpu/drm/radeon/radeon_connectors.c
> > @@ -249,11 +249,10 @@ radeon_connector_update_scratch_regs(struct
> > drm_connector *connector, enum drm_c
> >  	struct drm_encoder *encoder;
> >  	const struct drm_connector_helper_funcs *connector_funcs =
> > connector->helper_private;
> >  	bool connected;
> > -	int i;
> >  
> >  	best_encoder = connector_funcs->best_encoder(connector);
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if ((encoder == best_encoder) && (status ==
> > connector_status_connected))
> >  			connected = true;
> >  		else
> > @@ -269,9 +268,8 @@ radeon_connector_update_scratch_regs(struct
> > drm_connector *connector, enum drm_c
> >  static struct drm_encoder *radeon_find_encoder(struct
> > drm_connector *connector, int encoder_type)
> >  {
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if (encoder->encoder_type == encoder_type)
> >  			return encoder;
> >  	}
> > @@ -380,10 +378,9 @@ static int radeon_ddc_get_modes(struct
> > drm_connector *connector)
> >  static struct drm_encoder *radeon_best_single_encoder(struct
> > drm_connector *connector)
> >  {
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> >  	/* pick the first one */
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> >  		return encoder;
> >  
> >  	return NULL;
> > @@ -428,14 +425,13 @@
> > radeon_connector_analog_encoder_conflict_solve(struct drm_connector
> > *connector,
> >  
> >  	list_for_each_entry(conflict, &dev->mode_config.connector_list, 
> > head) {
> >  		struct drm_encoder *enc;
> > -		int i;
> >  
> >  		if (conflict == connector)
> >  			continue;
> >  
> >  		radeon_conflict = to_radeon_connector(conflict);
> >  
> > -		drm_connector_for_each_possible_encoder(conflict, enc,
> > i) {
> > +		drm_connector_for_each_possible_encoder(conflict, enc)
> > {
> >  			/* if the IDs match */
> >  			if (enc == encoder) {
> >  				if (conflict->status !=
> > connector_status_connected)
> > @@ -1363,9 +1359,7 @@ radeon_dvi_detect(struct drm_connector
> > *connector, bool force)
> >  
> >  	/* find analog encoder */
> >  	if (radeon_connector->dac_load_detect) {
> > -		int i;
> > -
> > -		drm_connector_for_each_possible_encoder(connector,
> > encoder, i) {
> > +		drm_connector_for_each_possible_encoder(connector,
> > encoder) {
> >  			if (encoder->encoder_type !=
> > DRM_MODE_ENCODER_DAC &&
> >  			    encoder->encoder_type !=
> > DRM_MODE_ENCODER_TVDAC)
> >  				continue;
> > @@ -1443,9 +1437,8 @@ static struct drm_encoder
> > *radeon_dvi_encoder(struct drm_connector *connector)
> >  {
> >  	struct radeon_connector *radeon_connector =
> > to_radeon_connector(connector);
> >  	struct drm_encoder *encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		if (radeon_connector->use_digital == true) {
> >  			if (encoder->encoder_type ==
> > DRM_MODE_ENCODER_TMDS)
> >  				return encoder;
> > @@ -1460,7 +1453,7 @@ static struct drm_encoder
> > *radeon_dvi_encoder(struct drm_connector *connector)
> >  
> >  	/* then check use digitial */
> >  	/* pick the first one */
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > +	drm_connector_for_each_possible_encoder(connector, encoder)
> >  		return encoder;
> >  
> >  	return NULL;
> > @@ -1603,9 +1596,8 @@ u16
> > radeon_connector_encoder_get_dp_bridge_encoder_id(struct
> > drm_connector *conn
> >  {
> >  	struct drm_encoder *encoder;
> >  	struct radeon_encoder *radeon_encoder;
> > -	int i;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		radeon_encoder = to_radeon_encoder(encoder);
> >  
> >  		switch (radeon_encoder->encoder_id) {
> > @@ -1624,10 +1616,9 @@ static bool
> > radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
> >  {
> >  	struct drm_encoder *encoder;
> >  	struct radeon_encoder *radeon_encoder;
> > -	int i;
> >  	bool found = false;
> >  
> > -	drm_connector_for_each_possible_encoder(connector, encoder, i)
> > {
> > +	drm_connector_for_each_possible_encoder(connector, encoder) {
> >  		radeon_encoder = to_radeon_encoder(encoder);
> >  		if (radeon_encoder->caps &
> > ATOM_ENCODER_CAP_RECORD_HBR2)
> >  			found = true;
> > diff --git a/drivers/gpu/drm/udl/udl_connector.c
> > b/drivers/gpu/drm/udl/udl_connector.c
> > index ddb61a60c610..b4ae3e89a7b4 100644
> > --- a/drivers/gpu/drm/udl/udl_connector.c
> > +++ b/drivers/gpu/drm/udl/udl_connector.c
> > @@ -90,13 +90,6 @@ udl_detect(struct drm_connector *connector, bool
> > force)
> >  	return connector_status_connected;
> >  }
> >  
> > -static struct drm_encoder*
> > -udl_best_single_encoder(struct drm_connector *connector)
> > -{
> > -	int enc_id = connector->encoder_ids[0];
> > -	return drm_encoder_find(connector->dev, NULL, enc_id);
> > -}
> > -
> >  static int udl_connector_set_property(struct drm_connector
> > *connector,
> >  				      struct drm_property *property,
> >  				      uint64_t val)
> > @@ -120,7 +113,6 @@ static void udl_connector_destroy(struct
> > drm_connector *connector)
> >  static const struct drm_connector_helper_funcs
> > udl_connector_helper_funcs = {
> >  	.get_modes = udl_get_modes,
> >  	.mode_valid = udl_mode_valid,
> > -	.best_encoder = udl_best_single_encoder,
> >  };
> >  
> >  static const struct drm_connector_funcs udl_connector_funcs = {
> > diff --git a/include/drm/drm_connector.h
> > b/include/drm/drm_connector.h
> > index 681cb590f952..c6e993e78dbd 100644
> > --- a/include/drm/drm_connector.h
> > +++ b/include/drm/drm_connector.h
> > @@ -1288,12 +1288,12 @@ struct drm_connector {
> >  	/** @override_edid: has the EDID been overwritten through
> > debugfs for testing? */
> >  	bool override_edid;
> >  
> > -#define DRM_CONNECTOR_MAX_ENCODER 3
> >  	/**
> > -	 * @encoder_ids: Valid encoders for this connector. Please only
> > use
> > -	 * drm_connector_for_each_possible_encoder() to enumerate
> > these.
> > +	 * @possible_encoders: Bit mask of encoders that can drive this
> > +	 * connector, drm_encoder_index() determines the index into the
> > bitfield
> > +	 * and the bits are set with drm_connector_attach_encoder().
> >  	 */
> > -	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
> > +	u32 possible_encoders;
> >  
> >  	/**
> >  	 * @encoder: Currently bound encoder driving this connector, if
> > any.
> > @@ -1608,13 +1608,9 @@ bool
> > drm_connector_has_possible_encoder(struct drm_connector *connector,
> >   * drm_connector_for_each_possible_encoder - iterate connector's
> > possible encoders
> >   * @connector: &struct drm_connector pointer
> >   * @encoder: &struct drm_encoder pointer used as cursor
> > - * @__i: int iteration cursor, for macro-internal use
> >   */
> > -#define drm_connector_for_each_possible_encoder(connector,
> > encoder, __i) \
> > -	for ((__i) = 0; (__i) < ARRAY_SIZE((connector)->encoder_ids) &&
> > \
> > -		     (connector)->encoder_ids[(__i)] != 0; (__i)++) \
> > -		for_each_if((encoder) = \
> > -			    drm_encoder_find((connector)->dev, NULL, \
> > -					     (connector)-
> > >encoder_ids[(__i)])) \
> > +#define drm_connector_for_each_possible_encoder(connector,
> > encoder) \
> > +	drm_for_each_encoder_mask(encoder, (connector)->dev, \
> > +				  (connector)->possible_encoders)
> >  
> >  #endif
> > -- 
> > 2.23.0
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-09-06 17:23 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-05 21:09 [PATCH v2] drm/connector: Allow max possible encoders to attach to a connector José Roberto de Souza
     [not found] ` <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2019-09-05 21:12   ` [PATCH v2.1] " José Roberto de Souza
2019-09-06 11:27   ` [PATCH v2] " Ville Syrjälä
     [not found]     ` <20190906112751.GQ7482-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2019-09-06 17:23       ` Souza, Jose
2019-09-05 21:37 ` ✗ Fi.CI.CHECKPATCH: warning for drm/connector: Allow max possible encoders to attach to a connector (rev4) Patchwork
2019-09-05 22:06 ` ✓ Fi.CI.BAT: success " Patchwork
2019-09-06  4:29 ` ✓ Fi.CI.IGT: " Patchwork

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.