* [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
[parent not found: <20190905210927.26540-1-jose.souza-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* [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
* 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
[parent not found: <20190906112751.GQ7482-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* 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
* ✗ 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
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.