Commit 14b7897d authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/client: switch to drm device based logging, and more



Switch to drm device based logging and WARNs, and unify connector and
crtc logging formats. Pass drm device around a bit more to be able to do
this. Drop logging for -ENOMEM.

Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/4fb77e6039bcda7448d1187bc5cd7a5ac4d393aa.1712568037.git.jani.nikula@intel.com


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 6b2a8a05
Loading
Loading
Loading
Loading
+70 −59
Original line number Diff line number Diff line
@@ -242,8 +242,10 @@ static void drm_client_connectors_enabled(struct drm_connector **connectors,
	for (i = 0; i < connector_count; i++) {
		connector = connectors[i];
		enabled[i] = drm_connector_enabled(connector, true);
		DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id,
			      connector->display_info.non_desktop ? "non desktop" : str_yes_no(enabled[i]));
		drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] enabled? %s\n",
			    connector->base.id, connector->name,
			    connector->display_info.non_desktop ?
			    "non desktop" : str_yes_no(enabled[i]));

		any_enabled |= enabled[i];
	}
@@ -303,7 +305,7 @@ static bool drm_client_target_cloned(struct drm_device *dev,
	}

	if (can_clone) {
		DRM_DEBUG_KMS("can clone using command line\n");
		drm_dbg_kms(dev, "can clone using command line\n");
		return true;
	}

@@ -332,15 +334,16 @@ static bool drm_client_target_cloned(struct drm_device *dev,
	kfree(dmt_mode);

	if (can_clone) {
		DRM_DEBUG_KMS("can clone using 1024x768\n");
		drm_dbg_kms(dev, "can clone using 1024x768\n");
		return true;
	}
fail:
	DRM_INFO("kms: can't enable cloning when we probably wanted to.\n");
	drm_info(dev, "kms: can't enable cloning when we probably wanted to.\n");
	return false;
}

static int drm_client_get_tile_offsets(struct drm_connector **connectors,
static int drm_client_get_tile_offsets(struct drm_device *dev,
				       struct drm_connector **connectors,
				       unsigned int connector_count,
				       struct drm_display_mode **modes,
				       struct drm_client_offset *offsets,
@@ -357,8 +360,9 @@ static int drm_client_get_tile_offsets(struct drm_connector **connectors,
			continue;

		if (!modes[i] && (h_idx || v_idx)) {
			DRM_DEBUG_KMS("no modes for connector tiled %d %d\n", i,
				      connector->base.id);
			drm_dbg_kms(dev,
				    "[CONNECTOR:%d:%s] no modes for connector tiled %d\n",
				    connector->base.id, connector->name, i);
			continue;
		}
		if (connector->tile_h_loc < h_idx)
@@ -369,11 +373,12 @@ static int drm_client_get_tile_offsets(struct drm_connector **connectors,
	}
	offsets[idx].x = hoffset;
	offsets[idx].y = voffset;
	DRM_DEBUG_KMS("returned %d %d for %d %d\n", hoffset, voffset, h_idx, v_idx);
	drm_dbg_kms(dev, "returned %d %d for %d %d\n", hoffset, voffset, h_idx, v_idx);
	return 0;
}

static bool drm_client_target_preferred(struct drm_connector **connectors,
static bool drm_client_target_preferred(struct drm_device *dev,
					struct drm_connector **connectors,
					unsigned int connector_count,
					struct drm_display_mode **modes,
					struct drm_client_offset *offsets,
@@ -423,17 +428,19 @@ static bool drm_client_target_preferred(struct drm_connector **connectors,
			 * find the tile offsets for this pass - need to find
			 * all tiles left and above
			 */
			drm_client_get_tile_offsets(connectors, connector_count, modes, offsets, i,
			drm_client_get_tile_offsets(dev, connectors, connector_count,
						    modes, offsets, i,
						    connector->tile_h_loc, connector->tile_v_loc);
		}
		DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n",
			      connector->base.id);
		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] looking for cmdline mode\n",
			    connector->base.id, connector->name);

		/* got for command line mode first */
		modes[i] = drm_connector_pick_cmdline_mode(connector);
		if (!modes[i]) {
			DRM_DEBUG_KMS("looking for preferred mode on connector %d %d\n",
				      connector->base.id, connector->tile_group ? connector->tile_group->id : 0);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] looking for preferred mode, tile %d\n",
				    connector->base.id, connector->name,
				    connector->tile_group ? connector->tile_group->id : 0);
			modes[i] = drm_connector_has_preferred_mode(connector, width, height);
		}
		/* No preferred modes, pick one off the list */
