diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2012-11-07 21:01:39 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-11-28 18:57:46 -0500 |
commit | 74b6685089591fa275929109f7b839bf386890a0 (patch) | |
tree | 20edc1d18fbeb8c22d918083e9a39e771beb614a /drivers/gpu/drm/nouveau/core/engine/disp | |
parent | 6c5a04249d7afeea3e0ed971e7813f84e29a1706 (diff) |
drm/nvd0/disp: call into core to handle sor power state changes
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/core/engine/disp')
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv50.h | 2 | ||||
-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/nve0.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | 16 |
5 files changed, 21 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h index eada7bc408b..ce490a148ec 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.h | |||
@@ -21,6 +21,7 @@ struct nv50_disp_priv { | |||
21 | } dac; | 21 | } dac; |
22 | struct { | 22 | struct { |
23 | int nr; | 23 | int nr; |
24 | int (*power)(struct nv50_disp_priv *, int sor, u32 data); | ||
24 | int (*dp_train)(struct nv50_disp_priv *, int sor, int link, | 25 | int (*dp_train)(struct nv50_disp_priv *, int sor, int link, |
25 | u16 type, u16 mask, u32 data, | 26 | u16 type, u16 mask, u32 data, |
26 | struct dcb_output *); | 27 | struct dcb_output *); |
@@ -38,6 +39,7 @@ extern struct nouveau_omthds nva3_disp_base_omthds[]; | |||
38 | #define SOR_MTHD(n) (n), (n) + 0x3f | 39 | #define SOR_MTHD(n) (n), (n) + 0x3f |
39 | 40 | ||
40 | int nv50_sor_mthd(struct nouveau_object *, u32, void *, u32); | 41 | int nv50_sor_mthd(struct nouveau_object *, u32, void *, u32); |
42 | int nv50_sor_power(struct nv50_disp_priv *, int, u32); | ||
41 | 43 | ||
42 | int nvd0_sor_dp_train(struct nv50_disp_priv *, int, int, u16, u16, u32, | 44 | int nvd0_sor_dp_train(struct nv50_disp_priv *, int, int, u16, u16, u32, |
43 | struct dcb_output *); | 45 | struct dcb_output *); |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c b/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c index ec0ac5bc874..f1d8e5a6559 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nva3.c | |||
@@ -41,6 +41,7 @@ nva3_disp_sclass[] = { | |||
41 | 41 | ||
42 | struct nouveau_omthds | 42 | struct nouveau_omthds |
43 | nva3_disp_base_omthds[] = { | 43 | nva3_disp_base_omthds[] = { |
44 | { SOR_MTHD(NV50_DISP_SOR_PWR) , nv50_sor_mthd }, | ||
44 | { SOR_MTHD(NV94_DISP_SOR_DP_TRAIN) , nv50_sor_mthd }, | 45 | { SOR_MTHD(NV94_DISP_SOR_DP_TRAIN) , nv50_sor_mthd }, |
45 | { SOR_MTHD(NV94_DISP_SOR_DP_LNKCTL) , nv50_sor_mthd }, | 46 | { SOR_MTHD(NV94_DISP_SOR_DP_LNKCTL) , nv50_sor_mthd }, |
46 | { SOR_MTHD(NV94_DISP_SOR_DP_DRVCTL(0)), nv50_sor_mthd }, | 47 | { SOR_MTHD(NV94_DISP_SOR_DP_DRVCTL(0)), nv50_sor_mthd }, |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c b/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c index f5ebbac8712..29f65dcdc1a 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c | |||
@@ -896,6 +896,7 @@ nvd0_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
896 | priv->head.nr = nv_rd32(priv, 0x022448); | 896 | priv->head.nr = nv_rd32(priv, 0x022448); |
897 | priv->dac.nr = 3; | 897 | priv->dac.nr = 3; |
898 | priv->sor.nr = 4; | 898 | priv->sor.nr = 4; |
899 | priv->sor.power = nv50_sor_power; | ||
899 | priv->sor.dp_train = nvd0_sor_dp_train; | 900 | priv->sor.dp_train = nvd0_sor_dp_train; |
900 | priv->sor.dp_lnkctl = nvd0_sor_dp_lnkctl; | 901 | priv->sor.dp_lnkctl = nvd0_sor_dp_lnkctl; |
901 | priv->sor.dp_drvctl = nvd0_sor_dp_drvctl; | 902 | priv->sor.dp_drvctl = nvd0_sor_dp_drvctl; |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nve0.c b/drivers/gpu/drm/nouveau/core/engine/disp/nve0.c index ed5ab9baa8e..6c21929d8e2 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nve0.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nve0.c | |||
@@ -66,6 +66,7 @@ nve0_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
66 | priv->head.nr = nv_rd32(priv, 0x022448); | 66 | priv->head.nr = nv_rd32(priv, 0x022448); |
67 | priv->dac.nr = 3; | 67 | priv->dac.nr = 3; |
68 | priv->sor.nr = 4; | 68 | priv->sor.nr = 4; |
69 | priv->sor.power = nv50_sor_power; | ||
69 | priv->sor.dp_train = nvd0_sor_dp_train; | 70 | priv->sor.dp_train = nvd0_sor_dp_train; |
70 | priv->sor.dp_lnkctl = nvd0_sor_dp_lnkctl; | 71 | priv->sor.dp_lnkctl = nvd0_sor_dp_lnkctl; |
71 | priv->sor.dp_drvctl = nvd0_sor_dp_drvctl; | 72 | priv->sor.dp_drvctl = nvd0_sor_dp_drvctl; |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c index 1ebf2bd372f..fc7944f0626 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | |||
@@ -27,10 +27,23 @@ | |||
27 | 27 | ||
28 | #include <subdev/bios.h> | 28 | #include <subdev/bios.h> |
29 | #include <subdev/bios/dcb.h> | 29 | #include <subdev/bios/dcb.h> |
30 | #include <subdev/timer.h> | ||
30 | 31 | ||
31 | #include "nv50.h" | 32 | #include "nv50.h" |
32 | 33 | ||
33 | int | 34 | int |
35 | nv50_sor_power(struct nv50_disp_priv *priv, int or, u32 data) | ||
36 | { | ||
37 | const u32 stat = data & NV50_DISP_SOR_PWR_STATE; | ||
38 | const u32 soff = (or * 0x800); | ||
39 | nv_wait(priv, 0x61c004 + soff, 0x80000000, 0x00000000); | ||
40 | nv_mask(priv, 0x61c004 + soff, 0x80000001, 0x80000000 | stat); | ||
41 | nv_wait(priv, 0x61c004 + soff, 0x80000000, 0x00000000); | ||
42 | nv_wait(priv, 0x61c030 + soff, 0x10000000, 0x00000000); | ||
43 | return 0; | ||
44 | } | ||
45 | |||
46 | int | ||
34 | 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) |
35 | { | 48 | { |
36 | struct nv50_disp_priv *priv = (void *)object->engine; | 49 | struct nv50_disp_priv *priv = (void *)object->engine; |
@@ -72,6 +85,9 @@ nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | |||
72 | 85 | ||
73 | data = *(u32 *)args; | 86 | data = *(u32 *)args; |
74 | switch (mthd & ~0x3f) { | 87 | switch (mthd & ~0x3f) { |
88 | case NV50_DISP_SOR_PWR: | ||
89 | ret = priv->sor.power(priv, or, data); | ||
90 | break; | ||
75 | case NV94_DISP_SOR_DP_TRAIN: | 91 | case NV94_DISP_SOR_DP_TRAIN: |
76 | ret = priv->sor.dp_train(priv, or, link, type, mask, data, &outp); | 92 | ret = priv->sor.dp_train(priv, or, link, type, mask, data, &outp); |
77 | break; | 93 | break; |