diff options
author | Dave Airlie <airlied@redhat.com> | 2012-07-25 20:35:44 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-07-25 20:35:44 -0400 |
commit | 2536f7dc42556f63ee45b14e7d2d9696200f317a (patch) | |
tree | 8d920a5a95a561db6fa5933953ee5b5dff140c12 | |
parent | fcedac670c3da0d17aaa5db1708694971e8024a9 (diff) | |
parent | 715855457e6bc93e148caf8cb3b5dcabbf605b0d (diff) |
Merge branch 'drm-nouveau-fixes' of git://anongit.freedesktop.org/git/nouveau/linux-2.6 into drm-next
* 'drm-nouveau-fixes' of git://anongit.freedesktop.org/git/nouveau/linux-2.6:
drm/nouveau: init vblank requests list
drm/nv50: extend vblank semaphore to generic dmaobj + offset pair
drm/nouveau: mark most of our ioctls as deprecated, move to compat layer
drm/nouveau: move current gpuobj code out of nouveau_object.c
drm/nouveau/gem: fix object reference leak in a failure path
drm/nv50: rename INVALID_QUERY_OR_TEXTURE error to INVALID_OPERATION
drm/nv84: decode PCRYPT errors
drm/nouveau: dcb table quirk for fdo#50830
nouveau: Fix alignment requirements on src and dst addresses
21 files changed, 592 insertions, 429 deletions
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile index fe5267d06ab5..1cece6a78f39 100644 --- a/drivers/gpu/drm/nouveau/Makefile +++ b/drivers/gpu/drm/nouveau/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | ccflags-y := -Iinclude/drm | 5 | ccflags-y := -Iinclude/drm |
6 | nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \ | 6 | nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \ |
7 | nouveau_object.o nouveau_irq.o nouveau_notifier.o \ | 7 | nouveau_gpuobj.o nouveau_irq.o nouveau_notifier.o \ |
8 | nouveau_sgdma.o nouveau_dma.o nouveau_util.o \ | 8 | nouveau_sgdma.o nouveau_dma.o nouveau_util.o \ |
9 | nouveau_bo.o nouveau_fence.o nouveau_gem.o nouveau_ttm.o \ | 9 | nouveau_bo.o nouveau_fence.o nouveau_gem.o nouveau_ttm.o \ |
10 | nouveau_hw.o nouveau_calc.o nouveau_bios.o nouveau_i2c.o \ | 10 | nouveau_hw.o nouveau_calc.o nouveau_bios.o nouveau_i2c.o \ |
@@ -12,6 +12,7 @@ nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \ | |||
12 | nouveau_hdmi.o nouveau_dp.o nouveau_ramht.o \ | 12 | nouveau_hdmi.o nouveau_dp.o nouveau_ramht.o \ |
13 | nouveau_pm.o nouveau_volt.o nouveau_perf.o nouveau_temp.o \ | 13 | nouveau_pm.o nouveau_volt.o nouveau_perf.o nouveau_temp.o \ |
14 | nouveau_mm.o nouveau_vm.o nouveau_mxm.o nouveau_gpio.o \ | 14 | nouveau_mm.o nouveau_vm.o nouveau_mxm.o nouveau_gpio.o \ |
15 | nouveau_abi16.o \ | ||
15 | nv04_timer.o \ | 16 | nv04_timer.o \ |
16 | nv04_mc.o nv40_mc.o nv50_mc.o \ | 17 | nv04_mc.o nv40_mc.o nv50_mc.o \ |
17 | nv04_fb.o nv10_fb.o nv20_fb.o nv30_fb.o nv40_fb.o \ | 18 | nv04_fb.o nv10_fb.o nv20_fb.o nv30_fb.o nv40_fb.o \ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c new file mode 100644 index 000000000000..ff23d88880e5 --- /dev/null +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c | |||
@@ -0,0 +1,245 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Red Hat Inc. | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
5 | * copy of this software and associated documentation files (the "Software"), | ||
6 | * to deal in the Software without restriction, including without limitation | ||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
8 | * and/or sell copies of the Software, and to permit persons to whom the | ||
9 | * Software is furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | #include "drmP.h" | ||
25 | |||
26 | #include "nouveau_drv.h" | ||
27 | #include "nouveau_dma.h" | ||
28 | #include "nouveau_abi16.h" | ||
29 | #include "nouveau_ramht.h" | ||
30 | #include "nouveau_software.h" | ||
31 | |||
32 | int | ||
33 | nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS) | ||
34 | { | ||
35 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
36 | struct drm_nouveau_getparam *getparam = data; | ||
37 | |||
38 | switch (getparam->param) { | ||
39 | case NOUVEAU_GETPARAM_CHIPSET_ID: | ||
40 | getparam->value = dev_priv->chipset; | ||
41 | break; | ||
42 | case NOUVEAU_GETPARAM_PCI_VENDOR: | ||
43 | getparam->value = dev->pci_vendor; | ||
44 | break; | ||
45 | case NOUVEAU_GETPARAM_PCI_DEVICE: | ||
46 | getparam->value = dev->pci_device; | ||
47 | break; | ||
48 | case NOUVEAU_GETPARAM_BUS_TYPE: | ||
49 | if (drm_pci_device_is_agp(dev)) | ||
50 | getparam->value = 0; | ||
51 | else | ||
52 | if (!pci_is_pcie(dev->pdev)) | ||
53 | getparam->value = 1; | ||
54 | else | ||
55 | getparam->value = 2; | ||
56 | break; | ||
57 | case NOUVEAU_GETPARAM_FB_SIZE: | ||
58 | getparam->value = dev_priv->fb_available_size; | ||
59 | break; | ||
60 | case NOUVEAU_GETPARAM_AGP_SIZE: | ||
61 | getparam->value = dev_priv->gart_info.aper_size; | ||
62 | break; | ||
63 | case NOUVEAU_GETPARAM_VM_VRAM_BASE: | ||
64 | getparam->value = 0; /* deprecated */ | ||
65 | break; | ||
66 | case NOUVEAU_GETPARAM_PTIMER_TIME: | ||
67 | getparam->value = dev_priv->engine.timer.read(dev); | ||
68 | break; | ||
69 | case NOUVEAU_GETPARAM_HAS_BO_USAGE: | ||
70 | getparam->value = 1; | ||
71 | break; | ||
72 | case NOUVEAU_GETPARAM_HAS_PAGEFLIP: | ||
73 | getparam->value = 1; | ||
74 | break; | ||
75 | case NOUVEAU_GETPARAM_GRAPH_UNITS: | ||
76 | /* NV40 and NV50 versions are quite different, but register | ||
77 | * address is the same. User is supposed to know the card | ||
78 | * family anyway... */ | ||
79 | if (dev_priv->chipset >= 0x40) { | ||
80 | getparam->value = nv_rd32(dev, NV40_PMC_GRAPH_UNITS); | ||
81 | break; | ||
82 | } | ||
83 | /* FALLTHRU */ | ||
84 | default: | ||
85 | NV_DEBUG(dev, "unknown parameter %lld\n", getparam->param); | ||
86 | return -EINVAL; | ||
87 | } | ||
88 | |||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | int | ||
93 | nouveau_abi16_ioctl_setparam(ABI16_IOCTL_ARGS) | ||
94 | { | ||
95 | return -EINVAL; | ||
96 | } | ||
97 | |||
98 | int | ||
99 | nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS) | ||
100 | { | ||
101 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
102 | struct drm_nouveau_channel_alloc *init = data; | ||
103 | struct nouveau_channel *chan; | ||
104 | int ret; | ||
105 | |||
106 | if (!dev_priv->eng[NVOBJ_ENGINE_GR]) | ||
107 | return -ENODEV; | ||
108 | |||
109 | if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) | ||
110 | return -EINVAL; | ||
111 | |||
112 | ret = nouveau_channel_alloc(dev, &chan, file_priv, | ||
113 | init->fb_ctxdma_handle, | ||
114 | init->tt_ctxdma_handle); | ||
115 | if (ret) | ||
116 | return ret; | ||
117 | init->channel = chan->id; | ||
118 | |||
119 | if (nouveau_vram_pushbuf == 0) { | ||
120 | if (chan->dma.ib_max) | ||
121 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM | | ||
122 | NOUVEAU_GEM_DOMAIN_GART; | ||
123 | else if (chan->pushbuf_bo->bo.mem.mem_type == TTM_PL_VRAM) | ||
124 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM; | ||
125 | else | ||
126 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART; | ||
127 | } else { | ||
128 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM; | ||
129 | } | ||
130 | |||
131 | if (dev_priv->card_type < NV_C0) { | ||
132 | init->subchan[0].handle = 0x00000000; | ||
133 | init->subchan[0].grclass = 0x0000; | ||
134 | init->subchan[1].handle = NvSw; | ||
135 | init->subchan[1].grclass = NV_SW; | ||
136 | init->nr_subchan = 2; | ||
137 | } | ||
138 | |||
139 | /* Named memory object area */ | ||
140 | ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem, | ||
141 | &init->notifier_handle); | ||
142 | |||
143 | if (ret == 0) | ||
144 | atomic_inc(&chan->users); /* userspace reference */ | ||
145 | nouveau_channel_put(&chan); | ||
146 | return ret; | ||
147 | } | ||
148 | |||
149 | int | ||
150 | nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS) | ||
151 | { | ||
152 | struct drm_nouveau_channel_free *req = data; | ||
153 | struct nouveau_channel *chan; | ||
154 | |||
155 | chan = nouveau_channel_get(file_priv, req->channel); | ||
156 | if (IS_ERR(chan)) | ||
157 | return PTR_ERR(chan); | ||
158 | |||
159 | list_del(&chan->list); | ||
160 | atomic_dec(&chan->users); | ||
161 | nouveau_channel_put(&chan); | ||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | int | ||
166 | nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS) | ||
167 | { | ||
168 | struct drm_nouveau_grobj_alloc *init = data; | ||
169 | struct nouveau_channel *chan; | ||
170 | int ret; | ||
171 | |||
172 | if (init->handle == ~0) | ||
173 | return -EINVAL; | ||
174 | |||
175 | /* compatibility with userspace that assumes 506e for all chipsets */ | ||
176 | if (init->class == 0x506e) { | ||
177 | init->class = nouveau_software_class(dev); | ||
178 | if (init->class == 0x906e) | ||
179 | return 0; | ||
180 | } else | ||
181 | if (init->class == 0x906e) { | ||
182 | NV_ERROR(dev, "906e not supported yet\n"); | ||
183 | return -EINVAL; | ||
184 | } | ||
185 | |||
186 | chan = nouveau_channel_get(file_priv, init->channel); | ||
187 | if (IS_ERR(chan)) | ||
188 | return PTR_ERR(chan); | ||
189 | |||
190 | if (nouveau_ramht_find(chan, init->handle)) { | ||
191 | ret = -EEXIST; | ||
192 | goto out; | ||
193 | } | ||
194 | |||
195 | ret = nouveau_gpuobj_gr_new(chan, init->handle, init->class); | ||
196 | if (ret) { | ||
197 | NV_ERROR(dev, "Error creating object: %d (%d/0x%08x)\n", | ||
198 | ret, init->channel, init->handle); | ||
199 | } | ||
200 | |||
201 | out: | ||
202 | nouveau_channel_put(&chan); | ||
203 | return ret; | ||
204 | } | ||
205 | |||
206 | int | ||
207 | nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS) | ||
208 | { | ||
209 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
210 | struct drm_nouveau_notifierobj_alloc *na = data; | ||
211 | struct nouveau_channel *chan; | ||
212 | int ret; | ||
213 | |||
214 | /* completely unnecessary for these chipsets... */ | ||
215 | if (unlikely(dev_priv->card_type >= NV_C0)) | ||
216 | return -EINVAL; | ||
217 | |||
218 | chan = nouveau_channel_get(file_priv, na->channel); | ||
219 | if (IS_ERR(chan)) | ||
220 | return PTR_ERR(chan); | ||
221 | |||
222 | ret = nouveau_notifier_alloc(chan, na->handle, na->size, 0, 0x1000, | ||
223 | &na->offset); | ||
224 | nouveau_channel_put(&chan); | ||
225 | return ret; | ||
226 | } | ||
227 | |||
228 | int | ||
229 | nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS) | ||
230 | { | ||
231 | struct drm_nouveau_gpuobj_free *objfree = data; | ||
232 | struct nouveau_channel *chan; | ||
233 | int ret; | ||
234 | |||
235 | chan = nouveau_channel_get(file_priv, objfree->channel); | ||
236 | if (IS_ERR(chan)) | ||
237 | return PTR_ERR(chan); | ||
238 | |||
239 | /* Synchronize with the user channel */ | ||
240 | nouveau_channel_idle(chan); | ||
241 | |||
242 | ret = nouveau_ramht_remove(chan, objfree->handle); | ||
243 | nouveau_channel_put(&chan); | ||
244 | return ret; | ||
245 | } | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.h b/drivers/gpu/drm/nouveau/nouveau_abi16.h new file mode 100644 index 000000000000..e6328b008a8c --- /dev/null +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.h | |||
@@ -0,0 +1,83 @@ | |||
1 | #ifndef __NOUVEAU_ABI16_H__ | ||
2 | #define __NOUVEAU_ABI16_H__ | ||
3 | |||
4 | #define ABI16_IOCTL_ARGS \ | ||
5 | struct drm_device *dev, void *data, struct drm_file *file_priv | ||
6 | int nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS); | ||
7 | int nouveau_abi16_ioctl_setparam(ABI16_IOCTL_ARGS); | ||
8 | int nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS); | ||
9 | int nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS); | ||
10 | int nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS); | ||
11 | int nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS); | ||
12 | int nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS); | ||
13 | |||
14 | struct drm_nouveau_channel_alloc { | ||
15 | uint32_t fb_ctxdma_handle; | ||
16 | uint32_t tt_ctxdma_handle; | ||
17 | |||
18 | int channel; | ||
19 | uint32_t pushbuf_domains; | ||
20 | |||
21 | /* Notifier memory */ | ||
22 | uint32_t notifier_handle; | ||
23 | |||
24 | /* DRM-enforced subchannel assignments */ | ||
25 | struct { | ||
26 | uint32_t handle; | ||
27 | uint32_t grclass; | ||
28 | } subchan[8]; | ||
29 | uint32_t nr_subchan; | ||
30 | }; | ||
31 | |||
32 | struct drm_nouveau_channel_free { | ||
33 | int channel; | ||
34 | }; | ||
35 | |||
36 | struct drm_nouveau_grobj_alloc { | ||
37 | int channel; | ||
38 | uint32_t handle; | ||
39 | int class; | ||
40 | }; | ||
41 | |||
42 | struct drm_nouveau_notifierobj_alloc { | ||
43 | uint32_t channel; | ||
44 | uint32_t handle; | ||
45 | uint32_t size; | ||
46 | uint32_t offset; | ||
47 | }; | ||
48 | |||
49 | struct drm_nouveau_gpuobj_free { | ||
50 | int channel; | ||
51 | uint32_t handle; | ||
52 | }; | ||
53 | |||
54 | #define NOUVEAU_GETPARAM_PCI_VENDOR 3 | ||
55 | #define NOUVEAU_GETPARAM_PCI_DEVICE 4 | ||
56 | #define NOUVEAU_GETPARAM_BUS_TYPE 5 | ||
57 | #define NOUVEAU_GETPARAM_FB_SIZE 8 | ||
58 | #define NOUVEAU_GETPARAM_AGP_SIZE 9 | ||
59 | #define NOUVEAU_GETPARAM_CHIPSET_ID 11 | ||
60 | #define NOUVEAU_GETPARAM_VM_VRAM_BASE 12 | ||
61 | #define NOUVEAU_GETPARAM_GRAPH_UNITS 13 | ||
62 | #define NOUVEAU_GETPARAM_PTIMER_TIME 14 | ||
63 | #define NOUVEAU_GETPARAM_HAS_BO_USAGE 15 | ||
64 | #define NOUVEAU_GETPARAM_HAS_PAGEFLIP 16 | ||
65 | struct drm_nouveau_getparam { | ||
66 | uint64_t param; | ||
67 | uint64_t value; | ||
68 | }; | ||
69 | |||
70 | struct drm_nouveau_setparam { | ||
71 | uint64_t param; | ||
72 | uint64_t value; | ||
73 | }; | ||
74 | |||
75 | #define DRM_IOCTL_NOUVEAU_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GETPARAM, struct drm_nouveau_getparam) | ||
76 | #define DRM_IOCTL_NOUVEAU_SETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SETPARAM, struct drm_nouveau_setparam) | ||
77 | #define DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_CHANNEL_ALLOC, struct drm_nouveau_channel_alloc) | ||
78 | #define DRM_IOCTL_NOUVEAU_CHANNEL_FREE DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_CHANNEL_FREE, struct drm_nouveau_channel_free) | ||
79 | #define DRM_IOCTL_NOUVEAU_GROBJ_ALLOC DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GROBJ_ALLOC, struct drm_nouveau_grobj_alloc) | ||
80 | #define DRM_IOCTL_NOUVEAU_NOTIFIEROBJ_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_NOTIFIEROBJ_ALLOC, struct drm_nouveau_notifierobj_alloc) | ||
81 | #define DRM_IOCTL_NOUVEAU_GPUOBJ_FREE DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GPUOBJ_FREE, struct drm_nouveau_gpuobj_free) | ||
82 | |||
83 | #endif | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index 2f11e16a81a9..a0a3fe3c016b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
@@ -6091,6 +6091,18 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf) | |||
6091 | } | 6091 | } |
6092 | } | 6092 | } |
6093 | 6093 | ||
6094 | /* fdo#50830: connector indices for VGA and DVI-I are backwards */ | ||
6095 | if (nv_match_device(dev, 0x0421, 0x3842, 0xc793)) { | ||
6096 | if (idx == 0 && *conn == 0x02000300) | ||
6097 | *conn = 0x02011300; | ||
6098 | else | ||
6099 | if (idx == 1 && *conn == 0x04011310) | ||
6100 | *conn = 0x04000310; | ||
6101 | else | ||
6102 | if (idx == 2 && *conn == 0x02011312) | ||
6103 | *conn = 0x02000312; | ||
6104 | } | ||
6105 | |||
6094 | return true; | 6106 | return true; |
6095 | } | 6107 | } |
6096 | 6108 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c index 629d8a2df5bd..debd90225a88 100644 --- a/drivers/gpu/drm/nouveau/nouveau_channel.c +++ b/drivers/gpu/drm/nouveau/nouveau_channel.c | |||
@@ -395,98 +395,3 @@ nouveau_channel_cleanup(struct drm_device *dev, struct drm_file *file_priv) | |||
395 | nouveau_channel_put(&chan); | 395 | nouveau_channel_put(&chan); |
396 | } | 396 | } |
397 | } | 397 | } |
398 | |||
399 | |||
400 | /*********************************** | ||
401 | * ioctls wrapping the functions | ||
402 | ***********************************/ | ||
403 | |||
404 | static int | ||
405 | nouveau_ioctl_fifo_alloc(struct drm_device *dev, void *data, | ||
406 | struct drm_file *file_priv) | ||
407 | { | ||
408 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
409 | struct drm_nouveau_channel_alloc *init = data; | ||
410 | struct nouveau_channel *chan; | ||
411 | int ret; | ||
412 | |||
413 | if (!dev_priv->eng[NVOBJ_ENGINE_GR]) | ||
414 | return -ENODEV; | ||
415 | |||
416 | if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) | ||
417 | return -EINVAL; | ||
418 | |||
419 | ret = nouveau_channel_alloc(dev, &chan, file_priv, | ||
420 | init->fb_ctxdma_handle, | ||
421 | init->tt_ctxdma_handle); | ||
422 | if (ret) | ||
423 | return ret; | ||
424 | init->channel = chan->id; | ||
425 | |||
426 | if (nouveau_vram_pushbuf == 0) { | ||
427 | if (chan->dma.ib_max) | ||
428 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM | | ||
429 | NOUVEAU_GEM_DOMAIN_GART; | ||
430 | else if (chan->pushbuf_bo->bo.mem.mem_type == TTM_PL_VRAM) | ||
431 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM; | ||
432 | else | ||
433 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART; | ||
434 | } else { | ||
435 | init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM; | ||
436 | } | ||
437 | |||
438 | if (dev_priv->card_type < NV_C0) { | ||
439 | init->subchan[0].handle = 0x00000000; | ||
440 | init->subchan[0].grclass = 0x0000; | ||
441 | init->subchan[1].handle = NvSw; | ||
442 | init->subchan[1].grclass = NV_SW; | ||
443 | init->nr_subchan = 2; | ||
444 | } | ||
445 | |||
446 | /* Named memory object area */ | ||
447 | ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem, | ||
448 | &init->notifier_handle); | ||
449 | |||
450 | if (ret == 0) | ||
451 | atomic_inc(&chan->users); /* userspace reference */ | ||
452 | nouveau_channel_put(&chan); | ||
453 | return ret; | ||
454 | } | ||
455 | |||
456 | static int | ||
457 | nouveau_ioctl_fifo_free(struct drm_device *dev, void *data, | ||
458 | struct drm_file *file_priv) | ||
459 | { | ||
460 | struct drm_nouveau_channel_free *req = data; | ||
461 | struct nouveau_channel *chan; | ||
462 | |||
463 | chan = nouveau_channel_get(file_priv, req->channel); | ||
464 | if (IS_ERR(chan)) | ||
465 | return PTR_ERR(chan); | ||
466 | |||
467 | list_del(&chan->list); | ||
468 | atomic_dec(&chan->users); | ||
469 | nouveau_channel_put(&chan); | ||
470 | return 0; | ||
471 | } | ||
472 | |||
473 | /*********************************** | ||
474 | * finally, the ioctl table | ||
475 | ***********************************/ | ||
476 | |||
477 | struct drm_ioctl_desc nouveau_ioctls[] = { | ||
478 | DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_ioctl_getparam, DRM_UNLOCKED|DRM_AUTH), | ||
479 | DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_ioctl_setparam, DRM_UNLOCKED|DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), | ||
480 | DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_ioctl_fifo_alloc, DRM_UNLOCKED|DRM_AUTH), | ||
481 | DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_ioctl_fifo_free, DRM_UNLOCKED|DRM_AUTH), | ||
482 | DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_ioctl_grobj_alloc, DRM_UNLOCKED|DRM_AUTH), | ||
483 | DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_ioctl_notifier_alloc, DRM_UNLOCKED|DRM_AUTH), | ||
484 | DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_ioctl_gpuobj_free, DRM_UNLOCKED|DRM_AUTH), | ||
485 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_UNLOCKED|DRM_AUTH), | ||
486 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_UNLOCKED|DRM_AUTH), | ||
487 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_UNLOCKED|DRM_AUTH), | ||
488 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_UNLOCKED|DRM_AUTH), | ||
489 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_UNLOCKED|DRM_AUTH), | ||
490 | }; | ||
491 | |||
492 | int nouveau_max_ioctl = DRM_ARRAY_SIZE(nouveau_ioctls); | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c index b4d1b4afcac5..9a36f5f39b06 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.c +++ b/drivers/gpu/drm/nouveau/nouveau_drv.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include "drm.h" | 29 | #include "drm.h" |
30 | #include "drm_crtc_helper.h" | 30 | #include "drm_crtc_helper.h" |
31 | #include "nouveau_drv.h" | 31 | #include "nouveau_drv.h" |
32 | #include "nouveau_abi16.h" | ||
32 | #include "nouveau_hw.h" | 33 | #include "nouveau_hw.h" |
33 | #include "nouveau_fb.h" | 34 | #include "nouveau_fb.h" |
34 | #include "nouveau_fbcon.h" | 35 | #include "nouveau_fbcon.h" |
@@ -384,6 +385,21 @@ nouveau_pci_resume(struct pci_dev *pdev) | |||
384 | return 0; | 385 | return 0; |
385 | } | 386 | } |
386 | 387 | ||
388 | static struct drm_ioctl_desc nouveau_ioctls[] = { | ||
389 | DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_abi16_ioctl_getparam, DRM_UNLOCKED|DRM_AUTH), | ||
390 | DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_abi16_ioctl_setparam, DRM_UNLOCKED|DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), | ||
391 | DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_abi16_ioctl_channel_alloc, DRM_UNLOCKED|DRM_AUTH), | ||
392 | DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_abi16_ioctl_channel_free, DRM_UNLOCKED|DRM_AUTH), | ||
393 | DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_abi16_ioctl_grobj_alloc, DRM_UNLOCKED|DRM_AUTH), | ||
394 | DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_abi16_ioctl_notifierobj_alloc, DRM_UNLOCKED|DRM_AUTH), | ||
395 | DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_abi16_ioctl_gpuobj_free, DRM_UNLOCKED|DRM_AUTH), | ||
396 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_UNLOCKED|DRM_AUTH), | ||
397 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_UNLOCKED|DRM_AUTH), | ||
398 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_UNLOCKED|DRM_AUTH), | ||
399 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_UNLOCKED|DRM_AUTH), | ||
400 | DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_UNLOCKED|DRM_AUTH), | ||
401 | }; | ||
402 | |||
387 | static const struct file_operations nouveau_driver_fops = { | 403 | static const struct file_operations nouveau_driver_fops = { |
388 | .owner = THIS_MODULE, | 404 | .owner = THIS_MODULE, |
389 | .open = drm_open, | 405 | .open = drm_open, |
@@ -462,7 +478,7 @@ static struct pci_driver nouveau_pci_driver = { | |||
462 | 478 | ||
463 | static int __init nouveau_init(void) | 479 | static int __init nouveau_init(void) |
464 | { | 480 | { |
465 | driver.num_ioctls = nouveau_max_ioctl; | 481 | driver.num_ioctls = ARRAY_SIZE(nouveau_ioctls); |
466 | 482 | ||
467 | if (nouveau_modeset == -1) { | 483 | if (nouveau_modeset == -1) { |
468 | #ifdef CONFIG_VGA_CONSOLE | 484 | #ifdef CONFIG_VGA_CONSOLE |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 8613cb23808c..4f2cc95ce264 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
@@ -689,8 +689,6 @@ struct drm_nouveau_private { | |||
689 | void (*irq_handler[32])(struct drm_device *); | 689 | void (*irq_handler[32])(struct drm_device *); |
690 | bool msi_enabled; | 690 | bool msi_enabled; |
691 | 691 | ||
692 | struct list_head vbl_waiting; | ||
693 | |||
694 | struct { | 692 | struct { |
695 | struct drm_global_reference mem_global_ref; | 693 | struct drm_global_reference mem_global_ref; |
696 | struct ttm_bo_global_ref bo_global_ref; | 694 | struct ttm_bo_global_ref bo_global_ref; |
@@ -872,10 +870,6 @@ extern int nouveau_load(struct drm_device *, unsigned long flags); | |||
872 | extern int nouveau_firstopen(struct drm_device *); | 870 | extern int nouveau_firstopen(struct drm_device *); |
873 | extern void nouveau_lastclose(struct drm_device *); | 871 | extern void nouveau_lastclose(struct drm_device *); |
874 | extern int nouveau_unload(struct drm_device *); | 872 | extern int nouveau_unload(struct drm_device *); |
875 | extern int nouveau_ioctl_getparam(struct drm_device *, void *data, | ||
876 | struct drm_file *); | ||
877 | extern int nouveau_ioctl_setparam(struct drm_device *, void *data, | ||
878 | struct drm_file *); | ||
879 | extern bool nouveau_wait_eq(struct drm_device *, uint64_t timeout, | 873 | extern bool nouveau_wait_eq(struct drm_device *, uint64_t timeout, |
880 | uint32_t reg, uint32_t mask, uint32_t val); | 874 | uint32_t reg, uint32_t mask, uint32_t val); |
881 | extern bool nouveau_wait_ne(struct drm_device *, uint64_t timeout, | 875 | extern bool nouveau_wait_ne(struct drm_device *, uint64_t timeout, |
@@ -914,15 +908,8 @@ extern void nouveau_notifier_takedown_channel(struct nouveau_channel *); | |||
914 | extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, | 908 | extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, |
915 | int cout, uint32_t start, uint32_t end, | 909 | int cout, uint32_t start, uint32_t end, |
916 | uint32_t *offset); | 910 | uint32_t *offset); |
917 | extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *); | ||
918 | extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data, | ||
919 | struct drm_file *); | ||
920 | extern int nouveau_ioctl_notifier_free(struct drm_device *, void *data, | ||
921 | struct drm_file *); | ||
922 | 911 | ||
923 | /* nouveau_channel.c */ | 912 | /* nouveau_channel.c */ |
924 | extern struct drm_ioctl_desc nouveau_ioctls[]; | ||
925 | extern int nouveau_max_ioctl; | ||
926 | extern void nouveau_channel_cleanup(struct drm_device *, struct drm_file *); | 913 | extern void nouveau_channel_cleanup(struct drm_device *, struct drm_file *); |
927 | extern int nouveau_channel_alloc(struct drm_device *dev, | 914 | extern int nouveau_channel_alloc(struct drm_device *dev, |
928 | struct nouveau_channel **chan, | 915 | struct nouveau_channel **chan, |
@@ -938,7 +925,7 @@ extern void nouveau_channel_ref(struct nouveau_channel *chan, | |||
938 | struct nouveau_channel **pchan); | 925 | struct nouveau_channel **pchan); |
939 | extern int nouveau_channel_idle(struct nouveau_channel *chan); | 926 | extern int nouveau_channel_idle(struct nouveau_channel *chan); |
940 | 927 | ||
941 | /* nouveau_object.c */ | 928 | /* nouveau_gpuobj.c */ |
942 | #define NVOBJ_ENGINE_ADD(d, e, p) do { \ | 929 | #define NVOBJ_ENGINE_ADD(d, e, p) do { \ |
943 | struct drm_nouveau_private *dev_priv = (d)->dev_private; \ | 930 | struct drm_nouveau_private *dev_priv = (d)->dev_private; \ |
944 | dev_priv->eng[NVOBJ_ENGINE_##e] = (p); \ | 931 | dev_priv->eng[NVOBJ_ENGINE_##e] = (p); \ |
@@ -993,10 +980,6 @@ extern int nv50_gpuobj_dma_new(struct nouveau_channel *, int class, u64 base, | |||
993 | extern void nv50_gpuobj_dma_init(struct nouveau_gpuobj *, u32 offset, | 980 | extern void nv50_gpuobj_dma_init(struct nouveau_gpuobj *, u32 offset, |
994 | int class, u64 base, u64 size, int target, | 981 | int class, u64 base, u64 size, int target, |
995 | int access, u32 type, u32 comp); | 982 | int access, u32 type, u32 comp); |
996 | extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data, | ||
997 | struct drm_file *); | ||
998 | extern int nouveau_ioctl_gpuobj_free(struct drm_device *, void *data, | ||
999 | struct drm_file *); | ||
1000 | 983 | ||
1001 | /* nouveau_irq.c */ | 984 | /* nouveau_irq.c */ |
1002 | extern int nouveau_irq_init(struct drm_device *); | 985 | extern int nouveau_irq_init(struct drm_device *); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index fe3f5a821b84..af7cfb825716 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
@@ -341,6 +341,7 @@ retry: | |||
341 | if (nvbo->reserved_by && nvbo->reserved_by == file_priv) { | 341 | if (nvbo->reserved_by && nvbo->reserved_by == file_priv) { |
342 | NV_ERROR(dev, "multiple instances of buffer %d on " | 342 | NV_ERROR(dev, "multiple instances of buffer %d on " |
343 | "validation list\n", b->handle); | 343 | "validation list\n", b->handle); |
344 | drm_gem_object_unreference_unlocked(gem); | ||
344 | validate_fini(op, NULL); | 345 | validate_fini(op, NULL); |
345 | return -EINVAL; | 346 | return -EINVAL; |
346 | } | 347 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_gpuobj.c index b190cc01c820..bd79fedb7054 100644 --- a/drivers/gpu/drm/nouveau/nouveau_object.c +++ b/drivers/gpu/drm/nouveau/nouveau_gpuobj.c | |||
@@ -758,66 +758,6 @@ nouveau_gpuobj_resume(struct drm_device *dev) | |||
758 | dev_priv->engine.instmem.flush(dev); | 758 | dev_priv->engine.instmem.flush(dev); |
759 | } | 759 | } |
760 | 760 | ||
761 | int nouveau_ioctl_grobj_alloc(struct drm_device *dev, void *data, | ||
762 | struct drm_file *file_priv) | ||
763 | { | ||
764 | struct drm_nouveau_grobj_alloc *init = data; | ||
765 | struct nouveau_channel *chan; | ||
766 | int ret; | ||
767 | |||
768 | if (init->handle == ~0) | ||
769 | return -EINVAL; | ||
770 | |||
771 | /* compatibility with userspace that assumes 506e for all chipsets */ | ||
772 | if (init->class == 0x506e) { | ||
773 | init->class = nouveau_software_class(dev); | ||
774 | if (init->class == 0x906e) | ||
775 | return 0; | ||
776 | } else | ||
777 | if (init->class == 0x906e) { | ||
778 | NV_ERROR(dev, "906e not supported yet\n"); | ||
779 | return -EINVAL; | ||
780 | } | ||
781 | |||
782 | chan = nouveau_channel_get(file_priv, init->channel); | ||
783 | if (IS_ERR(chan)) | ||
784 | return PTR_ERR(chan); | ||
785 | |||
786 | if (nouveau_ramht_find(chan, init->handle)) { | ||
787 | ret = -EEXIST; | ||
788 | goto out; | ||
789 | } | ||
790 | |||
791 | ret = nouveau_gpuobj_gr_new(chan, init->handle, init->class); | ||
792 | if (ret) { | ||
793 | NV_ERROR(dev, "Error creating object: %d (%d/0x%08x)\n", | ||
794 | ret, init->channel, init->handle); | ||
795 | } | ||
796 | |||
797 | out: | ||
798 | nouveau_channel_put(&chan); | ||
799 | return ret; | ||
800 | } | ||
801 | |||
802 | int nouveau_ioctl_gpuobj_free(struct drm_device *dev, void *data, | ||
803 | struct drm_file *file_priv) | ||
804 | { | ||
805 | struct drm_nouveau_gpuobj_free *objfree = data; | ||
806 | struct nouveau_channel *chan; | ||
807 | int ret; | ||
808 | |||
809 | chan = nouveau_channel_get(file_priv, objfree->channel); | ||
810 | if (IS_ERR(chan)) | ||
811 | return PTR_ERR(chan); | ||
812 | |||
813 | /* Synchronize with the user channel */ | ||
814 | nouveau_channel_idle(chan); | ||
815 | |||
816 | ret = nouveau_ramht_remove(chan, objfree->handle); | ||
817 | nouveau_channel_put(&chan); | ||
818 | return ret; | ||
819 | } | ||
820 | |||
821 | u32 | 761 | u32 |
822 | nv_ro32(struct nouveau_gpuobj *gpuobj, u32 offset) | 762 | nv_ro32(struct nouveau_gpuobj *gpuobj, u32 offset) |
823 | { | 763 | { |
diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c index 868c7fd74854..b2c2937531a8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_irq.c +++ b/drivers/gpu/drm/nouveau/nouveau_irq.c | |||
@@ -41,12 +41,8 @@ | |||
41 | void | 41 | void |
42 | nouveau_irq_preinstall(struct drm_device *dev) | 42 | nouveau_irq_preinstall(struct drm_device *dev) |
43 | { | 43 | { |
44 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
45 | |||
46 | /* Master disable */ | 44 | /* Master disable */ |
47 | nv_wr32(dev, NV03_PMC_INTR_EN_0, 0); | 45 | nv_wr32(dev, NV03_PMC_INTR_EN_0, 0); |
48 | |||
49 | INIT_LIST_HEAD(&dev_priv->vbl_waiting); | ||
50 | } | 46 | } |
51 | 47 | ||
52 | int | 48 | int |
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index 2ef883c4bbc1..69c93b864519 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c | |||
@@ -161,44 +161,3 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | |||
161 | *b_offset = mem->start; | 161 | *b_offset = mem->start; |
162 | return 0; | 162 | return 0; |
163 | } | 163 | } |
164 | |||
165 | int | ||
166 | nouveau_notifier_offset(struct nouveau_gpuobj *nobj, uint32_t *poffset) | ||
167 | { | ||
168 | if (!nobj || nobj->dtor != nouveau_notifier_gpuobj_dtor) | ||
169 | return -EINVAL; | ||
170 | |||
171 | if (poffset) { | ||
172 | struct drm_mm_node *mem = nobj->priv; | ||
173 | |||
174 | if (*poffset >= mem->size) | ||
175 | return false; | ||
176 | |||
177 | *poffset += mem->start; | ||
178 | } | ||
179 | |||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | int | ||
184 | nouveau_ioctl_notifier_alloc(struct drm_device *dev, void *data, | ||
185 | struct drm_file *file_priv) | ||
186 | { | ||
187 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
188 | struct drm_nouveau_notifierobj_alloc *na = data; | ||
189 | struct nouveau_channel *chan; | ||
190 | int ret; | ||
191 | |||
192 | /* completely unnecessary for these chipsets... */ | ||
193 | if (unlikely(dev_priv->card_type >= NV_C0)) | ||
194 | return -EINVAL; | ||
195 | |||
196 | chan = nouveau_channel_get(file_priv, na->channel); | ||
197 | if (IS_ERR(chan)) | ||
198 | return PTR_ERR(chan); | ||
199 | |||
200 | ret = nouveau_notifier_alloc(chan, na->handle, na->size, 0, 0x1000, | ||
201 | &na->offset); | ||
202 | nouveau_channel_put(&chan); | ||
203 | return ret; | ||
204 | } | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_software.h b/drivers/gpu/drm/nouveau/nouveau_software.h index e60bc6ce9003..709e5ac680ec 100644 --- a/drivers/gpu/drm/nouveau/nouveau_software.h +++ b/drivers/gpu/drm/nouveau/nouveau_software.h | |||
@@ -4,13 +4,15 @@ | |||
4 | struct nouveau_software_priv { | 4 | struct nouveau_software_priv { |
5 | struct nouveau_exec_engine base; | 5 | struct nouveau_exec_engine base; |
6 | struct list_head vblank; | 6 | struct list_head vblank; |
7 | spinlock_t peephole_lock; | ||
7 | }; | 8 | }; |
8 | 9 | ||
9 | struct nouveau_software_chan { | 10 | struct nouveau_software_chan { |
10 | struct list_head flip; | 11 | struct list_head flip; |
11 | struct { | 12 | struct { |
12 | struct list_head list; | 13 | struct list_head list; |
13 | struct nouveau_bo *bo; | 14 | u32 channel; |
15 | u32 ctxdma; | ||
14 | u32 offset; | 16 | u32 offset; |
15 | u32 value; | 17 | u32 value; |
16 | u32 head; | 18 | u32 head; |
@@ -18,32 +20,17 @@ struct nouveau_software_chan { | |||
18 | }; | 20 | }; |
19 | 21 | ||
20 | static inline void | 22 | static inline void |
21 | nouveau_software_vblank(struct drm_device *dev, int crtc) | ||
22 | { | ||
23 | struct nouveau_software_priv *psw = nv_engine(dev, NVOBJ_ENGINE_SW); | ||
24 | struct nouveau_software_chan *pch, *tmp; | ||
25 | |||
26 | list_for_each_entry_safe(pch, tmp, &psw->vblank, vblank.list) { | ||
27 | if (pch->vblank.head != crtc) | ||
28 | continue; | ||
29 | |||
30 | nouveau_bo_wr32(pch->vblank.bo, pch->vblank.offset, | ||
31 | pch->vblank.value); | ||
32 | list_del(&pch->vblank.list); | ||
33 | drm_vblank_put(dev, crtc); | ||
34 | } | ||
35 | } | ||
36 | |||
37 | static inline void | ||
38 | nouveau_software_context_new(struct nouveau_software_chan *pch) | 23 | nouveau_software_context_new(struct nouveau_software_chan *pch) |
39 | { | 24 | { |
40 | INIT_LIST_HEAD(&pch->flip); | 25 | INIT_LIST_HEAD(&pch->flip); |
26 | INIT_LIST_HEAD(&pch->vblank.list); | ||
41 | } | 27 | } |
42 | 28 | ||
43 | static inline void | 29 | static inline void |
44 | nouveau_software_create(struct nouveau_software_priv *psw) | 30 | nouveau_software_create(struct nouveau_software_priv *psw) |
45 | { | 31 | { |
46 | INIT_LIST_HEAD(&psw->vblank); | 32 | INIT_LIST_HEAD(&psw->vblank); |
33 | spin_lock_init(&psw->peephole_lock); | ||
47 | } | 34 | } |
48 | 35 | ||
49 | static inline u16 | 36 | static inline u16 |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 19706f0532ea..1cdfd6e757ce 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
@@ -1234,80 +1234,6 @@ int nouveau_unload(struct drm_device *dev) | |||
1234 | return 0; | 1234 | return 0; |
1235 | } | 1235 | } |
1236 | 1236 | ||
1237 | int nouveau_ioctl_getparam(struct drm_device *dev, void *data, | ||
1238 | struct drm_file *file_priv) | ||
1239 | { | ||
1240 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
1241 | struct drm_nouveau_getparam *getparam = data; | ||
1242 | |||
1243 | switch (getparam->param) { | ||
1244 | case NOUVEAU_GETPARAM_CHIPSET_ID: | ||
1245 | getparam->value = dev_priv->chipset; | ||
1246 | break; | ||
1247 | case NOUVEAU_GETPARAM_PCI_VENDOR: | ||
1248 | getparam->value = dev->pci_vendor; | ||
1249 | break; | ||
1250 | case NOUVEAU_GETPARAM_PCI_DEVICE: | ||
1251 | getparam->value = dev->pci_device; | ||
1252 | break; | ||
1253 | case NOUVEAU_GETPARAM_BUS_TYPE: | ||
1254 | if (drm_pci_device_is_agp(dev)) | ||
1255 | getparam->value = NV_AGP; | ||
1256 | else if (pci_is_pcie(dev->pdev)) | ||
1257 | getparam->value = NV_PCIE; | ||
1258 | else | ||
1259 | getparam->value = NV_PCI; | ||
1260 | break; | ||
1261 | case NOUVEAU_GETPARAM_FB_SIZE: | ||
1262 | getparam->value = dev_priv->fb_available_size; | ||
1263 | break; | ||
1264 | case NOUVEAU_GETPARAM_AGP_SIZE: | ||
1265 | getparam->value = dev_priv->gart_info.aper_size; | ||
1266 | break; | ||
1267 | case NOUVEAU_GETPARAM_VM_VRAM_BASE: | ||
1268 | getparam->value = 0; /* deprecated */ | ||
1269 | break; | ||
1270 | case NOUVEAU_GETPARAM_PTIMER_TIME: | ||
1271 | getparam->value = dev_priv->engine.timer.read(dev); | ||
1272 | break; | ||
1273 | case NOUVEAU_GETPARAM_HAS_BO_USAGE: | ||
1274 | getparam->value = 1; | ||
1275 | break; | ||
1276 | case NOUVEAU_GETPARAM_HAS_PAGEFLIP: | ||
1277 | getparam->value = 1; | ||
1278 | break; | ||
1279 | case NOUVEAU_GETPARAM_GRAPH_UNITS: | ||
1280 | /* NV40 and NV50 versions are quite different, but register | ||
1281 | * address is the same. User is supposed to know the card | ||
1282 | * family anyway... */ | ||
1283 | if (dev_priv->chipset >= 0x40) { | ||
1284 | getparam->value = nv_rd32(dev, NV40_PMC_GRAPH_UNITS); | ||
1285 | break; | ||
1286 | } | ||
1287 | /* FALLTHRU */ | ||
1288 | default: | ||
1289 | NV_DEBUG(dev, "unknown parameter %lld\n", getparam->param); | ||
1290 | return -EINVAL; | ||
1291 | } | ||
1292 | |||
1293 | return 0; | ||
1294 | } | ||
1295 | |||
1296 | int | ||
1297 | nouveau_ioctl_setparam(struct drm_device *dev, void *data, | ||
1298 | struct drm_file *file_priv) | ||
1299 | { | ||
1300 | struct drm_nouveau_setparam *setparam = data; | ||
1301 | |||
1302 | switch (setparam->param) { | ||
1303 | default: | ||
1304 | NV_DEBUG(dev, "unknown parameter %lld\n", setparam->param); | ||
1305 | return -EINVAL; | ||
1306 | } | ||
1307 | |||
1308 | return 0; | ||
1309 | } | ||
1310 | |||
1311 | /* Wait until (value(reg) & mask) == val, up until timeout has hit */ | 1237 | /* Wait until (value(reg) & mask) == val, up until timeout has hit */ |
1312 | bool | 1238 | bool |
1313 | nouveau_wait_eq(struct drm_device *dev, uint64_t timeout, | 1239 | nouveau_wait_eq(struct drm_device *dev, uint64_t timeout, |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 5c41612723b4..b244d9968c5d 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -646,7 +646,30 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcb, | |||
646 | static void | 646 | static void |
647 | nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) | 647 | nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) |
648 | { | 648 | { |
649 | nouveau_software_vblank(dev, crtc); | 649 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
650 | struct nouveau_software_priv *psw = nv_engine(dev, NVOBJ_ENGINE_SW); | ||
651 | struct nouveau_software_chan *pch, *tmp; | ||
652 | |||
653 | list_for_each_entry_safe(pch, tmp, &psw->vblank, vblank.list) { | ||
654 | if (pch->vblank.head != crtc) | ||
655 | continue; | ||
656 | |||
657 | spin_lock(&psw->peephole_lock); | ||
658 | nv_wr32(dev, 0x001704, pch->vblank.channel); | ||
659 | nv_wr32(dev, 0x001710, 0x80000000 | pch->vblank.ctxdma); | ||
660 | if (dev_priv->chipset == 0x50) { | ||
661 | nv_wr32(dev, 0x001570, pch->vblank.offset); | ||
662 | nv_wr32(dev, 0x001574, pch->vblank.value); | ||
663 | } else { | ||
664 | nv_wr32(dev, 0x060010, pch->vblank.offset); | ||
665 | nv_wr32(dev, 0x060014, pch->vblank.value); | ||
666 | } | ||
667 | spin_unlock(&psw->peephole_lock); | ||
668 | |||
669 | list_del(&pch->vblank.list); | ||
670 | drm_vblank_put(dev, crtc); | ||
671 | } | ||
672 | |||
650 | drm_handle_vblank(dev, crtc); | 673 | drm_handle_vblank(dev, crtc); |
651 | } | 674 | } |
652 | 675 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c index d9cc2f2638d6..437608d1dfe7 100644 --- a/drivers/gpu/drm/nouveau/nv50_graph.c +++ b/drivers/gpu/drm/nouveau/nv50_graph.c | |||
@@ -299,7 +299,7 @@ static struct nouveau_bitfield nv50_graph_trap_ccache[] = { | |||
299 | 299 | ||
300 | /* There must be a *lot* of these. Will take some time to gather them up. */ | 300 | /* There must be a *lot* of these. Will take some time to gather them up. */ |
301 | struct nouveau_enum nv50_data_error_names[] = { | 301 | struct nouveau_enum nv50_data_error_names[] = { |
302 | { 0x00000003, "INVALID_QUERY_OR_TEXTURE", NULL }, | 302 | { 0x00000003, "INVALID_OPERATION", NULL }, |
303 | { 0x00000004, "INVALID_VALUE", NULL }, | 303 | { 0x00000004, "INVALID_VALUE", NULL }, |
304 | { 0x00000005, "INVALID_ENUM", NULL }, | 304 | { 0x00000005, "INVALID_ENUM", NULL }, |
305 | { 0x00000008, "INVALID_OBJECT", NULL }, | 305 | { 0x00000008, "INVALID_OBJECT", NULL }, |
diff --git a/drivers/gpu/drm/nouveau/nv50_software.c b/drivers/gpu/drm/nouveau/nv50_software.c index 114d2517d4a8..df554d9dacb8 100644 --- a/drivers/gpu/drm/nouveau/nv50_software.c +++ b/drivers/gpu/drm/nouveau/nv50_software.c | |||
@@ -36,9 +36,6 @@ struct nv50_software_priv { | |||
36 | 36 | ||
37 | struct nv50_software_chan { | 37 | struct nv50_software_chan { |
38 | struct nouveau_software_chan base; | 38 | struct nouveau_software_chan base; |
39 | struct { | ||
40 | struct nouveau_gpuobj *object; | ||
41 | } vblank; | ||
42 | }; | 39 | }; |
43 | 40 | ||
44 | static int | 41 | static int |
@@ -51,11 +48,7 @@ mthd_dma_vblsem(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data) | |||
51 | if (!gpuobj) | 48 | if (!gpuobj) |
52 | return -ENOENT; | 49 | return -ENOENT; |
53 | 50 | ||
54 | if (nouveau_notifier_offset(gpuobj, NULL)) | 51 | pch->base.vblank.ctxdma = gpuobj->cinst >> 4; |
55 | return -EINVAL; | ||
56 | |||
57 | pch->vblank.object = gpuobj; | ||
58 | pch->base.vblank.offset = ~0; | ||
59 | return 0; | 52 | return 0; |
60 | } | 53 | } |
61 | 54 | ||
@@ -63,11 +56,7 @@ static int | |||
63 | mthd_vblsem_offset(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data) | 56 | mthd_vblsem_offset(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data) |
64 | { | 57 | { |
65 | struct nv50_software_chan *pch = chan->engctx[NVOBJ_ENGINE_SW]; | 58 | struct nv50_software_chan *pch = chan->engctx[NVOBJ_ENGINE_SW]; |
66 | 59 | pch->base.vblank.offset = data; | |
67 | if (nouveau_notifier_offset(pch->vblank.object, &data)) | ||
68 | return -ERANGE; | ||
69 | |||
70 | pch->base.vblank.offset = data >> 2; | ||
71 | return 0; | 60 | return 0; |
72 | } | 61 | } |
73 | 62 | ||
@@ -86,7 +75,7 @@ mthd_vblsem_release(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data) | |||
86 | struct nv50_software_chan *pch = chan->engctx[NVOBJ_ENGINE_SW]; | 75 | struct nv50_software_chan *pch = chan->engctx[NVOBJ_ENGINE_SW]; |
87 | struct drm_device *dev = chan->dev; | 76 | struct drm_device *dev = chan->dev; |
88 | 77 | ||
89 | if (!pch->vblank.object || pch->base.vblank.offset == ~0 || data > 1) | 78 | if (data > 1) |
90 | return -EINVAL; | 79 | return -EINVAL; |
91 | 80 | ||
92 | drm_vblank_get(dev, data); | 81 | drm_vblank_get(dev, data); |
@@ -116,7 +105,7 @@ nv50_software_context_new(struct nouveau_channel *chan, int engine) | |||
116 | return -ENOMEM; | 105 | return -ENOMEM; |
117 | 106 | ||
118 | nouveau_software_context_new(&pch->base); | 107 | nouveau_software_context_new(&pch->base); |
119 | pch->base.vblank.bo = chan->notifier_bo; | 108 | pch->base.vblank.channel = chan->ramin->vinst >> 12; |
120 | chan->engctx[engine] = pch; | 109 | chan->engctx[engine] = pch; |
121 | 110 | ||
122 | /* dma objects for display sync channel semaphore blocks */ | 111 | /* dma objects for display sync channel semaphore blocks */ |
diff --git a/drivers/gpu/drm/nouveau/nv84_crypt.c b/drivers/gpu/drm/nouveau/nv84_crypt.c index edece9c616eb..bbfcc73b6708 100644 --- a/drivers/gpu/drm/nouveau/nv84_crypt.c +++ b/drivers/gpu/drm/nouveau/nv84_crypt.c | |||
@@ -117,18 +117,30 @@ nv84_crypt_tlb_flush(struct drm_device *dev, int engine) | |||
117 | nv50_vm_flush_engine(dev, 0x0a); | 117 | nv50_vm_flush_engine(dev, 0x0a); |
118 | } | 118 | } |
119 | 119 | ||
120 | static struct nouveau_bitfield nv84_crypt_intr[] = { | ||
121 | { 0x00000001, "INVALID_STATE" }, | ||
122 | { 0x00000002, "ILLEGAL_MTHD" }, | ||
123 | { 0x00000004, "ILLEGAL_CLASS" }, | ||
124 | { 0x00000080, "QUERY" }, | ||
125 | { 0x00000100, "FAULT" }, | ||
126 | {} | ||
127 | }; | ||
128 | |||
120 | static void | 129 | static void |
121 | nv84_crypt_isr(struct drm_device *dev) | 130 | nv84_crypt_isr(struct drm_device *dev) |
122 | { | 131 | { |
123 | u32 stat = nv_rd32(dev, 0x102130); | 132 | u32 stat = nv_rd32(dev, 0x102130); |
124 | u32 mthd = nv_rd32(dev, 0x102190); | 133 | u32 mthd = nv_rd32(dev, 0x102190); |
125 | u32 data = nv_rd32(dev, 0x102194); | 134 | u32 data = nv_rd32(dev, 0x102194); |
126 | u32 inst = nv_rd32(dev, 0x102188) & 0x7fffffff; | 135 | u64 inst = (u64)(nv_rd32(dev, 0x102188) & 0x7fffffff) << 12; |
127 | int show = nouveau_ratelimit(); | 136 | int show = nouveau_ratelimit(); |
137 | int chid = nv50_graph_isr_chid(dev, inst); | ||
128 | 138 | ||
129 | if (show) { | 139 | if (show) { |
130 | NV_INFO(dev, "PCRYPT_INTR: 0x%08x 0x%08x 0x%08x 0x%08x\n", | 140 | NV_INFO(dev, "PCRYPT:"); |
131 | stat, mthd, data, inst); | 141 | nouveau_bitfield_print(nv84_crypt_intr, stat); |
142 | printk(KERN_CONT " ch %d (0x%010llx) mthd 0x%04x data 0x%08x\n", | ||
143 | chid, inst, mthd, data); | ||
132 | } | 144 | } |
133 | 145 | ||
134 | nv_wr32(dev, 0x102130, stat); | 146 | nv_wr32(dev, 0x102130, stat); |
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc b/drivers/gpu/drm/nouveau/nva3_copy.fuc index abc36626fef0..219850d53286 100644 --- a/drivers/gpu/drm/nouveau/nva3_copy.fuc +++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc | |||
@@ -119,9 +119,9 @@ dispatch_dma: | |||
119 | // mthd 0x030c-0x0340, various stuff | 119 | // mthd 0x030c-0x0340, various stuff |
120 | .b16 0xc3 14 | 120 | .b16 0xc3 14 |
121 | .b32 #ctx_src_address_high ~0x000000ff | 121 | .b32 #ctx_src_address_high ~0x000000ff |
122 | .b32 #ctx_src_address_low ~0xfffffff0 | 122 | .b32 #ctx_src_address_low ~0xffffffff |
123 | .b32 #ctx_dst_address_high ~0x000000ff | 123 | .b32 #ctx_dst_address_high ~0x000000ff |
124 | .b32 #ctx_dst_address_low ~0xfffffff0 | 124 | .b32 #ctx_dst_address_low ~0xffffffff |
125 | .b32 #ctx_src_pitch ~0x0007ffff | 125 | .b32 #ctx_src_pitch ~0x0007ffff |
126 | .b32 #ctx_dst_pitch ~0x0007ffff | 126 | .b32 #ctx_dst_pitch ~0x0007ffff |
127 | .b32 #ctx_xcnt ~0x0000ffff | 127 | .b32 #ctx_xcnt ~0x0000ffff |
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc.h b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h index 1f33fbdc00be..37d6de3c9d61 100644 --- a/drivers/gpu/drm/nouveau/nva3_copy.fuc.h +++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h | |||
@@ -1,37 +1,72 @@ | |||
1 | uint32_t nva3_pcopy_data[] = { | 1 | u32 nva3_pcopy_data[] = { |
2 | /* 0x0000: ctx_object */ | ||
2 | 0x00000000, | 3 | 0x00000000, |
4 | /* 0x0004: ctx_dma */ | ||
5 | /* 0x0004: ctx_dma_query */ | ||
3 | 0x00000000, | 6 | 0x00000000, |
7 | /* 0x0008: ctx_dma_src */ | ||
4 | 0x00000000, | 8 | 0x00000000, |
9 | /* 0x000c: ctx_dma_dst */ | ||
5 | 0x00000000, | 10 | 0x00000000, |
11 | /* 0x0010: ctx_query_address_high */ | ||
6 | 0x00000000, | 12 | 0x00000000, |
13 | /* 0x0014: ctx_query_address_low */ | ||
7 | 0x00000000, | 14 | 0x00000000, |
15 | /* 0x0018: ctx_query_counter */ | ||
8 | 0x00000000, | 16 | 0x00000000, |
17 | /* 0x001c: ctx_src_address_high */ | ||
9 | 0x00000000, | 18 | 0x00000000, |
19 | /* 0x0020: ctx_src_address_low */ | ||
10 | 0x00000000, | 20 | 0x00000000, |
21 | /* 0x0024: ctx_src_pitch */ | ||
11 | 0x00000000, | 22 | 0x00000000, |
23 | /* 0x0028: ctx_src_tile_mode */ | ||
12 | 0x00000000, | 24 | 0x00000000, |
25 | /* 0x002c: ctx_src_xsize */ | ||
13 | 0x00000000, | 26 | 0x00000000, |
27 | /* 0x0030: ctx_src_ysize */ | ||
14 | 0x00000000, | 28 | 0x00000000, |
29 | /* 0x0034: ctx_src_zsize */ | ||
15 | 0x00000000, | 30 | 0x00000000, |
31 | /* 0x0038: ctx_src_zoff */ | ||
16 | 0x00000000, | 32 | 0x00000000, |
33 | /* 0x003c: ctx_src_xoff */ | ||
17 | 0x00000000, | 34 | 0x00000000, |
35 | /* 0x0040: ctx_src_yoff */ | ||
18 | 0x00000000, | 36 | 0x00000000, |
37 | /* 0x0044: ctx_src_cpp */ | ||
19 | 0x00000000, | 38 | 0x00000000, |
39 | /* 0x0048: ctx_dst_address_high */ | ||
20 | 0x00000000, | 40 | 0x00000000, |
41 | /* 0x004c: ctx_dst_address_low */ | ||
21 | 0x00000000, | 42 | 0x00000000, |
43 | /* 0x0050: ctx_dst_pitch */ | ||
22 | 0x00000000, | 44 | 0x00000000, |
45 | /* 0x0054: ctx_dst_tile_mode */ | ||
23 | 0x00000000, | 46 | 0x00000000, |
47 | /* 0x0058: ctx_dst_xsize */ | ||
24 | 0x00000000, | 48 | 0x00000000, |
49 | /* 0x005c: ctx_dst_ysize */ | ||
25 | 0x00000000, | 50 | 0x00000000, |
51 | /* 0x0060: ctx_dst_zsize */ | ||
26 | 0x00000000, | 52 | 0x00000000, |
53 | /* 0x0064: ctx_dst_zoff */ | ||
27 | 0x00000000, | 54 | 0x00000000, |
55 | /* 0x0068: ctx_dst_xoff */ | ||
28 | 0x00000000, | 56 | 0x00000000, |
57 | /* 0x006c: ctx_dst_yoff */ | ||
29 | 0x00000000, | 58 | 0x00000000, |
59 | /* 0x0070: ctx_dst_cpp */ | ||
30 | 0x00000000, | 60 | 0x00000000, |
61 | /* 0x0074: ctx_format */ | ||
31 | 0x00000000, | 62 | 0x00000000, |
63 | /* 0x0078: ctx_swz_const0 */ | ||
32 | 0x00000000, | 64 | 0x00000000, |
65 | /* 0x007c: ctx_swz_const1 */ | ||
33 | 0x00000000, | 66 | 0x00000000, |
67 | /* 0x0080: ctx_xcnt */ | ||
34 | 0x00000000, | 68 | 0x00000000, |
69 | /* 0x0084: ctx_ycnt */ | ||
35 | 0x00000000, | 70 | 0x00000000, |
36 | 0x00000000, | 71 | 0x00000000, |
37 | 0x00000000, | 72 | 0x00000000, |
@@ -63,6 +98,7 @@ uint32_t nva3_pcopy_data[] = { | |||
63 | 0x00000000, | 98 | 0x00000000, |
64 | 0x00000000, | 99 | 0x00000000, |
65 | 0x00000000, | 100 | 0x00000000, |
101 | /* 0x0100: dispatch_table */ | ||
66 | 0x00010000, | 102 | 0x00010000, |
67 | 0x00000000, | 103 | 0x00000000, |
68 | 0x00000000, | 104 | 0x00000000, |
@@ -73,6 +109,7 @@ uint32_t nva3_pcopy_data[] = { | |||
73 | 0x00010162, | 109 | 0x00010162, |
74 | 0x00000000, | 110 | 0x00000000, |
75 | 0x00030060, | 111 | 0x00030060, |
112 | /* 0x0128: dispatch_dma */ | ||
76 | 0x00010170, | 113 | 0x00010170, |
77 | 0x00000000, | 114 | 0x00000000, |
78 | 0x00010170, | 115 | 0x00010170, |
@@ -118,11 +155,11 @@ uint32_t nva3_pcopy_data[] = { | |||
118 | 0x0000001c, | 155 | 0x0000001c, |
119 | 0xffffff00, | 156 | 0xffffff00, |
120 | 0x00000020, | 157 | 0x00000020, |
121 | 0x0000000f, | 158 | 0x00000000, |
122 | 0x00000048, | 159 | 0x00000048, |
123 | 0xffffff00, | 160 | 0xffffff00, |
124 | 0x0000004c, | 161 | 0x0000004c, |
125 | 0x0000000f, | 162 | 0x00000000, |
126 | 0x00000024, | 163 | 0x00000024, |
127 | 0xfff80000, | 164 | 0xfff80000, |
128 | 0x00000050, | 165 | 0x00000050, |
@@ -146,7 +183,8 @@ uint32_t nva3_pcopy_data[] = { | |||
146 | 0x00000800, | 183 | 0x00000800, |
147 | }; | 184 | }; |
148 | 185 | ||
149 | uint32_t nva3_pcopy_code[] = { | 186 | u32 nva3_pcopy_code[] = { |
187 | /* 0x0000: main */ | ||
150 | 0x04fe04bd, | 188 | 0x04fe04bd, |
151 | 0x3517f000, | 189 | 0x3517f000, |
152 | 0xf10010fe, | 190 | 0xf10010fe, |
@@ -158,23 +196,31 @@ uint32_t nva3_pcopy_code[] = { | |||
158 | 0x17f11031, | 196 | 0x17f11031, |
159 | 0x27f01200, | 197 | 0x27f01200, |
160 | 0x0012d003, | 198 | 0x0012d003, |
199 | /* 0x002f: spin */ | ||
161 | 0xf40031f4, | 200 | 0xf40031f4, |
162 | 0x0ef40028, | 201 | 0x0ef40028, |
202 | /* 0x0035: ih */ | ||
163 | 0x8001cffd, | 203 | 0x8001cffd, |
164 | 0xf40812c4, | 204 | 0xf40812c4, |
165 | 0x21f4060b, | 205 | 0x21f4060b, |
206 | /* 0x0041: ih_no_chsw */ | ||
166 | 0x0412c472, | 207 | 0x0412c472, |
167 | 0xf4060bf4, | 208 | 0xf4060bf4, |
209 | /* 0x004a: ih_no_cmd */ | ||
168 | 0x11c4c321, | 210 | 0x11c4c321, |
169 | 0x4001d00c, | 211 | 0x4001d00c, |
212 | /* 0x0052: swctx */ | ||
170 | 0x47f101f8, | 213 | 0x47f101f8, |
171 | 0x4bfe7700, | 214 | 0x4bfe7700, |
172 | 0x0007fe00, | 215 | 0x0007fe00, |
173 | 0xf00204b9, | 216 | 0xf00204b9, |
174 | 0x01f40643, | 217 | 0x01f40643, |
175 | 0x0604fa09, | 218 | 0x0604fa09, |
219 | /* 0x006b: swctx_load */ | ||
176 | 0xfa060ef4, | 220 | 0xfa060ef4, |
221 | /* 0x006e: swctx_done */ | ||
177 | 0x03f80504, | 222 | 0x03f80504, |
223 | /* 0x0072: chsw */ | ||
178 | 0x27f100f8, | 224 | 0x27f100f8, |
179 | 0x23cf1400, | 225 | 0x23cf1400, |
180 | 0x1e3fc800, | 226 | 0x1e3fc800, |
@@ -183,18 +229,22 @@ uint32_t nva3_pcopy_code[] = { | |||
183 | 0x1e3af052, | 229 | 0x1e3af052, |
184 | 0xf00023d0, | 230 | 0xf00023d0, |
185 | 0x24d00147, | 231 | 0x24d00147, |
232 | /* 0x0093: chsw_no_unload */ | ||
186 | 0xcf00f880, | 233 | 0xcf00f880, |
187 | 0x3dc84023, | 234 | 0x3dc84023, |
188 | 0x220bf41e, | 235 | 0x220bf41e, |
189 | 0xf40131f4, | 236 | 0xf40131f4, |
190 | 0x57f05221, | 237 | 0x57f05221, |
191 | 0x0367f004, | 238 | 0x0367f004, |
239 | /* 0x00a8: chsw_load_ctx_dma */ | ||
192 | 0xa07856bc, | 240 | 0xa07856bc, |
193 | 0xb6018068, | 241 | 0xb6018068, |
194 | 0x87d00884, | 242 | 0x87d00884, |
195 | 0x0162b600, | 243 | 0x0162b600, |
244 | /* 0x00bb: chsw_finish_load */ | ||
196 | 0xf0f018f4, | 245 | 0xf0f018f4, |
197 | 0x23d00237, | 246 | 0x23d00237, |
247 | /* 0x00c3: dispatch */ | ||
198 | 0xf100f880, | 248 | 0xf100f880, |
199 | 0xcf190037, | 249 | 0xcf190037, |
200 | 0x33cf4032, | 250 | 0x33cf4032, |
@@ -202,6 +252,7 @@ uint32_t nva3_pcopy_code[] = { | |||
202 | 0x1024b607, | 252 | 0x1024b607, |
203 | 0x010057f1, | 253 | 0x010057f1, |
204 | 0x74bd64bd, | 254 | 0x74bd64bd, |
255 | /* 0x00dc: dispatch_loop */ | ||
205 | 0x58005658, | 256 | 0x58005658, |
206 | 0x50b60157, | 257 | 0x50b60157, |
207 | 0x0446b804, | 258 | 0x0446b804, |
@@ -211,6 +262,7 @@ uint32_t nva3_pcopy_code[] = { | |||
211 | 0xb60276bb, | 262 | 0xb60276bb, |
212 | 0x57bb0374, | 263 | 0x57bb0374, |
213 | 0xdf0ef400, | 264 | 0xdf0ef400, |
265 | /* 0x0100: dispatch_valid_mthd */ | ||
214 | 0xb60246bb, | 266 | 0xb60246bb, |
215 | 0x45bb0344, | 267 | 0x45bb0344, |
216 | 0x01459800, | 268 | 0x01459800, |
@@ -220,31 +272,41 @@ uint32_t nva3_pcopy_code[] = { | |||
220 | 0xb0014658, | 272 | 0xb0014658, |
221 | 0x1bf40064, | 273 | 0x1bf40064, |
222 | 0x00538009, | 274 | 0x00538009, |
275 | /* 0x0127: dispatch_cmd */ | ||
223 | 0xf4300ef4, | 276 | 0xf4300ef4, |
224 | 0x55f90132, | 277 | 0x55f90132, |
225 | 0xf40c01f4, | 278 | 0xf40c01f4, |
279 | /* 0x0132: dispatch_invalid_bitfield */ | ||
226 | 0x25f0250e, | 280 | 0x25f0250e, |
281 | /* 0x0135: dispatch_illegal_mthd */ | ||
227 | 0x0125f002, | 282 | 0x0125f002, |
283 | /* 0x0138: dispatch_error */ | ||
228 | 0x100047f1, | 284 | 0x100047f1, |
229 | 0xd00042d0, | 285 | 0xd00042d0, |
230 | 0x27f04043, | 286 | 0x27f04043, |
231 | 0x0002d040, | 287 | 0x0002d040, |
288 | /* 0x0148: hostirq_wait */ | ||
232 | 0xf08002cf, | 289 | 0xf08002cf, |
233 | 0x24b04024, | 290 | 0x24b04024, |
234 | 0xf71bf400, | 291 | 0xf71bf400, |
292 | /* 0x0154: dispatch_done */ | ||
235 | 0x1d0027f1, | 293 | 0x1d0027f1, |
236 | 0xd00137f0, | 294 | 0xd00137f0, |
237 | 0x00f80023, | 295 | 0x00f80023, |
296 | /* 0x0160: cmd_nop */ | ||
297 | /* 0x0162: cmd_pm_trigger */ | ||
238 | 0x27f100f8, | 298 | 0x27f100f8, |
239 | 0x34bd2200, | 299 | 0x34bd2200, |
240 | 0xd00233f0, | 300 | 0xd00233f0, |
241 | 0x00f80023, | 301 | 0x00f80023, |
302 | /* 0x0170: cmd_dma */ | ||
242 | 0x012842b7, | 303 | 0x012842b7, |
243 | 0xf00145b6, | 304 | 0xf00145b6, |
244 | 0x43801e39, | 305 | 0x43801e39, |
245 | 0x0040b701, | 306 | 0x0040b701, |
246 | 0x0644b606, | 307 | 0x0644b606, |
247 | 0xf80043d0, | 308 | 0xf80043d0, |
309 | /* 0x0189: cmd_exec_set_format */ | ||
248 | 0xf030f400, | 310 | 0xf030f400, |
249 | 0xb00001b0, | 311 | 0xb00001b0, |
250 | 0x01b00101, | 312 | 0x01b00101, |
@@ -256,20 +318,26 @@ uint32_t nva3_pcopy_code[] = { | |||
256 | 0x70b63847, | 318 | 0x70b63847, |
257 | 0x0232f401, | 319 | 0x0232f401, |
258 | 0x94bd84bd, | 320 | 0x94bd84bd, |
321 | /* 0x01b4: ncomp_loop */ | ||
259 | 0xb60f4ac4, | 322 | 0xb60f4ac4, |
260 | 0xb4bd0445, | 323 | 0xb4bd0445, |
324 | /* 0x01bc: bpc_loop */ | ||
261 | 0xf404a430, | 325 | 0xf404a430, |
262 | 0xa5ff0f18, | 326 | 0xa5ff0f18, |
263 | 0x00cbbbc0, | 327 | 0x00cbbbc0, |
264 | 0xf40231f4, | 328 | 0xf40231f4, |
329 | /* 0x01ce: cmp_c0 */ | ||
265 | 0x1bf4220e, | 330 | 0x1bf4220e, |
266 | 0x10c7f00c, | 331 | 0x10c7f00c, |
267 | 0xf400cbbb, | 332 | 0xf400cbbb, |
333 | /* 0x01da: cmp_c1 */ | ||
268 | 0xa430160e, | 334 | 0xa430160e, |
269 | 0x0c18f406, | 335 | 0x0c18f406, |
270 | 0xbb14c7f0, | 336 | 0xbb14c7f0, |
271 | 0x0ef400cb, | 337 | 0x0ef400cb, |
338 | /* 0x01e9: cmp_zero */ | ||
272 | 0x80c7f107, | 339 | 0x80c7f107, |
340 | /* 0x01ed: bpc_next */ | ||
273 | 0x01c83800, | 341 | 0x01c83800, |
274 | 0xb60180b6, | 342 | 0xb60180b6, |
275 | 0xb5b801b0, | 343 | 0xb5b801b0, |
@@ -280,6 +348,7 @@ uint32_t nva3_pcopy_code[] = { | |||
280 | 0x98110680, | 348 | 0x98110680, |
281 | 0x68fd2008, | 349 | 0x68fd2008, |
282 | 0x0502f400, | 350 | 0x0502f400, |
351 | /* 0x0216: dst_xcnt */ | ||
283 | 0x75fd64bd, | 352 | 0x75fd64bd, |
284 | 0x1c078000, | 353 | 0x1c078000, |
285 | 0xf10078fd, | 354 | 0xf10078fd, |
@@ -304,6 +373,7 @@ uint32_t nva3_pcopy_code[] = { | |||
304 | 0x980056d0, | 373 | 0x980056d0, |
305 | 0x56d01f06, | 374 | 0x56d01f06, |
306 | 0x1030f440, | 375 | 0x1030f440, |
376 | /* 0x0276: cmd_exec_set_surface_tiled */ | ||
307 | 0x579800f8, | 377 | 0x579800f8, |
308 | 0x6879c70a, | 378 | 0x6879c70a, |
309 | 0xb66478c7, | 379 | 0xb66478c7, |
@@ -311,9 +381,11 @@ uint32_t nva3_pcopy_code[] = { | |||
311 | 0x0e76b060, | 381 | 0x0e76b060, |
312 | 0xf0091bf4, | 382 | 0xf0091bf4, |
313 | 0x0ef40477, | 383 | 0x0ef40477, |
384 | /* 0x0291: xtile64 */ | ||
314 | 0x027cf00f, | 385 | 0x027cf00f, |
315 | 0xfd1170b6, | 386 | 0xfd1170b6, |
316 | 0x77f00947, | 387 | 0x77f00947, |
388 | /* 0x029d: xtileok */ | ||
317 | 0x0f5a9806, | 389 | 0x0f5a9806, |
318 | 0xfd115b98, | 390 | 0xfd115b98, |
319 | 0xb7f000ab, | 391 | 0xb7f000ab, |
@@ -371,6 +443,7 @@ uint32_t nva3_pcopy_code[] = { | |||
371 | 0x67d00600, | 443 | 0x67d00600, |
372 | 0x0060b700, | 444 | 0x0060b700, |
373 | 0x0068d004, | 445 | 0x0068d004, |
446 | /* 0x0382: cmd_exec_set_surface_linear */ | ||
374 | 0x6cf000f8, | 447 | 0x6cf000f8, |
375 | 0x0260b702, | 448 | 0x0260b702, |
376 | 0x0864b602, | 449 | 0x0864b602, |
@@ -381,13 +454,16 @@ uint32_t nva3_pcopy_code[] = { | |||
381 | 0xb70067d0, | 454 | 0xb70067d0, |
382 | 0x98040060, | 455 | 0x98040060, |
383 | 0x67d00957, | 456 | 0x67d00957, |
457 | /* 0x03ab: cmd_exec_wait */ | ||
384 | 0xf900f800, | 458 | 0xf900f800, |
385 | 0xf110f900, | 459 | 0xf110f900, |
386 | 0xb6080007, | 460 | 0xb6080007, |
461 | /* 0x03b6: loop */ | ||
387 | 0x01cf0604, | 462 | 0x01cf0604, |
388 | 0x0114f000, | 463 | 0x0114f000, |
389 | 0xfcfa1bf4, | 464 | 0xfcfa1bf4, |
390 | 0xf800fc10, | 465 | 0xf800fc10, |
466 | /* 0x03c5: cmd_exec_query */ | ||
391 | 0x0d34c800, | 467 | 0x0d34c800, |
392 | 0xf5701bf4, | 468 | 0xf5701bf4, |
393 | 0xf103ab21, | 469 | 0xf103ab21, |
@@ -417,6 +493,7 @@ uint32_t nva3_pcopy_code[] = { | |||
417 | 0x47f10153, | 493 | 0x47f10153, |
418 | 0x44b60800, | 494 | 0x44b60800, |
419 | 0x0045d006, | 495 | 0x0045d006, |
496 | /* 0x0438: query_counter */ | ||
420 | 0x03ab21f5, | 497 | 0x03ab21f5, |
421 | 0x080c47f1, | 498 | 0x080c47f1, |
422 | 0x980644b6, | 499 | 0x980644b6, |
@@ -439,11 +516,13 @@ uint32_t nva3_pcopy_code[] = { | |||
439 | 0x47f10153, | 516 | 0x47f10153, |
440 | 0x44b60800, | 517 | 0x44b60800, |
441 | 0x0045d006, | 518 | 0x0045d006, |
519 | /* 0x0492: cmd_exec */ | ||
442 | 0x21f500f8, | 520 | 0x21f500f8, |
443 | 0x3fc803ab, | 521 | 0x3fc803ab, |
444 | 0x0e0bf400, | 522 | 0x0e0bf400, |
445 | 0x018921f5, | 523 | 0x018921f5, |
446 | 0x020047f1, | 524 | 0x020047f1, |
525 | /* 0x04a7: cmd_exec_no_format */ | ||
447 | 0xf11e0ef4, | 526 | 0xf11e0ef4, |
448 | 0xb6081067, | 527 | 0xb6081067, |
449 | 0x77f00664, | 528 | 0x77f00664, |
@@ -451,19 +530,24 @@ uint32_t nva3_pcopy_code[] = { | |||
451 | 0x981c0780, | 530 | 0x981c0780, |
452 | 0x67d02007, | 531 | 0x67d02007, |
453 | 0x4067d000, | 532 | 0x4067d000, |
533 | /* 0x04c2: cmd_exec_init_src_surface */ | ||
454 | 0x32f444bd, | 534 | 0x32f444bd, |
455 | 0xc854bd02, | 535 | 0xc854bd02, |
456 | 0x0bf4043f, | 536 | 0x0bf4043f, |
457 | 0x8221f50a, | 537 | 0x8221f50a, |
458 | 0x0a0ef403, | 538 | 0x0a0ef403, |
539 | /* 0x04d4: src_tiled */ | ||
459 | 0x027621f5, | 540 | 0x027621f5, |
541 | /* 0x04db: cmd_exec_init_dst_surface */ | ||
460 | 0xf40749f0, | 542 | 0xf40749f0, |
461 | 0x57f00231, | 543 | 0x57f00231, |
462 | 0x083fc82c, | 544 | 0x083fc82c, |
463 | 0xf50a0bf4, | 545 | 0xf50a0bf4, |
464 | 0xf4038221, | 546 | 0xf4038221, |
547 | /* 0x04ee: dst_tiled */ | ||
465 | 0x21f50a0e, | 548 | 0x21f50a0e, |
466 | 0x49f00276, | 549 | 0x49f00276, |
550 | /* 0x04f5: cmd_exec_kick */ | ||
467 | 0x0057f108, | 551 | 0x0057f108, |
468 | 0x0654b608, | 552 | 0x0654b608, |
469 | 0xd0210698, | 553 | 0xd0210698, |
@@ -473,6 +557,8 @@ uint32_t nva3_pcopy_code[] = { | |||
473 | 0xc80054d0, | 557 | 0xc80054d0, |
474 | 0x0bf40c3f, | 558 | 0x0bf40c3f, |
475 | 0xc521f507, | 559 | 0xc521f507, |
560 | /* 0x0519: cmd_exec_done */ | ||
561 | /* 0x051b: cmd_wrcache_flush */ | ||
476 | 0xf100f803, | 562 | 0xf100f803, |
477 | 0xbd220027, | 563 | 0xbd220027, |
478 | 0x0133f034, | 564 | 0x0133f034, |
diff --git a/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h b/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h index a8d17458ced1..cd879f31bb38 100644 --- a/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h +++ b/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h | |||
@@ -1,34 +1,65 @@ | |||
1 | uint32_t nvc0_pcopy_data[] = { | 1 | u32 nvc0_pcopy_data[] = { |
2 | /* 0x0000: ctx_object */ | ||
2 | 0x00000000, | 3 | 0x00000000, |
4 | /* 0x0004: ctx_query_address_high */ | ||
3 | 0x00000000, | 5 | 0x00000000, |
6 | /* 0x0008: ctx_query_address_low */ | ||
4 | 0x00000000, | 7 | 0x00000000, |
8 | /* 0x000c: ctx_query_counter */ | ||
5 | 0x00000000, | 9 | 0x00000000, |
10 | /* 0x0010: ctx_src_address_high */ | ||
6 | 0x00000000, | 11 | 0x00000000, |
12 | /* 0x0014: ctx_src_address_low */ | ||
7 | 0x00000000, | 13 | 0x00000000, |
14 | /* 0x0018: ctx_src_pitch */ | ||
8 | 0x00000000, | 15 | 0x00000000, |
16 | /* 0x001c: ctx_src_tile_mode */ | ||
9 | 0x00000000, | 17 | 0x00000000, |
18 | /* 0x0020: ctx_src_xsize */ | ||
10 | 0x00000000, | 19 | 0x00000000, |
20 | /* 0x0024: ctx_src_ysize */ | ||
11 | 0x00000000, | 21 | 0x00000000, |
22 | /* 0x0028: ctx_src_zsize */ | ||
12 | 0x00000000, | 23 | 0x00000000, |
24 | /* 0x002c: ctx_src_zoff */ | ||
13 | 0x00000000, | 25 | 0x00000000, |
26 | /* 0x0030: ctx_src_xoff */ | ||
14 | 0x00000000, | 27 | 0x00000000, |
28 | /* 0x0034: ctx_src_yoff */ | ||
15 | 0x00000000, | 29 | 0x00000000, |
30 | /* 0x0038: ctx_src_cpp */ | ||
16 | 0x00000000, | 31 | 0x00000000, |
32 | /* 0x003c: ctx_dst_address_high */ | ||
17 | 0x00000000, | 33 | 0x00000000, |
34 | /* 0x0040: ctx_dst_address_low */ | ||
18 | 0x00000000, | 35 | 0x00000000, |
36 | /* 0x0044: ctx_dst_pitch */ | ||
19 | 0x00000000, | 37 | 0x00000000, |
38 | /* 0x0048: ctx_dst_tile_mode */ | ||
20 | 0x00000000, | 39 | 0x00000000, |
40 | /* 0x004c: ctx_dst_xsize */ | ||
21 | 0x00000000, | 41 | 0x00000000, |
42 | /* 0x0050: ctx_dst_ysize */ | ||
22 | 0x00000000, | 43 | 0x00000000, |
44 | /* 0x0054: ctx_dst_zsize */ | ||
23 | 0x00000000, | 45 | 0x00000000, |
46 | /* 0x0058: ctx_dst_zoff */ | ||
24 | 0x00000000, | 47 | 0x00000000, |
48 | /* 0x005c: ctx_dst_xoff */ | ||
25 | 0x00000000, | 49 | 0x00000000, |
50 | /* 0x0060: ctx_dst_yoff */ | ||
26 | 0x00000000, | 51 | 0x00000000, |
52 | /* 0x0064: ctx_dst_cpp */ | ||
27 | 0x00000000, | 53 | 0x00000000, |
54 | /* 0x0068: ctx_format */ | ||
28 | 0x00000000, | 55 | 0x00000000, |
56 | /* 0x006c: ctx_swz_const0 */ | ||
29 | 0x00000000, | 57 | 0x00000000, |
58 | /* 0x0070: ctx_swz_const1 */ | ||
30 | 0x00000000, | 59 | 0x00000000, |
60 | /* 0x0074: ctx_xcnt */ | ||
31 | 0x00000000, | 61 | 0x00000000, |
62 | /* 0x0078: ctx_ycnt */ | ||
32 | 0x00000000, | 63 | 0x00000000, |
33 | 0x00000000, | 64 | 0x00000000, |
34 | 0x00000000, | 65 | 0x00000000, |
@@ -63,6 +94,7 @@ uint32_t nvc0_pcopy_data[] = { | |||
63 | 0x00000000, | 94 | 0x00000000, |
64 | 0x00000000, | 95 | 0x00000000, |
65 | 0x00000000, | 96 | 0x00000000, |
97 | /* 0x0100: dispatch_table */ | ||
66 | 0x00010000, | 98 | 0x00010000, |
67 | 0x00000000, | 99 | 0x00000000, |
68 | 0x00000000, | 100 | 0x00000000, |
@@ -111,11 +143,11 @@ uint32_t nvc0_pcopy_data[] = { | |||
111 | 0x00000010, | 143 | 0x00000010, |
112 | 0xffffff00, | 144 | 0xffffff00, |
113 | 0x00000014, | 145 | 0x00000014, |
114 | 0x0000000f, | 146 | 0x00000000, |
115 | 0x0000003c, | 147 | 0x0000003c, |
116 | 0xffffff00, | 148 | 0xffffff00, |
117 | 0x00000040, | 149 | 0x00000040, |
118 | 0x0000000f, | 150 | 0x00000000, |
119 | 0x00000018, | 151 | 0x00000018, |
120 | 0xfff80000, | 152 | 0xfff80000, |
121 | 0x00000044, | 153 | 0x00000044, |
@@ -139,7 +171,8 @@ uint32_t nvc0_pcopy_data[] = { | |||
139 | 0x00000800, | 171 | 0x00000800, |
140 | }; | 172 | }; |
141 | 173 | ||
142 | uint32_t nvc0_pcopy_code[] = { | 174 | u32 nvc0_pcopy_code[] = { |
175 | /* 0x0000: main */ | ||
143 | 0x04fe04bd, | 176 | 0x04fe04bd, |
144 | 0x3517f000, | 177 | 0x3517f000, |
145 | 0xf10010fe, | 178 | 0xf10010fe, |
@@ -151,15 +184,20 @@ uint32_t nvc0_pcopy_code[] = { | |||
151 | 0x17f11031, | 184 | 0x17f11031, |
152 | 0x27f01200, | 185 | 0x27f01200, |
153 | 0x0012d003, | 186 | 0x0012d003, |
187 | /* 0x002f: spin */ | ||
154 | 0xf40031f4, | 188 | 0xf40031f4, |
155 | 0x0ef40028, | 189 | 0x0ef40028, |
190 | /* 0x0035: ih */ | ||
156 | 0x8001cffd, | 191 | 0x8001cffd, |
157 | 0xf40812c4, | 192 | 0xf40812c4, |
158 | 0x21f4060b, | 193 | 0x21f4060b, |
194 | /* 0x0041: ih_no_chsw */ | ||
159 | 0x0412c4ca, | 195 | 0x0412c4ca, |
160 | 0xf5070bf4, | 196 | 0xf5070bf4, |
197 | /* 0x004b: ih_no_cmd */ | ||
161 | 0xc4010221, | 198 | 0xc4010221, |
162 | 0x01d00c11, | 199 | 0x01d00c11, |
200 | /* 0x0053: swctx */ | ||
163 | 0xf101f840, | 201 | 0xf101f840, |
164 | 0xfe770047, | 202 | 0xfe770047, |
165 | 0x47f1004b, | 203 | 0x47f1004b, |
@@ -188,8 +226,11 @@ uint32_t nvc0_pcopy_code[] = { | |||
188 | 0xf00204b9, | 226 | 0xf00204b9, |
189 | 0x01f40643, | 227 | 0x01f40643, |
190 | 0x0604fa09, | 228 | 0x0604fa09, |
229 | /* 0x00c3: swctx_load */ | ||
191 | 0xfa060ef4, | 230 | 0xfa060ef4, |
231 | /* 0x00c6: swctx_done */ | ||
192 | 0x03f80504, | 232 | 0x03f80504, |
233 | /* 0x00ca: chsw */ | ||
193 | 0x27f100f8, | 234 | 0x27f100f8, |
194 | 0x23cf1400, | 235 | 0x23cf1400, |
195 | 0x1e3fc800, | 236 | 0x1e3fc800, |
@@ -198,18 +239,22 @@ uint32_t nvc0_pcopy_code[] = { | |||
198 | 0x1e3af053, | 239 | 0x1e3af053, |
199 | 0xf00023d0, | 240 | 0xf00023d0, |
200 | 0x24d00147, | 241 | 0x24d00147, |
242 | /* 0x00eb: chsw_no_unload */ | ||
201 | 0xcf00f880, | 243 | 0xcf00f880, |
202 | 0x3dc84023, | 244 | 0x3dc84023, |
203 | 0x090bf41e, | 245 | 0x090bf41e, |
204 | 0xf40131f4, | 246 | 0xf40131f4, |
247 | /* 0x00fa: chsw_finish_load */ | ||
205 | 0x37f05321, | 248 | 0x37f05321, |
206 | 0x8023d002, | 249 | 0x8023d002, |
250 | /* 0x0102: dispatch */ | ||
207 | 0x37f100f8, | 251 | 0x37f100f8, |
208 | 0x32cf1900, | 252 | 0x32cf1900, |
209 | 0x0033cf40, | 253 | 0x0033cf40, |
210 | 0x07ff24e4, | 254 | 0x07ff24e4, |
211 | 0xf11024b6, | 255 | 0xf11024b6, |
212 | 0xbd010057, | 256 | 0xbd010057, |
257 | /* 0x011b: dispatch_loop */ | ||
213 | 0x5874bd64, | 258 | 0x5874bd64, |
214 | 0x57580056, | 259 | 0x57580056, |
215 | 0x0450b601, | 260 | 0x0450b601, |
@@ -219,6 +264,7 @@ uint32_t nvc0_pcopy_code[] = { | |||
219 | 0xbb0f08f4, | 264 | 0xbb0f08f4, |
220 | 0x74b60276, | 265 | 0x74b60276, |
221 | 0x0057bb03, | 266 | 0x0057bb03, |
267 | /* 0x013f: dispatch_valid_mthd */ | ||
222 | 0xbbdf0ef4, | 268 | 0xbbdf0ef4, |
223 | 0x44b60246, | 269 | 0x44b60246, |
224 | 0x0045bb03, | 270 | 0x0045bb03, |
@@ -229,24 +275,33 @@ uint32_t nvc0_pcopy_code[] = { | |||
229 | 0x64b00146, | 275 | 0x64b00146, |
230 | 0x091bf400, | 276 | 0x091bf400, |
231 | 0xf4005380, | 277 | 0xf4005380, |
278 | /* 0x0166: dispatch_cmd */ | ||
232 | 0x32f4300e, | 279 | 0x32f4300e, |
233 | 0xf455f901, | 280 | 0xf455f901, |
234 | 0x0ef40c01, | 281 | 0x0ef40c01, |
282 | /* 0x0171: dispatch_invalid_bitfield */ | ||
235 | 0x0225f025, | 283 | 0x0225f025, |
284 | /* 0x0174: dispatch_illegal_mthd */ | ||
285 | /* 0x0177: dispatch_error */ | ||
236 | 0xf10125f0, | 286 | 0xf10125f0, |
237 | 0xd0100047, | 287 | 0xd0100047, |
238 | 0x43d00042, | 288 | 0x43d00042, |
239 | 0x4027f040, | 289 | 0x4027f040, |
290 | /* 0x0187: hostirq_wait */ | ||
240 | 0xcf0002d0, | 291 | 0xcf0002d0, |
241 | 0x24f08002, | 292 | 0x24f08002, |
242 | 0x0024b040, | 293 | 0x0024b040, |
294 | /* 0x0193: dispatch_done */ | ||
243 | 0xf1f71bf4, | 295 | 0xf1f71bf4, |
244 | 0xf01d0027, | 296 | 0xf01d0027, |
245 | 0x23d00137, | 297 | 0x23d00137, |
298 | /* 0x019f: cmd_nop */ | ||
246 | 0xf800f800, | 299 | 0xf800f800, |
300 | /* 0x01a1: cmd_pm_trigger */ | ||
247 | 0x0027f100, | 301 | 0x0027f100, |
248 | 0xf034bd22, | 302 | 0xf034bd22, |
249 | 0x23d00233, | 303 | 0x23d00233, |
304 | /* 0x01af: cmd_exec_set_format */ | ||
250 | 0xf400f800, | 305 | 0xf400f800, |
251 | 0x01b0f030, | 306 | 0x01b0f030, |
252 | 0x0101b000, | 307 | 0x0101b000, |
@@ -258,20 +313,26 @@ uint32_t nvc0_pcopy_code[] = { | |||
258 | 0x3847c701, | 313 | 0x3847c701, |
259 | 0xf40170b6, | 314 | 0xf40170b6, |
260 | 0x84bd0232, | 315 | 0x84bd0232, |
316 | /* 0x01da: ncomp_loop */ | ||
261 | 0x4ac494bd, | 317 | 0x4ac494bd, |
262 | 0x0445b60f, | 318 | 0x0445b60f, |
319 | /* 0x01e2: bpc_loop */ | ||
263 | 0xa430b4bd, | 320 | 0xa430b4bd, |
264 | 0x0f18f404, | 321 | 0x0f18f404, |
265 | 0xbbc0a5ff, | 322 | 0xbbc0a5ff, |
266 | 0x31f400cb, | 323 | 0x31f400cb, |
267 | 0x220ef402, | 324 | 0x220ef402, |
325 | /* 0x01f4: cmp_c0 */ | ||
268 | 0xf00c1bf4, | 326 | 0xf00c1bf4, |
269 | 0xcbbb10c7, | 327 | 0xcbbb10c7, |
270 | 0x160ef400, | 328 | 0x160ef400, |
329 | /* 0x0200: cmp_c1 */ | ||
271 | 0xf406a430, | 330 | 0xf406a430, |
272 | 0xc7f00c18, | 331 | 0xc7f00c18, |
273 | 0x00cbbb14, | 332 | 0x00cbbb14, |
333 | /* 0x020f: cmp_zero */ | ||
274 | 0xf1070ef4, | 334 | 0xf1070ef4, |
335 | /* 0x0213: bpc_next */ | ||
275 | 0x380080c7, | 336 | 0x380080c7, |
276 | 0x80b601c8, | 337 | 0x80b601c8, |
277 | 0x01b0b601, | 338 | 0x01b0b601, |
@@ -283,6 +344,7 @@ uint32_t nvc0_pcopy_code[] = { | |||
283 | 0x1d08980e, | 344 | 0x1d08980e, |
284 | 0xf40068fd, | 345 | 0xf40068fd, |
285 | 0x64bd0502, | 346 | 0x64bd0502, |
347 | /* 0x023c: dst_xcnt */ | ||
286 | 0x800075fd, | 348 | 0x800075fd, |
287 | 0x78fd1907, | 349 | 0x78fd1907, |
288 | 0x1057f100, | 350 | 0x1057f100, |
@@ -307,15 +369,18 @@ uint32_t nvc0_pcopy_code[] = { | |||
307 | 0x1c069800, | 369 | 0x1c069800, |
308 | 0xf44056d0, | 370 | 0xf44056d0, |
309 | 0x00f81030, | 371 | 0x00f81030, |
372 | /* 0x029c: cmd_exec_set_surface_tiled */ | ||
310 | 0xc7075798, | 373 | 0xc7075798, |
311 | 0x78c76879, | 374 | 0x78c76879, |
312 | 0x0380b664, | 375 | 0x0380b664, |
313 | 0xb06077c7, | 376 | 0xb06077c7, |
314 | 0x1bf40e76, | 377 | 0x1bf40e76, |
315 | 0x0477f009, | 378 | 0x0477f009, |
379 | /* 0x02b7: xtile64 */ | ||
316 | 0xf00f0ef4, | 380 | 0xf00f0ef4, |
317 | 0x70b6027c, | 381 | 0x70b6027c, |
318 | 0x0947fd11, | 382 | 0x0947fd11, |
383 | /* 0x02c3: xtileok */ | ||
319 | 0x980677f0, | 384 | 0x980677f0, |
320 | 0x5b980c5a, | 385 | 0x5b980c5a, |
321 | 0x00abfd0e, | 386 | 0x00abfd0e, |
@@ -374,6 +439,7 @@ uint32_t nvc0_pcopy_code[] = { | |||
374 | 0xb70067d0, | 439 | 0xb70067d0, |
375 | 0xd0040060, | 440 | 0xd0040060, |
376 | 0x00f80068, | 441 | 0x00f80068, |
442 | /* 0x03a8: cmd_exec_set_surface_linear */ | ||
377 | 0xb7026cf0, | 443 | 0xb7026cf0, |
378 | 0xb6020260, | 444 | 0xb6020260, |
379 | 0x57980864, | 445 | 0x57980864, |
@@ -384,12 +450,15 @@ uint32_t nvc0_pcopy_code[] = { | |||
384 | 0x0060b700, | 450 | 0x0060b700, |
385 | 0x06579804, | 451 | 0x06579804, |
386 | 0xf80067d0, | 452 | 0xf80067d0, |
453 | /* 0x03d1: cmd_exec_wait */ | ||
387 | 0xf900f900, | 454 | 0xf900f900, |
388 | 0x0007f110, | 455 | 0x0007f110, |
389 | 0x0604b608, | 456 | 0x0604b608, |
457 | /* 0x03dc: loop */ | ||
390 | 0xf00001cf, | 458 | 0xf00001cf, |
391 | 0x1bf40114, | 459 | 0x1bf40114, |
392 | 0xfc10fcfa, | 460 | 0xfc10fcfa, |
461 | /* 0x03eb: cmd_exec_query */ | ||
393 | 0xc800f800, | 462 | 0xc800f800, |
394 | 0x1bf40d34, | 463 | 0x1bf40d34, |
395 | 0xd121f570, | 464 | 0xd121f570, |
@@ -419,6 +488,7 @@ uint32_t nvc0_pcopy_code[] = { | |||
419 | 0x0153f026, | 488 | 0x0153f026, |
420 | 0x080047f1, | 489 | 0x080047f1, |
421 | 0xd00644b6, | 490 | 0xd00644b6, |
491 | /* 0x045e: query_counter */ | ||
422 | 0x21f50045, | 492 | 0x21f50045, |
423 | 0x47f103d1, | 493 | 0x47f103d1, |
424 | 0x44b6080c, | 494 | 0x44b6080c, |
@@ -442,11 +512,13 @@ uint32_t nvc0_pcopy_code[] = { | |||
442 | 0x080047f1, | 512 | 0x080047f1, |
443 | 0xd00644b6, | 513 | 0xd00644b6, |
444 | 0x00f80045, | 514 | 0x00f80045, |
515 | /* 0x04b8: cmd_exec */ | ||
445 | 0x03d121f5, | 516 | 0x03d121f5, |
446 | 0xf4003fc8, | 517 | 0xf4003fc8, |
447 | 0x21f50e0b, | 518 | 0x21f50e0b, |
448 | 0x47f101af, | 519 | 0x47f101af, |
449 | 0x0ef40200, | 520 | 0x0ef40200, |
521 | /* 0x04cd: cmd_exec_no_format */ | ||
450 | 0x1067f11e, | 522 | 0x1067f11e, |
451 | 0x0664b608, | 523 | 0x0664b608, |
452 | 0x800177f0, | 524 | 0x800177f0, |
@@ -454,18 +526,23 @@ uint32_t nvc0_pcopy_code[] = { | |||
454 | 0x1d079819, | 526 | 0x1d079819, |
455 | 0xd00067d0, | 527 | 0xd00067d0, |
456 | 0x44bd4067, | 528 | 0x44bd4067, |
529 | /* 0x04e8: cmd_exec_init_src_surface */ | ||
457 | 0xbd0232f4, | 530 | 0xbd0232f4, |
458 | 0x043fc854, | 531 | 0x043fc854, |
459 | 0xf50a0bf4, | 532 | 0xf50a0bf4, |
460 | 0xf403a821, | 533 | 0xf403a821, |
534 | /* 0x04fa: src_tiled */ | ||
461 | 0x21f50a0e, | 535 | 0x21f50a0e, |
462 | 0x49f0029c, | 536 | 0x49f0029c, |
537 | /* 0x0501: cmd_exec_init_dst_surface */ | ||
463 | 0x0231f407, | 538 | 0x0231f407, |
464 | 0xc82c57f0, | 539 | 0xc82c57f0, |
465 | 0x0bf4083f, | 540 | 0x0bf4083f, |
466 | 0xa821f50a, | 541 | 0xa821f50a, |
467 | 0x0a0ef403, | 542 | 0x0a0ef403, |
543 | /* 0x0514: dst_tiled */ | ||
468 | 0x029c21f5, | 544 | 0x029c21f5, |
545 | /* 0x051b: cmd_exec_kick */ | ||
469 | 0xf10849f0, | 546 | 0xf10849f0, |
470 | 0xb6080057, | 547 | 0xb6080057, |
471 | 0x06980654, | 548 | 0x06980654, |
@@ -475,7 +552,9 @@ uint32_t nvc0_pcopy_code[] = { | |||
475 | 0x54d00546, | 552 | 0x54d00546, |
476 | 0x0c3fc800, | 553 | 0x0c3fc800, |
477 | 0xf5070bf4, | 554 | 0xf5070bf4, |
555 | /* 0x053f: cmd_exec_done */ | ||
478 | 0xf803eb21, | 556 | 0xf803eb21, |
557 | /* 0x0541: cmd_wrcache_flush */ | ||
479 | 0x0027f100, | 558 | 0x0027f100, |
480 | 0xf034bd22, | 559 | 0xf034bd22, |
481 | 0x23d00133, | 560 | 0x23d00133, |
diff --git a/include/drm/nouveau_drm.h b/include/drm/nouveau_drm.h index 5edd3a76fffa..2a5769fdf8ba 100644 --- a/include/drm/nouveau_drm.h +++ b/include/drm/nouveau_drm.h | |||
@@ -25,70 +25,6 @@ | |||
25 | #ifndef __NOUVEAU_DRM_H__ | 25 | #ifndef __NOUVEAU_DRM_H__ |
26 | #define __NOUVEAU_DRM_H__ | 26 | #define __NOUVEAU_DRM_H__ |
27 | 27 | ||
28 | #define NOUVEAU_DRM_HEADER_PATCHLEVEL 16 | ||
29 | |||
30 | struct drm_nouveau_channel_alloc { | ||
31 | uint32_t fb_ctxdma_handle; | ||
32 | uint32_t tt_ctxdma_handle; | ||
33 | |||
34 | int channel; | ||
35 | uint32_t pushbuf_domains; | ||
36 | |||
37 | /* Notifier memory */ | ||
38 | uint32_t notifier_handle; | ||
39 | |||
40 | /* DRM-enforced subchannel assignments */ | ||
41 | struct { | ||
42 | uint32_t handle; | ||
43 | uint32_t grclass; | ||
44 | } subchan[8]; | ||
45 | uint32_t nr_subchan; | ||
46 | }; | ||
47 | |||
48 | struct drm_nouveau_channel_free { | ||
49 | int channel; | ||
50 | }; | ||
51 | |||
52 | struct drm_nouveau_grobj_alloc { | ||
53 | int channel; | ||
54 | uint32_t handle; | ||
55 | int class; | ||
56 | }; | ||
57 | |||
58 | struct drm_nouveau_notifierobj_alloc { | ||
59 | uint32_t channel; | ||
60 | uint32_t handle; | ||
61 | uint32_t size; | ||
62 | uint32_t offset; | ||
63 | }; | ||
64 | |||
65 | struct drm_nouveau_gpuobj_free { | ||
66 | int channel; | ||
67 | uint32_t handle; | ||
68 | }; | ||
69 | |||
70 | /* FIXME : maybe unify {GET,SET}PARAMs */ | ||
71 | #define NOUVEAU_GETPARAM_PCI_VENDOR 3 | ||
72 | #define NOUVEAU_GETPARAM_PCI_DEVICE 4 | ||
73 | #define NOUVEAU_GETPARAM_BUS_TYPE 5 | ||
74 | #define NOUVEAU_GETPARAM_FB_SIZE 8 | ||
75 | #define NOUVEAU_GETPARAM_AGP_SIZE 9 | ||
76 | #define NOUVEAU_GETPARAM_CHIPSET_ID 11 | ||
77 | #define NOUVEAU_GETPARAM_VM_VRAM_BASE 12 | ||
78 | #define NOUVEAU_GETPARAM_GRAPH_UNITS 13 | ||
79 | #define NOUVEAU_GETPARAM_PTIMER_TIME 14 | ||
80 | #define NOUVEAU_GETPARAM_HAS_BO_USAGE 15 | ||
81 | #define NOUVEAU_GETPARAM_HAS_PAGEFLIP 16 | ||
82 | struct drm_nouveau_getparam { | ||
83 | uint64_t param; | ||
84 | uint64_t value; | ||
85 | }; | ||
86 | |||
87 | struct drm_nouveau_setparam { | ||
88 | uint64_t param; | ||
89 | uint64_t value; | ||
90 | }; | ||
91 | |||
92 | #define NOUVEAU_GEM_DOMAIN_CPU (1 << 0) | 28 | #define NOUVEAU_GEM_DOMAIN_CPU (1 << 0) |
93 | #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) | 29 | #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) |
94 | #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) | 30 | #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) |
@@ -180,35 +116,19 @@ struct drm_nouveau_gem_cpu_fini { | |||
180 | uint32_t handle; | 116 | uint32_t handle; |
181 | }; | 117 | }; |
182 | 118 | ||
183 | enum nouveau_bus_type { | 119 | #define DRM_NOUVEAU_GETPARAM 0x00 /* deprecated */ |
184 | NV_AGP = 0, | 120 | #define DRM_NOUVEAU_SETPARAM 0x01 /* deprecated */ |
185 | NV_PCI = 1, | 121 | #define DRM_NOUVEAU_CHANNEL_ALLOC 0x02 /* deprecated */ |
186 | NV_PCIE = 2, | 122 | #define DRM_NOUVEAU_CHANNEL_FREE 0x03 /* deprecated */ |
187 | }; | 123 | #define DRM_NOUVEAU_GROBJ_ALLOC 0x04 /* deprecated */ |
188 | 124 | #define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC 0x05 /* deprecated */ | |
189 | struct drm_nouveau_sarea { | 125 | #define DRM_NOUVEAU_GPUOBJ_FREE 0x06 /* deprecated */ |
190 | }; | ||
191 | |||
192 | #define DRM_NOUVEAU_GETPARAM 0x00 | ||
193 | #define DRM_NOUVEAU_SETPARAM 0x01 | ||
194 | #define DRM_NOUVEAU_CHANNEL_ALLOC 0x02 | ||
195 | #define DRM_NOUVEAU_CHANNEL_FREE 0x03 | ||
196 | #define DRM_NOUVEAU_GROBJ_ALLOC 0x04 | ||
197 | #define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC 0x05 | ||
198 | #define DRM_NOUVEAU_GPUOBJ_FREE 0x06 | ||
199 | #define DRM_NOUVEAU_GEM_NEW 0x40 | 126 | #define DRM_NOUVEAU_GEM_NEW 0x40 |
200 | #define DRM_NOUVEAU_GEM_PUSHBUF 0x41 | 127 | #define DRM_NOUVEAU_GEM_PUSHBUF 0x41 |
201 | #define DRM_NOUVEAU_GEM_CPU_PREP 0x42 | 128 | #define DRM_NOUVEAU_GEM_CPU_PREP 0x42 |
202 | #define DRM_NOUVEAU_GEM_CPU_FINI 0x43 | 129 | #define DRM_NOUVEAU_GEM_CPU_FINI 0x43 |
203 | #define DRM_NOUVEAU_GEM_INFO 0x44 | 130 | #define DRM_NOUVEAU_GEM_INFO 0x44 |
204 | 131 | ||
205 | #define DRM_IOCTL_NOUVEAU_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GETPARAM, struct drm_nouveau_getparam) | ||
206 | #define DRM_IOCTL_NOUVEAU_SETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SETPARAM, struct drm_nouveau_setparam) | ||
207 | #define DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_CHANNEL_ALLOC, struct drm_nouveau_channel_alloc) | ||
208 | #define DRM_IOCTL_NOUVEAU_CHANNEL_FREE DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_CHANNEL_FREE, struct drm_nouveau_channel_free) | ||
209 | #define DRM_IOCTL_NOUVEAU_GROBJ_ALLOC DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GROBJ_ALLOC, struct drm_nouveau_grobj_alloc) | ||
210 | #define DRM_IOCTL_NOUVEAU_NOTIFIEROBJ_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_NOTIFIEROBJ_ALLOC, struct drm_nouveau_notifierobj_alloc) | ||
211 | #define DRM_IOCTL_NOUVEAU_GPUOBJ_FREE DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GPUOBJ_FREE, struct drm_nouveau_gpuobj_free) | ||
212 | #define DRM_IOCTL_NOUVEAU_GEM_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_NEW, struct drm_nouveau_gem_new) | 132 | #define DRM_IOCTL_NOUVEAU_GEM_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_NEW, struct drm_nouveau_gem_new) |
213 | #define DRM_IOCTL_NOUVEAU_GEM_PUSHBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_PUSHBUF, struct drm_nouveau_gem_pushbuf) | 133 | #define DRM_IOCTL_NOUVEAU_GEM_PUSHBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_PUSHBUF, struct drm_nouveau_gem_pushbuf) |
214 | #define DRM_IOCTL_NOUVEAU_GEM_CPU_PREP DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_PREP, struct drm_nouveau_gem_cpu_prep) | 134 | #define DRM_IOCTL_NOUVEAU_GEM_CPU_PREP DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_PREP, struct drm_nouveau_gem_cpu_prep) |