Short summary of fixes pull:
atomic: - Use correct type when reading damage rectangles display: - Fix kernel docs dp-mst: - Fix DSC decompression detection hdmi: - Fix infoframe size panthor: - Fix locking sched: - Update maintainers - Fix race condition whne queueing up jobs sysfb: - Disable sysfb if framebuffer parent device is unknown vbox: - Fix VLA handling -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEchf7rIzpz2NEoWjlaA3BHVMLeiMFAmb1TpgACgkQaA3BHVML eiM1lAgAlqlVLzCaOCT8LkkKCoZTSd0QQtd1LhzSIxMjxBPEs/smtZnlxeDOwjgT /2PjhEzjxcSDY/tYjRzMgGLVfOYBZjh//DB5Xf8Wh9M0Zojxxb9ER5OEnTcfy5Lb 3XvwbEEwnFFulq++f3cBS8Czq6c1b60KZh0X1kKogyOM/U0aEx141Ql3eCeAU8m4 GXtPi+4TA9L4uu2gYdVqrGNMp8y3+ezx6oPP2jaGOKoijbscvGYHgkU95CF9ouUh xf23EDTXAG9I2j/ZcdBwgaPAtTtt0IcQBPIemC8eSzk40PCoERUUX6qUEkvFK2bj JwNDzBI+y3LGS/LJsaJ1lxDQf0ddLg== =mhwR -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2024-09-26' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes Short summary of fixes pull: atomic: - Use correct type when reading damage rectangles display: - Fix kernel docs dp-mst: - Fix DSC decompression detection hdmi: - Fix infoframe size panthor: - Fix locking sched: - Update maintainers - Fix race condition whne queueing up jobs sysfb: - Disable sysfb if framebuffer parent device is unknown vbox: - Fix VLA handling Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20240926121045.GA561653@localhost.localdomain
This commit is contained in:
commit
43102a2012
@ -181,7 +181,7 @@ Bridge Operations
|
|||||||
Bridge Connector Helper
|
Bridge Connector Helper
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_bridge_connector.c
|
.. kernel-doc:: drivers/gpu/drm/display/drm_bridge_connector.c
|
||||||
:doc: overview
|
:doc: overview
|
||||||
|
|
||||||
|
|
||||||
@ -204,7 +204,7 @@ MIPI-DSI bridge operation
|
|||||||
Bridge Connector Helper Reference
|
Bridge Connector Helper Reference
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_bridge_connector.c
|
.. kernel-doc:: drivers/gpu/drm/display/drm_bridge_connector.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
Panel-Bridge Helper Reference
|
Panel-Bridge Helper Reference
|
||||||
|
@ -7832,6 +7832,8 @@ F: drivers/gpu/drm/xlnx/
|
|||||||
DRM GPU SCHEDULER
|
DRM GPU SCHEDULER
|
||||||
M: Luben Tuikov <ltuikov89@gmail.com>
|
M: Luben Tuikov <ltuikov89@gmail.com>
|
||||||
M: Matthew Brost <matthew.brost@intel.com>
|
M: Matthew Brost <matthew.brost@intel.com>
|
||||||
|
M: Danilo Krummrich <dakr@kernel.org>
|
||||||
|
M: Philipp Stanner <pstanner@redhat.com>
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||||
|
@ -67,9 +67,11 @@ static bool sysfb_unregister(void)
|
|||||||
void sysfb_disable(struct device *dev)
|
void sysfb_disable(struct device *dev)
|
||||||
{
|
{
|
||||||
struct screen_info *si = &screen_info;
|
struct screen_info *si = &screen_info;
|
||||||
|
struct device *parent;
|
||||||
|
|
||||||
mutex_lock(&disable_lock);
|
mutex_lock(&disable_lock);
|
||||||
if (!dev || dev == sysfb_parent_dev(si)) {
|
parent = sysfb_parent_dev(si);
|
||||||
|
if (!dev || !parent || dev == parent) {
|
||||||
sysfb_unregister();
|
sysfb_unregister();
|
||||||
disabled = true;
|
disabled = true;
|
||||||
}
|
}
|
||||||
|
@ -6083,6 +6083,7 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
|
|||||||
struct drm_dp_aux *immediate_upstream_aux;
|
struct drm_dp_aux *immediate_upstream_aux;
|
||||||
struct drm_dp_mst_port *fec_port;
|
struct drm_dp_mst_port *fec_port;
|
||||||
struct drm_dp_desc desc = {};
|
struct drm_dp_desc desc = {};
|
||||||
|
u8 upstream_dsc;
|
||||||
u8 endpoint_fec;
|
u8 endpoint_fec;
|
||||||
u8 endpoint_dsc;
|
u8 endpoint_dsc;
|
||||||
|
|
||||||
@ -6109,8 +6110,6 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
|
|||||||
|
|
||||||
/* DP-to-DP peer device */
|
/* DP-to-DP peer device */
|
||||||
if (drm_dp_mst_is_virtual_dpcd(immediate_upstream_port)) {
|
if (drm_dp_mst_is_virtual_dpcd(immediate_upstream_port)) {
|
||||||
u8 upstream_dsc;
|
|
||||||
|
|
||||||
if (drm_dp_dpcd_read(&port->aux,
|
if (drm_dp_dpcd_read(&port->aux,
|
||||||
DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
|
DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -6156,6 +6155,13 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
|
|||||||
if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD)) {
|
if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD)) {
|
||||||
u8 dpcd_ext[DP_RECEIVER_CAP_SIZE];
|
u8 dpcd_ext[DP_RECEIVER_CAP_SIZE];
|
||||||
|
|
||||||
|
if (drm_dp_dpcd_read(immediate_upstream_aux,
|
||||||
|
DP_DSC_SUPPORT, &upstream_dsc, 1) != 1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(upstream_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (drm_dp_read_dpcd_caps(immediate_upstream_aux, dpcd_ext) < 0)
|
if (drm_dp_read_dpcd_caps(immediate_upstream_aux, dpcd_ext) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -521,8 +521,6 @@ int drm_atomic_helper_connector_hdmi_check(struct drm_connector *connector,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_check);
|
EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_check);
|
||||||
|
|
||||||
#define HDMI_MAX_INFOFRAME_SIZE 29
|
|
||||||
|
|
||||||
static int clear_device_infoframe(struct drm_connector *connector,
|
static int clear_device_infoframe(struct drm_connector *connector,
|
||||||
enum hdmi_infoframe_type type)
|
enum hdmi_infoframe_type type)
|
||||||
{
|
{
|
||||||
@ -563,7 +561,7 @@ static int write_device_infoframe(struct drm_connector *connector,
|
|||||||
{
|
{
|
||||||
const struct drm_connector_hdmi_funcs *funcs = connector->hdmi.funcs;
|
const struct drm_connector_hdmi_funcs *funcs = connector->hdmi.funcs;
|
||||||
struct drm_device *dev = connector->dev;
|
struct drm_device *dev = connector->dev;
|
||||||
u8 buffer[HDMI_MAX_INFOFRAME_SIZE];
|
u8 buffer[HDMI_INFOFRAME_SIZE(MAX)];
|
||||||
int ret;
|
int ret;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
@ -543,7 +543,7 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,
|
|||||||
&state->fb_damage_clips,
|
&state->fb_damage_clips,
|
||||||
val,
|
val,
|
||||||
-1,
|
-1,
|
||||||
sizeof(struct drm_rect),
|
sizeof(struct drm_mode_rect),
|
||||||
&replaced);
|
&replaced);
|
||||||
return ret;
|
return ret;
|
||||||
} else if (property == plane->scaling_filter_property) {
|
} else if (property == plane->scaling_filter_property) {
|
||||||
|
@ -520,8 +520,6 @@ static const struct file_operations drm_connector_fops = {
|
|||||||
.write = connector_write
|
.write = connector_write
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HDMI_MAX_INFOFRAME_SIZE 29
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
audio_infoframe_read(struct file *filp, char __user *ubuf, size_t count, loff_t *ppos)
|
audio_infoframe_read(struct file *filp, char __user *ubuf, size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
@ -579,7 +577,7 @@ static ssize_t _f##_read_infoframe(struct file *filp, \
|
|||||||
struct drm_connector *connector; \
|
struct drm_connector *connector; \
|
||||||
union hdmi_infoframe *frame; \
|
union hdmi_infoframe *frame; \
|
||||||
struct drm_device *dev; \
|
struct drm_device *dev; \
|
||||||
u8 buf[HDMI_MAX_INFOFRAME_SIZE]; \
|
u8 buf[HDMI_INFOFRAME_SIZE(MAX)]; \
|
||||||
ssize_t len = 0; \
|
ssize_t len = 0; \
|
||||||
\
|
\
|
||||||
connector = filp->private_data; \
|
connector = filp->private_data; \
|
||||||
|
@ -3242,6 +3242,18 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct panthor_group *group_from_handle(struct panthor_group_pool *pool,
|
||||||
|
u32 group_handle)
|
||||||
|
{
|
||||||
|
struct panthor_group *group;
|
||||||
|
|
||||||
|
xa_lock(&pool->xa);
|
||||||
|
group = group_get(xa_load(&pool->xa, group_handle));
|
||||||
|
xa_unlock(&pool->xa);
|
||||||
|
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
int panthor_group_get_state(struct panthor_file *pfile,
|
int panthor_group_get_state(struct panthor_file *pfile,
|
||||||
struct drm_panthor_group_get_state *get_state)
|
struct drm_panthor_group_get_state *get_state)
|
||||||
{
|
{
|
||||||
@ -3253,7 +3265,7 @@ int panthor_group_get_state(struct panthor_file *pfile,
|
|||||||
if (get_state->pad)
|
if (get_state->pad)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
group = group_get(xa_load(&gpool->xa, get_state->group_handle));
|
group = group_from_handle(gpool, get_state->group_handle);
|
||||||
if (!group)
|
if (!group)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -3384,7 +3396,7 @@ panthor_job_create(struct panthor_file *pfile,
|
|||||||
job->call_info.latest_flush = qsubmit->latest_flush;
|
job->call_info.latest_flush = qsubmit->latest_flush;
|
||||||
INIT_LIST_HEAD(&job->node);
|
INIT_LIST_HEAD(&job->node);
|
||||||
|
|
||||||
job->group = group_get(xa_load(&gpool->xa, group_handle));
|
job->group = group_from_handle(gpool, group_handle);
|
||||||
if (!job->group) {
|
if (!job->group) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_put_job;
|
goto err_put_job;
|
||||||
|
@ -380,7 +380,7 @@ static void drm_sched_entity_wakeup(struct dma_fence *f,
|
|||||||
container_of(cb, struct drm_sched_entity, cb);
|
container_of(cb, struct drm_sched_entity, cb);
|
||||||
|
|
||||||
drm_sched_entity_clear_dep(f, cb);
|
drm_sched_entity_clear_dep(f, cb);
|
||||||
drm_sched_wakeup(entity->rq->sched, entity);
|
drm_sched_wakeup(entity->rq->sched);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -612,7 +612,7 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job)
|
|||||||
if (drm_sched_policy == DRM_SCHED_POLICY_FIFO)
|
if (drm_sched_policy == DRM_SCHED_POLICY_FIFO)
|
||||||
drm_sched_rq_update_fifo(entity, submit_ts);
|
drm_sched_rq_update_fifo(entity, submit_ts);
|
||||||
|
|
||||||
drm_sched_wakeup(entity->rq->sched, entity);
|
drm_sched_wakeup(entity->rq->sched);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_sched_entity_push_job);
|
EXPORT_SYMBOL(drm_sched_entity_push_job);
|
||||||
|
@ -1013,15 +1013,12 @@ EXPORT_SYMBOL(drm_sched_job_cleanup);
|
|||||||
/**
|
/**
|
||||||
* drm_sched_wakeup - Wake up the scheduler if it is ready to queue
|
* drm_sched_wakeup - Wake up the scheduler if it is ready to queue
|
||||||
* @sched: scheduler instance
|
* @sched: scheduler instance
|
||||||
* @entity: the scheduler entity
|
|
||||||
*
|
*
|
||||||
* Wake up the scheduler if we can queue jobs.
|
* Wake up the scheduler if we can queue jobs.
|
||||||
*/
|
*/
|
||||||
void drm_sched_wakeup(struct drm_gpu_scheduler *sched,
|
void drm_sched_wakeup(struct drm_gpu_scheduler *sched)
|
||||||
struct drm_sched_entity *entity)
|
|
||||||
{
|
{
|
||||||
if (drm_sched_can_queue(sched, entity))
|
drm_sched_run_job_queue(sched);
|
||||||
drm_sched_run_job_queue(sched);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -139,7 +139,15 @@ int hgsmi_update_pointer_shape(struct gen_pool *ctx, u32 flags,
|
|||||||
flags |= VBOX_MOUSE_POINTER_VISIBLE;
|
flags |= VBOX_MOUSE_POINTER_VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = hgsmi_buffer_alloc(ctx, sizeof(*p) + pixel_len, HGSMI_CH_VBVA,
|
/*
|
||||||
|
* The 4 extra bytes come from switching struct vbva_mouse_pointer_shape
|
||||||
|
* from having a 4 bytes fixed array at the end to using a proper VLA
|
||||||
|
* at the end. These 4 extra bytes were not subtracted from sizeof(*p)
|
||||||
|
* before the switch to the VLA, so this way the behavior is unchanged.
|
||||||
|
* Chances are these 4 extra bytes are not necessary but they are kept
|
||||||
|
* to avoid regressions.
|
||||||
|
*/
|
||||||
|
p = hgsmi_buffer_alloc(ctx, sizeof(*p) + pixel_len + 4, HGSMI_CH_VBVA,
|
||||||
VBVA_MOUSE_POINTER_SHAPE);
|
VBVA_MOUSE_POINTER_SHAPE);
|
||||||
if (!p)
|
if (!p)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -351,10 +351,8 @@ struct vbva_mouse_pointer_shape {
|
|||||||
* Bytes in the gap between the AND and the XOR mask are undefined.
|
* Bytes in the gap between the AND and the XOR mask are undefined.
|
||||||
* XOR mask scanlines have no gap between them and size of XOR mask is:
|
* XOR mask scanlines have no gap between them and size of XOR mask is:
|
||||||
* xor_len = width * 4 * height.
|
* xor_len = width * 4 * height.
|
||||||
*
|
|
||||||
* Preallocate 4 bytes for accessing actual data as p->data.
|
|
||||||
*/
|
*/
|
||||||
u8 data[4];
|
u8 data[];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* pointer is visible */
|
/* pointer is visible */
|
||||||
|
@ -574,7 +574,7 @@ void drm_sched_entity_modify_sched(struct drm_sched_entity *entity,
|
|||||||
|
|
||||||
void drm_sched_tdr_queue_imm(struct drm_gpu_scheduler *sched);
|
void drm_sched_tdr_queue_imm(struct drm_gpu_scheduler *sched);
|
||||||
void drm_sched_job_cleanup(struct drm_sched_job *job);
|
void drm_sched_job_cleanup(struct drm_sched_job *job);
|
||||||
void drm_sched_wakeup(struct drm_gpu_scheduler *sched, struct drm_sched_entity *entity);
|
void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
|
||||||
bool drm_sched_wqueue_ready(struct drm_gpu_scheduler *sched);
|
bool drm_sched_wqueue_ready(struct drm_gpu_scheduler *sched);
|
||||||
void drm_sched_wqueue_stop(struct drm_gpu_scheduler *sched);
|
void drm_sched_wqueue_stop(struct drm_gpu_scheduler *sched);
|
||||||
void drm_sched_wqueue_start(struct drm_gpu_scheduler *sched);
|
void drm_sched_wqueue_start(struct drm_gpu_scheduler *sched);
|
||||||
|
@ -59,6 +59,15 @@ enum hdmi_infoframe_type {
|
|||||||
#define HDMI_DRM_INFOFRAME_SIZE 26
|
#define HDMI_DRM_INFOFRAME_SIZE 26
|
||||||
#define HDMI_VENDOR_INFOFRAME_SIZE 4
|
#define HDMI_VENDOR_INFOFRAME_SIZE 4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HDMI 1.3a table 5-14 states that the largest InfoFrame_length is 27,
|
||||||
|
* not including the packet header or checksum byte. We include the
|
||||||
|
* checksum byte in HDMI_INFOFRAME_HEADER_SIZE, so this should allow
|
||||||
|
* HDMI_INFOFRAME_SIZE(MAX) to be the largest buffer we could ever need
|
||||||
|
* for any HDMI infoframe.
|
||||||
|
*/
|
||||||
|
#define HDMI_MAX_INFOFRAME_SIZE 27
|
||||||
|
|
||||||
#define HDMI_INFOFRAME_SIZE(type) \
|
#define HDMI_INFOFRAME_SIZE(type) \
|
||||||
(HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
|
(HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user