mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
Three mode setting fixes for fsl-ldb, a fbdev removal use-after-free fix,
a dma-buf fence use-after-free fix, a DMA setup fix for rockchip, an error path fix and memory corruption fix for panfrost and one more orientation quirk -----BEGIN PGP SIGNATURE----- iHUEABMIAB0WIQTXEe0+DlZaRlgM8LOIQ8rmN6G3ywUCYsdEIwAKCRCIQ8rmN6G3 y5FbAP9fxB2+mpo87s3pTFLDPHPKpRBHdrKLO/nfimlyYU/BogEAyRY1AXyaYZNi BDnVa9RwNe1Hp3/AqA+p/2G9Lze8GuI= =ZKyf -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2022-07-07-1' of ssh://git.freedesktop.org/git/drm/drm-misc into drm-fixes Three mode setting fixes for fsl-ldb, a fbdev removal use-after-free fix, a dma-buf fence use-after-free fix, a DMA setup fix for rockchip, an error path fix and memory corruption fix for panfrost and one more orientation quirk Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <maxime@cerno.tech> Link: https://patchwork.freedesktop.org/patch/msgid/20220708054306.wr6jcfdunuypftbq@houat
This commit is contained in:
commit
3590b44b94
7 changed files with 39 additions and 24 deletions
|
@ -343,7 +343,7 @@ void dma_resv_replace_fences(struct dma_resv *obj, uint64_t context,
|
|||
if (old->context != context)
|
||||
continue;
|
||||
|
||||
dma_resv_list_set(list, i, replacement, usage);
|
||||
dma_resv_list_set(list, i, dma_fence_get(replacement), usage);
|
||||
dma_fence_put(old);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,22 +74,6 @@ static int fsl_ldb_attach(struct drm_bridge *bridge,
|
|||
bridge, flags);
|
||||
}
|
||||
|
||||
static int fsl_ldb_atomic_check(struct drm_bridge *bridge,
|
||||
struct drm_bridge_state *bridge_state,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_connector_state *conn_state)
|
||||
{
|
||||
/* Invert DE signal polarity. */
|
||||
bridge_state->input_bus_cfg.flags &= ~(DRM_BUS_FLAG_DE_LOW |
|
||||
DRM_BUS_FLAG_DE_HIGH);
|
||||
if (bridge_state->output_bus_cfg.flags & DRM_BUS_FLAG_DE_LOW)
|
||||
bridge_state->input_bus_cfg.flags |= DRM_BUS_FLAG_DE_HIGH;
|
||||
else if (bridge_state->output_bus_cfg.flags & DRM_BUS_FLAG_DE_HIGH)
|
||||
bridge_state->input_bus_cfg.flags |= DRM_BUS_FLAG_DE_LOW;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
|
||||
struct drm_bridge_state *old_bridge_state)
|
||||
{
|
||||
|
@ -153,7 +137,7 @@ static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
|
|||
reg = LDB_CTRL_CH0_ENABLE;
|
||||
|
||||
if (fsl_ldb->lvds_dual_link)
|
||||
reg |= LDB_CTRL_CH1_ENABLE;
|
||||
reg |= LDB_CTRL_CH1_ENABLE | LDB_CTRL_SPLIT_MODE;
|
||||
|
||||
if (lvds_format_24bpp) {
|
||||
reg |= LDB_CTRL_CH0_DATA_WIDTH;
|
||||
|
@ -233,7 +217,7 @@ fsl_ldb_mode_valid(struct drm_bridge *bridge,
|
|||
{
|
||||
struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
|
||||
|
||||
if (mode->clock > (fsl_ldb->lvds_dual_link ? 80000 : 160000))
|
||||
if (mode->clock > (fsl_ldb->lvds_dual_link ? 160000 : 80000))
|
||||
return MODE_CLOCK_HIGH;
|
||||
|
||||
return MODE_OK;
|
||||
|
@ -241,7 +225,6 @@ fsl_ldb_mode_valid(struct drm_bridge *bridge,
|
|||
|
||||
static const struct drm_bridge_funcs funcs = {
|
||||
.attach = fsl_ldb_attach,
|
||||
.atomic_check = fsl_ldb_atomic_check,
|
||||
.atomic_enable = fsl_ldb_atomic_enable,
|
||||
.atomic_disable = fsl_ldb_atomic_disable,
|
||||
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
|
||||
|
|
|
@ -286,6 +286,21 @@ static const struct dmi_system_id orientation_data[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo YB1-X9"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
||||
}, { /* Lenovo Yoga Tablet 2 830F / 830L */
|
||||
.matches = {
|
||||
/*
|
||||
* Note this also matches the Lenovo Yoga Tablet 2 1050F/L
|
||||
* since that uses the same mainboard. The resolution match
|
||||
* will limit this to only matching on the 830F/L. Neither has
|
||||
* any external video outputs so those are not a concern.
|
||||
*/
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),
|
||||
/* Partial match on beginning of BIOS version */
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
||||
}, { /* OneGX1 Pro */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SYSTEM_MANUFACTURER"),
|
||||
|
|
|
@ -433,8 +433,8 @@ static int panfrost_ioctl_madvise(struct drm_device *dev, void *data,
|
|||
|
||||
if (args->retained) {
|
||||
if (args->madv == PANFROST_MADV_DONTNEED)
|
||||
list_add_tail(&bo->base.madv_list,
|
||||
&pfdev->shrinker_list);
|
||||
list_move_tail(&bo->base.madv_list,
|
||||
&pfdev->shrinker_list);
|
||||
else if (args->madv == PANFROST_MADV_WILLNEED)
|
||||
list_del_init(&bo->base.madv_list);
|
||||
}
|
||||
|
|
|
@ -518,7 +518,7 @@ err_map:
|
|||
err_pages:
|
||||
drm_gem_shmem_put_pages(&bo->base);
|
||||
err_bo:
|
||||
drm_gem_object_put(&bo->base.base);
|
||||
panfrost_gem_mapping_put(bomapping);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,14 @@
|
|||
#include <drm/drm_probe_helper.h>
|
||||
#include <drm/drm_vblank.h>
|
||||
|
||||
#if defined(CONFIG_ARM_DMA_USE_IOMMU)
|
||||
#include <asm/dma-iommu.h>
|
||||
#else
|
||||
#define arm_iommu_detach_device(...) ({ })
|
||||
#define arm_iommu_release_mapping(...) ({ })
|
||||
#define to_dma_iommu_mapping(dev) NULL
|
||||
#endif
|
||||
|
||||
#include "rockchip_drm_drv.h"
|
||||
#include "rockchip_drm_fb.h"
|
||||
#include "rockchip_drm_gem.h"
|
||||
|
@ -49,6 +57,15 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
|
|||
if (!private->domain)
|
||||
return 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) {
|
||||
struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
|
||||
|
||||
if (mapping) {
|
||||
arm_iommu_detach_device(dev);
|
||||
arm_iommu_release_mapping(mapping);
|
||||
}
|
||||
}
|
||||
|
||||
ret = iommu_attach_device(private->domain, dev);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dev, "Failed to attach iommu device\n");
|
||||
|
|
|
@ -350,7 +350,7 @@ static int ssd130x_init(struct ssd130x_device *ssd130x)
|
|||
|
||||
/* Set precharge period in number of ticks from the internal clock */
|
||||
precharge = (SSD130X_SET_PRECHARGE_PERIOD1_SET(ssd130x->prechargep1) |
|
||||
SSD130X_SET_PRECHARGE_PERIOD1_SET(ssd130x->prechargep2));
|
||||
SSD130X_SET_PRECHARGE_PERIOD2_SET(ssd130x->prechargep2));
|
||||
ret = ssd130x_write_cmd(ssd130x, 2, SSD130X_SET_PRECHARGE_PERIOD, precharge);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
Loading…
Add table
Reference in a new issue