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: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20220322131742.11566-3-patrik.r.jakobsson@gmail.com
This commit is contained in:
parent
3e712b3cfb
commit
b1a7d0ddb1
@ -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 pci_dev *pdev = to_pci_dev(dev->dev);
|
||||
struct psb_save_area *regs = &dev_priv->regs;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
|
||||
dev_dbg(dev->dev, "Saving GPU registers.\n");
|
||||
@ -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.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);
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -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 pci_dev *pdev = to_pci_dev(dev->dev);
|
||||
struct psb_save_area *regs = &dev_priv->regs;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
u32 temp;
|
||||
|
||||
@ -373,8 +377,10 @@ static int cdv_restore_display_registers(struct drm_device *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);
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
/* Resume the modeset for every activated CRTC */
|
||||
drm_helper_resume_force_mode(dev);
|
||||
|
@ -584,13 +584,14 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
bool ok;
|
||||
bool is_lvds = 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;
|
||||
const struct gma_limit_t *limit;
|
||||
u32 ddi_select = 0;
|
||||
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 =
|
||||
gma_attached_encoder(connector);
|
||||
|
||||
@ -613,10 +614,14 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
is_edp = true;
|
||||
break;
|
||||
default:
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
DRM_ERROR("invalid output type.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
if (dev_priv->dplla_96mhz)
|
||||
/* low-end sku, 96/100 mhz */
|
||||
|
@ -451,6 +451,7 @@ static const struct drm_mode_config_funcs psb_mode_funcs = {
|
||||
static void psb_setup_outputs(struct drm_device *dev)
|
||||
{
|
||||
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
|
||||
drm_mode_create_scaling_mode_property(dev);
|
||||
@ -461,8 +462,8 @@ static void psb_setup_outputs(struct drm_device *dev)
|
||||
"backlight", 0, 100);
|
||||
dev_priv->ops->output_init(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) {
|
||||
struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
|
||||
struct drm_encoder *encoder = &gma_encoder->base;
|
||||
int crtc_mask = 0, clone_mask = 0;
|
||||
@ -505,6 +506,7 @@ static void psb_setup_outputs(struct drm_device *dev)
|
||||
encoder->possible_clones =
|
||||
gma_connector_clones(dev, clone_mask);
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
}
|
||||
|
||||
void psb_modeset_init(struct drm_device *dev)
|
||||
|
@ -27,17 +27,21 @@
|
||||
bool gma_pipe_has_type(struct drm_crtc *crtc, int type)
|
||||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct drm_connector *l_entry;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
|
||||
list_for_each_entry(l_entry, &mode_config->connector_list, head) {
|
||||
if (l_entry->encoder && l_entry->encoder->crtc == crtc) {
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
if (connector->encoder && connector->encoder->crtc == crtc) {
|
||||
struct gma_encoder *gma_encoder =
|
||||
gma_attached_encoder(l_entry);
|
||||
if (gma_encoder->type == type)
|
||||
gma_attached_encoder(connector);
|
||||
if (gma_encoder->type == type) {
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -372,9 +372,9 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
|
||||
bool ok, is_sdvo = false;
|
||||
bool is_lvds = false;
|
||||
bool is_mipi = false;
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct gma_encoder *gma_encoder = NULL;
|
||||
uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
int i;
|
||||
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,
|
||||
drm_mode_copy(&gma_crtc->saved_mode, 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)
|
||||
continue;
|
||||
|
||||
@ -405,8 +406,16 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
|
||||
is_mipi = true;
|
||||
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 */
|
||||
for (i = 0; i <= need_aux; i++)
|
||||
REG_WRITE_WITH_AUX(VGACNTRL, VGA_DISP_DISABLE, i);
|
||||
@ -420,10 +429,6 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
|
||||
(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) {
|
||||
/* Moorestown doesn't have register support for centering so
|
||||
* 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,
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct drm_psb_private *dev_priv = to_drm_psb_private(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_crtc *crtc = encoder->crtc;
|
||||
u32 lvds_port;
|
||||
@ -112,21 +112,22 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
|
||||
REG_WRITE(LVDS, lvds_port);
|
||||
|
||||
/* 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)
|
||||
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");
|
||||
gma_power_end(dev);
|
||||
return;
|
||||
}
|
||||
|
||||
drm_object_property_get_value(
|
||||
&connector->base,
|
||||
dev->mode_config.scaling_mode_property,
|
||||
&v);
|
||||
drm_object_property_get_value( &connector->base,
|
||||
dev->mode_config.scaling_mode_property, &v);
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
if (v == DRM_MODE_SCALE_NO_SCALE)
|
||||
REG_WRITE(PFIT_CONTROL, 0);
|
||||
|
@ -168,8 +168,10 @@ static void psb_init_pm(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 gma_connector *gma_connector;
|
||||
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;
|
||||
|
||||
/* Display arbitration control + watermarks */
|
||||
@ -189,9 +191,13 @@ static int psb_save_display_registers(struct drm_device *dev)
|
||||
dev_priv->ops->save_crtc(crtc);
|
||||
}
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, base.head)
|
||||
if (connector->save)
|
||||
connector->save(&connector->base);
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
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);
|
||||
return 0;
|
||||
@ -206,8 +212,10 @@ static int psb_save_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 gma_connector *gma_connector;
|
||||
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;
|
||||
|
||||
/* Display arbitration + watermarks */
|
||||
@ -228,9 +236,13 @@ static int psb_restore_display_registers(struct drm_device *dev)
|
||||
if (drm_helper_crtc_in_use(crtc))
|
||||
dev_priv->ops->restore_crtc(crtc);
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, base.head)
|
||||
if (connector->restore)
|
||||
connector->restore(&connector->base);
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
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);
|
||||
return 0;
|
||||
|
@ -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);
|
||||
unsigned long resource_start, resource_len;
|
||||
unsigned long irqflags;
|
||||
int ret = -ENOMEM;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
struct gma_encoder *gma_encoder;
|
||||
struct psb_gtt *pg;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
/* initializing driver private data */
|
||||
|
||||
@ -390,9 +391,9 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
psb_fbdev_init(dev);
|
||||
drm_kms_helper_poll_init(dev);
|
||||
|
||||
/* Only add backlight support if we have LVDS output */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list,
|
||||
head) {
|
||||
/* Only add backlight support if we have LVDS or MIPI output */
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
gma_encoder = gma_attached_encoder(connector);
|
||||
|
||||
switch (gma_encoder->type) {
|
||||
@ -402,6 +403,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
break;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -106,7 +106,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
u32 dpll = 0, fp = 0, dspcntr, pipeconf;
|
||||
bool ok, is_sdvo = 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;
|
||||
const struct gma_limit_t *limit;
|
||||
|
||||
@ -116,7 +116,8 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
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);
|
||||
|
||||
if (!connector->encoder
|
||||
@ -135,6 +136,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
break;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
refclk = 96000;
|
||||
|
||||
@ -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 index_mask = 0;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct drm_connector *connector;
|
||||
int index_mask = 0;
|
||||
int entry = 0;
|
||||
|
||||
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) {
|
||||
struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
|
||||
if (type_mask & (1 << gma_encoder->type))
|
||||
index_mask |= (1 << entry);
|
||||
entry++;
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return index_mask;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user