All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sam Ravnborg <sam@ravnborg.org>
To: "Noralf Trønnes" <noralf@tronnes.org>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v5 05/11] drm/fb-helper: Remove drm_fb_helper_crtc
Date: Wed, 15 May 2019 11:04:32 +0200	[thread overview]
Message-ID: <20190515090432.GA31712@ravnborg.org> (raw)
In-Reply-To: <20190506180139.6913-6-noralf@tronnes.org>

Hi Noralf.

I have read through the cahnes a copuple of times not and feel confident
to add my r-b if the comments are considered.

On Mon, May 06, 2019 at 08:01:33PM +0200, Noralf Trønnes wrote:
> It now only contains the modeset so use that directly instead and attach
> a modeset array to drm_client_dev. drm_fb_helper will use this array.
> Code will later be moved to drm_client, so add code there in a new file
> drm_client_modeset.c with MIT license to match drm_fb_helper.c.

The first part of this commit log could use some re-pharsing.
What is "It" etc.

> @@ -92,14 +91,20 @@ int drm_client_init(struct drm_device *dev, struct drm_client_dev *client,
>  	client->name = name;
>  	client->funcs = funcs;
>  
> -	ret = drm_client_open(client);
> +	ret = drm_client_modeset_create(client);
>  	if (ret)
>  		goto err_put_module;
>  
> +	ret = drm_client_open(client);
> +	if (ret)
> +		goto err_free;
> +
>  	drm_dev_get(dev);
>  
>  	return 0;
>  
> +err_free:
> +	drm_client_modeset_free(client);
>  err_put_module:
>  	if (funcs)
>  		module_put(funcs->owner);
> @@ -148,6 +153,7 @@ void drm_client_release(struct drm_client_dev *client)
>  
>  	DRM_DEV_DEBUG_KMS(dev->dev, "%s\n", client->name);
>  
> +	drm_client_modeset_free(client);
>  	drm_client_close(client);
>  	drm_dev_put(dev);

If the order should be the opposite of init then call drm_client_close() before
drm_client_modeset_free()

>  	if (client->funcs)

> +	drm_client_for_each_modeset(mode_set, client) {
>  		struct drm_plane *primary = mode_set->crtc->primary;
>  		unsigned int rotation;
>  
> @@ -517,9 +518,11 @@ static int restore_fbdev_mode_atomic(struct drm_fb_helper *fb_helper, bool activ
>  
>  static int restore_fbdev_mode_legacy(struct drm_fb_helper *fb_helper)
>  {
> +	struct drm_client_dev *client = &fb_helper->client;
>  	struct drm_device *dev = fb_helper->dev;
> +	struct drm_mode_set *mode_set;
>  	struct drm_plane *plane;
> -	int i, ret = 0;
> +	int ret = 0;
>  
>  	drm_modeset_lock_all(fb_helper->dev);
>  	drm_for_each_plane(plane, dev) {
> @@ -532,8 +535,7 @@ static int restore_fbdev_mode_legacy(struct drm_fb_helper *fb_helper)
>  						    DRM_MODE_ROTATE_0);
>  	}
>  
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
> +	drm_client_for_each_modeset(mode_set, client) {
>  		struct drm_crtc *crtc = mode_set->crtc;
>  
>  		if (crtc->funcs->cursor_set2) {
This function requires modeset_mutex to be held. Maybe add comment?

> @@ -682,15 +689,14 @@ static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { };
>  
>  static void dpms_legacy(struct drm_fb_helper *fb_helper, int dpms_mode)
>  {
> +	struct drm_client_dev *client = &fb_helper->client;
>  	struct drm_device *dev = fb_helper->dev;
>  	struct drm_connector *connector;
>  	struct drm_mode_set *modeset;
> -	int i, j;
> +	int j;
>  
>  	drm_modeset_lock_all(dev);
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		modeset = &fb_helper->crtc_info[i].mode_set;
> -
> +	drm_client_for_each_modeset(modeset, client) {
>  		if (!modeset->crtc->enabled)
>  			continue;
>
This function needs modeset_mutex - maybe add comment?

> @@ -1390,13 +1353,14 @@ static int setcmap_pseudo_palette(struct fb_cmap *cmap, struct fb_info *info)
>  static int setcmap_legacy(struct fb_cmap *cmap, struct fb_info *info)
>  {
>  	struct drm_fb_helper *fb_helper = info->par;
> +	struct drm_mode_set *modeset;
>  	struct drm_crtc *crtc;
>  	u16 *r, *g, *b;
> -	int i, ret = 0;
> +	int ret = 0;
>  
>  	drm_modeset_lock_all(fb_helper->dev);
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		crtc = fb_helper->crtc_info[i].mode_set.crtc;
> +	drm_client_for_each_modeset(modeset, &fb_helper->client) {
> +		crtc = modeset->crtc;
>  		if (!crtc->funcs->gamma_set || !crtc->gamma_size)
>  			return -EINVAL;
>  
This function needs modeset_mutex - maybe add comment?

> @@ -1472,10 +1436,11 @@ static int setcmap_atomic(struct fb_cmap *cmap, struct fb_info *info)
>  	struct drm_modeset_acquire_ctx ctx;
>  	struct drm_crtc_state *crtc_state;
>  	struct drm_atomic_state *state;
> +	struct drm_mode_set *modeset;
>  	struct drm_crtc *crtc;
>  	u16 *r, *g, *b;
> -	int i, ret = 0;
>  	bool replaced;
> +	int ret = 0;
>  
>  	drm_modeset_acquire_init(&ctx, 0);
>  
> @@ -1487,8 +1452,8 @@ static int setcmap_atomic(struct fb_cmap *cmap, struct fb_info *info)
>  
>  	state->acquire_ctx = &ctx;
>  retry:
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		crtc = fb_helper->crtc_info[i].mode_set.crtc;
> +	drm_client_for_each_modeset(modeset, &fb_helper->client) {
> +		crtc = modeset->crtc;
>  
>  		if (!gamma_lut)
>  			gamma_lut = setcmap_new_gamma_lut(crtc, cmap);
> @@ -1516,8 +1481,8 @@ static int setcmap_atomic(struct fb_cmap *cmap, struct fb_info *info)
>  	if (ret)
>  		goto out_state;
>  
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		crtc = fb_helper->crtc_info[i].mode_set.crtc;
> +	drm_client_for_each_modeset(modeset, &fb_helper->client) {
> +		crtc = modeset->crtc;
>  
>  		r = crtc->gamma_store;
>  		g = r + crtc->gamma_size;
This function needs modeset_mutex - maybe add comment?

> @@ -1567,12 +1532,14 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
>  		goto unlock;
>  	}
>  
> +	mutex_lock(&fb_helper->client.modeset_mutex);
>  	if (info->fix.visual == FB_VISUAL_TRUECOLOR)
>  		ret = setcmap_pseudo_palette(cmap, info);
>  	else if (drm_drv_uses_atomic_modeset(fb_helper->dev))
>  		ret = setcmap_atomic(cmap, info);
>  	else
>  		ret = setcmap_legacy(cmap, info);
> +	mutex_unlock(&fb_helper->client.modeset_mutex);
>  
>  	drm_master_internal_release(dev);
>  unlock:
> @@ -1596,7 +1563,6 @@ int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
>  {
>  	struct drm_fb_helper *fb_helper = info->par;
>  	struct drm_device *dev = fb_helper->dev;
> -	struct drm_mode_set *mode_set;
>  	struct drm_crtc *crtc;
>  	int ret = 0;
>  
> @@ -1624,8 +1590,7 @@ int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
>  		 * make. If we're not smart enough here, one should
>  		 * just consider switch the userspace to KMS.
>  		 */
> -		mode_set = &fb_helper->crtc_info[0].mode_set;
> -		crtc = mode_set->crtc;
> +		crtc = fb_helper->client.modesets[0].crtc;
>  
>  		/*
>  		 * Only wait for a vblank event if the CRTC is
> @@ -1822,16 +1787,14 @@ EXPORT_SYMBOL(drm_fb_helper_set_par);
>  
>  static void pan_set(struct drm_fb_helper *fb_helper, int x, int y)
>  {
> -	int i;
> -
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		struct drm_mode_set *mode_set;
> -
> -		mode_set = &fb_helper->crtc_info[i].mode_set;
> +	struct drm_mode_set *mode_set;
>  
> +	mutex_lock(&fb_helper->client.modeset_mutex);
> +	drm_client_for_each_modeset(mode_set, &fb_helper->client) {
>  		mode_set->x = x;
>  		mode_set->y = y;
>  	}
> +	mutex_unlock(&fb_helper->client.modeset_mutex);
>  }
>  
>  static int pan_display_atomic(struct fb_var_screeninfo *var,
> @@ -1842,7 +1805,7 @@ static int pan_display_atomic(struct fb_var_screeninfo *var,
>  
>  	pan_set(fb_helper, var->xoffset, var->yoffset);
>  
> -	ret = restore_fbdev_mode_atomic(fb_helper, true);
> +	ret = restore_fbdev_mode_force(fb_helper);
This change looks alien compared to other changes.
Does it belong to this patchset?

>  	if (!ret) {
>  		info->var.xoffset = var->xoffset;
>  		info->var.yoffset = var->yoffset;
> @@ -1856,14 +1819,13 @@ static int pan_display_legacy(struct fb_var_screeninfo *var,
>  			      struct fb_info *info)
>  {
>  	struct drm_fb_helper *fb_helper = info->par;
> +	struct drm_client_dev *client = &fb_helper->client;
>  	struct drm_mode_set *modeset;
>  	int ret = 0;
> -	int i;
>  
>  	drm_modeset_lock_all(fb_helper->dev);
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		modeset = &fb_helper->crtc_info[i].mode_set;
> -
> +	mutex_lock(&client->modeset_mutex);
> +	drm_client_for_each_modeset(modeset, client) {
>  		modeset->x = var->xoffset;
>  		modeset->y = var->yoffset;
>  
> @@ -1875,6 +1837,7 @@ static int pan_display_legacy(struct fb_var_screeninfo *var,
>  			}
>  		}
>  	}
> +	mutex_unlock(&client->modeset_mutex);
>  	drm_modeset_unlock_all(fb_helper->dev);
>  
>  	return ret;
> @@ -1921,10 +1884,12 @@ EXPORT_SYMBOL(drm_fb_helper_pan_display);
>  static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
>  					 int preferred_bpp)
>  {
> +	struct drm_client_dev *client = &fb_helper->client;
>  	int ret = 0;
>  	int crtc_count = 0;
>  	int i;
>  	struct drm_fb_helper_surface_size sizes;
> +	struct drm_mode_set *mode_set;
>  	int best_depth = 0;
>  
>  	memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size));
> @@ -1975,13 +1940,13 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
>  	 * supports RGBA5551 (16 bpp, depth 15) but not RGB565 (16 bpp, depth
>  	 * 16) we need to scale down the depth of the sizes we request.
>  	 */
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
> +	mutex_lock(&client->modeset_mutex);
> +	drm_client_for_each_modeset(mode_set, client) {
>  		struct drm_crtc *crtc = mode_set->crtc;
>  		struct drm_plane *plane = crtc->primary;
>  		int j;
>  
> -		DRM_DEBUG("test CRTC %d primary plane\n", i);
> +		DRM_DEBUG("test CRTC %u primary plane\n", drm_crtc_index(crtc));
>  
>  		for (j = 0; j < plane->format_count; j++) {
>  			const struct drm_format_info *fmt;
> @@ -2021,9 +1986,8 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
>  
>  	/* first up get a count of crtcs now in use and new min/maxes width/heights */
>  	crtc_count = 0;
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> +	drm_client_for_each_modeset(mode_set, client) {
>  		struct drm_display_mode *desired_mode;
> -		struct drm_mode_set *mode_set;
>  		int x, y, j;
>  		/* in case of tile group, are we the last tile vert or horiz?
>  		 * If no tile group you are always the last one both vertically
> @@ -2031,7 +1995,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
>  		 */
>  		bool lastv = true, lasth = true;
>  
> -		mode_set = &fb_helper->crtc_info[i].mode_set;
>  		desired_mode = mode_set->mode;
>  
>  		if (!desired_mode)
> @@ -2061,6 +2024,7 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
>  		if (lastv)
>  			sizes.fb_height = min_t(u32, desired_mode->vdisplay + y, sizes.fb_height);
>  	}
> +	mutex_unlock(&client->modeset_mutex);
>  
>  	if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) {
>  		DRM_INFO("Cannot find any crtc or sizes\n");
> @@ -2292,7 +2256,7 @@ static bool drm_target_cloned(struct drm_fb_helper *fb_helper,
>  	struct drm_display_mode *dmt_mode, *mode;
>  
>  	/* only contemplate cloning in the single crtc case */
> -	if (fb_helper->crtc_count > 1)
> +	if (fb_helper->dev->mode_config.num_crtc > 1)
>  		return false;
>  
>  	count = 0;
> @@ -2481,15 +2445,17 @@ static bool connector_has_possible_crtc(struct drm_connector *connector,
>  }
>  
>  static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
> -			  struct drm_fb_helper_crtc **best_crtcs,
> +			  struct drm_crtc **best_crtcs,
>  			  struct drm_display_mode **modes,
>  			  int n, int width, int height)
>  {
> -	int c, o;
> +	struct drm_client_dev *client = &fb_helper->client;
>  	struct drm_connector *connector;
>  	int my_score, best_score, score;
> -	struct drm_fb_helper_crtc **crtcs, *crtc;
> +	struct drm_crtc **crtcs, *crtc;
> +	struct drm_mode_set *modeset;
>  	struct drm_fb_helper_connector *fb_helper_conn;
> +	int o;
>  
>  	if (n == fb_helper->connector_count)
>  		return 0;

drm_pick_crtcs() needs the modeset mutex.
And due considering the complexity of the function it would be nice
to have this fact documented.

> @@ -2502,8 +2468,7 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
>  	if (modes[n] == NULL)
>  		return best_score;
>  
> -	crtcs = kcalloc(fb_helper->connector_count,
> -			sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
> +	crtcs = kcalloc(fb_helper->connector_count, sizeof(*crtcs), GFP_KERNEL);
>  	if (!crtcs)
>  		return best_score;
>  
> @@ -2519,11 +2484,10 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
>  	 * select a crtc for this connector and then attempt to configure
>  	 * remaining connectors
>  	 */
> -	for (c = 0; c < fb_helper->crtc_count; c++) {
> -		crtc = &fb_helper->crtc_info[c];
> +	drm_client_for_each_modeset(modeset, client) {
> +		crtc = modeset->crtc;
>  
> -		if (!connector_has_possible_crtc(connector,
> -						 crtc->mode_set.crtc))
> +		if (!connector_has_possible_crtc(connector, crtc))
>  			continue;
>  
>  		for (o = 0; o < n; o++)
> @@ -2532,7 +2496,7 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
>  
>  		if (o < n) {
>  			/* ignore cloning unless only a single crtc */
> -			if (fb_helper->crtc_count > 1)
> +			if (fb_helper->dev->mode_config.num_crtc > 1)
>  				continue;
>  
>  			if (!drm_mode_equal(modes[o], modes[n]))
> @@ -2540,14 +2504,13 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
>  		}
>  
>  		crtcs[n] = crtc;
> -		memcpy(crtcs, best_crtcs, n * sizeof(struct drm_fb_helper_crtc *));
> +		memcpy(crtcs, best_crtcs, n * sizeof(*crtcs));
>  		score = my_score + drm_pick_crtcs(fb_helper, crtcs, modes, n + 1,
>  						  width, height);
>  		if (score > best_score) {
>  			best_score = score;
>  			memcpy(best_crtcs, crtcs,
> -			       fb_helper->connector_count *
> -			       sizeof(struct drm_fb_helper_crtc *));
> +			       fb_helper->connector_count * sizeof(*crtcs));
>  		}
>  	}
>  
> @@ -2555,21 +2518,9 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
>  	return best_score;
>  }
>  
> -static struct drm_fb_helper_crtc *
> -drm_fb_helper_crtc(struct drm_fb_helper *fb_helper, struct drm_crtc *crtc)
> -{
> -	int i;
> -
> -	for (i = 0; i < fb_helper->crtc_count; i++)
> -		if (fb_helper->crtc_info[i].mode_set.crtc == crtc)
> -			return &fb_helper->crtc_info[i];
> -
> -	return NULL;
> -}
> -
>  /* Try to read the BIOS display configuration and use it for the initial config */
>  static bool drm_fb_helper_firmware_config(struct drm_fb_helper *fb_helper,
> -					  struct drm_fb_helper_crtc **crtcs,
> +					  struct drm_crtc **crtcs,
>  					  struct drm_display_mode **modes,
>  					  struct drm_fb_offset *offsets,
>  					  bool *enabled, int width, int height)
> @@ -2605,7 +2556,7 @@ static bool drm_fb_helper_firmware_config(struct drm_fb_helper *fb_helper,
>  		struct drm_fb_helper_connector *fb_conn;
>  		struct drm_connector *connector;
>  		struct drm_encoder *encoder;
> -		struct drm_fb_helper_crtc *new_crtc;
> +		struct drm_crtc *new_crtc;
>  
>  		fb_conn = fb_helper->connector_info[i];
>  		connector = fb_conn->connector;
> @@ -2647,7 +2598,7 @@ static bool drm_fb_helper_firmware_config(struct drm_fb_helper *fb_helper,
>  
>  		num_connectors_enabled++;
>  
> -		new_crtc = drm_fb_helper_crtc(fb_helper, connector->state->crtc);
> +		new_crtc = connector->state->crtc;
>  
>  		/*
>  		 * Make sure we're not trying to drive multiple connectors
> @@ -2747,10 +2698,11 @@ static bool drm_fb_helper_firmware_config(struct drm_fb_helper *fb_helper,
>  static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
>  			    u32 width, u32 height)
>  {
> +	struct drm_client_dev *client = &fb_helper->client;
>  	struct drm_device *dev = fb_helper->dev;
> -	struct drm_fb_helper_crtc **crtcs;
>  	struct drm_display_mode **modes;
>  	struct drm_fb_offset *offsets;
> +	struct drm_crtc **crtcs;
>  	bool *enabled;
>  	int i;
>  
> @@ -2758,8 +2710,7 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
>  	/* prevent concurrent modification of connector_count by hotplug */
>  	lockdep_assert_held(&fb_helper->lock);
>  
> -	crtcs = kcalloc(fb_helper->connector_count,
> -			sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
> +	crtcs = kcalloc(fb_helper->connector_count, sizeof(*crtcs), GFP_KERNEL);
>  	modes = kcalloc(fb_helper->connector_count,
>  			sizeof(struct drm_display_mode *), GFP_KERNEL);
>  	offsets = kcalloc(fb_helper->connector_count,
> @@ -2771,6 +2722,8 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
>  		goto out;
>  	}
>  
> +	mutex_lock(&client->modeset_mutex);
> +
>  	mutex_lock(&fb_helper->dev->mode_config.mutex);
>  	if (drm_fb_helper_probe_connector_modes(fb_helper, width, height) == 0)
>  		DRM_DEBUG_KMS("No connectors reported connected with modes\n");
> @@ -2795,24 +2748,24 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
>  	}
>  	mutex_unlock(&fb_helper->dev->mode_config.mutex);
>  
> -	/* need to set the modesets up here for use later */
> -	/* fill out the connector<->crtc mappings into the modesets */
> -	for (i = 0; i < fb_helper->crtc_count; i++)
> -		drm_fb_helper_modeset_release(fb_helper,
> -					      &fb_helper->crtc_info[i].mode_set);
> +	drm_client_modeset_release(client);
>  
>  	drm_fb_helper_for_each_connector(fb_helper, i) {
>  		struct drm_display_mode *mode = modes[i];
> -		struct drm_fb_helper_crtc *fb_crtc = crtcs[i];
> +		struct drm_crtc *crtc = crtcs[i];
>  		struct drm_fb_offset *offset = &offsets[i];
>  
> -		if (mode && fb_crtc) {
> -			struct drm_mode_set *modeset = &fb_crtc->mode_set;
> +		if (mode && crtc) {
> +			struct drm_mode_set *modeset = drm_client_find_modeset(client, crtc);
>  			struct drm_connector *connector =
>  				fb_helper->connector_info[i]->connector;
>  
>  			DRM_DEBUG_KMS("desired mode %s set on crtc %d (%d,%d)\n",
> -				      mode->name, fb_crtc->mode_set.crtc->base.id, offset->x, offset->y);
> +				      mode->name, crtc->base.id, offset->x, offset->y);
> +
> +			if (WARN_ON_ONCE(modeset->num_connectors == DRM_CLIENT_MAX_CLONED_CONNECTORS ||
> +					 (dev->mode_config.num_crtc > 1 && modeset->num_connectors == 1)))
> +				break;
>  
>  			modeset->mode = drm_mode_duplicate(dev, mode);
>  			drm_connector_get(connector);
> @@ -2821,6 +2774,8 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
>  			modeset->y = offset->y;
>  		}
>  	}
> +
> +	mutex_unlock(&client->modeset_mutex);
>  out:
>  	kfree(crtcs);
>  	kfree(modes);
> @@ -2837,13 +2792,14 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
>   */
>  static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper)
>  {
> +	struct drm_client_dev *client = &fb_helper->client;
>  	struct fb_info *info = fb_helper->fbdev;
>  	unsigned int rotation, sw_rotations = 0;
> +	struct drm_mode_set *modeset;
>  	int i;
>  
> -	for (i = 0; i < fb_helper->crtc_count; i++) {
> -		struct drm_mode_set *modeset = &fb_helper->crtc_info[i].mode_set;
> -
> +	mutex_lock(&client->modeset_mutex);
> +	drm_client_for_each_modeset(modeset, client) {
>  		if (!modeset->num_connectors)
>  			continue;
>  
> @@ -2855,6 +2811,7 @@ static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper)
>  		else
>  			sw_rotations |= rotation;
>  	}
> +	mutex_unlock(&client->modeset_mutex);
>  
>  	mutex_lock(&fb_helper->dev->mode_config.mutex);
>  	drm_fb_helper_for_each_connector(fb_helper, i) {
> @@ -3071,8 +3028,7 @@ EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
>   * @funcs: fbdev helper functions
>   * @preferred_bpp: Preferred bits per pixel for the device.
>   *                 @dev->mode_config.preferred_depth is used if this is zero.
> - * @max_conn_count: Maximum number of connectors.
> - *                  @dev->mode_config.num_connector is used if this is zero.
> + * @max_conn_count: Maximum number of connectors (not used)
>   *
>   * This function sets up fbdev emulation and registers fbdev for access by
>   * userspace. If all connectors are disconnected, setup is deferred to the next
> @@ -3100,16 +3056,9 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev,
>  	if (!preferred_bpp)
>  		preferred_bpp = 32;
>  
> -	if (!max_conn_count)
> -		max_conn_count = dev->mode_config.num_connector;
> -	if (!max_conn_count) {
> -		DRM_DEV_ERROR(dev->dev, "fbdev: No connectors\n");
> -		return -EINVAL;
> -	}
> -
>  	drm_fb_helper_prepare(dev, fb_helper, funcs);
>  
> -	ret = drm_fb_helper_init(dev, fb_helper, max_conn_count);
> +	ret = drm_fb_helper_init(dev, fb_helper, 0);
>  	if (ret < 0) {
>  		DRM_DEV_ERROR(dev->dev, "fbdev: Failed to initialize (ret=%d)\n", ret);
>  		return ret;
> @@ -3422,7 +3371,7 @@ static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
>  
>  	drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs);
>  
> -	ret = drm_fb_helper_init(dev, fb_helper, dev->mode_config.num_connector);
> +	ret = drm_fb_helper_init(dev, fb_helper, 0);
>  	if (ret)
>  		goto err;
>  
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2019-05-15  9:04 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-06 18:01 [PATCH v5 00/11] drm/fb-helper: Move modesetting code to drm_client Noralf Trønnes
2019-05-06 18:01 ` [PATCH v5 01/11] drm/atomic: Move __drm_atomic_helper_disable_plane/set_config() Noralf Trønnes
2019-05-06 18:01 ` [PATCH v5 02/11] drm/fb-helper: Avoid race with DRM userspace Noralf Trønnes
2019-05-06 18:01 ` [PATCH v5 03/11] drm/fb-helper: No need to cache rotation and sw_rotations Noralf Trønnes
2019-05-06 18:01 ` [PATCH v5 04/11] drm/fb-helper: Remove drm_fb_helper_crtc->{x, y, desired_mode} Noralf Trønnes
2019-05-06 18:01 ` [PATCH v5 05/11] drm/fb-helper: Remove drm_fb_helper_crtc Noralf Trønnes
2019-05-15  9:04   ` Sam Ravnborg [this message]
2019-05-15 14:35     ` Familien Trønnes
2019-05-15 14:51     ` Noralf Trønnes
2019-05-15 15:01       ` Sam Ravnborg
2019-05-06 18:01 ` [PATCH v5 06/11] drm/fb-helper: Prepare to move out commit code Noralf Trønnes
2019-05-15  9:07   ` Sam Ravnborg
2019-05-06 18:01 ` [PATCH v5 07/11] drm/fb-helper: Move " Noralf Trønnes
2019-05-15  9:09   ` Sam Ravnborg
2019-05-15 14:40     ` Noralf Trønnes
2019-05-06 18:01 ` [PATCH v5 08/11] drm/fb-helper: Remove drm_fb_helper_connector Noralf Trønnes
2019-05-16 13:07   ` Sam Ravnborg
2019-05-16 13:53     ` Noralf Trønnes
2019-05-16 15:36       ` Sam Ravnborg
2019-05-06 18:01 ` [PATCH v5 09/11] drm/fb-helper: Prepare to move out modeset config code Noralf Trønnes
2019-05-15  9:14   ` Sam Ravnborg
2019-05-06 18:01 ` [PATCH v5 10/11] drm/fb-helper: Move " Noralf Trønnes
2019-05-16 15:38   ` Sam Ravnborg
2019-05-06 18:01 ` [PATCH v5 11/11] drm/client: Hack: Add bootsplash example Noralf Trønnes
2019-05-06 18:40 ` ✗ Fi.CI.CHECKPATCH: warning for drm/fb-helper: Move modesetting code to drm_client (rev6) Patchwork
2019-05-06 18:48 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-05-06 19:00 ` ✓ Fi.CI.BAT: success " Patchwork
2019-05-06 21:17 ` ✓ Fi.CI.IGT: " Patchwork
2019-05-14 14:29 ` [PATCH v5 00/11] drm/fb-helper: Move modesetting code to drm_client Noralf Trønnes
2019-05-16 15:44   ` Sam Ravnborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190515090432.GA31712@ravnborg.org \
    --to=sam@ravnborg.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=noralf@tronnes.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.