diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-02-07 18:34:56 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2013-11-08 00:40:17 -0500 |
commit | c9c0ccae48e27b767e98a4c120976e43195dd3a7 (patch) | |
tree | f6d53465e4acbd033814f1c32c75b0abe6e1031a | |
parent | 0833428e7d1b250afbd41e0a4c8c247cccd15aad (diff) |
drm/nouveau/volt: implement voltage control in core
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/Makefile | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/device/nv40.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/device/nv50.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/device/nvc0.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/device/nve0.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/include/subdev/volt.h | 60 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/volt/base.c | 198 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/volt/gpio.c | 96 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/volt/nv40.c | 56 |
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 | |||
162 | nouveau-y += core/subdev/vm/nv44.o | 162 | nouveau-y += core/subdev/vm/nv44.o |
163 | nouveau-y += core/subdev/vm/nv50.o | 163 | nouveau-y += core/subdev/vm/nv50.o |
164 | nouveau-y += core/subdev/vm/nvc0.o | 164 | nouveau-y += core/subdev/vm/nvc0.o |
165 | nouveau-y += core/subdev/volt/base.o | ||
166 | nouveau-y += core/subdev/volt/gpio.o | ||
167 | nouveau-y += core/subdev/volt/nv40.o | ||
165 | 168 | ||
166 | nouveau-y += core/engine/falcon.o | 169 | nouveau-y += core/engine/falcon.o |
167 | nouveau-y += core/engine/xtensa.o | 170 | nouveau-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 | |||
7 | struct nouveau_voltage { | ||
8 | u32 uv; | ||
9 | u8 id; | ||
10 | }; | ||
11 | |||
12 | struct 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 | |||
29 | static inline struct nouveau_volt * | ||
30 | nouveau_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 | |||
48 | int nouveau_volt_create_(struct nouveau_object *, struct nouveau_object *, | ||
49 | struct nouveau_oclass *, int, void **); | ||
50 | void _nouveau_volt_dtor(struct nouveau_object *); | ||
51 | int _nouveau_volt_init(struct nouveau_object *); | ||
52 | #define _nouveau_volt_fini _nouveau_subdev_fini | ||
53 | |||
54 | extern struct nouveau_oclass nv40_volt_oclass; | ||
55 | |||
56 | int nouveau_voltgpio_init(struct nouveau_volt *); | ||
57 | int nouveau_voltgpio_get(struct nouveau_volt *); | ||
58 | int 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 | |||
31 | static int | ||
32 | nouveau_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 | |||
48 | static int | ||
49 | nouveau_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 | |||
65 | static int | ||
66 | nouveau_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 | |||
87 | static int | ||
88 | nouveau_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 | |||
104 | int | ||
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 | |||
125 | void | ||
126 | _nouveau_volt_dtor(struct nouveau_object *object) | ||
127 | { | ||
128 | struct nouveau_volt *volt = (void *)object; | ||
129 | nouveau_subdev_destroy(&volt->base); | ||
130 | } | ||
131 | |||
132 | int | ||
133 | nouveau_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 | |||
29 | static 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 | |||
34 | int | ||
35 | nouveau_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 | |||
53 | int | ||
54 | nouveau_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 | |||
70 | int | ||
71 | nouveau_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 | |||
27 | struct nv40_volt_priv { | ||
28 | struct nouveau_volt base; | ||
29 | }; | ||
30 | |||
31 | static int | ||
32 | nv40_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 | |||
47 | struct nouveau_oclass | ||
48 | nv40_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 | }; | ||