[Intel-gfx] [PATCH 5/6] drm/i915: Reduce pointer indirection during cmd parser lookup
Chris Wilson
chris at chris-wilson.co.uk
Thu Oct 1 04:57:14 PDT 2015
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_cmd_parser.c | 51 ++++++++--------------------------
drivers/gpu/drm/i915/i915_drv.h | 4 ++-
2 files changed, 14 insertions(+), 41 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c
index 4fc995b2729d..ffba09a90e83 100644
--- a/drivers/gpu/drm/i915/i915_cmd_parser.c
+++ b/drivers/gpu/drm/i915/i915_cmd_parser.c
@@ -113,7 +113,7 @@
/* Command Mask Fixed Len Action
---------------------------------------------------------- */
-static const struct drm_i915_cmd_descriptor common_cmds[] = {
+static struct drm_i915_cmd_descriptor common_cmds[] = {
CMD( MI_NOOP, SMI, F, 1, S ),
CMD( MI_USER_INTERRUPT, SMI, F, 1, R ),
CMD( MI_WAIT_FOR_EVENT, SMI, F, 1, M ),
@@ -146,7 +146,7 @@ static const struct drm_i915_cmd_descriptor common_cmds[] = {
CMD( MI_BATCH_BUFFER_START, SMI, !F, 0xFF, S ),
};
-static const struct drm_i915_cmd_descriptor render_cmds[] = {
+static struct drm_i915_cmd_descriptor render_cmds[] = {
CMD( MI_FLUSH, SMI, F, 1, S ),
CMD( MI_ARB_ON_OFF, SMI, F, 1, R ),
CMD( MI_PREDICATE, SMI, F, 1, S ),
@@ -207,7 +207,7 @@ static const struct drm_i915_cmd_descriptor render_cmds[] = {
}}, ),
};
-static const struct drm_i915_cmd_descriptor hsw_render_cmds[] = {
+static struct drm_i915_cmd_descriptor hsw_render_cmds[] = {
CMD( MI_SET_PREDICATE, SMI, F, 1, S ),
CMD( MI_RS_CONTROL, SMI, F, 1, S ),
CMD( MI_URB_ATOMIC_ALLOC, SMI, F, 1, S ),
@@ -229,7 +229,7 @@ static const struct drm_i915_cmd_descriptor hsw_render_cmds[] = {
CMD( GFX_OP_3DSTATE_BINDING_TABLE_EDIT_PS, S3D, !F, 0x1FF, S ),
};
-static const struct drm_i915_cmd_descriptor video_cmds[] = {
+static struct drm_i915_cmd_descriptor video_cmds[] = {
CMD( MI_ARB_ON_OFF, SMI, F, 1, R ),
CMD( MI_SET_APPID, SMI, F, 1, S ),
CMD( MI_STORE_DWORD_IMM, SMI, !F, 0xFF, B,
@@ -273,7 +273,7 @@ static const struct drm_i915_cmd_descriptor video_cmds[] = {
CMD( MFX_WAIT, SMFX, F, 1, S ),
};
-static const struct drm_i915_cmd_descriptor vecs_cmds[] = {
+static struct drm_i915_cmd_descriptor vecs_cmds[] = {
CMD( MI_ARB_ON_OFF, SMI, F, 1, R ),
CMD( MI_SET_APPID, SMI, F, 1, S ),
CMD( MI_STORE_DWORD_IMM, SMI, !F, 0xFF, B,
@@ -311,7 +311,7 @@ static const struct drm_i915_cmd_descriptor vecs_cmds[] = {
}}, ),
};
-static const struct drm_i915_cmd_descriptor blt_cmds[] = {
+static struct drm_i915_cmd_descriptor blt_cmds[] = {
CMD( MI_DISPLAY_FLIP, SMI, !F, 0xFF, R ),
CMD( MI_STORE_DWORD_IMM, SMI, !F, 0x3FF, B,
.bits = {{
@@ -344,7 +344,7 @@ static const struct drm_i915_cmd_descriptor blt_cmds[] = {
CMD( SRC_COPY_BLT, S2D, !F, 0x3F, S ),
};
-static const struct drm_i915_cmd_descriptor hsw_blt_cmds[] = {
+static struct drm_i915_cmd_descriptor hsw_blt_cmds[] = {
CMD( MI_LOAD_SCAN_LINES_INCL, SMI, !F, 0x3F, M ),
CMD( MI_LOAD_SCAN_LINES_EXCL, SMI, !F, 0x3F, R ),
};
@@ -610,11 +610,6 @@ static bool validate_regs_sorted(struct intel_engine_cs *ring)
ring->master_reg_count);
}
-struct cmd_node {
- const struct drm_i915_cmd_descriptor *desc;
- struct hlist_node node;
-};
-
/*
* Different command ranges have different numbers of bits for the opcode. For
* example, MI commands use bits 31:23 while 3D commands use bits 31:16. The
@@ -643,16 +638,8 @@ static int init_hash_table(struct intel_engine_cs *ring,
const struct drm_i915_cmd_table *table = &cmd_tables[i];
for (j = 0; j < table->count; j++) {
- const struct drm_i915_cmd_descriptor *desc =
- &table->table[j];
- struct cmd_node *desc_node =
- kmalloc(sizeof(*desc_node), GFP_KERNEL);
-
- if (!desc_node)
- return -ENOMEM;
-
- desc_node->desc = desc;
- hash_add(ring->cmd_hash, &desc_node->node,
+ struct drm_i915_cmd_descriptor *desc = &table->table[j];
+ hash_add(ring->cmd_hash, &desc->node[ring->id],
desc->cmd.value & CMD_HASH_MASK);
}
}
@@ -660,18 +647,6 @@ static int init_hash_table(struct intel_engine_cs *ring,
return 0;
}
-static void fini_hash_table(struct intel_engine_cs *ring)
-{
- struct hlist_node *tmp;
- struct cmd_node *desc_node;
- int i;
-
- hash_for_each_safe(ring->cmd_hash, i, tmp, desc_node, node) {
- hash_del(&desc_node->node);
- kfree(desc_node);
- }
-}
-
/**
* i915_cmd_parser_init_ring() - set cmd parser related fields for a ringbuffer
* @ring: the ringbuffer to initialize
@@ -762,7 +737,6 @@ int i915_cmd_parser_init_ring(struct intel_engine_cs *ring)
ret = init_hash_table(ring, cmd_tables, cmd_table_count);
if (ret) {
DRM_ERROR("CMD: cmd_parser_init failed!\n");
- fini_hash_table(ring);
return ret;
}
@@ -782,8 +756,6 @@ void i915_cmd_parser_fini_ring(struct intel_engine_cs *ring)
{
if (!ring->needs_cmd_parser)
return;
-
- fini_hash_table(ring);
}
/*
@@ -793,11 +765,10 @@ static const struct drm_i915_cmd_descriptor*
find_cmd_in_table(struct intel_engine_cs *ring,
u32 cmd_header)
{
- struct cmd_node *desc_node;
+ const struct drm_i915_cmd_descriptor *desc;
- hash_for_each_possible(ring->cmd_hash, desc_node, node,
+ hash_for_each_possible(ring->cmd_hash, desc, node[ring->id],
cmd_header & CMD_HASH_MASK) {
- const struct drm_i915_cmd_descriptor *desc = desc_node->desc;
if (((cmd_header ^ desc->cmd.value) & desc->cmd.mask) == 0)
return desc;
}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 92d959f37cc7..7e3a731fbaff 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2371,6 +2371,8 @@ struct drm_i915_cmd_descriptor {
u32 condition_offset;
u32 condition_mask;
} bits[MAX_CMD_DESC_BITMASKS];
+
+ struct hlist_node node[I915_NUM_RINGS];
};
/*
@@ -2380,7 +2382,7 @@ struct drm_i915_cmd_descriptor {
* descriptors, which must be sorted with command opcodes in ascending order.
*/
struct drm_i915_cmd_table {
- const struct drm_i915_cmd_descriptor *table;
+ struct drm_i915_cmd_descriptor *table;
int count;
};
--
2.6.0
More information about the Intel-gfx
mailing list