aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-09-25 23:05:01 -0400
committerBen Skeggs <bskeggs@redhat.com>2012-10-02 23:13:15 -0400
commitc0abf5c9fa1db7188bd6b8b580614a377dbc7080 (patch)
treec2e6c9fe43997e2f9a9a82e79db3c32c2f73d5c3 /drivers/gpu
parent2f951a5db5b55f65eb02d9a90aa7cecafde9f8b8 (diff)
drm/nvc0/ibus: initial implementation of subdev
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/Makefile1
-rw-r--r--drivers/gpu/drm/nouveau/core/include/subdev/ibus.h1
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c9
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/ibus/nvc0.c123
4 files changed, 134 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile
index 15d17e887434..a990df4d6c04 100644
--- a/drivers/gpu/drm/nouveau/Makefile
+++ b/drivers/gpu/drm/nouveau/Makefile
@@ -76,6 +76,7 @@ nouveau-y += core/subdev/gpio/nvd0.o
76nouveau-y += core/subdev/i2c/base.o 76nouveau-y += core/subdev/i2c/base.o
77nouveau-y += core/subdev/i2c/aux.o 77nouveau-y += core/subdev/i2c/aux.o
78nouveau-y += core/subdev/i2c/bit.o 78nouveau-y += core/subdev/i2c/bit.o
79nouveau-y += core/subdev/ibus/nvc0.o
79nouveau-y += core/subdev/ibus/nve0.o 80nouveau-y += core/subdev/ibus/nve0.o
80nouveau-y += core/subdev/instmem/base.o 81nouveau-y += core/subdev/instmem/base.o
81nouveau-y += core/subdev/instmem/nv04.o 82nouveau-y += core/subdev/instmem/nv04.o
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h b/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h
index f014594f4265..88814f159d89 100644
--- a/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h
+++ b/drivers/gpu/drm/nouveau/core/include/subdev/ibus.h
@@ -28,6 +28,7 @@ nouveau_ibus(void *obj)
28#define _nouveau_ibus_init _nouveau_subdev_init 28#define _nouveau_ibus_init _nouveau_subdev_init
29#define _nouveau_ibus_fini _nouveau_subdev_fini 29#define _nouveau_ibus_fini _nouveau_subdev_fini
30 30
31extern struct nouveau_oclass nvc0_ibus_oclass;
31extern struct nouveau_oclass nve0_ibus_oclass; 32extern struct nouveau_oclass nve0_ibus_oclass;
32 33
33#endif 34#endif
diff --git a/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c
index 246bd081a01c..6697f0f9c293 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/device/nvc0.c
@@ -34,6 +34,7 @@
34#include <subdev/timer.h> 34#include <subdev/timer.h>
35#include <subdev/fb.h> 35#include <subdev/fb.h>
36#include <subdev/ltcg.h> 36#include <subdev/ltcg.h>
37#include <subdev/ibus.h>
37#include <subdev/instmem.h> 38#include <subdev/instmem.h>
38#include <subdev/vm.h> 39#include <subdev/vm.h>
39#include <subdev/bar.h> 40#include <subdev/bar.h>
@@ -65,6 +66,7 @@ nvc0_identify(struct nouveau_device *device)
65 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 66 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
66 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 67 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
67 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 68 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
69 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
68 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 70 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
69 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 71 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
70 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 72 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -92,6 +94,7 @@ nvc0_identify(struct nouveau_device *device)
92 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 94 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
93 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 95 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
94 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 96 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
97 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
95 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 98 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
96 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 99 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
97 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 100 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -119,6 +122,7 @@ nvc0_identify(struct nouveau_device *device)
119 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 122 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
120 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 123 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
121 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 124 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
125 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
122 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 126 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
123 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 127 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
124 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 128 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -146,6 +150,7 @@ nvc0_identify(struct nouveau_device *device)
146 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 150 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
147 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 151 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
148 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 152 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
153 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
149 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 154 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
150 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 155 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
151 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 156 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -173,6 +178,7 @@ nvc0_identify(struct nouveau_device *device)
173 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 178 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
174 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 179 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
175 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 180 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
181 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
176 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 182 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
177 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 183 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
178 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 184 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -200,6 +206,7 @@ nvc0_identify(struct nouveau_device *device)
200 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 206 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
201 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 207 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
202 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 208 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
209 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
203 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 210 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
204 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 211 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
205 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 212 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -227,6 +234,7 @@ nvc0_identify(struct nouveau_device *device)
227 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 234 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
228 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 235 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
229 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 236 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
237 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
230 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 238 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
231 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 239 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
232 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 240 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
@@ -254,6 +262,7 @@ nvc0_identify(struct nouveau_device *device)
254 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; 262 device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
255 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass; 263 device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
256 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass; 264 device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
265 device->oclass[NVDEV_SUBDEV_IBUS ] = &nvc0_ibus_oclass;
257 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 266 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
258 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 267 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
259 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 268 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
diff --git a/drivers/gpu/drm/nouveau/core/subdev/ibus/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/ibus/nvc0.c
new file mode 100644
index 000000000000..4e977ff27e44
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/core/subdev/ibus/nvc0.c
@@ -0,0 +1,123 @@
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 <subdev/ibus.h>
26
27struct nvc0_ibus_priv {
28 struct nouveau_ibus base;
29};
30
31static void
32nvc0_ibus_intr_hub(struct nvc0_ibus_priv *priv, int i)
33{
34 u32 addr = nv_rd32(priv, 0x122120 + (i * 0x0400));
35 u32 data = nv_rd32(priv, 0x122124 + (i * 0x0400));
36 u32 stat = nv_rd32(priv, 0x122128 + (i * 0x0400));
37 nv_error(priv, "HUB%d: 0x%06x 0x%08x (0x%08x)\n", i, addr, data, stat);
38 nv_mask(priv, 0x122128 + (i * 0x0400), 0x00000200, 0x00000000);
39}
40
41static void
42nvc0_ibus_intr_rop(struct nvc0_ibus_priv *priv, int i)
43{
44 u32 addr = nv_rd32(priv, 0x124120 + (i * 0x0400));
45 u32 data = nv_rd32(priv, 0x124124 + (i * 0x0400));
46 u32 stat = nv_rd32(priv, 0x124128 + (i * 0x0400));
47 nv_error(priv, "ROP%d: 0x%06x 0x%08x (0x%08x)\n", i, addr, data, stat);
48 nv_mask(priv, 0x124128 + (i * 0x0400), 0x00000200, 0x00000000);
49}
50
51static void
52nvc0_ibus_intr_gpc(struct nvc0_ibus_priv *priv, int i)
53{
54 u32 addr = nv_rd32(priv, 0x128120 + (i * 0x0400));
55 u32 data = nv_rd32(priv, 0x128124 + (i * 0x0400));
56 u32 stat = nv_rd32(priv, 0x128128 + (i * 0x0400));
57 nv_error(priv, "GPC%d: 0x%06x 0x%08x (0x%08x)\n", i, addr, data, stat);
58 nv_mask(priv, 0x128128 + (i * 0x0400), 0x00000200, 0x00000000);
59}
60
61static void
62nvc0_ibus_intr(struct nouveau_subdev *subdev)
63{
64 struct nvc0_ibus_priv *priv = (void *)subdev;
65 u32 intr0 = nv_rd32(priv, 0x121c58);
66 u32 intr1 = nv_rd32(priv, 0x121c5c);
67 u32 hubnr = nv_rd32(priv, 0x121c70);
68 u32 ropnr = nv_rd32(priv, 0x121c74);
69 u32 gpcnr = nv_rd32(priv, 0x121c78);
70 u32 i;
71
72 for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
73 u32 stat = 0x00000100 << i;
74 if (intr0 & stat) {
75 nvc0_ibus_intr_hub(priv, i);
76 intr0 &= ~stat;
77 }
78 }
79
80 for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
81 u32 stat = 0x00010000 << i;
82 if (intr0 & stat) {
83 nvc0_ibus_intr_rop(priv, i);
84 intr0 &= ~stat;
85 }
86 }
87
88 for (i = 0; intr1 && i < gpcnr; i++) {
89 u32 stat = 0x00000001 << i;
90 if (intr1 & stat) {
91 nvc0_ibus_intr_gpc(priv, i);
92 intr1 &= ~stat;
93 }
94 }
95}
96
97static int
98nvc0_ibus_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
99 struct nouveau_oclass *oclass, void *data, u32 size,
100 struct nouveau_object **pobject)
101{
102 struct nvc0_ibus_priv *priv;
103 int ret;
104
105 ret = nouveau_ibus_create(parent, engine, oclass, &priv);
106 *pobject = nv_object(priv);
107 if (ret)
108 return ret;
109
110 nv_subdev(priv)->intr = nvc0_ibus_intr;
111 return 0;
112}
113
114struct nouveau_oclass
115nvc0_ibus_oclass = {
116 .handle = NV_SUBDEV(IBUS, 0xc0),
117 .ofuncs = &(struct nouveau_ofuncs) {
118 .ctor = nvc0_ibus_ctor,
119 .dtor = _nouveau_ibus_dtor,
120 .init = _nouveau_ibus_init,
121 .fini = _nouveau_ibus_fini,
122 },
123};