mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 05:18:45 +02:00
drm/ast: Turn ioregs_lock to modeset_lock
The lock for the I/O registers is only relevant during mode-setting operations. It protects the registers from concurrent access from reading EDID information. Reduce lock coverage to mode setting, rename the lock and move it entirely into the mode-setting code. No functional changes, as the I/O lock was never used for anything else than mode setting. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231116100240.22975-2-tzimmermann@suse.de
This commit is contained in:
parent
26b9a880d2
commit
c350a08ac7
|
|
@ -192,7 +192,6 @@ to_ast_bmc_connector(struct drm_connector *connector)
|
|||
struct ast_device {
|
||||
struct drm_device base;
|
||||
|
||||
struct mutex ioregs_lock; /* Protects access to I/O registers in ioregs */
|
||||
void __iomem *regs;
|
||||
void __iomem *ioregs;
|
||||
void __iomem *dp501_fw_buf;
|
||||
|
|
@ -207,6 +206,8 @@ struct ast_device {
|
|||
unsigned long vram_size;
|
||||
unsigned long vram_fb_available;
|
||||
|
||||
struct mutex modeset_lock; /* Protects access to modeset I/O registers in ioregs */
|
||||
|
||||
struct ast_plane primary_plane;
|
||||
struct ast_plane cursor_plane;
|
||||
struct drm_crtc crtc;
|
||||
|
|
|
|||
|
|
@ -440,10 +440,6 @@ struct ast_device *ast_device_create(const struct drm_driver *drv,
|
|||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
ret = drmm_mutex_init(dev, &ast->ioregs_lock);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ast->regs = pcim_iomap(pdev, 1, 0);
|
||||
if (!ast->regs)
|
||||
return ERR_PTR(-EIO);
|
||||
|
|
|
|||
|
|
@ -1358,13 +1358,13 @@ static int ast_vga_connector_helper_get_modes(struct drm_connector *connector)
|
|||
* Protect access to I/O registers from concurrent modesetting
|
||||
* by acquiring the I/O-register lock.
|
||||
*/
|
||||
mutex_lock(&ast->ioregs_lock);
|
||||
mutex_lock(&ast->modeset_lock);
|
||||
|
||||
edid = drm_get_edid(connector, &ast_vga_connector->i2c->adapter);
|
||||
if (!edid)
|
||||
goto err_mutex_unlock;
|
||||
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
|
||||
count = drm_add_edid_modes(connector, edid);
|
||||
kfree(edid);
|
||||
|
|
@ -1372,7 +1372,7 @@ static int ast_vga_connector_helper_get_modes(struct drm_connector *connector)
|
|||
return count;
|
||||
|
||||
err_mutex_unlock:
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
err_drm_connector_update_edid_property:
|
||||
drm_connector_update_edid_property(connector, NULL);
|
||||
return 0;
|
||||
|
|
@ -1464,13 +1464,13 @@ static int ast_sil164_connector_helper_get_modes(struct drm_connector *connector
|
|||
* Protect access to I/O registers from concurrent modesetting
|
||||
* by acquiring the I/O-register lock.
|
||||
*/
|
||||
mutex_lock(&ast->ioregs_lock);
|
||||
mutex_lock(&ast->modeset_lock);
|
||||
|
||||
edid = drm_get_edid(connector, &ast_sil164_connector->i2c->adapter);
|
||||
if (!edid)
|
||||
goto err_mutex_unlock;
|
||||
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
|
||||
count = drm_add_edid_modes(connector, edid);
|
||||
kfree(edid);
|
||||
|
|
@ -1478,7 +1478,7 @@ static int ast_sil164_connector_helper_get_modes(struct drm_connector *connector
|
|||
return count;
|
||||
|
||||
err_mutex_unlock:
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
err_drm_connector_update_edid_property:
|
||||
drm_connector_update_edid_property(connector, NULL);
|
||||
return 0;
|
||||
|
|
@ -1670,13 +1670,13 @@ static int ast_astdp_connector_helper_get_modes(struct drm_connector *connector)
|
|||
* Protect access to I/O registers from concurrent modesetting
|
||||
* by acquiring the I/O-register lock.
|
||||
*/
|
||||
mutex_lock(&ast->ioregs_lock);
|
||||
mutex_lock(&ast->modeset_lock);
|
||||
|
||||
succ = ast_astdp_read_edid(connector->dev, edid);
|
||||
if (succ < 0)
|
||||
goto err_mutex_unlock;
|
||||
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
|
||||
drm_connector_update_edid_property(connector, edid);
|
||||
count = drm_add_edid_modes(connector, edid);
|
||||
|
|
@ -1685,7 +1685,7 @@ static int ast_astdp_connector_helper_get_modes(struct drm_connector *connector)
|
|||
return count;
|
||||
|
||||
err_mutex_unlock:
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
kfree(edid);
|
||||
err_drm_connector_update_edid_property:
|
||||
drm_connector_update_edid_property(connector, NULL);
|
||||
|
|
@ -1870,9 +1870,9 @@ static void ast_mode_config_helper_atomic_commit_tail(struct drm_atomic_state *s
|
|||
* display modes. Protect access to I/O registers by acquiring
|
||||
* the I/O-register lock. Released in atomic_flush().
|
||||
*/
|
||||
mutex_lock(&ast->ioregs_lock);
|
||||
mutex_lock(&ast->modeset_lock);
|
||||
drm_atomic_helper_commit_tail_rpm(state);
|
||||
mutex_unlock(&ast->ioregs_lock);
|
||||
mutex_unlock(&ast->modeset_lock);
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_helper_funcs ast_mode_config_helper_funcs = {
|
||||
|
|
@ -1910,6 +1910,10 @@ int ast_mode_config_init(struct ast_device *ast)
|
|||
struct drm_connector *physical_connector = NULL;
|
||||
int ret;
|
||||
|
||||
ret = drmm_mutex_init(dev, &ast->modeset_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = drmm_mode_config_init(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user