diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-07-05 10:20:48 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-09-06 02:02:40 -0400 |
commit | 1aa4b628ee63f55db96c7e820257b6e4948abb74 (patch) | |
tree | 3a632ba5e5f59914aab0f3c0ac3b666e9ac1eb62 /drivers | |
parent | 8d3e375e77f09174038b9bfb02b8423cbb187959 (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.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 4 |
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); | |||
424 | extern enum drm_connector_status intel_panel_detect(struct drm_device *dev); | 424 | extern enum drm_connector_status intel_panel_detect(struct drm_device *dev); |
425 | 425 | ||
426 | struct intel_set_config { | 426 | struct 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; |