|
|
@@ -837,7 +837,13 @@ static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
|
|
|
cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_SEV);
|
|
|
cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSH, ARM_SMMU_SH_ISH);
|
|
|
cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIATTR, ARM_SMMU_MEMATTR_OIWB);
|
|
|
- cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIDATA, ent->sync.msidata);
|
|
|
+ /*
|
|
|
+ * Commands are written little-endian, but we want the SMMU to
|
|
|
+ * receive MSIData, and thus write it back to memory, in CPU
|
|
|
+ * byte order, so big-endian needs an extra byteswap here.
|
|
|
+ */
|
|
|
+ cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_MSIDATA,
|
|
|
+ cpu_to_le32(ent->sync.msidata));
|
|
|
cmd[1] |= ent->sync.msiaddr & CMDQ_SYNC_1_MSIADDR_MASK;
|
|
|
break;
|
|
|
default:
|