summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2017-05-19 23:59:35 +1000
committerBen Skeggs <bskeggs@redhat.com>2017-06-16 14:04:52 +1000
commit22e008f90d546507d57bdac92030cece73ded09a (patch)
tree1071f8e28fc2620136572c03ff0adc115a2b4580 /drivers/gpu/drm/nouveau
parent49f2b376df7f9235ccbed1e90f0ec93040001a9b (diff)
downloadlinux-22e008f90d546507d57bdac92030cece73ded09a.tar.bz2
drm/nouveau/disp/dp: only check for re-train when the link is active
An upcoming commit will limit link training to only when the sink is meant to be displaying an image. We still need IRQs enabled even when the link isn't trained (for MST messages), but don't want to train the link unnecessarily. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c51
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h1
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c3
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c3
4 files changed, 13 insertions, 45 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
index 090567d94876..a67192ad5cf3 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
@@ -491,7 +491,13 @@ nvkm_dp_hpd(struct nvkm_notify *notify)
struct nvif_notify_conn_rep_v0 rep = {};
OUTP_DBG(&dp->outp, "HPD: %d", line->mask);
- nvkm_dp_enable(dp, true);
+ if (line->mask & NVKM_I2C_IRQ) {
+ if (atomic_read(&dp->lt.done))
+ nvkm_output_dp_train(&dp->outp, 0);
+ rep.mask |= NVIF_NOTIFY_CONN_V0_IRQ;
+ } else {
+ nvkm_dp_enable(dp, true);
+ }
if (line->mask & NVKM_I2C_UNPLUG)
rep.mask |= NVIF_NOTIFY_CONN_V0_UNPLUG;
@@ -502,30 +508,11 @@ nvkm_dp_hpd(struct nvkm_notify *notify)
return NVKM_NOTIFY_KEEP;
}
-static int
-nvkm_dp_irq(struct nvkm_notify *notify)
-{
- const struct nvkm_i2c_ntfy_rep *line = notify->data;
- struct nvkm_dp *dp = container_of(notify, typeof(*dp), irq);
- struct nvkm_conn *conn = dp->outp.conn;
- struct nvkm_disp *disp = dp->outp.disp;
- struct nvif_notify_conn_rep_v0 rep = {
- .mask = NVIF_NOTIFY_CONN_V0_IRQ,
- };
-
- OUTP_DBG(&dp->outp, "IRQ: %d", line->mask);
- nvkm_output_dp_train(&dp->outp, 0);
-
- nvkm_event_send(&disp->hpd, rep.mask, conn->index, &rep, sizeof(rep));
- return NVKM_NOTIFY_KEEP;
-}
-
static void
nvkm_dp_fini(struct nvkm_outp *outp)
{
struct nvkm_dp *dp = nvkm_dp(outp);
nvkm_notify_put(&dp->hpd);
- nvkm_notify_put(&dp->irq);
nvkm_dp_enable(dp, false);
}
@@ -535,7 +522,6 @@ nvkm_dp_init(struct nvkm_outp *outp)
struct nvkm_dp *dp = nvkm_dp(outp);
nvkm_notify_put(&dp->outp.conn->hpd);
nvkm_dp_enable(dp, true);
- nvkm_notify_get(&dp->irq);
nvkm_notify_get(&dp->hpd);
}
@@ -544,7 +530,6 @@ nvkm_dp_dtor(struct nvkm_outp *outp)
{
struct nvkm_dp *dp = nvkm_dp(outp);
nvkm_notify_fini(&dp->hpd);
- nvkm_notify_fini(&dp->irq);
return dp;
}
@@ -588,27 +573,11 @@ nvkm_dp_ctor(struct nvkm_disp *disp, int index, struct dcb_output *dcbE,
OUTP_DBG(&dp->outp, "bios dp %02x %02x %02x %02x",
dp->version, hdr, cnt, len);
- /* link maintenance */
- ret = nvkm_notify_init(NULL, &i2c->event, nvkm_dp_irq, true,
- &(struct nvkm_i2c_ntfy_req) {
- .mask = NVKM_I2C_IRQ,
- .port = dp->aux->id,
- },
- sizeof(struct nvkm_i2c_ntfy_req),
- sizeof(struct nvkm_i2c_ntfy_rep),
- &dp->irq);
- if (ret) {
- OUTP_ERR(&dp->outp, "error monitoring aux irq: %d", ret);
- return ret;
- }
-
- mutex_init(&dp->mutex);
- atomic_set(&dp->lt.done, 0);
-
/* hotplug detect, replaces gpio-based mechanism with aux events */
ret = nvkm_notify_init(NULL, &i2c->event, nvkm_dp_hpd, true,
&(struct nvkm_i2c_ntfy_req) {
- .mask = NVKM_I2C_PLUG | NVKM_I2C_UNPLUG,
+ .mask = NVKM_I2C_PLUG | NVKM_I2C_UNPLUG |
+ NVKM_I2C_IRQ,
.port = dp->aux->id,
},
sizeof(struct nvkm_i2c_ntfy_req),
@@ -619,6 +588,8 @@ nvkm_dp_ctor(struct nvkm_disp *disp, int index, struct dcb_output *dcbE,
return ret;
}
+ mutex_init(&dp->mutex);
+ atomic_set(&dp->lt.done, 0);
return 0;
}
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
index 65d6b478eb56..9d18aed75b10 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
@@ -19,7 +19,6 @@ struct nvkm_dp {
struct nvkm_i2c_aux *aux;
- struct nvkm_notify irq;
struct nvkm_notify hpd;
bool present;
u8 dpcd[16];
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
index 50dd13596939..94eb6b29e14c 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
@@ -201,9 +201,8 @@ gf119_disp_intr_unk2_0(struct nv50_disp *disp, int head)
.execute = 1,
};
- nvkm_notify_put(&outpdp->irq);
- nvbios_exec(&init);
atomic_set(&outpdp->lt.done, 0);
+ nvbios_exec(&init);
}
}
}
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
index bd67335d5466..acc663061ceb 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
@@ -661,9 +661,8 @@ nv50_disp_intr_unk20_0(struct nv50_disp *disp, int head)
.execute = 1,
};
- nvkm_notify_put(&outpdp->irq);
- nvbios_exec(&init);
atomic_set(&outpdp->lt.done, 0);
+ nvbios_exec(&init);
}
}