broadcom/compiler: implement "reads/writes too soon" checks for v71
authorIago Toral Quiroga <itoral@igalia.com>
Thu, 23 Sep 2021 09:19:58 +0000 (11:19 +0200)
committerMarge Bot <emma+marge@anholt.net>
Fri, 13 Oct 2023 22:37:41 +0000 (22:37 +0000)
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450>

src/broadcom/compiler/qpu_schedule.c

index 2fa9031..48aa141 100644 (file)
@@ -562,7 +562,24 @@ mux_reads_too_soon(struct choose_scoreboard *scoreboard,
 }
 
 static bool
-reads_too_soon_after_write(struct choose_scoreboard *scoreboard,
+reads_too_soon(struct choose_scoreboard *scoreboard,
+               const struct v3d_qpu_instr *inst, uint8_t raddr)
+{
+        switch (raddr) {
+        case 0: /* ldvary delayed write of C coefficient to rf0 */
+                if (scoreboard->tick - scoreboard->last_ldvary_tick <= 1)
+                        return true;
+                break;
+        default:
+                break;
+        }
+
+        return false;
+}
+
+static bool
+reads_too_soon_after_write(const struct v3d_device_info *devinfo,
+                           struct choose_scoreboard *scoreboard,
                            struct qinst *qinst)
 {
         const struct v3d_qpu_instr *inst = &qinst->qpu;
@@ -574,24 +591,44 @@ reads_too_soon_after_write(struct choose_scoreboard *scoreboard,
         assert(inst->type == V3D_QPU_INSTR_TYPE_ALU);
 
         if (inst->alu.add.op != V3D_QPU_A_NOP) {
-                if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0 &&
-                    mux_reads_too_soon(scoreboard, inst, inst->alu.add.a.mux)) {
-                        return true;
+                if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 0) {
+                        if (devinfo->ver < 71) {
+                                if (mux_reads_too_soon(scoreboard, inst, inst->alu.add.a.mux))
+                                        return true;
+                        } else {
+                                if (reads_too_soon(scoreboard, inst, inst->alu.add.a.raddr))
+                                        return true;
+                        }
                 }
-                if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1 &&
-                    mux_reads_too_soon(scoreboard, inst, inst->alu.add.b.mux)) {
-                        return true;
+                if (v3d_qpu_add_op_num_src(inst->alu.add.op) > 1) {
+                        if (devinfo->ver < 71) {
+                                if (mux_reads_too_soon(scoreboard, inst, inst->alu.add.b.mux))
+                                        return true;
+                        } else {
+                                if (reads_too_soon(scoreboard, inst, inst->alu.add.b.raddr))
+                                        return true;
+                        }
                 }
         }
 
         if (inst->alu.mul.op != V3D_QPU_M_NOP) {
-                if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0 &&
-                    mux_reads_too_soon(scoreboard, inst, inst->alu.mul.a.mux)) {
-                        return true;
+                if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 0) {
+                        if (devinfo->ver < 71) {
+                                if (mux_reads_too_soon(scoreboard, inst, inst->alu.mul.a.mux))
+                                        return true;
+                        } else {
+                                if (reads_too_soon(scoreboard, inst, inst->alu.mul.a.raddr))
+                                        return true;
+                        }
                 }
-                if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1 &&
-                    mux_reads_too_soon(scoreboard, inst, inst->alu.mul.b.mux)) {
-                        return true;
+                if (v3d_qpu_mul_op_num_src(inst->alu.mul.op) > 1) {
+                        if (devinfo->ver < 71) {
+                                if (mux_reads_too_soon(scoreboard, inst, inst->alu.mul.b.mux))
+                                        return true;
+                        } else {
+                                if (reads_too_soon(scoreboard, inst, inst->alu.mul.b.raddr))
+                                        return true;
+                        }
                 }
         }
 
@@ -1147,7 +1184,7 @@ retry:
                  *  regfile A or B that was written to by the previous
                  *  instruction."
                  */
-                if (reads_too_soon_after_write(scoreboard, n->inst))
+                if (reads_too_soon_after_write(c->devinfo, scoreboard, n->inst))
                         continue;
 
                 if (writes_too_soon_after_write(c->devinfo, scoreboard, n->inst))