diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 64 |
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); |