aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/agp/intel-gtt.c6
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c190
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h7
-rw-r--r--include/drm/intel-gtt.h2
4 files changed, 25 insertions, 180 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index 6eb64c19af0e..9cb7c98afb9c 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -1714,6 +1714,12 @@ int intel_gmch_probe(struct pci_dev *pdev,
1714} 1714}
1715EXPORT_SYMBOL(intel_gmch_probe); 1715EXPORT_SYMBOL(intel_gmch_probe);
1716 1716
1717struct intel_gtt *intel_gtt_get(void)
1718{
1719 return &intel_private.base;
1720}
1721EXPORT_SYMBOL(intel_gtt_get);
1722
1717void intel_gmch_remove(struct pci_dev *pdev) 1723void intel_gmch_remove(struct pci_dev *pdev)
1718{ 1724{
1719 if (intel_private.pcidev) 1725 if (intel_private.pcidev)
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index a693b27f3df4..428c75b466aa 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -989,172 +989,6 @@ intel_teardown_mchbar(struct drm_device *dev)
989 release_resource(&dev_priv->mch_res); 989 release_resource(&dev_priv->mch_res);
990} 990}
991 991
992/**
993 * i915_probe_agp - get AGP bootup configuration
994 * @pdev: PCI device
995 * @aperture_size: returns AGP aperture configured size
996 * @preallocated_size: returns size of BIOS preallocated AGP space
997 *
998 * Since Intel integrated graphics are UMA, the BIOS has to set aside
999 * some RAM for the framebuffer at early boot. This code figures out
1000 * how much was set aside so we can use it for our own purposes.
1001 */
1002static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size,
1003 uint32_t *preallocated_size)
1004{
1005 struct drm_i915_private *dev_priv = dev->dev_private;
1006 u16 tmp = 0;
1007 unsigned long overhead;
1008 unsigned long stolen;
1009
1010 /* Get the fb aperture size and "stolen" memory amount. */
1011 pci_read_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, &tmp);
1012
1013 *aperture_size = 1024 * 1024;
1014 *preallocated_size = 1024 * 1024;
1015
1016 switch (dev->pdev->device) {
1017 case PCI_DEVICE_ID_INTEL_82830_CGC:
1018 case PCI_DEVICE_ID_INTEL_82845G_IG:
1019 case PCI_DEVICE_ID_INTEL_82855GM_IG:
1020 case PCI_DEVICE_ID_INTEL_82865_IG:
1021 if ((tmp & INTEL_GMCH_MEM_MASK) == INTEL_GMCH_MEM_64M)
1022 *aperture_size *= 64;
1023 else
1024 *aperture_size *= 128;
1025 break;
1026 default:
1027 /* 9xx supports large sizes, just look at the length */
1028 *aperture_size = pci_resource_len(dev->pdev, 2);
1029 break;
1030 }
1031
1032 /*
1033 * Some of the preallocated space is taken by the GTT
1034 * and popup. GTT is 1K per MB of aperture size, and popup is 4K.
1035 */
1036 if (IS_G4X(dev) || IS_PINEVIEW(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev))
1037 overhead = 4096;
1038 else
1039 overhead = (*aperture_size / 1024) + 4096;
1040
1041 if (IS_GEN6(dev)) {
1042 /* SNB has memory control reg at 0x50.w */
1043 pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &tmp);
1044
1045 switch (tmp & SNB_GMCH_GMS_STOLEN_MASK) {
1046 case INTEL_855_GMCH_GMS_DISABLED:
1047 DRM_ERROR("video memory is disabled\n");
1048 return -1;
1049 case SNB_GMCH_GMS_STOLEN_32M:
1050 stolen = 32 * 1024 * 1024;
1051 break;
1052 case SNB_GMCH_GMS_STOLEN_64M:
1053 stolen = 64 * 1024 * 1024;
1054 break;
1055 case SNB_GMCH_GMS_STOLEN_96M:
1056 stolen = 96 * 1024 * 1024;
1057 break;
1058 case SNB_GMCH_GMS_STOLEN_128M:
1059 stolen = 128 * 1024 * 1024;
1060 break;
1061 case SNB_GMCH_GMS_STOLEN_160M:
1062 stolen = 160 * 1024 * 1024;
1063 break;
1064 case SNB_GMCH_GMS_STOLEN_192M:
1065 stolen = 192 * 1024 * 1024;
1066 break;
1067 case SNB_GMCH_GMS_STOLEN_224M:
1068 stolen = 224 * 1024 * 1024;
1069 break;
1070 case SNB_GMCH_GMS_STOLEN_256M:
1071 stolen = 256 * 1024 * 1024;
1072 break;
1073 case SNB_GMCH_GMS_STOLEN_288M:
1074 stolen = 288 * 1024 * 1024;
1075 break;
1076 case SNB_GMCH_GMS_STOLEN_320M:
1077 stolen = 320 * 1024 * 1024;
1078 break;
1079 case SNB_GMCH_GMS_STOLEN_352M:
1080 stolen = 352 * 1024 * 1024;
1081 break;
1082 case SNB_GMCH_GMS_STOLEN_384M:
1083 stolen = 384 * 1024 * 1024;
1084 break;
1085 case SNB_GMCH_GMS_STOLEN_416M:
1086 stolen = 416 * 1024 * 1024;
1087 break;
1088 case SNB_GMCH_GMS_STOLEN_448M:
1089 stolen = 448 * 1024 * 1024;
1090 break;
1091 case SNB_GMCH_GMS_STOLEN_480M:
1092 stolen = 480 * 1024 * 1024;
1093 break;
1094 case SNB_GMCH_GMS_STOLEN_512M:
1095 stolen = 512 * 1024 * 1024;
1096 break;
1097 default:
1098 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
1099 tmp & SNB_GMCH_GMS_STOLEN_MASK);
1100 return -1;
1101 }
1102 } else {
1103 switch (tmp & INTEL_GMCH_GMS_MASK) {
1104 case INTEL_855_GMCH_GMS_DISABLED:
1105 DRM_ERROR("video memory is disabled\n");
1106 return -1;
1107 case INTEL_855_GMCH_GMS_STOLEN_1M:
1108 stolen = 1 * 1024 * 1024;
1109 break;
1110 case INTEL_855_GMCH_GMS_STOLEN_4M:
1111 stolen = 4 * 1024 * 1024;
1112 break;
1113 case INTEL_855_GMCH_GMS_STOLEN_8M:
1114 stolen = 8 * 1024 * 1024;
1115 break;
1116 case INTEL_855_GMCH_GMS_STOLEN_16M:
1117 stolen = 16 * 1024 * 1024;
1118 break;
1119 case INTEL_855_GMCH_GMS_STOLEN_32M:
1120 stolen = 32 * 1024 * 1024;
1121 break;
1122 case INTEL_915G_GMCH_GMS_STOLEN_48M:
1123 stolen = 48 * 1024 * 1024;
1124 break;
1125 case INTEL_915G_GMCH_GMS_STOLEN_64M:
1126 stolen = 64 * 1024 * 1024;
1127 break;
1128 case INTEL_GMCH_GMS_STOLEN_128M:
1129 stolen = 128 * 1024 * 1024;
1130 break;
1131 case INTEL_GMCH_GMS_STOLEN_256M:
1132 stolen = 256 * 1024 * 1024;
1133 break;
1134 case INTEL_GMCH_GMS_STOLEN_96M:
1135 stolen = 96 * 1024 * 1024;
1136 break;
1137 case INTEL_GMCH_GMS_STOLEN_160M:
1138 stolen = 160 * 1024 * 1024;
1139 break;
1140 case INTEL_GMCH_GMS_STOLEN_224M:
1141 stolen = 224 * 1024 * 1024;
1142 break;
1143 case INTEL_GMCH_GMS_STOLEN_352M:
1144 stolen = 352 * 1024 * 1024;
1145 break;
1146 default:
1147 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
1148 tmp & INTEL_GMCH_GMS_MASK);
1149 return -1;
1150 }
1151 }
1152
1153 *preallocated_size = stolen - overhead;
1154
1155 return 0;
1156}
1157
1158#define PTE_ADDRESS_MASK 0xfffff000 992#define PTE_ADDRESS_MASK 0xfffff000
1159#define PTE_ADDRESS_MASK_HIGH 0x000000f0 /* i915+ */ 993#define PTE_ADDRESS_MASK_HIGH 0x000000f0 /* i915+ */
1160#define PTE_MAPPING_TYPE_UNCACHED (0 << 1) 994#define PTE_MAPPING_TYPE_UNCACHED (0 << 1)
@@ -1249,7 +1083,7 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1249 unsigned long ll_base = 0; 1083 unsigned long ll_base = 0;
1250 1084
1251 /* Leave 1M for line length buffer & misc. */ 1085 /* Leave 1M for line length buffer & misc. */
1252 compressed_fb = drm_mm_search_free(&dev_priv->vram, size, 4096, 0); 1086 compressed_fb = drm_mm_search_free(&dev_priv->mm.vram, size, 4096, 0);
1253 if (!compressed_fb) { 1087 if (!compressed_fb) {
1254 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL; 1088 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1255 i915_warn_stolen(dev); 1089 i915_warn_stolen(dev);
@@ -1270,7 +1104,7 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1270 } 1104 }
1271 1105
1272 if (!(IS_GM45(dev) || IS_IRONLAKE_M(dev))) { 1106 if (!(IS_GM45(dev) || IS_IRONLAKE_M(dev))) {
1273 compressed_llb = drm_mm_search_free(&dev_priv->vram, 4096, 1107 compressed_llb = drm_mm_search_free(&dev_priv->mm.vram, 4096,
1274 4096, 0); 1108 4096, 0);
1275 if (!compressed_llb) { 1109 if (!compressed_llb) {
1276 i915_warn_stolen(dev); 1110 i915_warn_stolen(dev);
@@ -1366,8 +1200,8 @@ static int i915_load_modeset_init(struct drm_device *dev,
1366 struct drm_i915_private *dev_priv = dev->dev_private; 1200 struct drm_i915_private *dev_priv = dev->dev_private;
1367 int ret = 0; 1201 int ret = 0;
1368 1202
1369 /* Basic memrange allocator for stolen space (aka vram) */ 1203 /* Basic memrange allocator for stolen space (aka mm.vram) */
1370 drm_mm_init(&dev_priv->vram, 0, prealloc_size); 1204 drm_mm_init(&dev_priv->mm.vram, 0, prealloc_size);
1371 DRM_INFO("set up %ldM of stolen space\n", prealloc_size / (1024*1024)); 1205 DRM_INFO("set up %ldM of stolen space\n", prealloc_size / (1024*1024));
1372 1206
1373 /* We're off and running w/KMS */ 1207 /* We're off and running w/KMS */
@@ -2107,16 +1941,16 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2107 "performance may suffer.\n"); 1941 "performance may suffer.\n");
2108 } 1942 }
2109 1943
2110 ret = i915_probe_agp(dev, &agp_size, &prealloc_size); 1944 dev_priv->mm.gtt = intel_gtt_get();
2111 if (ret) 1945 if (!dev_priv->mm.gtt) {
1946 DRM_ERROR("Failed to initialize GTT\n");
1947 ret = -ENODEV;
2112 goto out_iomapfree; 1948 goto out_iomapfree;
2113
2114 if (prealloc_size > intel_max_stolen) {
2115 DRM_INFO("detected %dM stolen memory, trimming to %dM\n",
2116 prealloc_size >> 20, intel_max_stolen >> 20);
2117 prealloc_size = intel_max_stolen;
2118 } 1949 }
2119 1950
1951 prealloc_size = dev_priv->mm.gtt->gtt_stolen_entries << PAGE_SHIFT;
1952 agp_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
1953
2120 dev_priv->wq = create_singlethread_workqueue("i915"); 1954 dev_priv->wq = create_singlethread_workqueue("i915");
2121 if (dev_priv->wq == NULL) { 1955 if (dev_priv->wq == NULL) {
2122 DRM_ERROR("Failed to create our workqueue.\n"); 1956 DRM_ERROR("Failed to create our workqueue.\n");
@@ -2301,7 +2135,7 @@ int i915_driver_unload(struct drm_device *dev)
2301 mutex_unlock(&dev->struct_mutex); 2135 mutex_unlock(&dev->struct_mutex);
2302 if (I915_HAS_FBC(dev) && i915_powersave) 2136 if (I915_HAS_FBC(dev) && i915_powersave)
2303 i915_cleanup_compression(dev); 2137 i915_cleanup_compression(dev);
2304 drm_mm_takedown(&dev_priv->vram); 2138 drm_mm_takedown(&dev_priv->mm.vram);
2305 2139
2306 intel_cleanup_overlay(dev); 2140 intel_cleanup_overlay(dev);
2307 } 2141 }
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d825ef207b2c..c8b22005ec18 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -305,8 +305,6 @@ typedef struct drm_i915_private {
305 uint32_t last_instdone; 305 uint32_t last_instdone;
306 uint32_t last_instdone1; 306 uint32_t last_instdone1;
307 307
308 struct drm_mm vram;
309
310 unsigned long cfb_size; 308 unsigned long cfb_size;
311 unsigned long cfb_pitch; 309 unsigned long cfb_pitch;
312 int cfb_fence; 310 int cfb_fence;
@@ -511,6 +509,11 @@ typedef struct drm_i915_private {
511 u32 saveMCHBAR_RENDER_STANDBY; 509 u32 saveMCHBAR_RENDER_STANDBY;
512 510
513 struct { 511 struct {
512 /** Bridge to intel-gtt-ko */
513 struct intel_gtt *gtt;
514 /** Memory allocator for GTT stolen memory */
515 struct drm_mm vram;
516 /** Memory allocator for GTT */
514 struct drm_mm gtt_space; 517 struct drm_mm gtt_space;
515 518
516 struct io_mapping *gtt_mapping; 519 struct io_mapping *gtt_mapping;
diff --git a/include/drm/intel-gtt.h b/include/drm/intel-gtt.h
index 6769cb704e9b..b3aa7ab72d09 100644
--- a/include/drm/intel-gtt.h
+++ b/include/drm/intel-gtt.h
@@ -14,5 +14,7 @@ struct intel_gtt {
14 unsigned int gtt_mappable_entries; 14 unsigned int gtt_mappable_entries;
15}; 15};
16 16
17struct intel_gtt *intel_gtt_get(void);
18
17#endif 19#endif
18 20