diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.h')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 137 |
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 @@ | |||
49 | enum pipe { | 49 | enum 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 | ||
54 | enum plane { | 57 | enum 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; | |||
144 | struct drm_i915_error_state { | 147 | struct 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 | ||
703 | struct drm_i915_gem_object { | 707 | struct drm_i915_gem_object { |
@@ -955,9 +959,13 @@ enum intel_chip_family { | |||
955 | extern struct drm_ioctl_desc i915_ioctls[]; | 959 | extern struct drm_ioctl_desc i915_ioctls[]; |
956 | extern int i915_max_ioctl; | 960 | extern int i915_max_ioctl; |
957 | extern unsigned int i915_fbpercrtc; | 961 | extern unsigned int i915_fbpercrtc; |
962 | extern int i915_panel_ignore_lid; | ||
958 | extern unsigned int i915_powersave; | 963 | extern unsigned int i915_powersave; |
964 | extern unsigned int i915_semaphores; | ||
959 | extern unsigned int i915_lvds_downclock; | 965 | extern unsigned int i915_lvds_downclock; |
960 | extern unsigned int i915_panel_use_ssc; | 966 | extern unsigned int i915_panel_use_ssc; |
967 | extern int i915_vbt_sdvo_panel_type; | ||
968 | extern unsigned int i915_enable_rc6; | ||
961 | 969 | ||
962 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); | 970 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); |
963 | extern int i915_resume(struct drm_device *dev); | 971 | extern 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); |
997 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 1005 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
998 | struct drm_file *file_priv); | 1006 | struct drm_file *file_priv); |
999 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno); | ||
1000 | extern void i915_enable_interrupt (struct drm_device *dev); | ||
1001 | 1007 | ||
1002 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); | 1008 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); |
1003 | extern void i915_driver_irq_preinstall(struct drm_device * dev); | 1009 | extern void i915_driver_irq_preinstall(struct drm_device * dev); |
@@ -1049,7 +1055,6 @@ extern void i915_mem_takedown(struct mem_block **heap); | |||
1049 | extern void i915_mem_release(struct drm_device * dev, | 1055 | extern 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 */ |
1052 | int i915_gem_check_is_wedged(struct drm_device *dev); | ||
1053 | int i915_gem_init_ioctl(struct drm_device *dev, void *data, | 1058 | int i915_gem_init_ioctl(struct drm_device *dev, void *data, |
1054 | struct drm_file *file_priv); | 1059 | struct drm_file *file_priv); |
1055 | int i915_gem_create_ioctl(struct drm_device *dev, void *data, | 1060 | int 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); |
1093 | void i915_gem_load(struct drm_device *dev); | 1098 | void i915_gem_load(struct drm_device *dev); |
1094 | int i915_gem_init_object(struct drm_gem_object *obj); | 1099 | int i915_gem_init_object(struct drm_gem_object *obj); |
1095 | int __must_check i915_gem_flush_ring(struct drm_device *dev, | 1100 | int __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); |
1099 | struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, | 1103 | struct 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); | |||
1108 | void i915_gem_lastclose(struct drm_device *dev); | 1112 | void i915_gem_lastclose(struct drm_device *dev); |
1109 | 1113 | ||
1110 | int __must_check i915_mutex_lock_interruptible(struct drm_device *dev); | 1114 | int __must_check i915_mutex_lock_interruptible(struct drm_device *dev); |
1111 | int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj, | 1115 | int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj); |
1112 | bool interruptible); | ||
1113 | void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj, | 1116 | void 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 | ||
1133 | static inline u32 | 1136 | static inline u32 |
1134 | i915_gem_next_request_seqno(struct drm_device *dev, | 1137 | i915_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 | ||
1141 | int __must_check i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | 1143 | int __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); | ||
1144 | int __must_check i915_gem_object_put_fence(struct drm_i915_gem_object *obj); | 1145 | int __must_check i915_gem_object_put_fence(struct drm_i915_gem_object *obj); |
1145 | 1146 | ||
1146 | void i915_gem_retire_requests(struct drm_device *dev); | 1147 | void i915_gem_retire_requests(struct drm_device *dev); |
@@ -1149,8 +1150,7 @@ void i915_gem_clflush_object(struct drm_i915_gem_object *obj); | |||
1149 | int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj, | 1150 | int __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); |
1152 | int __must_check i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj, | 1153 | int __must_check i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj); |
1153 | bool interruptible); | ||
1154 | int __must_check i915_gem_init_ringbuffer(struct drm_device *dev); | 1154 | int __must_check i915_gem_init_ringbuffer(struct drm_device *dev); |
1155 | void i915_gem_cleanup_ringbuffer(struct drm_device *dev); | 1155 | void i915_gem_cleanup_ringbuffer(struct drm_device *dev); |
1156 | void i915_gem_do_init(struct drm_device *dev, | 1156 | void 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); |
1160 | int __must_check i915_gpu_idle(struct drm_device *dev); | 1160 | int __must_check i915_gpu_idle(struct drm_device *dev); |
1161 | int __must_check i915_gem_idle(struct drm_device *dev); | 1161 | int __must_check i915_gem_idle(struct drm_device *dev); |
1162 | int __must_check i915_add_request(struct drm_device *dev, | 1162 | int __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); | 1165 | int __must_check i915_wait_request(struct intel_ring_buffer *ring, |
1166 | int __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); | ||
1170 | int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); | 1167 | int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); |
1171 | int __must_check | 1168 | int __must_check |
1172 | i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, | 1169 | i915_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, | |||
1183 | void i915_gem_free_all_phys_object(struct drm_device *dev); | 1180 | void i915_gem_free_all_phys_object(struct drm_device *dev); |
1184 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); | 1181 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); |
1185 | 1182 | ||
1183 | uint32_t | ||
1184 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj); | ||
1185 | |||
1186 | /* i915_gem_gtt.c */ | 1186 | /* i915_gem_gtt.c */ |
1187 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); | 1187 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); |
1188 | int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); | 1188 | int __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) \ |
1316 | static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | 1316 | static 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) \ |
1328 | static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ | 1328 | static 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 | */ |
1362 | void __gen6_force_wake_get(struct drm_i915_private *dev_priv); | 1362 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); |
1363 | void __gen6_force_wake_put (struct drm_i915_private *dev_priv); | 1363 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); |
1364 | static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) | 1364 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); |
1365 | |||
1366 | static 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 | ||
1378 | static inline void | 1380 | static inline void i915_gt_write(struct drm_i915_private *dev_priv, |
1379 | i915_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 |