Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm/dp: Use the connector passed to dp_debug_get()

The debugfs code is provided an array of a single drm_connector. Then to
access the connector, the list of all connectors of the DRM device is
traversed and all non-DisplayPort connectors are skipped, to find the
one and only DisplayPort connector.

But as we move to support multiple DisplayPort controllers this will now
find multiple connectors and has no way to distinguish them.

Pass the single connector to dp_debug_get() and use this in the debugfs
functions instead, both to simplify the code and the support the
multiple instances.

Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20211015232213.1839472-1-bjorn.andersson@linaro.org
Signed-off-by: Rob Clark <robdclark@chromium.org>

authored by

Bjorn Andersson and committed by
Rob Clark
899b2608 1c8e5748

+46 -89
+43 -86
drivers/gpu/drm/msm/dp/dp_debug.c
··· 24 24 struct dp_usbpd *usbpd; 25 25 struct dp_link *link; 26 26 struct dp_panel *panel; 27 - struct drm_connector **connector; 27 + struct drm_connector *connector; 28 28 struct device *dev; 29 29 struct drm_device *drm_dev; 30 30 ··· 205 205 206 206 static int dp_test_data_show(struct seq_file *m, void *data) 207 207 { 208 - struct drm_device *dev; 209 - struct dp_debug_private *debug; 210 - struct drm_connector *connector; 211 - struct drm_connector_list_iter conn_iter; 208 + const struct dp_debug_private *debug = m->private; 209 + const struct drm_connector *connector = debug->connector; 212 210 u32 bpc; 213 211 214 - debug = m->private; 215 - dev = debug->drm_dev; 216 - drm_connector_list_iter_begin(dev, &conn_iter); 217 - drm_for_each_connector_iter(connector, &conn_iter) { 218 - 219 - if (connector->connector_type != 220 - DRM_MODE_CONNECTOR_DisplayPort) 221 - continue; 222 - 223 - if (connector->status == connector_status_connected) { 224 - bpc = debug->link->test_video.test_bit_depth; 225 - seq_printf(m, "hdisplay: %d\n", 226 - debug->link->test_video.test_h_width); 227 - seq_printf(m, "vdisplay: %d\n", 228 - debug->link->test_video.test_v_height); 229 - seq_printf(m, "bpc: %u\n", 230 - dp_link_bit_depth_to_bpc(bpc)); 231 - } else 232 - seq_puts(m, "0"); 212 + if (connector->status == connector_status_connected) { 213 + bpc = debug->link->test_video.test_bit_depth; 214 + seq_printf(m, "hdisplay: %d\n", 215 + debug->link->test_video.test_h_width); 216 + seq_printf(m, "vdisplay: %d\n", 217 + debug->link->test_video.test_v_height); 218 + seq_printf(m, "bpc: %u\n", 219 + dp_link_bit_depth_to_bpc(bpc)); 220 + } else { 221 + seq_puts(m, "0"); 233 222 } 234 - 235 - drm_connector_list_iter_end(&conn_iter); 236 223 237 224 return 0; 238 225 } ··· 227 240 228 241 static int dp_test_type_show(struct seq_file *m, void *data) 229 242 { 230 - struct dp_debug_private *debug = m->private; 231 - struct drm_device *dev = debug->drm_dev; 232 - struct drm_connector *connector; 233 - struct drm_connector_list_iter conn_iter; 243 + const struct dp_debug_private *debug = m->private; 244 + const struct drm_connector *connector = debug->connector; 234 245 235 - drm_connector_list_iter_begin(dev, &conn_iter); 236 - drm_for_each_connector_iter(connector, &conn_iter) { 237 - 238 - if (connector->connector_type != 239 - DRM_MODE_CONNECTOR_DisplayPort) 240 - continue; 241 - 242 - if (connector->status == connector_status_connected) 243 - seq_printf(m, "%02x", DP_TEST_LINK_VIDEO_PATTERN); 244 - else 245 - seq_puts(m, "0"); 246 - } 247 - drm_connector_list_iter_end(&conn_iter); 246 + if (connector->status == connector_status_connected) 247 + seq_printf(m, "%02x", DP_TEST_LINK_VIDEO_PATTERN); 248 + else 249 + seq_puts(m, "0"); 248 250 249 251 return 0; 250 252 } ··· 245 269 { 246 270 char *input_buffer; 247 271 int status = 0; 248 - struct dp_debug_private *debug; 249 - struct drm_device *dev; 250 - struct drm_connector *connector; 251 - struct drm_connector_list_iter conn_iter; 272 + const struct dp_debug_private *debug; 273 + const struct drm_connector *connector; 252 274 int val = 0; 253 275 254 276 debug = ((struct seq_file *)file->private_data)->private; 255 - dev = debug->drm_dev; 277 + connector = debug->connector; 256 278 257 279 if (len == 0) 258 280 return 0; ··· 261 287 262 288 DRM_DEBUG_DRIVER("Copied %d bytes from user\n", (unsigned int)len); 263 289 264 - drm_connector_list_iter_begin(dev, &conn_iter); 265 - drm_for_each_connector_iter(connector, &conn_iter) { 266 - if (connector->connector_type != 267 - DRM_MODE_CONNECTOR_DisplayPort) 268 - continue; 269 - 270 - if (connector->status == connector_status_connected) { 271 - status = kstrtoint(input_buffer, 10, &val); 272 - if (status < 0) 273 - break; 274 - DRM_DEBUG_DRIVER("Got %d for test active\n", val); 275 - /* To prevent erroneous activation of the compliance 276 - * testing code, only accept an actual value of 1 here 277 - */ 278 - if (val == 1) 279 - debug->panel->video_test = true; 280 - else 281 - debug->panel->video_test = false; 290 + if (connector->status == connector_status_connected) { 291 + status = kstrtoint(input_buffer, 10, &val); 292 + if (status < 0) { 293 + kfree(input_buffer); 294 + return status; 282 295 } 296 + DRM_DEBUG_DRIVER("Got %d for test active\n", val); 297 + /* To prevent erroneous activation of the compliance 298 + * testing code, only accept an actual value of 1 here 299 + */ 300 + if (val == 1) 301 + debug->panel->video_test = true; 302 + else 303 + debug->panel->video_test = false; 283 304 } 284 - drm_connector_list_iter_end(&conn_iter); 285 305 kfree(input_buffer); 286 - if (status < 0) 287 - return status; 288 306 289 307 *offp += len; 290 308 return len; ··· 285 319 static int dp_test_active_show(struct seq_file *m, void *data) 286 320 { 287 321 struct dp_debug_private *debug = m->private; 288 - struct drm_device *dev = debug->drm_dev; 289 - struct drm_connector *connector; 290 - struct drm_connector_list_iter conn_iter; 322 + struct drm_connector *connector = debug->connector; 291 323 292 - drm_connector_list_iter_begin(dev, &conn_iter); 293 - drm_for_each_connector_iter(connector, &conn_iter) { 294 - if (connector->connector_type != 295 - DRM_MODE_CONNECTOR_DisplayPort) 296 - continue; 297 - 298 - if (connector->status == connector_status_connected) { 299 - if (debug->panel->video_test) 300 - seq_puts(m, "1"); 301 - else 302 - seq_puts(m, "0"); 303 - } else 324 + if (connector->status == connector_status_connected) { 325 + if (debug->panel->video_test) 326 + seq_puts(m, "1"); 327 + else 304 328 seq_puts(m, "0"); 329 + } else { 330 + seq_puts(m, "0"); 305 331 } 306 - drm_connector_list_iter_end(&conn_iter); 307 332 308 333 return 0; 309 334 } ··· 348 391 349 392 struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel, 350 393 struct dp_usbpd *usbpd, struct dp_link *link, 351 - struct drm_connector **connector, struct drm_minor *minor) 394 + struct drm_connector *connector, struct drm_minor *minor) 352 395 { 353 396 int rc = 0; 354 397 struct dp_debug_private *debug;
+2 -2
drivers/gpu/drm/msm/dp/dp_debug.h
··· 43 43 */ 44 44 struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel, 45 45 struct dp_usbpd *usbpd, struct dp_link *link, 46 - struct drm_connector **connector, 46 + struct drm_connector *connector, 47 47 struct drm_minor *minor); 48 48 49 49 /** ··· 60 60 static inline 61 61 struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel, 62 62 struct dp_usbpd *usbpd, struct dp_link *link, 63 - struct drm_connector **connector, struct drm_minor *minor) 63 + struct drm_connector *connector, struct drm_minor *minor) 64 64 { 65 65 return ERR_PTR(-EINVAL); 66 66 }
+1 -1
drivers/gpu/drm/msm/dp/dp_display.c
··· 1429 1429 dev = &dp->pdev->dev; 1430 1430 1431 1431 dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd, 1432 - dp->link, &dp->dp_display.connector, 1432 + dp->link, dp->dp_display.connector, 1433 1433 minor); 1434 1434 if (IS_ERR(dp->debug)) { 1435 1435 rc = PTR_ERR(dp->debug);