summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/imagination
diff options
context:
space:
mode:
authorAlessio Belle <alessio.belle@imgtec.com>2026-09-15 11:03:45 +0300
committerAlessio Belle <alessio.belle@imgtec.com>2026-09-24 10:02:49 +0100
commitf1db0120f15da7c6000b9f19aa9e15e6ba8afb2a (patch)
tree2652fb961c407d8cfcfa84d5147ab9bd8192cd33 /drivers/gpu/drm/imagination
parent6e375de99d0c420169481fcd36064177ab55b09d (diff)
downloadlinux-next-f1db0120f15da7c6000b9f19aa9e15e6ba8afb2a.tar.gz
linux-next-f1db0120f15da7c6000b9f19aa9e15e6ba8afb2a.zip
drm/imagination: Treat FW connection ctl like other interface structures
There is no particular reason for this structure to be allocated and freed on its own. Move the related logic to where there other firmware interface structures are allocated and freed. Signed-off-by: Alexandru Dadu <alexandru.dadu@imgtec.com> Reviewed-by: Brajesh Gupta <brajesh.gupta@imgtec.com> Link: https://patch.msgid.link/20260915-b4-do-not-map-if-structs-unnecessarily-v1-1-a0e2ccee154a@imgtec.com Signed-off-by: Alessio Belle <alessio.belle@imgtec.com>
Diffstat (limited to 'drivers/gpu/drm/imagination')
-rw-r--r--drivers/gpu/drm/imagination/pvr_fw.c59
1 files changed, 21 insertions, 38 deletions
diff --git a/drivers/gpu/drm/imagination/pvr_fw.c b/drivers/gpu/drm/imagination/pvr_fw.c
index c6c77b152342..6d18b50929ca 100644
--- a/drivers/gpu/drm/imagination/pvr_fw.c
+++ b/drivers/gpu/drm/imagination/pvr_fw.c
@@ -278,37 +278,6 @@ pvr_fw_find_mmu_segment(struct pvr_device *pvr_dev, u32 addr, u32 size, void *fw
return -EINVAL;
}
-static int
-pvr_fw_create_fwif_connection_ctl(struct pvr_device *pvr_dev)
-{
- struct drm_device *drm_dev = from_pvr_device(pvr_dev);
- struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
-
- fw_dev->fwif_connection_ctl =
- pvr_fw_object_create_and_map_offset(pvr_dev,
- fw_dev->fw_heap_info.config_offset +
- PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET,
- sizeof(*fw_dev->fwif_connection_ctl),
- PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
- NULL, NULL,
- &fw_dev->mem.fwif_connection_ctl_obj);
- if (IS_ERR(fw_dev->fwif_connection_ctl)) {
- drm_err(drm_dev,
- "Unable to allocate FWIF connection control memory\n");
- return PTR_ERR(fw_dev->fwif_connection_ctl);
- }
-
- return 0;
-}
-
-static void
-pvr_fw_fini_fwif_connection_ctl(struct pvr_device *pvr_dev)
-{
- struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
-
- pvr_fw_object_unmap_and_destroy(fw_dev->mem.fwif_connection_ctl_obj);
-}
-
static void
fw_osinit_init(void *cpu_ptr, void *priv)
{
@@ -459,12 +428,28 @@ pvr_fw_create_structures(struct pvr_device *pvr_dev)
struct pvr_fw_mem *fw_mem = &fw_dev->mem;
int err;
+ fw_dev->fwif_connection_ctl =
+ pvr_fw_object_create_and_map_offset(pvr_dev,
+ fw_dev->fw_heap_info.config_offset +
+ PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET,
+ sizeof(*fw_dev->fwif_connection_ctl),
+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
+ NULL, NULL,
+ &fw_mem->fwif_connection_ctl_obj);
+
+ if (IS_ERR(fw_dev->fwif_connection_ctl)) {
+ drm_err(drm_dev,
+ "Unable to allocate FWIF connection control memory\n");
+ return PTR_ERR(fw_dev->fwif_connection_ctl);
+ }
+
fw_dev->power_sync = pvr_fw_object_create_and_map(pvr_dev, sizeof(*fw_dev->power_sync),
PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
NULL, NULL, &fw_mem->power_sync_obj);
if (IS_ERR(fw_dev->power_sync)) {
drm_err(drm_dev, "Unable to allocate FW power_sync structure\n");
- return PTR_ERR(fw_dev->power_sync);
+ err = PTR_ERR(fw_dev->power_sync);
+ goto err_release_connection_ctl;
}
fw_dev->hwrinfobuf = pvr_fw_object_create_and_map(pvr_dev, sizeof(*fw_dev->hwrinfobuf),
@@ -594,6 +579,9 @@ err_release_hwrinfobuf:
err_release_power_sync:
pvr_fw_object_unmap_and_destroy(fw_mem->power_sync_obj);
+err_release_connection_ctl:
+ pvr_fw_object_unmap_and_destroy(fw_mem->fwif_connection_ctl_obj);
+
return err;
}
@@ -615,6 +603,7 @@ pvr_fw_destroy_structures(struct pvr_device *pvr_dev)
pvr_fw_object_unmap_and_destroy(fw_mem->power_sync_obj);
pvr_fw_object_unmap_and_destroy(fw_mem->osdata_obj);
pvr_fw_object_unmap_and_destroy(fw_mem->osinit_obj);
+ pvr_fw_object_unmap_and_destroy(fw_mem->fwif_connection_ctl_obj);
}
/**
@@ -755,10 +744,6 @@ pvr_fw_process(struct pvr_device *pvr_dev)
pvr_fw_object_vunmap(fw_mem->code_obj);
fw_code_ptr = NULL;
- err = pvr_fw_create_fwif_connection_ctl(pvr_dev);
- if (err)
- goto err_free_kdata;
-
return 0;
err_free_kdata:
@@ -842,8 +827,6 @@ pvr_fw_cleanup(struct pvr_device *pvr_dev)
{
struct pvr_fw_mem *fw_mem = &pvr_dev->fw_dev.mem;
- pvr_fw_fini_fwif_connection_ctl(pvr_dev);
-
kfree(fw_mem->core_data);
kfree(fw_mem->core_code);
kfree(fw_mem->data);