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.c64
1 files changed, 54 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 62a4bf7b49df..81f1cff56fd5 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -177,6 +177,14 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
177 drm_i915_private_t *dev_priv = dev->dev_private; 177 drm_i915_private_t *dev_priv = dev->dev_private;
178 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; 178 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
179 179
180 master_priv->sarea = drm_getsarea(dev);
181 if (master_priv->sarea) {
182 master_priv->sarea_priv = (drm_i915_sarea_t *)
183 ((u8 *)master_priv->sarea->handle + init->sarea_priv_offset);
184 } else {
185 DRM_DEBUG("sarea not found assuming DRI2 userspace\n");
186 }
187
180 if (init->ring_size != 0) { 188 if (init->ring_size != 0) {
181 if (dev_priv->ring.ring_obj != NULL) { 189 if (dev_priv->ring.ring_obj != NULL) {
182 i915_dma_cleanup(dev); 190 i915_dma_cleanup(dev);
@@ -723,8 +731,11 @@ static int i915_getparam(struct drm_device *dev, void *data,
723 case I915_PARAM_HAS_GEM: 731 case I915_PARAM_HAS_GEM:
724 value = dev_priv->has_gem; 732 value = dev_priv->has_gem;
725 break; 733 break;
734 case I915_PARAM_NUM_FENCES_AVAIL:
735 value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
736 break;
726 default: 737 default:
727 DRM_ERROR("Unknown parameter %d\n", param->param); 738 DRM_DEBUG("Unknown parameter %d\n", param->param);
728 return -EINVAL; 739 return -EINVAL;
729 } 740 }
730 741
@@ -756,8 +767,15 @@ static int i915_setparam(struct drm_device *dev, void *data,
756 case I915_SETPARAM_ALLOW_BATCHBUFFER: 767 case I915_SETPARAM_ALLOW_BATCHBUFFER:
757 dev_priv->allow_batchbuffer = param->value; 768 dev_priv->allow_batchbuffer = param->value;
758 break; 769 break;
770 case I915_SETPARAM_NUM_USED_FENCES:
771 if (param->value > dev_priv->num_fence_regs ||
772 param->value < 0)
773 return -EINVAL;
774 /* Userspace can use first N regs */
775 dev_priv->fence_reg_start = param->value;
776 break;
759 default: 777 default:
760 DRM_ERROR("unknown parameter %d\n", param->param); 778 DRM_DEBUG("unknown parameter %d\n", param->param);
761 return -EINVAL; 779 return -EINVAL;
762 } 780 }
763 781
@@ -936,13 +954,14 @@ static int i915_load_modeset_init(struct drm_device *dev)
936 dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) & 954 dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) &
937 0xff000000; 955 0xff000000;
938 956
939 DRM_DEBUG("*** fb base 0x%08lx\n", dev->mode_config.fb_base); 957 if (IS_MOBILE(dev) || IS_I9XX(dev))
940
941 if (IS_MOBILE(dev) || (IS_I9XX(dev) && !IS_I965G(dev) && !IS_G33(dev)))
942 dev_priv->cursor_needs_physical = true; 958 dev_priv->cursor_needs_physical = true;
943 else 959 else
944 dev_priv->cursor_needs_physical = false; 960 dev_priv->cursor_needs_physical = false;
945 961
962 if (IS_I965G(dev) || IS_G33(dev))
963 dev_priv->cursor_needs_physical = false;
964
946 ret = i915_probe_agp(dev, &agp_size, &prealloc_size); 965 ret = i915_probe_agp(dev, &agp_size, &prealloc_size);
947 if (ret) 966 if (ret)
948 goto kfree_devname; 967 goto kfree_devname;
@@ -957,10 +976,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
957 if (ret) 976 if (ret)
958 goto kfree_devname; 977 goto kfree_devname;
959 978
960 dev_priv->mm.gtt_mapping =
961 io_mapping_create_wc(dev->agp->base,
962 dev->agp->agp_info.aper_size * 1024*1024);
963
964 /* Allow hardware batchbuffers unless told otherwise. 979 /* Allow hardware batchbuffers unless told otherwise.
965 */ 980 */
966 dev_priv->allow_batchbuffer = 1; 981 dev_priv->allow_batchbuffer = 1;
@@ -1072,6 +1087,23 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1072 goto free_priv; 1087 goto free_priv;
1073 } 1088 }
1074 1089
1090 dev_priv->mm.gtt_mapping =
1091 io_mapping_create_wc(dev->agp->base,
1092 dev->agp->agp_info.aper_size * 1024*1024);
1093 /* Set up a WC MTRR for non-PAT systems. This is more common than
1094 * one would think, because the kernel disables PAT on first
1095 * generation Core chips because WC PAT gets overridden by a UC
1096 * MTRR if present. Even if a UC MTRR isn't present.
1097 */
1098 dev_priv->mm.gtt_mtrr = mtrr_add(dev->agp->base,
1099 dev->agp->agp_info.aper_size *
1100 1024 * 1024,
1101 MTRR_TYPE_WRCOMB, 1);
1102 if (dev_priv->mm.gtt_mtrr < 0) {
1103 DRM_INFO("MTRR allocation failed\n. Graphics "
1104 "performance may suffer.\n");
1105 }
1106
1075#ifdef CONFIG_HIGHMEM64G 1107#ifdef CONFIG_HIGHMEM64G
1076 /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */ 1108 /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */
1077 dev_priv->has_gem = 0; 1109 dev_priv->has_gem = 0;
@@ -1080,6 +1112,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1080 dev_priv->has_gem = 1; 1112 dev_priv->has_gem = 1;
1081#endif 1113#endif
1082 1114
1115 dev->driver->get_vblank_counter = i915_get_vblank_counter;
1116 if (IS_GM45(dev))
1117 dev->driver->get_vblank_counter = gm45_get_vblank_counter;
1118
1083 i915_gem_load(dev); 1119 i915_gem_load(dev);
1084 1120
1085 /* Init HWS */ 1121 /* Init HWS */
@@ -1136,8 +1172,14 @@ int i915_driver_unload(struct drm_device *dev)
1136{ 1172{
1137 struct drm_i915_private *dev_priv = dev->dev_private; 1173 struct drm_i915_private *dev_priv = dev->dev_private;
1138 1174
1175 io_mapping_free(dev_priv->mm.gtt_mapping);
1176 if (dev_priv->mm.gtt_mtrr >= 0) {
1177 mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
1178 dev->agp->agp_info.aper_size * 1024 * 1024);
1179 dev_priv->mm.gtt_mtrr = -1;
1180 }
1181
1139 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1182 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1140 io_mapping_free(dev_priv->mm.gtt_mapping);
1141 drm_irq_uninstall(dev); 1183 drm_irq_uninstall(dev);
1142 } 1184 }
1143 1185
@@ -1152,6 +1194,8 @@ int i915_driver_unload(struct drm_device *dev)
1152 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1194 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1153 intel_modeset_cleanup(dev); 1195 intel_modeset_cleanup(dev);
1154 1196
1197 i915_gem_free_all_phys_object(dev);
1198
1155 mutex_lock(&dev->struct_mutex); 1199 mutex_lock(&dev->struct_mutex);
1156 i915_gem_cleanup_ringbuffer(dev); 1200 i915_gem_cleanup_ringbuffer(dev);
1157 mutex_unlock(&dev->struct_mutex); 1201 mutex_unlock(&dev->struct_mutex);