mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:04:43 +01:00
drm-misc-fixes for v6.19-rc5:
pl111: - Fix error handling in probe mediatek/atomic/tidss: - Fix tidss in another way and revert reordering of pre-enable and post-disable operations, as it breaks other bridge drivers. nouveau: - Fix regression from fwsec s/r fix. pci/vga: - Fix multiple gpu's being reported a 'boot_display' fb-helper: - Fix vblank timeout during suspend/reset -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEuXvWqAysSYEJGuVH/lWMcqZwE8MFAmleKu8ACgkQ/lWMcqZw E8NIAw//SDUHAGuSU6trFYt1GueHcGk+KjEN8aRIaE+6v/IvCqfOaL7HeZXDm0TB C0piYBioGowhT8kAekYSRs6Gm/uCQjB65tflqU53V3SZf4tZfyDAqAxK2zbVkpI/ ZIqdsWoQwazk6Qqe92+67jjYEJF+h1ycVYD72qRf3V4SduSmZoeARfRkAlZ+ZAGO zzKmy2Jb8WMnVeemxtc5XTc5+0fjjDaFmpkHuOkdo7+7zX2rZw1JPU6HIy2xVWBv /NvOqDGf+ALu3aT6FHzJvcH4uRXsAxj/q505jq9YrxJZjMpMq0EsW+/8/pjuBEYG CdsyHlJnnx1br20dBb7MU68jwvlXuVc7qbaAwC0+eRgX9k8apetiV/7WwOxwyFe0 DwZSyJ2ml7poeD4mul7AKiWteZTRCnBnqMPFGMiWvw5LChZdmXRiNIfgfUoA2HCQ Lnsin0EliGX0YQV5XTtEhQY2SMH+FZEJwfym/IQA9mnYNqOGRhVpLfTdW2Z9Zs5c OjU5uxfbEiaMDJ66eT39/kTSL+TEWSFnRIaSeibsi2w9rF5WTCXf0Ojv7iSbfrCB Lajrhy+MvGlbxaloJeFDLczaS/BJSbQWefCb2xugjIYP8h2k/JTHlnHEwrU9zUfx YQ8hMsTi4PpJVmJX3WY4zQOStw8oP58zCx+PV3kyZwJjOoAjHn4= =PTH1 -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2026-01-07' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes drm-misc-fixes for v6.19-rc5: pl111: - Fix error handling in probe mediatek/atomic/tidss: - Fix tidss in another way and revert reordering of pre-enable and post-disable operations, as it breaks other bridge drivers. nouveau: - Fix regression from fwsec s/r fix. pci/vga: - Fix multiple gpu's being reported a 'boot_display' fb-helper: - Fix vblank timeout during suspend/reset Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patch.msgid.link/f50067e6-243a-4ed8-9781-1e4e4fdebc8e@linux.intel.com
This commit is contained in:
commit
a5f207e272
15 changed files with 274 additions and 232 deletions
|
|
@ -1162,8 +1162,18 @@ crtc_needs_disable(struct drm_crtc_state *old_state,
|
|||
new_state->self_refresh_active;
|
||||
}
|
||||
|
||||
static void
|
||||
encoder_bridge_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_encoder_bridge_disable - disable bridges and encoder
|
||||
* @dev: DRM device
|
||||
* @state: the driver state object
|
||||
*
|
||||
* Loops over all connectors in the current state and if the CRTC needs
|
||||
* it, disables the bridge chain all the way, then disables the encoder
|
||||
* afterwards.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_encoder_bridge_disable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *old_conn_state, *new_conn_state;
|
||||
|
|
@ -1229,9 +1239,18 @@ encoder_bridge_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
|||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_encoder_bridge_disable);
|
||||
|
||||
static void
|
||||
crtc_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_crtc_disable - disable CRTSs
|
||||
* @dev: DRM device
|
||||
* @state: the driver state object
|
||||
*
|
||||
* Loops over all CRTCs in the current state and if the CRTC needs
|
||||
* it, disables it.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_crtc_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *old_crtc_state, *new_crtc_state;
|
||||
|
|
@ -1282,9 +1301,18 @@ crtc_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
|||
drm_crtc_vblank_put(crtc);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_crtc_disable);
|
||||
|
||||
static void
|
||||
encoder_bridge_post_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_encoder_bridge_post_disable - post-disable encoder bridges
|
||||
* @dev: DRM device
|
||||
* @state: the driver state object
|
||||
*
|
||||
* Loops over all connectors in the current state and if the CRTC needs
|
||||
* it, post-disables all encoder bridges.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_encoder_bridge_post_disable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *old_conn_state, *new_conn_state;
|
||||
|
|
@ -1335,15 +1363,16 @@ encoder_bridge_post_disable(struct drm_device *dev, struct drm_atomic_state *sta
|
|||
drm_bridge_put(bridge);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_encoder_bridge_post_disable);
|
||||
|
||||
static void
|
||||
disable_outputs(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
encoder_bridge_disable(dev, state);
|
||||
drm_atomic_helper_commit_encoder_bridge_disable(dev, state);
|
||||
|
||||
crtc_disable(dev, state);
|
||||
drm_atomic_helper_commit_encoder_bridge_post_disable(dev, state);
|
||||
|
||||
encoder_bridge_post_disable(dev, state);
|
||||
drm_atomic_helper_commit_crtc_disable(dev, state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1446,8 +1475,17 @@ void drm_atomic_helper_calc_timestamping_constants(struct drm_atomic_state *stat
|
|||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_calc_timestamping_constants);
|
||||
|
||||
static void
|
||||
crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_crtc_set_mode - set the new mode
|
||||
* @dev: DRM device
|
||||
* @state: the driver state object
|
||||
*
|
||||
* Loops over all connectors in the current state and if the mode has
|
||||
* changed, change the mode of the CRTC, then call down the bridge
|
||||
* chain and change the mode in all bridges as well.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *new_crtc_state;
|
||||
|
|
@ -1508,6 +1546,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *state)
|
|||
drm_bridge_put(bridge);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_crtc_set_mode);
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
|
||||
|
|
@ -1531,12 +1570,21 @@ void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
|
|||
drm_atomic_helper_update_legacy_modeset_state(dev, state);
|
||||
drm_atomic_helper_calc_timestamping_constants(state);
|
||||
|
||||
crtc_set_mode(dev, state);
|
||||
drm_atomic_helper_commit_crtc_set_mode(dev, state);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
|
||||
|
||||
static void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
|
||||
struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_writebacks - issue writebacks
|
||||
* @dev: DRM device
|
||||
* @state: atomic state object being committed
|
||||
*
|
||||
* This loops over the connectors, checks if the new state requires
|
||||
* a writeback job to be issued and in that case issues an atomic
|
||||
* commit on each connector.
|
||||
*/
|
||||
void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *new_conn_state;
|
||||
|
|
@ -1555,9 +1603,18 @@ static void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
|
|||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_writebacks);
|
||||
|
||||
static void
|
||||
encoder_bridge_pre_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_encoder_bridge_pre_enable - pre-enable bridges
|
||||
* @dev: DRM device
|
||||
* @state: atomic state object being committed
|
||||
*
|
||||
* This loops over the connectors and if the CRTC needs it, pre-enables
|
||||
* the entire bridge chain.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_encoder_bridge_pre_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *new_conn_state;
|
||||
|
|
@ -1588,9 +1645,18 @@ encoder_bridge_pre_enable(struct drm_device *dev, struct drm_atomic_state *state
|
|||
drm_bridge_put(bridge);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_encoder_bridge_pre_enable);
|
||||
|
||||
static void
|
||||
crtc_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_crtc_enable - enables the CRTCs
|
||||
* @dev: DRM device
|
||||
* @state: atomic state object being committed
|
||||
*
|
||||
* This loops over CRTCs in the new state, and of the CRTC needs
|
||||
* it, enables it.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_crtc_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *old_crtc_state;
|
||||
|
|
@ -1619,9 +1685,18 @@ crtc_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
|||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_crtc_enable);
|
||||
|
||||
static void
|
||||
encoder_bridge_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
/**
|
||||
* drm_atomic_helper_commit_encoder_bridge_enable - enables the bridges
|
||||
* @dev: DRM device
|
||||
* @state: atomic state object being committed
|
||||
*
|
||||
* This loops over all connectors in the new state, and of the CRTC needs
|
||||
* it, enables the entire bridge chain.
|
||||
*/
|
||||
void
|
||||
drm_atomic_helper_commit_encoder_bridge_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *new_conn_state;
|
||||
|
|
@ -1664,6 +1739,7 @@ encoder_bridge_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
|||
drm_bridge_put(bridge);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_commit_encoder_bridge_enable);
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
|
||||
|
|
@ -1682,11 +1758,11 @@ encoder_bridge_enable(struct drm_device *dev, struct drm_atomic_state *state)
|
|||
void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
encoder_bridge_pre_enable(dev, state);
|
||||
drm_atomic_helper_commit_crtc_enable(dev, state);
|
||||
|
||||
crtc_enable(dev, state);
|
||||
drm_atomic_helper_commit_encoder_bridge_pre_enable(dev, state);
|
||||
|
||||
encoder_bridge_enable(dev, state);
|
||||
drm_atomic_helper_commit_encoder_bridge_enable(dev, state);
|
||||
|
||||
drm_atomic_helper_commit_writebacks(dev, state);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -366,6 +366,9 @@ static void drm_fb_helper_damage_work(struct work_struct *work)
|
|||
{
|
||||
struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper, damage_work);
|
||||
|
||||
if (helper->info->state != FBINFO_STATE_RUNNING)
|
||||
return;
|
||||
|
||||
drm_fb_helper_fb_dirty(helper);
|
||||
}
|
||||
|
||||
|
|
@ -732,6 +735,13 @@ void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper,
|
|||
if (fb_helper->info->state != FBINFO_STATE_RUNNING)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Cancel pending damage work. During GPU reset, VBlank
|
||||
* interrupts are disabled and drm_fb_helper_fb_dirty()
|
||||
* would wait for VBlank timeout otherwise.
|
||||
*/
|
||||
cancel_work_sync(&fb_helper->damage_work);
|
||||
|
||||
console_lock();
|
||||
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -1002,12 +1002,6 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
return PTR_ERR(dsi->next_bridge);
|
||||
}
|
||||
|
||||
/*
|
||||
* set flag to request the DSI host bridge be pre-enabled before device bridge
|
||||
* in the chain, so the DSI host is ready when the device bridge is pre-enabled
|
||||
*/
|
||||
dsi->next_bridge->pre_enable_prev_first = true;
|
||||
|
||||
drm_bridge_add(&dsi->bridge);
|
||||
|
||||
ret = component_add(host->dev, &mtk_dsi_component_ops);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,9 @@ ad102_gsp = {
|
|||
|
||||
.booter.ctor = ga102_gsp_booter_ctor,
|
||||
|
||||
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
|
||||
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
|
||||
|
||||
.dtor = r535_gsp_dtor,
|
||||
.oneinit = tu102_gsp_oneinit,
|
||||
.init = tu102_gsp_init,
|
||||
|
|
|
|||
|
|
@ -337,18 +337,12 @@ nvkm_gsp_fwsec_sb(struct nvkm_gsp *gsp)
|
|||
}
|
||||
|
||||
int
|
||||
nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp)
|
||||
nvkm_gsp_fwsec_sb_init(struct nvkm_gsp *gsp)
|
||||
{
|
||||
return nvkm_gsp_fwsec_init(gsp, &gsp->fws.falcon.sb, "fwsec-sb",
|
||||
NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB);
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp)
|
||||
{
|
||||
nvkm_falcon_fw_dtor(&gsp->fws.falcon.sb);
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_gsp_fwsec_frts(struct nvkm_gsp *gsp)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -47,6 +47,9 @@ ga100_gsp = {
|
|||
|
||||
.booter.ctor = tu102_gsp_booter_ctor,
|
||||
|
||||
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
|
||||
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
|
||||
|
||||
.dtor = r535_gsp_dtor,
|
||||
.oneinit = tu102_gsp_oneinit,
|
||||
.init = tu102_gsp_init,
|
||||
|
|
|
|||
|
|
@ -158,6 +158,9 @@ ga102_gsp_r535 = {
|
|||
|
||||
.booter.ctor = ga102_gsp_booter_ctor,
|
||||
|
||||
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
|
||||
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
|
||||
|
||||
.dtor = r535_gsp_dtor,
|
||||
.oneinit = tu102_gsp_oneinit,
|
||||
.init = tu102_gsp_init,
|
||||
|
|
|
|||
|
|
@ -7,9 +7,8 @@ enum nvkm_acr_lsf_id;
|
|||
|
||||
int nvkm_gsp_fwsec_frts(struct nvkm_gsp *);
|
||||
|
||||
int nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *);
|
||||
int nvkm_gsp_fwsec_sb(struct nvkm_gsp *);
|
||||
void nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *);
|
||||
int nvkm_gsp_fwsec_sb_init(struct nvkm_gsp *gsp);
|
||||
|
||||
struct nvkm_gsp_fwif {
|
||||
int version;
|
||||
|
|
@ -52,6 +51,11 @@ struct nvkm_gsp_func {
|
|||
struct nvkm_falcon *, struct nvkm_falcon_fw *);
|
||||
} booter;
|
||||
|
||||
struct {
|
||||
int (*ctor)(struct nvkm_gsp *);
|
||||
void (*dtor)(struct nvkm_gsp *);
|
||||
} fwsec_sb;
|
||||
|
||||
void (*dtor)(struct nvkm_gsp *);
|
||||
int (*oneinit)(struct nvkm_gsp *);
|
||||
int (*init)(struct nvkm_gsp *);
|
||||
|
|
@ -67,6 +71,8 @@ extern const struct nvkm_falcon_func tu102_gsp_flcn;
|
|||
extern const struct nvkm_falcon_fw_func tu102_gsp_fwsec;
|
||||
int tu102_gsp_booter_ctor(struct nvkm_gsp *, const char *, const struct firmware *,
|
||||
struct nvkm_falcon *, struct nvkm_falcon_fw *);
|
||||
int tu102_gsp_fwsec_sb_ctor(struct nvkm_gsp *);
|
||||
void tu102_gsp_fwsec_sb_dtor(struct nvkm_gsp *);
|
||||
int tu102_gsp_oneinit(struct nvkm_gsp *);
|
||||
int tu102_gsp_init(struct nvkm_gsp *);
|
||||
int tu102_gsp_fini(struct nvkm_gsp *, bool suspend);
|
||||
|
|
@ -91,5 +97,18 @@ int r535_gsp_fini(struct nvkm_gsp *, bool suspend);
|
|||
int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
|
||||
struct nvkm_gsp **);
|
||||
|
||||
static inline int nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp)
|
||||
{
|
||||
if (gsp->func->fwsec_sb.ctor)
|
||||
return gsp->func->fwsec_sb.ctor(gsp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp)
|
||||
{
|
||||
if (gsp->func->fwsec_sb.dtor)
|
||||
gsp->func->fwsec_sb.dtor(gsp);
|
||||
}
|
||||
|
||||
extern const struct nvkm_gsp_func gv100_gsp;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -30,6 +30,18 @@
|
|||
#include <nvfw/fw.h>
|
||||
#include <nvfw/hs.h>
|
||||
|
||||
int
|
||||
tu102_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp)
|
||||
{
|
||||
return nvkm_gsp_fwsec_sb_init(gsp);
|
||||
}
|
||||
|
||||
void
|
||||
tu102_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp)
|
||||
{
|
||||
nvkm_falcon_fw_dtor(&gsp->fws.falcon.sb);
|
||||
}
|
||||
|
||||
static int
|
||||
tu102_gsp_booter_unload(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1)
|
||||
{
|
||||
|
|
@ -370,6 +382,9 @@ tu102_gsp = {
|
|||
|
||||
.booter.ctor = tu102_gsp_booter_ctor,
|
||||
|
||||
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
|
||||
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
|
||||
|
||||
.dtor = r535_gsp_dtor,
|
||||
.oneinit = tu102_gsp_oneinit,
|
||||
.init = tu102_gsp_init,
|
||||
|
|
|
|||
|
|
@ -30,6 +30,9 @@ tu116_gsp = {
|
|||
|
||||
.booter.ctor = tu102_gsp_booter_ctor,
|
||||
|
||||
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
|
||||
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
|
||||
|
||||
.dtor = r535_gsp_dtor,
|
||||
.oneinit = tu102_gsp_oneinit,
|
||||
.init = tu102_gsp_init,
|
||||
|
|
|
|||
|
|
@ -295,7 +295,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
|
|||
variant->name, priv);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "%s failed irq %d\n", __func__, ret);
|
||||
return ret;
|
||||
goto dev_put;
|
||||
}
|
||||
|
||||
ret = pl111_modeset_init(drm);
|
||||
|
|
|
|||
|
|
@ -26,9 +26,33 @@ static void tidss_atomic_commit_tail(struct drm_atomic_state *old_state)
|
|||
|
||||
tidss_runtime_get(tidss);
|
||||
|
||||
drm_atomic_helper_commit_modeset_disables(ddev, old_state);
|
||||
drm_atomic_helper_commit_planes(ddev, old_state, DRM_PLANE_COMMIT_ACTIVE_ONLY);
|
||||
drm_atomic_helper_commit_modeset_enables(ddev, old_state);
|
||||
/*
|
||||
* TI's OLDI and DSI encoders need to be set up before the crtc is
|
||||
* enabled. Thus drm_atomic_helper_commit_modeset_enables() and
|
||||
* drm_atomic_helper_commit_modeset_disables() cannot be used here, as
|
||||
* they enable the crtc before bridges' pre-enable, and disable the crtc
|
||||
* after bridges' post-disable.
|
||||
*
|
||||
* Open code the functions here and first call the bridges' pre-enables,
|
||||
* then crtc enable, then bridges' post-enable (and vice versa for
|
||||
* disable).
|
||||
*/
|
||||
|
||||
drm_atomic_helper_commit_encoder_bridge_disable(ddev, old_state);
|
||||
drm_atomic_helper_commit_crtc_disable(ddev, old_state);
|
||||
drm_atomic_helper_commit_encoder_bridge_post_disable(ddev, old_state);
|
||||
|
||||
drm_atomic_helper_update_legacy_modeset_state(ddev, old_state);
|
||||
drm_atomic_helper_calc_timestamping_constants(old_state);
|
||||
drm_atomic_helper_commit_crtc_set_mode(ddev, old_state);
|
||||
|
||||
drm_atomic_helper_commit_planes(ddev, old_state,
|
||||
DRM_PLANE_COMMIT_ACTIVE_ONLY);
|
||||
|
||||
drm_atomic_helper_commit_encoder_bridge_pre_enable(ddev, old_state);
|
||||
drm_atomic_helper_commit_crtc_enable(ddev, old_state);
|
||||
drm_atomic_helper_commit_encoder_bridge_enable(ddev, old_state);
|
||||
drm_atomic_helper_commit_writebacks(ddev, old_state);
|
||||
|
||||
drm_atomic_helper_commit_hw_done(old_state);
|
||||
drm_atomic_helper_wait_for_flip_done(ddev, old_state);
|
||||
|
|
|
|||
|
|
@ -652,13 +652,6 @@ static bool vga_is_boot_device(struct vga_device *vgadev)
|
|||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Vgadev has neither IO nor MEM enabled. If we haven't found any
|
||||
* other VGA devices, it is the best candidate so far.
|
||||
*/
|
||||
if (!boot_vga)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,12 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
|
|||
int drm_atomic_helper_check_planes(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
int drm_atomic_helper_check_crtc_primary_plane(struct drm_crtc_state *crtc_state);
|
||||
void drm_atomic_helper_commit_encoder_bridge_disable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
void drm_atomic_helper_commit_crtc_disable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
void drm_atomic_helper_commit_encoder_bridge_post_disable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
int drm_atomic_helper_check(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
void drm_atomic_helper_commit_tail(struct drm_atomic_state *state);
|
||||
|
|
@ -89,8 +95,24 @@ drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
|
|||
void
|
||||
drm_atomic_helper_calc_timestamping_constants(struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_crtc_set_mode(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_encoder_bridge_pre_enable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_crtc_enable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_encoder_bridge_enable(struct drm_device *dev,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state);
|
||||
|
||||
|
|
|
|||
|
|
@ -176,33 +176,17 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @disable:
|
||||
*
|
||||
* The @disable callback should disable the bridge.
|
||||
* This callback should disable the bridge. It is called right before
|
||||
* the preceding element in the display pipe is disabled. If the
|
||||
* preceding element is a bridge this means it's called before that
|
||||
* bridge's @disable vfunc. If the preceding element is a &drm_encoder
|
||||
* it's called right before the &drm_encoder_helper_funcs.disable,
|
||||
* &drm_encoder_helper_funcs.prepare or &drm_encoder_helper_funcs.dpms
|
||||
* hook.
|
||||
*
|
||||
* The bridge can assume that the display pipe (i.e. clocks and timing
|
||||
* signals) feeding it is still running when this callback is called.
|
||||
*
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called before
|
||||
* that bridge is disabled via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.disable
|
||||
* - &drm_bridge_funcs.atomic_disable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called before the encoder is disabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_disable
|
||||
* - &drm_encoder_helper_funcs.prepare
|
||||
* - &drm_encoder_helper_funcs.disable
|
||||
* - &drm_encoder_helper_funcs.dpms
|
||||
*
|
||||
* and the CRTC is disabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.prepare
|
||||
* - &drm_crtc_helper_funcs.atomic_disable
|
||||
* - &drm_crtc_helper_funcs.disable
|
||||
* - &drm_crtc_helper_funcs.dpms.
|
||||
*
|
||||
* The @disable callback is optional.
|
||||
*
|
||||
* NOTE:
|
||||
|
|
@ -215,34 +199,17 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @post_disable:
|
||||
*
|
||||
* This callback should disable the bridge. It is called right after the
|
||||
* preceding element in the display pipe is disabled. If the preceding
|
||||
* element is a bridge this means it's called after that bridge's
|
||||
* @post_disable function. If the preceding element is a &drm_encoder
|
||||
* it's called right after the encoder's
|
||||
* &drm_encoder_helper_funcs.disable, &drm_encoder_helper_funcs.prepare
|
||||
* or &drm_encoder_helper_funcs.dpms hook.
|
||||
*
|
||||
* The bridge must assume that the display pipe (i.e. clocks and timing
|
||||
* signals) feeding this bridge is no longer running when the
|
||||
* @post_disable is called.
|
||||
*
|
||||
* This callback should perform all the actions required by the hardware
|
||||
* after it has stopped receiving signals from the preceding element.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called after
|
||||
* that bridge is post-disabled (unless marked otherwise by the
|
||||
* @pre_enable_prev_first flag) via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.post_disable
|
||||
* - &drm_bridge_funcs.atomic_post_disable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called after the encoder is disabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_disable
|
||||
* - &drm_encoder_helper_funcs.prepare
|
||||
* - &drm_encoder_helper_funcs.disable
|
||||
* - &drm_encoder_helper_funcs.dpms
|
||||
*
|
||||
* and the CRTC is disabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.prepare
|
||||
* - &drm_crtc_helper_funcs.atomic_disable
|
||||
* - &drm_crtc_helper_funcs.disable
|
||||
* - &drm_crtc_helper_funcs.dpms
|
||||
* signals) feeding it is no longer running when this callback is
|
||||
* called.
|
||||
*
|
||||
* The @post_disable callback is optional.
|
||||
*
|
||||
|
|
@ -285,30 +252,18 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @pre_enable:
|
||||
*
|
||||
* This callback should enable the bridge. It is called right before
|
||||
* the preceding element in the display pipe is enabled. If the
|
||||
* preceding element is a bridge this means it's called before that
|
||||
* bridge's @pre_enable function. If the preceding element is a
|
||||
* &drm_encoder it's called right before the encoder's
|
||||
* &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
|
||||
* &drm_encoder_helper_funcs.dpms hook.
|
||||
*
|
||||
* The display pipe (i.e. clocks and timing signals) feeding this bridge
|
||||
* will not yet be running when the @pre_enable is called.
|
||||
*
|
||||
* This callback should perform all the necessary actions to prepare the
|
||||
* bridge to accept signals from the preceding element.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called before
|
||||
* that bridge is pre-enabled (unless marked otherwise by
|
||||
* @pre_enable_prev_first flag) via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.pre_enable
|
||||
* - &drm_bridge_funcs.atomic_pre_enable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called before the CRTC is enabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.atomic_enable
|
||||
* - &drm_crtc_helper_funcs.commit
|
||||
*
|
||||
* and the encoder is enabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_enable
|
||||
* - &drm_encoder_helper_funcs.enable
|
||||
* - &drm_encoder_helper_funcs.commit
|
||||
* will not yet be running when this callback is called. The bridge must
|
||||
* not enable the display link feeding the next bridge in the chain (if
|
||||
* there is one) when this callback is called.
|
||||
*
|
||||
* The @pre_enable callback is optional.
|
||||
*
|
||||
|
|
@ -322,31 +277,19 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @enable:
|
||||
*
|
||||
* The @enable callback should enable the bridge.
|
||||
* This callback should enable the bridge. It is called right after
|
||||
* the preceding element in the display pipe is enabled. If the
|
||||
* preceding element is a bridge this means it's called after that
|
||||
* bridge's @enable function. If the preceding element is a
|
||||
* &drm_encoder it's called right after the encoder's
|
||||
* &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
|
||||
* &drm_encoder_helper_funcs.dpms hook.
|
||||
*
|
||||
* The bridge can assume that the display pipe (i.e. clocks and timing
|
||||
* signals) feeding it is running when this callback is called. This
|
||||
* callback must enable the display link feeding the next bridge in the
|
||||
* chain if there is one.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called after
|
||||
* that bridge is enabled via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.enable
|
||||
* - &drm_bridge_funcs.atomic_enable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called after the CRTC is enabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.atomic_enable
|
||||
* - &drm_crtc_helper_funcs.commit
|
||||
*
|
||||
* and the encoder is enabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_enable
|
||||
* - &drm_encoder_helper_funcs.enable
|
||||
* - drm_encoder_helper_funcs.commit
|
||||
*
|
||||
* The @enable callback is optional.
|
||||
*
|
||||
* NOTE:
|
||||
|
|
@ -359,30 +302,17 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @atomic_pre_enable:
|
||||
*
|
||||
* This callback should enable the bridge. It is called right before
|
||||
* the preceding element in the display pipe is enabled. If the
|
||||
* preceding element is a bridge this means it's called before that
|
||||
* bridge's @atomic_pre_enable or @pre_enable function. If the preceding
|
||||
* element is a &drm_encoder it's called right before the encoder's
|
||||
* &drm_encoder_helper_funcs.atomic_enable hook.
|
||||
*
|
||||
* The display pipe (i.e. clocks and timing signals) feeding this bridge
|
||||
* will not yet be running when the @atomic_pre_enable is called.
|
||||
*
|
||||
* This callback should perform all the necessary actions to prepare the
|
||||
* bridge to accept signals from the preceding element.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called before
|
||||
* that bridge is pre-enabled (unless marked otherwise by
|
||||
* @pre_enable_prev_first flag) via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.pre_enable
|
||||
* - &drm_bridge_funcs.atomic_pre_enable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called before the CRTC is enabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.atomic_enable
|
||||
* - &drm_crtc_helper_funcs.commit
|
||||
*
|
||||
* and the encoder is enabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_enable
|
||||
* - &drm_encoder_helper_funcs.enable
|
||||
* - &drm_encoder_helper_funcs.commit
|
||||
* will not yet be running when this callback is called. The bridge must
|
||||
* not enable the display link feeding the next bridge in the chain (if
|
||||
* there is one) when this callback is called.
|
||||
*
|
||||
* The @atomic_pre_enable callback is optional.
|
||||
*/
|
||||
|
|
@ -392,31 +322,18 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @atomic_enable:
|
||||
*
|
||||
* The @atomic_enable callback should enable the bridge.
|
||||
* This callback should enable the bridge. It is called right after
|
||||
* the preceding element in the display pipe is enabled. If the
|
||||
* preceding element is a bridge this means it's called after that
|
||||
* bridge's @atomic_enable or @enable function. If the preceding element
|
||||
* is a &drm_encoder it's called right after the encoder's
|
||||
* &drm_encoder_helper_funcs.atomic_enable hook.
|
||||
*
|
||||
* The bridge can assume that the display pipe (i.e. clocks and timing
|
||||
* signals) feeding it is running when this callback is called. This
|
||||
* callback must enable the display link feeding the next bridge in the
|
||||
* chain if there is one.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called after
|
||||
* that bridge is enabled via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.enable
|
||||
* - &drm_bridge_funcs.atomic_enable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called after the CRTC is enabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.atomic_enable
|
||||
* - &drm_crtc_helper_funcs.commit
|
||||
*
|
||||
* and the encoder is enabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_enable
|
||||
* - &drm_encoder_helper_funcs.enable
|
||||
* - drm_encoder_helper_funcs.commit
|
||||
*
|
||||
* The @atomic_enable callback is optional.
|
||||
*/
|
||||
void (*atomic_enable)(struct drm_bridge *bridge,
|
||||
|
|
@ -424,32 +341,16 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @atomic_disable:
|
||||
*
|
||||
* The @atomic_disable callback should disable the bridge.
|
||||
* This callback should disable the bridge. It is called right before
|
||||
* the preceding element in the display pipe is disabled. If the
|
||||
* preceding element is a bridge this means it's called before that
|
||||
* bridge's @atomic_disable or @disable vfunc. If the preceding element
|
||||
* is a &drm_encoder it's called right before the
|
||||
* &drm_encoder_helper_funcs.atomic_disable hook.
|
||||
*
|
||||
* The bridge can assume that the display pipe (i.e. clocks and timing
|
||||
* signals) feeding it is still running when this callback is called.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called before
|
||||
* that bridge is disabled via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.disable
|
||||
* - &drm_bridge_funcs.atomic_disable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called before the encoder is disabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_disable
|
||||
* - &drm_encoder_helper_funcs.prepare
|
||||
* - &drm_encoder_helper_funcs.disable
|
||||
* - &drm_encoder_helper_funcs.dpms
|
||||
*
|
||||
* and the CRTC is disabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.prepare
|
||||
* - &drm_crtc_helper_funcs.atomic_disable
|
||||
* - &drm_crtc_helper_funcs.disable
|
||||
* - &drm_crtc_helper_funcs.dpms.
|
||||
*
|
||||
* The @atomic_disable callback is optional.
|
||||
*/
|
||||
void (*atomic_disable)(struct drm_bridge *bridge,
|
||||
|
|
@ -458,34 +359,16 @@ struct drm_bridge_funcs {
|
|||
/**
|
||||
* @atomic_post_disable:
|
||||
*
|
||||
* This callback should disable the bridge. It is called right after the
|
||||
* preceding element in the display pipe is disabled. If the preceding
|
||||
* element is a bridge this means it's called after that bridge's
|
||||
* @atomic_post_disable or @post_disable function. If the preceding
|
||||
* element is a &drm_encoder it's called right after the encoder's
|
||||
* &drm_encoder_helper_funcs.atomic_disable hook.
|
||||
*
|
||||
* The bridge must assume that the display pipe (i.e. clocks and timing
|
||||
* signals) feeding this bridge is no longer running when the
|
||||
* @atomic_post_disable is called.
|
||||
*
|
||||
* This callback should perform all the actions required by the hardware
|
||||
* after it has stopped receiving signals from the preceding element.
|
||||
*
|
||||
* If the preceding element is a &drm_bridge, then this is called after
|
||||
* that bridge is post-disabled (unless marked otherwise by the
|
||||
* @pre_enable_prev_first flag) via one of:
|
||||
*
|
||||
* - &drm_bridge_funcs.post_disable
|
||||
* - &drm_bridge_funcs.atomic_post_disable
|
||||
*
|
||||
* If the preceding element of the bridge is a display controller, then
|
||||
* this callback is called after the encoder is disabled via one of:
|
||||
*
|
||||
* - &drm_encoder_helper_funcs.atomic_disable
|
||||
* - &drm_encoder_helper_funcs.prepare
|
||||
* - &drm_encoder_helper_funcs.disable
|
||||
* - &drm_encoder_helper_funcs.dpms
|
||||
*
|
||||
* and the CRTC is disabled via one of:
|
||||
*
|
||||
* - &drm_crtc_helper_funcs.prepare
|
||||
* - &drm_crtc_helper_funcs.atomic_disable
|
||||
* - &drm_crtc_helper_funcs.disable
|
||||
* - &drm_crtc_helper_funcs.dpms
|
||||
* signals) feeding it is no longer running when this callback is
|
||||
* called.
|
||||
*
|
||||
* The @atomic_post_disable callback is optional.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue