Commit 82cb88af authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: hdmi: Use a mutex to prevent concurrent framework access

The vc4 HDMI controller registers into the KMS, CEC and ALSA
frameworks.

However, no particular care is done to prevent the concurrent execution
of different framework hooks from happening at the same time.

In order to protect against that scenario, let's introduce a mutex that
relevant ALSA and KMS hooks will need to take to prevent concurrent
execution.

CEC is left out at the moment though, since the .get_modes and .detect
KMS hooks, when running cec_s_phys_addr_from_edid, can end up calling
CEC's .adap_enable hook. This introduces some reentrancy that isn't easy
to deal with properly.

The CEC hooks also don't share much state with the rest of the driver:
the registers are entirely separate, we don't share any variable, the
only thing that can conflict is the CEC clock divider setup that can be
affected by a mode set.

However, after discussing it, it looks like CEC should be able to
recover from this if it was to happen.

Link: https://lore.kernel.org/r/20211025141113.702757-6-maxime@cerno.tech
Fixes: bb7d7856 ("drm/vc4: Add HDMI audio support")
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
parent 81fb55e5
This diff is collapsed.
......@@ -183,6 +183,20 @@ struct vc4_hdmi {
* @hw_lock: Spinlock protecting device register access.
*/
spinlock_t hw_lock;
/**
* @mutex: Mutex protecting the driver access across multiple
* frameworks (KMS, ALSA).
*
* NOTE: While supported, CEC has been left out since
* cec_s_phys_addr_from_edid() might call .adap_enable and lead to a
* reentrancy issue between .get_modes (or .detect) and .adap_enable.
* Since we don't share any state between the CEC hooks and KMS', it's
* not a big deal. The only trouble might come from updating the CEC
* clock divider which might be affected by a modeset, but CEC should
* be resilient to that.
*/
struct mutex mutex;
};
static inline struct vc4_hdmi *
......
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