@@ -455,16 +462,18 @@ static bool drm_client_target_preferred(struct drm_connector **connectors,
			    (connector->tile_h_loc == 0 &&
			     connector->tile_v_loc == 0 &&
			     !drm_connector_get_tiled_mode(connector))) {
				DRM_DEBUG_KMS("Falling back to non tiled mode on Connector %d\n",
					      connector->base.id);
				drm_dbg_kms(dev,
					    "[CONNECTOR:%d:%s] Falling back to non-tiled mode\n",
					    connector->base.id, connector->name);
				modes[i] = drm_connector_fallback_non_tiled_mode(connector);
			} else {
				modes[i] = drm_connector_get_tiled_mode(connector);
			}
		}

		DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name :
			  "none");
		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Found mode %s\n",
			    connector->base.id, connector->name,
			    modes[i] ? modes[i]->name : "none");
		conn_configured |= BIT_ULL(i);
	}

@@ -585,7 +594,7 @@ static bool drm_client_firmware_config(struct drm_client_dev *client,
	if (!drm_drv_uses_atomic_modeset(dev))
		return false;

	if (WARN_ON(count <= 0))
	if (drm_WARN_ON(dev, count <= 0))
		return false;

	save_enabled = kcalloc(count, sizeof(bool), GFP_KERNEL);
@@ -624,26 +633,26 @@ static bool drm_client_firmware_config(struct drm_client_dev *client,
			num_connectors_detected++;

		if (!enabled[i]) {
			DRM_DEBUG_KMS("connector %s not enabled, skipping\n",
				      connector->name);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] not enabled, skipping\n",
				    connector->base.id, connector->name);
			conn_configured |= BIT(i);
			continue;
		}

		if (connector->force == DRM_FORCE_OFF) {
			DRM_DEBUG_KMS("connector %s is disabled by user, skipping\n",
				      connector->name);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] disabled by user, skipping\n",
				    connector->base.id, connector->name);
			enabled[i] = false;
			continue;
		}

		encoder = connector->state->best_encoder;
		if (!encoder || WARN_ON(!connector->state->crtc)) {
		if (!encoder || drm_WARN_ON(dev, !connector->state->crtc)) {
			if (connector->force > DRM_FORCE_OFF)
				goto bail;

			DRM_DEBUG_KMS("connector %s has no encoder or crtc, skipping\n",
				      connector->name);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] has no encoder or crtc, skipping\n",
				    connector->base.id, connector->name);
			enabled[i] = false;
			conn_configured |= BIT(i);
			continue;
@@ -660,28 +669,30 @@ static bool drm_client_firmware_config(struct drm_client_dev *client,
		 */
		for (j = 0; j < count; j++) {
			if (crtcs[j] == new_crtc) {
				DRM_DEBUG_KMS("fallback: cloned configuration\n");
				drm_dbg_kms(dev, "fallback: cloned configuration\n");
				goto bail;
			}
		}

		DRM_DEBUG_KMS("looking for cmdline mode on connector %s\n",
			      connector->name);
		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] looking for cmdline mode\n",
			    connector->base.id, connector->name);

		/* go for command line mode first */
		modes[i] = drm_connector_pick_cmdline_mode(connector);

		/* try for preferred next */
		if (!modes[i]) {
			DRM_DEBUG_KMS("looking for preferred mode on connector %s %d\n",
				      connector->name, connector->has_tile);
			drm_dbg_kms(dev,
				    "[CONNECTOR:%d:%s] looking for preferred mode, has tile: %s\n",
				    connector->base.id, connector->name,
				    str_yes_no(connector->has_tile));
			modes[i] = drm_connector_has_preferred_mode(connector, width, height);
		}

		/* No preferred mode marked by the EDID? Are there any modes? */
		if (!modes[i] && !list_empty(&connector->modes)) {
			DRM_DEBUG_KMS("using first mode listed on connector %s\n",
				      connector->name);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] using first listed mode\n",
				    connector->base.id, connector->name);
			modes[i] = list_first_entry(&connector->modes,
						    struct drm_display_mode,
						    head);
