Short summary of fixes pull (less than what git shortlog provides):
* In mcde, set up fbdev after device registration and removde the last access to dev->dev_private. Fixes an error message and a segmentation fault. * Set the connector type for LogicPT Type 28 and newhaven_nhd_43_480272ef_atxl panels. * In uvesafb, fix the handling of the noblank option. * Fix panel orientation for Asus T101HA and Acer S1003. * Fix DMA configuration for sun4i if IOMMU is present. * Fix regression in VT restoration. Unbreaks userspace (i.e., Xorg) VT handling. -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEchf7rIzpz2NEoWjlaA3BHVMLeiMFAl70X3MACgkQaA3BHVML eiPP+ggAnquBWHn4QYVrw4tlcI8supVJurQflcYYYBzPksiijheJAE+74nfCWwTB aijbyiPSp6tq8aP2NQpasW3pQdo0gQ2I9CwYzCxPTDk3X0iSxGEIToDieBTonmKn UrvUZCQ5L775XJASus2gH4/b34Y0zIrQfCLj1ECOOSNjUWvTLntWrbJDl8S9SISh teIAFZ1qAlcrTTNuAZ1lp+e+AlXEXKhi8+CqY0ltiV1q4JtO1SdOMnb5y0rxsYOy H/KVWbZWdWkgIrZpJ1v/+jio0Mkh0jDi1ldJ6UDxWAv5viQnExICUY1d88Qw2xVo 73w4iJ/ujNIK3kDZQmvLMlVTjc1oSw== =GRqS -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2020-06-25' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes Short summary of fixes pull (less than what git shortlog provides): * In mcde, set up fbdev after device registration and removde the last access to dev->dev_private. Fixes an error message and a segmentation fault. * Set the connector type for LogicPT Type 28 and newhaven_nhd_43_480272ef_atxl panels. * In uvesafb, fix the handling of the noblank option. * Fix panel orientation for Asus T101HA and Acer S1003. * Fix DMA configuration for sun4i if IOMMU is present. * Fix regression in VT restoration. Unbreaks userspace (i.e., Xorg) VT handling. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20200625082717.GA14856@linux-uq9g
This commit is contained in:
Коммит
687a0ed337
|
@ -227,6 +227,42 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_debug_leave);
|
||||
|
||||
static int
|
||||
__drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
|
||||
bool force)
|
||||
{
|
||||
bool do_delayed;
|
||||
int ret;
|
||||
|
||||
if (!drm_fbdev_emulation || !fb_helper)
|
||||
return -ENODEV;
|
||||
|
||||
if (READ_ONCE(fb_helper->deferred_setup))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&fb_helper->lock);
|
||||
if (force) {
|
||||
/*
|
||||
* Yes this is the _locked version which expects the master lock
|
||||
* to be held. But for forced restores we're intentionally
|
||||
* racing here, see drm_fb_helper_set_par().
|
||||
*/
|
||||
ret = drm_client_modeset_commit_locked(&fb_helper->client);
|
||||
} else {
|
||||
ret = drm_client_modeset_commit(&fb_helper->client);
|
||||
}
|
||||
|
||||
do_delayed = fb_helper->delayed_hotplug;
|
||||
if (do_delayed)
|
||||
fb_helper->delayed_hotplug = false;
|
||||
mutex_unlock(&fb_helper->lock);
|
||||
|
||||
if (do_delayed)
|
||||
drm_fb_helper_hotplug_event(fb_helper);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
|
||||
* @fb_helper: driver-allocated fbdev helper, can be NULL
|
||||
|
@ -240,27 +276,7 @@ EXPORT_SYMBOL(drm_fb_helper_debug_leave);
|
|||
*/
|
||||
int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
bool do_delayed;
|
||||
int ret;
|
||||
|
||||
if (!drm_fbdev_emulation || !fb_helper)
|
||||
return -ENODEV;
|
||||
|
||||
if (READ_ONCE(fb_helper->deferred_setup))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&fb_helper->lock);
|
||||
ret = drm_client_modeset_commit(&fb_helper->client);
|
||||
|
||||
do_delayed = fb_helper->delayed_hotplug;
|
||||
if (do_delayed)
|
||||
fb_helper->delayed_hotplug = false;
|
||||
mutex_unlock(&fb_helper->lock);
|
||||
|
||||
if (do_delayed)
|
||||
drm_fb_helper_hotplug_event(fb_helper);
|
||||
|
||||
return ret;
|
||||
return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, false);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);
|
||||
|
||||
|
@ -1318,6 +1334,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
|||
{
|
||||
struct drm_fb_helper *fb_helper = info->par;
|
||||
struct fb_var_screeninfo *var = &info->var;
|
||||
bool force;
|
||||
|
||||
if (oops_in_progress)
|
||||
return -EBUSY;
|
||||
|
@ -1327,7 +1344,25 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper);
|
||||
/*
|
||||
* Normally we want to make sure that a kms master takes precedence over
|
||||
* fbdev, to avoid fbdev flickering and occasionally stealing the
|
||||
* display status. But Xorg first sets the vt back to text mode using
|
||||
* the KDSET IOCTL with KD_TEXT, and only after that drops the master
|
||||
* status when exiting.
|
||||
*
|
||||
* In the past this was caught by drm_fb_helper_lastclose(), but on
|
||||
* modern systems where logind always keeps a drm fd open to orchestrate
|
||||
* the vt switching, this doesn't work.
|
||||
*
|
||||
* To not break the userspace ABI we have this special case here, which
|
||||
* is only used for the above case. Everything else uses the normal
|
||||
* commit function, which ensures that we never steal the display from
|
||||
* an active drm master.
|
||||
*/
|
||||
force = var->activate & FB_ACTIVATE_KD_TEXT;
|
||||
|
||||
__drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -30,12 +30,6 @@ struct drm_dmi_panel_orientation_data {
|
|||
int orientation;
|
||||
};
|
||||
|
||||
static const struct drm_dmi_panel_orientation_data acer_s1003 = {
|
||||
.width = 800,
|
||||
.height = 1280,
|
||||
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
||||
};
|
||||
|
||||
static const struct drm_dmi_panel_orientation_data asus_t100ha = {
|
||||
.width = 800,
|
||||
.height = 1280,
|
||||
|
@ -114,13 +108,19 @@ static const struct dmi_system_id orientation_data[] = {
|
|||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"),
|
||||
},
|
||||
.driver_data = (void *)&acer_s1003,
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* Asus T100HA */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"),
|
||||
},
|
||||
.driver_data = (void *)&asus_t100ha,
|
||||
}, { /* Asus T101HA */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T101HA"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* GPD MicroPC (generic strings, also match on bios date) */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
|
||||
|
|
|
@ -812,7 +812,7 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
|
|||
struct drm_crtc *crtc = &pipe->crtc;
|
||||
struct drm_plane *plane = &pipe->plane;
|
||||
struct drm_device *drm = crtc->dev;
|
||||
struct mcde *mcde = drm->dev_private;
|
||||
struct mcde *mcde = to_mcde(drm);
|
||||
const struct drm_display_mode *mode = &cstate->mode;
|
||||
struct drm_framebuffer *fb = plane->state->fb;
|
||||
u32 format = fb->format->format;
|
||||
|
|
|
@ -209,7 +209,6 @@ static int mcde_modeset_init(struct drm_device *drm)
|
|||
|
||||
drm_mode_config_reset(drm);
|
||||
drm_kms_helper_poll_init(drm);
|
||||
drm_fbdev_generic_setup(drm, 32);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -264,6 +263,8 @@ static int mcde_drm_bind(struct device *dev)
|
|||
if (ret < 0)
|
||||
goto unbind;
|
||||
|
||||
drm_fbdev_generic_setup(drm, 32);
|
||||
|
||||
return 0;
|
||||
|
||||
unbind:
|
||||
|
|
|
@ -2495,6 +2495,7 @@ static const struct panel_desc logicpd_type_28 = {
|
|||
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
|
||||
.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
|
||||
DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE,
|
||||
.connector_type = DRM_MODE_CONNECTOR_DPI,
|
||||
};
|
||||
|
||||
static const struct panel_desc mitsubishi_aa070mc01 = {
|
||||
|
@ -2663,6 +2664,7 @@ static const struct panel_desc newhaven_nhd_43_480272ef_atxl = {
|
|||
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
|
||||
.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
|
||||
DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
|
||||
.connector_type = DRM_MODE_CONNECTOR_DPI,
|
||||
};
|
||||
|
||||
static const struct display_timing nlt_nl192108ac18_02d_timing = {
|
||||
|
|
|
@ -363,6 +363,19 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master,
|
|||
mixer->engine.ops = &sun8i_engine_ops;
|
||||
mixer->engine.node = dev->of_node;
|
||||
|
||||
if (of_find_property(dev->of_node, "iommus", NULL)) {
|
||||
/*
|
||||
* This assume we have the same DMA constraints for
|
||||
* all our the mixers in our pipeline. This sounds
|
||||
* bad, but it has always been the case for us, and
|
||||
* DRM doesn't do per-device allocation either, so we
|
||||
* would need to fix DRM first...
|
||||
*/
|
||||
ret = of_dma_configure(drm->dev, dev->of_node, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* While this function can fail, we shouldn't do anything
|
||||
* if this happens. Some early DE2 DT entries don't provide
|
||||
|
|
|
@ -883,8 +883,10 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,
|
|||
if (!fence)
|
||||
return 0;
|
||||
|
||||
if (no_wait_gpu)
|
||||
if (no_wait_gpu) {
|
||||
dma_fence_put(fence);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
dma_resv_add_shared_fence(bo->base.resv, fence);
|
||||
|
||||
|
|
|
@ -300,8 +300,10 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,
|
|||
break;
|
||||
case -EBUSY:
|
||||
case -ERESTARTSYS:
|
||||
dma_fence_put(moving);
|
||||
return VM_FAULT_NOPAGE;
|
||||
default:
|
||||
dma_fence_put(moving);
|
||||
return VM_FAULT_SIGBUS;
|
||||
}
|
||||
|
||||
|
|
|
@ -2402,7 +2402,8 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
|
|||
ops->graphics = 1;
|
||||
|
||||
if (!blank) {
|
||||
var.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
|
||||
var.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE |
|
||||
FB_ACTIVATE_KD_TEXT;
|
||||
fb_set_var(info, &var);
|
||||
ops->graphics = 0;
|
||||
ops->var = info->var;
|
||||
|
|
|
@ -1836,7 +1836,7 @@ static int uvesafb_setup(char *options)
|
|||
else if (!strcmp(this_opt, "noedid"))
|
||||
noedid = true;
|
||||
else if (!strcmp(this_opt, "noblank"))
|
||||
blank = true;
|
||||
blank = false;
|
||||
else if (!strncmp(this_opt, "vtotal:", 7))
|
||||
vram_total = simple_strtoul(this_opt + 7, NULL, 0);
|
||||
else if (!strncmp(this_opt, "vremap:", 7))
|
||||
|
|
|
@ -205,6 +205,7 @@ struct fb_bitfield {
|
|||
#define FB_ACTIVATE_ALL 64 /* change all VCs on this fb */
|
||||
#define FB_ACTIVATE_FORCE 128 /* force apply even when no change*/
|
||||
#define FB_ACTIVATE_INV_MODE 256 /* invalidate videomode */
|
||||
#define FB_ACTIVATE_KD_TEXT 512 /* for KDSET vt ioctl */
|
||||
|
||||
#define FB_ACCELF_TEXT 1 /* (OBSOLETE) see fb_info.flags and vc_mode */
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче