Commit 5502d1fa authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2023-05-24' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

drm-misc-fixes for v6.4-rc4:
- A few non-trivial fixes to qaic.
- Fix drmm_mutex_init always using same lock class.
- Fix pl111 fb depth.
- Fix uninitialised gamma lut in mgag200.
- Add Aya Neo Air Plus quirk.
- Trivial null check removal in scheduler.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/d19f748c-2c5b-8140-5b05-a8282dfef73e@linux.intel.com
parents 13aa38f8 e997c218
...@@ -997,14 +997,34 @@ static void *msg_xfer(struct qaic_device *qdev, struct wrapper_list *wrappers, u ...@@ -997,14 +997,34 @@ static void *msg_xfer(struct qaic_device *qdev, struct wrapper_list *wrappers, u
struct xfer_queue_elem elem; struct xfer_queue_elem elem;
struct wire_msg *out_buf; struct wire_msg *out_buf;
struct wrapper_msg *w; struct wrapper_msg *w;
long ret = -EAGAIN;
int xfer_count = 0;
int retry_count; int retry_count;
long ret;
if (qdev->in_reset) { if (qdev->in_reset) {
mutex_unlock(&qdev->cntl_mutex); mutex_unlock(&qdev->cntl_mutex);
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
/* Attempt to avoid a partial commit of a message */
list_for_each_entry(w, &wrappers->list, list)
xfer_count++;
for (retry_count = 0; retry_count < QAIC_MHI_RETRY_MAX; retry_count++) {
if (xfer_count <= mhi_get_free_desc_count(qdev->cntl_ch, DMA_TO_DEVICE)) {
ret = 0;
break;
}
msleep_interruptible(QAIC_MHI_RETRY_WAIT_MS);
if (signal_pending(current))
break;
}
if (ret) {
mutex_unlock(&qdev->cntl_mutex);
return ERR_PTR(ret);
}
elem.seq_num = seq_num; elem.seq_num = seq_num;
elem.buf = NULL; elem.buf = NULL;
init_completion(&elem.xfer_done); init_completion(&elem.xfer_done);
...@@ -1038,16 +1058,9 @@ static void *msg_xfer(struct qaic_device *qdev, struct wrapper_list *wrappers, u ...@@ -1038,16 +1058,9 @@ static void *msg_xfer(struct qaic_device *qdev, struct wrapper_list *wrappers, u
list_for_each_entry(w, &wrappers->list, list) { list_for_each_entry(w, &wrappers->list, list) {
kref_get(&w->ref_count); kref_get(&w->ref_count);
retry_count = 0; retry_count = 0;
retry:
ret = mhi_queue_buf(qdev->cntl_ch, DMA_TO_DEVICE, &w->msg, w->len, ret = mhi_queue_buf(qdev->cntl_ch, DMA_TO_DEVICE, &w->msg, w->len,
list_is_last(&w->list, &wrappers->list) ? MHI_EOT : MHI_CHAIN); list_is_last(&w->list, &wrappers->list) ? MHI_EOT : MHI_CHAIN);
if (ret) { if (ret) {
if (ret == -EAGAIN && retry_count++ < QAIC_MHI_RETRY_MAX) {
msleep_interruptible(QAIC_MHI_RETRY_WAIT_MS);
if (!signal_pending(current))
goto retry;
}
qdev->cntl_lost_buf = true; qdev->cntl_lost_buf = true;
kref_put(&w->ref_count, free_wrapper); kref_put(&w->ref_count, free_wrapper);
mutex_unlock(&qdev->cntl_mutex); mutex_unlock(&qdev->cntl_mutex);
...@@ -1249,7 +1262,7 @@ static int qaic_manage(struct qaic_device *qdev, struct qaic_user *usr, struct m ...@@ -1249,7 +1262,7 @@ static int qaic_manage(struct qaic_device *qdev, struct qaic_user *usr, struct m
int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
struct qaic_manage_msg *user_msg; struct qaic_manage_msg *user_msg = data;
struct qaic_device *qdev; struct qaic_device *qdev;
struct manage_msg *msg; struct manage_msg *msg;
struct qaic_user *usr; struct qaic_user *usr;
...@@ -1258,6 +1271,9 @@ int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_ ...@@ -1258,6 +1271,9 @@ int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_
int usr_rcu_id; int usr_rcu_id;
int ret; int ret;
if (user_msg->len > QAIC_MANAGE_MAX_MSG_LENGTH)
return -EINVAL;
usr = file_priv->driver_priv; usr = file_priv->driver_priv;
usr_rcu_id = srcu_read_lock(&usr->qddev_lock); usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
...@@ -1275,13 +1291,6 @@ int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_ ...@@ -1275,13 +1291,6 @@ int qaic_manage_ioctl(struct drm_device *dev, void *data, struct drm_file *file_
return -ENODEV; return -ENODEV;
} }
user_msg = data;
if (user_msg->len > QAIC_MANAGE_MAX_MSG_LENGTH) {
ret = -EINVAL;
goto out;
}
msg = kzalloc(QAIC_MANAGE_MAX_MSG_LENGTH + sizeof(*msg), GFP_KERNEL); msg = kzalloc(QAIC_MANAGE_MAX_MSG_LENGTH + sizeof(*msg), GFP_KERNEL);
if (!msg) { if (!msg) {
ret = -ENOMEM; ret = -ENOMEM;
......
...@@ -591,7 +591,7 @@ static int qaic_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struc ...@@ -591,7 +591,7 @@ static int qaic_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struc
struct qaic_bo *bo = to_qaic_bo(obj); struct qaic_bo *bo = to_qaic_bo(obj);
unsigned long offset = 0; unsigned long offset = 0;
struct scatterlist *sg; struct scatterlist *sg;
int ret; int ret = 0;
if (obj->import_attach) if (obj->import_attach)
return -EINVAL; return -EINVAL;
...@@ -663,6 +663,10 @@ int qaic_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *fi ...@@ -663,6 +663,10 @@ int qaic_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *fi
if (args->pad) if (args->pad)
return -EINVAL; return -EINVAL;
size = PAGE_ALIGN(args->size);
if (size == 0)
return -EINVAL;
usr = file_priv->driver_priv; usr = file_priv->driver_priv;
usr_rcu_id = srcu_read_lock(&usr->qddev_lock); usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
if (!usr->qddev) { if (!usr->qddev) {
...@@ -677,12 +681,6 @@ int qaic_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *fi ...@@ -677,12 +681,6 @@ int qaic_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *fi
goto unlock_dev_srcu; goto unlock_dev_srcu;
} }
size = PAGE_ALIGN(args->size);
if (size == 0) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
bo = qaic_alloc_init_bo(); bo = qaic_alloc_init_bo();
if (IS_ERR(bo)) { if (IS_ERR(bo)) {
ret = PTR_ERR(bo); ret = PTR_ERR(bo);
...@@ -926,8 +924,8 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi ...@@ -926,8 +924,8 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
{ {
struct qaic_attach_slice_entry *slice_ent; struct qaic_attach_slice_entry *slice_ent;
struct qaic_attach_slice *args = data; struct qaic_attach_slice *args = data;
int rcu_id, usr_rcu_id, qdev_rcu_id;
struct dma_bridge_chan *dbc; struct dma_bridge_chan *dbc;
int usr_rcu_id, qdev_rcu_id;
struct drm_gem_object *obj; struct drm_gem_object *obj;
struct qaic_device *qdev; struct qaic_device *qdev;
unsigned long arg_size; unsigned long arg_size;
...@@ -936,6 +934,22 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi ...@@ -936,6 +934,22 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
struct qaic_bo *bo; struct qaic_bo *bo;
int ret; int ret;
if (args->hdr.count == 0)
return -EINVAL;
arg_size = args->hdr.count * sizeof(*slice_ent);
if (arg_size / args->hdr.count != sizeof(*slice_ent))
return -EINVAL;
if (args->hdr.size == 0)
return -EINVAL;
if (!(args->hdr.dir == DMA_TO_DEVICE || args->hdr.dir == DMA_FROM_DEVICE))
return -EINVAL;
if (args->data == 0)
return -EINVAL;
usr = file_priv->driver_priv; usr = file_priv->driver_priv;
usr_rcu_id = srcu_read_lock(&usr->qddev_lock); usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
if (!usr->qddev) { if (!usr->qddev) {
...@@ -950,43 +964,11 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi ...@@ -950,43 +964,11 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
goto unlock_dev_srcu; goto unlock_dev_srcu;
} }
if (args->hdr.count == 0) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
arg_size = args->hdr.count * sizeof(*slice_ent);
if (arg_size / args->hdr.count != sizeof(*slice_ent)) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
if (args->hdr.dbc_id >= qdev->num_dbc) { if (args->hdr.dbc_id >= qdev->num_dbc) {
ret = -EINVAL; ret = -EINVAL;
goto unlock_dev_srcu; goto unlock_dev_srcu;
} }
if (args->hdr.size == 0) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
if (!(args->hdr.dir == DMA_TO_DEVICE || args->hdr.dir == DMA_FROM_DEVICE)) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
dbc = &qdev->dbc[args->hdr.dbc_id];
if (dbc->usr != usr) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
if (args->data == 0) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
user_data = u64_to_user_ptr(args->data); user_data = u64_to_user_ptr(args->data);
slice_ent = kzalloc(arg_size, GFP_KERNEL); slice_ent = kzalloc(arg_size, GFP_KERNEL);
...@@ -1013,9 +995,21 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi ...@@ -1013,9 +995,21 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
bo = to_qaic_bo(obj); bo = to_qaic_bo(obj);
if (bo->sliced) {
ret = -EINVAL;
goto put_bo;
}
dbc = &qdev->dbc[args->hdr.dbc_id];
rcu_id = srcu_read_lock(&dbc->ch_lock);
if (dbc->usr != usr) {
ret = -EINVAL;
goto unlock_ch_srcu;
}
ret = qaic_prepare_bo(qdev, bo, &args->hdr); ret = qaic_prepare_bo(qdev, bo, &args->hdr);
if (ret) if (ret)
goto put_bo; goto unlock_ch_srcu;
ret = qaic_attach_slicing_bo(qdev, bo, &args->hdr, slice_ent); ret = qaic_attach_slicing_bo(qdev, bo, &args->hdr, slice_ent);
if (ret) if (ret)
...@@ -1025,6 +1019,7 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi ...@@ -1025,6 +1019,7 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, args->hdr.dir); dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, args->hdr.dir);
bo->dbc = dbc; bo->dbc = dbc;
srcu_read_unlock(&dbc->ch_lock, rcu_id);
drm_gem_object_put(obj); drm_gem_object_put(obj);
srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id); srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
srcu_read_unlock(&usr->qddev_lock, usr_rcu_id); srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
...@@ -1033,6 +1028,8 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi ...@@ -1033,6 +1028,8 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
unprepare_bo: unprepare_bo:
qaic_unprepare_bo(qdev, bo); qaic_unprepare_bo(qdev, bo);
unlock_ch_srcu:
srcu_read_unlock(&dbc->ch_lock, rcu_id);
put_bo: put_bo:
drm_gem_object_put(obj); drm_gem_object_put(obj);
free_slice_ent: free_slice_ent:
...@@ -1316,7 +1313,6 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr ...@@ -1316,7 +1313,6 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
received_ts = ktime_get_ns(); received_ts = ktime_get_ns();
size = is_partial ? sizeof(*pexec) : sizeof(*exec); size = is_partial ? sizeof(*pexec) : sizeof(*exec);
n = (unsigned long)size * args->hdr.count; n = (unsigned long)size * args->hdr.count;
if (args->hdr.count == 0 || n / args->hdr.count != size) if (args->hdr.count == 0 || n / args->hdr.count != size)
return -EINVAL; return -EINVAL;
...@@ -1665,6 +1661,9 @@ int qaic_wait_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file ...@@ -1665,6 +1661,9 @@ int qaic_wait_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file
int rcu_id; int rcu_id;
int ret; int ret;
if (args->pad != 0)
return -EINVAL;
usr = file_priv->driver_priv; usr = file_priv->driver_priv;
usr_rcu_id = srcu_read_lock(&usr->qddev_lock); usr_rcu_id = srcu_read_lock(&usr->qddev_lock);
if (!usr->qddev) { if (!usr->qddev) {
...@@ -1679,11 +1678,6 @@ int qaic_wait_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file ...@@ -1679,11 +1678,6 @@ int qaic_wait_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *file
goto unlock_dev_srcu; goto unlock_dev_srcu;
} }
if (args->pad != 0) {
ret = -EINVAL;
goto unlock_dev_srcu;
}
if (args->dbc_id >= qdev->num_dbc) { if (args->dbc_id >= qdev->num_dbc) {
ret = -EINVAL; ret = -EINVAL;
goto unlock_dev_srcu; goto unlock_dev_srcu;
...@@ -1855,6 +1849,11 @@ void wakeup_dbc(struct qaic_device *qdev, u32 dbc_id) ...@@ -1855,6 +1849,11 @@ void wakeup_dbc(struct qaic_device *qdev, u32 dbc_id)
dbc->usr = NULL; dbc->usr = NULL;
empty_xfer_list(qdev, dbc); empty_xfer_list(qdev, dbc);
synchronize_srcu(&dbc->ch_lock); synchronize_srcu(&dbc->ch_lock);
/*
* Threads holding channel lock, may add more elements in the xfer_list.
* Flush out these elements from xfer_list.
*/
empty_xfer_list(qdev, dbc);
} }
void release_dbc(struct qaic_device *qdev, u32 dbc_id) void release_dbc(struct qaic_device *qdev, u32 dbc_id)
......
...@@ -262,8 +262,8 @@ static void qaic_destroy_drm_device(struct qaic_device *qdev, s32 partition_id) ...@@ -262,8 +262,8 @@ static void qaic_destroy_drm_device(struct qaic_device *qdev, s32 partition_id)
static int qaic_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_device_id *id) static int qaic_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_device_id *id)
{ {
u16 major = -1, minor = -1;
struct qaic_device *qdev; struct qaic_device *qdev;
u16 major, minor;
int ret; int ret;
/* /*
......
...@@ -264,28 +264,10 @@ void drmm_kfree(struct drm_device *dev, void *data) ...@@ -264,28 +264,10 @@ void drmm_kfree(struct drm_device *dev, void *data)
} }
EXPORT_SYMBOL(drmm_kfree); EXPORT_SYMBOL(drmm_kfree);
static void drmm_mutex_release(struct drm_device *dev, void *res) void __drmm_mutex_release(struct drm_device *dev, void *res)
{ {
struct mutex *lock = res; struct mutex *lock = res;
mutex_destroy(lock); mutex_destroy(lock);
} }
EXPORT_SYMBOL(__drmm_mutex_release);
/**
* drmm_mutex_init - &drm_device-managed mutex_init()
* @dev: DRM device
* @lock: lock to be initialized
*
* Returns:
* 0 on success, or a negative errno code otherwise.
*
* This is a &drm_device-managed version of mutex_init(). The initialized
* lock is automatically destroyed on the final drm_dev_put().
*/
int drmm_mutex_init(struct drm_device *dev, struct mutex *lock)
{
mutex_init(lock);
return drmm_add_action_or_reset(dev, drmm_mutex_release, lock);
}
EXPORT_SYMBOL(drmm_mutex_init);
...@@ -179,7 +179,7 @@ static const struct dmi_system_id orientation_data[] = { ...@@ -179,7 +179,7 @@ static const struct dmi_system_id orientation_data[] = {
}, { /* AYA NEO AIR */ }, { /* AYA NEO AIR */
.matches = { .matches = {
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"), DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"),
DMI_MATCH(DMI_BOARD_NAME, "AIR"), DMI_MATCH(DMI_PRODUCT_NAME, "AIR"),
}, },
.driver_data = (void *)&lcd1080x1920_leftside_up, .driver_data = (void *)&lcd1080x1920_leftside_up,
}, { /* AYA NEO NEXT */ }, { /* AYA NEO NEXT */
......
...@@ -642,6 +642,11 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_ ...@@ -642,6 +642,11 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_
if (funcs->pixpllc_atomic_update) if (funcs->pixpllc_atomic_update)
funcs->pixpllc_atomic_update(crtc, old_state); funcs->pixpllc_atomic_update(crtc, old_state);
if (crtc_state->gamma_lut)
mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data);
else
mgag200_crtc_set_gamma_linear(mdev, format);
mgag200_enable_display(mdev); mgag200_enable_display(mdev);
if (funcs->enable_vidrst) if (funcs->enable_vidrst)
......
...@@ -53,7 +53,7 @@ pl111_mode_valid(struct drm_simple_display_pipe *pipe, ...@@ -53,7 +53,7 @@ pl111_mode_valid(struct drm_simple_display_pipe *pipe,
{ {
struct drm_device *drm = pipe->crtc.dev; struct drm_device *drm = pipe->crtc.dev;
struct pl111_drm_dev_private *priv = drm->dev_private; struct pl111_drm_dev_private *priv = drm->dev_private;
u32 cpp = priv->variant->fb_bpp / 8; u32 cpp = DIV_ROUND_UP(priv->variant->fb_depth, 8);
u64 bw; u64 bw;
/* /*
......
...@@ -114,7 +114,7 @@ struct drm_minor; ...@@ -114,7 +114,7 @@ struct drm_minor;
* extensions to the control register * extensions to the control register
* @formats: array of supported pixel formats on this variant * @formats: array of supported pixel formats on this variant
* @nformats: the length of the array of supported pixel formats * @nformats: the length of the array of supported pixel formats
* @fb_bpp: desired bits per pixel on the default framebuffer * @fb_depth: desired depth per pixel on the default framebuffer
*/ */
struct pl111_variant_data { struct pl111_variant_data {
const char *name; const char *name;
...@@ -126,7 +126,7 @@ struct pl111_variant_data { ...@@ -126,7 +126,7 @@ struct pl111_variant_data {
bool st_bitmux_control; bool st_bitmux_control;
const u32 *formats; const u32 *formats;
unsigned int nformats; unsigned int nformats;
unsigned int fb_bpp; unsigned int fb_depth;
}; };
struct pl111_drm_dev_private { struct pl111_drm_dev_private {
......
...@@ -308,7 +308,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev, ...@@ -308,7 +308,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
if (ret < 0) if (ret < 0)
goto dev_put; goto dev_put;
drm_fbdev_dma_setup(drm, priv->variant->fb_bpp); drm_fbdev_dma_setup(drm, priv->variant->fb_depth);
return 0; return 0;
...@@ -351,7 +351,7 @@ static const struct pl111_variant_data pl110_variant = { ...@@ -351,7 +351,7 @@ static const struct pl111_variant_data pl110_variant = {
.is_pl110 = true, .is_pl110 = true,
.formats = pl110_pixel_formats, .formats = pl110_pixel_formats,
.nformats = ARRAY_SIZE(pl110_pixel_formats), .nformats = ARRAY_SIZE(pl110_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* RealView, Versatile Express etc use this modern variant */ /* RealView, Versatile Express etc use this modern variant */
...@@ -376,7 +376,7 @@ static const struct pl111_variant_data pl111_variant = { ...@@ -376,7 +376,7 @@ static const struct pl111_variant_data pl111_variant = {
.name = "PL111", .name = "PL111",
.formats = pl111_pixel_formats, .formats = pl111_pixel_formats,
.nformats = ARRAY_SIZE(pl111_pixel_formats), .nformats = ARRAY_SIZE(pl111_pixel_formats),
.fb_bpp = 32, .fb_depth = 32,
}; };
static const u32 pl110_nomadik_pixel_formats[] = { static const u32 pl110_nomadik_pixel_formats[] = {
...@@ -405,7 +405,7 @@ static const struct pl111_variant_data pl110_nomadik_variant = { ...@@ -405,7 +405,7 @@ static const struct pl111_variant_data pl110_nomadik_variant = {
.is_lcdc = true, .is_lcdc = true,
.st_bitmux_control = true, .st_bitmux_control = true,
.broken_vblank = true, .broken_vblank = true,
.fb_bpp = 16, .fb_depth = 16,
}; };
static const struct amba_id pl111_id_table[] = { static const struct amba_id pl111_id_table[] = {
......
...@@ -316,7 +316,7 @@ static const struct pl111_variant_data pl110_integrator = { ...@@ -316,7 +316,7 @@ static const struct pl111_variant_data pl110_integrator = {
.broken_vblank = true, .broken_vblank = true,
.formats = pl110_integrator_pixel_formats, .formats = pl110_integrator_pixel_formats,
.nformats = ARRAY_SIZE(pl110_integrator_pixel_formats), .nformats = ARRAY_SIZE(pl110_integrator_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* /*
...@@ -330,7 +330,7 @@ static const struct pl111_variant_data pl110_impd1 = { ...@@ -330,7 +330,7 @@ static const struct pl111_variant_data pl110_impd1 = {
.broken_vblank = true, .broken_vblank = true,
.formats = pl110_integrator_pixel_formats, .formats = pl110_integrator_pixel_formats,
.nformats = ARRAY_SIZE(pl110_integrator_pixel_formats), .nformats = ARRAY_SIZE(pl110_integrator_pixel_formats),
.fb_bpp = 16, .fb_depth = 15,
}; };
/* /*
...@@ -343,7 +343,7 @@ static const struct pl111_variant_data pl110_versatile = { ...@@ -343,7 +343,7 @@ static const struct pl111_variant_data pl110_versatile = {
.external_bgr = true, .external_bgr = true,
.formats = pl110_versatile_pixel_formats, .formats = pl110_versatile_pixel_formats,
.nformats = ARRAY_SIZE(pl110_versatile_pixel_formats), .nformats = ARRAY_SIZE(pl110_versatile_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* /*
...@@ -355,7 +355,7 @@ static const struct pl111_variant_data pl111_realview = { ...@@ -355,7 +355,7 @@ static const struct pl111_variant_data pl111_realview = {
.name = "PL111 RealView", .name = "PL111 RealView",
.formats = pl111_realview_pixel_formats, .formats = pl111_realview_pixel_formats,
.nformats = ARRAY_SIZE(pl111_realview_pixel_formats), .nformats = ARRAY_SIZE(pl111_realview_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* /*
...@@ -367,7 +367,7 @@ static const struct pl111_variant_data pl111_vexpress = { ...@@ -367,7 +367,7 @@ static const struct pl111_variant_data pl111_vexpress = {
.name = "PL111 Versatile Express", .name = "PL111 Versatile Express",
.formats = pl111_realview_pixel_formats, .formats = pl111_realview_pixel_formats,
.nformats = ARRAY_SIZE(pl111_realview_pixel_formats), .nformats = ARRAY_SIZE(pl111_realview_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
.broken_clockdivider = true, .broken_clockdivider = true,
}; };
......
...@@ -1141,9 +1141,6 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched) ...@@ -1141,9 +1141,6 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched)
for (i = DRM_SCHED_PRIORITY_COUNT - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) { for (i = DRM_SCHED_PRIORITY_COUNT - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) {
struct drm_sched_rq *rq = &sched->sched_rq[i]; struct drm_sched_rq *rq = &sched->sched_rq[i];
if (!rq)
continue;
spin_lock(&rq->lock); spin_lock(&rq->lock);
list_for_each_entry(s_entity, &rq->entities, list) list_for_each_entry(s_entity, &rq->entities, list)
/* /*
......
...@@ -105,6 +105,22 @@ char *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp); ...@@ -105,6 +105,22 @@ char *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp);
void drmm_kfree(struct drm_device *dev, void *data); void drmm_kfree(struct drm_device *dev, void *data);
int drmm_mutex_init(struct drm_device *dev, struct mutex *lock); void __drmm_mutex_release(struct drm_device *dev, void *res);
/**
* drmm_mutex_init - &drm_device-managed mutex_init()
* @dev: DRM device
* @lock: lock to be initialized
*
* Returns:
* 0 on success, or a negative errno code otherwise.
*
* This is a &drm_device-managed version of mutex_init(). The initialized
* lock is automatically destroyed on the final drm_dev_put().
*/
#define drmm_mutex_init(dev, lock) ({ \
mutex_init(lock); \
drmm_add_action_or_reset(dev, __drmm_mutex_release, lock); \
}) \
#endif #endif
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