提交 83d45f23 编写于 作者: D Dave Airlie

Merge branch 'linux-3.17' of git://anongit.freedesktop.org/git/nouveau/linux-2.6 into drm-fixes

A couple of thinkos from the -next merge, some random fixes from a
coverity scan, fix for (at least) GK106 accidentally using
non-existent vram on some board configurations, and better behaviour
of the instmem allocations if vmalloc space runs out.

* 'linux-3.17' of git://anongit.freedesktop.org/git/nouveau/linux-2.6:
  drm/nouveau/platform: fix compilation error
  drm/nouveau/gk20a: add LTC device
  drm/nouveau: warn if we fail to re-pin fb on resume
  drm/nouveau/nvif: fix dac load detect method definition
  drm/gf100-/gr: fix -ENOSPC detection when allocating zbc table entries
  drm/nouveau/nvif: return null pointers on failure, in addition to ret != 0
  drm/nouveau/ltc: fix tag base address getting truncated if above 4GiB
  drm/nvc0-/fb/ram: fix use of non-existant ram if partitions aren't uniform
  drm/nouveau/bar: behave better if ioremap failed
  drm/nouveau/kms: nouveau_fbcon_accel_fini can be static
  drm/nouveau: kill unused variable warning if !__OS_HAS_AGP
  drm/nouveau/nvif: fix a number of notify thinkos
