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 | 9 ++++++--- drivers/gpu/drm/nouveau/nouveau_connector.c | 25 ++++++++++++++----------- drivers/gpu/drm/nouveau/nouveau_connector.h | 3 ++- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index e91130f93db6..39a23d0e9be5 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -1246,11 +1246,11 @@ nv50_mstc_destroy(struct drm_connector *connector) kfree(mstc); } static const struct drm_connector_funcs nv50_mstc = { - .reset = nouveau_conn_reset, + .atomic_create_state = nouveau_conn_atomic_create_state, .fill_modes = drm_helper_probe_single_connector_modes, .destroy = nv50_mstc_destroy, .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state, .atomic_destroy_state = nouveau_conn_atomic_destroy_state, .atomic_set_property = nouveau_conn_atomic_set_property, @@ -1279,12 +1279,15 @@ nv50_mstc_new(struct nv50_mstm *mstm, struct drm_dp_mst_port *port, return ret; } drm_connector_helper_add(&mstc->connector, &nv50_mstc_help); - mstc->connector.funcs->reset(&mstc->connector); - nouveau_conn_attach_properties(&mstc->connector); + mstc->connector.state = mstc->connector.funcs->atomic_create_state(&mstc->connector); + if (IS_ERR(mstc->connector.state)) { + drm_connector_cleanup(&mstc->connector); + return PTR_ERR(mstc->connector.state); + } drm_for_each_crtc(crtc, dev) { if (!(mstm->outp->dcb->heads & drm_crtc_mask(crtc))) continue; diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index cc3caf8de64b..59c8091c6796 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c @@ -240,25 +240,21 @@ nouveau_conn_atomic_duplicate_state(struct drm_connector *connector) asyc->procamp = armc->procamp; asyc->set.mask = 0; return &asyc->state; } -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); struct nouveau_conn_atom *asyc; 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; } asyc->dither.mode = DITHERING_MODE_AUTO; @@ -276,10 +272,12 @@ nouveau_conn_reset(struct drm_connector *connector) break; default: break; } } + + return &asyc->state; } void nouveau_conn_attach_properties(struct drm_connector *connector) { @@ -1228,11 +1226,11 @@ nouveau_connector_helper_funcs = { }; static const struct drm_connector_funcs nouveau_connector_funcs = { .dpms = drm_helper_connector_dpms, - .reset = nouveau_conn_reset, + .atomic_create_state = nouveau_conn_atomic_create_state, .detect = nouveau_connector_detect, .force = nouveau_connector_force, .fill_modes = drm_helper_probe_single_connector_modes, .set_property = nouveau_connector_set_property, .destroy = nouveau_connector_destroy, @@ -1245,11 +1243,11 @@ nouveau_connector_funcs = { }; static const struct drm_connector_funcs nouveau_connector_funcs_lvds = { .dpms = drm_helper_connector_dpms, - .reset = nouveau_conn_reset, + .atomic_create_state = nouveau_conn_atomic_create_state, .detect = nouveau_connector_detect_lvds, .force = nouveau_connector_force, .fill_modes = drm_helper_probe_single_connector_modes, .set_property = nouveau_connector_set_property, .destroy = nouveau_connector_destroy, @@ -1519,11 +1517,16 @@ nouveau_connector_create(struct drm_device *dev, int index) goto drm_conn_err; } } } - connector->funcs->reset(connector); + connector->state = connector->funcs->atomic_create_state(connector); + if (IS_ERR(connector->state)) { + ret = PTR_ERR(connector->state); + goto drm_conn_err; + } + nouveau_conn_attach_properties(connector); /* Default scaling mode */ switch (nv_connector->type) { case DCB_CONNECTOR_LVDS: 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 @@ -214,11 +214,12 @@ extern int nouveau_tv_disable; extern int nouveau_ignorelid; extern int nouveau_duallink; 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 *); void nouveau_conn_atomic_destroy_state(struct drm_connector *, struct drm_connector_state *); int nouveau_conn_atomic_set_property(struct drm_connector *, -- 2.55.0
