/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com>
*/
/* As there are different display controller blocks depending on the * snapdragon version, the kms support is split out and the appropriate * implementation is loaded at runtime. The kms module is responsible * for constructing the appropriate planes/crtcs/encoders/connectors.
*/ struct msm_kms_funcs { /* hw initialization: */ int (*hw_init)(struct msm_kms *kms); /* irq handling: */ void (*irq_preinstall)(struct msm_kms *kms); int (*irq_postinstall)(struct msm_kms *kms); void (*irq_uninstall)(struct msm_kms *kms);
irqreturn_t (*irq)(struct msm_kms *kms); int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
/* * Atomic commit handling: * * Note that in the case of async commits, the funcs which take * a crtc_mask (ie. ->flush_commit(), and ->complete_commit()) * might not be evenly balanced with ->prepare_commit(), however * each crtc that effected by a ->prepare_commit() (potentially * multiple times) will eventually (at end of vsync period) be * flushed and completed. * * This has some implications about tracking of cleanup state, * for example SMP blocks to release after commit completes. Ie. * cleanup state should be also duplicated in the various * duplicate_state() methods, as the current cleanup state at * ->complete_commit() time may have accumulated cleanup work * from multiple commits.
*/
/** * Enable/disable power/clks needed for hw access done in other * commit related methods. * * If mdp4 is migrated to runpm, we could probably drop these * and use runpm directly.
*/ void (*enable_commit)(struct msm_kms *kms); void (*disable_commit)(struct msm_kms *kms);
/** * @check_mode_changed: * * Verify if the commit requires a full modeset on one of CRTCs.
*/ int (*check_mode_changed)(struct msm_kms *kms, struct drm_atomic_state *state);
/** * Prepare for atomic commit. This is called after any previous * (async or otherwise) commit has completed.
*/ void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
/** * Flush an atomic commit. This is called after the hardware * updates have already been pushed down to effected planes/ * crtcs/encoders/connectors.
*/ void (*flush_commit)(struct msm_kms *kms, unsigned crtc_mask);
/** * Wait for any in-progress flush to complete on the specified * crtcs. This should not block if there is no in-progress * commit (ie. don't just wait for a vblank), as it will also * be called before ->prepare_commit() to ensure any potential * "async" commit has completed.
*/ void (*wait_flush)(struct msm_kms *kms, unsigned crtc_mask);
/** * Clean up after commit is completed. This is called after * ->wait_flush(), to give the backend a chance to do any * post-commit cleanup.
*/ void (*complete_commit)(struct msm_kms *kms, unsigned crtc_mask);
/* * For async commit, where ->flush_commit() and later happens * from the crtc's pending_timer close to end of the frame:
*/ struct mutex commit_lock[MAX_CRTCS]; unsigned pending_crtc_mask; struct msm_pending_timer pending_timers[MAX_CRTCS];
for (i = 0; i < ARRAY_SIZE(kms->commit_lock); i++)
mutex_init(&kms->commit_lock[i]);
kms->funcs = funcs;
kms->wq = alloc_ordered_workqueue("msm", 0); if (!kms->wq) return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++) {
ret = msm_atomic_init_pending_timer(&kms->pending_timers[i], kms, i); if (ret) { return ret;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.