aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-07-05 10:20:48 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-09-06 02:02:40 -0400
commit1aa4b628ee63f55db96c7e820257b6e4948abb74 (patch)
tree3a632ba5e5f59914aab0f3c0ac3b666e9ac1eb62 /drivers
parent8d3e375e77f09174038b9bfb02b8423cbb187959 (diff)
drm/i915: don't save all the encoder/crtc state in set_config
We actually only touch the connector -> encoder and encoder -> crtc linking. So it's enough to just save/restore that. While at it, also switch to kcalloc to allocate these arrays (omission in the commit message spotted by Jesse Barnes). Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c28
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h4
2 files changed, 17 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 9485c5a7f8a5..a2ce117aa794 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6726,8 +6726,8 @@ static void intel_set_config_free(struct intel_set_config *config)
6726 if (!config) 6726 if (!config)
6727 return; 6727 return;
6728 6728
6729 kfree(config->save_connectors); 6729 kfree(config->save_connector_encoders);
6730 kfree(config->save_encoders); 6730 kfree(config->save_encoder_crtcs);
6731 kfree(config->save_crtcs); 6731 kfree(config->save_crtcs);
6732 kfree(config); 6732 kfree(config);
6733} 6733}
@@ -6742,19 +6742,21 @@ static int intel_set_config_save_state(struct drm_device *dev,
6742 6742
6743 /* Allocate space for the backup of all (non-pointer) crtc, encoder and 6743 /* Allocate space for the backup of all (non-pointer) crtc, encoder and
6744 * connector data. */ 6744 * connector data. */
6745 config->save_crtcs = kzalloc(dev->mode_config.num_crtc * 6745 config->save_crtcs = kcalloc(dev->mode_config.num_crtc,
6746 sizeof(struct drm_crtc), GFP_KERNEL); 6746 sizeof(struct drm_crtc), GFP_KERNEL);
6747 if (!config->save_crtcs) 6747 if (!config->save_crtcs)
6748 return -ENOMEM; 6748 return -ENOMEM;
6749 6749
6750 config->save_encoders = kzalloc(dev->mode_config.num_encoder * 6750 config->save_encoder_crtcs =
6751 sizeof(struct drm_encoder), GFP_KERNEL); 6751 kcalloc(dev->mode_config.num_encoder,
6752 if (!config->save_encoders) 6752 sizeof(struct drm_crtc *), GFP_KERNEL);
6753 if (!config->save_encoder_crtcs)
6753 return -ENOMEM; 6754 return -ENOMEM;
6754 6755
6755 config->save_connectors = kzalloc(dev->mode_config.num_connector * 6756 config->save_connector_encoders =
6756 sizeof(struct drm_connector), GFP_KERNEL); 6757 kcalloc(dev->mode_config.num_connector,
6757 if (!config->save_connectors) 6758 sizeof(struct drm_encoder *), GFP_KERNEL);
6759 if (!config->save_connector_encoders)
6758 return -ENOMEM; 6760 return -ENOMEM;
6759 6761
6760 /* Copy data. Note that driver private data is not affected. 6762 /* Copy data. Note that driver private data is not affected.
@@ -6768,12 +6770,12 @@ static int intel_set_config_save_state(struct drm_device *dev,
6768 6770
6769 count = 0; 6771 count = 0;
6770 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 6772 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
6771 config->save_encoders[count++] = *encoder; 6773 config->save_encoder_crtcs[count++] = encoder->crtc;
6772 } 6774 }
6773 6775
6774 count = 0; 6776 count = 0;
6775 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 6777 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
6776 config->save_connectors[count++] = *connector; 6778 config->save_connector_encoders[count++] = connector->encoder;
6777 } 6779 }
6778 6780
6779 return 0; 6781 return 0;
@@ -6794,12 +6796,12 @@ static void intel_set_config_restore_state(struct drm_device *dev,
6794 6796
6795 count = 0; 6797 count = 0;
6796 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 6798 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
6797 *encoder = config->save_encoders[count++]; 6799 encoder->crtc = config->save_encoder_crtcs[count++];
6798 } 6800 }
6799 6801
6800 count = 0; 6802 count = 0;
6801 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 6803 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
6802 *connector = config->save_connectors[count++]; 6804 connector->encoder = config->save_connector_encoders[count++];
6803 } 6805 }
6804} 6806}
6805 6807
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index fad11c83ba40..4946282bd324 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -424,8 +424,8 @@ extern void intel_panel_destroy_backlight(struct drm_device *dev);
424extern enum drm_connector_status intel_panel_detect(struct drm_device *dev); 424extern enum drm_connector_status intel_panel_detect(struct drm_device *dev);
425 425
426struct intel_set_config { 426struct intel_set_config {
427 struct drm_connector *save_connectors; 427 struct drm_encoder **save_connector_encoders;
428 struct drm_encoder *save_encoders; 428 struct drm_crtc **save_encoder_crtcs;
429 struct drm_crtc *save_crtcs; 429 struct drm_crtc *save_crtcs;
430 430
431 bool fb_changed; 431 bool fb_changed;