summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/vc4
diff options
context:
space:
mode:
authorMaxime Ripard <mripard@kernel.org>2026-02-23 10:09:45 +0100
committerMaxime Ripard <mripard@kernel.org>2026-02-23 10:09:45 +0100
commitc17ee635fd3a482b2ad2bf5e269755c2eae5f25e (patch)
treee3f147462d8a9fd0cf2312c8cd3c5a94da15c3e4 /drivers/gpu/drm/vc4
parent803ec1faf7c1823e6e3b1f2aaa81be18528c9436 (diff)
parent6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f (diff)
downloadlinux-next-c17ee635fd3a482b2ad2bf5e269755c2eae5f25e.tar.gz
linux-next-c17ee635fd3a482b2ad2bf5e269755c2eae5f25e.zip
Merge drm/drm-fixes into drm-misc-fixes
7.0-rc1 was just released, let's merge it to kick the new release cycle. Signed-off-by: Maxime Ripard <mripard@kernel.org>
Diffstat (limited to 'drivers/gpu/drm/vc4')
-rw-r--r--drivers/gpu/drm/vc4/vc4_bo.c8
-rw-r--r--drivers/gpu/drm/vc4/vc4_crtc.c6
-rw-r--r--drivers/gpu/drm/vc4/vc4_drv.c2
-rw-r--r--drivers/gpu/drm/vc4/vc4_gem.c12
-rw-r--r--drivers/gpu/drm/vc4/vc4_hdmi.c113
-rw-r--r--drivers/gpu/drm/vc4/vc4_kms.c10
-rw-r--r--drivers/gpu/drm/vc4/vc4_perfmon.c3
-rw-r--r--drivers/gpu/drm/vc4/vc4_plane.c2
-rw-r--r--drivers/gpu/drm/vc4/vc4_validate_shaders.c2
-rw-r--r--drivers/gpu/drm/vc4/vc4_vec.c12
10 files changed, 129 insertions, 41 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
index 46b4474ac41d..1f93bc5a3d02 100644
--- a/drivers/gpu/drm/vc4/vc4_bo.c
+++ b/drivers/gpu/drm/vc4/vc4_bo.c
@@ -205,8 +205,7 @@ static struct list_head *vc4_get_cache_list_for_size(struct drm_device *dev,
struct list_head *new_list;
uint32_t i;
- new_list = kmalloc_array(new_size, sizeof(struct list_head),
- GFP_KERNEL);
+ new_list = kmalloc_objs(struct list_head, new_size);
if (!new_list)
return NULL;
@@ -400,7 +399,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
if (WARN_ON_ONCE(vc4->gen > VC4_GEN_4))
return ERR_PTR(-ENODEV);
- bo = kzalloc(sizeof(*bo), GFP_KERNEL);
+ bo = kzalloc_obj(*bo);
if (!bo)
return ERR_PTR(-ENOMEM);
@@ -1015,8 +1014,7 @@ int vc4_bo_cache_init(struct drm_device *dev)
* use. This lets us avoid a bunch of string reallocation in
* the kernel's draw and BO allocation paths.
*/
- vc4->bo_labels = kcalloc(VC4_BO_TYPE_COUNT, sizeof(*vc4->bo_labels),
- GFP_KERNEL);
+ vc4->bo_labels = kzalloc_objs(*vc4->bo_labels, VC4_BO_TYPE_COUNT);
if (!vc4->bo_labels)
return -ENOMEM;
vc4->num_labels = VC4_BO_TYPE_COUNT;
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
index 2a48038abe7a..4a606986afcc 100644
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
@@ -997,7 +997,7 @@ vc4_async_page_flip_common(struct drm_crtc *crtc,
struct drm_plane *plane = crtc->primary;
struct vc4_async_flip_state *flip_state;
- flip_state = kzalloc(sizeof(*flip_state), GFP_KERNEL);
+ flip_state = kzalloc_obj(*flip_state);
if (!flip_state)
return -ENOMEM;
@@ -1105,7 +1105,7 @@ struct drm_crtc_state *vc4_crtc_duplicate_state(struct drm_crtc *crtc)
{
struct vc4_crtc_state *vc4_state, *old_vc4_state;
- vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL);
+ vc4_state = kzalloc_obj(*vc4_state);
if (!vc4_state)
return NULL;
@@ -1142,7 +1142,7 @@ void vc4_crtc_reset(struct drm_crtc *crtc)
if (crtc->state)
vc4_crtc_destroy_state(crtc, crtc->state);
- vc4_crtc_state = kzalloc(sizeof(*vc4_crtc_state), GFP_KERNEL);
+ vc4_crtc_state = kzalloc_obj(*vc4_crtc_state);
if (!vc4_crtc_state) {
crtc->state = NULL;
return;
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index 3846996f9028..a14ecb769461 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -152,7 +152,7 @@ static int vc4_open(struct drm_device *dev, struct drm_file *file)
if (WARN_ON_ONCE(vc4->gen > VC4_GEN_4))
return -ENODEV;
- vc4file = kzalloc(sizeof(*vc4file), GFP_KERNEL);
+ vc4file = kzalloc_obj(*vc4file);
if (!vc4file)
return -ENOMEM;
vc4file->dev = vc4;
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index ab16164b5eda..ad8cbd727b80 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -110,7 +110,7 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
state->bo = get_state->bo;
memcpy(get_state, state, sizeof(*state));
- bo_state = kcalloc(state->bo_count, sizeof(*bo_state), GFP_KERNEL);
+ bo_state = kzalloc_objs(*bo_state, state->bo_count);
if (!bo_state) {
ret = -ENOMEM;
goto err_free;
@@ -161,7 +161,7 @@ vc4_save_hang_state(struct drm_device *dev)
unsigned long irqflags;
unsigned int i, j, k, unref_list_count;
- kernel_state = kcalloc(1, sizeof(*kernel_state), GFP_KERNEL);
+ kernel_state = kzalloc_objs(*kernel_state, 1);
if (!kernel_state)
return;
@@ -187,8 +187,8 @@ vc4_save_hang_state(struct drm_device *dev)
state->bo_count += exec[i]->bo_count + unref_list_count;
}
- kernel_state->bo = kcalloc(state->bo_count,
- sizeof(*kernel_state->bo), GFP_ATOMIC);
+ kernel_state->bo = kzalloc_objs(*kernel_state->bo, state->bo_count,
+ GFP_ATOMIC);
if (!kernel_state->bo) {
spin_unlock_irqrestore(&vc4->job_lock, irqflags);
@@ -622,7 +622,7 @@ vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec,
unsigned long irqflags;
struct vc4_fence *fence;
- fence = kzalloc(sizeof(*fence), GFP_KERNEL);
+ fence = kzalloc_obj(*fence);
if (!fence)
return -ENOMEM;
fence->dev = dev;
@@ -1043,7 +1043,7 @@ vc4_submit_cl_ioctl(struct drm_device *dev, void *data,
return -EINVAL;
}
- exec = kcalloc(1, sizeof(*exec), GFP_KERNEL);
+ exec = kzalloc_objs(*exec, 1);
if (!exec)
return -ENOMEM;
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 1798d1156d10..fda214b5a466 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -624,6 +624,30 @@ static int vc4_hdmi_stop_packet(struct vc4_hdmi *vc4_hdmi,
return ret;
}
+static int vc4_hdmi_clear_infoframe(struct drm_connector *connector,
+ enum hdmi_infoframe_type type)
+{
+ struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
+ struct drm_device *drm = connector->dev;
+ int ret;
+ int idx;
+
+ if (!drm_dev_enter(drm, &idx))
+ return 0;
+
+ WARN_ONCE(!(HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
+ VC4_HDMI_RAM_PACKET_ENABLE),
+ "Packet RAM has to be on to store the packet.");
+
+ ret = vc4_hdmi_stop_packet(vc4_hdmi, type, true);
+ if (ret)
+ drm_err(drm, "Failed to wait for infoframe to go idle: %d\n", ret);
+
+ drm_dev_exit(idx);
+
+ return ret;
+}
+
static int vc4_hdmi_write_infoframe(struct drm_connector *connector,
enum hdmi_infoframe_type type,
const u8 *infoframe, size_t len)
@@ -703,6 +727,66 @@ out:
return ret;
}
+static int vc4_hdmi_clear_avi_infoframe(struct drm_connector *connector)
+{
+ return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_AVI);
+}
+
+static int vc4_hdmi_clear_hdmi_infoframe(struct drm_connector *connector)
+{
+ return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_VENDOR);
+}
+
+static int vc4_hdmi_clear_audio_infoframe(struct drm_connector *connector)
+{
+ return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_AUDIO);
+}
+
+static int vc4_hdmi_clear_hdr_drm_infoframe(struct drm_connector *connector)
+{
+ return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_DRM);
+}
+
+static int vc4_hdmi_clear_spd_infoframe(struct drm_connector *connector)
+{
+ return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_SPD);
+}
+
+static int vc4_hdmi_write_avi_infoframe(struct drm_connector *connector,
+ const u8 *buffer, size_t len)
+{
+ return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_AVI,
+ buffer, len);
+}
+
+static int vc4_hdmi_write_hdmi_infoframe(struct drm_connector *connector,
+ const u8 *buffer, size_t len)
+{
+ return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_VENDOR,
+ buffer, len);
+}
+
+static int vc4_hdmi_write_audio_infoframe(struct drm_connector *connector,
+ const u8 *buffer, size_t len)
+{
+ return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_AUDIO,
+ buffer, len);
+}
+
+static int vc4_hdmi_write_hdr_drm_infoframe(struct drm_connector *connector,
+ const u8 *buffer, size_t len)
+{
+ return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_DRM,
+ buffer, len);
+}
+
+static int vc4_hdmi_write_spd_infoframe(struct drm_connector *connector,
+ const u8 *buffer, size_t len)
+{
+ return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_SPD,
+ buffer, len);
+}
+
#define SCRAMBLING_POLLING_DELAY_MS 1000
static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
@@ -848,7 +932,6 @@ static void vc4_hdmi_encoder_post_crtc_powerdown(struct drm_encoder *encoder,
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
struct drm_device *drm = vc4_hdmi->connector.dev;
unsigned long flags;
- int ret;
int idx;
mutex_lock(&vc4_hdmi->mutex);
@@ -867,9 +950,7 @@ static void vc4_hdmi_encoder_post_crtc_powerdown(struct drm_encoder *encoder,
clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock);
clk_disable_unprepare(vc4_hdmi->pixel_clock);
- ret = pm_runtime_put(&vc4_hdmi->pdev->dev);
- if (ret < 0)
- drm_err(drm, "Failed to release power domain: %d\n", ret);
+ pm_runtime_put(&vc4_hdmi->pdev->dev);
drm_dev_exit(idx);
@@ -1660,7 +1741,26 @@ vc4_hdmi_connector_clock_valid(const struct drm_connector *connector,
static const struct drm_connector_hdmi_funcs vc4_hdmi_hdmi_connector_funcs = {
.tmds_char_rate_valid = vc4_hdmi_connector_clock_valid,
- .write_infoframe = vc4_hdmi_write_infoframe,
+ .avi = {
+ .clear_infoframe = vc4_hdmi_clear_avi_infoframe,
+ .write_infoframe = vc4_hdmi_write_avi_infoframe,
+ },
+ .hdmi = {
+ .clear_infoframe = vc4_hdmi_clear_hdmi_infoframe,
+ .write_infoframe = vc4_hdmi_write_hdmi_infoframe,
+ },
+ .audio = {
+ .clear_infoframe = vc4_hdmi_clear_audio_infoframe,
+ .write_infoframe = vc4_hdmi_write_audio_infoframe,
+ },
+ .hdr_drm = {
+ .clear_infoframe = vc4_hdmi_clear_hdr_drm_infoframe,
+ .write_infoframe = vc4_hdmi_write_hdr_drm_infoframe,
+ },
+ .spd = {
+ .clear_infoframe = vc4_hdmi_clear_spd_infoframe,
+ .write_infoframe = vc4_hdmi_write_spd_infoframe,
+ },
};
#define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL
@@ -2841,8 +2941,7 @@ static int vc4_hdmi_build_regset(struct drm_device *drm,
unsigned int i;
int ret;
- regs = kcalloc(variant->num_registers, sizeof(*regs),
- GFP_KERNEL);
+ regs = kzalloc_objs(*regs, variant->num_registers);
if (!regs)
return -ENOMEM;
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index e563c1210937..245485e744a5 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -103,7 +103,7 @@ static int vc4_ctm_obj_init(struct vc4_dev *vc4)
drm_modeset_lock_init(&vc4->ctm_state_lock);
- ctm_state = kzalloc(sizeof(*ctm_state), GFP_KERNEL);
+ ctm_state = kzalloc_obj(*ctm_state);
if (!ctm_state)
return -ENOMEM;
@@ -734,7 +734,7 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
{
struct vc4_load_tracker_state *load_state;
- load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
+ load_state = kzalloc_obj(*load_state);
if (!load_state)
return -ENOMEM;
@@ -752,7 +752,7 @@ vc4_hvs_channels_duplicate_state(struct drm_private_obj *obj)
struct vc4_hvs_state *state;
unsigned int i;
- state = kzalloc(sizeof(*state), GFP_KERNEL);
+ state = kzalloc_obj(*state);
if (!state)
return NULL;
@@ -817,7 +817,7 @@ static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
{
struct vc4_hvs_state *state;
- state = kzalloc(sizeof(*state), GFP_KERNEL);
+ state = kzalloc_obj(*state);
if (!state)
return -ENOMEM;
@@ -911,7 +911,7 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
* If the layout changes and doesn't give us that in the future,
* we will need to have something smarter, but it works so far.
*/
- sorted_crtcs = kmalloc_array(dev->num_crtcs, sizeof(*sorted_crtcs), GFP_KERNEL);
+ sorted_crtcs = kmalloc_objs(*sorted_crtcs, dev->num_crtcs);
if (!sorted_crtcs)
return -ENOMEM;
diff --git a/drivers/gpu/drm/vc4/vc4_perfmon.c b/drivers/gpu/drm/vc4/vc4_perfmon.c
index 1ac80c0b258f..eb5e1c936a01 100644
--- a/drivers/gpu/drm/vc4/vc4_perfmon.c
+++ b/drivers/gpu/drm/vc4/vc4_perfmon.c
@@ -172,8 +172,7 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,
return -EINVAL;
}
- perfmon = kzalloc(struct_size(perfmon, counters, req->ncounters),
- GFP_KERNEL);
+ perfmon = kzalloc_flex(*perfmon, counters, req->ncounters);
if (!perfmon)
return -ENOMEM;
perfmon->dev = vc4;
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index f00d4076ba07..91d499fefba2 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -374,7 +374,7 @@ static void vc4_plane_reset(struct drm_plane *plane)
kfree(plane->state);
- vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL);
+ vc4_state = kzalloc_obj(*vc4_state);
if (!vc4_state)
return;
diff --git a/drivers/gpu/drm/vc4/vc4_validate_shaders.c b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
index b50b6cdac3f4..d48cf76983c0 100644
--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
@@ -803,7 +803,7 @@ vc4_validate_shader(struct drm_gem_dma_object *shader_obj)
if (!validation_state.branch_targets)
goto fail;
- validated_shader = kcalloc(1, sizeof(*validated_shader), GFP_KERNEL);
+ validated_shader = kzalloc_objs(*validated_shader, 1);
if (!validated_shader)
goto fail;
diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c
index b84fad2a5b23..b0b271d93b27 100644
--- a/drivers/gpu/drm/vc4/vc4_vec.c
+++ b/drivers/gpu/drm/vc4/vc4_vec.c
@@ -542,7 +542,7 @@ static void vc4_vec_encoder_disable(struct drm_encoder *encoder,
{
struct drm_device *drm = encoder->dev;
struct vc4_vec *vec = encoder_to_vc4_vec(encoder);
- int idx, ret;
+ int idx;
if (!drm_dev_enter(drm, &idx))
return;
@@ -556,16 +556,8 @@ static void vc4_vec_encoder_disable(struct drm_encoder *encoder,
clk_disable_unprepare(vec->clock);
- ret = pm_runtime_put(&vec->pdev->dev);
- if (ret < 0) {
- drm_err(drm, "Failed to release power domain: %d\n", ret);
- goto err_dev_exit;
- }
-
- drm_dev_exit(idx);
- return;
+ pm_runtime_put(&vec->pdev->dev);
-err_dev_exit:
drm_dev_exit(idx);
}