| From c09c44958a4aab5397e26de647adb30e9f4a85fe Mon Sep 17 00:00:00 2001 |
| From: Jon Derrick <jonathan.derrick@intel.com> |
| Date: Fri, 15 Mar 2019 18:05:16 -0600 |
| Subject: drm/nouveau/bar/nv50: ensure BAR is mapped |
| |
| [ Upstream commit f10b83de1fd49216a4c657816f48001437e4bdd5 ] |
| |
| If the BAR is zero size, it indicates it was never successfully mapped. |
| Ensure that the BAR is valid during initialization before attempting to |
| use it. |
| |
| Signed-off-by: Jon Derrick <jonathan.derrick@intel.com> |
| Signed-off-by: Ben Skeggs <bskeggs@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c |
| index 157b076a12723..38c9c086754b6 100644 |
| --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c |
| +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c |
| @@ -109,7 +109,7 @@ nv50_bar_oneinit(struct nvkm_bar *base) |
| struct nvkm_device *device = bar->base.subdev.device; |
| static struct lock_class_key bar1_lock; |
| static struct lock_class_key bar2_lock; |
| - u64 start, limit; |
| + u64 start, limit, size; |
| int ret; |
| |
| ret = nvkm_gpuobj_new(device, 0x20000, 0, false, NULL, &bar->mem); |
| @@ -127,7 +127,10 @@ nv50_bar_oneinit(struct nvkm_bar *base) |
| |
| /* BAR2 */ |
| start = 0x0100000000ULL; |
| - limit = start + device->func->resource_size(device, 3); |
| + size = device->func->resource_size(device, 3); |
| + if (!size) |
| + return -ENOMEM; |
| + limit = start + size; |
| |
| ret = nvkm_vmm_new(device, start, limit-- - start, NULL, 0, |
| &bar2_lock, "bar2", &bar->bar2_vmm); |
| @@ -164,7 +167,10 @@ nv50_bar_oneinit(struct nvkm_bar *base) |
| |
| /* BAR1 */ |
| start = 0x0000000000ULL; |
| - limit = start + device->func->resource_size(device, 1); |
| + size = device->func->resource_size(device, 1); |
| + if (!size) |
| + return -ENOMEM; |
| + limit = start + size; |
| |
| ret = nvkm_vmm_new(device, start, limit-- - start, NULL, 0, |
| &bar1_lock, "bar1", &bar->bar1_vmm); |
| -- |
| 2.20.1 |
| |