aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-02-10 18:11:08 -0500
committerBen Skeggs <bskeggs@redhat.com>2013-02-20 01:01:04 -0500
commita2bc283f3905389ba53962a2bbb05ede0c16193d (patch)
tree63ab5a995440d32f32e80f3035f08e0a25296b54
parent5a885f0b757ba4483d790c40813d8a66278bdda7 (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/Makefile1
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/dport.h1
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nv50.c6
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nv50.h11
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nv84.c6
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nv94.c6
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nva0.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nva3.c6
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/piornv50.c140
-rw-r--r--drivers/gpu/drm/nouveau/core/include/core/class.h17
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
165nouveau-y += core/engine/disp/hdminv84.o 165nouveau-y += core/engine/disp/hdminv84.o
166nouveau-y += core/engine/disp/hdminva3.o 166nouveau-y += core/engine/disp/hdminva3.o
167nouveau-y += core/engine/disp/hdminvd0.o 167nouveau-y += core/engine/disp/hdminvd0.o
168nouveau-y += core/engine/disp/piornv50.o
168nouveau-y += core/engine/disp/sornv50.o 169nouveau-y += core/engine/disp/sornv50.o
169nouveau-y += core/engine/disp/sornv94.o 170nouveau-y += core/engine/disp/sornv94.o
170nouveau-y += core/engine/disp/sornvd0.o 171nouveau-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
71extern const struct nouveau_dp_func nv94_sor_dp_func; 71extern const struct nouveau_dp_func nv94_sor_dp_func;
72extern const struct nouveau_dp_func nvd0_sor_dp_func; 72extern const struct nouveau_dp_func nvd0_sor_dp_func;
73extern const struct nouveau_dp_func nv50_pior_dp_func;
73 74
74int nouveau_dp_train(struct nouveau_disp *, const struct nouveau_dp_func *, 75int 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,
73int nvd0_sor_dp_drvctl(struct nv50_disp_priv *, int, int, int, u16, u16, u32, 79int 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
84int nv50_pior_mthd(struct nouveau_object *, u32, void *, u32);
85int nv50_pior_power(struct nv50_disp_priv *, int, u32);
86
76struct nv50_disp_base { 87struct 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 *****************************************************************************/
38static struct nouveau_i2c_port *
39nv50_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
45static int
46nv50_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
63static int
64nv50_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
77static int
78nv50_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
95const struct nouveau_dp_func
96nv50_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 *****************************************************************************/
105int
106nv50_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
116int
117nv50_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
222struct nv50_display_class { 239struct nv50_display_class {
223}; 240};
224 241