mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
drm/nouveau: move nouveau_drm_device_fini() above init()
The next commit wants to be able to call fini() from an init() failure path to remove the need to duplicate a bunch of cleanup. Moving fini() above init() avoids the need for a forward-declaration. Signed-off-by: Ben Skeggs <bskeggs@nvidia.com> Signed-off-by: Danilo Krummrich <dakr@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20240726043828.58966-2-bskeggs@nvidia.com
This commit is contained in:
parent
0d5040e406
commit
20d70de582
@ -578,6 +578,59 @@ nouveau_parent = {
|
||||
.errorf = nouveau_drm_errorf,
|
||||
};
|
||||
|
||||
static void
|
||||
nouveau_drm_device_fini(struct drm_device *dev)
|
||||
{
|
||||
struct nouveau_cli *cli, *temp_cli;
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
|
||||
if (nouveau_pmops_runtime()) {
|
||||
pm_runtime_get_sync(dev->dev);
|
||||
pm_runtime_forbid(dev->dev);
|
||||
}
|
||||
|
||||
nouveau_led_fini(dev);
|
||||
nouveau_dmem_fini(drm);
|
||||
nouveau_svm_fini(drm);
|
||||
nouveau_hwmon_fini(dev);
|
||||
nouveau_debugfs_fini(drm);
|
||||
|
||||
if (dev->mode_config.num_crtc)
|
||||
nouveau_display_fini(dev, false, false);
|
||||
nouveau_display_destroy(dev);
|
||||
|
||||
nouveau_accel_fini(drm);
|
||||
nouveau_bios_takedown(dev);
|
||||
|
||||
nouveau_ttm_fini(drm);
|
||||
nouveau_vga_fini(drm);
|
||||
|
||||
/*
|
||||
* There may be existing clients from as-yet unclosed files. For now,
|
||||
* clean them up here rather than deferring until the file is closed,
|
||||
* but this likely not correct if we want to support hot-unplugging
|
||||
* properly.
|
||||
*/
|
||||
mutex_lock(&drm->clients_lock);
|
||||
list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) {
|
||||
list_del(&cli->head);
|
||||
mutex_lock(&cli->mutex);
|
||||
if (cli->abi16)
|
||||
nouveau_abi16_fini(cli->abi16);
|
||||
mutex_unlock(&cli->mutex);
|
||||
nouveau_cli_fini(cli);
|
||||
kfree(cli);
|
||||
}
|
||||
mutex_unlock(&drm->clients_lock);
|
||||
|
||||
nouveau_cli_fini(&drm->client);
|
||||
nouveau_cli_fini(&drm->master);
|
||||
destroy_workqueue(drm->sched_wq);
|
||||
nvif_parent_dtor(&drm->parent);
|
||||
mutex_destroy(&drm->clients_lock);
|
||||
kfree(drm);
|
||||
}
|
||||
|
||||
static int
|
||||
nouveau_drm_device_init(struct drm_device *dev)
|
||||
{
|
||||
@ -679,59 +732,6 @@ fail_alloc:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
nouveau_drm_device_fini(struct drm_device *dev)
|
||||
{
|
||||
struct nouveau_cli *cli, *temp_cli;
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
|
||||
if (nouveau_pmops_runtime()) {
|
||||
pm_runtime_get_sync(dev->dev);
|
||||
pm_runtime_forbid(dev->dev);
|
||||
}
|
||||
|
||||
nouveau_led_fini(dev);
|
||||
nouveau_dmem_fini(drm);
|
||||
nouveau_svm_fini(drm);
|
||||
nouveau_hwmon_fini(dev);
|
||||
nouveau_debugfs_fini(drm);
|
||||
|
||||
if (dev->mode_config.num_crtc)
|
||||
nouveau_display_fini(dev, false, false);
|
||||
nouveau_display_destroy(dev);
|
||||
|
||||
nouveau_accel_fini(drm);
|
||||
nouveau_bios_takedown(dev);
|
||||
|
||||
nouveau_ttm_fini(drm);
|
||||
nouveau_vga_fini(drm);
|
||||
|
||||
/*
|
||||
* There may be existing clients from as-yet unclosed files. For now,
|
||||
* clean them up here rather than deferring until the file is closed,
|
||||
* but this likely not correct if we want to support hot-unplugging
|
||||
* properly.
|
||||
*/
|
||||
mutex_lock(&drm->clients_lock);
|
||||
list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) {
|
||||
list_del(&cli->head);
|
||||
mutex_lock(&cli->mutex);
|
||||
if (cli->abi16)
|
||||
nouveau_abi16_fini(cli->abi16);
|
||||
mutex_unlock(&cli->mutex);
|
||||
nouveau_cli_fini(cli);
|
||||
kfree(cli);
|
||||
}
|
||||
mutex_unlock(&drm->clients_lock);
|
||||
|
||||
nouveau_cli_fini(&drm->client);
|
||||
nouveau_cli_fini(&drm->master);
|
||||
destroy_workqueue(drm->sched_wq);
|
||||
nvif_parent_dtor(&drm->parent);
|
||||
mutex_destroy(&drm->clients_lock);
|
||||
kfree(drm);
|
||||
}
|
||||
|
||||
/*
|
||||
* On some Intel PCIe bridge controllers doing a
|
||||
* D0 -> D3hot -> D3cold -> D0 sequence causes Nvidia GPUs to not reappear.
|
||||
|
Loading…
Reference in New Issue
Block a user