diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 451 |
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 */ | ||
948 | static int | ||
949 | intel_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)); | ||
989 | out: | ||
990 | return ret; | ||
991 | } | ||
992 | |||
993 | /* Setup MCHBAR if possible, return true if we should disable it again */ | ||
994 | static void | ||
995 | intel_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 | |||
1031 | static void | ||
1032 | intel_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 | ||
1376 | static 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 */ |
1173 | static unsigned int i915_vga_set_decode(void *cookie, bool state) | 1386 | static 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 | ||
1398 | static 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 | |||
1413 | static 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 | |||
1185 | static int i915_load_modeset_init(struct drm_device *dev, | 1424 | static 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 | ||
1274 | destroy_ringbuffer: | 1511 | destroy_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); | ||
1276 | out: | 1515 | out: |
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 | ||
1661 | int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); | 1924 | int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); |