[Beignet] [V2 PATCH 3/6] Using a correct DATAPORT and SFID for some send message of haswell.
junyan.he at inbox.com
junyan.he at inbox.com
Wed May 7 03:02:56 PDT 2014
From: Junyan He <junyan.he at linux.intel.com>
Signed-off-by: Yang Rong <rong.r.yang at intel.com>
Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
backend/src/backend/gen75_context.cpp | 1 -
backend/src/backend/gen75_encoder.cpp | 30 ++++++++++++
backend/src/backend/gen75_encoder.hpp | 6 +++
backend/src/backend/gen_defs.hpp | 60 +++++++++++++++++-------
backend/src/backend/gen_encoder.cpp | 88 +++++++++++++++--------------------
backend/src/backend/gen_encoder.hpp | 9 ++++
6 files changed, 126 insertions(+), 68 deletions(-)
diff --git a/backend/src/backend/gen75_context.cpp b/backend/src/backend/gen75_context.cpp
index 2e35324..d9933f2 100644
--- a/backend/src/backend/gen75_context.cpp
+++ b/backend/src/backend/gen75_context.cpp
@@ -25,5 +25,4 @@
namespace gbe
{
-
}
diff --git a/backend/src/backend/gen75_encoder.cpp b/backend/src/backend/gen75_encoder.cpp
index 909b301..ede9d55 100644
--- a/backend/src/backend/gen75_encoder.cpp
+++ b/backend/src/backend/gen75_encoder.cpp
@@ -29,5 +29,35 @@
namespace gbe
{
+ void Gen75Encoder::setDPUntypedRW(GenNativeInstruction *insn,
+ uint32_t bti,
+ uint32_t rgba,
+ uint32_t msg_type,
+ uint32_t msg_length,
+ uint32_t response_length)
+ {
+ const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA_CACHE;
+ setMessageDescriptor(insn, sfid, msg_length, response_length);
+ insn->bits3.gen7_untyped_rw.msg_type = msg_type;
+ insn->bits3.gen7_untyped_rw.bti = bti;
+ insn->bits3.gen7_untyped_rw.rgba = rgba;
+ if (curr.execWidth == 8)
+ insn->bits3.gen7_untyped_rw.simd_mode = GEN_UNTYPED_SIMD8;
+ else if (curr.execWidth == 16)
+ insn->bits3.gen7_untyped_rw.simd_mode = GEN_UNTYPED_SIMD16;
+ else
+ NOT_SUPPORTED;
+ }
+ void Gen75Encoder::setTypedWriteMessage(GenNativeInstruction *insn, unsigned char bti,
+ unsigned char msg_type, uint32_t msg_length, bool header_present)
+ {
+ const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA_CACHE;
+ setMessageDescriptor(insn, sfid, msg_length, 0, header_present);
+ insn->bits3.gen7_typed_rw.bti = bti;
+ insn->bits3.gen7_typed_rw.msg_type = msg_type;
+
+ /* Always using the low 8 slots here. */
+ insn->bits3.gen7_typed_rw.slot = 1;
+ }
} /* End of the name space. */
diff --git a/backend/src/backend/gen75_encoder.hpp b/backend/src/backend/gen75_encoder.hpp
index 9541c26..53db3a7 100644
--- a/backend/src/backend/gen75_encoder.hpp
+++ b/backend/src/backend/gen75_encoder.hpp
@@ -33,6 +33,12 @@ namespace gbe
public:
Gen75Encoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID)
: GenEncoder(simdWidth, gen, deviceID, 8) { };
+
+ virtual void setDPUntypedRW(GenNativeInstruction *insn, uint32_t bti, uint32_t rgba,
+ uint32_t msg_type, uint32_t msg_length, uint32_t response_length);
+ virtual void setTypedWriteMessage(GenNativeInstruction *insn, unsigned char bti,
+ unsigned char msg_type, uint32_t msg_length,
+ bool header_present);
};
}
#endif /* __GBE_GEN75_ENCODER_HPP__ */
diff --git a/backend/src/backend/gen_defs.hpp b/backend/src/backend/gen_defs.hpp
index 28e3203..1b43864 100644
--- a/backend/src/backend/gen_defs.hpp
+++ b/backend/src/backend/gen_defs.hpp
@@ -209,7 +209,8 @@ enum GenMessageTarget {
GEN6_SFID_DATAPORT_SAMPLER_CACHE = 4,
GEN6_SFID_DATAPORT_RENDER_CACHE = 5,
GEN6_SFID_DATAPORT_CONSTANT_CACHE = 9,
- GEN_SFID_DATAPORT_DATA_CACHE = 10,
+ GEN_SFID_DATAPORT_DATA_CACHE = 10,
+ GEN_SFID_DATAPORT1_DATA_CACHE = 12,
};
#define GEN_PREDICATE_NONE 0
@@ -307,20 +308,46 @@ enum GenMessageTarget {
#define GEN_BYTE_SCATTER_SIMD8 0
#define GEN_BYTE_SCATTER_SIMD16 1
-/* Data port message type*/
-#define GEN_OBLOCK_READ 0 //0000: OWord Block Read
-#define GEN_UNALIGNED_OBLOCK_READ 1 //0001: Unaligned OWord Block Read
-#define GEN_ODBLOCK_READ 2 //0010: OWord Dual Block Read
-#define GEN_DWORD_GATHER 3 //0011: DWord Scattered Read
-#define GEN_BYTE_GATHER 4 //0100: Byte Scattered Read
-#define GEN_UNTYPED_READ 5 //0101: Untyped Surface Read
-#define GEN_UNTYPED_ATOMIC_READ 6 //0110: Untyped Atomic Operation
-#define GEN_MEMORY_FENCE 7 //0111: Memory Fence
-#define GEN_OBLOCK_WRITE 8 //1000: OWord Block Write
-#define GEN_ODBLOCK_WRITE 10//1010: OWord Dual Block Write
-#define GEN_DWORD_SCATTER 11//1011: DWord Scattered Write
-#define GEN_BYTE_SCATTER 12//1100: Byte Scattered Write
-#define GEN_UNTYPED_WRITE 13//1101: Untyped Surface Write
+/* Data port message type for gen7*/
+#define GEN7_OBLOCK_READ 0 //0000: OWord Block Read
+#define GEN7_UNALIGNED_OBLOCK_READ 1 //0001: Unaligned OWord Block Read
+#define GEN7_ODBLOCK_READ 2 //0010: OWord Dual Block Read
+#define GEN7_DWORD_GATHER 3 //0011: DWord Scattered Read
+#define GEN7_BYTE_GATHER 4 //0100: Byte Scattered Read
+#define GEN7_UNTYPED_READ 5 //0101: Untyped Surface Read
+#define GEN7_UNTYPED_ATOMIC_READ 6 //0110: Untyped Atomic Operation
+#define GEN7_MEMORY_FENCE 7 //0111: Memory Fence
+#define GEN7_OBLOCK_WRITE 8 //1000: OWord Block Write
+#define GEN7_ODBLOCK_WRITE 10//1010: OWord Dual Block Write
+#define GEN7_DWORD_SCATTER 11//1011: DWord Scattered Write
+#define GEN7_BYTE_SCATTER 12//1100: Byte Scattered Write
+#define GEN7_UNTYPED_WRITE 13//1101: Untyped Surface Write
+
+/* Data port0 message type for Gen75*/
+#define GEN75_P0_OBLOCK_READ 0 //0000: OWord Block Read
+#define GEN75_P0_UNALIGNED_OBLOCK_READ 1 //0001: Unaligned OWord Block Read
+#define GEN75_P0_ODBLOCK_READ 2 //0010: OWord Dual Block Read
+#define GEN75_P0_DWORD_GATHER 3 //0011: DWord Scattered Read
+#define GEN75_P0_BYTE_GATHER 4 //0100: Byte Scattered Read
+#define GEN75_P0_MEMORY_FENCE 7 //0111: Memory Fence
+#define GEN75_P0_OBLOCK_WRITE 8 //1000: OWord Block Write
+#define GEN75_P0_ODBLOCK_WRITE 10 //1010: OWord Dual Block Write
+#define GEN75_P0_DWORD_SCATTER 11 //1011: DWord Scattered Write
+#define GEN75_P0_BYTE_SCATTER 12 //1100: Byte Scattered Write
+
+/* Data port1 message type for Gen75*/
+#define GEN75_P1_UNTYPED_READ 1 //0001: Untyped Surface Read
+#define GEN75_P1_UNTYPED_ATOMIC_OP 2 //0010: Untyped Atomic Operation
+#define GEN75_P1_UNTYPED_ATOMIC_OP_4X2 3 //0011: Untyped Atomic Operation SIMD4x2
+#define GEN75_P1_MEDIA_BREAD 4 //0100: Media Block Read
+#define GEN75_P1_TYPED_SURFACE_READ 5 //0101: Typed Surface Read
+#define GEN75_P1_TYPED_ATOMIC_OP 6 //0110: Typed Atomic Operation
+#define GEN75_P1_TYPED_ATOMIC_OP_4X2 7 //0111: Typed Atomic Operation SIMD4x2
+#define GEN75_P1_UNTYPED_SURFACE_WRITE 9 //1001: Untyped Surface Write
+#define GEN75_P1_MEDIA_TYPED_BWRITE 10 //1010: Media Block Write
+#define GEN75_P1_ATOMIC_COUNTER 11 //1011: Atomic Counter Operation
+#define GEN75_P1_ATOMIC_COUNTER_4X2 12 //1100: Atomic Counter Operation 4X2
+#define GEN75_P1_TYPED_SURFACE_WRITE 13 //1101: Typed Surface Write
/* Data port data cache scratch messages*/
#define GEN_SCRATCH_READ 0
@@ -867,8 +894,7 @@ union GenNativeInstruction
struct {
uint32_t bti:8;
uint32_t chan_mask:4;
- uint32_t pad:1;
- uint32_t slot:1;
+ uint32_t slot:2;
uint32_t msg_type:4;
uint32_t pad2:1;
uint32_t header_present:1;
diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
index 1f8ecc6..059ea94 100644
--- a/backend/src/backend/gen_encoder.cpp
+++ b/backend/src/backend/gen_encoder.cpp
@@ -93,15 +93,12 @@ namespace gbe
return false;
}
- static void setMessageDescriptor(GenEncoder *p,
- GenNativeInstruction *inst,
- enum GenMessageTarget sfid,
- unsigned msg_length,
- unsigned response_length,
- bool header_present = false,
- bool end_of_thread = false)
+
+ void GenEncoder::setMessageDescriptor(GenNativeInstruction *inst, enum GenMessageTarget sfid,
+ unsigned msg_length, unsigned response_length,
+ bool header_present, bool end_of_thread)
{
- p->setSrc1(inst, GenRegister::immd(0));
+ setSrc1(inst, GenRegister::immd(0));
inst->bits3.generic_gen5.header_present = header_present;
inst->bits3.generic_gen5.response_length = response_length;
inst->bits3.generic_gen5.msg_length = msg_length;
@@ -109,22 +106,28 @@ namespace gbe
inst->header.destreg_or_condmod = sfid;
}
- static void setDPUntypedRW(GenEncoder *p,
- GenNativeInstruction *insn,
- uint32_t bti,
- uint32_t rgba,
- uint32_t msg_type,
- uint32_t msg_length,
- uint32_t response_length)
+ void GenEncoder::setTypedWriteMessage(GenNativeInstruction *insn, unsigned char bti,
+ unsigned char msg_type, uint32_t msg_length,
+ bool header_present)
+ {
+ const GenMessageTarget sfid = GEN6_SFID_DATAPORT_RENDER_CACHE;
+ setMessageDescriptor(insn, sfid, msg_length, 0, header_present);
+ insn->bits3.gen7_typed_rw.bti = bti;
+ insn->bits3.gen7_typed_rw.msg_type = msg_type;
+ }
+
+ void GenEncoder::setDPUntypedRW(GenNativeInstruction *insn, uint32_t bti,
+ uint32_t rgba, uint32_t msg_type,
+ uint32_t msg_length, uint32_t response_length)
{
const GenMessageTarget sfid = GEN_SFID_DATAPORT_DATA_CACHE;
- setMessageDescriptor(p, insn, sfid, msg_length, response_length);
+ setMessageDescriptor(insn, sfid, msg_length, response_length);
insn->bits3.gen7_untyped_rw.msg_type = msg_type;
insn->bits3.gen7_untyped_rw.bti = bti;
insn->bits3.gen7_untyped_rw.rgba = rgba;
- if (p->curr.execWidth == 8)
+ if (curr.execWidth == 8)
insn->bits3.gen7_untyped_rw.simd_mode = GEN_UNTYPED_SIMD8;
- else if (p->curr.execWidth == 16)
+ else if (curr.execWidth == 16)
insn->bits3.gen7_untyped_rw.simd_mode = GEN_UNTYPED_SIMD16;
else
NOT_SUPPORTED;
@@ -139,7 +142,7 @@ namespace gbe
uint32_t response_length)
{
const GenMessageTarget sfid = GEN_SFID_DATAPORT_DATA_CACHE;
- setMessageDescriptor(p, insn, sfid, msg_length, response_length);
+ p->setMessageDescriptor(insn, sfid, msg_length, response_length);
insn->bits3.gen7_byte_rw.msg_type = msg_type;
insn->bits3.gen7_byte_rw.bti = bti;
insn->bits3.gen7_byte_rw.data_size = elem_size;
@@ -160,7 +163,7 @@ namespace gbe
uint32_t response_length)
{
const GenMessageTarget sfid = GEN_SFID_DATAPORT_DATA_CACHE;
- setMessageDescriptor(p, insn, sfid, msg_length, response_length);
+ p->setMessageDescriptor(insn, sfid, msg_length, response_length);
assert(size == 2 || size == 4);
insn->bits3.gen7_oblock_rw.msg_type = msg_type;
insn->bits3.gen7_oblock_rw.bti = bti;
@@ -181,26 +184,13 @@ namespace gbe
uint32_t return_format)
{
const GenMessageTarget sfid = GEN_SFID_SAMPLER;
- setMessageDescriptor(p, insn, sfid, msg_length, response_length);
+ p->setMessageDescriptor(insn, sfid, msg_length, response_length);
insn->bits3.sampler_gen7.bti = bti;
insn->bits3.sampler_gen7.sampler = sampler;
insn->bits3.sampler_gen7.msg_type = msg_type;
insn->bits3.sampler_gen7.simd_mode = simd_mode;
}
-
- static void setTypedWriteMessage(GenEncoder *p,
- GenNativeInstruction *insn,
- unsigned char bti,
- unsigned char msg_type,
- uint32_t msg_length,
- bool header_present)
- {
- const GenMessageTarget sfid = GEN6_SFID_DATAPORT_RENDER_CACHE;
- setMessageDescriptor(p, insn, sfid, msg_length, 0, header_present);
- insn->bits3.gen7_typed_rw.bti = bti;
- insn->bits3.gen7_typed_rw.msg_type = msg_type;
- }
static void setDWordScatterMessgae(GenEncoder *p,
GenNativeInstruction *insn,
uint32_t bti,
@@ -214,7 +204,7 @@ namespace gbe
// We workaround it to use DATA CACHE instead.
const GenMessageTarget sfid = (p->deviceID == PCI_CHIP_BAYTRAIL_T) ?
GEN_SFID_DATAPORT_DATA_CACHE : GEN6_SFID_DATAPORT_CONSTANT_CACHE;
- setMessageDescriptor(p, insn, sfid, msg_length, response_length);
+ p->setMessageDescriptor(insn, sfid, msg_length, response_length);
insn->bits3.gen7_dword_rw.msg_type = msg_type;
insn->bits3.gen7_dword_rw.bti = bti;
insn->bits3.gen7_dword_rw.block_size = block_size;
@@ -466,11 +456,10 @@ namespace gbe
this->setDst(insn, GenRegister::uw16grf(dst.nr, 0));
this->setSrc0(insn, GenRegister::ud8grf(src.nr, 0));
this->setSrc1(insn, GenRegister::immud(0));
- setDPUntypedRW(this,
- insn,
+ setDPUntypedRW(insn,
bti,
untypedRWMask[elemNum],
- GEN_UNTYPED_READ,
+ GEN7_UNTYPED_READ,
msg_length,
response_length);
}
@@ -492,11 +481,10 @@ namespace gbe
NOT_IMPLEMENTED;
this->setSrc0(insn, GenRegister::ud8grf(msg.nr, 0));
this->setSrc1(insn, GenRegister::immud(0));
- setDPUntypedRW(this,
- insn,
+ setDPUntypedRW(insn,
bti,
untypedRWMask[elemNum],
- GEN_UNTYPED_WRITE,
+ GEN7_UNTYPED_WRITE,
msg_length,
response_length);
}
@@ -522,7 +510,7 @@ namespace gbe
insn,
bti,
elemSize,
- GEN_BYTE_GATHER,
+ GEN7_BYTE_GATHER,
msg_length,
response_length);
}
@@ -546,7 +534,7 @@ namespace gbe
insn,
bti,
elemSize,
- GEN_BYTE_SCATTER,
+ GEN7_BYTE_SCATTER,
msg_length,
response_length);
}
@@ -575,7 +563,7 @@ namespace gbe
insn,
bti,
block_size,
- GEN_DWORD_GATHER,
+ GEN7_DWORD_GATHER,
msg_length,
response_length);
@@ -601,8 +589,8 @@ namespace gbe
this->setSrc1(insn, GenRegister::immud(0));
const GenMessageTarget sfid = GEN_SFID_DATAPORT_DATA_CACHE;
- setMessageDescriptor(this, insn, sfid, msg_length, response_length);
- insn->bits3.gen7_atomic_op.msg_type = GEN_UNTYPED_ATOMIC_READ;
+ setMessageDescriptor(insn, sfid, msg_length, response_length);
+ insn->bits3.gen7_atomic_op.msg_type = GEN7_UNTYPED_ATOMIC_READ;
insn->bits3.gen7_atomic_op.bti = bti;
insn->bits3.gen7_atomic_op.return_data = 1;
insn->bits3.gen7_atomic_op.aop_type = function;
@@ -1078,7 +1066,7 @@ namespace gbe
this->setHeader(insn);
this->setDst(insn, GenRegister::null());
this->setSrc0(insn, src);
- setMessageDescriptor(this, insn, GEN_SFID_MESSAGE_GATEWAY, 1, 0);
+ setMessageDescriptor(insn, GEN_SFID_MESSAGE_GATEWAY, 1, 0);
insn->bits3.msg_gateway.sub_function_id = GEN_BARRIER_MSG;
insn->bits3.msg_gateway.notify = 0x1;
}
@@ -1087,7 +1075,7 @@ namespace gbe
this->setHeader(insn);
this->setDst(insn, dst);
this->setSrc0(insn, dst);
- setMessageDescriptor(this, insn, GEN_SFID_DATAPORT_DATA_CACHE, 1, 1, 1);
+ setMessageDescriptor(insn, GEN_SFID_DATAPORT_DATA_CACHE, 1, 1, 1);
insn->bits3.gen7_memory_fence.msg_type = GEN_MEM_FENCE;
insn->bits3.gen7_memory_fence.commit_enable = 0x1;
}
@@ -1316,7 +1304,7 @@ namespace gbe
this->setHeader(insn);
this->setDst(insn, GenRegister::retype(GenRegister::null(), GEN_TYPE_UD));
this->setSrc0(insn, msg);
- setTypedWriteMessage(this, insn, bti, msg_type, msg_length, header_present);
+ setTypedWriteMessage(insn, bti, msg_type, msg_length, header_present);
}
static void setScratchMessage(GenEncoder *p,
GenNativeInstruction *insn,
@@ -1328,7 +1316,7 @@ namespace gbe
uint32_t response_length)
{
const GenMessageTarget sfid = GEN_SFID_DATAPORT_DATA_CACHE;
- setMessageDescriptor(p, insn, sfid, msg_length, response_length, true);
+ p->setMessageDescriptor(insn, sfid, msg_length, response_length, true);
insn->bits3.gen7_scratch_rw.block_size = block_size;
insn->bits3.gen7_scratch_rw.msg_type = msg_type;
insn->bits3.gen7_scratch_rw.channel_mode = channel_mode;
diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp
index 024d9c6..31d7f4e 100644
--- a/backend/src/backend/gen_encoder.hpp
+++ b/backend/src/backend/gen_encoder.hpp
@@ -207,6 +207,15 @@ namespace gbe
////////////////////////////////////////////////////////////////////////
// Helper functions to encode
////////////////////////////////////////////////////////////////////////
+ virtual void setDPUntypedRW(GenNativeInstruction *insn, uint32_t bti, uint32_t rgba,
+ uint32_t msg_type, uint32_t msg_length,
+ uint32_t response_length);
+ virtual void setTypedWriteMessage(GenNativeInstruction *insn, unsigned char bti,
+ unsigned char msg_type, uint32_t msg_length,
+ bool header_present);
+ void setMessageDescriptor(GenNativeInstruction *inst, enum GenMessageTarget sfid,
+ unsigned msg_length, unsigned response_length,
+ bool header_present = false, bool end_of_thread = false);
void setHeader(GenNativeInstruction *insn);
void setDst(GenNativeInstruction *insn, GenRegister dest);
void setSrc0(GenNativeInstruction *insn, GenRegister reg);
--
1.8.3.2
More information about the Beignet
mailing list