Merge branch 'drm-nouveau-fixes' of git://git.freedesktop.org/git/nouveau/linux-2.6 into drm-fixes
* 'drm-nouveau-fixes' of git://git.freedesktop.org/git/nouveau/linux-2.6: drm/nv50/disp: silence compiler warning drm/nouveau: fix oopses caused by clear being called on unpopulated ttms drm/nouveau: Keep RAMIN heap within the channel. drm/nvd0/disp: fix sor dpms typo, preventing dpms on in some situations drm/nvc0/gr: fix TP init for transform feedback offset queries drm/nouveau: add dumb ioctl support
This commit is contained in:
Коммит
4f3e0b1d33
|
@ -369,3 +369,48 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
|
|||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
struct nouveau_bo *bo;
|
||||
int ret;
|
||||
|
||||
args->pitch = roundup(args->width * (args->bpp / 8), 256);
|
||||
args->size = args->pitch * args->height;
|
||||
args->size = roundup(args->size, PAGE_SIZE);
|
||||
|
||||
ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = drm_gem_handle_create(file_priv, bo->gem, &args->handle);
|
||||
drm_gem_object_unreference_unlocked(bo->gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_display_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev,
|
||||
uint32_t handle)
|
||||
{
|
||||
return drm_gem_handle_delete(file_priv, handle);
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_display_dumb_map_offset(struct drm_file *file_priv,
|
||||
struct drm_device *dev,
|
||||
uint32_t handle, uint64_t *poffset)
|
||||
{
|
||||
struct drm_gem_object *gem;
|
||||
|
||||
gem = drm_gem_object_lookup(dev, file_priv, handle);
|
||||
if (gem) {
|
||||
struct nouveau_bo *bo = gem->driver_private;
|
||||
*poffset = bo->bo.addr_space_offset;
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
|
|
@ -433,6 +433,10 @@ static struct drm_driver driver = {
|
|||
.gem_open_object = nouveau_gem_object_open,
|
||||
.gem_close_object = nouveau_gem_object_close,
|
||||
|
||||
.dumb_create = nouveau_display_dumb_create,
|
||||
.dumb_map_offset = nouveau_display_dumb_map_offset,
|
||||
.dumb_destroy = nouveau_display_dumb_destroy,
|
||||
|
||||
.name = DRIVER_NAME,
|
||||
.desc = DRIVER_DESC,
|
||||
#ifdef GIT_REVISION
|
||||
|
|
|
@ -1418,6 +1418,12 @@ int nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
|||
struct drm_pending_vblank_event *event);
|
||||
int nouveau_finish_page_flip(struct nouveau_channel *,
|
||||
struct nouveau_page_flip_state *);
|
||||
int nouveau_display_dumb_create(struct drm_file *, struct drm_device *,
|
||||
struct drm_mode_create_dumb *args);
|
||||
int nouveau_display_dumb_map_offset(struct drm_file *, struct drm_device *,
|
||||
uint32_t handle, uint64_t *offset);
|
||||
int nouveau_display_dumb_destroy(struct drm_file *, struct drm_device *,
|
||||
uint32_t handle);
|
||||
|
||||
/* nv10_gpio.c */
|
||||
int nv10_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
|
||||
|
|
|
@ -680,7 +680,7 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = drm_mm_init(&chan->ramin_heap, base, size);
|
||||
ret = drm_mm_init(&chan->ramin_heap, base, size - base);
|
||||
if (ret) {
|
||||
NV_ERROR(dev, "Error creating PRAMIN heap: %d\n", ret);
|
||||
nouveau_gpuobj_ref(NULL, &chan->ramin);
|
||||
|
|
|
@ -67,7 +67,10 @@ nouveau_sgdma_clear(struct ttm_backend *be)
|
|||
pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
|
||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
}
|
||||
nvbe->unmap_pages = false;
|
||||
}
|
||||
|
||||
nvbe->pages = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -616,7 +616,7 @@ nv50_display_unk10_handler(struct drm_device *dev)
|
|||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
struct nv50_display *disp = nv50_display(dev);
|
||||
u32 unk30 = nv_rd32(dev, 0x610030), mc;
|
||||
int i, crtc, or, type = OUTPUT_ANY;
|
||||
int i, crtc, or = 0, type = OUTPUT_ANY;
|
||||
|
||||
NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
|
||||
disp->irq.dcb = NULL;
|
||||
|
@ -708,7 +708,7 @@ nv50_display_unk20_handler(struct drm_device *dev)
|
|||
struct nv50_display *disp = nv50_display(dev);
|
||||
u32 unk30 = nv_rd32(dev, 0x610030), tmp, pclk, script, mc = 0;
|
||||
struct dcb_entry *dcb;
|
||||
int i, crtc, or, type = OUTPUT_ANY;
|
||||
int i, crtc, or = 0, type = OUTPUT_ANY;
|
||||
|
||||
NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
|
||||
dcb = disp->irq.dcb;
|
||||
|
|
|
@ -381,6 +381,8 @@ nvc0_graph_init_gpc_0(struct drm_device *dev)
|
|||
u8 tpnr[GPC_MAX];
|
||||
int i, gpc, tpc;
|
||||
|
||||
nv_wr32(dev, TP_UNIT(0, 0, 0x5c), 1); /* affects TFB offset queries */
|
||||
|
||||
/*
|
||||
* TP ROP UNKVAL(magic_not_rop_nr)
|
||||
* 450: 4/0/0/0 2 3
|
||||
|
|
|
@ -780,7 +780,7 @@ nvd0_sor_dpms(struct drm_encoder *encoder, int mode)
|
|||
continue;
|
||||
|
||||
if (nv_partner != nv_encoder &&
|
||||
nv_partner->dcb->or == nv_encoder->or) {
|
||||
nv_partner->dcb->or == nv_encoder->dcb->or) {
|
||||
if (nv_partner->last_dpms == DRM_MODE_DPMS_ON)
|
||||
return;
|
||||
break;
|
||||
|
|
Загрузка…
Ссылка в новой задаче