aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/core/engine/disp
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-11-07 21:01:39 -0500
committerBen Skeggs <bskeggs@redhat.com>2012-11-28 18:57:46 -0500
commit74b6685089591fa275929109f7b839bf386890a0 (patch)
tree20edc1d18fbeb8c22d918083e9a39e771beb614a /drivers/gpu/drm/nouveau/core/engine/disp
parent6c5a04249d7afeea3e0ed971e7813f84e29a1706 (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.h2
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nva3.c1
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c1
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nve0.c1
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c16
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
40int nv50_sor_mthd(struct nouveau_object *, u32, void *, u32); 41int nv50_sor_mthd(struct nouveau_object *, u32, void *, u32);
42int nv50_sor_power(struct nv50_disp_priv *, int, u32);
41 43
42int nvd0_sor_dp_train(struct nv50_disp_priv *, int, int, u16, u16, u32, 44int 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
42struct nouveau_omthds 42struct nouveau_omthds
43nva3_disp_base_omthds[] = { 43nva3_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
33int 34int
35nv50_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
46int
34nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) 47nv50_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;