diff options
-rw-r--r-- | drivers/char/agp/intel-gtt.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 190 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 7 | ||||
-rw-r--r-- | include/drm/intel-gtt.h | 2 |
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 | } |
1715 | EXPORT_SYMBOL(intel_gmch_probe); | 1715 | EXPORT_SYMBOL(intel_gmch_probe); |
1716 | 1716 | ||
1717 | struct intel_gtt *intel_gtt_get(void) | ||
1718 | { | ||
1719 | return &intel_private.base; | ||
1720 | } | ||
1721 | EXPORT_SYMBOL(intel_gtt_get); | ||
1722 | |||
1717 | void intel_gmch_remove(struct pci_dev *pdev) | 1723 | void 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 | */ | ||
1002 | static 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 | ||
17 | struct intel_gtt *intel_gtt_get(void); | ||
18 | |||
17 | #endif | 19 | #endif |
18 | 20 | ||