On 2017/12/28 1:40, Ruhl, Michael J wrote: >> -----Original Message----- >> From: linux-rdma-owner@xxxxxxxxxxxxxxx [mailto:linux-rdma- >> owner@xxxxxxxxxxxxxxx] On Behalf Of Yixian Liu >> Sent: Monday, December 25, 2017 8:37 AM >> To: jgg@xxxxxxxx; leon@xxxxxxxxxx >> Cc: dledford@xxxxxxxxxx; linux-rdma@xxxxxxxxxxxxxxx >> Subject: [PATCH for-next 2/2] RDMA/hns: Fix alignment problem of the >> doorbell >> >> The array defined for doorbell is not guaranteed to be 64 bit >> aligned while we write it to the hardware with 64 bit >> alignment required. >> >> This patch fixes this problem by defining a union for doorbell >> to make sure it 64 bit alignment. >> >> Signed-off-by: Yixian Liu <liuyixian@xxxxxxxxxx> >> Signed-off-by: Lijun Ou <oulijun@xxxxxxxxxx> >> Signed-off-by: Wei Hu (Xavier) <xavier.huwei@xxxxxxxxxx> >> --- >> drivers/infiniband/hw/hns/hns_roce_device.h | 5 +++++ >> drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 16 ++++++++-------- >> 2 files changed, 13 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h >> b/drivers/infiniband/hw/hns/hns_roce_device.h >> index dde5178..defc4ee 100644 >> --- a/drivers/infiniband/hw/hns/hns_roce_device.h >> +++ b/drivers/infiniband/hw/hns/hns_roce_device.h >> @@ -569,6 +569,11 @@ struct hns_roce_eq_table { >> void __iomem **eqc_base; /* only for hw v1 */ >> }; >> >> +union hns_roce_db { >> + u64 doorbell64; > > Are there any concerns with big endian/little ending for this value? > > Mike > I will consider this issue in patch v3, Mike, thank you! >> + u32 doorbell[2]; >> +}; >> + >> struct hns_roce_caps { >> u8 num_ports; >> int gid_table_len[HNS_ROCE_MAX_PORTS]; >> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c >> b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c >> index 7f393f6..ee26bbd 100644 >> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c >> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c >> @@ -3172,33 +3172,33 @@ static int hns_roce_v2_modify_cq(struct ib_cq >> *cq, u16 cq_count, u16 cq_period) >> >> static void set_eq_cons_index_v2(struct hns_roce_eq *eq) >> { >> - u32 doorbell[2]; >> + union hns_roce_db db; >> >> - doorbell[0] = 0; >> - doorbell[1] = 0; >> + db.doorbell[0] = 0; >> + db.doorbell[1] = 0; >> >> if (eq->type_flag == HNS_ROCE_AEQ) { >> - roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_CMD_M, >> + roce_set_field(db.doorbell[0], >> HNS_ROCE_V2_EQ_DB_CMD_M, >> HNS_ROCE_V2_EQ_DB_CMD_S, >> eq->arm_st == >> HNS_ROCE_V2_EQ_ALWAYS_ARMED ? >> HNS_ROCE_EQ_DB_CMD_AEQ : >> HNS_ROCE_EQ_DB_CMD_AEQ_ARMED); >> } else { >> - roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_TAG_M, >> + roce_set_field(db.doorbell[0], >> HNS_ROCE_V2_EQ_DB_TAG_M, >> HNS_ROCE_V2_EQ_DB_TAG_S, eq->eqn); >> >> - roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_CMD_M, >> + roce_set_field(db.doorbell[0], >> HNS_ROCE_V2_EQ_DB_CMD_M, >> HNS_ROCE_V2_EQ_DB_CMD_S, >> eq->arm_st == >> HNS_ROCE_V2_EQ_ALWAYS_ARMED ? >> HNS_ROCE_EQ_DB_CMD_CEQ : >> HNS_ROCE_EQ_DB_CMD_CEQ_ARMED); >> } >> >> - roce_set_field(doorbell[1], HNS_ROCE_V2_EQ_DB_PARA_M, >> + roce_set_field(db.doorbell[1], HNS_ROCE_V2_EQ_DB_PARA_M, >> HNS_ROCE_V2_EQ_DB_PARA_S, >> (eq->cons_index & HNS_ROCE_V2_CONS_IDX_M)); >> >> - hns_roce_write64_k(doorbell, eq->doorbell); >> + hns_roce_write64_k(db.doorbell, eq->doorbell); >> >> /* Make sure we update the consumer index of EQ before >> * accessing it later >> -- >> 1.9.1 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > . > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html