diff options
author | Oscar Mateo <oscar.mateo@intel.com> | 2014-07-24 12:04:24 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-08-11 11:03:28 -0400 |
commit | 9b1136d505b1de5478e11b59ca59cf8ce2a33217 (patch) | |
tree | 5a8275267b643ed3b4628c6bf0069c677899a771 /drivers/gpu/drm/i915/intel_ringbuffer.c | |
parent | 48d823878d64f93163f5a949623346748bbce1b4 (diff) |
drm/i915/bdw: GEN-specific logical ring init
Logical rings do not need most of the initialization their
legacy ringbuffer counterparts do: we just need the pipe
control object for the render ring, enable Execlists on the
hardware and a few workarounds.
v2: Squash with: "drm/i915: Extract pipe control fini & make
init outside accesible".
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Damien Lespiau <damien.lespiau@intel.com>
[danvet: Make checkpatch happy.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index e4b97f5c5797..dab5e7c79036 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -597,8 +597,25 @@ out: | |||
597 | return ret; | 597 | return ret; |
598 | } | 598 | } |
599 | 599 | ||
600 | static int | 600 | void |
601 | init_pipe_control(struct intel_engine_cs *ring) | 601 | intel_fini_pipe_control(struct intel_engine_cs *ring) |
602 | { | ||
603 | struct drm_device *dev = ring->dev; | ||
604 | |||
605 | if (ring->scratch.obj == NULL) | ||
606 | return; | ||
607 | |||
608 | if (INTEL_INFO(dev)->gen >= 5) { | ||
609 | kunmap(sg_page(ring->scratch.obj->pages->sgl)); | ||
610 | i915_gem_object_ggtt_unpin(ring->scratch.obj); | ||
611 | } | ||
612 | |||
613 | drm_gem_object_unreference(&ring->scratch.obj->base); | ||
614 | ring->scratch.obj = NULL; | ||
615 | } | ||
616 | |||
617 | int | ||
618 | intel_init_pipe_control(struct intel_engine_cs *ring) | ||
602 | { | 619 | { |
603 | int ret; | 620 | int ret; |
604 | 621 | ||
@@ -673,7 +690,7 @@ static int init_render_ring(struct intel_engine_cs *ring) | |||
673 | _MASKED_BIT_ENABLE(GFX_REPLAY_MODE)); | 690 | _MASKED_BIT_ENABLE(GFX_REPLAY_MODE)); |
674 | 691 | ||
675 | if (INTEL_INFO(dev)->gen >= 5) { | 692 | if (INTEL_INFO(dev)->gen >= 5) { |
676 | ret = init_pipe_control(ring); | 693 | ret = intel_init_pipe_control(ring); |
677 | if (ret) | 694 | if (ret) |
678 | return ret; | 695 | return ret; |
679 | } | 696 | } |
@@ -708,16 +725,7 @@ static void render_ring_cleanup(struct intel_engine_cs *ring) | |||
708 | dev_priv->semaphore_obj = NULL; | 725 | dev_priv->semaphore_obj = NULL; |
709 | } | 726 | } |
710 | 727 | ||
711 | if (ring->scratch.obj == NULL) | 728 | intel_fini_pipe_control(ring); |
712 | return; | ||
713 | |||
714 | if (INTEL_INFO(dev)->gen >= 5) { | ||
715 | kunmap(sg_page(ring->scratch.obj->pages->sgl)); | ||
716 | i915_gem_object_ggtt_unpin(ring->scratch.obj); | ||
717 | } | ||
718 | |||
719 | drm_gem_object_unreference(&ring->scratch.obj->base); | ||
720 | ring->scratch.obj = NULL; | ||
721 | } | 729 | } |
722 | 730 | ||
723 | static int gen8_rcs_signal(struct intel_engine_cs *signaller, | 731 | static int gen8_rcs_signal(struct intel_engine_cs *signaller, |