aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-02-07 18:34:56 -0500
committerBen Skeggs <bskeggs@redhat.com>2013-11-08 00:40:17 -0500
commitc9c0ccae48e27b767e98a4c120976e43195dd3a7 (patch)
treef6d53465e4acbd033814f1c32c75b0abe6e1031a
parent0833428e7d1b250afbd41e0a4c8c247cccd15aad (diff)
drm/nouveau/volt: implement voltage control in core
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/Makefile3
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/device/nv40.c17
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/device/nv50.c15
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/device/nvc0.c9
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/device/nve0.c6
-rw-r--r--drivers/gpu/drm/nouveau/core/include/subdev/volt.h60
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/volt/base.c198
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/volt/gpio.c96
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/volt/nv40.c56
9 files changed, 460 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile
index 7d6173f1aa99..a6a71663e00e 100644
--- a/drivers/gpu/drm/nouveau/Makefile
+++ b/drivers/gpu/drm/nouveau/Makefile
@@ -162,6 +162,9 @@ nouveau-y += core/subdev/vm/nv41.o
162nouveau-y += core/subdev/vm/nv44.o 162nouveau-y += core/subdev/vm/nv44.o
163nouveau-y += core/subdev/vm/nv50.o 163nouveau-y += core/subdev/vm/nv50.o
164nouveau-y += core/subdev/vm/nvc0.o 164nouveau-y += core/subdev/vm/nvc0.o
165nouveau-y += core/subdev/volt/base.o
166nouveau-y += core/subdev/volt/gpio.o
167nouveau-y += core/subdev/volt/nv40.o
165 168
166nouveau-y += core/engine/falcon.o 169nouveau-y += core/engine/falcon.o
167nouveau-y += core/engine/xtensa.o 170nouveau-y += core/engine/xtensa.o
diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nv40.c b/drivers/gpu/drm/nouveau/core/engine/device/nv40.c
index 97458cba2bef..c8c41e93695e 100644
--- a/drivers/gpu/drm/nouveau/core/engine/device/nv40.c
+++ b/drivers/gpu/drm/nouveau/core/engine/device/nv40.c
@@ -35,6 +35,7 @@
35#include <subdev/fb.h> 35#include <subdev/fb.h>
36#include <subdev/instmem.h> 36#include <subdev/instmem.h>
37#include <subdev/vm.h> 37#include <subdev/vm.h>
38#include <subdev/volt.h>
38 39
39#include <engine/device.h> 40#include <engine/device.h>
40#include <engine/dmaobj.h> 41#include <engine/dmaobj.h>
@@ -63,6 +64,7 @@ nv40_identify(struct nouveau_device *device)
63 device->oclass[NVDEV_SUBDEV_FB ] = nv40_fb_oclass; 64 device->oclass[NVDEV_SUBDEV_FB ] = nv40_fb_oclass;
64 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 65 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
65 device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; 66 device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass;
67 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
66 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 68 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
67 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 69 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
68 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 70 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -85,6 +87,7 @@ nv40_identify(struct nouveau_device *device)
85 device->oclass[NVDEV_SUBDEV_FB ] = nv41_fb_oclass; 87 device->oclass[NVDEV_SUBDEV_FB ] = nv41_fb_oclass;
86 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 88 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
87 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; 89 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass;
90 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
88 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 91 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
89 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 92 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
90 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 93 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -107,6 +110,7 @@ nv40_identify(struct nouveau_device *device)
107 device->oclass[NVDEV_SUBDEV_FB ] = nv41_fb_oclass; 110 device->oclass[NVDEV_SUBDEV_FB ] = nv41_fb_oclass;
108 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 111 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
109 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; 112 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass;
113 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
110 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 114 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
111 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 115 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
112 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 116 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -129,6 +133,7 @@ nv40_identify(struct nouveau_device *device)
129 device->oclass[NVDEV_SUBDEV_FB ] = nv41_fb_oclass; 133 device->oclass[NVDEV_SUBDEV_FB ] = nv41_fb_oclass;
130 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 134 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
131 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; 135 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass;
136 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
132 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 137 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
133 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 138 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
134 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 139 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -151,6 +156,7 @@ nv40_identify(struct nouveau_device *device)
151 device->oclass[NVDEV_SUBDEV_FB ] = nv40_fb_oclass; 156 device->oclass[NVDEV_SUBDEV_FB ] = nv40_fb_oclass;
152 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 157 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
153 device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; 158 device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass;
159 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
154 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 160 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
155 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 161 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
156 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 162 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -173,6 +179,7 @@ nv40_identify(struct nouveau_device *device)
173 device->oclass[NVDEV_SUBDEV_FB ] = nv47_fb_oclass; 179 device->oclass[NVDEV_SUBDEV_FB ] = nv47_fb_oclass;
174 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 180 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
175 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; 181 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass;
182 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
176 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 183 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
177 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 184 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
178 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 185 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -195,6 +202,7 @@ nv40_identify(struct nouveau_device *device)
195 device->oclass[NVDEV_SUBDEV_FB ] = nv49_fb_oclass; 202 device->oclass[NVDEV_SUBDEV_FB ] = nv49_fb_oclass;
196 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 203 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
197 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; 204 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass;
205 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
198 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 206 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
199 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 207 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
200 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 208 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -217,6 +225,7 @@ nv40_identify(struct nouveau_device *device)
217 device->oclass[NVDEV_SUBDEV_FB ] = nv49_fb_oclass; 225 device->oclass[NVDEV_SUBDEV_FB ] = nv49_fb_oclass;
218 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 226 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
219 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; 227 device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass;
228 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
220 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 229 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
221 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 230 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
222 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 231 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -239,6 +248,7 @@ nv40_identify(struct nouveau_device *device)
239 device->oclass[NVDEV_SUBDEV_FB ] = nv44_fb_oclass; 248 device->oclass[NVDEV_SUBDEV_FB ] = nv44_fb_oclass;
240 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 249 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
241 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 250 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
251 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
242 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 252 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
243 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 253 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
244 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 254 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -261,6 +271,7 @@ nv40_identify(struct nouveau_device *device)
261 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass; 271 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass;
262 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 272 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
263 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 273 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
274 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
264 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 275 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
265 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 276 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
266 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 277 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -283,6 +294,7 @@ nv40_identify(struct nouveau_device *device)
283 device->oclass[NVDEV_SUBDEV_FB ] = nv44_fb_oclass; 294 device->oclass[NVDEV_SUBDEV_FB ] = nv44_fb_oclass;
284 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 295 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
285 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 296 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
297 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
286 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 298 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
287 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 299 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
288 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 300 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -305,6 +317,7 @@ nv40_identify(struct nouveau_device *device)
305 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass; 317 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass;
306 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 318 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
307 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 319 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
320 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
308 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 321 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
309 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 322 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
310 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 323 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -327,6 +340,7 @@ nv40_identify(struct nouveau_device *device)
327 device->oclass[NVDEV_SUBDEV_FB ] = nv4e_fb_oclass; 340 device->oclass[NVDEV_SUBDEV_FB ] = nv4e_fb_oclass;
328 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 341 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
329 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 342 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
343 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
330 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 344 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
331 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 345 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
332 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 346 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -349,6 +363,7 @@ nv40_identify(struct nouveau_device *device)
349 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass; 363 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass;
350 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 364 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
351 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 365 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
366 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
352 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 367 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
353 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 368 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
354 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 369 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -371,6 +386,7 @@ nv40_identify(struct nouveau_device *device)
371 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass; 386 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass;
372 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 387 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
373 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 388 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
389 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
374 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 390 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
375 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 391 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
376 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 392 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
@@ -393,6 +409,7 @@ nv40_identify(struct nouveau_device *device)
393 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass; 409 device->oclass[NVDEV_SUBDEV_FB ] = nv46_fb_oclass;
394 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; 410 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass;
395 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass; 411 device->oclass[NVDEV_SUBDEV_VM ] = &nv44_vmmgr_oclass;
412 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
396 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; 413 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass;
397 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass; 414 device->oclass[NVDEV_ENGINE_FIFO ] = nv40_fifo_oclass;
398 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass; 415 device->oclass[NVDEV_ENGINE_SW ] = nv10_software_oclass;
diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nv50.c b/drivers/gpu/drm/nouveau/core/engine/device/nv50.c
index 671a6f4f4d94..cc1b1391d2bc 100644
--- a/drivers/gpu/drm/nouveau/core/engine/device/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/engine/device/nv50.c
@@ -37,6 +37,7 @@
37#include <subdev/vm.h> 37#include <subdev/vm.h>
38#include <subdev/bar.h> 38#include <subdev/bar.h>
39#include <subdev/pwr.h> 39#include <subdev/pwr.h>
40#include <subdev/volt.h>
40 41
41#include <engine/device.h> 42#include <engine/device.h>
42#include <engine/dmaobj.h> 43#include <engine/dmaobj.h>
@@ -72,6 +73,7 @@ nv50_identify(struct nouveau_device *device)
72 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 73 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
73 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 74 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
74 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 75 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
76 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
75 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 77 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
76 device->oclass[NVDEV_ENGINE_FIFO ] = nv50_fifo_oclass; 78 device->oclass[NVDEV_ENGINE_FIFO ] = nv50_fifo_oclass;
77 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 79 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -96,6 +98,7 @@ nv50_identify(struct nouveau_device *device)
96 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 98 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
97 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 99 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
98 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 100 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
101 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
99 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 102 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
100 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 103 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
101 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 104 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -123,6 +126,7 @@ nv50_identify(struct nouveau_device *device)
123 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 126 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
124 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 127 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
125 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 128 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
129 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
126 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 130 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
127 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 131 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
128 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 132 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -150,6 +154,7 @@ nv50_identify(struct nouveau_device *device)
150 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 154 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
151 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 155 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
152 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 156 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
157 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
153 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 158 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
154 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 159 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
155 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 160 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -177,6 +182,7 @@ nv50_identify(struct nouveau_device *device)
177 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 182 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
178 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 183 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
179 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 184 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
185 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
180 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 186 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
181 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 187 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
182 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 188 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -204,6 +210,7 @@ nv50_identify(struct nouveau_device *device)
204 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 210 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
205 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 211 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
206 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 212 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
213 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
207 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 214 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
208 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 215 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
209 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 216 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -231,6 +238,7 @@ nv50_identify(struct nouveau_device *device)
231 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 238 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
232 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 239 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
233 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 240 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
241 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
234 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 242 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
235 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 243 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
236 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 244 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -258,6 +266,7 @@ nv50_identify(struct nouveau_device *device)
258 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 266 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
259 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 267 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
260 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 268 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
269 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
261 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 270 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
262 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 271 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
263 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 272 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -285,6 +294,7 @@ nv50_identify(struct nouveau_device *device)
285 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 294 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
286 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 295 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
287 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 296 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
297 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
288 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 298 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
289 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 299 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
290 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 300 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -312,6 +322,7 @@ nv50_identify(struct nouveau_device *device)
312 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass; 322 device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
313 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 323 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
314 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 324 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
325 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
315 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 326 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
316 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 327 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
317 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 328 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -340,6 +351,7 @@ nv50_identify(struct nouveau_device *device)
340 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 351 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
341 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 352 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
342 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass; 353 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass;
354 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
343 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 355 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
344 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 356 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
345 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 357 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -369,6 +381,7 @@ nv50_identify(struct nouveau_device *device)
369 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 381 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
370 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 382 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
371 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass; 383 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass;
384 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
372 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 385 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
373 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 386 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
374 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 387 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -397,6 +410,7 @@ nv50_identify(struct nouveau_device *device)
397 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 410 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
398 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 411 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
399 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass; 412 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass;
413 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
400 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 414 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
401 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 415 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
402 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 416 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
@@ -425,6 +439,7 @@ nv50_identify(struct nouveau_device *device)
425 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass; 439 device->oclass[NVDEV_SUBDEV_VM ] = &nv50_vmmgr_oclass;
426 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass; 440 device->oclass[NVDEV_SUBDEV_BAR ] = &nv50_bar_oclass;
427 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass; 441 device->oclass[NVDEV_SUBDEV_PWR ] = &nva3_pwr_oclass;
442 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
428 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass; 443 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv50_dmaeng_oclass;
429 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass; 444 device->oclass[NVDEV_ENGINE_FIFO ] = nv84_fifo_oclass;
430 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass; 445 device->oclass[NVDEV_ENGINE_SW ] = nv50_software_oclass;
diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c
index 94d5090d8eb9..606598f226fc 100644
--- a/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c
@@ -39,6 +39,7 @@
39#include <subdev/vm.h> 39#include <subdev/vm.h>
40#include <subdev/bar.h> 40#include <subdev/bar.h>
41#include <subdev/pwr.h> 41#include <subdev/pwr.h>
42#include <subdev/volt.h>
42 43
43#include <engine/device.h> 44#include <engine/device.h>
44#include <engine/dmaobj.h> 45#include <engine/dmaobj.h>
@@ -75,6 +76,7 @@ nvc0_identify(struct nouveau_device *device)
75 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 76 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
76 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 77 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
77 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 78 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
79 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
78 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 80 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
79 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 81 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
80 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 82 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -106,6 +108,7 @@ nvc0_identify(struct nouveau_device *device)
106 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 108 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
107 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 109 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
108 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 110 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
111 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
109 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 112 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
110 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 113 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
111 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 114 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -137,6 +140,7 @@ nvc0_identify(struct nouveau_device *device)
137 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 140 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
138 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 141 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
139 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 142 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
143 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
140 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 144 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
141 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 145 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
142 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 146 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -167,6 +171,7 @@ nvc0_identify(struct nouveau_device *device)
167 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 171 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
168 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 172 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
169 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 173 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
174 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
170 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 175 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
171 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 176 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
172 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 177 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -198,6 +203,7 @@ nvc0_identify(struct nouveau_device *device)
198 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 203 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
199 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 204 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
200 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 205 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
206 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
201 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 207 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
202 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 208 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
203 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 209 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -229,6 +235,7 @@ nvc0_identify(struct nouveau_device *device)
229 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 235 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
230 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 236 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
231 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 237 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
238 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
232 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 239 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
233 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 240 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
234 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 241 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -259,6 +266,7 @@ nvc0_identify(struct nouveau_device *device)
259 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 266 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
260 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 267 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
261 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass; 268 device->oclass[NVDEV_SUBDEV_PWR ] = &nvc0_pwr_oclass;
269 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
262 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass; 270 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvc0_dmaeng_oclass;
263 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 271 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
264 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 272 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -290,6 +298,7 @@ nvc0_identify(struct nouveau_device *device)
290 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 298 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
291 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 299 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
292 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass; 300 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass;
301 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
293 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass; 302 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
294 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass; 303 device->oclass[NVDEV_ENGINE_FIFO ] = nvc0_fifo_oclass;
295 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 304 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nve0.c b/drivers/gpu/drm/nouveau/core/engine/device/nve0.c
index f3a7c1b3ea7c..4107b67c95ed 100644
--- a/drivers/gpu/drm/nouveau/core/engine/device/nve0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/device/nve0.c
@@ -39,6 +39,7 @@
39#include <subdev/vm.h> 39#include <subdev/vm.h>
40#include <subdev/bar.h> 40#include <subdev/bar.h>
41#include <subdev/pwr.h> 41#include <subdev/pwr.h>
42#include <subdev/volt.h>
42 43
43#include <engine/device.h> 44#include <engine/device.h>
44#include <engine/dmaobj.h> 45#include <engine/dmaobj.h>
@@ -75,6 +76,7 @@ nve0_identify(struct nouveau_device *device)
75 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 76 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
76 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 77 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
77 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass; 78 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass;
79 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
78 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass; 80 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
79 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass; 81 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass;
80 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 82 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -107,6 +109,7 @@ nve0_identify(struct nouveau_device *device)
107 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 109 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
108 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 110 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
109 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass; 111 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass;
112 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
110 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass; 113 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
111 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass; 114 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass;
112 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 115 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -139,6 +142,7 @@ nve0_identify(struct nouveau_device *device)
139 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 142 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
140 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 143 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
141 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass; 144 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass;
145 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
142 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass; 146 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
143 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass; 147 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass;
144 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 148 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -171,6 +175,7 @@ nve0_identify(struct nouveau_device *device)
171 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 175 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
172 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 176 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
173 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass; 177 device->oclass[NVDEV_SUBDEV_PWR ] = &nvd0_pwr_oclass;
178 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
174 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass; 179 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
175 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass; 180 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass;
176 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; 181 device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass;
@@ -205,6 +210,7 @@ nve0_identify(struct nouveau_device *device)
205 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; 210 device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
206 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; 211 device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
207 device->oclass[NVDEV_SUBDEV_PWR ] = &nv108_pwr_oclass; 212 device->oclass[NVDEV_SUBDEV_PWR ] = &nv108_pwr_oclass;
213 device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
208 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass; 214 device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
209#if 0 215#if 0
210 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass; 216 device->oclass[NVDEV_ENGINE_FIFO ] = nve0_fifo_oclass;
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/volt.h b/drivers/gpu/drm/nouveau/core/include/subdev/volt.h
new file mode 100644
index 000000000000..820b62ffd75b
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/core/include/subdev/volt.h
@@ -0,0 +1,60 @@
1#ifndef __NOUVEAU_VOLT_H__
2#define __NOUVEAU_VOLT_H__
3
4#include <core/subdev.h>
5#include <core/device.h>
6
7struct nouveau_voltage {
8 u32 uv;
9 u8 id;
10};
11
12struct nouveau_volt {
13 struct nouveau_subdev base;
14
15 int (*vid_get)(struct nouveau_volt *);
16 int (*get)(struct nouveau_volt *);
17 int (*vid_set)(struct nouveau_volt *, u8 vid);
18 int (*set)(struct nouveau_volt *, u32 uv);
19 int (*set_id)(struct nouveau_volt *, u8 id, int condition);
20
21 u8 vid_mask;
22 u8 vid_nr;
23 struct {
24 u32 uv;
25 u8 vid;
26 } vid[256];
27};
28
29static inline struct nouveau_volt *
30nouveau_volt(void *obj)
31{
32 return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_VOLT];
33}
34
35#define nouveau_volt_create(p, e, o, d) \
36 nouveau_volt_create_((p), (e), (o), sizeof(**d), (void **)d)
37#define nouveau_volt_destroy(p) ({ \
38 struct nouveau_volt *v = (p); \
39 _nouveau_volt_dtor(nv_object(v)); \
40})
41#define nouveau_volt_init(p) ({ \
42 struct nouveau_volt *v = (p); \
43 _nouveau_volt_init(nv_object(v)); \
44})
45#define nouveau_volt_fini(p,s) \
46 nouveau_subdev_fini((p), (s))
47
48int nouveau_volt_create_(struct nouveau_object *, struct nouveau_object *,
49 struct nouveau_oclass *, int, void **);
50void _nouveau_volt_dtor(struct nouveau_object *);
51int _nouveau_volt_init(struct nouveau_object *);
52#define _nouveau_volt_fini _nouveau_subdev_fini
53
54extern struct nouveau_oclass nv40_volt_oclass;
55
56int nouveau_voltgpio_init(struct nouveau_volt *);
57int nouveau_voltgpio_get(struct nouveau_volt *);
58int nouveau_voltgpio_set(struct nouveau_volt *, u8);
59
60#endif
diff --git a/drivers/gpu/drm/nouveau/core/subdev/volt/base.c b/drivers/gpu/drm/nouveau/core/subdev/volt/base.c
new file mode 100644
index 000000000000..32794a999106
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/core/subdev/volt/base.c
@@ -0,0 +1,198 @@
1/*
2 * Copyright 2013 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/volt.h>
26
27#include <subdev/bios.h>
28#include <subdev/bios/vmap.h>
29#include <subdev/bios/volt.h>
30
31static int
32nouveau_volt_get(struct nouveau_volt *volt)
33{
34 if (volt->vid_get) {
35 int ret = volt->vid_get(volt), i;
36 if (ret >= 0) {
37 for (i = 0; i < volt->vid_nr; i++) {
38 if (volt->vid[i].vid == ret)
39 return volt->vid[i].uv;
40 }
41 ret = -EINVAL;
42 }
43 return ret;
44 }
45 return -ENODEV;
46}
47
48static int
49nouveau_volt_set(struct nouveau_volt *volt, u32 uv)
50{
51 if (volt->vid_set) {
52 int i, ret = -EINVAL;
53 for (i = 0; i < volt->vid_nr; i++) {
54 if (volt->vid[i].uv == uv) {
55 ret = volt->vid_set(volt, volt->vid[i].vid);
56 nv_debug(volt, "set %duv: %d\n", uv, ret);
57 break;
58 }
59 }
60 return ret;
61 }
62 return -ENODEV;
63}
64
65static int
66nouveau_volt_map(struct nouveau_volt *volt, u8 id)
67{
68 struct nouveau_bios *bios = nouveau_bios(volt);
69 struct nvbios_vmap_entry info;
70 u8 ver, len;
71 u16 vmap;
72
73 vmap = nvbios_vmap_entry_parse(bios, id, &ver, &len, &info);
74 if (vmap) {
75 if (info.link != 0xff) {
76 int ret = nouveau_volt_map(volt, info.link);
77 if (ret < 0)
78 return ret;
79 info.min += ret;
80 }
81 return info.min;
82 }
83
84 return id ? id * 10000 : -ENODEV;
85}
86
87static int
88nouveau_volt_set_id(struct nouveau_volt *volt, u8 id, int condition)
89{
90 int ret = nouveau_volt_map(volt, id);
91 if (ret >= 0) {
92 int prev = nouveau_volt_get(volt);
93 if (!condition || prev < 0 ||
94 (condition < 0 && ret < prev) ||
95 (condition > 0 && ret > prev)) {
96 ret = nouveau_volt_set(volt, ret);
97 } else {
98 ret = 0;
99 }
100 }
101 return ret;
102}
103
104int
105_nouveau_volt_init(struct nouveau_object *object)
106{
107 struct nouveau_volt *volt = (void *)object;
108 int ret;
109
110 ret = nouveau_subdev_init(&volt->base);
111 if (ret)
112 return ret;
113
114 ret = volt->get(volt);
115 if (ret < 0) {
116 if (ret != -ENODEV)
117 nv_debug(volt, "current voltage unknown\n");
118 return 0;
119 }
120
121 nv_info(volt, "GPU voltage: %duv\n", ret);
122 return 0;
123}
124
125void
126_nouveau_volt_dtor(struct nouveau_object *object)
127{
128 struct nouveau_volt *volt = (void *)object;
129 nouveau_subdev_destroy(&volt->base);
130}
131
132int
133nouveau_volt_create_(struct nouveau_object *parent,
134 struct nouveau_object *engine,
135 struct nouveau_oclass *oclass, int length, void **pobject)
136{
137 struct nouveau_bios *bios = nouveau_bios(parent);
138 struct nouveau_volt *volt;
139 struct nvbios_volt_entry ivid;
140 struct nvbios_volt info;
141 u8 ver, hdr, cnt, len;
142 u16 data;
143 int ret, i;
144
145 ret = nouveau_subdev_create_(parent, engine, oclass, 0, "VOLT",
146 "voltage", length, pobject);
147 volt = *pobject;
148 if (ret)
149 return ret;
150
151 volt->get = nouveau_volt_get;
152 volt->set = nouveau_volt_set;
153 volt->set_id = nouveau_volt_set_id;
154
155 data = nvbios_volt_parse(bios, &ver, &hdr, &cnt, &len, &info);
156 if (data && info.vidmask && info.base && info.step) {
157 for (i = 0; i < info.vidmask + 1; i++) {
158 if (info.base >= info.min &&
159 info.base <= info.max) {
160 volt->vid[volt->vid_nr].uv = info.base;
161 volt->vid[volt->vid_nr].vid = i;
162 volt->vid_nr++;
163 }
164 info.base += info.step;
165 }
166 volt->vid_mask = info.vidmask;
167 } else
168 if (data && info.vidmask) {
169 for (i = 0; i < cnt; i++) {
170 data = nvbios_volt_entry_parse(bios, i, &ver, &hdr,
171 &ivid);
172 if (data) {
173 volt->vid[volt->vid_nr].uv = ivid.voltage;
174 volt->vid[volt->vid_nr].vid = ivid.vid;
175 volt->vid_nr++;
176 }
177 }
178 volt->vid_mask = info.vidmask;
179 }
180
181 if (volt->vid_nr) {
182 for (i = 0; i < volt->vid_nr; i++) {
183 nv_debug(volt, "VID %02x: %duv\n",
184 volt->vid[i].vid, volt->vid[i].uv);
185 }
186
187 /*XXX: this is an assumption.. there probably exists boards
188 * out there with i2c-connected voltage controllers too..
189 */
190 ret = nouveau_voltgpio_init(volt);
191 if (ret == 0) {
192 volt->vid_get = nouveau_voltgpio_get;
193 volt->vid_set = nouveau_voltgpio_set;
194 }
195 }
196
197 return ret;
198}
diff --git a/drivers/gpu/drm/nouveau/core/subdev/volt/gpio.c b/drivers/gpu/drm/nouveau/core/subdev/volt/gpio.c
new file mode 100644
index 000000000000..755fa91bcd09
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/core/subdev/volt/gpio.c
@@ -0,0 +1,96 @@
1/*
2 * Copyright 2013 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/volt.h>
26#include <subdev/gpio.h>
27#include <subdev/bios/gpio.h>
28
29static const u8 tags[] = {
30 DCB_GPIO_VID0, DCB_GPIO_VID1, DCB_GPIO_VID2, DCB_GPIO_VID3,
31 DCB_GPIO_VID4, DCB_GPIO_VID5, DCB_GPIO_VID6, DCB_GPIO_VID7,
32};
33
34int
35nouveau_voltgpio_get(struct nouveau_volt *volt)
36{
37 struct nouveau_gpio *gpio = nouveau_gpio(volt);
38 u8 vid = 0;
39 int i;
40
41 for (i = 0; i < ARRAY_SIZE(tags); i++) {
42 if (volt->vid_mask & (1 << i)) {
43 int ret = gpio->get(gpio, 0, tags[i], 0xff);
44 if (ret < 0)
45 return ret;
46 vid |= ret << i;
47 }
48 }
49
50 return vid;
51}
52
53int
54nouveau_voltgpio_set(struct nouveau_volt *volt, u8 vid)
55{
56 struct nouveau_gpio *gpio = nouveau_gpio(volt);
57 int i;
58
59 for (i = 0; i < ARRAY_SIZE(tags); i++, vid >>= 1) {
60 if (volt->vid_mask & (1 << i)) {
61 int ret = gpio->set(gpio, 0, tags[i], 0xff, vid & 1);
62 if (ret < 0)
63 return ret;
64 }
65 }
66
67 return 0;
68}
69
70int
71nouveau_voltgpio_init(struct nouveau_volt *volt)
72{
73 struct nouveau_gpio *gpio = nouveau_gpio(volt);
74 struct dcb_gpio_func func;
75 int i;
76
77 /* check we have gpio function info for each vid bit. on some
78 * boards (ie. nvs295) the vid mask has more bits than there
79 * are valid gpio functions... from traces, nvidia appear to
80 * just touch the existing ones, so let's mask off the invalid
81 * bits and continue with life
82 */
83 for (i = 0; i < ARRAY_SIZE(tags); i++) {
84 if (volt->vid_mask & (1 << i)) {
85 int ret = gpio->find(gpio, 0, tags[i], 0xff, &func);
86 if (ret) {
87 if (ret != -ENOENT)
88 return ret;
89 nv_debug(volt, "VID bit %d has no GPIO\n", i);
90 volt->vid_mask &= ~(1 << i);
91 }
92 }
93 }
94
95 return 0;
96}
diff --git a/drivers/gpu/drm/nouveau/core/subdev/volt/nv40.c b/drivers/gpu/drm/nouveau/core/subdev/volt/nv40.c
new file mode 100644
index 000000000000..87d5358376a6
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/core/subdev/volt/nv40.c
@@ -0,0 +1,56 @@
1/*
2 * Copyright 2013 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/volt.h>
26
27struct nv40_volt_priv {
28 struct nouveau_volt base;
29};
30
31static int
32nv40_volt_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
33 struct nouveau_oclass *oclass, void *data, u32 size,
34 struct nouveau_object **pobject)
35{
36 struct nv40_volt_priv *priv;
37 int ret;
38
39 ret = nouveau_volt_create(parent, engine, oclass, &priv);
40 *pobject = nv_object(priv);
41 if (ret)
42 return ret;
43
44 return 0;
45}
46
47struct nouveau_oclass
48nv40_volt_oclass = {
49 .handle = NV_SUBDEV(VOLT, 0x40),
50 .ofuncs = &(struct nouveau_ofuncs) {
51 .ctor = nv40_volt_ctor,
52 .dtor = _nouveau_volt_dtor,
53 .init = _nouveau_volt_init,
54 .fini = _nouveau_volt_fini,
55 },
56};