diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-12-02 09:24:10 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-01-20 16:16:57 -0500 |
commit | dac35663cef4ca7f572d430bb54b14be8f03cb10 (patch) | |
tree | d7b1c8b5717ff9efbf867535d493b308610af680 /drivers/gpu/drm/radeon/radeon_cursor.c | |
parent | bfb899282f500eeb9dff2600729904aad0fd39e7 (diff) |
drm: only take the crtc lock for ->cursor_move
->cursor_move uses mostly the same facilities in drivers as
->cursor_set, so pretty much nothing to fix up:
- ast/gma500/i915: They all use per-crtc registers to update the
cursor position. ast again touches the global cursor cache, but
that's ok since there's only one crtc.
- nouveau: nv50+ is again special, updates happen through the per-crtc
channel (without pushbufs), so it's not protected by the new evo
lock introduced earlier. But since this channel is per-crtc, we
should be fine anyway.
- radeon: A bit a mess: avivo asics need a workaround when both output
pipes are enabled, which means it'll access the crtc list. Just
reading that flag is ok though as long as radeon _always_ grabs all
locks when changing the crtc configuration. Which means with the
current scheme it cannot do an optimized modeset which only locks
the relevant crtcs. This can be fixed though by introducing a bit of
global state with separate locks and ensure in the modeset code that
the cursor will be updated appropriately when enabling the 2nd pipe
(on affected asics).
- vmwgfx: I still don't understand what it's doing exactly, so apply
the same trick for now.
v2: Fixup unlocking for the error cases, spotted by Richard Wilbur.
v3: Another error-case fixup.
Reviewed-by: Rob Clark <rob@ti.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cursor.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cursor.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index ad6df625e8b8..c1680e6d76ad 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
@@ -245,8 +245,14 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | |||
245 | int i = 0; | 245 | int i = 0; |
246 | struct drm_crtc *crtc_p; | 246 | struct drm_crtc *crtc_p; |
247 | 247 | ||
248 | /* avivo cursor image can't end on 128 pixel boundary or | 248 | /* |
249 | * avivo cursor image can't end on 128 pixel boundary or | ||
249 | * go past the end of the frame if both crtcs are enabled | 250 | * go past the end of the frame if both crtcs are enabled |
251 | * | ||
252 | * NOTE: It is safe to access crtc->enabled of other crtcs | ||
253 | * without holding either the mode_config lock or the other | ||
254 | * crtc's lock as long as write access to this flag _always_ | ||
255 | * grabs all locks. | ||
250 | */ | 256 | */ |
251 | list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { | 257 | list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { |
252 | if (crtc_p->enabled) | 258 | if (crtc_p->enabled) |