diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-05-25 22:09:06 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-06-11 02:10:57 -0400 |
commit | ebd6acbb068b6558735eb80aabce1e7af9e78e1e (patch) | |
tree | 8794d7facf957999a40ea338d85a3dbdc342c74f | |
parent | 55f083c33feb7231c7574a64cd01b0477715a370 (diff) |
drm/g94-/disp: add method to power-off dp lanes
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv94.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nva3.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/include/core/class.h | 4 |
5 files changed, 35 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c index 240b69a89b7b..4f718a9f5aef 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c | |||
@@ -77,6 +77,7 @@ nv94_disp_base_omthds[] = { | |||
77 | { SOR_MTHD(NV50_DISP_SOR_PWR) , nv50_sor_mthd }, | 77 | { SOR_MTHD(NV50_DISP_SOR_PWR) , nv50_sor_mthd }, |
78 | { SOR_MTHD(NV84_DISP_SOR_HDMI_PWR) , nv50_sor_mthd }, | 78 | { SOR_MTHD(NV84_DISP_SOR_HDMI_PWR) , nv50_sor_mthd }, |
79 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 79 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
80 | { SOR_MTHD(NV94_DISP_SOR_DP_PWR) , nv50_sor_mthd }, | ||
80 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 81 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
81 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 82 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
82 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | 83 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c b/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c index 705c6784fb68..019124d4782b 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c | |||
@@ -50,6 +50,7 @@ nva3_disp_base_omthds[] = { | |||
50 | { SOR_MTHD(NVA3_DISP_SOR_HDA_ELD) , nv50_sor_mthd }, | 50 | { SOR_MTHD(NVA3_DISP_SOR_HDA_ELD) , nv50_sor_mthd }, |
51 | { SOR_MTHD(NV84_DISP_SOR_HDMI_PWR) , nv50_sor_mthd }, | 51 | { SOR_MTHD(NV84_DISP_SOR_HDMI_PWR) , nv50_sor_mthd }, |
52 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 52 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
53 | { SOR_MTHD(NV94_DISP_SOR_DP_PWR) , nv50_sor_mthd }, | ||
53 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 54 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
54 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 55 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
55 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | 56 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c b/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c index 4eb16e9e7b59..254a7a18c26d 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c | |||
@@ -887,6 +887,7 @@ nvd0_disp_base_omthds[] = { | |||
887 | { SOR_MTHD(NVA3_DISP_SOR_HDA_ELD) , nv50_sor_mthd }, | 887 | { SOR_MTHD(NVA3_DISP_SOR_HDA_ELD) , nv50_sor_mthd }, |
888 | { SOR_MTHD(NV84_DISP_SOR_HDMI_PWR) , nv50_sor_mthd }, | 888 | { SOR_MTHD(NV84_DISP_SOR_HDMI_PWR) , nv50_sor_mthd }, |
889 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 889 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
890 | { SOR_MTHD(NV94_DISP_SOR_DP_PWR) , nv50_sor_mthd }, | ||
890 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 891 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
891 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 892 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
892 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | 893 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c index 526b75242899..e1832778e8b6 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | |||
@@ -47,8 +47,12 @@ int | |||
47 | nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | 47 | nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) |
48 | { | 48 | { |
49 | struct nv50_disp_priv *priv = (void *)object->engine; | 49 | struct nv50_disp_priv *priv = (void *)object->engine; |
50 | const u8 type = (mthd & NV50_DISP_SOR_MTHD_TYPE) >> 12; | ||
50 | const u8 head = (mthd & NV50_DISP_SOR_MTHD_HEAD) >> 3; | 51 | const u8 head = (mthd & NV50_DISP_SOR_MTHD_HEAD) >> 3; |
52 | const u8 link = (mthd & NV50_DISP_SOR_MTHD_LINK) >> 2; | ||
51 | const u8 or = (mthd & NV50_DISP_SOR_MTHD_OR); | 53 | const u8 or = (mthd & NV50_DISP_SOR_MTHD_OR); |
54 | const u16 mask = (0x0100 << head) | (0x0040 << link) | (0x0001 << or); | ||
55 | struct nvkm_output *outp = NULL, *temp; | ||
52 | u32 data; | 56 | u32 data; |
53 | int ret = -EINVAL; | 57 | int ret = -EINVAL; |
54 | 58 | ||
@@ -56,6 +60,13 @@ nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | |||
56 | return -EINVAL; | 60 | return -EINVAL; |
57 | data = *(u32 *)args; | 61 | data = *(u32 *)args; |
58 | 62 | ||
63 | list_for_each_entry(temp, &priv->base.outp, head) { | ||
64 | if ((temp->info.hasht & 0xff) == type && | ||
65 | (temp->info.hashm & mask) == mask) { | ||
66 | outp = temp; | ||
67 | break; | ||
68 | } | ||
69 | } | ||
59 | 70 | ||
60 | switch (mthd & ~0x3f) { | 71 | switch (mthd & ~0x3f) { |
61 | case NV50_DISP_SOR_PWR: | 72 | case NV50_DISP_SOR_PWR: |
@@ -71,6 +82,23 @@ nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | |||
71 | priv->sor.lvdsconf = data & NV50_DISP_SOR_LVDS_SCRIPT_ID; | 82 | priv->sor.lvdsconf = data & NV50_DISP_SOR_LVDS_SCRIPT_ID; |
72 | ret = 0; | 83 | ret = 0; |
73 | break; | 84 | break; |
85 | case NV94_DISP_SOR_DP_PWR: | ||
86 | if (outp) { | ||
87 | struct nvkm_output_dp *outpdp = (void *)outp; | ||
88 | switch (data) { | ||
89 | case NV94_DISP_SOR_DP_PWR_STATE_OFF: | ||
90 | ((struct nvkm_output_dp_impl *)nv_oclass(outp)) | ||
91 | ->lnk_pwr(outpdp, 0); | ||
92 | atomic_set(&outpdp->lt.done, 0); | ||
93 | break; | ||
94 | case NV94_DISP_SOR_DP_PWR_STATE_ON: | ||
95 | nvkm_output_dp_train(&outpdp->base, 0, true); | ||
96 | break; | ||
97 | default: | ||
98 | return -EINVAL; | ||
99 | } | ||
100 | } | ||
101 | break; | ||
74 | default: | 102 | default: |
75 | BUG_ON(1); | 103 | BUG_ON(1); |
76 | } | 104 | } |
diff --git a/drivers/gpu/drm/nouveau/core/include/core/class.h b/drivers/gpu/drm/nouveau/core/include/core/class.h index 9c0cd73462d9..e0c812bc884f 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/class.h +++ b/drivers/gpu/drm/nouveau/core/include/core/class.h | |||
@@ -295,6 +295,10 @@ struct nv04_display_scanoutpos { | |||
295 | #define NV84_DISP_SOR_HDMI_PWR_REKEY 0x0000007f | 295 | #define NV84_DISP_SOR_HDMI_PWR_REKEY 0x0000007f |
296 | #define NV50_DISP_SOR_LVDS_SCRIPT 0x00013000 | 296 | #define NV50_DISP_SOR_LVDS_SCRIPT 0x00013000 |
297 | #define NV50_DISP_SOR_LVDS_SCRIPT_ID 0x0000ffff | 297 | #define NV50_DISP_SOR_LVDS_SCRIPT_ID 0x0000ffff |
298 | #define NV94_DISP_SOR_DP_PWR 0x00016000 | ||
299 | #define NV94_DISP_SOR_DP_PWR_STATE 0x00000001 | ||
300 | #define NV94_DISP_SOR_DP_PWR_STATE_OFF 0x00000000 | ||
301 | #define NV94_DISP_SOR_DP_PWR_STATE_ON 0x00000001 | ||
298 | 302 | ||
299 | #define NV50_DISP_DAC_MTHD 0x00020000 | 303 | #define NV50_DISP_DAC_MTHD 0x00020000 |
300 | #define NV50_DISP_DAC_MTHD_TYPE 0x0000f000 | 304 | #define NV50_DISP_DAC_MTHD_TYPE 0x0000f000 |