Commit 43102a20 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2024-09-26' of...

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: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240926121045.GA561653@localhost.localdomain
parents 9852d85e ad604f0a
...@@ -181,7 +181,7 @@ Bridge Operations ...@@ -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 ...@@ -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/ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 = { ...@@ -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, \ ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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); ...@@ -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, ...@@ -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 { ...@@ -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, ...@@ -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 { ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment