.. | .. |
---|
24 | 24 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
---|
25 | 25 | */ |
---|
26 | 26 | |
---|
27 | | -#include <drm/drmP.h> |
---|
28 | | -#include <drm/i915_drm.h> |
---|
29 | | -#include "intel_drv.h" |
---|
| 27 | +#include "display/intel_fbc.h" |
---|
| 28 | +#include "display/intel_gmbus.h" |
---|
| 29 | +#include "display/intel_vga.h" |
---|
| 30 | + |
---|
| 31 | +#include "i915_drv.h" |
---|
30 | 32 | #include "i915_reg.h" |
---|
| 33 | +#include "i915_suspend.h" |
---|
31 | 34 | |
---|
32 | 35 | static void i915_save_display(struct drm_i915_private *dev_priv) |
---|
33 | 36 | { |
---|
| 37 | + struct pci_dev *pdev = dev_priv->drm.pdev; |
---|
| 38 | + |
---|
34 | 39 | /* Display arbitration control */ |
---|
35 | 40 | if (INTEL_GEN(dev_priv) <= 4) |
---|
36 | 41 | dev_priv->regfile.saveDSPARB = I915_READ(DSPARB); |
---|
37 | 42 | |
---|
38 | | - /* save FBC interval */ |
---|
39 | | - if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) <= 4 && !IS_G4X(dev_priv)) |
---|
40 | | - dev_priv->regfile.saveFBC_CONTROL = I915_READ(FBC_CONTROL); |
---|
| 43 | + if (IS_GEN(dev_priv, 4)) |
---|
| 44 | + pci_read_config_word(pdev, GCDGMBUS, |
---|
| 45 | + &dev_priv->regfile.saveGCDGMBUS); |
---|
41 | 46 | } |
---|
42 | 47 | |
---|
43 | 48 | static void i915_restore_display(struct drm_i915_private *dev_priv) |
---|
44 | 49 | { |
---|
| 50 | + struct pci_dev *pdev = dev_priv->drm.pdev; |
---|
| 51 | + |
---|
| 52 | + if (IS_GEN(dev_priv, 4)) |
---|
| 53 | + pci_write_config_word(pdev, GCDGMBUS, |
---|
| 54 | + dev_priv->regfile.saveGCDGMBUS); |
---|
| 55 | + |
---|
45 | 56 | /* Display arbitration */ |
---|
46 | 57 | if (INTEL_GEN(dev_priv) <= 4) |
---|
47 | 58 | I915_WRITE(DSPARB, dev_priv->regfile.saveDSPARB); |
---|
.. | .. |
---|
49 | 60 | /* only restore FBC info on the platform that supports FBC*/ |
---|
50 | 61 | intel_fbc_global_disable(dev_priv); |
---|
51 | 62 | |
---|
52 | | - /* restore FBC interval */ |
---|
53 | | - if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) <= 4 && !IS_G4X(dev_priv)) |
---|
54 | | - I915_WRITE(FBC_CONTROL, dev_priv->regfile.saveFBC_CONTROL); |
---|
| 63 | + intel_vga_redisable(dev_priv); |
---|
55 | 64 | |
---|
56 | | - i915_redisable_vga(dev_priv); |
---|
| 65 | + intel_gmbus_reset(dev_priv); |
---|
57 | 66 | } |
---|
58 | 67 | |
---|
59 | 68 | int i915_save_state(struct drm_i915_private *dev_priv) |
---|
60 | 69 | { |
---|
61 | | - struct pci_dev *pdev = dev_priv->drm.pdev; |
---|
62 | 70 | int i; |
---|
63 | | - |
---|
64 | | - mutex_lock(&dev_priv->drm.struct_mutex); |
---|
65 | 71 | |
---|
66 | 72 | i915_save_display(dev_priv); |
---|
67 | 73 | |
---|
68 | | - if (IS_GEN4(dev_priv)) |
---|
69 | | - pci_read_config_word(pdev, GCDGMBUS, |
---|
70 | | - &dev_priv->regfile.saveGCDGMBUS); |
---|
71 | | - |
---|
72 | | - /* Cache mode state */ |
---|
73 | | - if (INTEL_GEN(dev_priv) < 7) |
---|
74 | | - dev_priv->regfile.saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); |
---|
75 | | - |
---|
76 | | - /* Memory Arbitration state */ |
---|
77 | | - dev_priv->regfile.saveMI_ARB_STATE = I915_READ(MI_ARB_STATE); |
---|
78 | | - |
---|
79 | 74 | /* Scratch space */ |
---|
80 | | - if (IS_GEN2(dev_priv) && IS_MOBILE(dev_priv)) { |
---|
| 75 | + if (IS_GEN(dev_priv, 2) && IS_MOBILE(dev_priv)) { |
---|
81 | 76 | for (i = 0; i < 7; i++) { |
---|
82 | 77 | dev_priv->regfile.saveSWF0[i] = I915_READ(SWF0(i)); |
---|
83 | 78 | dev_priv->regfile.saveSWF1[i] = I915_READ(SWF1(i)); |
---|
84 | 79 | } |
---|
85 | 80 | for (i = 0; i < 3; i++) |
---|
86 | 81 | dev_priv->regfile.saveSWF3[i] = I915_READ(SWF3(i)); |
---|
87 | | - } else if (IS_GEN2(dev_priv)) { |
---|
| 82 | + } else if (IS_GEN(dev_priv, 2)) { |
---|
88 | 83 | for (i = 0; i < 7; i++) |
---|
89 | 84 | dev_priv->regfile.saveSWF1[i] = I915_READ(SWF1(i)); |
---|
90 | | - } else if (HAS_GMCH_DISPLAY(dev_priv)) { |
---|
| 85 | + } else if (HAS_GMCH(dev_priv)) { |
---|
91 | 86 | for (i = 0; i < 16; i++) { |
---|
92 | 87 | dev_priv->regfile.saveSWF0[i] = I915_READ(SWF0(i)); |
---|
93 | 88 | dev_priv->regfile.saveSWF1[i] = I915_READ(SWF1(i)); |
---|
.. | .. |
---|
95 | 90 | for (i = 0; i < 3; i++) |
---|
96 | 91 | dev_priv->regfile.saveSWF3[i] = I915_READ(SWF3(i)); |
---|
97 | 92 | } |
---|
98 | | - |
---|
99 | | - mutex_unlock(&dev_priv->drm.struct_mutex); |
---|
100 | 93 | |
---|
101 | 94 | return 0; |
---|
102 | 95 | } |
---|
103 | 96 | |
---|
104 | 97 | int i915_restore_state(struct drm_i915_private *dev_priv) |
---|
105 | 98 | { |
---|
106 | | - struct pci_dev *pdev = dev_priv->drm.pdev; |
---|
107 | 99 | int i; |
---|
108 | 100 | |
---|
109 | | - mutex_lock(&dev_priv->drm.struct_mutex); |
---|
110 | | - |
---|
111 | | - if (IS_GEN4(dev_priv)) |
---|
112 | | - pci_write_config_word(pdev, GCDGMBUS, |
---|
113 | | - dev_priv->regfile.saveGCDGMBUS); |
---|
114 | 101 | i915_restore_display(dev_priv); |
---|
115 | 102 | |
---|
116 | | - /* Cache mode state */ |
---|
117 | | - if (INTEL_GEN(dev_priv) < 7) |
---|
118 | | - I915_WRITE(CACHE_MODE_0, dev_priv->regfile.saveCACHE_MODE_0 | |
---|
119 | | - 0xffff0000); |
---|
120 | | - |
---|
121 | | - /* Memory arbitration state */ |
---|
122 | | - I915_WRITE(MI_ARB_STATE, dev_priv->regfile.saveMI_ARB_STATE | 0xffff0000); |
---|
123 | | - |
---|
124 | 103 | /* Scratch space */ |
---|
125 | | - if (IS_GEN2(dev_priv) && IS_MOBILE(dev_priv)) { |
---|
| 104 | + if (IS_GEN(dev_priv, 2) && IS_MOBILE(dev_priv)) { |
---|
126 | 105 | for (i = 0; i < 7; i++) { |
---|
127 | 106 | I915_WRITE(SWF0(i), dev_priv->regfile.saveSWF0[i]); |
---|
128 | 107 | I915_WRITE(SWF1(i), dev_priv->regfile.saveSWF1[i]); |
---|
129 | 108 | } |
---|
130 | 109 | for (i = 0; i < 3; i++) |
---|
131 | 110 | I915_WRITE(SWF3(i), dev_priv->regfile.saveSWF3[i]); |
---|
132 | | - } else if (IS_GEN2(dev_priv)) { |
---|
| 111 | + } else if (IS_GEN(dev_priv, 2)) { |
---|
133 | 112 | for (i = 0; i < 7; i++) |
---|
134 | 113 | I915_WRITE(SWF1(i), dev_priv->regfile.saveSWF1[i]); |
---|
135 | | - } else if (HAS_GMCH_DISPLAY(dev_priv)) { |
---|
| 114 | + } else if (HAS_GMCH(dev_priv)) { |
---|
136 | 115 | for (i = 0; i < 16; i++) { |
---|
137 | 116 | I915_WRITE(SWF0(i), dev_priv->regfile.saveSWF0[i]); |
---|
138 | 117 | I915_WRITE(SWF1(i), dev_priv->regfile.saveSWF1[i]); |
---|
.. | .. |
---|
140 | 119 | for (i = 0; i < 3; i++) |
---|
141 | 120 | I915_WRITE(SWF3(i), dev_priv->regfile.saveSWF3[i]); |
---|
142 | 121 | } |
---|
143 | | - |
---|
144 | | - mutex_unlock(&dev_priv->drm.struct_mutex); |
---|
145 | | - |
---|
146 | | - intel_i2c_reset(dev_priv); |
---|
147 | 122 | |
---|
148 | 123 | return 0; |
---|
149 | 124 | } |
---|