aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_object.c8
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_sgdma.c16
3 files changed, 10 insertions, 18 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index f8931b2d129b..8f13906185b2 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -934,8 +934,8 @@ extern void nouveau_irq_uninstall(struct drm_device *);
934/* nouveau_sgdma.c */ 934/* nouveau_sgdma.c */
935extern int nouveau_sgdma_init(struct drm_device *); 935extern int nouveau_sgdma_init(struct drm_device *);
936extern void nouveau_sgdma_takedown(struct drm_device *); 936extern void nouveau_sgdma_takedown(struct drm_device *);
937extern int nouveau_sgdma_get_page(struct drm_device *, uint32_t offset, 937extern uint32_t nouveau_sgdma_get_physical(struct drm_device *,
938 uint32_t *page); 938 uint32_t offset);
939extern struct ttm_backend *nouveau_sgdma_init_ttm(struct drm_device *); 939extern struct ttm_backend *nouveau_sgdma_init_ttm(struct drm_device *);
940 940
941/* nouveau_debugfs.c */ 941/* nouveau_debugfs.c */
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c
index d1bed40dc449..55c9fdcfa67f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_object.c
+++ b/drivers/gpu/drm/nouveau/nouveau_object.c
@@ -478,7 +478,7 @@ nouveau_gpuobj_dma_new(struct nouveau_channel *chan, int class, u64 base,
478 struct drm_nouveau_private *dev_priv = chan->dev->dev_private; 478 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
479 struct drm_device *dev = chan->dev; 479 struct drm_device *dev = chan->dev;
480 struct nouveau_gpuobj *obj; 480 struct nouveau_gpuobj *obj;
481 u32 page_addr, flags0, flags2; 481 u32 flags0, flags2;
482 int ret; 482 int ret;
483 483
484 if (dev_priv->card_type >= NV_50) { 484 if (dev_priv->card_type >= NV_50) {
@@ -495,12 +495,8 @@ nouveau_gpuobj_dma_new(struct nouveau_channel *chan, int class, u64 base,
495 base += dev_priv->gart_info.aper_base; 495 base += dev_priv->gart_info.aper_base;
496 } else 496 } else
497 if (base != 0) { 497 if (base != 0) {
498 ret = nouveau_sgdma_get_page(dev, base, &page_addr); 498 base = nouveau_sgdma_get_physical(dev, base);
499 if (ret)
500 return ret;
501
502 target = NV_MEM_TARGET_PCI; 499 target = NV_MEM_TARGET_PCI;
503 base = page_addr;
504 } else { 500 } else {
505 nouveau_gpuobj_ref(dev_priv->gart_info.sg_ctxdma, pobj); 501 nouveau_gpuobj_ref(dev_priv->gart_info.sg_ctxdma, pobj);
506 return 0; 502 return 0;
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
index b57201ab538e..9a250eb53098 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
@@ -267,19 +267,15 @@ nouveau_sgdma_takedown(struct drm_device *dev)
267 nouveau_vm_put(&dev_priv->gart_info.vma); 267 nouveau_vm_put(&dev_priv->gart_info.vma);
268} 268}
269 269
270int 270uint32_t
271nouveau_sgdma_get_page(struct drm_device *dev, uint32_t offset, uint32_t *page) 271nouveau_sgdma_get_physical(struct drm_device *dev, uint32_t offset)
272{ 272{
273 struct drm_nouveau_private *dev_priv = dev->dev_private; 273 struct drm_nouveau_private *dev_priv = dev->dev_private;
274 struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma; 274 struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma;
275 int pte; 275 int pte = (offset >> NV_CTXDMA_PAGE_SHIFT) + 2;
276 276
277 pte = (offset >> NV_CTXDMA_PAGE_SHIFT) << 2; 277 BUG_ON(dev_priv->card_type >= NV_50);
278 if (dev_priv->card_type < NV_50) {
279 *page = nv_ro32(gpuobj, (pte + 8)) & ~NV_CTXDMA_PAGE_MASK;
280 return 0;
281 }
282 278
283 NV_ERROR(dev, "Unimplemented on NV50\n"); 279 return (nv_ro32(gpuobj, 4 * pte) & ~NV_CTXDMA_PAGE_MASK) |
284 return -EINVAL; 280 (offset & NV_CTXDMA_PAGE_MASK);
285} 281}