...@@ -132,12 +132,12 @@ nvkm_client_notify_new(struct nouveau_client *client, ...@@ -132,12 +132,12 @@ nvkm_client_notify_new(struct nouveau_client *client,
if (ret == 0) { if (ret == 0) {
client->notify[index] = notify; client->notify[index] = notify;
notify->client = client; notify->client = client;
return 0; return index;
} }
} }
kfree(notify); kfree(notify);
return 0; return ret;
} }
static int static int
......
...@@ -163,6 +163,7 @@ nve0_identify(struct nouveau_device *device) ...@@ -163,6 +163,7 @@ nve0_identify(struct nouveau_device *device)
device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass; device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass;
device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass; device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass;
device->oclass[NVDEV_SUBDEV_FB ] = gk20a_fb_oclass; device->oclass[NVDEV_SUBDEV_FB ] = gk20a_fb_oclass;
device->oclass[NVDEV_SUBDEV_LTC ] = gk104_ltc_oclass;
device->oclass[NVDEV_SUBDEV_IBUS ] = &gk20a_ibus_oclass; device->oclass[NVDEV_SUBDEV_IBUS ] = &gk20a_ibus_oclass;
device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass; device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass;
device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
......
...@@ -68,6 +68,9 @@ nvc0_graph_zbc_color_get(struct nvc0_graph_priv *priv, int format, ...@@ -68,6 +68,9 @@ nvc0_graph_zbc_color_get(struct nvc0_graph_priv *priv, int format,
} }
} }
if (zbc < 0)
return zbc;
memcpy(priv->zbc_color[zbc].ds, ds, sizeof(priv->zbc_color[zbc].ds)); memcpy(priv->zbc_color[zbc].ds, ds, sizeof(priv->zbc_color[zbc].ds));
memcpy(priv->zbc_color[zbc].l2, l2, sizeof(priv->zbc_color[zbc].l2)); memcpy(priv->zbc_color[zbc].l2, l2, sizeof(priv->zbc_color[zbc].l2));
priv->zbc_color[zbc].format = format; priv->zbc_color[zbc].format = format;
...@@ -109,6 +112,9 @@ nvc0_graph_zbc_depth_get(struct nvc0_graph_priv *priv, int format, ...@@ -109,6 +112,9 @@ nvc0_graph_zbc_depth_get(struct nvc0_graph_priv *priv, int format,
} }
} }
if (zbc < 0)
return zbc;
priv->zbc_depth[zbc].format = format; priv->zbc_depth[zbc].format = format;
priv->zbc_depth[zbc].ds = ds; priv->zbc_depth[zbc].ds = ds;
priv->zbc_depth[zbc].l2 = l2; priv->zbc_depth[zbc].l2 = l2;
......
...@@ -14,7 +14,7 @@ struct nouveau_client { ...@@ -14,7 +14,7 @@ struct nouveau_client {
void *data; void *data;
int (*ntfy)(const void *, u32, const void *, u32); int (*ntfy)(const void *, u32, const void *, u32);
struct nvkm_client_notify *notify[8]; struct nvkm_client_notify *notify[16];
}; };
static inline struct nouveau_client * static inline struct nouveau_client *
......
...@@ -99,8 +99,13 @@ nouveau_bar_alloc(struct nouveau_bar *bar, struct nouveau_object *parent, ...@@ -99,8 +99,13 @@ nouveau_bar_alloc(struct nouveau_bar *bar, struct nouveau_object *parent,
struct nouveau_mem *mem, struct nouveau_object **pobject) struct nouveau_mem *mem, struct nouveau_object **pobject)
{ {
struct nouveau_object *engine = nv_object(bar); struct nouveau_object *engine = nv_object(bar);
return nouveau_object_ctor(parent, engine, &nouveau_barobj_oclass, int ret = -ENOMEM;
mem, 0, pobject); if (bar->iomem) {
ret = nouveau_object_ctor(parent, engine,
&nouveau_barobj_oclass,
mem, 0, pobject);
}
return ret;
} }
int int
...@@ -118,9 +123,12 @@ nouveau_bar_create_(struct nouveau_object *parent, ...@@ -118,9 +123,12 @@ nouveau_bar_create_(struct nouveau_object *parent,
if (ret) if (ret)
return ret; return ret;
if (nv_device_resource_len(device, 3) != 0) if (nv_device_resource_len(device, 3) != 0) {
bar->iomem = ioremap(nv_device_resource_start(device, 3), bar->iomem = ioremap(nv_device_resource_start(device, 3),
nv_device_resource_len(device, 3)); nv_device_resource_len(device, 3));
if (!bar->iomem)
nv_warn(bar, "PRAMIN ioremap failed\n");
}
return 0; return 0;
} }
......
...@@ -554,13 +554,13 @@ nvc0_ram_create_(struct nouveau_object *parent, struct nouveau_object *engine, ...@@ -554,13 +554,13 @@ nvc0_ram_create_(struct nouveau_object *parent, struct nouveau_object *engine,
} else { } else {
/* otherwise, address lowest common amount from 0GiB */ /* otherwise, address lowest common amount from 0GiB */
ret = nouveau_mm_init(&pfb->vram, rsvd_head, ret = nouveau_mm_init(&pfb->vram, rsvd_head,
(bsize << 8) * parts, 1); (bsize << 8) * parts - rsvd_head, 1);
if (ret) if (ret)
return ret; return ret;
/* and the rest starting from (8GiB + common_size) */ /* and the rest starting from (8GiB + common_size) */
offset = (0x0200000000ULL >> 12) + (bsize << 8); offset = (0x0200000000ULL >> 12) + (bsize << 8);
length = (ram->size >> 12) - (bsize << 8) - rsvd_tail; length = (ram->size >> 12) - ((bsize * parts) << 8) - rsvd_tail;
ret = nouveau_mm_init(&pfb->vram, offset, length, 0); ret = nouveau_mm_init(&pfb->vram, offset, length, 0);
if (ret) if (ret)
......
...@@ -156,7 +156,7 @@ gf100_ltc_init_tag_ram(struct nouveau_fb *pfb, struct nvkm_ltc_priv *priv) ...@@ -156,7 +156,7 @@ gf100_ltc_init_tag_ram(struct nouveau_fb *pfb, struct nvkm_ltc_priv *priv)
if (ret) { if (ret) {
priv->num_tags = 0; priv->num_tags = 0;
} else { } else {
u64 tag_base = (priv->tag_ram->offset << 12) + tag_margin; u64 tag_base = ((u64)priv->tag_ram->offset << 12) + tag_margin;
tag_base += tag_align - 1; tag_base += tag_align - 1;
ret = do_div(tag_base, tag_align); ret = do_div(tag_base, tag_align);
......
...@@ -1228,7 +1228,6 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) ...@@ -1228,7 +1228,6 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
struct nouveau_drm *drm = nouveau_bdev(bdev); struct nouveau_drm *drm = nouveau_bdev(bdev);
struct nouveau_mem *node = mem->mm_node; struct nouveau_mem *node = mem->mm_node;
struct drm_device *dev = drm->dev;
int ret; int ret;
mem->bus.addr = NULL; mem->bus.addr = NULL;
...@@ -1247,7 +1246,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) ...@@ -1247,7 +1246,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
if (drm->agp.stat == ENABLED) { if (drm->agp.stat == ENABLED) {
mem->bus.offset = mem->start << PAGE_SHIFT; mem->bus.offset = mem->start << PAGE_SHIFT;
mem->bus.base = drm->agp.base; mem->bus.base = drm->agp.base;
mem->bus.is_iomem = !dev->agp->cant_use_aperture; mem->bus.is_iomem = !drm->dev->agp->cant_use_aperture;
} }
#endif #endif
if (drm->device.info.family < NV_DEVICE_INFO_V0_TESLA || !node->memtype) if (drm->device.info.family < NV_DEVICE_INFO_V0_TESLA || !node->memtype)
......
...@@ -592,7 +592,9 @@ nouveau_display_repin(struct drm_device *dev) ...@@ -592,7 +592,9 @@ nouveau_display_repin(struct drm_device *dev)
if (!nouveau_fb || !nouveau_fb->nvbo) if (!nouveau_fb || !nouveau_fb->nvbo)
continue; continue;
nouveau_bo_pin(nouveau_fb->nvbo, TTM_PL_FLAG_VRAM); ret = nouveau_bo_pin(nouveau_fb->nvbo, TTM_PL_FLAG_VRAM);
if (ret)
NV_ERROR(drm, "Could not pin framebuffer\n");
} }
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
......
...@@ -226,7 +226,7 @@ nouveau_fbcon_accel_restore(struct drm_device *dev) ...@@ -226,7 +226,7 @@ nouveau_fbcon_accel_restore(struct drm_device *dev)
} }
} }
void static void
nouveau_fbcon_accel_fini(struct drm_device *dev) nouveau_fbcon_accel_fini(struct drm_device *dev)
{ {
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
...@@ -246,7 +246,7 @@ nouveau_fbcon_accel_fini(struct drm_device *dev) ...@@ -246,7 +246,7 @@ nouveau_fbcon_accel_fini(struct drm_device *dev)
} }
} }
void static void
nouveau_fbcon_accel_init(struct drm_device *dev) nouveau_fbcon_accel_init(struct drm_device *dev)
{ {
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
......
...@@ -149,7 +149,8 @@ static int nouveau_platform_probe(struct platform_device *pdev) ...@@ -149,7 +149,8 @@ static int nouveau_platform_probe(struct platform_device *pdev)
static int nouveau_platform_remove(struct platform_device *pdev) static int nouveau_platform_remove(struct platform_device *pdev)
{ {
struct drm_device *drm_dev = platform_get_drvdata(pdev); struct drm_device *drm_dev = platform_get_drvdata(pdev);
struct nouveau_device *device = nouveau_dev(drm_dev); struct nouveau_drm *drm = nouveau_drm(drm_dev);
struct nouveau_device *device = nvkm_device(&drm->device);
struct nouveau_platform_gpu *gpu = nv_device_to_platform(device)->gpu; struct nouveau_platform_gpu *gpu = nv_device_to_platform(device)->gpu;
nouveau_drm_device_remove(drm_dev); nouveau_drm_device_remove(drm_dev);
......
...@@ -428,8 +428,8 @@ struct nv50_disp_dac_pwr_v0 { ...@@ -428,8 +428,8 @@ struct nv50_disp_dac_pwr_v0 {
struct nv50_disp_dac_load_v0 { struct nv50_disp_dac_load_v0 {
__u8 version; __u8 version;
__u8 load; __u8 load;
__u16 data; __u8 pad02[2];
__u8 pad04[4]; __u32 data;
}; };
struct nv50_disp_sor_pwr_v0 { struct nv50_disp_sor_pwr_v0 {
......
...@@ -87,12 +87,25 @@ nvif_notify_get(struct nvif_notify *notify) ...@@ -87,12 +87,25 @@ nvif_notify_get(struct nvif_notify *notify)
return 0; return 0;
} }
static inline int
nvif_notify_func(struct nvif_notify *notify, bool keep)
{
int ret = notify->func(notify);
if (ret == NVIF_NOTIFY_KEEP ||
!test_and_clear_bit(NVKM_NOTIFY_USER, &notify->flags)) {
if (!keep)
atomic_dec(&notify->putcnt);
else
nvif_notify_get_(notify);
}
return ret;
}
static void static void
nvif_notify_work(struct work_struct *work) nvif_notify_work(struct work_struct *work)
{ {
struct nvif_notify *notify = container_of(work, typeof(*notify), work); struct nvif_notify *notify = container_of(work, typeof(*notify), work);
if (notify->func(notify) == NVIF_NOTIFY_KEEP) nvif_notify_func(notify, true);
nvif_notify_get_(notify);
} }
int int
...@@ -113,19 +126,15 @@ nvif_notify(const void *header, u32 length, const void *data, u32 size) ...@@ -113,19 +126,15 @@ nvif_notify(const void *header, u32 length, const void *data, u32 size)
if (!WARN_ON(notify == NULL)) { if (!WARN_ON(notify == NULL)) {
struct nvif_client *client = nvif_client(notify->object); struct nvif_client *client = nvif_client(notify->object);
if (!WARN_ON(notify->size != size)) { if (!WARN_ON(notify->size != size)) {
atomic_inc(&notify->putcnt);
if (test_bit(NVIF_NOTIFY_WORK, &notify->flags)) { if (test_bit(NVIF_NOTIFY_WORK, &notify->flags)) {
atomic_inc(&notify->putcnt);
memcpy((void *)notify->data, data, size); memcpy((void *)notify->data, data, size);
schedule_work(&notify->work); schedule_work(&notify->work);
return NVIF_NOTIFY_DROP; return NVIF_NOTIFY_DROP;
} }
notify->data = data; notify->data = data;
ret = notify->func(notify); ret = nvif_notify_func(notify, client->driver->keep);
notify->data = NULL; notify->data = NULL;
if (ret != NVIF_NOTIFY_DROP && client->driver->keep) {
atomic_inc(&notify->putcnt);
nvif_notify_get_(notify);
}
} }
} }
...@@ -228,8 +237,10 @@ nvif_notify_new(struct nvif_object *object, int (*func)(struct nvif_notify *), ...@@ -228,8 +237,10 @@ nvif_notify_new(struct nvif_object *object, int (*func)(struct nvif_notify *),
if (notify) { if (notify) {
int ret = nvif_notify_init(object, nvif_notify_del, func, work, int ret = nvif_notify_init(object, nvif_notify_del, func, work,
type, data, size, reply, notify); type, data, size, reply, notify);
if (ret) if (ret) {
kfree(notify); kfree(notify);
notify = NULL;
}
*pnotify = notify; *pnotify = notify;
return ret; return ret;
} }
......
...@@ -275,8 +275,10 @@ nvif_object_new(struct nvif_object *parent, u32 handle, u32 oclass, ...@@ -275,8 +275,10 @@ nvif_object_new(struct nvif_object *parent, u32 handle, u32 oclass,
if (object) { if (object) {
int ret = nvif_object_init(parent, nvif_object_del, handle, int ret = nvif_object_init(parent, nvif_object_del, handle,
oclass, data, size, object); oclass, data, size, object);
if (ret) if (ret) {
kfree(object); kfree(object);
object = NULL;
}
*pobject = object; *pobject = object;
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册