Rev 5354 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5354 | Rev 6084 | ||
---|---|---|---|
Line 23... | Line 23... | ||
23 | 23 | ||
24 | #ifndef _INTEL_LRC_H_ |
24 | #ifndef _INTEL_LRC_H_ |
Line 25... | Line 25... | ||
25 | #define _INTEL_LRC_H_ |
25 | #define _INTEL_LRC_H_ |
- | 26 | ||
- | 27 | #define GEN8_LR_CONTEXT_ALIGN 4096 |
|
Line 26... | Line 28... | ||
26 | 28 | #define GEN8_CSB_ENTRIES 6 |
|
27 | #define GEN8_LR_CONTEXT_ALIGN 4096 |
29 | #define GEN8_CSB_PTR_MASK 0x07 |
28 | 30 | ||
- | 31 | /* Execlists regs */ |
|
29 | /* Execlists regs */ |
32 | #define RING_ELSP(ring) ((ring)->mmio_base+0x230) |
- | 33 | #define RING_EXECLIST_STATUS_LO(ring) ((ring)->mmio_base+0x234) |
|
- | 34 | #define RING_EXECLIST_STATUS_HI(ring) ((ring)->mmio_base+0x234 + 4) |
|
- | 35 | #define RING_CONTEXT_CONTROL(ring) ((ring)->mmio_base+0x244) |
|
30 | #define RING_ELSP(ring) ((ring)->mmio_base+0x230) |
36 | #define CTX_CTRL_INHIBIT_SYN_CTX_SWITCH (1 << 3) |
- | 37 | #define CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT (1 << 0) |
|
31 | #define RING_EXECLIST_STATUS(ring) ((ring)->mmio_base+0x234) |
38 | #define CTX_CTRL_RS_CTX_ENABLE (1 << 1) |
Line 32... | Line 39... | ||
32 | #define RING_CONTEXT_CONTROL(ring) ((ring)->mmio_base+0x244) |
39 | #define RING_CONTEXT_STATUS_BUF_LO(ring, i) ((ring)->mmio_base+0x370 + (i) * 8) |
- | 40 | #define RING_CONTEXT_STATUS_BUF_HI(ring, i) ((ring)->mmio_base+0x370 + (i) * 8 + 4) |
|
- | 41 | #define RING_CONTEXT_STATUS_PTR(ring) ((ring)->mmio_base+0x3a0) |
|
33 | #define RING_CONTEXT_STATUS_BUF(ring) ((ring)->mmio_base+0x370) |
42 | |
34 | #define RING_CONTEXT_STATUS_PTR(ring) ((ring)->mmio_base+0x3a0) |
43 | /* Logical Rings */ |
35 | 44 | int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request); |
|
- | 45 | int intel_logical_ring_reserve_space(struct drm_i915_gem_request *request); |
|
Line 36... | Line 46... | ||
36 | /* Logical Rings */ |
46 | void intel_logical_ring_stop(struct intel_engine_cs *ring); |
37 | void intel_logical_ring_stop(struct intel_engine_cs *ring); |
- | |
38 | void intel_logical_ring_cleanup(struct intel_engine_cs *ring); |
47 | void intel_logical_ring_cleanup(struct intel_engine_cs *ring); |
39 | int intel_logical_rings_init(struct drm_device *dev); |
48 | int intel_logical_rings_init(struct drm_device *dev); |
40 | 49 | int intel_logical_ring_begin(struct drm_i915_gem_request *req, int num_dwords); |
|
41 | int logical_ring_flush_all_caches(struct intel_ringbuffer *ringbuf); |
50 | |
42 | void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf); |
51 | int logical_ring_flush_all_caches(struct drm_i915_gem_request *req); |
Line 59... | Line 68... | ||
59 | u32 data) |
68 | u32 data) |
60 | { |
69 | { |
61 | iowrite32(data, ringbuf->virtual_start + ringbuf->tail); |
70 | iowrite32(data, ringbuf->virtual_start + ringbuf->tail); |
62 | ringbuf->tail += 4; |
71 | ringbuf->tail += 4; |
63 | } |
72 | } |
64 | int intel_logical_ring_begin(struct intel_ringbuffer *ringbuf, int num_dwords); |
- | |
Line 65... | Line 73... | ||
65 | 73 | ||
- | 74 | /* Logical Ring Contexts */ |
|
66 | /* Logical Ring Contexts */ |
75 | |
- | 76 | /* One extra page is added before LRC for GuC as shared data */ |
|
- | 77 | #define LRC_GUCSHR_PN (0) |
|
67 | int intel_lr_context_render_state_init(struct intel_engine_cs *ring, |
78 | #define LRC_PPHWSP_PN (LRC_GUCSHR_PN + 1) |
- | 79 | #define LRC_STATE_PN (LRC_PPHWSP_PN + 1) |
|
68 | struct intel_context *ctx); |
80 | |
69 | void intel_lr_context_free(struct intel_context *ctx); |
81 | void intel_lr_context_free(struct intel_context *ctx); |
70 | int intel_lr_context_deferred_create(struct intel_context *ctx, |
82 | int intel_lr_context_deferred_alloc(struct intel_context *ctx, |
71 | struct intel_engine_cs *ring); |
83 | struct intel_engine_cs *ring); |
- | 84 | void intel_lr_context_unpin(struct drm_i915_gem_request *req); |
|
72 | void intel_lr_context_unpin(struct intel_engine_cs *ring, |
85 | void intel_lr_context_reset(struct drm_device *dev, |
- | 86 | struct intel_context *ctx); |
|
- | 87 | uint64_t intel_lr_context_descriptor(struct intel_context *ctx, |
|
Line 73... | Line 88... | ||
73 | struct intel_context *ctx); |
88 | struct intel_engine_cs *ring); |
74 | 89 | ||
75 | /* Execlists */ |
- | |
76 | int intel_sanitize_enable_execlists(struct drm_device *dev, int enable_execlists); |
90 | /* Execlists */ |
77 | int intel_execlists_submission(struct drm_device *dev, struct drm_file *file, |
91 | int intel_sanitize_enable_execlists(struct drm_device *dev, int enable_execlists); |
78 | struct intel_engine_cs *ring, |
92 | struct i915_execbuffer_params; |
79 | struct intel_context *ctx, |
93 | int intel_execlists_submission(struct i915_execbuffer_params *params, |
80 | struct drm_i915_gem_execbuffer2 *args, |
- | |
81 | struct list_head *vmas, |
- | |
82 | struct drm_i915_gem_object *batch_obj, |
94 | struct drm_i915_gem_execbuffer2 *args, |
Line 83... | Line -... | ||
83 | u64 exec_start, u32 flags); |
- | |
84 | u32 intel_execlists_ctx_id(struct drm_i915_gem_object *ctx_obj); |
- | |
85 | - | ||
86 | /** |
- | |
87 | * struct intel_ctx_submit_request - queued context submission request |
- | |
88 | * @ctx: Context to submit to the ELSP. |
- | |
89 | * @ring: Engine to submit it to. |
- | |
90 | * @tail: how far in the context's ringbuffer this request goes to. |
- | |
91 | * @execlist_link: link in the submission queue. |
- | |
92 | * @work: workqueue for processing this request in a bottom half. |
- | |
93 | * @elsp_submitted: no. of times this request has been sent to the ELSP. |
- | |
94 | * |
- | |
95 | * The ELSP only accepts two elements at a time, so we queue context/tail |
- | |
96 | * pairs on a given queue (ring->execlist_queue) until the hardware is |
- | |
97 | * available. The queue serves a double purpose: we also use it to keep track |
- | |
98 | * of the up to 2 contexts currently in the hardware (usually one in execution |
- | |
99 | * and the other queued up by the GPU): We only remove elements from the head |
- | |
100 | * of the queue when the hardware informs us that an element has been |
- | |
101 | * completed. |
- | |
102 | * |
- | |
103 | * All accesses to the queue are mediated by a spinlock (ring->execlist_lock). |
- | |
104 | */ |
- | |
105 | struct intel_ctx_submit_request { |
- | |
106 | struct intel_context *ctx; |
- | |
107 | struct intel_engine_cs *ring; |
- | |
108 | u32 tail; |
- | |
109 | - | ||
110 | struct list_head execlist_link; |
- | |
111 | - | ||
112 | int elsp_submitted; |
95 | struct list_head *vmas); |
113 | }; |
96 | u32 intel_execlists_ctx_id(struct drm_i915_gem_object *ctx_obj); |
Line 114... | Line 97... | ||
114 | 97 |