aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_drv.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.h')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h137
1 files changed, 52 insertions, 85 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a78197d43ce6..449650545bb4 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -49,17 +49,22 @@
49enum pipe { 49enum pipe {
50 PIPE_A = 0, 50 PIPE_A = 0,
51 PIPE_B, 51 PIPE_B,
52 PIPE_C,
53 I915_MAX_PIPES
52}; 54};
55#define pipe_name(p) ((p) + 'A')
53 56
54enum plane { 57enum plane {
55 PLANE_A = 0, 58 PLANE_A = 0,
56 PLANE_B, 59 PLANE_B,
60 PLANE_C,
57}; 61};
58 62#define plane_name(p) ((p) + 'A')
59#define I915_NUM_PIPE 2
60 63
61#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))
62 65
66#define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++)
67
63/* Interface history: 68/* Interface history:
64 * 69 *
65 * 1.1: Original. 70 * 1.1: Original.
@@ -75,10 +80,7 @@ enum plane {
75#define DRIVER_PATCHLEVEL 0 80#define DRIVER_PATCHLEVEL 0
76 81
77#define WATCH_COHERENCY 0 82#define WATCH_COHERENCY 0
78#define WATCH_EXEC 0
79#define WATCH_RELOC 0
80#define WATCH_LISTS 0 83#define WATCH_LISTS 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
@@ -111,6 +113,7 @@ struct intel_opregion {
111 struct opregion_swsci *swsci; 113 struct opregion_swsci *swsci;
112 struct opregion_asle *asle; 114 struct opregion_asle *asle;
113 void *vbt; 115 void *vbt;
116 u32 __iomem *lid_state;
114}; 117};
115#define OPREGION_SIZE (8*1024) 118#define OPREGION_SIZE (8*1024)
116 119
@@ -144,8 +147,7 @@ struct intel_display_error_state;
144struct drm_i915_error_state { 147struct drm_i915_error_state {
145 u32 eir; 148 u32 eir;
146 u32 pgtbl_er; 149 u32 pgtbl_er;
147 u32 pipeastat; 150 u32 pipestat[I915_MAX_PIPES];
148 u32 pipebstat;
149 u32 ipeir; 151 u32 ipeir;
150 u32 ipehr; 152 u32 ipehr;
151 u32 instdone; 153 u32 instdone;
@@ -172,7 +174,7 @@ struct drm_i915_error_state {
172 int page_count; 174 int page_count;
173 u32 gtt_offset; 175 u32 gtt_offset;
174 u32 *pages[0]; 176 u32 *pages[0];
175 } *ringbuffer, *batchbuffer[I915_NUM_RINGS]; 177 } *ringbuffer[I915_NUM_RINGS], *batchbuffer[I915_NUM_RINGS];
176 struct drm_i915_error_buffer { 178 struct drm_i915_error_buffer {
177 u32 size; 179 u32 size;
178 u32 name; 180 u32 name;
@@ -200,9 +202,7 @@ struct drm_i915_display_funcs {
200 void (*disable_fbc)(struct drm_device *dev); 202 void (*disable_fbc)(struct drm_device *dev);
201 int (*get_display_clock_speed)(struct drm_device *dev); 203 int (*get_display_clock_speed)(struct drm_device *dev);
202 int (*get_fifo_size)(struct drm_device *dev, int plane); 204 int (*get_fifo_size)(struct drm_device *dev, int plane);
203 void (*update_wm)(struct drm_device *dev, int planea_clock, 205 void (*update_wm)(struct drm_device *dev);
204 int planeb_clock, int sr_hdisplay, int sr_htotal,
205 int pixel_size);
206 /* clock updates for mode set */ 206 /* clock updates for mode set */
207 /* cursor updates */ 207 /* cursor updates */
208 /* render clock increase/decrease */ 208 /* render clock increase/decrease */
@@ -274,7 +274,6 @@ typedef struct drm_i915_private {
274 uint32_t next_seqno; 274 uint32_t next_seqno;
275 275
276 drm_dma_handle_t *status_page_dmah; 276 drm_dma_handle_t *status_page_dmah;
277 dma_addr_t dma_status_page;
278 uint32_t counter; 277 uint32_t counter;
279 drm_local_map_t hws_map; 278 drm_local_map_t hws_map;
280 struct drm_i915_gem_object *pwrctx; 279 struct drm_i915_gem_object *pwrctx;
@@ -289,7 +288,6 @@ typedef struct drm_i915_private {
289 int page_flipping; 288 int page_flipping;
290 289
291 atomic_t irq_received; 290 atomic_t irq_received;
292 u32 trace_irq_seqno;
293 291
294 /* protects the irq masks */ 292 /* protects the irq masks */
295 spinlock_t irq_lock; 293 spinlock_t irq_lock;
@@ -324,8 +322,6 @@ typedef struct drm_i915_private {
324 int cfb_plane; 322 int cfb_plane;
325 int cfb_y; 323 int cfb_y;
326 324
327 int irq_enabled;
328
329 struct intel_opregion opregion; 325 struct intel_opregion opregion;
330 326
331 /* overlay */ 327 /* overlay */
@@ -387,7 +383,6 @@ typedef struct drm_i915_private {
387 u32 saveDSPACNTR; 383 u32 saveDSPACNTR;
388 u32 saveDSPBCNTR; 384 u32 saveDSPBCNTR;
389 u32 saveDSPARB; 385 u32 saveDSPARB;
390 u32 saveHWS;
391 u32 savePIPEACONF; 386 u32 savePIPEACONF;
392 u32 savePIPEBCONF; 387 u32 savePIPEBCONF;
393 u32 savePIPEASRC; 388 u32 savePIPEASRC;
@@ -615,6 +610,12 @@ typedef struct drm_i915_private {
615 struct delayed_work retire_work; 610 struct delayed_work retire_work;
616 611
617 /** 612 /**
613 * Are we in a non-interruptible section of code like
614 * modesetting?
615 */
616 bool interruptible;
617
618 /**
618 * Flag if the X Server, and thus DRM, is not currently in 619 * Flag if the X Server, and thus DRM, is not currently in
619 * control of the device. 620 * control of the device.
620 * 621 *
@@ -652,6 +653,7 @@ typedef struct drm_i915_private {
652 unsigned int lvds_border_bits; 653 unsigned int lvds_border_bits;
653 /* Panel fitter placement and size for Ironlake+ */ 654 /* Panel fitter placement and size for Ironlake+ */
654 u32 pch_pf_pos, pch_pf_size; 655 u32 pch_pf_pos, pch_pf_size;
656 int panel_t3, panel_t12;
655 657
656 struct drm_crtc *plane_to_crtc_mapping[2]; 658 struct drm_crtc *plane_to_crtc_mapping[2];
657 struct drm_crtc *pipe_to_crtc_mapping[2]; 659 struct drm_crtc *pipe_to_crtc_mapping[2];
@@ -698,6 +700,8 @@ typedef struct drm_i915_private {
698 700
699 /* list of fbdev register on this device */ 701 /* list of fbdev register on this device */
700 struct intel_fbdev *fbdev; 702 struct intel_fbdev *fbdev;
703
704 struct drm_property *broadcast_rgb_property;
701} drm_i915_private_t; 705} drm_i915_private_t;
702 706
703struct drm_i915_gem_object { 707struct drm_i915_gem_object {
@@ -955,9 +959,13 @@ enum intel_chip_family {
955extern struct drm_ioctl_desc i915_ioctls[]; 959extern struct drm_ioctl_desc i915_ioctls[];
956extern int i915_max_ioctl; 960extern int i915_max_ioctl;
957extern unsigned int i915_fbpercrtc; 961extern unsigned int i915_fbpercrtc;
962extern int i915_panel_ignore_lid;
958extern unsigned int i915_powersave; 963extern unsigned int i915_powersave;
964extern unsigned int i915_semaphores;
959extern unsigned int i915_lvds_downclock; 965extern unsigned int i915_lvds_downclock;
960extern unsigned int i915_panel_use_ssc; 966extern unsigned int i915_panel_use_ssc;
967extern int i915_vbt_sdvo_panel_type;
968extern unsigned int i915_enable_rc6;
961 969
962extern int i915_suspend(struct drm_device *dev, pm_message_t state); 970extern int i915_suspend(struct drm_device *dev, pm_message_t state);
963extern int i915_resume(struct drm_device *dev); 971extern int i915_resume(struct drm_device *dev);
@@ -996,8 +1004,6 @@ extern int i915_irq_emit(struct drm_device *dev, void *data,
996 struct drm_file *file_priv); 1004 struct drm_file *file_priv);
997extern int i915_irq_wait(struct drm_device *dev, void *data, 1005extern int i915_irq_wait(struct drm_device *dev, void *data,
998 struct drm_file *file_priv); 1006 struct drm_file *file_priv);
999void i915_trace_irq_get(struct drm_device *dev, u32 seqno);
1000extern void i915_enable_interrupt (struct drm_device *dev);
1001 1007
1002extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); 1008extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
1003extern void i915_driver_irq_preinstall(struct drm_device * dev); 1009extern void i915_driver_irq_preinstall(struct drm_device * dev);
@@ -1049,7 +1055,6 @@ extern void i915_mem_takedown(struct mem_block **heap);
1049extern void i915_mem_release(struct drm_device * dev, 1055extern void i915_mem_release(struct drm_device * dev,
1050 struct drm_file *file_priv, struct mem_block *heap); 1056 struct drm_file *file_priv, struct mem_block *heap);
1051/* i915_gem.c */ 1057/* i915_gem.c */
1052int i915_gem_check_is_wedged(struct drm_device *dev);
1053int i915_gem_init_ioctl(struct drm_device *dev, void *data, 1058int i915_gem_init_ioctl(struct drm_device *dev, void *data,
1054 struct drm_file *file_priv); 1059 struct drm_file *file_priv);
1055int i915_gem_create_ioctl(struct drm_device *dev, void *data, 1060int i915_gem_create_ioctl(struct drm_device *dev, void *data,
@@ -1092,8 +1097,7 @@ int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
1092 struct drm_file *file_priv); 1097 struct drm_file *file_priv);
1093void i915_gem_load(struct drm_device *dev); 1098void i915_gem_load(struct drm_device *dev);
1094int i915_gem_init_object(struct drm_gem_object *obj); 1099int i915_gem_init_object(struct drm_gem_object *obj);
1095int __must_check i915_gem_flush_ring(struct drm_device *dev, 1100int __must_check i915_gem_flush_ring(struct intel_ring_buffer *ring,
1096 struct intel_ring_buffer *ring,
1097 uint32_t invalidate_domains, 1101 uint32_t invalidate_domains,
1098 uint32_t flush_domains); 1102 uint32_t flush_domains);
1099struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, 1103struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
@@ -1108,8 +1112,7 @@ void i915_gem_release_mmap(struct drm_i915_gem_object *obj);
1108void i915_gem_lastclose(struct drm_device *dev); 1112void i915_gem_lastclose(struct drm_device *dev);
1109 1113
1110int __must_check i915_mutex_lock_interruptible(struct drm_device *dev); 1114int __must_check i915_mutex_lock_interruptible(struct drm_device *dev);
1111int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj, 1115int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj);
1112 bool interruptible);
1113void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj, 1116void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
1114 struct intel_ring_buffer *ring, 1117 struct intel_ring_buffer *ring,
1115 u32 seqno); 1118 u32 seqno);
@@ -1131,16 +1134,14 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2)
1131} 1134}
1132 1135
1133static inline u32 1136static inline u32
1134i915_gem_next_request_seqno(struct drm_device *dev, 1137i915_gem_next_request_seqno(struct intel_ring_buffer *ring)
1135 struct intel_ring_buffer *ring)
1136{ 1138{
1137 drm_i915_private_t *dev_priv = dev->dev_private; 1139 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1138 return ring->outstanding_lazy_request = dev_priv->next_seqno; 1140 return ring->outstanding_lazy_request = dev_priv->next_seqno;
1139} 1141}
1140 1142
1141int __must_check i915_gem_object_get_fence(struct drm_i915_gem_object *obj, 1143int __must_check i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
1142 struct intel_ring_buffer *pipelined, 1144 struct intel_ring_buffer *pipelined);
1143 bool interruptible);
1144int __must_check i915_gem_object_put_fence(struct drm_i915_gem_object *obj); 1145int __must_check i915_gem_object_put_fence(struct drm_i915_gem_object *obj);
1145 1146
1146void i915_gem_retire_requests(struct drm_device *dev); 1147void i915_gem_retire_requests(struct drm_device *dev);
@@ -1149,8 +1150,7 @@ void i915_gem_clflush_object(struct drm_i915_gem_object *obj);
1149int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj, 1150int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj,
1150 uint32_t read_domains, 1151 uint32_t read_domains,
1151 uint32_t write_domain); 1152 uint32_t write_domain);
1152int __must_check i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj, 1153int __must_check i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj);
1153 bool interruptible);
1154int __must_check i915_gem_init_ringbuffer(struct drm_device *dev); 1154int __must_check i915_gem_init_ringbuffer(struct drm_device *dev);
1155void i915_gem_cleanup_ringbuffer(struct drm_device *dev); 1155void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
1156void i915_gem_do_init(struct drm_device *dev, 1156void i915_gem_do_init(struct drm_device *dev,
@@ -1159,14 +1159,11 @@ void i915_gem_do_init(struct drm_device *dev,
1159 unsigned long end); 1159 unsigned long end);
1160int __must_check i915_gpu_idle(struct drm_device *dev); 1160int __must_check i915_gpu_idle(struct drm_device *dev);
1161int __must_check i915_gem_idle(struct drm_device *dev); 1161int __must_check i915_gem_idle(struct drm_device *dev);
1162int __must_check i915_add_request(struct drm_device *dev, 1162int __must_check i915_add_request(struct intel_ring_buffer *ring,
1163 struct drm_file *file_priv, 1163 struct drm_file *file,
1164 struct drm_i915_gem_request *request, 1164 struct drm_i915_gem_request *request);
1165 struct intel_ring_buffer *ring); 1165int __must_check i915_wait_request(struct intel_ring_buffer *ring,
1166int __must_check i915_do_wait_request(struct drm_device *dev, 1166 uint32_t seqno);
1167 uint32_t seqno,
1168 bool interruptible,
1169 struct intel_ring_buffer *ring);
1170int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); 1167int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
1171int __must_check 1168int __must_check
1172i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, 1169i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj,
@@ -1183,6 +1180,9 @@ void i915_gem_detach_phys_object(struct drm_device *dev,
1183void i915_gem_free_all_phys_object(struct drm_device *dev); 1180void i915_gem_free_all_phys_object(struct drm_device *dev);
1184void i915_gem_release(struct drm_device *dev, struct drm_file *file); 1181void i915_gem_release(struct drm_device *dev, struct drm_file *file);
1185 1182
1183uint32_t
1184i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj);
1185
1186/* i915_gem_gtt.c */ 1186/* i915_gem_gtt.c */
1187void i915_gem_restore_gtt_mappings(struct drm_device *dev); 1187void i915_gem_restore_gtt_mappings(struct drm_device *dev);
1188int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); 1188int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj);
@@ -1315,7 +1315,7 @@ extern void intel_display_print_error_state(struct seq_file *m,
1315#define __i915_read(x, y) \ 1315#define __i915_read(x, y) \
1316static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ 1316static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
1317 u##x val = read##y(dev_priv->regs + reg); \ 1317 u##x val = read##y(dev_priv->regs + reg); \
1318 trace_i915_reg_rw('R', reg, val, sizeof(val)); \ 1318 trace_i915_reg_rw(false, reg, val, sizeof(val)); \
1319 return val; \ 1319 return val; \
1320} 1320}
1321__i915_read(8, b) 1321__i915_read(8, b)
@@ -1326,7 +1326,7 @@ __i915_read(64, q)
1326 1326
1327#define __i915_write(x, y) \ 1327#define __i915_write(x, y) \
1328static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ 1328static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \
1329 trace_i915_reg_rw('W', reg, val, sizeof(val)); \ 1329 trace_i915_reg_rw(true, reg, val, sizeof(val)); \
1330 write##y(val, dev_priv->regs + reg); \ 1330 write##y(val, dev_priv->regs + reg); \
1331} 1331}
1332__i915_write(8, b) 1332__i915_write(8, b)
@@ -1359,62 +1359,29 @@ __i915_write(64, q)
1359 * must be set to prevent GT core from power down and stale values being 1359 * must be set to prevent GT core from power down and stale values being
1360 * returned. 1360 * returned.
1361 */ 1361 */
1362void __gen6_force_wake_get(struct drm_i915_private *dev_priv); 1362void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv);
1363void __gen6_force_wake_put (struct drm_i915_private *dev_priv); 1363void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv);
1364static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) 1364void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
1365
1366static inline u32 i915_gt_read(struct drm_i915_private *dev_priv, u32 reg)
1365{ 1367{
1366 u32 val; 1368 u32 val;
1367 1369
1368 if (dev_priv->info->gen >= 6) { 1370 if (dev_priv->info->gen >= 6) {
1369 __gen6_force_wake_get(dev_priv); 1371 __gen6_gt_force_wake_get(dev_priv);
1370 val = I915_READ(reg); 1372 val = I915_READ(reg);
1371 __gen6_force_wake_put(dev_priv); 1373 __gen6_gt_force_wake_put(dev_priv);
1372 } else 1374 } else
1373 val = I915_READ(reg); 1375 val = I915_READ(reg);
1374 1376
1375 return val; 1377 return val;
1376} 1378}
1377 1379
1378static inline void 1380static inline void i915_gt_write(struct drm_i915_private *dev_priv,
1379i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) 1381 u32 reg, u32 val)
1380{ 1382{
1381 /* Trace down the write operation before the real write */ 1383 if (dev_priv->info->gen >= 6)
1382 trace_i915_reg_rw('W', reg, val, len); 1384 __gen6_gt_wait_for_fifo(dev_priv);
1383 switch (len) { 1385 I915_WRITE(reg, val);
1384 case 8:
1385 writeq(val, dev_priv->regs + reg);
1386 break;
1387 case 4:
1388 writel(val, dev_priv->regs + reg);
1389 break;
1390 case 2:
1391 writew(val, dev_priv->regs + reg);
1392 break;
1393 case 1:
1394 writeb(val, dev_priv->regs + reg);
1395 break;
1396 }
1397} 1386}
1398
1399/**
1400 * Reads a dword out of the status page, which is written to from the command
1401 * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or
1402 * MI_STORE_DATA_IMM.
1403 *
1404 * The following dwords have a reserved meaning:
1405 * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes.
1406 * 0x04: ring 0 head pointer
1407 * 0x05: ring 1 head pointer (915-class)
1408 * 0x06: ring 2 head pointer (915-class)
1409 * 0x10-0x1b: Context status DWords (GM45)
1410 * 0x1f: Last written status offset. (GM45)
1411 *
1412 * The area from dword 0x20 to 0x3ff is available for driver usage.
1413 */
1414#define READ_HWSP(dev_priv, reg) (((volatile u32 *)\
1415 (LP_RING(dev_priv)->status_page.page_addr))[reg])
1416#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX)
1417#define I915_GEM_HWS_INDEX 0x20
1418#define I915_BREADCRUMB_INDEX 0x21
1419
1420#endif 1387#endif