Commit b1a7d0dd authored by Patrik Jakobsson's avatar Patrik Jakobsson

drm/gma500: Make use of the drm connector iterator

This makes sure we're using proper locking when iterating the list of
connectors.
Signed-off-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20220322131742.11566-3-patrik.r.jakobsson@gmail.com
parent 3e712b3c
...@@ -262,6 +262,7 @@ static int cdv_save_display_registers(struct drm_device *dev) ...@@ -262,6 +262,7 @@ static int cdv_save_display_registers(struct drm_device *dev)
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev); struct pci_dev *pdev = to_pci_dev(dev->dev);
struct psb_save_area *regs = &dev_priv->regs; struct psb_save_area *regs = &dev_priv->regs;
struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
dev_dbg(dev->dev, "Saving GPU registers.\n"); dev_dbg(dev->dev, "Saving GPU registers.\n");
...@@ -298,8 +299,10 @@ static int cdv_save_display_registers(struct drm_device *dev) ...@@ -298,8 +299,10 @@ static int cdv_save_display_registers(struct drm_device *dev)
regs->cdv.saveIER = REG_READ(PSB_INT_ENABLE_R); regs->cdv.saveIER = REG_READ(PSB_INT_ENABLE_R);
regs->cdv.saveIMR = REG_READ(PSB_INT_MASK_R); regs->cdv.saveIMR = REG_READ(PSB_INT_MASK_R);
list_for_each_entry(connector, &dev->mode_config.connector_list, head) drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter)
connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF); connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF);
drm_connector_list_iter_end(&conn_iter);
return 0; return 0;
} }
...@@ -317,6 +320,7 @@ static int cdv_restore_display_registers(struct drm_device *dev) ...@@ -317,6 +320,7 @@ static int cdv_restore_display_registers(struct drm_device *dev)
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev); struct pci_dev *pdev = to_pci_dev(dev->dev);
struct psb_save_area *regs = &dev_priv->regs; struct psb_save_area *regs = &dev_priv->regs;
struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
u32 temp; u32 temp;
...@@ -373,8 +377,10 @@ static int cdv_restore_display_registers(struct drm_device *dev) ...@@ -373,8 +377,10 @@ static int cdv_restore_display_registers(struct drm_device *dev)
drm_mode_config_reset(dev); drm_mode_config_reset(dev);
list_for_each_entry(connector, &dev->mode_config.connector_list, head) drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter)
connector->funcs->dpms(connector, DRM_MODE_DPMS_ON); connector->funcs->dpms(connector, DRM_MODE_DPMS_ON);
drm_connector_list_iter_end(&conn_iter);
/* Resume the modeset for every activated CRTC */ /* Resume the modeset for every activated CRTC */
drm_helper_resume_force_mode(dev); drm_helper_resume_force_mode(dev);
......
...@@ -584,13 +584,14 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -584,13 +584,14 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
bool ok; bool ok;
bool is_lvds = false; bool is_lvds = false;
bool is_dp = false; bool is_dp = false;
struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
const struct gma_limit_t *limit; const struct gma_limit_t *limit;
u32 ddi_select = 0; u32 ddi_select = 0;
bool is_edp = false; bool is_edp = false;
list_for_each_entry(connector, &mode_config->connector_list, head) { drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) {
struct gma_encoder *gma_encoder = struct gma_encoder *gma_encoder =
gma_attached_encoder(connector); gma_attached_encoder(connector);
...@@ -613,10 +614,14 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -613,10 +614,14 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
is_edp = true; is_edp = true;
break; break;
default: default:
drm_connector_list_iter_end(&conn_iter);
DRM_ERROR("invalid output type.\n"); DRM_ERROR("invalid output type.\n");
return 0; return 0;
} }
break;
} }
drm_connector_list_iter_end(&conn_iter);
if (dev_priv->dplla_96mhz) if (dev_priv->dplla_96mhz)
/* low-end sku, 96/100 mhz */ /* low-end sku, 96/100 mhz */
......
...@@ -451,6 +451,7 @@ static const struct drm_mode_config_funcs psb_mode_funcs = { ...@@ -451,6 +451,7 @@ static const struct drm_mode_config_funcs psb_mode_funcs = {
static void psb_setup_outputs(struct drm_device *dev) static void psb_setup_outputs(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
drm_mode_create_scaling_mode_property(dev); drm_mode_create_scaling_mode_property(dev);
...@@ -461,8 +462,8 @@ static void psb_setup_outputs(struct drm_device *dev) ...@@ -461,8 +462,8 @@ static void psb_setup_outputs(struct drm_device *dev)
"backlight", 0, 100); "backlight", 0, 100);
dev_priv->ops->output_init(dev); dev_priv->ops->output_init(dev);
list_for_each_entry(connector, &dev->mode_config.connector_list, drm_connector_list_iter_begin(dev, &conn_iter);
head) { drm_for_each_connector_iter(connector, &conn_iter) {
struct gma_encoder *gma_encoder = gma_attached_encoder(connector); struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
struct drm_encoder *encoder = &gma_encoder->base; struct drm_encoder *encoder = &gma_encoder->base;
int crtc_mask = 0, clone_mask = 0; int crtc_mask = 0, clone_mask = 0;
...@@ -505,6 +506,7 @@ static void psb_setup_outputs(struct drm_device *dev) ...@@ -505,6 +506,7 @@ static void psb_setup_outputs(struct drm_device *dev)
encoder->possible_clones = encoder->possible_clones =
gma_connector_clones(dev, clone_mask); gma_connector_clones(dev, clone_mask);
} }
drm_connector_list_iter_end(&conn_iter);
} }
void psb_modeset_init(struct drm_device *dev) void psb_modeset_init(struct drm_device *dev)
......
...@@ -27,17 +27,21 @@ ...@@ -27,17 +27,21 @@
bool gma_pipe_has_type(struct drm_crtc *crtc, int type) bool gma_pipe_has_type(struct drm_crtc *crtc, int type)
{ {
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector_list_iter conn_iter;
struct drm_connector *l_entry; struct drm_connector *connector;
list_for_each_entry(l_entry, &mode_config->connector_list, head) { drm_connector_list_iter_begin(dev, &conn_iter);
if (l_entry->encoder && l_entry->encoder->crtc == crtc) { drm_for_each_connector_iter(connector, &conn_iter) {
if (connector->encoder && connector->encoder->crtc == crtc) {
struct gma_encoder *gma_encoder = struct gma_encoder *gma_encoder =
gma_attached_encoder(l_entry); gma_attached_encoder(connector);
if (gma_encoder->type == type) if (gma_encoder->type == type) {
drm_connector_list_iter_end(&conn_iter);
return true; return true;
} }
} }
}
drm_connector_list_iter_end(&conn_iter);
return false; return false;
} }
......
...@@ -372,9 +372,9 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc, ...@@ -372,9 +372,9 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
bool ok, is_sdvo = false; bool ok, is_sdvo = false;
bool is_lvds = false; bool is_lvds = false;
bool is_mipi = false; bool is_mipi = false;
struct drm_mode_config *mode_config = &dev->mode_config;
struct gma_encoder *gma_encoder = NULL; struct gma_encoder *gma_encoder = NULL;
uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN; uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN;
struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
int i; int i;
int need_aux = gma_pipe_has_type(crtc, INTEL_OUTPUT_SDVO) ? 1 : 0; int need_aux = gma_pipe_has_type(crtc, INTEL_OUTPUT_SDVO) ? 1 : 0;
...@@ -388,7 +388,8 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc, ...@@ -388,7 +388,8 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
drm_mode_copy(&gma_crtc->saved_mode, mode); drm_mode_copy(&gma_crtc->saved_mode, mode);
drm_mode_copy(&gma_crtc->saved_adjusted_mode, adjusted_mode); drm_mode_copy(&gma_crtc->saved_adjusted_mode, adjusted_mode);
list_for_each_entry(connector, &mode_config->connector_list, head) { drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) {
if (!connector->encoder || connector->encoder->crtc != crtc) if (!connector->encoder || connector->encoder->crtc != crtc)
continue; continue;
...@@ -405,8 +406,16 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc, ...@@ -405,8 +406,16 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
is_mipi = true; is_mipi = true;
break; break;
} }
break;
} }
if (gma_encoder)
drm_object_property_get_value(&connector->base,
dev->mode_config.scaling_mode_property, &scalingType);
drm_connector_list_iter_end(&conn_iter);
/* Disable the VGA plane that we never use */ /* Disable the VGA plane that we never use */
for (i = 0; i <= need_aux; i++) for (i = 0; i <= need_aux; i++)
REG_WRITE_WITH_AUX(VGACNTRL, VGA_DISP_DISABLE, i); REG_WRITE_WITH_AUX(VGACNTRL, VGA_DISP_DISABLE, i);
...@@ -420,10 +429,6 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc, ...@@ -420,10 +429,6 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
(mode->crtc_vdisplay - 1), i); (mode->crtc_vdisplay - 1), i);
} }
if (gma_encoder)
drm_object_property_get_value(&connector->base,
dev->mode_config.scaling_mode_property, &scalingType);
if (scalingType == DRM_MODE_SCALE_NO_SCALE) { if (scalingType == DRM_MODE_SCALE_NO_SCALE) {
/* Moorestown doesn't have register support for centering so /* Moorestown doesn't have register support for centering so
* we need to mess with the h/vblank and h/vsync start and * we need to mess with the h/vblank and h/vsync start and
......
...@@ -85,7 +85,7 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder, ...@@ -85,7 +85,7 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector = NULL; struct drm_connector *connector = NULL;
struct drm_crtc *crtc = encoder->crtc; struct drm_crtc *crtc = encoder->crtc;
u32 lvds_port; u32 lvds_port;
...@@ -112,21 +112,22 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder, ...@@ -112,21 +112,22 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
REG_WRITE(LVDS, lvds_port); REG_WRITE(LVDS, lvds_port);
/* Find the connector we're trying to set up */ /* Find the connector we're trying to set up */
list_for_each_entry(connector, &mode_config->connector_list, head) { drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) {
if (connector->encoder && connector->encoder->crtc == crtc) if (connector->encoder && connector->encoder->crtc == crtc)
break; break;
} }
if (list_entry_is_head(connector, &mode_config->connector_list, head)) { if (!connector) {
drm_connector_list_iter_end(&conn_iter);
DRM_ERROR("Couldn't find connector when setting mode"); DRM_ERROR("Couldn't find connector when setting mode");
gma_power_end(dev); gma_power_end(dev);
return; return;
} }
drm_object_property_get_value( drm_object_property_get_value( &connector->base,
&connector->base, dev->mode_config.scaling_mode_property, &v);
dev->mode_config.scaling_mode_property, drm_connector_list_iter_end(&conn_iter);
&v);
if (v == DRM_MODE_SCALE_NO_SCALE) if (v == DRM_MODE_SCALE_NO_SCALE)
REG_WRITE(PFIT_CONTROL, 0); REG_WRITE(PFIT_CONTROL, 0);
......
...@@ -168,8 +168,10 @@ static void psb_init_pm(struct drm_device *dev) ...@@ -168,8 +168,10 @@ static void psb_init_pm(struct drm_device *dev)
static int psb_save_display_registers(struct drm_device *dev) static int psb_save_display_registers(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct gma_connector *gma_connector;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct gma_connector *connector; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector;
struct psb_state *regs = &dev_priv->regs.psb; struct psb_state *regs = &dev_priv->regs.psb;
/* Display arbitration control + watermarks */ /* Display arbitration control + watermarks */
...@@ -189,9 +191,13 @@ static int psb_save_display_registers(struct drm_device *dev) ...@@ -189,9 +191,13 @@ static int psb_save_display_registers(struct drm_device *dev)
dev_priv->ops->save_crtc(crtc); dev_priv->ops->save_crtc(crtc);
} }
list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) drm_connector_list_iter_begin(dev, &conn_iter);
if (connector->save) drm_for_each_connector_iter(connector, &conn_iter) {
connector->save(&connector->base); gma_connector = to_gma_connector(connector);
if (gma_connector->save)
gma_connector->save(connector);
}
drm_connector_list_iter_end(&conn_iter);
drm_modeset_unlock_all(dev); drm_modeset_unlock_all(dev);
return 0; return 0;
...@@ -206,8 +212,10 @@ static int psb_save_display_registers(struct drm_device *dev) ...@@ -206,8 +212,10 @@ static int psb_save_display_registers(struct drm_device *dev)
static int psb_restore_display_registers(struct drm_device *dev) static int psb_restore_display_registers(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct gma_connector *gma_connector;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct gma_connector *connector; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector;
struct psb_state *regs = &dev_priv->regs.psb; struct psb_state *regs = &dev_priv->regs.psb;
/* Display arbitration + watermarks */ /* Display arbitration + watermarks */
...@@ -228,9 +236,13 @@ static int psb_restore_display_registers(struct drm_device *dev) ...@@ -228,9 +236,13 @@ static int psb_restore_display_registers(struct drm_device *dev)
if (drm_helper_crtc_in_use(crtc)) if (drm_helper_crtc_in_use(crtc))
dev_priv->ops->restore_crtc(crtc); dev_priv->ops->restore_crtc(crtc);
list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) drm_connector_list_iter_begin(dev, &conn_iter);
if (connector->restore) drm_for_each_connector_iter(connector, &conn_iter) {
connector->restore(&connector->base); gma_connector = to_gma_connector(connector);
if (gma_connector->restore)
gma_connector->restore(connector);
}
drm_connector_list_iter_end(&conn_iter);
drm_modeset_unlock_all(dev); drm_modeset_unlock_all(dev);
return 0; return 0;
......
...@@ -236,10 +236,11 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -236,10 +236,11 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
unsigned long resource_start, resource_len; unsigned long resource_start, resource_len;
unsigned long irqflags; unsigned long irqflags;
int ret = -ENOMEM; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
struct gma_encoder *gma_encoder; struct gma_encoder *gma_encoder;
struct psb_gtt *pg; struct psb_gtt *pg;
int ret = -ENOMEM;
/* initializing driver private data */ /* initializing driver private data */
...@@ -390,9 +391,9 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -390,9 +391,9 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
psb_fbdev_init(dev); psb_fbdev_init(dev);
drm_kms_helper_poll_init(dev); drm_kms_helper_poll_init(dev);
/* Only add backlight support if we have LVDS output */ /* Only add backlight support if we have LVDS or MIPI output */
list_for_each_entry(connector, &dev->mode_config.connector_list, drm_connector_list_iter_begin(dev, &conn_iter);
head) { drm_for_each_connector_iter(connector, &conn_iter) {
gma_encoder = gma_attached_encoder(connector); gma_encoder = gma_attached_encoder(connector);
switch (gma_encoder->type) { switch (gma_encoder->type) {
...@@ -402,6 +403,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -402,6 +403,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
break; break;
} }
} }
drm_connector_list_iter_end(&conn_iter);
if (ret) if (ret)
return ret; return ret;
......
...@@ -106,7 +106,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -106,7 +106,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
u32 dpll = 0, fp = 0, dspcntr, pipeconf; u32 dpll = 0, fp = 0, dspcntr, pipeconf;
bool ok, is_sdvo = false; bool ok, is_sdvo = false;
bool is_lvds = false, is_tv = false; bool is_lvds = false, is_tv = false;
struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
const struct gma_limit_t *limit; const struct gma_limit_t *limit;
...@@ -116,7 +116,8 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -116,7 +116,8 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
return 0; return 0;
} }
list_for_each_entry(connector, &mode_config->connector_list, head) { drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) {
struct gma_encoder *gma_encoder = gma_attached_encoder(connector); struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
if (!connector->encoder if (!connector->encoder
...@@ -135,6 +136,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -135,6 +136,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
break; break;
} }
} }
drm_connector_list_iter_end(&conn_iter);
refclk = 96000; refclk = 96000;
...@@ -534,16 +536,19 @@ struct drm_crtc *psb_intel_get_crtc_from_pipe(struct drm_device *dev, int pipe) ...@@ -534,16 +536,19 @@ struct drm_crtc *psb_intel_get_crtc_from_pipe(struct drm_device *dev, int pipe)
int gma_connector_clones(struct drm_device *dev, int type_mask) int gma_connector_clones(struct drm_device *dev, int type_mask)
{ {
int index_mask = 0; struct drm_connector_list_iter conn_iter;
struct drm_connector *connector; struct drm_connector *connector;
int index_mask = 0;
int entry = 0; int entry = 0;
list_for_each_entry(connector, &dev->mode_config.connector_list, drm_connector_list_iter_begin(dev, &conn_iter);
head) { drm_for_each_connector_iter(connector, &conn_iter) {
struct gma_encoder *gma_encoder = gma_attached_encoder(connector); struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
if (type_mask & (1 << gma_encoder->type)) if (type_mask & (1 << gma_encoder->type))
index_mask |= (1 << entry); index_mask |= (1 << entry);
entry++; entry++;
} }
drm_connector_list_iter_end(&conn_iter);
return index_mask; return index_mask;
} }
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