diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-02-10 18:11:08 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2013-02-20 01:01:04 -0500 |
commit | a2bc283f3905389ba53962a2bbb05ede0c16193d (patch) | |
tree | 63ab5a995440d32f32e80f3035f08e0a25296b54 | |
parent | 5a885f0b757ba4483d790c40813d8a66278bdda7 (diff) |
drm/nv50-/disp: initial work towards supporting external encoders
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/dport.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv50.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv50.h | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv84.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv94.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nva0.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nva3.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/piornv50.c | 140 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/include/core/class.h | 17 |
10 files changed, 197 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile index 1452507da996..bda661eae585 100644 --- a/drivers/gpu/drm/nouveau/Makefile +++ b/drivers/gpu/drm/nouveau/Makefile | |||
@@ -165,6 +165,7 @@ nouveau-y += core/engine/disp/hdanvd0.o | |||
165 | nouveau-y += core/engine/disp/hdminv84.o | 165 | nouveau-y += core/engine/disp/hdminv84.o |
166 | nouveau-y += core/engine/disp/hdminva3.o | 166 | nouveau-y += core/engine/disp/hdminva3.o |
167 | nouveau-y += core/engine/disp/hdminvd0.o | 167 | nouveau-y += core/engine/disp/hdminvd0.o |
168 | nouveau-y += core/engine/disp/piornv50.o | ||
168 | nouveau-y += core/engine/disp/sornv50.o | 169 | nouveau-y += core/engine/disp/sornv50.o |
169 | nouveau-y += core/engine/disp/sornv94.o | 170 | nouveau-y += core/engine/disp/sornv94.o |
170 | nouveau-y += core/engine/disp/sornvd0.o | 171 | nouveau-y += core/engine/disp/sornvd0.o |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/dport.h b/drivers/gpu/drm/nouveau/core/engine/disp/dport.h index d0acd0171fcd..0e1bbd18ff6c 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/dport.h +++ b/drivers/gpu/drm/nouveau/core/engine/disp/dport.h | |||
@@ -70,6 +70,7 @@ struct nouveau_dp_func { | |||
70 | 70 | ||
71 | extern const struct nouveau_dp_func nv94_sor_dp_func; | 71 | extern const struct nouveau_dp_func nv94_sor_dp_func; |
72 | extern const struct nouveau_dp_func nvd0_sor_dp_func; | 72 | extern const struct nouveau_dp_func nvd0_sor_dp_func; |
73 | extern const struct nouveau_dp_func nv50_pior_dp_func; | ||
73 | 74 | ||
74 | int nouveau_dp_train(struct nouveau_disp *, const struct nouveau_dp_func *, | 75 | int nouveau_dp_train(struct nouveau_disp *, const struct nouveau_dp_func *, |
75 | struct dcb_output *, int, u32); | 76 | struct dcb_output *, int, u32); |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c index a4e21129f187..129815319974 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c | |||
@@ -678,6 +678,9 @@ nv50_disp_base_omthds[] = { | |||
678 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 678 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
679 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 679 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
680 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 680 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
681 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | ||
682 | { PIOR_MTHD(NV50_DISP_PIOR_TMDS_PWR) , nv50_pior_mthd }, | ||
683 | { PIOR_MTHD(NV50_DISP_PIOR_DP_PWR) , nv50_pior_mthd }, | ||
681 | {}, | 684 | {}, |
682 | }; | 685 | }; |
683 | 686 | ||
@@ -1227,9 +1230,12 @@ nv50_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
1227 | priv->head.nr = 2; | 1230 | priv->head.nr = 2; |
1228 | priv->dac.nr = 3; | 1231 | priv->dac.nr = 3; |
1229 | priv->sor.nr = 2; | 1232 | priv->sor.nr = 2; |
1233 | priv->pior.nr = 3; | ||
1230 | priv->dac.power = nv50_dac_power; | 1234 | priv->dac.power = nv50_dac_power; |
1231 | priv->dac.sense = nv50_dac_sense; | 1235 | priv->dac.sense = nv50_dac_sense; |
1232 | priv->sor.power = nv50_sor_power; | 1236 | priv->sor.power = nv50_sor_power; |
1237 | priv->pior.power = nv50_pior_power; | ||
1238 | priv->pior.dp = &nv50_pior_dp_func; | ||
1233 | return 0; | 1239 | return 0; |
1234 | } | 1240 | } |
1235 | 1241 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h index 781a816a5597..1ae6ceb56704 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h | |||
@@ -35,6 +35,12 @@ struct nv50_disp_priv { | |||
35 | u32 lvdsconf; | 35 | u32 lvdsconf; |
36 | const struct nouveau_dp_func *dp; | 36 | const struct nouveau_dp_func *dp; |
37 | } sor; | 37 | } sor; |
38 | struct { | ||
39 | int nr; | ||
40 | int (*power)(struct nv50_disp_priv *, int ext, u32 data); | ||
41 | u8 type[3]; | ||
42 | const struct nouveau_dp_func *dp; | ||
43 | } pior; | ||
38 | }; | 44 | }; |
39 | 45 | ||
40 | #define DAC_MTHD(n) (n), (n) + 0x03 | 46 | #define DAC_MTHD(n) (n), (n) + 0x03 |
@@ -73,6 +79,11 @@ int nvd0_sor_dp_lnkctl(struct nv50_disp_priv *, int, int, int, u16, u16, u32, | |||
73 | int nvd0_sor_dp_drvctl(struct nv50_disp_priv *, int, int, int, u16, u16, u32, | 79 | int nvd0_sor_dp_drvctl(struct nv50_disp_priv *, int, int, int, u16, u16, u32, |
74 | struct dcb_output *); | 80 | struct dcb_output *); |
75 | 81 | ||
82 | #define PIOR_MTHD(n) (n), (n) + 0x03 | ||
83 | |||
84 | int nv50_pior_mthd(struct nouveau_object *, u32, void *, u32); | ||
85 | int nv50_pior_power(struct nv50_disp_priv *, int, u32); | ||
86 | |||
76 | struct nv50_disp_base { | 87 | struct nv50_disp_base { |
77 | struct nouveau_parent base; | 88 | struct nouveau_parent base; |
78 | struct nouveau_ramht *ramht; | 89 | struct nouveau_ramht *ramht; |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv84.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv84.c index 9ec942a0f9f6..d8c74c0883a1 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv84.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv84.c | |||
@@ -46,6 +46,9 @@ nv84_disp_base_omthds[] = { | |||
46 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 46 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
47 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 47 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
48 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 48 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
49 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | ||
50 | { PIOR_MTHD(NV50_DISP_PIOR_TMDS_PWR) , nv50_pior_mthd }, | ||
51 | { PIOR_MTHD(NV50_DISP_PIOR_DP_PWR) , nv50_pior_mthd }, | ||
49 | {}, | 52 | {}, |
50 | }; | 53 | }; |
51 | 54 | ||
@@ -77,10 +80,13 @@ nv84_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
77 | priv->head.nr = 2; | 80 | priv->head.nr = 2; |
78 | priv->dac.nr = 3; | 81 | priv->dac.nr = 3; |
79 | priv->sor.nr = 2; | 82 | priv->sor.nr = 2; |
83 | priv->pior.nr = 3; | ||
80 | priv->dac.power = nv50_dac_power; | 84 | priv->dac.power = nv50_dac_power; |
81 | priv->dac.sense = nv50_dac_sense; | 85 | priv->dac.sense = nv50_dac_sense; |
82 | priv->sor.power = nv50_sor_power; | 86 | priv->sor.power = nv50_sor_power; |
83 | priv->sor.hdmi = nv84_hdmi_ctrl; | 87 | priv->sor.hdmi = nv84_hdmi_ctrl; |
88 | priv->pior.power = nv50_pior_power; | ||
89 | priv->pior.dp = &nv50_pior_dp_func; | ||
84 | return 0; | 90 | return 0; |
85 | } | 91 | } |
86 | 92 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c index a449890bd438..a66f949c1f84 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv94.c | |||
@@ -46,6 +46,9 @@ nv94_disp_base_omthds[] = { | |||
46 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 46 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
47 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 47 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
48 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 48 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
49 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | ||
50 | { PIOR_MTHD(NV50_DISP_PIOR_TMDS_PWR) , nv50_pior_mthd }, | ||
51 | { PIOR_MTHD(NV50_DISP_PIOR_DP_PWR) , nv50_pior_mthd }, | ||
49 | {}, | 52 | {}, |
50 | }; | 53 | }; |
51 | 54 | ||
@@ -77,11 +80,14 @@ nv94_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
77 | priv->head.nr = 2; | 80 | priv->head.nr = 2; |
78 | priv->dac.nr = 3; | 81 | priv->dac.nr = 3; |
79 | priv->sor.nr = 4; | 82 | priv->sor.nr = 4; |
83 | priv->pior.nr = 3; | ||
80 | priv->dac.power = nv50_dac_power; | 84 | priv->dac.power = nv50_dac_power; |
81 | priv->dac.sense = nv50_dac_sense; | 85 | priv->dac.sense = nv50_dac_sense; |
82 | priv->sor.power = nv50_sor_power; | 86 | priv->sor.power = nv50_sor_power; |
83 | priv->sor.hdmi = nv84_hdmi_ctrl; | 87 | priv->sor.hdmi = nv84_hdmi_ctrl; |
84 | priv->sor.dp = &nv94_sor_dp_func; | 88 | priv->sor.dp = &nv94_sor_dp_func; |
89 | priv->pior.power = nv50_pior_power; | ||
90 | priv->pior.dp = &nv50_pior_dp_func; | ||
85 | return 0; | 91 | return 0; |
86 | } | 92 | } |
87 | 93 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nva0.c b/drivers/gpu/drm/nouveau/core/engine/disp/nva0.c index ce539ca1d308..6cf8eefac368 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nva0.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nva0.c | |||
@@ -67,10 +67,13 @@ nva0_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
67 | priv->head.nr = 2; | 67 | priv->head.nr = 2; |
68 | priv->dac.nr = 3; | 68 | priv->dac.nr = 3; |
69 | priv->sor.nr = 2; | 69 | priv->sor.nr = 2; |
70 | priv->pior.nr = 3; | ||
70 | priv->dac.power = nv50_dac_power; | 71 | priv->dac.power = nv50_dac_power; |
71 | priv->dac.sense = nv50_dac_sense; | 72 | priv->dac.sense = nv50_dac_sense; |
72 | priv->sor.power = nv50_sor_power; | 73 | priv->sor.power = nv50_sor_power; |
73 | priv->sor.hdmi = nv84_hdmi_ctrl; | 74 | priv->sor.hdmi = nv84_hdmi_ctrl; |
75 | priv->pior.power = nv50_pior_power; | ||
76 | priv->pior.dp = &nv50_pior_dp_func; | ||
74 | return 0; | 77 | return 0; |
75 | } | 78 | } |
76 | 79 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c b/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c index 2f78c9451a44..b75413169eae 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c | |||
@@ -47,6 +47,9 @@ nva3_disp_base_omthds[] = { | |||
47 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, | 47 | { SOR_MTHD(NV50_DISP_SOR_LVDS_SCRIPT) , nv50_sor_mthd }, |
48 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, | 48 | { DAC_MTHD(NV50_DISP_DAC_PWR) , nv50_dac_mthd }, |
49 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, | 49 | { DAC_MTHD(NV50_DISP_DAC_LOAD) , nv50_dac_mthd }, |
50 | { PIOR_MTHD(NV50_DISP_PIOR_PWR) , nv50_pior_mthd }, | ||
51 | { PIOR_MTHD(NV50_DISP_PIOR_TMDS_PWR) , nv50_pior_mthd }, | ||
52 | { PIOR_MTHD(NV50_DISP_PIOR_DP_PWR) , nv50_pior_mthd }, | ||
50 | {}, | 53 | {}, |
51 | }; | 54 | }; |
52 | 55 | ||
@@ -78,12 +81,15 @@ nva3_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
78 | priv->head.nr = 2; | 81 | priv->head.nr = 2; |
79 | priv->dac.nr = 3; | 82 | priv->dac.nr = 3; |
80 | priv->sor.nr = 4; | 83 | priv->sor.nr = 4; |
84 | priv->pior.nr = 3; | ||
81 | priv->dac.power = nv50_dac_power; | 85 | priv->dac.power = nv50_dac_power; |
82 | priv->dac.sense = nv50_dac_sense; | 86 | priv->dac.sense = nv50_dac_sense; |
83 | priv->sor.power = nv50_sor_power; | 87 | priv->sor.power = nv50_sor_power; |
84 | priv->sor.hda_eld = nva3_hda_eld; | 88 | priv->sor.hda_eld = nva3_hda_eld; |
85 | priv->sor.hdmi = nva3_hdmi_ctrl; | 89 | priv->sor.hdmi = nva3_hdmi_ctrl; |
86 | priv->sor.dp = &nv94_sor_dp_func; | 90 | priv->sor.dp = &nv94_sor_dp_func; |
91 | priv->pior.power = nv50_pior_power; | ||
92 | priv->pior.dp = &nv50_pior_dp_func; | ||
87 | return 0; | 93 | return 0; |
88 | } | 94 | } |
89 | 95 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/piornv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/piornv50.c new file mode 100644 index 000000000000..2c8ce351b52d --- /dev/null +++ b/drivers/gpu/drm/nouveau/core/engine/disp/piornv50.c | |||
@@ -0,0 +1,140 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Red Hat Inc. | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
5 | * copy of this software and associated documentation files (the "Software"), | ||
6 | * to deal in the Software without restriction, including without limitation | ||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
8 | * and/or sell copies of the Software, and to permit persons to whom the | ||
9 | * Software is furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
21 | * | ||
22 | * Authors: Ben Skeggs | ||
23 | */ | ||
24 | |||
25 | #include <core/os.h> | ||
26 | #include <core/class.h> | ||
27 | |||
28 | #include <subdev/bios.h> | ||
29 | #include <subdev/bios/dcb.h> | ||
30 | #include <subdev/timer.h> | ||
31 | #include <subdev/i2c.h> | ||
32 | |||
33 | #include "nv50.h" | ||
34 | |||
35 | /****************************************************************************** | ||
36 | * DisplayPort | ||
37 | *****************************************************************************/ | ||
38 | static struct nouveau_i2c_port * | ||
39 | nv50_pior_dp_find(struct nouveau_disp *disp, struct dcb_output *outp) | ||
40 | { | ||
41 | struct nouveau_i2c *i2c = nouveau_i2c(disp); | ||
42 | return i2c->find_type(i2c, NV_I2C_TYPE_EXTAUX(outp->extdev)); | ||
43 | } | ||
44 | |||
45 | static int | ||
46 | nv50_pior_dp_pattern(struct nouveau_disp *disp, struct dcb_output *outp, | ||
47 | int head, int pattern) | ||
48 | { | ||
49 | struct nouveau_i2c_port *port; | ||
50 | int ret = -EINVAL; | ||
51 | |||
52 | port = nv50_pior_dp_find(disp, outp); | ||
53 | if (port) { | ||
54 | if (port->func->pattern) | ||
55 | ret = port->func->pattern(port, pattern); | ||
56 | else | ||
57 | ret = 0; | ||
58 | } | ||
59 | |||
60 | return ret; | ||
61 | } | ||
62 | |||
63 | static int | ||
64 | nv50_pior_dp_lnk_ctl(struct nouveau_disp *disp, struct dcb_output *outp, | ||
65 | int head, int lane_nr, int link_bw, bool enh) | ||
66 | { | ||
67 | struct nouveau_i2c_port *port; | ||
68 | int ret = -EINVAL; | ||
69 | |||
70 | port = nv50_pior_dp_find(disp, outp); | ||
71 | if (port && port->func->lnk_ctl) | ||
72 | ret = port->func->lnk_ctl(port, lane_nr, link_bw, enh); | ||
73 | |||
74 | return ret; | ||
75 | } | ||
76 | |||
77 | static int | ||
78 | nv50_pior_dp_drv_ctl(struct nouveau_disp *disp, struct dcb_output *outp, | ||
79 | int head, int lane, int vsw, int pre) | ||
80 | { | ||
81 | struct nouveau_i2c_port *port; | ||
82 | int ret = -EINVAL; | ||
83 | |||
84 | port = nv50_pior_dp_find(disp, outp); | ||
85 | if (port) { | ||
86 | if (port->func->drv_ctl) | ||
87 | ret = port->func->drv_ctl(port, lane, vsw, pre); | ||
88 | else | ||
89 | ret = 0; | ||
90 | } | ||
91 | |||
92 | return ret; | ||
93 | } | ||
94 | |||
95 | const struct nouveau_dp_func | ||
96 | nv50_pior_dp_func = { | ||
97 | .pattern = nv50_pior_dp_pattern, | ||
98 | .lnk_ctl = nv50_pior_dp_lnk_ctl, | ||
99 | .drv_ctl = nv50_pior_dp_drv_ctl, | ||
100 | }; | ||
101 | |||
102 | /****************************************************************************** | ||
103 | * General PIOR handling | ||
104 | *****************************************************************************/ | ||
105 | int | ||
106 | nv50_pior_power(struct nv50_disp_priv *priv, int or, u32 data) | ||
107 | { | ||
108 | const u32 stat = data & NV50_DISP_PIOR_PWR_STATE; | ||
109 | const u32 soff = (or * 0x800); | ||
110 | nv_wait(priv, 0x61e004 + soff, 0x80000000, 0x00000000); | ||
111 | nv_mask(priv, 0x61e004 + soff, 0x80000101, 0x80000000 | stat); | ||
112 | nv_wait(priv, 0x61e004 + soff, 0x80000000, 0x00000000); | ||
113 | return 0; | ||
114 | } | ||
115 | |||
116 | int | ||
117 | nv50_pior_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | ||
118 | { | ||
119 | struct nv50_disp_priv *priv = (void *)object->engine; | ||
120 | const u8 type = (mthd & NV50_DISP_PIOR_MTHD_TYPE) >> 12; | ||
121 | const u8 or = (mthd & NV50_DISP_PIOR_MTHD_OR); | ||
122 | u32 *data = args; | ||
123 | int ret; | ||
124 | |||
125 | if (size < sizeof(u32)) | ||
126 | return -EINVAL; | ||
127 | |||
128 | mthd &= ~NV50_DISP_PIOR_MTHD_TYPE; | ||
129 | mthd &= ~NV50_DISP_PIOR_MTHD_OR; | ||
130 | switch (mthd) { | ||
131 | case NV50_DISP_PIOR_PWR: | ||
132 | ret = priv->pior.power(priv, or, data[0]); | ||
133 | priv->pior.type[or] = type; | ||
134 | break; | ||
135 | default: | ||
136 | return -EINVAL; | ||
137 | } | ||
138 | |||
139 | return ret; | ||
140 | } | ||
diff --git a/drivers/gpu/drm/nouveau/core/include/core/class.h b/drivers/gpu/drm/nouveau/core/include/core/class.h index 86515cccbc97..92d3ab11d962 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/class.h +++ b/drivers/gpu/drm/nouveau/core/include/core/class.h | |||
@@ -219,6 +219,23 @@ struct nv04_display_class { | |||
219 | #define NV50_DISP_DAC_LOAD 0x0002000c | 219 | #define NV50_DISP_DAC_LOAD 0x0002000c |
220 | #define NV50_DISP_DAC_LOAD_VALUE 0x00000007 | 220 | #define NV50_DISP_DAC_LOAD_VALUE 0x00000007 |
221 | 221 | ||
222 | #define NV50_DISP_PIOR_MTHD 0x00030000 | ||
223 | #define NV50_DISP_PIOR_MTHD_TYPE 0x0000f000 | ||
224 | #define NV50_DISP_PIOR_MTHD_OR 0x00000003 | ||
225 | |||
226 | #define NV50_DISP_PIOR_PWR 0x00030000 | ||
227 | #define NV50_DISP_PIOR_PWR_STATE 0x00000001 | ||
228 | #define NV50_DISP_PIOR_PWR_STATE_ON 0x00000001 | ||
229 | #define NV50_DISP_PIOR_PWR_STATE_OFF 0x00000000 | ||
230 | #define NV50_DISP_PIOR_TMDS_PWR 0x00032000 | ||
231 | #define NV50_DISP_PIOR_TMDS_PWR_STATE 0x00000001 | ||
232 | #define NV50_DISP_PIOR_TMDS_PWR_STATE_ON 0x00000001 | ||
233 | #define NV50_DISP_PIOR_TMDS_PWR_STATE_OFF 0x00000000 | ||
234 | #define NV50_DISP_PIOR_DP_PWR 0x00036000 | ||
235 | #define NV50_DISP_PIOR_DP_PWR_STATE 0x00000001 | ||
236 | #define NV50_DISP_PIOR_DP_PWR_STATE_ON 0x00000001 | ||
237 | #define NV50_DISP_PIOR_DP_PWR_STATE_OFF 0x00000000 | ||
238 | |||
222 | struct nv50_display_class { | 239 | struct nv50_display_class { |
223 | }; | 240 | }; |
224 | 241 | ||