mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 19:47:08 +02:00
drm/nouveau/kms/nv50-: pull some common init out of OR-specific code
- cleanup before additional changes Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Acked-by: Danilo Krummrich <me@dakr.org> Signed-off-by: Lyude Paul <lyude@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20230919220442.202488-16-lyude@redhat.com
This commit is contained in:
parent
45d954c05d
commit
e32de3da3f
|
|
@ -554,34 +554,27 @@ nv50_dac_func = {
|
|||
};
|
||||
|
||||
static int
|
||||
nv50_dac_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
||||
nv50_dac_create(struct nouveau_encoder *nv_encoder)
|
||||
{
|
||||
struct drm_connector *connector = &nv_encoder->conn->base;
|
||||
struct nouveau_drm *drm = nouveau_drm(connector->dev);
|
||||
struct nv50_disp *disp = nv50_disp(connector->dev);
|
||||
struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device);
|
||||
struct nvkm_i2c_bus *bus;
|
||||
struct nouveau_encoder *nv_encoder;
|
||||
struct drm_encoder *encoder;
|
||||
struct dcb_output *dcbe = nv_encoder->dcb;
|
||||
int type = DRM_MODE_ENCODER_DAC;
|
||||
|
||||
nv_encoder = kzalloc(sizeof(*nv_encoder), GFP_KERNEL);
|
||||
if (!nv_encoder)
|
||||
return -ENOMEM;
|
||||
nv_encoder->dcb = dcbe;
|
||||
|
||||
bus = nvkm_i2c_bus_find(i2c, dcbe->i2c_index);
|
||||
if (bus)
|
||||
nv_encoder->i2c = &bus->i2c;
|
||||
|
||||
encoder = to_drm_encoder(nv_encoder);
|
||||
encoder->possible_crtcs = dcbe->heads;
|
||||
encoder->possible_clones = 0;
|
||||
drm_encoder_init(connector->dev, encoder, &nv50_dac_func, type,
|
||||
"dac-%04x-%04x", dcbe->hasht, dcbe->hashm);
|
||||
drm_encoder_helper_add(encoder, &nv50_dac_help);
|
||||
|
||||
drm_connector_attach_encoder(connector, encoder);
|
||||
return nvif_outp_ctor(disp->disp, nv_encoder->base.base.name, dcbe->id, &nv_encoder->outp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1726,13 +1719,14 @@ bool nv50_has_mst(struct nouveau_drm *drm)
|
|||
}
|
||||
|
||||
static int
|
||||
nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
||||
nv50_sor_create(struct nouveau_encoder *nv_encoder)
|
||||
{
|
||||
struct drm_connector *connector = &nv_encoder->conn->base;
|
||||
struct nouveau_connector *nv_connector = nouveau_connector(connector);
|
||||
struct nouveau_drm *drm = nouveau_drm(connector->dev);
|
||||
struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device);
|
||||
struct nouveau_encoder *nv_encoder;
|
||||
struct drm_encoder *encoder;
|
||||
struct dcb_output *dcbe = nv_encoder->dcb;
|
||||
struct nv50_disp *disp = nv50_disp(connector->dev);
|
||||
int type, ret;
|
||||
|
||||
|
|
@ -1745,15 +1739,9 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
|||
break;
|
||||
}
|
||||
|
||||
nv_encoder = kzalloc(sizeof(*nv_encoder), GFP_KERNEL);
|
||||
if (!nv_encoder)
|
||||
return -ENOMEM;
|
||||
nv_encoder->dcb = dcbe;
|
||||
nv_encoder->update = nv50_sor_update;
|
||||
|
||||
encoder = to_drm_encoder(nv_encoder);
|
||||
encoder->possible_crtcs = dcbe->heads;
|
||||
encoder->possible_clones = 0;
|
||||
drm_encoder_init(connector->dev, encoder, &nv50_sor_func, type,
|
||||
"sor-%04x-%04x", dcbe->hasht, dcbe->hashm);
|
||||
drm_encoder_helper_add(encoder, &nv50_sor_help);
|
||||
|
|
@ -1797,7 +1785,7 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
|||
nv_encoder->i2c = &bus->i2c;
|
||||
}
|
||||
|
||||
return nvif_outp_ctor(disp->disp, nv_encoder->base.base.name, dcbe->id, &nv_encoder->outp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -1897,8 +1885,9 @@ nv50_pior_func = {
|
|||
};
|
||||
|
||||
static int
|
||||
nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
||||
nv50_pior_create(struct nouveau_encoder *nv_encoder)
|
||||
{
|
||||
struct drm_connector *connector = &nv_encoder->conn->base;
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct nv50_disp *disp = nv50_disp(dev);
|
||||
|
|
@ -1906,8 +1895,8 @@ nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
|||
struct nvkm_i2c_bus *bus = NULL;
|
||||
struct nvkm_i2c_aux *aux = NULL;
|
||||
struct i2c_adapter *ddc;
|
||||
struct nouveau_encoder *nv_encoder;
|
||||
struct drm_encoder *encoder;
|
||||
struct dcb_output *dcbe = nv_encoder->dcb;
|
||||
int type;
|
||||
|
||||
switch (dcbe->type) {
|
||||
|
|
@ -1925,16 +1914,10 @@ nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
nv_encoder = kzalloc(sizeof(*nv_encoder), GFP_KERNEL);
|
||||
if (!nv_encoder)
|
||||
return -ENOMEM;
|
||||
nv_encoder->dcb = dcbe;
|
||||
nv_encoder->i2c = ddc;
|
||||
nv_encoder->aux = aux;
|
||||
|
||||
encoder = to_drm_encoder(nv_encoder);
|
||||
encoder->possible_crtcs = dcbe->heads;
|
||||
encoder->possible_clones = 0;
|
||||
drm_encoder_init(connector->dev, encoder, &nv50_pior_func, type,
|
||||
"pior-%04x-%04x", dcbe->hasht, dcbe->hashm);
|
||||
drm_encoder_helper_add(encoder, &nv50_pior_help);
|
||||
|
|
@ -1944,7 +1927,7 @@ nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
|||
disp->core->func->pior->get_caps(disp, nv_encoder, ffs(dcbe->or) - 1);
|
||||
nv50_outp_dump_caps(drm, nv_encoder);
|
||||
|
||||
return nvif_outp_ctor(disp->disp, nv_encoder->base.base.name, dcbe->id, &nv_encoder->outp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -2797,26 +2780,46 @@ nv50_display_create(struct drm_device *dev)
|
|||
|
||||
/* create encoder/connector objects based on VBIOS DCB table */
|
||||
for (i = 0, dcbe = &dcb->entry[0]; i < dcb->entries; i++, dcbe++) {
|
||||
connector = nouveau_connector_create(dev, dcbe);
|
||||
if (IS_ERR(connector))
|
||||
struct nouveau_encoder *outp;
|
||||
|
||||
outp = kzalloc(sizeof(*outp), GFP_KERNEL);
|
||||
if (!outp)
|
||||
break;
|
||||
|
||||
ret = nvif_outp_ctor(disp->disp, "kmsOutp", dcbe->id, &outp->outp);
|
||||
if (ret) {
|
||||
kfree(outp);
|
||||
continue;
|
||||
}
|
||||
|
||||
connector = nouveau_connector_create(dev, dcbe);
|
||||
if (IS_ERR(connector)) {
|
||||
nvif_outp_dtor(&outp->outp);
|
||||
kfree(outp);
|
||||
continue;
|
||||
}
|
||||
|
||||
outp->base.base.possible_crtcs = dcbe->heads;
|
||||
outp->base.base.possible_clones = 0;
|
||||
outp->dcb = dcbe;
|
||||
outp->conn = nouveau_connector(connector);
|
||||
|
||||
if (dcbe->location == DCB_LOC_ON_CHIP) {
|
||||
switch (dcbe->type) {
|
||||
case DCB_OUTPUT_TMDS:
|
||||
case DCB_OUTPUT_LVDS:
|
||||
case DCB_OUTPUT_DP:
|
||||
ret = nv50_sor_create(connector, dcbe);
|
||||
ret = nv50_sor_create(outp);
|
||||
break;
|
||||
case DCB_OUTPUT_ANALOG:
|
||||
ret = nv50_dac_create(connector, dcbe);
|
||||
ret = nv50_dac_create(outp);
|
||||
break;
|
||||
default:
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
ret = nv50_pior_create(connector, dcbe);
|
||||
ret = nv50_pior_create(outp);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@ struct nouveau_encoder {
|
|||
struct nvif_outp outp;
|
||||
int or;
|
||||
|
||||
struct nouveau_connector *conn;
|
||||
|
||||
struct i2c_adapter *i2c;
|
||||
struct nvkm_i2c_aux *aux;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user