aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c451
1 files changed, 357 insertions, 94 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index e5b138be45fa..c3cfafcbfe7d 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -35,6 +35,10 @@
35#include "i915_drv.h" 35#include "i915_drv.h"
36#include "i915_trace.h" 36#include "i915_trace.h"
37#include <linux/vgaarb.h> 37#include <linux/vgaarb.h>
38#include <linux/acpi.h>
39#include <linux/pnp.h>
40#include <linux/vga_switcheroo.h>
41#include <linux/slab.h>
38 42
39/* Really want an OS-independent resettable timer. Would like to have 43/* Really want an OS-independent resettable timer. Would like to have
40 * this loop run for (eg) 3 sec, but have the timer reset every time 44 * this loop run for (eg) 3 sec, but have the timer reset every time
@@ -123,7 +127,7 @@ static int i915_init_phys_hws(struct drm_device *dev)
123 drm_i915_private_t *dev_priv = dev->dev_private; 127 drm_i915_private_t *dev_priv = dev->dev_private;
124 /* Program Hardware Status Page */ 128 /* Program Hardware Status Page */
125 dev_priv->status_page_dmah = 129 dev_priv->status_page_dmah =
126 drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff); 130 drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE);
127 131
128 if (!dev_priv->status_page_dmah) { 132 if (!dev_priv->status_page_dmah) {
129 DRM_ERROR("Can not allocate hardware status page\n"); 133 DRM_ERROR("Can not allocate hardware status page\n");
@@ -134,6 +138,10 @@ static int i915_init_phys_hws(struct drm_device *dev)
134 138
135 memset(dev_priv->hw_status_page, 0, PAGE_SIZE); 139 memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
136 140
141 if (IS_I965G(dev))
142 dev_priv->dma_status_page |= (dev_priv->dma_status_page >> 28) &
143 0xf0;
144
137 I915_WRITE(HWS_PGA, dev_priv->dma_status_page); 145 I915_WRITE(HWS_PGA, dev_priv->dma_status_page);
138 DRM_DEBUG_DRIVER("Enabled hardware status page\n"); 146 DRM_DEBUG_DRIVER("Enabled hardware status page\n");
139 return 0; 147 return 0;
@@ -731,8 +739,10 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
731 if (cmdbuf->num_cliprects) { 739 if (cmdbuf->num_cliprects) {
732 cliprects = kcalloc(cmdbuf->num_cliprects, 740 cliprects = kcalloc(cmdbuf->num_cliprects,
733 sizeof(struct drm_clip_rect), GFP_KERNEL); 741 sizeof(struct drm_clip_rect), GFP_KERNEL);
734 if (cliprects == NULL) 742 if (cliprects == NULL) {
743 ret = -ENOMEM;
735 goto fail_batch_free; 744 goto fail_batch_free;
745 }
736 746
737 ret = copy_from_user(cliprects, cmdbuf->cliprects, 747 ret = copy_from_user(cliprects, cmdbuf->cliprects,
738 cmdbuf->num_cliprects * 748 cmdbuf->num_cliprects *
@@ -807,9 +817,19 @@ static int i915_getparam(struct drm_device *dev, void *data,
807 case I915_PARAM_NUM_FENCES_AVAIL: 817 case I915_PARAM_NUM_FENCES_AVAIL:
808 value = dev_priv->num_fence_regs - dev_priv->fence_reg_start; 818 value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
809 break; 819 break;
820 case I915_PARAM_HAS_OVERLAY:
821 value = dev_priv->overlay ? 1 : 0;
822 break;
823 case I915_PARAM_HAS_PAGEFLIPPING:
824 value = 1;
825 break;
826 case I915_PARAM_HAS_EXECBUF2:
827 /* depends on GEM */
828 value = dev_priv->has_gem;
829 break;
810 default: 830 default:
811 DRM_DEBUG_DRIVER("Unknown parameter %d\n", 831 DRM_DEBUG_DRIVER("Unknown parameter %d\n",
812 param->param); 832 param->param);
813 return -EINVAL; 833 return -EINVAL;
814 } 834 }
815 835
@@ -917,6 +937,120 @@ static int i915_get_bridge_dev(struct drm_device *dev)
917 return 0; 937 return 0;
918} 938}
919 939
940#define MCHBAR_I915 0x44
941#define MCHBAR_I965 0x48
942#define MCHBAR_SIZE (4*4096)
943
944#define DEVEN_REG 0x54
945#define DEVEN_MCHBAR_EN (1 << 28)
946
947/* Allocate space for the MCH regs if needed, return nonzero on error */
948static int
949intel_alloc_mchbar_resource(struct drm_device *dev)
950{
951 drm_i915_private_t *dev_priv = dev->dev_private;
952 int reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915;
953 u32 temp_lo, temp_hi = 0;
954 u64 mchbar_addr;
955 int ret = 0;
956
957 if (IS_I965G(dev))
958 pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi);
959 pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo);
960 mchbar_addr = ((u64)temp_hi << 32) | temp_lo;
961
962 /* If ACPI doesn't have it, assume we need to allocate it ourselves */
963#ifdef CONFIG_PNP
964 if (mchbar_addr &&
965 pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE)) {
966 ret = 0;
967 goto out;
968 }
969#endif
970
971 /* Get some space for it */
972 ret = pci_bus_alloc_resource(dev_priv->bridge_dev->bus, &dev_priv->mch_res,
973 MCHBAR_SIZE, MCHBAR_SIZE,
974 PCIBIOS_MIN_MEM,
975 0, pcibios_align_resource,
976 dev_priv->bridge_dev);
977 if (ret) {
978 DRM_DEBUG_DRIVER("failed bus alloc: %d\n", ret);
979 dev_priv->mch_res.start = 0;
980 goto out;
981 }
982
983 if (IS_I965G(dev))
984 pci_write_config_dword(dev_priv->bridge_dev, reg + 4,
985 upper_32_bits(dev_priv->mch_res.start));
986
987 pci_write_config_dword(dev_priv->bridge_dev, reg,
988 lower_32_bits(dev_priv->mch_res.start));
989out:
990 return ret;
991}
992
993/* Setup MCHBAR if possible, return true if we should disable it again */
994static void
995intel_setup_mchbar(struct drm_device *dev)
996{
997 drm_i915_private_t *dev_priv = dev->dev_private;
998 int mchbar_reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915;
999 u32 temp;
1000 bool enabled;
1001
1002 dev_priv->mchbar_need_disable = false;
1003
1004 if (IS_I915G(dev) || IS_I915GM(dev)) {
1005 pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
1006 enabled = !!(temp & DEVEN_MCHBAR_EN);
1007 } else {
1008 pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
1009 enabled = temp & 1;
1010 }
1011
1012 /* If it's already enabled, don't have to do anything */
1013 if (enabled)
1014 return;
1015
1016 if (intel_alloc_mchbar_resource(dev))
1017 return;
1018
1019 dev_priv->mchbar_need_disable = true;
1020
1021 /* Space is allocated or reserved, so enable it. */
1022 if (IS_I915G(dev) || IS_I915GM(dev)) {
1023 pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG,
1024 temp | DEVEN_MCHBAR_EN);
1025 } else {
1026 pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
1027 pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp | 1);
1028 }
1029}
1030
1031static void
1032intel_teardown_mchbar(struct drm_device *dev)
1033{
1034 drm_i915_private_t *dev_priv = dev->dev_private;
1035 int mchbar_reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915;
1036 u32 temp;
1037
1038 if (dev_priv->mchbar_need_disable) {
1039 if (IS_I915G(dev) || IS_I915GM(dev)) {
1040 pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
1041 temp &= ~DEVEN_MCHBAR_EN;
1042 pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG, temp);
1043 } else {
1044 pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
1045 temp &= ~1;
1046 pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp);
1047 }
1048 }
1049
1050 if (dev_priv->mch_res.start)
1051 release_resource(&dev_priv->mch_res);
1052}
1053
920/** 1054/**
921 * i915_probe_agp - get AGP bootup configuration 1055 * i915_probe_agp - get AGP bootup configuration
922 * @pdev: PCI device 1056 * @pdev: PCI device
@@ -962,59 +1096,123 @@ static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size,
962 * Some of the preallocated space is taken by the GTT 1096 * Some of the preallocated space is taken by the GTT
963 * and popup. GTT is 1K per MB of aperture size, and popup is 4K. 1097 * and popup. GTT is 1K per MB of aperture size, and popup is 4K.
964 */ 1098 */
965 if (IS_G4X(dev) || IS_IGD(dev) || IS_IGDNG(dev)) 1099 if (IS_G4X(dev) || IS_PINEVIEW(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev))
966 overhead = 4096; 1100 overhead = 4096;
967 else 1101 else
968 overhead = (*aperture_size / 1024) + 4096; 1102 overhead = (*aperture_size / 1024) + 4096;
969 1103
970 switch (tmp & INTEL_GMCH_GMS_MASK) { 1104 if (IS_GEN6(dev)) {
971 case INTEL_855_GMCH_GMS_DISABLED: 1105 /* SNB has memory control reg at 0x50.w */
972 DRM_ERROR("video memory is disabled\n"); 1106 pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &tmp);
973 return -1; 1107
974 case INTEL_855_GMCH_GMS_STOLEN_1M: 1108 switch (tmp & SNB_GMCH_GMS_STOLEN_MASK) {
975 stolen = 1 * 1024 * 1024; 1109 case INTEL_855_GMCH_GMS_DISABLED:
976 break; 1110 DRM_ERROR("video memory is disabled\n");
977 case INTEL_855_GMCH_GMS_STOLEN_4M: 1111 return -1;
978 stolen = 4 * 1024 * 1024; 1112 case SNB_GMCH_GMS_STOLEN_32M:
979 break; 1113 stolen = 32 * 1024 * 1024;
980 case INTEL_855_GMCH_GMS_STOLEN_8M: 1114 break;
981 stolen = 8 * 1024 * 1024; 1115 case SNB_GMCH_GMS_STOLEN_64M:
982 break; 1116 stolen = 64 * 1024 * 1024;
983 case INTEL_855_GMCH_GMS_STOLEN_16M: 1117 break;
984 stolen = 16 * 1024 * 1024; 1118 case SNB_GMCH_GMS_STOLEN_96M:
985 break; 1119 stolen = 96 * 1024 * 1024;
986 case INTEL_855_GMCH_GMS_STOLEN_32M: 1120 break;
987 stolen = 32 * 1024 * 1024; 1121 case SNB_GMCH_GMS_STOLEN_128M:
988 break; 1122 stolen = 128 * 1024 * 1024;
989 case INTEL_915G_GMCH_GMS_STOLEN_48M: 1123 break;
990 stolen = 48 * 1024 * 1024; 1124 case SNB_GMCH_GMS_STOLEN_160M:
991 break; 1125 stolen = 160 * 1024 * 1024;
992 case INTEL_915G_GMCH_GMS_STOLEN_64M: 1126 break;
993 stolen = 64 * 1024 * 1024; 1127 case SNB_GMCH_GMS_STOLEN_192M:
994 break; 1128 stolen = 192 * 1024 * 1024;
995 case INTEL_GMCH_GMS_STOLEN_128M: 1129 break;
996 stolen = 128 * 1024 * 1024; 1130 case SNB_GMCH_GMS_STOLEN_224M:
997 break; 1131 stolen = 224 * 1024 * 1024;
998 case INTEL_GMCH_GMS_STOLEN_256M: 1132 break;
999 stolen = 256 * 1024 * 1024; 1133 case SNB_GMCH_GMS_STOLEN_256M:
1000 break; 1134 stolen = 256 * 1024 * 1024;
1001 case INTEL_GMCH_GMS_STOLEN_96M: 1135 break;
1002 stolen = 96 * 1024 * 1024; 1136 case SNB_GMCH_GMS_STOLEN_288M:
1003 break; 1137 stolen = 288 * 1024 * 1024;
1004 case INTEL_GMCH_GMS_STOLEN_160M: 1138 break;
1005 stolen = 160 * 1024 * 1024; 1139 case SNB_GMCH_GMS_STOLEN_320M:
1006 break; 1140 stolen = 320 * 1024 * 1024;
1007 case INTEL_GMCH_GMS_STOLEN_224M: 1141 break;
1008 stolen = 224 * 1024 * 1024; 1142 case SNB_GMCH_GMS_STOLEN_352M:
1009 break; 1143 stolen = 352 * 1024 * 1024;
1010 case INTEL_GMCH_GMS_STOLEN_352M: 1144 break;
1011 stolen = 352 * 1024 * 1024; 1145 case SNB_GMCH_GMS_STOLEN_384M:
1012 break; 1146 stolen = 384 * 1024 * 1024;
1013 default: 1147 break;
1014 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n", 1148 case SNB_GMCH_GMS_STOLEN_416M:
1015 tmp & INTEL_GMCH_GMS_MASK); 1149 stolen = 416 * 1024 * 1024;
1016 return -1; 1150 break;
1151 case SNB_GMCH_GMS_STOLEN_448M:
1152 stolen = 448 * 1024 * 1024;
1153 break;
1154 case SNB_GMCH_GMS_STOLEN_480M:
1155 stolen = 480 * 1024 * 1024;
1156 break;
1157 case SNB_GMCH_GMS_STOLEN_512M:
1158 stolen = 512 * 1024 * 1024;
1159 break;
1160 default:
1161 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
1162 tmp & SNB_GMCH_GMS_STOLEN_MASK);
1163 return -1;
1164 }
1165 } else {
1166 switch (tmp & INTEL_GMCH_GMS_MASK) {
1167 case INTEL_855_GMCH_GMS_DISABLED:
1168 DRM_ERROR("video memory is disabled\n");
1169 return -1;
1170 case INTEL_855_GMCH_GMS_STOLEN_1M:
1171 stolen = 1 * 1024 * 1024;
1172 break;
1173 case INTEL_855_GMCH_GMS_STOLEN_4M:
1174 stolen = 4 * 1024 * 1024;
1175 break;
1176 case INTEL_855_GMCH_GMS_STOLEN_8M:
1177 stolen = 8 * 1024 * 1024;
1178 break;
1179 case INTEL_855_GMCH_GMS_STOLEN_16M:
1180 stolen = 16 * 1024 * 1024;
1181 break;
1182 case INTEL_855_GMCH_GMS_STOLEN_32M:
1183 stolen = 32 * 1024 * 1024;
1184 break;
1185 case INTEL_915G_GMCH_GMS_STOLEN_48M:
1186 stolen = 48 * 1024 * 1024;
1187 break;
1188 case INTEL_915G_GMCH_GMS_STOLEN_64M:
1189 stolen = 64 * 1024 * 1024;
1190 break;
1191 case INTEL_GMCH_GMS_STOLEN_128M:
1192 stolen = 128 * 1024 * 1024;
1193 break;
1194 case INTEL_GMCH_GMS_STOLEN_256M:
1195 stolen = 256 * 1024 * 1024;
1196 break;
1197 case INTEL_GMCH_GMS_STOLEN_96M:
1198 stolen = 96 * 1024 * 1024;
1199 break;
1200 case INTEL_GMCH_GMS_STOLEN_160M:
1201 stolen = 160 * 1024 * 1024;
1202 break;
1203 case INTEL_GMCH_GMS_STOLEN_224M:
1204 stolen = 224 * 1024 * 1024;
1205 break;
1206 case INTEL_GMCH_GMS_STOLEN_352M:
1207 stolen = 352 * 1024 * 1024;
1208 break;
1209 default:
1210 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
1211 tmp & INTEL_GMCH_GMS_MASK);
1212 return -1;
1213 }
1017 } 1214 }
1215
1018 *preallocated_size = stolen - overhead; 1216 *preallocated_size = stolen - overhead;
1019 *start = overhead; 1217 *start = overhead;
1020 1218
@@ -1048,7 +1246,7 @@ static unsigned long i915_gtt_to_phys(struct drm_device *dev,
1048 int gtt_offset, gtt_size; 1246 int gtt_offset, gtt_size;
1049 1247
1050 if (IS_I965G(dev)) { 1248 if (IS_I965G(dev)) {
1051 if (IS_G4X(dev) || IS_IGDNG(dev)) { 1249 if (IS_G4X(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) {
1052 gtt_offset = 2*1024*1024; 1250 gtt_offset = 2*1024*1024;
1053 gtt_size = 2*1024*1024; 1251 gtt_size = 2*1024*1024;
1054 } else { 1252 } else {
@@ -1070,7 +1268,7 @@ static unsigned long i915_gtt_to_phys(struct drm_device *dev,
1070 1268
1071 entry = *(volatile u32 *)(gtt + (gtt_addr / 1024)); 1269 entry = *(volatile u32 *)(gtt + (gtt_addr / 1024));
1072 1270
1073 DRM_DEBUG("GTT addr: 0x%08lx, PTE: 0x%08lx\n", gtt_addr, entry); 1271 DRM_DEBUG_DRIVER("GTT addr: 0x%08lx, PTE: 0x%08lx\n", gtt_addr, entry);
1074 1272
1075 /* Mask out these reserved bits on this hardware. */ 1273 /* Mask out these reserved bits on this hardware. */
1076 if (!IS_I9XX(dev) || IS_I915G(dev) || IS_I915GM(dev) || 1274 if (!IS_I9XX(dev) || IS_I915G(dev) || IS_I915GM(dev) ||
@@ -1096,7 +1294,7 @@ static unsigned long i915_gtt_to_phys(struct drm_device *dev,
1096 phys =(entry & PTE_ADDRESS_MASK) | 1294 phys =(entry & PTE_ADDRESS_MASK) |
1097 ((uint64_t)(entry & PTE_ADDRESS_MASK_HIGH) << (32 - 4)); 1295 ((uint64_t)(entry & PTE_ADDRESS_MASK_HIGH) << (32 - 4));
1098 1296
1099 DRM_DEBUG("GTT addr: 0x%08lx, phys addr: 0x%08lx\n", gtt_addr, phys); 1297 DRM_DEBUG_DRIVER("GTT addr: 0x%08lx, phys addr: 0x%08lx\n", gtt_addr, phys);
1100 1298
1101 return phys; 1299 return phys;
1102} 1300}
@@ -1111,11 +1309,13 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1111{ 1309{
1112 struct drm_i915_private *dev_priv = dev->dev_private; 1310 struct drm_i915_private *dev_priv = dev->dev_private;
1113 struct drm_mm_node *compressed_fb, *compressed_llb; 1311 struct drm_mm_node *compressed_fb, *compressed_llb;
1114 unsigned long cfb_base, ll_base; 1312 unsigned long cfb_base;
1313 unsigned long ll_base = 0;
1115 1314
1116 /* Leave 1M for line length buffer & misc. */ 1315 /* Leave 1M for line length buffer & misc. */
1117 compressed_fb = drm_mm_search_free(&dev_priv->vram, size, 4096, 0); 1316 compressed_fb = drm_mm_search_free(&dev_priv->vram, size, 4096, 0);
1118 if (!compressed_fb) { 1317 if (!compressed_fb) {
1318 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1119 i915_warn_stolen(dev); 1319 i915_warn_stolen(dev);
1120 return; 1320 return;
1121 } 1321 }
@@ -1123,6 +1323,7 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1123 compressed_fb = drm_mm_get_block(compressed_fb, size, 4096); 1323 compressed_fb = drm_mm_get_block(compressed_fb, size, 4096);
1124 if (!compressed_fb) { 1324 if (!compressed_fb) {
1125 i915_warn_stolen(dev); 1325 i915_warn_stolen(dev);
1326 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1126 return; 1327 return;
1127 } 1328 }
1128 1329
@@ -1156,6 +1357,8 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1156 1357
1157 dev_priv->cfb_size = size; 1358 dev_priv->cfb_size = size;
1158 1359
1360 dev_priv->compressed_fb = compressed_fb;
1361
1159 if (IS_GM45(dev)) { 1362 if (IS_GM45(dev)) {
1160 g4x_disable_fbc(dev); 1363 g4x_disable_fbc(dev);
1161 I915_WRITE(DPFC_CB_BASE, compressed_fb->start); 1364 I915_WRITE(DPFC_CB_BASE, compressed_fb->start);
@@ -1163,12 +1366,22 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1163 i8xx_disable_fbc(dev); 1366 i8xx_disable_fbc(dev);
1164 I915_WRITE(FBC_CFB_BASE, cfb_base); 1367 I915_WRITE(FBC_CFB_BASE, cfb_base);
1165 I915_WRITE(FBC_LL_BASE, ll_base); 1368 I915_WRITE(FBC_LL_BASE, ll_base);
1369 dev_priv->compressed_llb = compressed_llb;
1166 } 1370 }
1167 1371
1168 DRM_DEBUG("FBC base 0x%08lx, ll base 0x%08lx, size %dM\n", cfb_base, 1372 DRM_DEBUG("FBC base 0x%08lx, ll base 0x%08lx, size %dM\n", cfb_base,
1169 ll_base, size >> 20); 1373 ll_base, size >> 20);
1170} 1374}
1171 1375
1376static void i915_cleanup_compression(struct drm_device *dev)
1377{
1378 struct drm_i915_private *dev_priv = dev->dev_private;
1379
1380 drm_mm_put_block(dev_priv->compressed_fb);
1381 if (!IS_GM45(dev))
1382 drm_mm_put_block(dev_priv->compressed_llb);
1383}
1384
1172/* true = enable decode, false = disable decoder */ 1385/* true = enable decode, false = disable decoder */
1173static unsigned int i915_vga_set_decode(void *cookie, bool state) 1386static unsigned int i915_vga_set_decode(void *cookie, bool state)
1174{ 1387{
@@ -1182,6 +1395,32 @@ static unsigned int i915_vga_set_decode(void *cookie, bool state)
1182 return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; 1395 return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1183} 1396}
1184 1397
1398static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
1399{
1400 struct drm_device *dev = pci_get_drvdata(pdev);
1401 pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
1402 if (state == VGA_SWITCHEROO_ON) {
1403 printk(KERN_INFO "i915: switched off\n");
1404 /* i915 resume handler doesn't set to D0 */
1405 pci_set_power_state(dev->pdev, PCI_D0);
1406 i915_resume(dev);
1407 } else {
1408 printk(KERN_ERR "i915: switched off\n");
1409 i915_suspend(dev, pmm);
1410 }
1411}
1412
1413static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
1414{
1415 struct drm_device *dev = pci_get_drvdata(pdev);
1416 bool can_switch;
1417
1418 spin_lock(&dev->count_lock);
1419 can_switch = (dev->open_count == 0);
1420 spin_unlock(&dev->count_lock);
1421 return can_switch;
1422}
1423
1185static int i915_load_modeset_init(struct drm_device *dev, 1424static int i915_load_modeset_init(struct drm_device *dev,
1186 unsigned long prealloc_start, 1425 unsigned long prealloc_start,
1187 unsigned long prealloc_size, 1426 unsigned long prealloc_size,
@@ -1194,14 +1433,6 @@ static int i915_load_modeset_init(struct drm_device *dev,
1194 dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) & 1433 dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) &
1195 0xff000000; 1434 0xff000000;
1196 1435
1197 if (IS_MOBILE(dev) || IS_I9XX(dev))
1198 dev_priv->cursor_needs_physical = true;
1199 else
1200 dev_priv->cursor_needs_physical = false;
1201
1202 if (IS_I965G(dev) || IS_G33(dev))
1203 dev_priv->cursor_needs_physical = false;
1204
1205 /* Basic memrange allocator for stolen space (aka vram) */ 1436 /* Basic memrange allocator for stolen space (aka vram) */
1206 drm_mm_init(&dev_priv->vram, 0, prealloc_size); 1437 drm_mm_init(&dev_priv->vram, 0, prealloc_size);
1207 DRM_INFO("set up %ldM of stolen space\n", prealloc_size / (1024*1024)); 1438 DRM_INFO("set up %ldM of stolen space\n", prealloc_size / (1024*1024));
@@ -1251,6 +1482,14 @@ static int i915_load_modeset_init(struct drm_device *dev,
1251 if (ret) 1482 if (ret)
1252 goto destroy_ringbuffer; 1483 goto destroy_ringbuffer;
1253 1484
1485 ret = vga_switcheroo_register_client(dev->pdev,
1486 i915_switcheroo_set_state,
1487 i915_switcheroo_can_switch);
1488 if (ret)
1489 goto destroy_ringbuffer;
1490
1491 intel_modeset_init(dev);
1492
1254 ret = drm_irq_install(dev); 1493 ret = drm_irq_install(dev);
1255 if (ret) 1494 if (ret)
1256 goto destroy_ringbuffer; 1495 goto destroy_ringbuffer;
@@ -1265,14 +1504,14 @@ static int i915_load_modeset_init(struct drm_device *dev,
1265 1504
1266 I915_WRITE(INSTPM, (1 << 5) | (1 << 21)); 1505 I915_WRITE(INSTPM, (1 << 5) | (1 << 21));
1267 1506
1268 intel_modeset_init(dev);
1269
1270 drm_helper_initial_config(dev); 1507 drm_helper_initial_config(dev);
1271 1508
1272 return 0; 1509 return 0;
1273 1510
1274destroy_ringbuffer: 1511destroy_ringbuffer:
1512 mutex_lock(&dev->struct_mutex);
1275 i915_gem_cleanup_ringbuffer(dev); 1513 i915_gem_cleanup_ringbuffer(dev);
1514 mutex_unlock(&dev->struct_mutex);
1276out: 1515out:
1277 return ret; 1516 return ret;
1278} 1517}
@@ -1306,7 +1545,7 @@ static void i915_get_mem_freq(struct drm_device *dev)
1306 drm_i915_private_t *dev_priv = dev->dev_private; 1545 drm_i915_private_t *dev_priv = dev->dev_private;
1307 u32 tmp; 1546 u32 tmp;
1308 1547
1309 if (!IS_IGD(dev)) 1548 if (!IS_PINEVIEW(dev))
1310 return; 1549 return;
1311 1550
1312 tmp = I915_READ(CLKCFG); 1551 tmp = I915_READ(CLKCFG);
@@ -1354,7 +1593,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1354{ 1593{
1355 struct drm_i915_private *dev_priv = dev->dev_private; 1594 struct drm_i915_private *dev_priv = dev->dev_private;
1356 resource_size_t base, size; 1595 resource_size_t base, size;
1357 int ret = 0, mmio_bar = IS_I9XX(dev) ? 0 : 1; 1596 int ret = 0, mmio_bar;
1358 uint32_t agp_size, prealloc_size, prealloc_start; 1597 uint32_t agp_size, prealloc_size, prealloc_start;
1359 1598
1360 /* i915 has 4 more counters */ 1599 /* i915 has 4 more counters */
@@ -1370,8 +1609,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1370 1609
1371 dev->dev_private = (void *)dev_priv; 1610 dev->dev_private = (void *)dev_priv;
1372 dev_priv->dev = dev; 1611 dev_priv->dev = dev;
1612 dev_priv->info = (struct intel_device_info *) flags;
1373 1613
1374 /* Add register map (needed for suspend/resume) */ 1614 /* Add register map (needed for suspend/resume) */
1615 mmio_bar = IS_I9XX(dev) ? 0 : 1;
1375 base = drm_get_resource_start(dev, mmio_bar); 1616 base = drm_get_resource_start(dev, mmio_bar);
1376 size = drm_get_resource_len(dev, mmio_bar); 1617 size = drm_get_resource_len(dev, mmio_bar);
1377 1618
@@ -1413,7 +1654,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1413 if (ret) 1654 if (ret)
1414 goto out_iomapfree; 1655 goto out_iomapfree;
1415 1656
1416 dev_priv->wq = create_workqueue("i915"); 1657 dev_priv->wq = create_singlethread_workqueue("i915");
1417 if (dev_priv->wq == NULL) { 1658 if (dev_priv->wq == NULL) {
1418 DRM_ERROR("Failed to create our workqueue.\n"); 1659 DRM_ERROR("Failed to create our workqueue.\n");
1419 ret = -ENOMEM; 1660 ret = -ENOMEM;
@@ -1434,11 +1675,14 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1434 1675
1435 dev->driver->get_vblank_counter = i915_get_vblank_counter; 1676 dev->driver->get_vblank_counter = i915_get_vblank_counter;
1436 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ 1677 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
1437 if (IS_G4X(dev) || IS_IGDNG(dev)) { 1678 if (IS_G4X(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) {
1438 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ 1679 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
1439 dev->driver->get_vblank_counter = gm45_get_vblank_counter; 1680 dev->driver->get_vblank_counter = gm45_get_vblank_counter;
1440 } 1681 }
1441 1682
1683 /* Try to make sure MCHBAR is enabled before poking at it */
1684 intel_setup_mchbar(dev);
1685
1442 i915_gem_load(dev); 1686 i915_gem_load(dev);
1443 1687
1444 /* Init HWS */ 1688 /* Init HWS */
@@ -1489,9 +1733,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1489 } 1733 }
1490 1734
1491 /* Must be done after probing outputs */ 1735 /* Must be done after probing outputs */
1492 /* FIXME: verify on IGDNG */ 1736 intel_opregion_init(dev, 0);
1493 if (!IS_IGDNG(dev))
1494 intel_opregion_init(dev, 0);
1495 1737
1496 setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed, 1738 setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed,
1497 (unsigned long) dev); 1739 (unsigned long) dev);
@@ -1514,6 +1756,8 @@ int i915_driver_unload(struct drm_device *dev)
1514{ 1756{
1515 struct drm_i915_private *dev_priv = dev->dev_private; 1757 struct drm_i915_private *dev_priv = dev->dev_private;
1516 1758
1759 i915_destroy_error_state(dev);
1760
1517 destroy_workqueue(dev_priv->wq); 1761 destroy_workqueue(dev_priv->wq);
1518 del_timer_sync(&dev_priv->hangcheck_timer); 1762 del_timer_sync(&dev_priv->hangcheck_timer);
1519 1763
@@ -1525,7 +1769,17 @@ int i915_driver_unload(struct drm_device *dev)
1525 } 1769 }
1526 1770
1527 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1771 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1772 /*
1773 * free the memory space allocated for the child device
1774 * config parsed from VBT
1775 */
1776 if (dev_priv->child_dev && dev_priv->child_dev_num) {
1777 kfree(dev_priv->child_dev);
1778 dev_priv->child_dev = NULL;
1779 dev_priv->child_dev_num = 0;
1780 }
1528 drm_irq_uninstall(dev); 1781 drm_irq_uninstall(dev);
1782 vga_switcheroo_unregister_client(dev->pdev);
1529 vga_client_register(dev->pdev, NULL, NULL, NULL); 1783 vga_client_register(dev->pdev, NULL, NULL, NULL);
1530 } 1784 }
1531 1785
@@ -1535,8 +1789,7 @@ int i915_driver_unload(struct drm_device *dev)
1535 if (dev_priv->regs != NULL) 1789 if (dev_priv->regs != NULL)
1536 iounmap(dev_priv->regs); 1790 iounmap(dev_priv->regs);
1537 1791
1538 if (!IS_IGDNG(dev)) 1792 intel_opregion_free(dev, 0);
1539 intel_opregion_free(dev, 0);
1540 1793
1541 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1794 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1542 intel_modeset_cleanup(dev); 1795 intel_modeset_cleanup(dev);
@@ -1546,10 +1799,16 @@ int i915_driver_unload(struct drm_device *dev)
1546 mutex_lock(&dev->struct_mutex); 1799 mutex_lock(&dev->struct_mutex);
1547 i915_gem_cleanup_ringbuffer(dev); 1800 i915_gem_cleanup_ringbuffer(dev);
1548 mutex_unlock(&dev->struct_mutex); 1801 mutex_unlock(&dev->struct_mutex);
1802 if (I915_HAS_FBC(dev) && i915_powersave)
1803 i915_cleanup_compression(dev);
1549 drm_mm_takedown(&dev_priv->vram); 1804 drm_mm_takedown(&dev_priv->vram);
1550 i915_gem_lastclose(dev); 1805 i915_gem_lastclose(dev);
1806
1807 intel_cleanup_overlay(dev);
1551 } 1808 }
1552 1809
1810 intel_teardown_mchbar(dev);
1811
1553 pci_dev_put(dev_priv->bridge_dev); 1812 pci_dev_put(dev_priv->bridge_dev);
1554 kfree(dev->dev_private); 1813 kfree(dev->dev_private);
1555 1814
@@ -1592,6 +1851,7 @@ void i915_driver_lastclose(struct drm_device * dev)
1592 1851
1593 if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) { 1852 if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) {
1594 drm_fb_helper_restore(); 1853 drm_fb_helper_restore();
1854 vga_switcheroo_process_delayed_switch();
1595 return; 1855 return;
1596 } 1856 }
1597 1857
@@ -1636,26 +1896,29 @@ struct drm_ioctl_desc i915_ioctls[] = {
1636 DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE, i915_vblank_pipe_get, DRM_AUTH ), 1896 DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE, i915_vblank_pipe_get, DRM_AUTH ),
1637 DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH), 1897 DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
1638 DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1898 DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1639 DRM_IOCTL_DEF(DRM_I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1899 DRM_IOCTL_DEF(DRM_I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1640 DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH), 1900 DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH|DRM_UNLOCKED),
1641 DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY), 1901 DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER2, i915_gem_execbuffer2, DRM_AUTH|DRM_UNLOCKED),
1642 DRM_IOCTL_DEF(DRM_I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY), 1902 DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),
1643 DRM_IOCTL_DEF(DRM_I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH), 1903 DRM_IOCTL_DEF(DRM_I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),
1644 DRM_IOCTL_DEF(DRM_I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH), 1904 DRM_IOCTL_DEF(DRM_I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED),
1645 DRM_IOCTL_DEF(DRM_I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1905 DRM_IOCTL_DEF(DRM_I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH|DRM_UNLOCKED),
1646 DRM_IOCTL_DEF(DRM_I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1906 DRM_IOCTL_DEF(DRM_I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1647 DRM_IOCTL_DEF(DRM_I915_GEM_CREATE, i915_gem_create_ioctl, 0), 1907 DRM_IOCTL_DEF(DRM_I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1648 DRM_IOCTL_DEF(DRM_I915_GEM_PREAD, i915_gem_pread_ioctl, 0), 1908 DRM_IOCTL_DEF(DRM_I915_GEM_CREATE, i915_gem_create_ioctl, DRM_UNLOCKED),
1649 DRM_IOCTL_DEF(DRM_I915_GEM_PWRITE, i915_gem_pwrite_ioctl, 0), 1909 DRM_IOCTL_DEF(DRM_I915_GEM_PREAD, i915_gem_pread_ioctl, DRM_UNLOCKED),
1650 DRM_IOCTL_DEF(DRM_I915_GEM_MMAP, i915_gem_mmap_ioctl, 0), 1910 DRM_IOCTL_DEF(DRM_I915_GEM_PWRITE, i915_gem_pwrite_ioctl, DRM_UNLOCKED),
1651 DRM_IOCTL_DEF(DRM_I915_GEM_MMAP_GTT, i915_gem_mmap_gtt_ioctl, 0), 1911 DRM_IOCTL_DEF(DRM_I915_GEM_MMAP, i915_gem_mmap_ioctl, DRM_UNLOCKED),
1652 DRM_IOCTL_DEF(DRM_I915_GEM_SET_DOMAIN, i915_gem_set_domain_ioctl, 0), 1912 DRM_IOCTL_DEF(DRM_I915_GEM_MMAP_GTT, i915_gem_mmap_gtt_ioctl, DRM_UNLOCKED),
1653 DRM_IOCTL_DEF(DRM_I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, 0), 1913 DRM_IOCTL_DEF(DRM_I915_GEM_SET_DOMAIN, i915_gem_set_domain_ioctl, DRM_UNLOCKED),
1654 DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, 0), 1914 DRM_IOCTL_DEF(DRM_I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, DRM_UNLOCKED),
1655 DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, 0), 1915 DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, DRM_UNLOCKED),
1656 DRM_IOCTL_DEF(DRM_I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, 0), 1916 DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, DRM_UNLOCKED),
1657 DRM_IOCTL_DEF(DRM_I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, 0), 1917 DRM_IOCTL_DEF(DRM_I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, DRM_UNLOCKED),
1658 DRM_IOCTL_DEF(DRM_I915_GEM_MADVISE, i915_gem_madvise_ioctl, 0), 1918 DRM_IOCTL_DEF(DRM_I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, DRM_UNLOCKED),
1919 DRM_IOCTL_DEF(DRM_I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_UNLOCKED),
1920 DRM_IOCTL_DEF(DRM_I915_OVERLAY_PUT_IMAGE, intel_overlay_put_image, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1921 DRM_IOCTL_DEF(DRM_I915_OVERLAY_ATTRS, intel_overlay_attrs, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1659}; 1922};
1660 1923
1661int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); 1924int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);