mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 07:31:41 +00:00
drm/nouveau: unwind on load errors
nouveau_load() just returned directly if there was an error instead of releasing resources. Signed-off-by: Dan Carpenter <error27@gmail.com> Reviewed-by: Marcin Slusarz <marcin.slusarz@gmail.com> Signed-off-by: Francisco Jerez <currojerez@riseup.net> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
2b495268fc
commit
a0d069ea2c
1 changed files with 30 additions and 10 deletions
|
@ -739,8 +739,10 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
|
dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
|
||||||
if (!dev_priv)
|
if (!dev_priv) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
dev->dev_private = dev_priv;
|
dev->dev_private = dev_priv;
|
||||||
dev_priv->dev = dev;
|
dev_priv->dev = dev;
|
||||||
|
|
||||||
|
@ -750,8 +752,10 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
dev->pci_vendor, dev->pci_device, dev->pdev->class);
|
dev->pci_vendor, dev->pci_device, dev->pdev->class);
|
||||||
|
|
||||||
dev_priv->wq = create_workqueue("nouveau");
|
dev_priv->wq = create_workqueue("nouveau");
|
||||||
if (!dev_priv->wq)
|
if (!dev_priv->wq) {
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto err_priv;
|
||||||
|
}
|
||||||
|
|
||||||
/* resource 0 is mmio regs */
|
/* resource 0 is mmio regs */
|
||||||
/* resource 1 is linear FB */
|
/* resource 1 is linear FB */
|
||||||
|
@ -764,7 +768,8 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
if (!dev_priv->mmio) {
|
if (!dev_priv->mmio) {
|
||||||
NV_ERROR(dev, "Unable to initialize the mmio mapping. "
|
NV_ERROR(dev, "Unable to initialize the mmio mapping. "
|
||||||
"Please report your setup to " DRIVER_EMAIL "\n");
|
"Please report your setup to " DRIVER_EMAIL "\n");
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto err_wq;
|
||||||
}
|
}
|
||||||
NV_DEBUG(dev, "regs mapped ok at 0x%llx\n",
|
NV_DEBUG(dev, "regs mapped ok at 0x%llx\n",
|
||||||
(unsigned long long)mmio_start_offs);
|
(unsigned long long)mmio_start_offs);
|
||||||
|
@ -812,7 +817,8 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
NV_INFO(dev, "Unsupported chipset 0x%08x\n", reg0);
|
NV_INFO(dev, "Unsupported chipset 0x%08x\n", reg0);
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto err_mmio;
|
||||||
}
|
}
|
||||||
|
|
||||||
NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n",
|
NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n",
|
||||||
|
@ -820,7 +826,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
|
|
||||||
ret = nouveau_remove_conflicting_drivers(dev);
|
ret = nouveau_remove_conflicting_drivers(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_mmio;
|
||||||
|
|
||||||
/* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */
|
/* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */
|
||||||
if (dev_priv->card_type >= NV_40) {
|
if (dev_priv->card_type >= NV_40) {
|
||||||
|
@ -834,7 +840,8 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
dev_priv->ramin_size);
|
dev_priv->ramin_size);
|
||||||
if (!dev_priv->ramin) {
|
if (!dev_priv->ramin) {
|
||||||
NV_ERROR(dev, "Failed to PRAMIN BAR");
|
NV_ERROR(dev, "Failed to PRAMIN BAR");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_mmio;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dev_priv->ramin_size = 1 * 1024 * 1024;
|
dev_priv->ramin_size = 1 * 1024 * 1024;
|
||||||
|
@ -842,7 +849,8 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
dev_priv->ramin_size);
|
dev_priv->ramin_size);
|
||||||
if (!dev_priv->ramin) {
|
if (!dev_priv->ramin) {
|
||||||
NV_ERROR(dev, "Failed to map BAR0 PRAMIN.\n");
|
NV_ERROR(dev, "Failed to map BAR0 PRAMIN.\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_mmio;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -857,9 +865,21 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
/* For kernel modesetting, init card now and bring up fbcon */
|
/* For kernel modesetting, init card now and bring up fbcon */
|
||||||
ret = nouveau_card_init(dev);
|
ret = nouveau_card_init(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_ramin;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_ramin:
|
||||||
|
iounmap(dev_priv->ramin);
|
||||||
|
err_mmio:
|
||||||
|
iounmap(dev_priv->mmio);
|
||||||
|
err_wq:
|
||||||
|
destroy_workqueue(dev_priv->wq);
|
||||||
|
err_priv:
|
||||||
|
kfree(dev_priv);
|
||||||
|
dev->dev_private = NULL;
|
||||||
|
err_out:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nouveau_lastclose(struct drm_device *dev)
|
void nouveau_lastclose(struct drm_device *dev)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue