mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
Short summary of fixes pull:
imagination: - Fix overflow - Fix use-after-free ivpu: - Fix suspend/resume nouveau: - Do not deref dangling pointer rockchip: - Set DP/HDMI registers correctly tests: - Clean up struct drm_display_mode in various places udmabuf: - Fix overflow virtgpu: - Set reservation lock on dma-buf import - Fix error handling in prepare_fb -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEchf7rIzpz2NEoWjlaA3BHVMLeiMFAmf3uB8ACgkQaA3BHVML eiNIdwf/fWQO37EbIl6GYdBJIHeGtOVjlknhdLJSVqR7cVmX9DlEtn9Sjce08xq0 QrLpg9no749ckytjG8hDXGicNqC5XURTwZTAD+/MAsBIjsnEvixQH7fT9IyOeVPO PsngHTJ7HbZ8aK2gzoVrWotfp4zoKgUlWZPWpD4R/ypSza7g9pcL0RXaRvsSl43Q MBOnaFRX2bzM81wSXb/+A1/7fRewJTKv+jJ+DgsMaptM5qUbwkzijjiejuuH5+Va zEBUJXck58tujBmWn7eunckCvS1qPKLu6xZq8xwfzNzGvjxcBts2T3/pZRzqiXYp DAyPRS/4mgxORr5dyMzTse4WxtAElQ== =gphu -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2025-04-10' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes Short summary of fixes pull: imagination: - Fix overflow - Fix use-after-free ivpu: - Fix suspend/resume nouveau: - Do not deref dangling pointer rockchip: - Set DP/HDMI registers correctly tests: - Clean up struct drm_display_mode in various places udmabuf: - Fix overflow virtgpu: - Set reservation lock on dma-buf import - Fix error handling in prepare_fb Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://lore.kernel.org/r/20250410122414.GA32202@2a02-2454-fd5e-fd00-d686-8907-6053-f8d8.dyn6.pyur.net
This commit is contained in:
commit
927cec6c92
|
|
@ -332,7 +332,7 @@ ivpu_force_recovery_fn(struct file *file, const char __user *user_buf, size_t si
|
|||
return -EINVAL;
|
||||
|
||||
ret = ivpu_rpm_get(vdev);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ivpu_pm_trigger_recovery(vdev, "debugfs");
|
||||
|
|
@ -383,7 +383,7 @@ static int dct_active_set(void *data, u64 active_percent)
|
|||
return -EINVAL;
|
||||
|
||||
ret = ivpu_rpm_get(vdev);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (active_percent)
|
||||
|
|
|
|||
|
|
@ -302,7 +302,8 @@ ivpu_ipc_send_receive_internal(struct ivpu_device *vdev, struct vpu_jsm_msg *req
|
|||
struct ivpu_ipc_consumer cons;
|
||||
int ret;
|
||||
|
||||
drm_WARN_ON(&vdev->drm, pm_runtime_status_suspended(vdev->drm.dev));
|
||||
drm_WARN_ON(&vdev->drm, pm_runtime_status_suspended(vdev->drm.dev) &&
|
||||
pm_runtime_enabled(vdev->drm.dev));
|
||||
|
||||
ivpu_ipc_consumer_add(vdev, &cons, channel, NULL);
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#include <drm/drm_file.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "ivpu_drv.h"
|
||||
#include "ivpu_gem.h"
|
||||
|
|
@ -44,6 +45,10 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
|
|||
args->sampling_period_ns < MS_MIN_SAMPLE_PERIOD_NS)
|
||||
return -EINVAL;
|
||||
|
||||
ret = ivpu_rpm_get(vdev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&file_priv->ms_lock);
|
||||
|
||||
if (get_instance_by_mask(file_priv, args->metric_group_mask)) {
|
||||
|
|
@ -96,6 +101,8 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
|
|||
kfree(ms);
|
||||
unlock:
|
||||
mutex_unlock(&file_priv->ms_lock);
|
||||
|
||||
ivpu_rpm_put(vdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -160,6 +167,10 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file *
|
|||
if (!args->metric_group_mask)
|
||||
return -EINVAL;
|
||||
|
||||
ret = ivpu_rpm_get(vdev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&file_priv->ms_lock);
|
||||
|
||||
ms = get_instance_by_mask(file_priv, args->metric_group_mask);
|
||||
|
|
@ -187,6 +198,7 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file *
|
|||
unlock:
|
||||
mutex_unlock(&file_priv->ms_lock);
|
||||
|
||||
ivpu_rpm_put(vdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -204,11 +216,17 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file
|
|||
{
|
||||
struct ivpu_file_priv *file_priv = file->driver_priv;
|
||||
struct drm_ivpu_metric_streamer_stop *args = data;
|
||||
struct ivpu_device *vdev = file_priv->vdev;
|
||||
struct ivpu_ms_instance *ms;
|
||||
int ret;
|
||||
|
||||
if (!args->metric_group_mask)
|
||||
return -EINVAL;
|
||||
|
||||
ret = ivpu_rpm_get(vdev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&file_priv->ms_lock);
|
||||
|
||||
ms = get_instance_by_mask(file_priv, args->metric_group_mask);
|
||||
|
|
@ -217,6 +235,7 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file
|
|||
|
||||
mutex_unlock(&file_priv->ms_lock);
|
||||
|
||||
ivpu_rpm_put(vdev);
|
||||
return ms ? 0 : -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -281,6 +300,9 @@ int ivpu_ms_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *
|
|||
void ivpu_ms_cleanup(struct ivpu_file_priv *file_priv)
|
||||
{
|
||||
struct ivpu_ms_instance *ms, *tmp;
|
||||
struct ivpu_device *vdev = file_priv->vdev;
|
||||
|
||||
pm_runtime_get_sync(vdev->drm.dev);
|
||||
|
||||
mutex_lock(&file_priv->ms_lock);
|
||||
|
||||
|
|
@ -293,6 +315,8 @@ void ivpu_ms_cleanup(struct ivpu_file_priv *file_priv)
|
|||
free_instance(file_priv, ms);
|
||||
|
||||
mutex_unlock(&file_priv->ms_lock);
|
||||
|
||||
pm_runtime_put_autosuspend(vdev->drm.dev);
|
||||
}
|
||||
|
||||
void ivpu_ms_cleanup_all(struct ivpu_device *vdev)
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ static long udmabuf_create(struct miscdevice *device,
|
|||
if (!ubuf)
|
||||
return -ENOMEM;
|
||||
|
||||
pglimit = (size_limit_mb * 1024 * 1024) >> PAGE_SHIFT;
|
||||
pglimit = ((u64)size_limit_mb * 1024 * 1024) >> PAGE_SHIFT;
|
||||
for (i = 0; i < head->count; i++) {
|
||||
pgoff_t subpgcnt;
|
||||
|
||||
|
|
|
|||
|
|
@ -732,7 +732,7 @@ pvr_fw_process(struct pvr_device *pvr_dev)
|
|||
fw_mem->core_data, fw_mem->core_code_alloc_size);
|
||||
|
||||
if (err)
|
||||
goto err_free_fw_core_data_obj;
|
||||
goto err_free_kdata;
|
||||
|
||||
memcpy(fw_code_ptr, fw_mem->code, fw_mem->code_alloc_size);
|
||||
memcpy(fw_data_ptr, fw_mem->data, fw_mem->data_alloc_size);
|
||||
|
|
@ -742,10 +742,14 @@ pvr_fw_process(struct pvr_device *pvr_dev)
|
|||
memcpy(fw_core_data_ptr, fw_mem->core_data, fw_mem->core_data_alloc_size);
|
||||
|
||||
/* We're finished with the firmware section memory on the CPU, unmap. */
|
||||
if (fw_core_data_ptr)
|
||||
if (fw_core_data_ptr) {
|
||||
pvr_fw_object_vunmap(fw_mem->core_data_obj);
|
||||
if (fw_core_code_ptr)
|
||||
fw_core_data_ptr = NULL;
|
||||
}
|
||||
if (fw_core_code_ptr) {
|
||||
pvr_fw_object_vunmap(fw_mem->core_code_obj);
|
||||
fw_core_code_ptr = NULL;
|
||||
}
|
||||
pvr_fw_object_vunmap(fw_mem->data_obj);
|
||||
fw_data_ptr = NULL;
|
||||
pvr_fw_object_vunmap(fw_mem->code_obj);
|
||||
|
|
@ -753,7 +757,7 @@ pvr_fw_process(struct pvr_device *pvr_dev)
|
|||
|
||||
err = pvr_fw_create_fwif_connection_ctl(pvr_dev);
|
||||
if (err)
|
||||
goto err_free_fw_core_data_obj;
|
||||
goto err_free_kdata;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -763,13 +767,16 @@ pvr_fw_process(struct pvr_device *pvr_dev)
|
|||
kfree(fw_mem->data);
|
||||
kfree(fw_mem->code);
|
||||
|
||||
err_free_fw_core_data_obj:
|
||||
if (fw_core_data_ptr)
|
||||
pvr_fw_object_unmap_and_destroy(fw_mem->core_data_obj);
|
||||
pvr_fw_object_vunmap(fw_mem->core_data_obj);
|
||||
if (fw_mem->core_data_obj)
|
||||
pvr_fw_object_destroy(fw_mem->core_data_obj);
|
||||
|
||||
err_free_fw_core_code_obj:
|
||||
if (fw_core_code_ptr)
|
||||
pvr_fw_object_unmap_and_destroy(fw_mem->core_code_obj);
|
||||
pvr_fw_object_vunmap(fw_mem->core_code_obj);
|
||||
if (fw_mem->core_code_obj)
|
||||
pvr_fw_object_destroy(fw_mem->core_code_obj);
|
||||
|
||||
err_free_fw_data_obj:
|
||||
if (fw_data_ptr)
|
||||
|
|
@ -836,6 +843,12 @@ 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);
|
||||
kfree(fw_mem->code);
|
||||
|
||||
if (fw_mem->core_code_obj)
|
||||
pvr_fw_object_destroy(fw_mem->core_code_obj);
|
||||
if (fw_mem->core_data_obj)
|
||||
|
|
|
|||
|
|
@ -671,6 +671,13 @@ pvr_jobs_link_geom_frag(struct pvr_job_data *job_data, u32 *job_count)
|
|||
geom_job->paired_job = frag_job;
|
||||
frag_job->paired_job = geom_job;
|
||||
|
||||
/* The geometry job pvr_job structure is used when the fragment
|
||||
* job is being prepared by the GPU scheduler. Have the fragment
|
||||
* job hold a reference on the geometry job to prevent it being
|
||||
* freed until the fragment job has finished with it.
|
||||
*/
|
||||
pvr_job_get(geom_job);
|
||||
|
||||
/* Skip the fragment job we just paired to the geometry job. */
|
||||
i++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -866,6 +866,10 @@ static void pvr_queue_free_job(struct drm_sched_job *sched_job)
|
|||
struct pvr_job *job = container_of(sched_job, struct pvr_job, base);
|
||||
|
||||
drm_sched_job_cleanup(sched_job);
|
||||
|
||||
if (job->type == DRM_PVR_JOB_TYPE_FRAGMENT && job->paired_job)
|
||||
pvr_job_put(job->paired_job);
|
||||
|
||||
job->paired_job = NULL;
|
||||
pvr_job_put(job);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -144,6 +144,9 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
|
|||
nouveau_bo_del_io_reserve_lru(bo);
|
||||
nv10_bo_put_tile_region(dev, nvbo->tile, NULL);
|
||||
|
||||
if (bo->base.import_attach)
|
||||
drm_prime_gem_destroy(&bo->base, bo->sg);
|
||||
|
||||
/*
|
||||
* If nouveau_bo_new() allocated this buffer, the GEM object was never
|
||||
* initialized, so don't attempt to release it.
|
||||
|
|
|
|||
|
|
@ -87,9 +87,6 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
|
|||
return;
|
||||
}
|
||||
|
||||
if (gem->import_attach)
|
||||
drm_prime_gem_destroy(gem, nvbo->bo.sg);
|
||||
|
||||
ttm_bo_put(&nvbo->bo);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ struct rockchip_hdmi_qp {
|
|||
struct gpio_desc *enable_gpio;
|
||||
struct delayed_work hpd_work;
|
||||
int port_id;
|
||||
const struct rockchip_hdmi_qp_ctrl_ops *ctrl_ops;
|
||||
};
|
||||
|
||||
struct rockchip_hdmi_qp_ctrl_ops {
|
||||
|
|
@ -461,6 +462,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
hdmi->ctrl_ops = cfg->ctrl_ops;
|
||||
hdmi->dev = &pdev->dev;
|
||||
hdmi->port_id = -ENODEV;
|
||||
|
||||
|
|
@ -600,27 +602,8 @@ static void dw_hdmi_qp_rockchip_remove(struct platform_device *pdev)
|
|||
static int __maybe_unused dw_hdmi_qp_rockchip_resume(struct device *dev)
|
||||
{
|
||||
struct rockchip_hdmi_qp *hdmi = dev_get_drvdata(dev);
|
||||
u32 val;
|
||||
|
||||
val = HIWORD_UPDATE(RK3588_SCLIN_MASK, RK3588_SCLIN_MASK) |
|
||||
HIWORD_UPDATE(RK3588_SDAIN_MASK, RK3588_SDAIN_MASK) |
|
||||
HIWORD_UPDATE(RK3588_MODE_MASK, RK3588_MODE_MASK) |
|
||||
HIWORD_UPDATE(RK3588_I2S_SEL_MASK, RK3588_I2S_SEL_MASK);
|
||||
regmap_write(hdmi->vo_regmap,
|
||||
hdmi->port_id ? RK3588_GRF_VO1_CON6 : RK3588_GRF_VO1_CON3,
|
||||
val);
|
||||
|
||||
val = HIWORD_UPDATE(RK3588_SET_HPD_PATH_MASK,
|
||||
RK3588_SET_HPD_PATH_MASK);
|
||||
regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON7, val);
|
||||
|
||||
if (hdmi->port_id)
|
||||
val = HIWORD_UPDATE(RK3588_HDMI1_GRANT_SEL,
|
||||
RK3588_HDMI1_GRANT_SEL);
|
||||
else
|
||||
val = HIWORD_UPDATE(RK3588_HDMI0_GRANT_SEL,
|
||||
RK3588_HDMI0_GRANT_SEL);
|
||||
regmap_write(hdmi->vo_regmap, RK3588_GRF_VO1_CON9, val);
|
||||
hdmi->ctrl_ops->io_init(hdmi);
|
||||
|
||||
dw_hdmi_qp_resume(dev, hdmi->hdmi);
|
||||
|
||||
|
|
|
|||
|
|
@ -1754,9 +1754,9 @@ static unsigned long rk3588_set_intf_mux(struct vop2_video_port *vp, int id, u32
|
|||
dip |= FIELD_PREP(RK3588_DSP_IF_POL__DP0_PIN_POL, polflags);
|
||||
break;
|
||||
case ROCKCHIP_VOP2_EP_DP1:
|
||||
die &= ~RK3588_SYS_DSP_INFACE_EN_MIPI1_MUX;
|
||||
die |= RK3588_SYS_DSP_INFACE_EN_MIPI1 |
|
||||
FIELD_PREP(RK3588_SYS_DSP_INFACE_EN_MIPI1_MUX, vp->id);
|
||||
die &= ~RK3588_SYS_DSP_INFACE_EN_DP1_MUX;
|
||||
die |= RK3588_SYS_DSP_INFACE_EN_DP1 |
|
||||
FIELD_PREP(RK3588_SYS_DSP_INFACE_EN_DP1_MUX, vp->id);
|
||||
dip &= ~RK3588_DSP_IF_POL__DP1_PIN_POL;
|
||||
dip |= FIELD_PREP(RK3588_DSP_IF_POL__DP1_PIN_POL, polflags);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ sti-drm-y := \
|
|||
sti_compositor.o \
|
||||
sti_crtc.o \
|
||||
sti_plane.o \
|
||||
sti_crtc.o \
|
||||
sti_plane.o \
|
||||
sti_hdmi.o \
|
||||
sti_hdmi_tx3g4c28phy.o \
|
||||
sti_dvo.o \
|
||||
|
|
|
|||
|
|
@ -95,6 +95,9 @@ static void drm_test_pick_cmdline_res_1920_1080_60(struct kunit *test)
|
|||
expected_mode = drm_mode_find_dmt(priv->drm, 1920, 1080, 60, false);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected_mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected_mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_ASSERT_TRUE(test,
|
||||
drm_mode_parse_command_line_for_connector(cmdline,
|
||||
connector,
|
||||
|
|
@ -129,7 +132,8 @@ static void drm_test_pick_cmdline_named(struct kunit *test)
|
|||
struct drm_device *drm = priv->drm;
|
||||
struct drm_connector *connector = &priv->connector;
|
||||
struct drm_cmdline_mode *cmdline_mode = &connector->cmdline_mode;
|
||||
const struct drm_display_mode *expected_mode, *mode;
|
||||
const struct drm_display_mode *mode;
|
||||
struct drm_display_mode *expected_mode;
|
||||
const char *cmdline = params->cmdline;
|
||||
int ret;
|
||||
|
||||
|
|
@ -149,6 +153,9 @@ static void drm_test_pick_cmdline_named(struct kunit *test)
|
|||
expected_mode = params->func(drm);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected_mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected_mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected_mode, mode));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <kunit/test.h>
|
||||
|
||||
#include <drm/drm_connector.h>
|
||||
#include <drm/drm_kunit_helpers.h>
|
||||
#include <drm/drm_modes.h>
|
||||
|
||||
static const struct drm_connector no_connector = {};
|
||||
|
|
@ -955,8 +956,15 @@ struct drm_cmdline_tv_option_test {
|
|||
static void drm_test_cmdline_tv_options(struct kunit *test)
|
||||
{
|
||||
const struct drm_cmdline_tv_option_test *params = test->param_value;
|
||||
const struct drm_display_mode *expected_mode = params->mode_fn(NULL);
|
||||
struct drm_display_mode *expected_mode;
|
||||
struct drm_cmdline_mode mode = { };
|
||||
int ret;
|
||||
|
||||
expected_mode = params->mode_fn(NULL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected_mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected_mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline,
|
||||
&no_connector, &mode));
|
||||
|
|
|
|||
|
|
@ -278,6 +278,28 @@ static void kunit_action_drm_mode_destroy(void *ptr)
|
|||
drm_mode_destroy(NULL, mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_kunit_add_mode_destroy_action() - Add a drm_destroy_mode kunit action
|
||||
* @test: The test context object
|
||||
* @mode: The drm_display_mode to destroy eventually
|
||||
*
|
||||
* Registers a kunit action that will destroy the drm_display_mode at
|
||||
* the end of the test.
|
||||
*
|
||||
* If an error occurs, the drm_display_mode will be destroyed.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, an error code otherwise.
|
||||
*/
|
||||
int drm_kunit_add_mode_destroy_action(struct kunit *test,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
return kunit_add_action_or_reset(test,
|
||||
kunit_action_drm_mode_destroy,
|
||||
mode);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_kunit_add_mode_destroy_action);
|
||||
|
||||
/**
|
||||
* drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC for a KUnit test
|
||||
* @test: The test context object
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
|
|||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *mode;
|
||||
int ret;
|
||||
|
||||
mode = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_NTSC,
|
||||
|
|
@ -47,6 +48,9 @@ static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
|
|||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 60);
|
||||
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
|
||||
|
||||
|
|
@ -70,6 +74,7 @@ static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test)
|
|||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *expected, *mode;
|
||||
int ret;
|
||||
|
||||
expected = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_NTSC,
|
||||
|
|
@ -77,9 +82,15 @@ static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test)
|
|||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
mode = drm_mode_analog_ntsc_480i(priv->drm);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
|
||||
}
|
||||
|
||||
|
|
@ -87,6 +98,7 @@ static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
|
|||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *mode;
|
||||
int ret;
|
||||
|
||||
mode = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_PAL,
|
||||
|
|
@ -94,6 +106,9 @@ static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
|
|||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
|
||||
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
|
||||
|
||||
|
|
@ -117,6 +132,7 @@ static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
|
|||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *expected, *mode;
|
||||
int ret;
|
||||
|
||||
expected = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_PAL,
|
||||
|
|
@ -124,9 +140,15 @@ static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
|
|||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
mode = drm_mode_analog_pal_576i(priv->drm);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
|
||||
}
|
||||
|
||||
|
|
@ -134,6 +156,7 @@ static void drm_test_modes_analog_tv_mono_576i(struct kunit *test)
|
|||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *mode;
|
||||
int ret;
|
||||
|
||||
mode = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_MONOCHROME,
|
||||
|
|
@ -141,6 +164,9 @@ static void drm_test_modes_analog_tv_mono_576i(struct kunit *test)
|
|||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, mode);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
|
||||
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ drm_test_connector_helper_tv_get_modes_check(struct kunit *test)
|
|||
struct drm_connector *connector = &priv->connector;
|
||||
struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;
|
||||
struct drm_display_mode *mode;
|
||||
const struct drm_display_mode *expected;
|
||||
struct drm_display_mode *expected;
|
||||
size_t len;
|
||||
int ret;
|
||||
|
||||
|
|
@ -134,6 +134,9 @@ drm_test_connector_helper_tv_get_modes_check(struct kunit *test)
|
|||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(mode, expected));
|
||||
KUNIT_EXPECT_TRUE(test, mode->type & DRM_MODE_TYPE_PREFERRED);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
}
|
||||
|
||||
if (params->num_expected_modes >= 2) {
|
||||
|
|
@ -145,6 +148,9 @@ drm_test_connector_helper_tv_get_modes_check(struct kunit *test)
|
|||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(mode, expected));
|
||||
KUNIT_EXPECT_FALSE(test, mode->type & DRM_MODE_TYPE_PREFERRED);
|
||||
|
||||
ret = drm_kunit_add_mode_destroy_action(test, expected);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->drm->mode_config.mutex);
|
||||
|
|
|
|||
|
|
@ -115,13 +115,14 @@ int virtio_gpu_gem_object_open(struct drm_gem_object *obj,
|
|||
if (!vgdev->has_context_init)
|
||||
virtio_gpu_create_context(obj->dev, file);
|
||||
|
||||
objs = virtio_gpu_array_alloc(1);
|
||||
if (!objs)
|
||||
return -ENOMEM;
|
||||
virtio_gpu_array_add_obj(objs, obj);
|
||||
if (vfpriv->context_created) {
|
||||
objs = virtio_gpu_array_alloc(1);
|
||||
if (!objs)
|
||||
return -ENOMEM;
|
||||
virtio_gpu_array_add_obj(objs, obj);
|
||||
|
||||
if (vfpriv->ctx_id)
|
||||
virtio_gpu_cmd_context_attach_resource(vgdev, vfpriv->ctx_id, objs);
|
||||
}
|
||||
|
||||
out_notify:
|
||||
virtio_gpu_notify(vgdev);
|
||||
|
|
|
|||
|
|
@ -366,12 +366,6 @@ static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane,
|
|||
return 0;
|
||||
|
||||
obj = new_state->fb->obj[0];
|
||||
if (obj->import_attach) {
|
||||
ret = virtio_gpu_prepare_imported_obj(plane, new_state, obj);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (bo->dumb || obj->import_attach) {
|
||||
vgplane_st->fence = virtio_gpu_fence_alloc(vgdev,
|
||||
vgdev->fence_drv.context,
|
||||
|
|
@ -380,7 +374,21 @@ static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (obj->import_attach) {
|
||||
ret = virtio_gpu_prepare_imported_obj(plane, new_state, obj);
|
||||
if (ret)
|
||||
goto err_fence;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_fence:
|
||||
if (vgplane_st->fence) {
|
||||
dma_fence_put(&vgplane_st->fence->f);
|
||||
vgplane_st->fence = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void virtio_gpu_cleanup_imported_obj(struct drm_gem_object *obj)
|
||||
|
|
|
|||
|
|
@ -321,6 +321,7 @@ struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
|
|||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
obj = &bo->base.base;
|
||||
obj->resv = buf->resv;
|
||||
obj->funcs = &virtgpu_gem_dma_buf_funcs;
|
||||
drm_gem_private_object_init(dev, obj, buf->size);
|
||||
|
||||
|
|
|
|||
|
|
@ -118,6 +118,9 @@ drm_kunit_helper_create_crtc(struct kunit *test,
|
|||
const struct drm_crtc_funcs *funcs,
|
||||
const struct drm_crtc_helper_funcs *helper_funcs);
|
||||
|
||||
int drm_kunit_add_mode_destroy_action(struct kunit *test,
|
||||
struct drm_display_mode *mode);
|
||||
|
||||
struct drm_display_mode *
|
||||
drm_kunit_display_mode_from_cea_vic(struct kunit *test, struct drm_device *dev,
|
||||
u8 video_code);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user