The nouveau connector reset implementation creates a custom state subclass, but only initializes a pristine state and sets driver-specific defaults without resetting any hardware. This is equivalent to what atomic_create_state expects. Convert to it.
Signed-off-by: Maxime Ripard <[email protected]> --- Cc: Danilo Krummrich <[email protected]> Cc: Lyude Paul <[email protected]> Cc: [email protected] --- drivers/gpu/drm/nouveau/dispnv50/disp.c | 11 +++++++++-- drivers/gpu/drm/nouveau/nouveau_connector.c | 27 ++++++++++++++++----------- drivers/gpu/drm/nouveau/nouveau_connector.h | 3 ++- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index e91130f93db6..947d0ff4ba02 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -1249,7 +1249,7 @@ nv50_mstc_destroy(struct drm_connector *connector) static const struct drm_connector_funcs nv50_mstc = { - .reset = nouveau_conn_reset, .fill_modes = drm_helper_probe_single_connector_modes, .destroy = nv50_mstc_destroy, + .atomic_create_state = nouveau_conn_atomic_create_state, .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state, .atomic_destroy_state = nouveau_conn_atomic_destroy_state, @@ -1263,4 +1263,5 @@ nv50_mstc_new(struct nv50_mstm *mstm, struct drm_dp_mst_port *port, { struct drm_device *dev = mstm->outp->base.base.dev; + struct drm_connector_state *conn_state; struct drm_crtc *crtc; struct nv50_mstc *mstc; @@ -1282,5 +1283,11 @@ nv50_mstc_new(struct nv50_mstm *mstm, struct drm_dp_mst_port *port, drm_connector_helper_add(&mstc->connector, &nv50_mstc_help); - mstc->connector.funcs->reset(&mstc->connector); + conn_state = mstc->connector.funcs->atomic_create_state(&mstc->connector); + if (IS_ERR(conn_state)) { + drm_connector_cleanup(&mstc->connector); + return PTR_ERR(conn_state); + } + mstc->connector.state = conn_state; + nouveau_conn_attach_properties(&mstc->connector); diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index cc3caf8de64b..e4ab9849de4d 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c @@ -243,6 +243,6 @@ nouveau_conn_atomic_duplicate_state(struct drm_connector *connector) } -void -nouveau_conn_reset(struct drm_connector *connector) +struct drm_connector_state * +nouveau_conn_atomic_create_state(struct drm_connector *connector) { struct nouveau_connector *nv_connector = nouveau_connector(connector); @@ -251,11 +251,7 @@ nouveau_conn_reset(struct drm_connector *connector) if (drm_drv_uses_atomic_modeset(connector->dev)) { if (WARN_ON(!(asyc = kzalloc_obj(*asyc)))) - return; + return ERR_PTR(-ENOMEM); - if (connector->state) - nouveau_conn_atomic_destroy_state(connector, - connector->state); - - __drm_atomic_helper_connector_reset(connector, &asyc->state); + __drm_atomic_helper_connector_state_init(&asyc->state, connector); } else { asyc = &nv_connector->properties_state; @@ -279,4 +275,6 @@ nouveau_conn_reset(struct drm_connector *connector) } } + + return &asyc->state; } @@ -1231,5 +1229,4 @@ static const struct drm_connector_funcs nouveau_connector_funcs = { .dpms = drm_helper_connector_dpms, - .reset = nouveau_conn_reset, .detect = nouveau_connector_detect, .force = nouveau_connector_force, @@ -1237,4 +1234,5 @@ nouveau_connector_funcs = { .set_property = nouveau_connector_set_property, .destroy = nouveau_connector_destroy, + .atomic_create_state = nouveau_conn_atomic_create_state, .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state, .atomic_destroy_state = nouveau_conn_atomic_destroy_state, @@ -1248,5 +1246,4 @@ static const struct drm_connector_funcs nouveau_connector_funcs_lvds = { .dpms = drm_helper_connector_dpms, - .reset = nouveau_conn_reset, .detect = nouveau_connector_detect_lvds, .force = nouveau_connector_force, @@ -1254,4 +1251,5 @@ nouveau_connector_funcs_lvds = { .set_property = nouveau_connector_set_property, .destroy = nouveau_connector_destroy, + .atomic_create_state = nouveau_conn_atomic_create_state, .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state, .atomic_destroy_state = nouveau_conn_atomic_destroy_state, @@ -1362,4 +1360,5 @@ nouveau_connector_create(struct drm_device *dev, int index) struct nouveau_display *disp = nouveau_display(dev); struct nouveau_connector *nv_connector = NULL; + struct drm_connector_state *conn_state; struct drm_connector *connector; struct drm_connector_list_iter conn_iter; @@ -1522,5 +1521,11 @@ nouveau_connector_create(struct drm_device *dev, int index) } - connector->funcs->reset(connector); + conn_state = connector->funcs->atomic_create_state(connector); + if (IS_ERR(conn_state)) { + ret = PTR_ERR(conn_state); + goto drm_conn_err; + } + connector->state = conn_state; + nouveau_conn_attach_properties(connector); diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h index eb292d2ba4bc..02f843648eb8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.h +++ b/drivers/gpu/drm/nouveau/nouveau_connector.h @@ -217,5 +217,6 @@ extern int nouveau_hdmimhz; void nouveau_conn_attach_properties(struct drm_connector *); -void nouveau_conn_reset(struct drm_connector *); +struct drm_connector_state * +nouveau_conn_atomic_create_state(struct drm_connector *); struct drm_connector_state * nouveau_conn_atomic_duplicate_state(struct drm_connector *); -- 2.55.0