@@ -700,8 +711,8 @@ static bool drm_client_firmware_config(struct drm_client_dev *client,
			 * This is crtc->mode and not crtc->state->mode for the
			 * fastboot check to work correctly.
			 */
			DRM_DEBUG_KMS("looking for current mode on connector %s\n",
				      connector->name);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] looking for current mode\n",
				    connector->base.id, connector->name);
			modes[i] = &connector->state->crtc->mode;
		}
		/*
@@ -710,14 +721,14 @@ static bool drm_client_firmware_config(struct drm_client_dev *client,
		 */
		if (connector->has_tile &&
		    num_tiled_conns < connector->num_h_tile * connector->num_v_tile) {
			DRM_DEBUG_KMS("Falling back to non tiled mode on Connector %d\n",
				      connector->base.id);
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Falling back to non-tiled mode\n",
				    connector->base.id, connector->name);
			modes[i] = drm_connector_fallback_non_tiled_mode(connector);
		}
		crtcs[i] = new_crtc;

		DRM_DEBUG_KMS("connector %s on [CRTC:%d:%s]: %dx%d%s\n",
			      connector->name,
		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] on [CRTC:%d:%s]: %dx%d%s\n",
			    connector->base.id, connector->name,
			    connector->state->crtc->base.id,
			    connector->state->crtc->name,
			    modes[i]->hdisplay, modes[i]->vdisplay,
@@ -737,15 +748,15 @@ static bool drm_client_firmware_config(struct drm_client_dev *client,
	 */
	if (num_connectors_enabled != num_connectors_detected &&
	    num_connectors_enabled < dev->mode_config.num_crtc) {
		DRM_DEBUG_KMS("fallback: Not all outputs enabled\n");
		DRM_DEBUG_KMS("Enabled: %i, detected: %i\n", num_connectors_enabled,
			      num_connectors_detected);
		drm_dbg_kms(dev, "fallback: Not all outputs enabled\n");
		drm_dbg_kms(dev, "Enabled: %i, detected: %i\n",
			    num_connectors_enabled, num_connectors_detected);
		fallback = true;
	}

	if (fallback) {
bail:
		DRM_DEBUG_KMS("Not using firmware configuration\n");
		drm_dbg_kms(dev, "Not using firmware configuration\n");
		memcpy(enabled, save_enabled, count);
		ret = false;
	}
@@ -782,7 +793,7 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,
	int i, ret = 0;
	bool *enabled;

	DRM_DEBUG_KMS("\n");
	drm_dbg_kms(dev, "\n");

	if (!width)
		width = dev->mode_config.max_width;
@@ -813,7 +824,6 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,
	offsets = kcalloc(connector_count, sizeof(*offsets), GFP_KERNEL);
	enabled = kcalloc(connector_count, sizeof(bool), GFP_KERNEL);
	if (!crtcs || !modes || !enabled || !offsets) {
		DRM_ERROR("Memory allocation failed\n");
		ret = -ENOMEM;
		goto out;
	}
@@ -824,7 +834,7 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,
	for (i = 0; i < connector_count; i++)
		total_modes_count += connectors[i]->funcs->fill_modes(connectors[i], width, height);
	if (!total_modes_count)
		DRM_DEBUG_KMS("No connectors reported connected with modes\n");
		drm_dbg_kms(dev, "No connectors reported connected with modes\n");
	drm_client_connectors_enabled(connectors, connector_count, enabled);

	if (!drm_client_firmware_config(client, connectors, connector_count, crtcs,
@@ -835,11 +845,11 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,

		if (!drm_client_target_cloned(dev, connectors, connector_count, modes,
					      offsets, enabled, width, height) &&
		    !drm_client_target_preferred(connectors, connector_count, modes,
		    !drm_client_target_preferred(dev, connectors, connector_count, modes,
						 offsets, enabled, width, height))
			DRM_ERROR("Unable to find initial modes\n");
			drm_err(dev, "Unable to find initial modes\n");

		DRM_DEBUG_KMS("picking CRTCs for %dx%d config\n",
		drm_dbg_kms(dev, "picking CRTCs for %dx%d config\n",
			    width, height);

		drm_client_pick_crtcs(client, connectors, connector_count,
@@ -858,10 +868,11 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,
			struct drm_mode_set *modeset = drm_client_find_modeset(client, crtc);
			struct drm_connector *connector = connectors[i];

			DRM_DEBUG_KMS("desired mode %s set on crtc %d (%d,%d)\n",
				      mode->name, crtc->base.id, offset->x, offset->y);
			drm_dbg_kms(dev, "[CRTC:%d:%s] desired mode %s set (%d,%d)\n",
				    crtc->base.id, crtc->name,
				    mode->name, offset->x, offset->y);

			if (WARN_ON_ONCE(modeset->num_connectors == DRM_CLIENT_MAX_CLONED_CONNECTORS ||
			if (drm_WARN_ON_ONCE(dev, modeset->num_connectors == DRM_CLIENT_MAX_CLONED_CONNECTORS ||
					     (dev->mode_config.num_crtc > 1 && modeset->num_connectors == 1))) {
				ret = -EINVAL;
				break;