diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.h')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 861 |
1 files changed, 518 insertions, 343 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index af4a263cf257..ce7914c4c044 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -34,6 +34,8 @@ | |||
34 | #include "intel_bios.h" | 34 | #include "intel_bios.h" |
35 | #include "intel_ringbuffer.h" | 35 | #include "intel_ringbuffer.h" |
36 | #include <linux/io-mapping.h> | 36 | #include <linux/io-mapping.h> |
37 | #include <linux/i2c.h> | ||
38 | #include <drm/intel-gtt.h> | ||
37 | 39 | ||
38 | /* General customization: | 40 | /* General customization: |
39 | */ | 41 | */ |
@@ -47,17 +49,22 @@ | |||
47 | enum pipe { | 49 | enum pipe { |
48 | PIPE_A = 0, | 50 | PIPE_A = 0, |
49 | PIPE_B, | 51 | PIPE_B, |
52 | PIPE_C, | ||
53 | I915_MAX_PIPES | ||
50 | }; | 54 | }; |
55 | #define pipe_name(p) ((p) + 'A') | ||
51 | 56 | ||
52 | enum plane { | 57 | enum plane { |
53 | PLANE_A = 0, | 58 | PLANE_A = 0, |
54 | PLANE_B, | 59 | PLANE_B, |
60 | PLANE_C, | ||
55 | }; | 61 | }; |
56 | 62 | #define plane_name(p) ((p) + 'A') | |
57 | #define I915_NUM_PIPE 2 | ||
58 | 63 | ||
59 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) | 64 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) |
60 | 65 | ||
66 | #define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++) | ||
67 | |||
61 | /* Interface history: | 68 | /* Interface history: |
62 | * | 69 | * |
63 | * 1.1: Original. | 70 | * 1.1: Original. |
@@ -73,12 +80,7 @@ enum plane { | |||
73 | #define DRIVER_PATCHLEVEL 0 | 80 | #define DRIVER_PATCHLEVEL 0 |
74 | 81 | ||
75 | #define WATCH_COHERENCY 0 | 82 | #define WATCH_COHERENCY 0 |
76 | #define WATCH_BUF 0 | 83 | #define WATCH_LISTS 0 |
77 | #define WATCH_EXEC 0 | ||
78 | #define WATCH_LRU 0 | ||
79 | #define WATCH_RELOC 0 | ||
80 | #define WATCH_INACTIVE 0 | ||
81 | #define WATCH_PWRITE 0 | ||
82 | 84 | ||
83 | #define I915_GEM_PHYS_CURSOR_0 1 | 85 | #define I915_GEM_PHYS_CURSOR_0 1 |
84 | #define I915_GEM_PHYS_CURSOR_1 2 | 86 | #define I915_GEM_PHYS_CURSOR_1 2 |
@@ -89,7 +91,7 @@ struct drm_i915_gem_phys_object { | |||
89 | int id; | 91 | int id; |
90 | struct page **page_list; | 92 | struct page **page_list; |
91 | drm_dma_handle_t *handle; | 93 | drm_dma_handle_t *handle; |
92 | struct drm_gem_object *cur_obj; | 94 | struct drm_i915_gem_object *cur_obj; |
93 | }; | 95 | }; |
94 | 96 | ||
95 | struct mem_block { | 97 | struct mem_block { |
@@ -110,8 +112,10 @@ struct intel_opregion { | |||
110 | struct opregion_acpi *acpi; | 112 | struct opregion_acpi *acpi; |
111 | struct opregion_swsci *swsci; | 113 | struct opregion_swsci *swsci; |
112 | struct opregion_asle *asle; | 114 | struct opregion_asle *asle; |
113 | int enabled; | 115 | void *vbt; |
116 | u32 __iomem *lid_state; | ||
114 | }; | 117 | }; |
118 | #define OPREGION_SIZE (8*1024) | ||
115 | 119 | ||
116 | struct intel_overlay; | 120 | struct intel_overlay; |
117 | struct intel_overlay_error_state; | 121 | struct intel_overlay_error_state; |
@@ -123,53 +127,72 @@ struct drm_i915_master_private { | |||
123 | #define I915_FENCE_REG_NONE -1 | 127 | #define I915_FENCE_REG_NONE -1 |
124 | 128 | ||
125 | struct drm_i915_fence_reg { | 129 | struct drm_i915_fence_reg { |
126 | struct drm_gem_object *obj; | ||
127 | struct list_head lru_list; | 130 | struct list_head lru_list; |
131 | struct drm_i915_gem_object *obj; | ||
132 | uint32_t setup_seqno; | ||
128 | }; | 133 | }; |
129 | 134 | ||
130 | struct sdvo_device_mapping { | 135 | struct sdvo_device_mapping { |
136 | u8 initialized; | ||
131 | u8 dvo_port; | 137 | u8 dvo_port; |
132 | u8 slave_addr; | 138 | u8 slave_addr; |
133 | u8 dvo_wiring; | 139 | u8 dvo_wiring; |
134 | u8 initialized; | 140 | u8 i2c_pin; |
141 | u8 i2c_speed; | ||
135 | u8 ddc_pin; | 142 | u8 ddc_pin; |
136 | }; | 143 | }; |
137 | 144 | ||
145 | struct intel_display_error_state; | ||
146 | |||
138 | struct drm_i915_error_state { | 147 | struct drm_i915_error_state { |
139 | u32 eir; | 148 | u32 eir; |
140 | u32 pgtbl_er; | 149 | u32 pgtbl_er; |
141 | u32 pipeastat; | 150 | u32 pipestat[I915_MAX_PIPES]; |
142 | u32 pipebstat; | ||
143 | u32 ipeir; | 151 | u32 ipeir; |
144 | u32 ipehr; | 152 | u32 ipehr; |
145 | u32 instdone; | 153 | u32 instdone; |
146 | u32 acthd; | 154 | u32 acthd; |
155 | u32 error; /* gen6+ */ | ||
156 | u32 bcs_acthd; /* gen6+ blt engine */ | ||
157 | u32 bcs_ipehr; | ||
158 | u32 bcs_ipeir; | ||
159 | u32 bcs_instdone; | ||
160 | u32 bcs_seqno; | ||
161 | u32 vcs_acthd; /* gen6+ bsd engine */ | ||
162 | u32 vcs_ipehr; | ||
163 | u32 vcs_ipeir; | ||
164 | u32 vcs_instdone; | ||
165 | u32 vcs_seqno; | ||
147 | u32 instpm; | 166 | u32 instpm; |
148 | u32 instps; | 167 | u32 instps; |
149 | u32 instdone1; | 168 | u32 instdone1; |
150 | u32 seqno; | 169 | u32 seqno; |
151 | u64 bbaddr; | 170 | u64 bbaddr; |
171 | u64 fence[16]; | ||
152 | struct timeval time; | 172 | struct timeval time; |
153 | struct drm_i915_error_object { | 173 | struct drm_i915_error_object { |
154 | int page_count; | 174 | int page_count; |
155 | u32 gtt_offset; | 175 | u32 gtt_offset; |
156 | u32 *pages[0]; | 176 | u32 *pages[0]; |
157 | } *ringbuffer, *batchbuffer[2]; | 177 | } *ringbuffer[I915_NUM_RINGS], *batchbuffer[I915_NUM_RINGS]; |
158 | struct drm_i915_error_buffer { | 178 | struct drm_i915_error_buffer { |
159 | size_t size; | 179 | u32 size; |
160 | u32 name; | 180 | u32 name; |
161 | u32 seqno; | 181 | u32 seqno; |
162 | u32 gtt_offset; | 182 | u32 gtt_offset; |
163 | u32 read_domains; | 183 | u32 read_domains; |
164 | u32 write_domain; | 184 | u32 write_domain; |
165 | u32 fence_reg; | 185 | s32 fence_reg:5; |
166 | s32 pinned:2; | 186 | s32 pinned:2; |
167 | u32 tiling:2; | 187 | u32 tiling:2; |
168 | u32 dirty:1; | 188 | u32 dirty:1; |
169 | u32 purgeable:1; | 189 | u32 purgeable:1; |
170 | } *active_bo; | 190 | u32 ring:4; |
171 | u32 active_bo_count; | 191 | u32 cache_level:2; |
192 | } *active_bo, *pinned_bo; | ||
193 | u32 active_bo_count, pinned_bo_count; | ||
172 | struct intel_overlay_error_state *overlay; | 194 | struct intel_overlay_error_state *overlay; |
195 | struct intel_display_error_state *display; | ||
173 | }; | 196 | }; |
174 | 197 | ||
175 | struct drm_i915_display_funcs { | 198 | struct drm_i915_display_funcs { |
@@ -179,48 +202,58 @@ struct drm_i915_display_funcs { | |||
179 | void (*disable_fbc)(struct drm_device *dev); | 202 | void (*disable_fbc)(struct drm_device *dev); |
180 | int (*get_display_clock_speed)(struct drm_device *dev); | 203 | int (*get_display_clock_speed)(struct drm_device *dev); |
181 | int (*get_fifo_size)(struct drm_device *dev, int plane); | 204 | int (*get_fifo_size)(struct drm_device *dev, int plane); |
182 | void (*update_wm)(struct drm_device *dev, int planea_clock, | 205 | void (*update_wm)(struct drm_device *dev); |
183 | int planeb_clock, int sr_hdisplay, int sr_htotal, | 206 | int (*crtc_mode_set)(struct drm_crtc *crtc, |
184 | int pixel_size); | 207 | struct drm_display_mode *mode, |
208 | struct drm_display_mode *adjusted_mode, | ||
209 | int x, int y, | ||
210 | struct drm_framebuffer *old_fb); | ||
211 | void (*fdi_link_train)(struct drm_crtc *crtc); | ||
212 | void (*init_clock_gating)(struct drm_device *dev); | ||
213 | void (*init_pch_clock_gating)(struct drm_device *dev); | ||
214 | int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc, | ||
215 | struct drm_framebuffer *fb, | ||
216 | struct drm_i915_gem_object *obj); | ||
185 | /* clock updates for mode set */ | 217 | /* clock updates for mode set */ |
186 | /* cursor updates */ | 218 | /* cursor updates */ |
187 | /* render clock increase/decrease */ | 219 | /* render clock increase/decrease */ |
188 | /* display clock increase/decrease */ | 220 | /* display clock increase/decrease */ |
189 | /* pll clock increase/decrease */ | 221 | /* pll clock increase/decrease */ |
190 | /* clock gating init */ | ||
191 | }; | 222 | }; |
192 | 223 | ||
193 | struct intel_device_info { | 224 | struct intel_device_info { |
194 | u8 gen; | 225 | u8 gen; |
195 | u8 is_mobile : 1; | 226 | u8 is_mobile : 1; |
196 | u8 is_i8xx : 1; | ||
197 | u8 is_i85x : 1; | 227 | u8 is_i85x : 1; |
198 | u8 is_i915g : 1; | 228 | u8 is_i915g : 1; |
199 | u8 is_i9xx : 1; | ||
200 | u8 is_i945gm : 1; | 229 | u8 is_i945gm : 1; |
201 | u8 is_i965g : 1; | ||
202 | u8 is_i965gm : 1; | ||
203 | u8 is_g33 : 1; | 230 | u8 is_g33 : 1; |
204 | u8 need_gfx_hws : 1; | 231 | u8 need_gfx_hws : 1; |
205 | u8 is_g4x : 1; | 232 | u8 is_g4x : 1; |
206 | u8 is_pineview : 1; | 233 | u8 is_pineview : 1; |
207 | u8 is_broadwater : 1; | 234 | u8 is_broadwater : 1; |
208 | u8 is_crestline : 1; | 235 | u8 is_crestline : 1; |
209 | u8 is_ironlake : 1; | 236 | u8 is_ivybridge : 1; |
210 | u8 has_fbc : 1; | 237 | u8 has_fbc : 1; |
211 | u8 has_rc6 : 1; | ||
212 | u8 has_pipe_cxsr : 1; | 238 | u8 has_pipe_cxsr : 1; |
213 | u8 has_hotplug : 1; | 239 | u8 has_hotplug : 1; |
214 | u8 cursor_needs_physical : 1; | 240 | u8 cursor_needs_physical : 1; |
241 | u8 has_overlay : 1; | ||
242 | u8 overlay_needs_physical : 1; | ||
243 | u8 supports_tv : 1; | ||
244 | u8 has_bsd_ring : 1; | ||
245 | u8 has_blt_ring : 1; | ||
215 | }; | 246 | }; |
216 | 247 | ||
217 | enum no_fbc_reason { | 248 | enum no_fbc_reason { |
249 | FBC_NO_OUTPUT, /* no outputs enabled to compress */ | ||
218 | FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed buffers */ | 250 | FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed buffers */ |
219 | FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */ | 251 | FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */ |
220 | FBC_MODE_TOO_LARGE, /* mode too large for compression */ | 252 | FBC_MODE_TOO_LARGE, /* mode too large for compression */ |
221 | FBC_BAD_PLANE, /* fbc not supported on plane */ | 253 | FBC_BAD_PLANE, /* fbc not supported on plane */ |
222 | FBC_NOT_TILED, /* buffer not tiled */ | 254 | FBC_NOT_TILED, /* buffer not tiled */ |
223 | FBC_MULTIPLE_PIPES, /* more than one pipe active */ | 255 | FBC_MULTIPLE_PIPES, /* more than one pipe active */ |
256 | FBC_MODULE_PARAM, | ||
224 | }; | 257 | }; |
225 | 258 | ||
226 | enum intel_pch { | 259 | enum intel_pch { |
@@ -229,6 +262,7 @@ enum intel_pch { | |||
229 | }; | 262 | }; |
230 | 263 | ||
231 | #define QUIRK_PIPEA_FORCE (1<<0) | 264 | #define QUIRK_PIPEA_FORCE (1<<0) |
265 | #define QUIRK_LVDS_SSC_DISABLE (1<<1) | ||
232 | 266 | ||
233 | struct intel_fbdev; | 267 | struct intel_fbdev; |
234 | 268 | ||
@@ -238,23 +272,25 @@ typedef struct drm_i915_private { | |||
238 | const struct intel_device_info *info; | 272 | const struct intel_device_info *info; |
239 | 273 | ||
240 | int has_gem; | 274 | int has_gem; |
275 | int relative_constants_mode; | ||
241 | 276 | ||
242 | void __iomem *regs; | 277 | void __iomem *regs; |
243 | 278 | ||
279 | struct intel_gmbus { | ||
280 | struct i2c_adapter adapter; | ||
281 | struct i2c_adapter *force_bit; | ||
282 | u32 reg0; | ||
283 | } *gmbus; | ||
284 | |||
244 | struct pci_dev *bridge_dev; | 285 | struct pci_dev *bridge_dev; |
245 | struct intel_ring_buffer render_ring; | 286 | struct intel_ring_buffer ring[I915_NUM_RINGS]; |
246 | struct intel_ring_buffer bsd_ring; | ||
247 | uint32_t next_seqno; | 287 | uint32_t next_seqno; |
248 | 288 | ||
249 | drm_dma_handle_t *status_page_dmah; | 289 | drm_dma_handle_t *status_page_dmah; |
250 | void *seqno_page; | ||
251 | dma_addr_t dma_status_page; | ||
252 | uint32_t counter; | 290 | uint32_t counter; |
253 | unsigned int seqno_gfx_addr; | ||
254 | drm_local_map_t hws_map; | 291 | drm_local_map_t hws_map; |
255 | struct drm_gem_object *seqno_obj; | 292 | struct drm_i915_gem_object *pwrctx; |
256 | struct drm_gem_object *pwrctx; | 293 | struct drm_i915_gem_object *renderctx; |
257 | struct drm_gem_object *renderctx; | ||
258 | 294 | ||
259 | struct resource mch_res; | 295 | struct resource mch_res; |
260 | 296 | ||
@@ -264,21 +300,15 @@ typedef struct drm_i915_private { | |||
264 | int current_page; | 300 | int current_page; |
265 | int page_flipping; | 301 | int page_flipping; |
266 | 302 | ||
267 | wait_queue_head_t irq_queue; | ||
268 | atomic_t irq_received; | 303 | atomic_t irq_received; |
269 | /** Protects user_irq_refcount and irq_mask_reg */ | 304 | |
270 | spinlock_t user_irq_lock; | 305 | /* protects the irq masks */ |
271 | u32 trace_irq_seqno; | 306 | spinlock_t irq_lock; |
272 | /** Cached value of IMR to avoid reads in updating the bitfield */ | 307 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
273 | u32 irq_mask_reg; | ||
274 | u32 pipestat[2]; | 308 | u32 pipestat[2]; |
275 | /** splitted irq regs for graphics and display engine on Ironlake, | 309 | u32 irq_mask; |
276 | irq_mask_reg is still used for display irq. */ | 310 | u32 gt_irq_mask; |
277 | u32 gt_irq_mask_reg; | 311 | u32 pch_irq_mask; |
278 | u32 gt_irq_enable_reg; | ||
279 | u32 de_irq_enable_reg; | ||
280 | u32 pch_irq_mask_reg; | ||
281 | u32 pch_irq_enable_reg; | ||
282 | 312 | ||
283 | u32 hotplug_supported_mask; | 313 | u32 hotplug_supported_mask; |
284 | struct work_struct hotplug_work; | 314 | struct work_struct hotplug_work; |
@@ -289,26 +319,21 @@ typedef struct drm_i915_private { | |||
289 | unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; | 319 | unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; |
290 | int vblank_pipe; | 320 | int vblank_pipe; |
291 | int num_pipe; | 321 | int num_pipe; |
292 | u32 flush_rings; | ||
293 | #define FLUSH_RENDER_RING 0x1 | ||
294 | #define FLUSH_BSD_RING 0x2 | ||
295 | 322 | ||
296 | /* For hangcheck timer */ | 323 | /* For hangcheck timer */ |
297 | #define DRM_I915_HANGCHECK_PERIOD 75 /* in jiffies */ | 324 | #define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */ |
298 | struct timer_list hangcheck_timer; | 325 | struct timer_list hangcheck_timer; |
299 | int hangcheck_count; | 326 | int hangcheck_count; |
300 | uint32_t last_acthd; | 327 | uint32_t last_acthd; |
301 | uint32_t last_instdone; | 328 | uint32_t last_instdone; |
302 | uint32_t last_instdone1; | 329 | uint32_t last_instdone1; |
303 | 330 | ||
304 | struct drm_mm vram; | ||
305 | |||
306 | unsigned long cfb_size; | 331 | unsigned long cfb_size; |
307 | unsigned long cfb_pitch; | 332 | unsigned long cfb_pitch; |
333 | unsigned long cfb_offset; | ||
308 | int cfb_fence; | 334 | int cfb_fence; |
309 | int cfb_plane; | 335 | int cfb_plane; |
310 | 336 | int cfb_y; | |
311 | int irq_enabled; | ||
312 | 337 | ||
313 | struct intel_opregion opregion; | 338 | struct intel_opregion opregion; |
314 | 339 | ||
@@ -316,8 +341,8 @@ typedef struct drm_i915_private { | |||
316 | struct intel_overlay *overlay; | 341 | struct intel_overlay *overlay; |
317 | 342 | ||
318 | /* LVDS info */ | 343 | /* LVDS info */ |
319 | int backlight_duty_cycle; /* restore backlight to this value */ | 344 | int backlight_level; /* restore backlight to this value */ |
320 | bool panel_wants_dither; | 345 | bool backlight_enabled; |
321 | struct drm_display_mode *panel_fixed_mode; | 346 | struct drm_display_mode *panel_fixed_mode; |
322 | struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */ | 347 | struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */ |
323 | struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */ | 348 | struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */ |
@@ -328,13 +353,23 @@ typedef struct drm_i915_private { | |||
328 | unsigned int lvds_vbt:1; | 353 | unsigned int lvds_vbt:1; |
329 | unsigned int int_crt_support:1; | 354 | unsigned int int_crt_support:1; |
330 | unsigned int lvds_use_ssc:1; | 355 | unsigned int lvds_use_ssc:1; |
331 | unsigned int edp_support:1; | ||
332 | int lvds_ssc_freq; | 356 | int lvds_ssc_freq; |
333 | int edp_bpp; | 357 | struct { |
358 | int rate; | ||
359 | int lanes; | ||
360 | int preemphasis; | ||
361 | int vswing; | ||
362 | |||
363 | bool initialized; | ||
364 | bool support; | ||
365 | int bpp; | ||
366 | struct edp_power_seq pps; | ||
367 | } edp; | ||
368 | bool no_aux_handshake; | ||
334 | 369 | ||
335 | struct notifier_block lid_notifier; | 370 | struct notifier_block lid_notifier; |
336 | 371 | ||
337 | int crt_ddc_bus; /* 0 = unknown, else GPIO to use for CRT DDC */ | 372 | int crt_ddc_pin; |
338 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ | 373 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ |
339 | int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ | 374 | int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ |
340 | int num_fence_regs; /* 8 on pre-965, 16 otherwise */ | 375 | int num_fence_regs; /* 8 on pre-965, 16 otherwise */ |
@@ -344,6 +379,7 @@ typedef struct drm_i915_private { | |||
344 | spinlock_t error_lock; | 379 | spinlock_t error_lock; |
345 | struct drm_i915_error_state *first_error; | 380 | struct drm_i915_error_state *first_error; |
346 | struct work_struct error_work; | 381 | struct work_struct error_work; |
382 | struct completion error_completion; | ||
347 | struct workqueue_struct *wq; | 383 | struct workqueue_struct *wq; |
348 | 384 | ||
349 | /* Display functions */ | 385 | /* Display functions */ |
@@ -507,21 +543,36 @@ typedef struct drm_i915_private { | |||
507 | u32 saveMCHBAR_RENDER_STANDBY; | 543 | u32 saveMCHBAR_RENDER_STANDBY; |
508 | 544 | ||
509 | struct { | 545 | struct { |
546 | /** Bridge to intel-gtt-ko */ | ||
547 | const struct intel_gtt *gtt; | ||
548 | /** Memory allocator for GTT stolen memory */ | ||
549 | struct drm_mm stolen; | ||
550 | /** Memory allocator for GTT */ | ||
510 | struct drm_mm gtt_space; | 551 | struct drm_mm gtt_space; |
552 | /** List of all objects in gtt_space. Used to restore gtt | ||
553 | * mappings on resume */ | ||
554 | struct list_head gtt_list; | ||
555 | |||
556 | /** Usable portion of the GTT for GEM */ | ||
557 | unsigned long gtt_start; | ||
558 | unsigned long gtt_mappable_end; | ||
559 | unsigned long gtt_end; | ||
511 | 560 | ||
512 | struct io_mapping *gtt_mapping; | 561 | struct io_mapping *gtt_mapping; |
513 | int gtt_mtrr; | 562 | int gtt_mtrr; |
514 | 563 | ||
564 | struct shrinker inactive_shrinker; | ||
565 | |||
515 | /** | 566 | /** |
516 | * Membership on list of all loaded devices, used to evict | 567 | * List of objects currently involved in rendering. |
517 | * inactive buffers under memory pressure. | ||
518 | * | 568 | * |
519 | * Modifications should only be done whilst holding the | 569 | * Includes buffers having the contents of their GPU caches |
520 | * shrink_list_lock spinlock. | 570 | * flushed, not necessarily primitives. last_rendering_seqno |
571 | * represents when the rendering involved will be completed. | ||
572 | * | ||
573 | * A reference is held on the buffer while on this list. | ||
521 | */ | 574 | */ |
522 | struct list_head shrink_list; | 575 | struct list_head active_list; |
523 | |||
524 | spinlock_t active_list_lock; | ||
525 | 576 | ||
526 | /** | 577 | /** |
527 | * List of objects which are not in the ringbuffer but which | 578 | * List of objects which are not in the ringbuffer but which |
@@ -535,15 +586,6 @@ typedef struct drm_i915_private { | |||
535 | struct list_head flushing_list; | 586 | struct list_head flushing_list; |
536 | 587 | ||
537 | /** | 588 | /** |
538 | * List of objects currently pending a GPU write flush. | ||
539 | * | ||
540 | * All elements on this list will belong to either the | ||
541 | * active_list or flushing_list, last_rendering_seqno can | ||
542 | * be used to differentiate between the two elements. | ||
543 | */ | ||
544 | struct list_head gpu_write_list; | ||
545 | |||
546 | /** | ||
547 | * LRU list of objects which are not in the ringbuffer and | 589 | * LRU list of objects which are not in the ringbuffer and |
548 | * are ready to unbind, but are still in the GTT. | 590 | * are ready to unbind, but are still in the GTT. |
549 | * | 591 | * |
@@ -555,6 +597,12 @@ typedef struct drm_i915_private { | |||
555 | */ | 597 | */ |
556 | struct list_head inactive_list; | 598 | struct list_head inactive_list; |
557 | 599 | ||
600 | /** | ||
601 | * LRU list of objects which are not in the ringbuffer but | ||
602 | * are still pinned in the GTT. | ||
603 | */ | ||
604 | struct list_head pinned_list; | ||
605 | |||
558 | /** LRU list of objects with fence regs on them. */ | 606 | /** LRU list of objects with fence regs on them. */ |
559 | struct list_head fence_list; | 607 | struct list_head fence_list; |
560 | 608 | ||
@@ -576,14 +624,10 @@ typedef struct drm_i915_private { | |||
576 | struct delayed_work retire_work; | 624 | struct delayed_work retire_work; |
577 | 625 | ||
578 | /** | 626 | /** |
579 | * Waiting sequence number, if any | 627 | * Are we in a non-interruptible section of code like |
580 | */ | 628 | * modesetting? |
581 | uint32_t waiting_gem_seqno; | ||
582 | |||
583 | /** | ||
584 | * Last seq seen at irq time | ||
585 | */ | 629 | */ |
586 | uint32_t irq_gem_seqno; | 630 | bool interruptible; |
587 | 631 | ||
588 | /** | 632 | /** |
589 | * Flag if the X Server, and thus DRM, is not currently in | 633 | * Flag if the X Server, and thus DRM, is not currently in |
@@ -599,7 +643,7 @@ typedef struct drm_i915_private { | |||
599 | * Flag if the hardware appears to be wedged. | 643 | * Flag if the hardware appears to be wedged. |
600 | * | 644 | * |
601 | * This is set when attempts to idle the device timeout. | 645 | * This is set when attempts to idle the device timeout. |
602 | * It prevents command submission from occuring and makes | 646 | * It prevents command submission from occurring and makes |
603 | * every pending request fail | 647 | * every pending request fail |
604 | */ | 648 | */ |
605 | atomic_t wedged; | 649 | atomic_t wedged; |
@@ -611,12 +655,19 @@ typedef struct drm_i915_private { | |||
611 | 655 | ||
612 | /* storage for physical objects */ | 656 | /* storage for physical objects */ |
613 | struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; | 657 | struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; |
658 | |||
659 | /* accounting, useful for userland debugging */ | ||
660 | size_t gtt_total; | ||
661 | size_t mappable_gtt_total; | ||
662 | size_t object_memory; | ||
663 | u32 object_count; | ||
614 | } mm; | 664 | } mm; |
615 | struct sdvo_device_mapping sdvo_mappings[2]; | 665 | struct sdvo_device_mapping sdvo_mappings[2]; |
616 | /* indicate whether the LVDS_BORDER should be enabled or not */ | 666 | /* indicate whether the LVDS_BORDER should be enabled or not */ |
617 | unsigned int lvds_border_bits; | 667 | unsigned int lvds_border_bits; |
618 | /* Panel fitter placement and size for Ironlake+ */ | 668 | /* Panel fitter placement and size for Ironlake+ */ |
619 | u32 pch_pf_pos, pch_pf_size; | 669 | u32 pch_pf_pos, pch_pf_size; |
670 | int panel_t3, panel_t12; | ||
620 | 671 | ||
621 | struct drm_crtc *plane_to_crtc_mapping[2]; | 672 | struct drm_crtc *plane_to_crtc_mapping[2]; |
622 | struct drm_crtc *pipe_to_crtc_mapping[2]; | 673 | struct drm_crtc *pipe_to_crtc_mapping[2]; |
@@ -626,8 +677,6 @@ typedef struct drm_i915_private { | |||
626 | /* Reclocking support */ | 677 | /* Reclocking support */ |
627 | bool render_reclock_avail; | 678 | bool render_reclock_avail; |
628 | bool lvds_downclock_avail; | 679 | bool lvds_downclock_avail; |
629 | /* indicate whether the LVDS EDID is OK */ | ||
630 | bool lvds_edid_good; | ||
631 | /* indicates the reduced downclock for LVDS*/ | 680 | /* indicates the reduced downclock for LVDS*/ |
632 | int lvds_downclock; | 681 | int lvds_downclock; |
633 | struct work_struct idle_work; | 682 | struct work_struct idle_work; |
@@ -640,20 +689,24 @@ typedef struct drm_i915_private { | |||
640 | 689 | ||
641 | bool mchbar_need_disable; | 690 | bool mchbar_need_disable; |
642 | 691 | ||
692 | struct work_struct rps_work; | ||
693 | spinlock_t rps_lock; | ||
694 | u32 pm_iir; | ||
695 | |||
643 | u8 cur_delay; | 696 | u8 cur_delay; |
644 | u8 min_delay; | 697 | u8 min_delay; |
645 | u8 max_delay; | 698 | u8 max_delay; |
646 | u8 fmax; | 699 | u8 fmax; |
647 | u8 fstart; | 700 | u8 fstart; |
648 | 701 | ||
649 | u64 last_count1; | 702 | u64 last_count1; |
650 | unsigned long last_time1; | 703 | unsigned long last_time1; |
651 | u64 last_count2; | 704 | u64 last_count2; |
652 | struct timespec last_time2; | 705 | struct timespec last_time2; |
653 | unsigned long gfx_power; | 706 | unsigned long gfx_power; |
654 | int c_m; | 707 | int c_m; |
655 | int r_t; | 708 | int r_t; |
656 | u8 corr; | 709 | u8 corr; |
657 | spinlock_t *mchdev_lock; | 710 | spinlock_t *mchdev_lock; |
658 | 711 | ||
659 | enum no_fbc_reason no_fbc_reason; | 712 | enum no_fbc_reason no_fbc_reason; |
@@ -661,23 +714,37 @@ typedef struct drm_i915_private { | |||
661 | struct drm_mm_node *compressed_fb; | 714 | struct drm_mm_node *compressed_fb; |
662 | struct drm_mm_node *compressed_llb; | 715 | struct drm_mm_node *compressed_llb; |
663 | 716 | ||
717 | unsigned long last_gpu_reset; | ||
718 | |||
664 | /* list of fbdev register on this device */ | 719 | /* list of fbdev register on this device */ |
665 | struct intel_fbdev *fbdev; | 720 | struct intel_fbdev *fbdev; |
721 | |||
722 | struct drm_property *broadcast_rgb_property; | ||
723 | struct drm_property *force_audio_property; | ||
724 | |||
725 | atomic_t forcewake_count; | ||
666 | } drm_i915_private_t; | 726 | } drm_i915_private_t; |
667 | 727 | ||
668 | /** driver private structure attached to each drm_gem_object */ | 728 | enum i915_cache_level { |
729 | I915_CACHE_NONE, | ||
730 | I915_CACHE_LLC, | ||
731 | I915_CACHE_LLC_MLC, /* gen6+ */ | ||
732 | }; | ||
733 | |||
669 | struct drm_i915_gem_object { | 734 | struct drm_i915_gem_object { |
670 | struct drm_gem_object base; | 735 | struct drm_gem_object base; |
671 | 736 | ||
672 | /** Current space allocated to this object in the GTT, if any. */ | 737 | /** Current space allocated to this object in the GTT, if any. */ |
673 | struct drm_mm_node *gtt_space; | 738 | struct drm_mm_node *gtt_space; |
739 | struct list_head gtt_list; | ||
674 | 740 | ||
675 | /** This object's place on the active/flushing/inactive lists */ | 741 | /** This object's place on the active/flushing/inactive lists */ |
676 | struct list_head list; | 742 | struct list_head ring_list; |
743 | struct list_head mm_list; | ||
677 | /** This object's place on GPU write list */ | 744 | /** This object's place on GPU write list */ |
678 | struct list_head gpu_write_list; | 745 | struct list_head gpu_write_list; |
679 | /** This object's place on eviction list */ | 746 | /** This object's place in the batchbuffer or on the eviction list */ |
680 | struct list_head evict_list; | 747 | struct list_head exec_list; |
681 | 748 | ||
682 | /** | 749 | /** |
683 | * This is set if the object is on the active or flushing lists | 750 | * This is set if the object is on the active or flushing lists |
@@ -693,6 +760,12 @@ struct drm_i915_gem_object { | |||
693 | unsigned int dirty : 1; | 760 | unsigned int dirty : 1; |
694 | 761 | ||
695 | /** | 762 | /** |
763 | * This is set if the object has been written to since the last | ||
764 | * GPU flush. | ||
765 | */ | ||
766 | unsigned int pending_gpu_write : 1; | ||
767 | |||
768 | /** | ||
696 | * Fence register bits (if any) for this object. Will be set | 769 | * Fence register bits (if any) for this object. Will be set |
697 | * as needed when mapped into the GTT. | 770 | * as needed when mapped into the GTT. |
698 | * Protected by dev->struct_mutex. | 771 | * Protected by dev->struct_mutex. |
@@ -702,29 +775,15 @@ struct drm_i915_gem_object { | |||
702 | signed int fence_reg : 5; | 775 | signed int fence_reg : 5; |
703 | 776 | ||
704 | /** | 777 | /** |
705 | * Used for checking the object doesn't appear more than once | ||
706 | * in an execbuffer object list. | ||
707 | */ | ||
708 | unsigned int in_execbuffer : 1; | ||
709 | |||
710 | /** | ||
711 | * Advice: are the backing pages purgeable? | 778 | * Advice: are the backing pages purgeable? |
712 | */ | 779 | */ |
713 | unsigned int madv : 2; | 780 | unsigned int madv : 2; |
714 | 781 | ||
715 | /** | 782 | /** |
716 | * Refcount for the pages array. With the current locking scheme, there | ||
717 | * are at most two concurrent users: Binding a bo to the gtt and | ||
718 | * pwrite/pread using physical addresses. So two bits for a maximum | ||
719 | * of two users are enough. | ||
720 | */ | ||
721 | unsigned int pages_refcount : 2; | ||
722 | #define DRM_I915_GEM_OBJECT_MAX_PAGES_REFCOUNT 0x3 | ||
723 | |||
724 | /** | ||
725 | * Current tiling mode for the object. | 783 | * Current tiling mode for the object. |
726 | */ | 784 | */ |
727 | unsigned int tiling_mode : 2; | 785 | unsigned int tiling_mode : 2; |
786 | unsigned int tiling_changed : 1; | ||
728 | 787 | ||
729 | /** How many users have pinned this object in GTT space. The following | 788 | /** How many users have pinned this object in GTT space. The following |
730 | * users can each hold at most one reference: pwrite/pread, pin_ioctl | 789 | * users can each hold at most one reference: pwrite/pread, pin_ioctl |
@@ -738,28 +797,57 @@ struct drm_i915_gem_object { | |||
738 | unsigned int pin_count : 4; | 797 | unsigned int pin_count : 4; |
739 | #define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf | 798 | #define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf |
740 | 799 | ||
741 | /** AGP memory structure for our GTT binding. */ | 800 | /** |
742 | DRM_AGP_MEM *agp_mem; | 801 | * Is the object at the current location in the gtt mappable and |
802 | * fenceable? Used to avoid costly recalculations. | ||
803 | */ | ||
804 | unsigned int map_and_fenceable : 1; | ||
805 | |||
806 | /** | ||
807 | * Whether the current gtt mapping needs to be mappable (and isn't just | ||
808 | * mappable by accident). Track pin and fault separate for a more | ||
809 | * accurate mappable working set. | ||
810 | */ | ||
811 | unsigned int fault_mappable : 1; | ||
812 | unsigned int pin_mappable : 1; | ||
813 | |||
814 | /* | ||
815 | * Is the GPU currently using a fence to access this buffer, | ||
816 | */ | ||
817 | unsigned int pending_fenced_gpu_access:1; | ||
818 | unsigned int fenced_gpu_access:1; | ||
819 | |||
820 | unsigned int cache_level:2; | ||
743 | 821 | ||
744 | struct page **pages; | 822 | struct page **pages; |
745 | 823 | ||
746 | /** | 824 | /** |
747 | * Current offset of the object in GTT space. | 825 | * DMAR support |
748 | * | ||
749 | * This is the same as gtt_space->start | ||
750 | */ | 826 | */ |
751 | uint32_t gtt_offset; | 827 | struct scatterlist *sg_list; |
828 | int num_sg; | ||
752 | 829 | ||
753 | /* Which ring is refering to is this object */ | 830 | /** |
754 | struct intel_ring_buffer *ring; | 831 | * Used for performing relocations during execbuffer insertion. |
832 | */ | ||
833 | struct hlist_node exec_node; | ||
834 | unsigned long exec_handle; | ||
835 | struct drm_i915_gem_exec_object2 *exec_entry; | ||
755 | 836 | ||
756 | /** | 837 | /** |
757 | * Fake offset for use by mmap(2) | 838 | * Current offset of the object in GTT space. |
839 | * | ||
840 | * This is the same as gtt_space->start | ||
758 | */ | 841 | */ |
759 | uint64_t mmap_offset; | 842 | uint32_t gtt_offset; |
760 | 843 | ||
761 | /** Breadcrumb of last rendering to the buffer. */ | 844 | /** Breadcrumb of last rendering to the buffer. */ |
762 | uint32_t last_rendering_seqno; | 845 | uint32_t last_rendering_seqno; |
846 | struct intel_ring_buffer *ring; | ||
847 | |||
848 | /** Breadcrumb of last fenced GPU access to the buffer. */ | ||
849 | uint32_t last_fenced_seqno; | ||
850 | struct intel_ring_buffer *last_fenced_ring; | ||
763 | 851 | ||
764 | /** Current tiling stride for the object, if it's tiled. */ | 852 | /** Current tiling stride for the object, if it's tiled. */ |
765 | uint32_t stride; | 853 | uint32_t stride; |
@@ -767,8 +855,6 @@ struct drm_i915_gem_object { | |||
767 | /** Record of address bit 17 of each page at last unbind. */ | 855 | /** Record of address bit 17 of each page at last unbind. */ |
768 | unsigned long *bit_17; | 856 | unsigned long *bit_17; |
769 | 857 | ||
770 | /** AGP mapping type (AGP_USER_MEMORY or AGP_USER_CACHED_MEMORY */ | ||
771 | uint32_t agp_type; | ||
772 | 858 | ||
773 | /** | 859 | /** |
774 | * If present, while GEM_DOMAIN_CPU is in the read domain this array | 860 | * If present, while GEM_DOMAIN_CPU is in the read domain this array |
@@ -816,33 +902,102 @@ struct drm_i915_gem_request { | |||
816 | /** global list entry for this request */ | 902 | /** global list entry for this request */ |
817 | struct list_head list; | 903 | struct list_head list; |
818 | 904 | ||
905 | struct drm_i915_file_private *file_priv; | ||
819 | /** file_priv list entry for this request */ | 906 | /** file_priv list entry for this request */ |
820 | struct list_head client_list; | 907 | struct list_head client_list; |
821 | }; | 908 | }; |
822 | 909 | ||
823 | struct drm_i915_file_private { | 910 | struct drm_i915_file_private { |
824 | struct { | 911 | struct { |
912 | struct spinlock lock; | ||
825 | struct list_head request_list; | 913 | struct list_head request_list; |
826 | } mm; | 914 | } mm; |
827 | }; | 915 | }; |
828 | 916 | ||
829 | enum intel_chip_family { | 917 | #define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) |
830 | CHIP_I8XX = 0x01, | 918 | |
831 | CHIP_I9XX = 0x02, | 919 | #define IS_I830(dev) ((dev)->pci_device == 0x3577) |
832 | CHIP_I915 = 0x04, | 920 | #define IS_845G(dev) ((dev)->pci_device == 0x2562) |
833 | CHIP_I965 = 0x08, | 921 | #define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) |
834 | }; | 922 | #define IS_I865G(dev) ((dev)->pci_device == 0x2572) |
923 | #define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g) | ||
924 | #define IS_I915GM(dev) ((dev)->pci_device == 0x2592) | ||
925 | #define IS_I945G(dev) ((dev)->pci_device == 0x2772) | ||
926 | #define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm) | ||
927 | #define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater) | ||
928 | #define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline) | ||
929 | #define IS_GM45(dev) ((dev)->pci_device == 0x2A42) | ||
930 | #define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x) | ||
931 | #define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001) | ||
932 | #define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011) | ||
933 | #define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview) | ||
934 | #define IS_G33(dev) (INTEL_INFO(dev)->is_g33) | ||
935 | #define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042) | ||
936 | #define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046) | ||
937 | #define IS_IVYBRIDGE(dev) (INTEL_INFO(dev)->is_ivybridge) | ||
938 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) | ||
939 | |||
940 | /* | ||
941 | * The genX designation typically refers to the render engine, so render | ||
942 | * capability related checks should use IS_GEN, while display and other checks | ||
943 | * have their own (e.g. HAS_PCH_SPLIT for ILK+ display, IS_foo for particular | ||
944 | * chips, etc.). | ||
945 | */ | ||
946 | #define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2) | ||
947 | #define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3) | ||
948 | #define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4) | ||
949 | #define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5) | ||
950 | #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) | ||
951 | #define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7) | ||
952 | |||
953 | #define HAS_BSD(dev) (INTEL_INFO(dev)->has_bsd_ring) | ||
954 | #define HAS_BLT(dev) (INTEL_INFO(dev)->has_blt_ring) | ||
955 | #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) | ||
956 | |||
957 | #define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay) | ||
958 | #define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical) | ||
959 | |||
960 | /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte | ||
961 | * rows, which changed the alignment requirements and fence programming. | ||
962 | */ | ||
963 | #define HAS_128_BYTE_Y_TILING(dev) (!IS_GEN2(dev) && !(IS_I915G(dev) || \ | ||
964 | IS_I915GM(dev))) | ||
965 | #define SUPPORTS_DIGITAL_OUTPUTS(dev) (!IS_GEN2(dev) && !IS_PINEVIEW(dev)) | ||
966 | #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_GEN5(dev)) | ||
967 | #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_GEN5(dev)) | ||
968 | #define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev)) | ||
969 | #define SUPPORTS_TV(dev) (INTEL_INFO(dev)->supports_tv) | ||
970 | #define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug) | ||
971 | /* dsparb controlled by hw only */ | ||
972 | #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) | ||
973 | |||
974 | #define HAS_FW_BLC(dev) (INTEL_INFO(dev)->gen > 2) | ||
975 | #define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) | ||
976 | #define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) | ||
977 | |||
978 | #define HAS_PCH_SPLIT(dev) (IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) | ||
979 | #define HAS_PIPE_CONTROL(dev) (INTEL_INFO(dev)->gen >= 5) | ||
980 | |||
981 | #define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type) | ||
982 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) | ||
983 | #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) | ||
984 | |||
985 | #include "i915_trace.h" | ||
835 | 986 | ||
836 | extern struct drm_ioctl_desc i915_ioctls[]; | 987 | extern struct drm_ioctl_desc i915_ioctls[]; |
837 | extern int i915_max_ioctl; | 988 | extern int i915_max_ioctl; |
838 | extern unsigned int i915_fbpercrtc; | 989 | extern unsigned int i915_fbpercrtc; |
990 | extern int i915_panel_ignore_lid; | ||
839 | extern unsigned int i915_powersave; | 991 | extern unsigned int i915_powersave; |
992 | extern unsigned int i915_semaphores; | ||
840 | extern unsigned int i915_lvds_downclock; | 993 | extern unsigned int i915_lvds_downclock; |
994 | extern unsigned int i915_panel_use_ssc; | ||
995 | extern int i915_vbt_sdvo_panel_type; | ||
996 | extern unsigned int i915_enable_rc6; | ||
997 | extern unsigned int i915_enable_fbc; | ||
841 | 998 | ||
842 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); | 999 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); |
843 | extern int i915_resume(struct drm_device *dev); | 1000 | extern int i915_resume(struct drm_device *dev); |
844 | extern void i915_save_display(struct drm_device *dev); | ||
845 | extern void i915_restore_display(struct drm_device *dev); | ||
846 | extern int i915_master_create(struct drm_device *dev, struct drm_master *master); | 1001 | extern int i915_master_create(struct drm_device *dev, struct drm_master *master); |
847 | extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master); | 1002 | extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master); |
848 | 1003 | ||
@@ -860,9 +1015,9 @@ extern int i915_driver_device_is_agp(struct drm_device * dev); | |||
860 | extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, | 1015 | extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, |
861 | unsigned long arg); | 1016 | unsigned long arg); |
862 | extern int i915_emit_box(struct drm_device *dev, | 1017 | extern int i915_emit_box(struct drm_device *dev, |
863 | struct drm_clip_rect *boxes, | 1018 | struct drm_clip_rect *box, |
864 | int i, int DR1, int DR4); | 1019 | int DR1, int DR4); |
865 | extern int i965_reset(struct drm_device *dev, u8 flags); | 1020 | extern int i915_reset(struct drm_device *dev, u8 flags); |
866 | extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv); | 1021 | extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv); |
867 | extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv); | 1022 | extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv); |
868 | extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); | 1023 | extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); |
@@ -871,34 +1026,20 @@ extern void i915_update_gfx_val(struct drm_i915_private *dev_priv); | |||
871 | 1026 | ||
872 | /* i915_irq.c */ | 1027 | /* i915_irq.c */ |
873 | void i915_hangcheck_elapsed(unsigned long data); | 1028 | void i915_hangcheck_elapsed(unsigned long data); |
874 | void i915_destroy_error_state(struct drm_device *dev); | 1029 | void i915_handle_error(struct drm_device *dev, bool wedged); |
875 | extern int i915_irq_emit(struct drm_device *dev, void *data, | 1030 | extern int i915_irq_emit(struct drm_device *dev, void *data, |
876 | struct drm_file *file_priv); | 1031 | struct drm_file *file_priv); |
877 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 1032 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
878 | struct drm_file *file_priv); | 1033 | struct drm_file *file_priv); |
879 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno); | ||
880 | extern void i915_enable_interrupt (struct drm_device *dev); | ||
881 | 1034 | ||
882 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); | 1035 | extern void intel_irq_init(struct drm_device *dev); |
883 | extern void i915_driver_irq_preinstall(struct drm_device * dev); | 1036 | |
884 | extern int i915_driver_irq_postinstall(struct drm_device *dev); | ||
885 | extern void i915_driver_irq_uninstall(struct drm_device * dev); | ||
886 | extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, | 1037 | extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, |
887 | struct drm_file *file_priv); | 1038 | struct drm_file *file_priv); |
888 | extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, | 1039 | extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, |
889 | struct drm_file *file_priv); | 1040 | struct drm_file *file_priv); |
890 | extern int i915_enable_vblank(struct drm_device *dev, int crtc); | ||
891 | extern void i915_disable_vblank(struct drm_device *dev, int crtc); | ||
892 | extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc); | ||
893 | extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc); | ||
894 | extern int i915_vblank_swap(struct drm_device *dev, void *data, | 1041 | extern int i915_vblank_swap(struct drm_device *dev, void *data, |
895 | struct drm_file *file_priv); | 1042 | struct drm_file *file_priv); |
896 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); | ||
897 | extern void i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask); | ||
898 | extern void ironlake_enable_graphics_irq(drm_i915_private_t *dev_priv, | ||
899 | u32 mask); | ||
900 | extern void ironlake_disable_graphics_irq(drm_i915_private_t *dev_priv, | ||
901 | u32 mask); | ||
902 | 1043 | ||
903 | void | 1044 | void |
904 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | 1045 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); |
@@ -908,6 +1049,12 @@ i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | |||
908 | 1049 | ||
909 | void intel_enable_asle (struct drm_device *dev); | 1050 | void intel_enable_asle (struct drm_device *dev); |
910 | 1051 | ||
1052 | #ifdef CONFIG_DEBUG_FS | ||
1053 | extern void i915_destroy_error_state(struct drm_device *dev); | ||
1054 | #else | ||
1055 | #define i915_destroy_error_state(x) | ||
1056 | #endif | ||
1057 | |||
911 | 1058 | ||
912 | /* i915_mem.c */ | 1059 | /* i915_mem.c */ |
913 | extern int i915_mem_alloc(struct drm_device *dev, void *data, | 1060 | extern int i915_mem_alloc(struct drm_device *dev, void *data, |
@@ -964,83 +1111,124 @@ int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, | |||
964 | struct drm_file *file_priv); | 1111 | struct drm_file *file_priv); |
965 | void i915_gem_load(struct drm_device *dev); | 1112 | void i915_gem_load(struct drm_device *dev); |
966 | int i915_gem_init_object(struct drm_gem_object *obj); | 1113 | int i915_gem_init_object(struct drm_gem_object *obj); |
967 | struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev, | 1114 | int __must_check i915_gem_flush_ring(struct intel_ring_buffer *ring, |
968 | size_t size); | 1115 | uint32_t invalidate_domains, |
1116 | uint32_t flush_domains); | ||
1117 | struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, | ||
1118 | size_t size); | ||
969 | void i915_gem_free_object(struct drm_gem_object *obj); | 1119 | void i915_gem_free_object(struct drm_gem_object *obj); |
970 | int i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment); | 1120 | int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj, |
971 | void i915_gem_object_unpin(struct drm_gem_object *obj); | 1121 | uint32_t alignment, |
972 | int i915_gem_object_unbind(struct drm_gem_object *obj); | 1122 | bool map_and_fenceable); |
973 | void i915_gem_release_mmap(struct drm_gem_object *obj); | 1123 | void i915_gem_object_unpin(struct drm_i915_gem_object *obj); |
1124 | int __must_check i915_gem_object_unbind(struct drm_i915_gem_object *obj); | ||
1125 | void i915_gem_release_mmap(struct drm_i915_gem_object *obj); | ||
974 | void i915_gem_lastclose(struct drm_device *dev); | 1126 | void i915_gem_lastclose(struct drm_device *dev); |
975 | uint32_t i915_get_gem_seqno(struct drm_device *dev, | 1127 | |
976 | struct intel_ring_buffer *ring); | 1128 | int __must_check i915_mutex_lock_interruptible(struct drm_device *dev); |
977 | bool i915_seqno_passed(uint32_t seq1, uint32_t seq2); | 1129 | int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj); |
978 | int i915_gem_object_get_fence_reg(struct drm_gem_object *obj); | 1130 | void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj, |
979 | int i915_gem_object_put_fence_reg(struct drm_gem_object *obj); | 1131 | struct intel_ring_buffer *ring, |
1132 | u32 seqno); | ||
1133 | |||
1134 | int i915_gem_dumb_create(struct drm_file *file_priv, | ||
1135 | struct drm_device *dev, | ||
1136 | struct drm_mode_create_dumb *args); | ||
1137 | int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev, | ||
1138 | uint32_t handle, uint64_t *offset); | ||
1139 | int i915_gem_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev, | ||
1140 | uint32_t handle); | ||
1141 | /** | ||
1142 | * Returns true if seq1 is later than seq2. | ||
1143 | */ | ||
1144 | static inline bool | ||
1145 | i915_seqno_passed(uint32_t seq1, uint32_t seq2) | ||
1146 | { | ||
1147 | return (int32_t)(seq1 - seq2) >= 0; | ||
1148 | } | ||
1149 | |||
1150 | static inline u32 | ||
1151 | i915_gem_next_request_seqno(struct intel_ring_buffer *ring) | ||
1152 | { | ||
1153 | drm_i915_private_t *dev_priv = ring->dev->dev_private; | ||
1154 | return ring->outstanding_lazy_request = dev_priv->next_seqno; | ||
1155 | } | ||
1156 | |||
1157 | int __must_check i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | ||
1158 | struct intel_ring_buffer *pipelined); | ||
1159 | int __must_check i915_gem_object_put_fence(struct drm_i915_gem_object *obj); | ||
1160 | |||
980 | void i915_gem_retire_requests(struct drm_device *dev); | 1161 | void i915_gem_retire_requests(struct drm_device *dev); |
981 | void i915_gem_retire_work_handler(struct work_struct *work); | 1162 | void i915_gem_reset(struct drm_device *dev); |
982 | void i915_gem_clflush_object(struct drm_gem_object *obj); | 1163 | void i915_gem_clflush_object(struct drm_i915_gem_object *obj); |
983 | int i915_gem_object_set_domain(struct drm_gem_object *obj, | 1164 | int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj, |
984 | uint32_t read_domains, | 1165 | uint32_t read_domains, |
985 | uint32_t write_domain); | 1166 | uint32_t write_domain); |
986 | int i915_gem_init_ringbuffer(struct drm_device *dev); | 1167 | int __must_check i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj); |
1168 | int __must_check i915_gem_init_ringbuffer(struct drm_device *dev); | ||
987 | void i915_gem_cleanup_ringbuffer(struct drm_device *dev); | 1169 | void i915_gem_cleanup_ringbuffer(struct drm_device *dev); |
988 | int i915_gem_do_init(struct drm_device *dev, unsigned long start, | 1170 | void i915_gem_do_init(struct drm_device *dev, |
989 | unsigned long end); | 1171 | unsigned long start, |
990 | int i915_gpu_idle(struct drm_device *dev); | 1172 | unsigned long mappable_end, |
991 | int i915_gem_idle(struct drm_device *dev); | 1173 | unsigned long end); |
992 | uint32_t i915_add_request(struct drm_device *dev, | 1174 | int __must_check i915_gpu_idle(struct drm_device *dev); |
993 | struct drm_file *file_priv, | 1175 | int __must_check i915_gem_idle(struct drm_device *dev); |
994 | uint32_t flush_domains, | 1176 | int __must_check i915_add_request(struct intel_ring_buffer *ring, |
995 | struct intel_ring_buffer *ring); | 1177 | struct drm_file *file, |
996 | int i915_do_wait_request(struct drm_device *dev, | 1178 | struct drm_i915_gem_request *request); |
997 | uint32_t seqno, int interruptible, | 1179 | int __must_check i915_wait_request(struct intel_ring_buffer *ring, |
998 | struct intel_ring_buffer *ring); | 1180 | uint32_t seqno); |
999 | int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); | 1181 | int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); |
1000 | int i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, | 1182 | int __must_check |
1001 | int write); | 1183 | i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, |
1002 | int i915_gem_object_set_to_display_plane(struct drm_gem_object *obj); | 1184 | bool write); |
1185 | int __must_check | ||
1186 | i915_gem_object_set_to_display_plane(struct drm_i915_gem_object *obj, | ||
1187 | struct intel_ring_buffer *pipelined); | ||
1003 | int i915_gem_attach_phys_object(struct drm_device *dev, | 1188 | int i915_gem_attach_phys_object(struct drm_device *dev, |
1004 | struct drm_gem_object *obj, | 1189 | struct drm_i915_gem_object *obj, |
1005 | int id, | 1190 | int id, |
1006 | int align); | 1191 | int align); |
1007 | void i915_gem_detach_phys_object(struct drm_device *dev, | 1192 | void i915_gem_detach_phys_object(struct drm_device *dev, |
1008 | struct drm_gem_object *obj); | 1193 | struct drm_i915_gem_object *obj); |
1009 | void i915_gem_free_all_phys_object(struct drm_device *dev); | 1194 | void i915_gem_free_all_phys_object(struct drm_device *dev); |
1010 | int i915_gem_object_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); | 1195 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); |
1011 | void i915_gem_object_put_pages(struct drm_gem_object *obj); | ||
1012 | void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv); | ||
1013 | int i915_gem_object_flush_write_domain(struct drm_gem_object *obj); | ||
1014 | 1196 | ||
1015 | void i915_gem_shrinker_init(void); | 1197 | uint32_t |
1016 | void i915_gem_shrinker_exit(void); | 1198 | i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, |
1199 | uint32_t size, | ||
1200 | int tiling_mode); | ||
1201 | |||
1202 | /* i915_gem_gtt.c */ | ||
1203 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); | ||
1204 | int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); | ||
1205 | void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj); | ||
1017 | 1206 | ||
1018 | /* i915_gem_evict.c */ | 1207 | /* i915_gem_evict.c */ |
1019 | int i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignment); | 1208 | int __must_check i915_gem_evict_something(struct drm_device *dev, int min_size, |
1020 | int i915_gem_evict_everything(struct drm_device *dev); | 1209 | unsigned alignment, bool mappable); |
1021 | int i915_gem_evict_inactive(struct drm_device *dev); | 1210 | int __must_check i915_gem_evict_everything(struct drm_device *dev, |
1211 | bool purgeable_only); | ||
1212 | int __must_check i915_gem_evict_inactive(struct drm_device *dev, | ||
1213 | bool purgeable_only); | ||
1022 | 1214 | ||
1023 | /* i915_gem_tiling.c */ | 1215 | /* i915_gem_tiling.c */ |
1024 | void i915_gem_detect_bit_6_swizzle(struct drm_device *dev); | 1216 | void i915_gem_detect_bit_6_swizzle(struct drm_device *dev); |
1025 | void i915_gem_object_do_bit_17_swizzle(struct drm_gem_object *obj); | 1217 | void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj); |
1026 | void i915_gem_object_save_bit_17_swizzle(struct drm_gem_object *obj); | 1218 | void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj); |
1027 | bool i915_tiling_ok(struct drm_device *dev, int stride, int size, | ||
1028 | int tiling_mode); | ||
1029 | bool i915_gem_object_fence_offset_ok(struct drm_gem_object *obj, | ||
1030 | int tiling_mode); | ||
1031 | 1219 | ||
1032 | /* i915_gem_debug.c */ | 1220 | /* i915_gem_debug.c */ |
1033 | void i915_gem_dump_object(struct drm_gem_object *obj, int len, | 1221 | void i915_gem_dump_object(struct drm_i915_gem_object *obj, int len, |
1034 | const char *where, uint32_t mark); | 1222 | const char *where, uint32_t mark); |
1035 | #if WATCH_INACTIVE | 1223 | #if WATCH_LISTS |
1036 | void i915_verify_inactive(struct drm_device *dev, char *file, int line); | 1224 | int i915_verify_lists(struct drm_device *dev); |
1037 | #else | 1225 | #else |
1038 | #define i915_verify_inactive(dev, file, line) | 1226 | #define i915_verify_lists(dev) 0 |
1039 | #endif | 1227 | #endif |
1040 | void i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle); | 1228 | void i915_gem_object_check_coherency(struct drm_i915_gem_object *obj, |
1041 | void i915_gem_dump_object(struct drm_gem_object *obj, int len, | 1229 | int handle); |
1230 | void i915_gem_dump_object(struct drm_i915_gem_object *obj, int len, | ||
1042 | const char *where, uint32_t mark); | 1231 | const char *where, uint32_t mark); |
1043 | void i915_dump_lru(struct drm_device *dev, const char *where); | ||
1044 | 1232 | ||
1045 | /* i915_debugfs.c */ | 1233 | /* i915_debugfs.c */ |
1046 | int i915_debugfs_init(struct drm_minor *minor); | 1234 | int i915_debugfs_init(struct drm_minor *minor); |
@@ -1054,23 +1242,45 @@ extern int i915_restore_state(struct drm_device *dev); | |||
1054 | extern int i915_save_state(struct drm_device *dev); | 1242 | extern int i915_save_state(struct drm_device *dev); |
1055 | extern int i915_restore_state(struct drm_device *dev); | 1243 | extern int i915_restore_state(struct drm_device *dev); |
1056 | 1244 | ||
1245 | /* intel_i2c.c */ | ||
1246 | extern int intel_setup_gmbus(struct drm_device *dev); | ||
1247 | extern void intel_teardown_gmbus(struct drm_device *dev); | ||
1248 | extern void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed); | ||
1249 | extern void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit); | ||
1250 | extern inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter) | ||
1251 | { | ||
1252 | return container_of(adapter, struct intel_gmbus, adapter)->force_bit; | ||
1253 | } | ||
1254 | extern void intel_i2c_reset(struct drm_device *dev); | ||
1255 | |||
1256 | /* intel_opregion.c */ | ||
1257 | extern int intel_opregion_setup(struct drm_device *dev); | ||
1057 | #ifdef CONFIG_ACPI | 1258 | #ifdef CONFIG_ACPI |
1058 | /* i915_opregion.c */ | 1259 | extern void intel_opregion_init(struct drm_device *dev); |
1059 | extern int intel_opregion_init(struct drm_device *dev, int resume); | 1260 | extern void intel_opregion_fini(struct drm_device *dev); |
1060 | extern void intel_opregion_free(struct drm_device *dev, int suspend); | 1261 | extern void intel_opregion_asle_intr(struct drm_device *dev); |
1061 | extern void opregion_asle_intr(struct drm_device *dev); | 1262 | extern void intel_opregion_gse_intr(struct drm_device *dev); |
1062 | extern void ironlake_opregion_gse_intr(struct drm_device *dev); | 1263 | extern void intel_opregion_enable_asle(struct drm_device *dev); |
1063 | extern void opregion_enable_asle(struct drm_device *dev); | ||
1064 | #else | 1264 | #else |
1065 | static inline int intel_opregion_init(struct drm_device *dev, int resume) { return 0; } | 1265 | static inline void intel_opregion_init(struct drm_device *dev) { return; } |
1066 | static inline void intel_opregion_free(struct drm_device *dev, int suspend) { return; } | 1266 | static inline void intel_opregion_fini(struct drm_device *dev) { return; } |
1067 | static inline void opregion_asle_intr(struct drm_device *dev) { return; } | 1267 | static inline void intel_opregion_asle_intr(struct drm_device *dev) { return; } |
1068 | static inline void ironlake_opregion_gse_intr(struct drm_device *dev) { return; } | 1268 | static inline void intel_opregion_gse_intr(struct drm_device *dev) { return; } |
1069 | static inline void opregion_enable_asle(struct drm_device *dev) { return; } | 1269 | static inline void intel_opregion_enable_asle(struct drm_device *dev) { return; } |
1070 | #endif | 1270 | #endif |
1071 | 1271 | ||
1272 | /* intel_acpi.c */ | ||
1273 | #ifdef CONFIG_ACPI | ||
1274 | extern void intel_register_dsm_handler(void); | ||
1275 | extern void intel_unregister_dsm_handler(void); | ||
1276 | #else | ||
1277 | static inline void intel_register_dsm_handler(void) { return; } | ||
1278 | static inline void intel_unregister_dsm_handler(void) { return; } | ||
1279 | #endif /* CONFIG_ACPI */ | ||
1280 | |||
1072 | /* modesetting */ | 1281 | /* modesetting */ |
1073 | extern void intel_modeset_init(struct drm_device *dev); | 1282 | extern void intel_modeset_init(struct drm_device *dev); |
1283 | extern void intel_modeset_gem_init(struct drm_device *dev); | ||
1074 | extern void intel_modeset_cleanup(struct drm_device *dev); | 1284 | extern void intel_modeset_cleanup(struct drm_device *dev); |
1075 | extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state); | 1285 | extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state); |
1076 | extern void i8xx_disable_fbc(struct drm_device *dev); | 1286 | extern void i8xx_disable_fbc(struct drm_device *dev); |
@@ -1080,145 +1290,110 @@ extern void intel_disable_fbc(struct drm_device *dev); | |||
1080 | extern void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval); | 1290 | extern void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval); |
1081 | extern bool intel_fbc_enabled(struct drm_device *dev); | 1291 | extern bool intel_fbc_enabled(struct drm_device *dev); |
1082 | extern bool ironlake_set_drps(struct drm_device *dev, u8 val); | 1292 | extern bool ironlake_set_drps(struct drm_device *dev, u8 val); |
1293 | extern void ironlake_enable_rc6(struct drm_device *dev); | ||
1294 | extern void gen6_set_rps(struct drm_device *dev, u8 val); | ||
1083 | extern void intel_detect_pch (struct drm_device *dev); | 1295 | extern void intel_detect_pch (struct drm_device *dev); |
1084 | extern int intel_trans_dp_port_sel (struct drm_crtc *crtc); | 1296 | extern int intel_trans_dp_port_sel (struct drm_crtc *crtc); |
1085 | 1297 | ||
1086 | /* overlay */ | 1298 | /* overlay */ |
1299 | #ifdef CONFIG_DEBUG_FS | ||
1087 | extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev); | 1300 | extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev); |
1088 | extern void intel_overlay_print_error_state(struct seq_file *m, struct intel_overlay_error_state *error); | 1301 | extern void intel_overlay_print_error_state(struct seq_file *m, struct intel_overlay_error_state *error); |
1089 | 1302 | ||
1090 | /** | 1303 | extern struct intel_display_error_state *intel_display_capture_error_state(struct drm_device *dev); |
1091 | * Lock test for when it's just for synchronization of ring access. | 1304 | extern void intel_display_print_error_state(struct seq_file *m, |
1092 | * | 1305 | struct drm_device *dev, |
1093 | * In that case, we don't need to do it when GEM is initialized as nobody else | 1306 | struct intel_display_error_state *error); |
1094 | * has access to the ring. | 1307 | #endif |
1095 | */ | ||
1096 | #define RING_LOCK_TEST_WITH_RETURN(dev, file_priv) do { \ | ||
1097 | if (((drm_i915_private_t *)dev->dev_private)->render_ring.gem_object \ | ||
1098 | == NULL) \ | ||
1099 | LOCK_TEST_WITH_RETURN(dev, file_priv); \ | ||
1100 | } while (0) | ||
1101 | 1308 | ||
1102 | #define I915_READ(reg) readl(dev_priv->regs + (reg)) | 1309 | #define LP_RING(d) (&((struct drm_i915_private *)(d))->ring[RCS]) |
1103 | #define I915_WRITE(reg, val) writel(val, dev_priv->regs + (reg)) | ||
1104 | #define I915_READ16(reg) readw(dev_priv->regs + (reg)) | ||
1105 | #define I915_WRITE16(reg, val) writel(val, dev_priv->regs + (reg)) | ||
1106 | #define I915_READ8(reg) readb(dev_priv->regs + (reg)) | ||
1107 | #define I915_WRITE8(reg, val) writeb(val, dev_priv->regs + (reg)) | ||
1108 | #define I915_WRITE64(reg, val) writeq(val, dev_priv->regs + (reg)) | ||
1109 | #define I915_READ64(reg) readq(dev_priv->regs + (reg)) | ||
1110 | #define POSTING_READ(reg) (void)I915_READ(reg) | ||
1111 | #define POSTING_READ16(reg) (void)I915_READ16(reg) | ||
1112 | |||
1113 | #define I915_VERBOSE 0 | ||
1114 | |||
1115 | #define BEGIN_LP_RING(n) do { \ | ||
1116 | drm_i915_private_t *dev_priv__ = dev->dev_private; \ | ||
1117 | if (I915_VERBOSE) \ | ||
1118 | DRM_DEBUG(" BEGIN_LP_RING %x\n", (int)(n)); \ | ||
1119 | intel_ring_begin(dev, &dev_priv__->render_ring, (n)); \ | ||
1120 | } while (0) | ||
1121 | 1310 | ||
1311 | #define BEGIN_LP_RING(n) \ | ||
1312 | intel_ring_begin(LP_RING(dev_priv), (n)) | ||
1122 | 1313 | ||
1123 | #define OUT_RING(x) do { \ | 1314 | #define OUT_RING(x) \ |
1124 | drm_i915_private_t *dev_priv__ = dev->dev_private; \ | 1315 | intel_ring_emit(LP_RING(dev_priv), x) |
1125 | if (I915_VERBOSE) \ | ||
1126 | DRM_DEBUG(" OUT_RING %x\n", (int)(x)); \ | ||
1127 | intel_ring_emit(dev, &dev_priv__->render_ring, x); \ | ||
1128 | } while (0) | ||
1129 | 1316 | ||
1130 | #define ADVANCE_LP_RING() do { \ | 1317 | #define ADVANCE_LP_RING() \ |
1131 | drm_i915_private_t *dev_priv__ = dev->dev_private; \ | 1318 | intel_ring_advance(LP_RING(dev_priv)) |
1132 | if (I915_VERBOSE) \ | ||
1133 | DRM_DEBUG("ADVANCE_LP_RING %x\n", \ | ||
1134 | dev_priv__->render_ring.tail); \ | ||
1135 | intel_ring_advance(dev, &dev_priv__->render_ring); \ | ||
1136 | } while(0) | ||
1137 | 1319 | ||
1138 | /** | 1320 | /** |
1139 | * Reads a dword out of the status page, which is written to from the command | 1321 | * Lock test for when it's just for synchronization of ring access. |
1140 | * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or | ||
1141 | * MI_STORE_DATA_IMM. | ||
1142 | * | ||
1143 | * The following dwords have a reserved meaning: | ||
1144 | * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes. | ||
1145 | * 0x04: ring 0 head pointer | ||
1146 | * 0x05: ring 1 head pointer (915-class) | ||
1147 | * 0x06: ring 2 head pointer (915-class) | ||
1148 | * 0x10-0x1b: Context status DWords (GM45) | ||
1149 | * 0x1f: Last written status offset. (GM45) | ||
1150 | * | 1322 | * |
1151 | * The area from dword 0x20 to 0x3ff is available for driver usage. | 1323 | * In that case, we don't need to do it when GEM is initialized as nobody else |
1324 | * has access to the ring. | ||
1152 | */ | 1325 | */ |
1153 | #define READ_HWSP(dev_priv, reg) (((volatile u32 *)\ | 1326 | #define RING_LOCK_TEST_WITH_RETURN(dev, file) do { \ |
1154 | (dev_priv->render_ring.status_page.page_addr))[reg]) | 1327 | if (LP_RING(dev->dev_private)->obj == NULL) \ |
1155 | #define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) | 1328 | LOCK_TEST_WITH_RETURN(dev, file); \ |
1156 | #define I915_GEM_HWS_INDEX 0x20 | 1329 | } while (0) |
1157 | #define I915_BREADCRUMB_INDEX 0x21 | ||
1158 | |||
1159 | #define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) | ||
1160 | |||
1161 | #define IS_I830(dev) ((dev)->pci_device == 0x3577) | ||
1162 | #define IS_845G(dev) ((dev)->pci_device == 0x2562) | ||
1163 | #define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) | ||
1164 | #define IS_I865G(dev) ((dev)->pci_device == 0x2572) | ||
1165 | #define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g) | ||
1166 | #define IS_I915GM(dev) ((dev)->pci_device == 0x2592) | ||
1167 | #define IS_I945G(dev) ((dev)->pci_device == 0x2772) | ||
1168 | #define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm) | ||
1169 | #define IS_I965G(dev) (INTEL_INFO(dev)->is_i965g) | ||
1170 | #define IS_I965GM(dev) (INTEL_INFO(dev)->is_i965gm) | ||
1171 | #define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater) | ||
1172 | #define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline) | ||
1173 | #define IS_GM45(dev) ((dev)->pci_device == 0x2A42) | ||
1174 | #define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x) | ||
1175 | #define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001) | ||
1176 | #define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011) | ||
1177 | #define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview) | ||
1178 | #define IS_G33(dev) (INTEL_INFO(dev)->is_g33) | ||
1179 | #define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042) | ||
1180 | #define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046) | ||
1181 | #define IS_IRONLAKE(dev) (INTEL_INFO(dev)->is_ironlake) | ||
1182 | #define IS_I9XX(dev) (INTEL_INFO(dev)->is_i9xx) | ||
1183 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) | ||
1184 | |||
1185 | #define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2) | ||
1186 | #define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3) | ||
1187 | #define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4) | ||
1188 | #define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5) | ||
1189 | #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) | ||
1190 | |||
1191 | #define HAS_BSD(dev) (IS_IRONLAKE(dev) || IS_G4X(dev)) | ||
1192 | #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) | ||
1193 | 1330 | ||
1194 | /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte | 1331 | /* On SNB platform, before reading ring registers forcewake bit |
1195 | * rows, which changed the alignment requirements and fence programming. | 1332 | * must be set to prevent GT core from power down and stale values being |
1333 | * returned. | ||
1196 | */ | 1334 | */ |
1197 | #define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \ | 1335 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); |
1198 | IS_I915GM(dev))) | 1336 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); |
1199 | #define SUPPORTS_DIGITAL_OUTPUTS(dev) (IS_I9XX(dev) && !IS_PINEVIEW(dev)) | 1337 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); |
1200 | #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) | 1338 | |
1201 | #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) | 1339 | /* We give fast paths for the really cool registers */ |
1202 | #define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev)) | 1340 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ |
1203 | #define SUPPORTS_TV(dev) (IS_I9XX(dev) && IS_MOBILE(dev) && \ | 1341 | (((dev_priv)->info->gen >= 6) && \ |
1204 | !IS_IRONLAKE(dev) && !IS_PINEVIEW(dev) && \ | 1342 | ((reg) < 0x40000) && \ |
1205 | !IS_GEN6(dev)) | 1343 | ((reg) != FORCEWAKE)) |
1206 | #define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug) | 1344 | |
1207 | /* dsparb controlled by hw only */ | 1345 | #define __i915_read(x, y) \ |
1208 | #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) | 1346 | static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ |
1209 | 1347 | u##x val = 0; \ | |
1210 | #define HAS_FW_BLC(dev) (IS_I9XX(dev) || IS_G4X(dev) || IS_IRONLAKE(dev)) | 1348 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
1211 | #define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) | 1349 | gen6_gt_force_wake_get(dev_priv); \ |
1212 | #define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) | 1350 | val = read##y(dev_priv->regs + reg); \ |
1213 | #define I915_HAS_RC6(dev) (INTEL_INFO(dev)->has_rc6) | 1351 | gen6_gt_force_wake_put(dev_priv); \ |
1214 | 1352 | } else { \ | |
1215 | #define HAS_PCH_SPLIT(dev) (IS_IRONLAKE(dev) || \ | 1353 | val = read##y(dev_priv->regs + reg); \ |
1216 | IS_GEN6(dev)) | 1354 | } \ |
1217 | #define HAS_PIPE_CONTROL(dev) (IS_IRONLAKE(dev) || IS_GEN6(dev)) | 1355 | trace_i915_reg_rw(false, reg, val, sizeof(val)); \ |
1218 | 1356 | return val; \ | |
1219 | #define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type) | 1357 | } |
1220 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) | 1358 | |
1359 | __i915_read(8, b) | ||
1360 | __i915_read(16, w) | ||
1361 | __i915_read(32, l) | ||
1362 | __i915_read(64, q) | ||
1363 | #undef __i915_read | ||
1364 | |||
1365 | #define __i915_write(x, y) \ | ||
1366 | static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ | ||
1367 | trace_i915_reg_rw(true, reg, val, sizeof(val)); \ | ||
1368 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ | ||
1369 | __gen6_gt_wait_for_fifo(dev_priv); \ | ||
1370 | } \ | ||
1371 | write##y(val, dev_priv->regs + reg); \ | ||
1372 | } | ||
1373 | __i915_write(8, b) | ||
1374 | __i915_write(16, w) | ||
1375 | __i915_write(32, l) | ||
1376 | __i915_write(64, q) | ||
1377 | #undef __i915_write | ||
1378 | |||
1379 | #define I915_READ8(reg) i915_read8(dev_priv, (reg)) | ||
1380 | #define I915_WRITE8(reg, val) i915_write8(dev_priv, (reg), (val)) | ||
1381 | |||
1382 | #define I915_READ16(reg) i915_read16(dev_priv, (reg)) | ||
1383 | #define I915_WRITE16(reg, val) i915_write16(dev_priv, (reg), (val)) | ||
1384 | #define I915_READ16_NOTRACE(reg) readw(dev_priv->regs + (reg)) | ||
1385 | #define I915_WRITE16_NOTRACE(reg, val) writew(val, dev_priv->regs + (reg)) | ||
1386 | |||
1387 | #define I915_READ(reg) i915_read32(dev_priv, (reg)) | ||
1388 | #define I915_WRITE(reg, val) i915_write32(dev_priv, (reg), (val)) | ||
1389 | #define I915_READ_NOTRACE(reg) readl(dev_priv->regs + (reg)) | ||
1390 | #define I915_WRITE_NOTRACE(reg, val) writel(val, dev_priv->regs + (reg)) | ||
1391 | |||
1392 | #define I915_WRITE64(reg, val) i915_write64(dev_priv, (reg), (val)) | ||
1393 | #define I915_READ64(reg) i915_read64(dev_priv, (reg)) | ||
1394 | |||
1395 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) | ||
1396 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) | ||
1221 | 1397 | ||
1222 | #define PRIMARY_RINGBUFFER_SIZE (128*1024) | ||
1223 | 1398 | ||
1224 | #endif | 1399 | #endif |