aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-14 21:37:05 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-14 21:37:05 -0400
commit0d1d392f011b284bb4af0411b2d36e5d04e0f058 (patch)
tree081f99182bde3cc8af49b80b4e9df7d95476e8ed /drivers/gpu/drm/nouveau
parentfa180eb448fa263cf18dd930143b515d27d70d7b (diff)
parent41ef2d5678d83af030125550329b6ae8b74618fa (diff)
Merge 3.9-rc7 into driver-core-next
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/gpu/drm/nouveau')
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/bios/base.c17
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_abi16.c18
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.c32
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.h2
-rw-r--r--drivers/gpu/drm/nouveau/nv50_display.c2
5 files changed, 49 insertions, 22 deletions
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c
index e816f06637a7..0e2c1a4f1659 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c
@@ -248,6 +248,22 @@ nouveau_bios_shadow_pci(struct nouveau_bios *bios)
248 } 248 }
249} 249}
250 250
251static void
252nouveau_bios_shadow_platform(struct nouveau_bios *bios)
253{
254 struct pci_dev *pdev = nv_device(bios)->pdev;
255 size_t size;
256
257 void __iomem *rom = pci_platform_rom(pdev, &size);
258 if (rom && size) {
259 bios->data = kmalloc(size, GFP_KERNEL);
260 if (bios->data) {
261 memcpy_fromio(bios->data, rom, size);
262 bios->size = size;
263 }
264 }
265}
266
251static int 267static int
252nouveau_bios_score(struct nouveau_bios *bios, const bool writeable) 268nouveau_bios_score(struct nouveau_bios *bios, const bool writeable)
253{ 269{
@@ -288,6 +304,7 @@ nouveau_bios_shadow(struct nouveau_bios *bios)
288 { "PROM", nouveau_bios_shadow_prom, false, 0, 0, NULL }, 304 { "PROM", nouveau_bios_shadow_prom, false, 0, 0, NULL },
289 { "ACPI", nouveau_bios_shadow_acpi, true, 0, 0, NULL }, 305 { "ACPI", nouveau_bios_shadow_acpi, true, 0, 0, NULL },
290 { "PCIROM", nouveau_bios_shadow_pci, true, 0, 0, NULL }, 306 { "PCIROM", nouveau_bios_shadow_pci, true, 0, 0, NULL },
307 { "PLATFORM", nouveau_bios_shadow_platform, true, 0, 0, NULL },
291 {} 308 {}
292 }; 309 };
293 struct methods *mthd, *best; 310 struct methods *mthd, *best;
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c
index 3b6dc883e150..5eb3e0da7c6e 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.c
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c
@@ -391,7 +391,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
391 struct nouveau_drm *drm = nouveau_drm(dev); 391 struct nouveau_drm *drm = nouveau_drm(dev);
392 struct nouveau_device *device = nv_device(drm->device); 392 struct nouveau_device *device = nv_device(drm->device);
393 struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); 393 struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev);
394 struct nouveau_abi16_chan *chan, *temp; 394 struct nouveau_abi16_chan *chan = NULL, *temp;
395 struct nouveau_abi16_ntfy *ntfy; 395 struct nouveau_abi16_ntfy *ntfy;
396 struct nouveau_object *object; 396 struct nouveau_object *object;
397 struct nv_dma_class args = {}; 397 struct nv_dma_class args = {};
@@ -404,10 +404,11 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
404 if (unlikely(nv_device(abi16->device)->card_type >= NV_C0)) 404 if (unlikely(nv_device(abi16->device)->card_type >= NV_C0))
405 return nouveau_abi16_put(abi16, -EINVAL); 405 return nouveau_abi16_put(abi16, -EINVAL);
406 406
407 list_for_each_entry_safe(chan, temp, &abi16->channels, head) { 407 list_for_each_entry(temp, &abi16->channels, head) {
408 if (chan->chan->handle == (NVDRM_CHAN | info->channel)) 408 if (temp->chan->handle == (NVDRM_CHAN | info->channel)) {
409 chan = temp;
409 break; 410 break;
410 chan = NULL; 411 }
411 } 412 }
412 413
413 if (!chan) 414 if (!chan)
@@ -459,17 +460,18 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS)
459{ 460{
460 struct drm_nouveau_gpuobj_free *fini = data; 461 struct drm_nouveau_gpuobj_free *fini = data;
461 struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); 462 struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev);
462 struct nouveau_abi16_chan *chan, *temp; 463 struct nouveau_abi16_chan *chan = NULL, *temp;
463 struct nouveau_abi16_ntfy *ntfy; 464 struct nouveau_abi16_ntfy *ntfy;
464 int ret; 465 int ret;
465 466
466 if (unlikely(!abi16)) 467 if (unlikely(!abi16))
467 return -ENOMEM; 468 return -ENOMEM;
468 469
469 list_for_each_entry_safe(chan, temp, &abi16->channels, head) { 470 list_for_each_entry(temp, &abi16->channels, head) {
470 if (chan->chan->handle == (NVDRM_CHAN | fini->channel)) 471 if (temp->chan->handle == (NVDRM_CHAN | fini->channel)) {
472 chan = temp;
471 break; 473 break;
472 chan = NULL; 474 }
473 } 475 }
474 476
475 if (!chan) 477 if (!chan)
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index d1099365bfc1..c95decf543e9 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -72,11 +72,25 @@ module_param_named(modeset, nouveau_modeset, int, 0400);
72static struct drm_driver driver; 72static struct drm_driver driver;
73 73
74static int 74static int
75nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head)
76{
77 struct nouveau_drm *drm =
78 container_of(event, struct nouveau_drm, vblank[head]);
79 drm_handle_vblank(drm->dev, head);
80 return NVKM_EVENT_KEEP;
81}
82
83static int
75nouveau_drm_vblank_enable(struct drm_device *dev, int head) 84nouveau_drm_vblank_enable(struct drm_device *dev, int head)
76{ 85{
77 struct nouveau_drm *drm = nouveau_drm(dev); 86 struct nouveau_drm *drm = nouveau_drm(dev);
78 struct nouveau_disp *pdisp = nouveau_disp(drm->device); 87 struct nouveau_disp *pdisp = nouveau_disp(drm->device);
79 nouveau_event_get(pdisp->vblank, head, &drm->vblank); 88
89 if (WARN_ON_ONCE(head > ARRAY_SIZE(drm->vblank)))
90 return -EIO;
91 WARN_ON_ONCE(drm->vblank[head].func);
92 drm->vblank[head].func = nouveau_drm_vblank_handler;
93 nouveau_event_get(pdisp->vblank, head, &drm->vblank[head]);
80 return 0; 94 return 0;
81} 95}
82 96
@@ -85,16 +99,11 @@ nouveau_drm_vblank_disable(struct drm_device *dev, int head)
85{ 99{
86 struct nouveau_drm *drm = nouveau_drm(dev); 100 struct nouveau_drm *drm = nouveau_drm(dev);
87 struct nouveau_disp *pdisp = nouveau_disp(drm->device); 101 struct nouveau_disp *pdisp = nouveau_disp(drm->device);
88 nouveau_event_put(pdisp->vblank, head, &drm->vblank); 102 if (drm->vblank[head].func)
89} 103 nouveau_event_put(pdisp->vblank, head, &drm->vblank[head]);
90 104 else
91static int 105 WARN_ON_ONCE(1);
92nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head) 106 drm->vblank[head].func = NULL;
93{
94 struct nouveau_drm *drm =
95 container_of(event, struct nouveau_drm, vblank);
96 drm_handle_vblank(drm->dev, head);
97 return NVKM_EVENT_KEEP;
98} 107}
99 108
100static u64 109static u64
@@ -292,7 +301,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
292 301
293 dev->dev_private = drm; 302 dev->dev_private = drm;
294 drm->dev = dev; 303 drm->dev = dev;
295 drm->vblank.func = nouveau_drm_vblank_handler;
296 304
297 INIT_LIST_HEAD(&drm->clients); 305 INIT_LIST_HEAD(&drm->clients);
298 spin_lock_init(&drm->tile.lock); 306 spin_lock_init(&drm->tile.lock);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.h b/drivers/gpu/drm/nouveau/nouveau_drm.h
index b25df374c901..9c39bafbef2c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.h
@@ -113,7 +113,7 @@ struct nouveau_drm {
113 struct nvbios vbios; 113 struct nvbios vbios;
114 struct nouveau_display *display; 114 struct nouveau_display *display;
115 struct backlight_device *backlight; 115 struct backlight_device *backlight;
116 struct nouveau_eventh vblank; 116 struct nouveau_eventh vblank[4];
117 117
118 /* power management */ 118 /* power management */
119 struct nouveau_pm *pm; 119 struct nouveau_pm *pm;
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
index 7f0e6c3f37d1..1ddc03e51bf4 100644
--- a/drivers/gpu/drm/nouveau/nv50_display.c
+++ b/drivers/gpu/drm/nouveau/nv50_display.c
@@ -479,7 +479,7 @@ nv50_display_flip_wait(void *data)
479{ 479{
480 struct nv50_display_flip *flip = data; 480 struct nv50_display_flip *flip = data;
481 if (nouveau_bo_rd32(flip->disp->sync, flip->chan->addr / 4) == 481 if (nouveau_bo_rd32(flip->disp->sync, flip->chan->addr / 4) ==
482 flip->chan->data); 482 flip->chan->data)
483 return true; 483 return true;
484 usleep_range(1, 2); 484 usleep_range(1, 2);
485 return false; 485 return false;