diff options
author | Eric Anholt <[email protected]> | 2018-09-10 08:19:48 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-12-07 16:48:23 -0800 |
commit | 42652ea51e643af9dfa0f1f7409b473b95d0a406 (patch) | |
tree | 9b9f53aa7b03012e7acde4935741a5e1f66e66b0 /src/broadcom/compiler/qpu_schedule.c | |
parent | fb9bcf5602b96e4b40ab58e98235678668b10a9a (diff) |
v3d: Use combined input/output segments.
The HW apparently has some issues (or at least a much more complicated VCM
calculation) with non-combined segments, and the closed source driver also
uses combined I/O. Until I get the last CTS failure resolved (which does
look plausibly like some VPM stomping), let's use combined I/O too.
Diffstat (limited to 'src/broadcom/compiler/qpu_schedule.c')
-rw-r--r-- | src/broadcom/compiler/qpu_schedule.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/broadcom/compiler/qpu_schedule.c b/src/broadcom/compiler/qpu_schedule.c index 4f3b621fd29..944059c9778 100644 --- a/src/broadcom/compiler/qpu_schedule.c +++ b/src/broadcom/compiler/qpu_schedule.c @@ -280,6 +280,11 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) const struct v3d_device_info *devinfo = state->devinfo; struct qinst *qinst = n->inst; struct v3d_qpu_instr *inst = &qinst->qpu; + /* If the input and output segments are shared, then all VPM reads to + * a location need to happen before all writes. We handle this by + * serializing all VPM operations for now. + */ + bool separate_vpm_segment = false; if (inst->type == V3D_QPU_INSTR_TYPE_BRANCH) { if (inst->branch.cond != V3D_QPU_BRANCH_COND_ALWAYS) @@ -321,6 +326,14 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) add_write_dep(state, &state->last_vpm, n); break; + case V3D_QPU_A_LDVPMV_IN: + case V3D_QPU_A_LDVPMD_IN: + case V3D_QPU_A_LDVPMG_IN: + case V3D_QPU_A_LDVPMP: + if (!separate_vpm_segment) + add_write_dep(state, &state->last_vpm, n); + break; + case V3D_QPU_A_VPMWT: add_read_dep(state, state->last_vpm, n); break; @@ -414,9 +427,16 @@ calculate_deps(struct schedule_state *state, struct schedule_node *n) if (inst->sig.ldtlb | inst->sig.ldtlbu) add_read_dep(state, state->last_tlb, n); - if (inst->sig.ldvpm) + if (inst->sig.ldvpm) { add_write_dep(state, &state->last_vpm_read, n); + /* At least for now, we're doing shared I/O segments, so queue + * all writes after all reads. + */ + if (!separate_vpm_segment) + add_write_dep(state, &state->last_vpm, n); + } + /* inst->sig.ldunif or sideband uniform read */ if (qinst->uniform != ~0) add_write_dep(state, &state->last_unif, n); |