On Wed, Jul 10, 2019 at 04:29:19PM +0300, Dmitry Osipenko wrote: > This works: > > diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c > index 56d36779d213..e5a2f9c8f404 100644 > --- a/drivers/gpu/drm/drm_client_modeset.c > +++ b/drivers/gpu/drm/drm_client_modeset.c > @@ -182,6 +182,8 @@ drm_connector_pick_cmdline_mode(struct drm_connector *connector) > mode = drm_mode_create_from_cmdline_mode(connector->dev, cmdline_mode); > if (mode) > list_add(&mode->head, &connector->modes); > + else > + cmdline_mode->specified = false; Hmmm, it's not clear to me why that wouldn't be the case. If we come back to the beginning of that function, we retrieve the cmdline_mode buffer from the connector pointer, that will probably have been parsed a first time using drm_mode_create_from_cmdline_mode in drm_helper_probe_add_cmdline_mode. Now, I'm guessing that the issue is that in drm_mode_parse_command_line_for_connector, if we have a named mode, we just copy the mode over and set mode->specified. And we then move over to do other checks, and that's probably what fails and returns, but our drm_cmdline_mode will have been modified. I'm not entirely sure how to deal with that though. I guess we could allocate a drm_cmdline_mode structure on the stack, fill that, and if successful copy over its content to the one in drm_connector. That would allow us to only change the content on success, which is what I would expect from such a function? How does that sound? Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
Attachment:
signature.asc
Description: PGP signature