Commit 73ae478c authored by Ben Widawsky's avatar Ben Widawsky Committed by Daniel Vetter

drm/i915: Replace has_bsd/blt/vebox with a mask

I've sent this patch several times for various reasons. It essentially
cleans up a lot of code where we need to do something per ring, and want
to query whether or not the ring exists on that hardware.

It has various uses coming up, but for now it shouldn't be too
offensive.

v2: Big conflict resolution on Damien's DEV_INFO_FOR_EACH stuff

v3: Resolved vebox addition

v4: Rebased after months of disuse. Also made failed ringbuffer init
cleaner.

v5: Remove the init cleaner from v4. There is a better way to do it.
(Chris)
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 71b76d00
...@@ -160,49 +160,58 @@ extern int intel_agp_enabled; ...@@ -160,49 +160,58 @@ extern int intel_agp_enabled;
static const struct intel_device_info intel_i830_info = { static const struct intel_device_info intel_i830_info = {
.gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, .num_pipes = 2, .gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, .num_pipes = 2,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_845g_info = { static const struct intel_device_info intel_845g_info = {
.gen = 2, .num_pipes = 1, .gen = 2, .num_pipes = 1,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i85x_info = { static const struct intel_device_info intel_i85x_info = {
.gen = 2, .is_i85x = 1, .is_mobile = 1, .num_pipes = 2, .gen = 2, .is_i85x = 1, .is_mobile = 1, .num_pipes = 2,
.cursor_needs_physical = 1, .cursor_needs_physical = 1,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i865g_info = { static const struct intel_device_info intel_i865g_info = {
.gen = 2, .num_pipes = 1, .gen = 2, .num_pipes = 1,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i915g_info = { static const struct intel_device_info intel_i915g_info = {
.gen = 3, .is_i915g = 1, .cursor_needs_physical = 1, .num_pipes = 2, .gen = 3, .is_i915g = 1, .cursor_needs_physical = 1, .num_pipes = 2,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i915gm_info = { static const struct intel_device_info intel_i915gm_info = {
.gen = 3, .is_mobile = 1, .num_pipes = 2, .gen = 3, .is_mobile = 1, .num_pipes = 2,
.cursor_needs_physical = 1, .cursor_needs_physical = 1,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.supports_tv = 1, .supports_tv = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i945g_info = { static const struct intel_device_info intel_i945g_info = {
.gen = 3, .has_hotplug = 1, .cursor_needs_physical = 1, .num_pipes = 2, .gen = 3, .has_hotplug = 1, .cursor_needs_physical = 1, .num_pipes = 2,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i945gm_info = { static const struct intel_device_info intel_i945gm_info = {
.gen = 3, .is_i945gm = 1, .is_mobile = 1, .num_pipes = 2, .gen = 3, .is_i945gm = 1, .is_mobile = 1, .num_pipes = 2,
.has_hotplug = 1, .cursor_needs_physical = 1, .has_hotplug = 1, .cursor_needs_physical = 1,
.has_overlay = 1, .overlay_needs_physical = 1, .has_overlay = 1, .overlay_needs_physical = 1,
.supports_tv = 1, .supports_tv = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i965g_info = { static const struct intel_device_info intel_i965g_info = {
.gen = 4, .is_broadwater = 1, .num_pipes = 2, .gen = 4, .is_broadwater = 1, .num_pipes = 2,
.has_hotplug = 1, .has_hotplug = 1,
.has_overlay = 1, .has_overlay = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_i965gm_info = { static const struct intel_device_info intel_i965gm_info = {
...@@ -210,18 +219,20 @@ static const struct intel_device_info intel_i965gm_info = { ...@@ -210,18 +219,20 @@ static const struct intel_device_info intel_i965gm_info = {
.is_mobile = 1, .has_fbc = 1, .has_hotplug = 1, .is_mobile = 1, .has_fbc = 1, .has_hotplug = 1,
.has_overlay = 1, .has_overlay = 1,
.supports_tv = 1, .supports_tv = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_g33_info = { static const struct intel_device_info intel_g33_info = {
.gen = 3, .is_g33 = 1, .num_pipes = 2, .gen = 3, .is_g33 = 1, .num_pipes = 2,
.need_gfx_hws = 1, .has_hotplug = 1, .need_gfx_hws = 1, .has_hotplug = 1,
.has_overlay = 1, .has_overlay = 1,
.ring_mask = RENDER_RING,
}; };
static const struct intel_device_info intel_g45_info = { static const struct intel_device_info intel_g45_info = {
.gen = 4, .is_g4x = 1, .need_gfx_hws = 1, .num_pipes = 2, .gen = 4, .is_g4x = 1, .need_gfx_hws = 1, .num_pipes = 2,
.has_pipe_cxsr = 1, .has_hotplug = 1, .has_pipe_cxsr = 1, .has_hotplug = 1,
.has_bsd_ring = 1, .ring_mask = RENDER_RING | BSD_RING,
}; };
static const struct intel_device_info intel_gm45_info = { static const struct intel_device_info intel_gm45_info = {
...@@ -229,7 +240,7 @@ static const struct intel_device_info intel_gm45_info = { ...@@ -229,7 +240,7 @@ static const struct intel_device_info intel_gm45_info = {
.is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1, .is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1,
.has_pipe_cxsr = 1, .has_hotplug = 1, .has_pipe_cxsr = 1, .has_hotplug = 1,
.supports_tv = 1, .supports_tv = 1,
.has_bsd_ring = 1, .ring_mask = RENDER_RING | BSD_RING,
}; };
static const struct intel_device_info intel_pineview_info = { static const struct intel_device_info intel_pineview_info = {
...@@ -241,21 +252,20 @@ static const struct intel_device_info intel_pineview_info = { ...@@ -241,21 +252,20 @@ static const struct intel_device_info intel_pineview_info = {
static const struct intel_device_info intel_ironlake_d_info = { static const struct intel_device_info intel_ironlake_d_info = {
.gen = 5, .num_pipes = 2, .gen = 5, .num_pipes = 2,
.need_gfx_hws = 1, .has_hotplug = 1, .need_gfx_hws = 1, .has_hotplug = 1,
.has_bsd_ring = 1, .ring_mask = RENDER_RING | BSD_RING,
}; };
static const struct intel_device_info intel_ironlake_m_info = { static const struct intel_device_info intel_ironlake_m_info = {
.gen = 5, .is_mobile = 1, .num_pipes = 2, .gen = 5, .is_mobile = 1, .num_pipes = 2,
.need_gfx_hws = 1, .has_hotplug = 1, .need_gfx_hws = 1, .has_hotplug = 1,
.has_fbc = 1, .has_fbc = 1,
.has_bsd_ring = 1, .ring_mask = RENDER_RING | BSD_RING,
}; };
static const struct intel_device_info intel_sandybridge_d_info = { static const struct intel_device_info intel_sandybridge_d_info = {
.gen = 6, .num_pipes = 2, .gen = 6, .num_pipes = 2,
.need_gfx_hws = 1, .has_hotplug = 1, .need_gfx_hws = 1, .has_hotplug = 1,
.has_bsd_ring = 1, .ring_mask = RENDER_RING | BSD_RING | BLT_RING,
.has_blt_ring = 1,
.has_llc = 1, .has_llc = 1,
}; };
...@@ -263,16 +273,14 @@ static const struct intel_device_info intel_sandybridge_m_info = { ...@@ -263,16 +273,14 @@ static const struct intel_device_info intel_sandybridge_m_info = {
.gen = 6, .is_mobile = 1, .num_pipes = 2, .gen = 6, .is_mobile = 1, .num_pipes = 2,
.need_gfx_hws = 1, .has_hotplug = 1, .need_gfx_hws = 1, .has_hotplug = 1,
.has_fbc = 1, .has_fbc = 1,
.has_bsd_ring = 1, .ring_mask = RENDER_RING | BSD_RING | BLT_RING,
.has_blt_ring = 1,
.has_llc = 1, .has_llc = 1,
}; };
#define GEN7_FEATURES \ #define GEN7_FEATURES \
.gen = 7, .num_pipes = 3, \ .gen = 7, .num_pipes = 3, \
.need_gfx_hws = 1, .has_hotplug = 1, \ .need_gfx_hws = 1, .has_hotplug = 1, \
.has_bsd_ring = 1, \ .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \
.has_blt_ring = 1, \
.has_llc = 1 .has_llc = 1
static const struct intel_device_info intel_ivybridge_d_info = { static const struct intel_device_info intel_ivybridge_d_info = {
...@@ -315,7 +323,7 @@ static const struct intel_device_info intel_haswell_d_info = { ...@@ -315,7 +323,7 @@ static const struct intel_device_info intel_haswell_d_info = {
.is_haswell = 1, .is_haswell = 1,
.has_ddi = 1, .has_ddi = 1,
.has_fpga_dbg = 1, .has_fpga_dbg = 1,
.has_vebox_ring = 1, .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
}; };
static const struct intel_device_info intel_haswell_m_info = { static const struct intel_device_info intel_haswell_m_info = {
...@@ -325,7 +333,7 @@ static const struct intel_device_info intel_haswell_m_info = { ...@@ -325,7 +333,7 @@ static const struct intel_device_info intel_haswell_m_info = {
.has_ddi = 1, .has_ddi = 1,
.has_fpga_dbg = 1, .has_fpga_dbg = 1,
.has_fbc = 1, .has_fbc = 1,
.has_vebox_ring = 1, .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
}; };
/* /*
......
...@@ -448,9 +448,6 @@ struct intel_uncore { ...@@ -448,9 +448,6 @@ struct intel_uncore {
func(has_overlay) sep \ func(has_overlay) sep \
func(overlay_needs_physical) sep \ func(overlay_needs_physical) sep \
func(supports_tv) sep \ func(supports_tv) sep \
func(has_bsd_ring) sep \
func(has_blt_ring) sep \
func(has_vebox_ring) sep \
func(has_llc) sep \ func(has_llc) sep \
func(has_ddi) sep \ func(has_ddi) sep \
func(has_fpga_dbg) func(has_fpga_dbg)
...@@ -462,6 +459,7 @@ struct intel_device_info { ...@@ -462,6 +459,7 @@ struct intel_device_info {
u32 display_mmio_offset; u32 display_mmio_offset;
u8 num_pipes:3; u8 num_pipes:3;
u8 gen; u8 gen;
u8 ring_mask; /* Rings supported by the HW */
DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG, SEP_SEMICOLON); DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG, SEP_SEMICOLON);
}; };
...@@ -1691,9 +1689,13 @@ struct drm_i915_file_private { ...@@ -1691,9 +1689,13 @@ struct drm_i915_file_private {
#define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6)
#define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7) #define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7)
#define HAS_BSD(dev) (INTEL_INFO(dev)->has_bsd_ring) #define RENDER_RING (1<<RCS)
#define HAS_BLT(dev) (INTEL_INFO(dev)->has_blt_ring) #define BSD_RING (1<<VCS)
#define HAS_VEBOX(dev) (INTEL_INFO(dev)->has_vebox_ring) #define BLT_RING (1<<BCS)
#define VEBOX_RING (1<<VECS)
#define HAS_BSD(dev) (INTEL_INFO(dev)->ring_mask & BSD_RING)
#define HAS_BLT(dev) (INTEL_INFO(dev)->ring_mask & BLT_RING)
#define HAS_VEBOX(dev) (INTEL_INFO(dev)->ring_mask & VEBOX_RING)
#define HAS_LLC(dev) (INTEL_INFO(dev)->has_llc) #define HAS_LLC(dev) (INTEL_INFO(dev)->has_llc)
#define HAS_WT(dev) (IS_HASWELL(dev) && to_i915(dev)->ellc_size) #define HAS_WT(dev) (IS_HASWELL(dev) && to_i915(dev)->ellc_size)
#define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment