struct brw_reg dst,
struct brw_reg payload,
struct brw_reg desc,
- unsigned desc_imm)
+ unsigned desc_imm,
+ bool eot)
{
const struct gen_device_info *devinfo = p->devinfo;
struct brw_inst *send;
brw_set_dest(p, send, dst);
brw_set_src0(p, send, retype(payload, BRW_REGISTER_TYPE_UD));
brw_inst_set_sfid(devinfo, send, sfid);
+ brw_inst_set_eot(devinfo, send, eot);
}
void
struct brw_reg desc,
unsigned desc_imm,
struct brw_reg ex_desc,
- unsigned ex_desc_imm)
+ unsigned ex_desc_imm,
+ bool eot)
{
const struct gen_device_info *devinfo = p->devinfo;
struct brw_inst *send;
* so the caller can specify additional descriptor bits with the
* desc_imm immediate.
*
- * Even though the instruction dispatcher always pulls the SFID from the
- * instruction itself, the extended descriptor sent to the actual unit
- * gets the SFID from the extended descriptor which comes from the
- * address register. If we don't OR it in, the external unit gets
- * confused and hangs the GPU.
+ * Even though the instruction dispatcher always pulls the SFID and EOT
+ * fields from the instruction itself, actual external unit which
+ * processes the message gets the SFID and EOT from the extended
+ * descriptor which comes from the address register. If we don't OR
+ * those two bits in, the external unit may get confused and hang.
*/
- brw_OR(p, addr, ex_desc, brw_imm_ud(ex_desc_imm | sfid));
+ brw_OR(p, addr, ex_desc, brw_imm_ud(ex_desc_imm | sfid | eot << 5));
brw_pop_insn_state(p);
ex_desc = addr;
}
brw_inst_set_sfid(devinfo, send, sfid);
+ brw_inst_set_eot(devinfo, send, eot);
}
static void
surface = addr;
}
- brw_send_indirect_message(p, sfid, dst, payload, surface, desc_imm);
+ brw_send_indirect_message(p, sfid, dst, payload, surface, desc_imm, false);
}
static bool
dest,
mrf,
vec1(data),
- desc);
+ desc,
+ false);
}
void
* also covers the dual-payload case because ex_mlen goes in ex_desc.
*/
brw_send_indirect_split_message(p, inst->sfid, dst, payload, payload2,
- desc, desc_imm, ex_desc, ex_desc_imm);
+ desc, desc_imm, ex_desc, ex_desc_imm,
+ inst->eot);
if (inst->check_tdr)
brw_inst_set_opcode(p->devinfo, brw_last_inst, BRW_OPCODE_SENDSC);
} else {
- brw_send_indirect_message(p, inst->sfid, dst, payload, desc, desc_imm);
+ brw_send_indirect_message(p, inst->sfid, dst, payload, desc, desc_imm,
+ inst->eot);
if (inst->check_tdr)
brw_inst_set_opcode(p->devinfo, brw_last_inst, BRW_OPCODE_SENDC);
}
-
- brw_inst_set_eot(p->devinfo, brw_last_inst, inst->eot);
}
void
brw_dp_read_desc(devinfo, 0 /* surface */,
BRW_DATAPORT_OWORD_BLOCK_DWORDS(inst->exec_size),
GEN7_DATAPORT_DC_OWORD_BLOCK_READ,
- BRW_DATAPORT_READ_TARGET_DATA_CACHE));
+ BRW_DATAPORT_READ_TARGET_DATA_CACHE),
+ false /* EOT */);
brw_pop_insn_state(p);
}