diff --git a/drivers/gpu/drm/imagination/pvr_device.c b/drivers/gpu/drm/imagination/pvr_device.c index 54fe4180c73c..35eaa54f75ed 100644 --- a/drivers/gpu/drm/imagination/pvr_device.c +++ b/drivers/gpu/drm/imagination/pvr_device.c @@ -697,25 +697,7 @@ pvr_device_gpu_init(struct pvr_device *pvr_dev) if (err) return err; - if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { - pvr_dev->kernel_vm_ctx = pvr_vm_create_context(pvr_dev, false); - if (IS_ERR(pvr_dev->kernel_vm_ctx)) - return PTR_ERR(pvr_dev->kernel_vm_ctx); - } - - err = pvr_fw_init(pvr_dev); - if (err) - goto err_vm_ctx_put; - - return 0; - -err_vm_ctx_put: - if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { - pvr_vm_context_put(pvr_dev->kernel_vm_ctx); - pvr_dev->kernel_vm_ctx = NULL; - } - - return err; + return pvr_fw_init(pvr_dev); } /** @@ -726,11 +708,6 @@ static void pvr_device_gpu_fini(struct pvr_device *pvr_dev) { pvr_fw_fini(pvr_dev); - - if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { - WARN_ON(!pvr_vm_context_put(pvr_dev->kernel_vm_ctx)); - pvr_dev->kernel_vm_ctx = NULL; - } } /** diff --git a/drivers/gpu/drm/imagination/pvr_fw.c b/drivers/gpu/drm/imagination/pvr_fw.c index 850a3ec8e775..58ee51cd65df 100644 --- a/drivers/gpu/drm/imagination/pvr_fw.c +++ b/drivers/gpu/drm/imagination/pvr_fw.c @@ -1029,8 +1029,7 @@ err_fw_cleanup: err_mm_takedown: drm_mm_takedown(&fw_dev->fw_mm); - if (fw_dev->defs->fini) - fw_dev->defs->fini(pvr_dev); + fw_dev->defs->fini(pvr_dev); return err; } @@ -1063,8 +1062,7 @@ pvr_fw_fini(struct pvr_device *pvr_dev) drm_mm_takedown(&fw_dev->fw_mm); - if (fw_dev->defs->fini) - fw_dev->defs->fini(pvr_dev); + fw_dev->defs->fini(pvr_dev); } /** diff --git a/drivers/gpu/drm/imagination/pvr_fw.h b/drivers/gpu/drm/imagination/pvr_fw.h index 3390c84e4fd3..4b25291135b6 100644 --- a/drivers/gpu/drm/imagination/pvr_fw.h +++ b/drivers/gpu/drm/imagination/pvr_fw.h @@ -86,7 +86,7 @@ struct pvr_fw_defs { * FW processor specific finalisation. * @pvr_dev: Target PowerVR device. * - * This function is optional. + * This function is mandatory. */ void (*fini)(struct pvr_device *pvr_dev); diff --git a/drivers/gpu/drm/imagination/pvr_fw_meta.c b/drivers/gpu/drm/imagination/pvr_fw_meta.c index b5837ba56e33..84f568b5510f 100644 --- a/drivers/gpu/drm/imagination/pvr_fw_meta.c +++ b/drivers/gpu/drm/imagination/pvr_fw_meta.c @@ -500,9 +500,20 @@ pvr_meta_init(struct pvr_device *pvr_dev) { pvr_fw_heap_info_init(pvr_dev, ROGUE_FW_HEAP_META_SHIFT, 0); + pvr_dev->kernel_vm_ctx = pvr_vm_create_context(pvr_dev, false); + if (IS_ERR(pvr_dev->kernel_vm_ctx)) + return PTR_ERR(pvr_dev->kernel_vm_ctx); + return 0; } +static void +pvr_meta_fini(struct pvr_device *pvr_dev) +{ + WARN_ON(!pvr_vm_context_put(pvr_dev->kernel_vm_ctx)); + pvr_dev->kernel_vm_ctx = NULL; +} + static u32 pvr_meta_get_fw_addr_with_offset(struct pvr_fw_object *fw_obj, u32 offset) { @@ -554,6 +565,7 @@ pvr_meta_irq_clear(struct pvr_device *pvr_dev) const struct pvr_fw_defs pvr_fw_defs_meta = { .init = pvr_meta_init, + .fini = pvr_meta_fini, .fw_process = pvr_meta_fw_process, .vm_map = pvr_meta_vm_map, .vm_unmap = pvr_meta_vm_unmap, diff --git a/drivers/gpu/drm/imagination/pvr_fw_riscv.c b/drivers/gpu/drm/imagination/pvr_fw_riscv.c index c160ec9e3ff2..cd84635bb88d 100644 --- a/drivers/gpu/drm/imagination/pvr_fw_riscv.c +++ b/drivers/gpu/drm/imagination/pvr_fw_riscv.c @@ -109,9 +109,20 @@ pvr_riscv_init(struct pvr_device *pvr_dev) { pvr_fw_heap_info_init(pvr_dev, ROGUE_FW_HEAP_RISCV_SHIFT, 0); + pvr_dev->kernel_vm_ctx = pvr_vm_create_context(pvr_dev, false); + if (IS_ERR(pvr_dev->kernel_vm_ctx)) + return PTR_ERR(pvr_dev->kernel_vm_ctx); + return 0; } +static void +pvr_riscv_fini(struct pvr_device *pvr_dev) +{ + WARN_ON(!pvr_vm_context_put(pvr_dev->kernel_vm_ctx)); + pvr_dev->kernel_vm_ctx = NULL; +} + static u32 pvr_riscv_get_fw_addr_with_offset(struct pvr_fw_object *fw_obj, u32 offset) { @@ -160,6 +171,7 @@ pvr_riscv_irq_clear(struct pvr_device *pvr_dev) const struct pvr_fw_defs pvr_fw_defs_riscv = { .init = pvr_riscv_init, + .fini = pvr_riscv_fini, .fw_process = pvr_riscv_fw_process, .vm_map = pvr_riscv_vm_map, .vm_unmap = pvr_riscv_vm_unmap,