diff options
author | Roland Dreier <rolandd@cisco.com> | 2007-10-14 23:40:27 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-10-15 23:17:27 -0400 |
commit | ab8403c424a35364a3a2c753f7c5917fcbb4d809 (patch) | |
tree | 9cbcfbc4ae9f15b05272be1fbdc7e028b86f297e /drivers/infiniband/hw/mthca/mthca_cq.c | |
parent | 744ea922c901b6557bffe8bff7af1ef18181f370 (diff) |
IB/mthca: Avoid alignment traps when writing doorbells
Architectures such as ia64 see alignment traps when doing a 64-bit
read from __be32 doorbell[2] arrays to do doorbell writes in
mthca_write64(). Fix this by just passing the two halves of the
doorbell value into mthca_write64(). This actually improves the
generated code by allowing the compiler to see what's going on better.
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_cq.c')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_cq.c | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c index be6e1e03bdab..6bd9f1393349 100644 --- a/drivers/infiniband/hw/mthca/mthca_cq.c +++ b/drivers/infiniband/hw/mthca/mthca_cq.c | |||
@@ -204,16 +204,11 @@ static void dump_cqe(struct mthca_dev *dev, void *cqe_ptr) | |||
204 | static inline void update_cons_index(struct mthca_dev *dev, struct mthca_cq *cq, | 204 | static inline void update_cons_index(struct mthca_dev *dev, struct mthca_cq *cq, |
205 | int incr) | 205 | int incr) |
206 | { | 206 | { |
207 | __be32 doorbell[2]; | ||
208 | |||
209 | if (mthca_is_memfree(dev)) { | 207 | if (mthca_is_memfree(dev)) { |
210 | *cq->set_ci_db = cpu_to_be32(cq->cons_index); | 208 | *cq->set_ci_db = cpu_to_be32(cq->cons_index); |
211 | wmb(); | 209 | wmb(); |
212 | } else { | 210 | } else { |
213 | doorbell[0] = cpu_to_be32(MTHCA_TAVOR_CQ_DB_INC_CI | cq->cqn); | 211 | mthca_write64(MTHCA_TAVOR_CQ_DB_INC_CI | cq->cqn, incr - 1, |
214 | doorbell[1] = cpu_to_be32(incr - 1); | ||
215 | |||
216 | mthca_write64(doorbell, | ||
217 | dev->kar + MTHCA_CQ_DOORBELL, | 212 | dev->kar + MTHCA_CQ_DOORBELL, |
218 | MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock)); | 213 | MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock)); |
219 | /* | 214 | /* |
@@ -731,17 +726,12 @@ repoll: | |||
731 | 726 | ||
732 | int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags) | 727 | int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags) |
733 | { | 728 | { |
734 | __be32 doorbell[2]; | 729 | u32 dbhi = ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ? |
730 | MTHCA_TAVOR_CQ_DB_REQ_NOT_SOL : | ||
731 | MTHCA_TAVOR_CQ_DB_REQ_NOT) | | ||
732 | to_mcq(cq)->cqn; | ||
735 | 733 | ||
736 | doorbell[0] = cpu_to_be32(((flags & IB_CQ_SOLICITED_MASK) == | 734 | mthca_write64(dbhi, 0xffffffff, to_mdev(cq->device)->kar + MTHCA_CQ_DOORBELL, |
737 | IB_CQ_SOLICITED ? | ||
738 | MTHCA_TAVOR_CQ_DB_REQ_NOT_SOL : | ||
739 | MTHCA_TAVOR_CQ_DB_REQ_NOT) | | ||
740 | to_mcq(cq)->cqn); | ||
741 | doorbell[1] = (__force __be32) 0xffffffff; | ||
742 | |||
743 | mthca_write64(doorbell, | ||
744 | to_mdev(cq->device)->kar + MTHCA_CQ_DOORBELL, | ||
745 | MTHCA_GET_DOORBELL_LOCK(&to_mdev(cq->device)->doorbell_lock)); | 735 | MTHCA_GET_DOORBELL_LOCK(&to_mdev(cq->device)->doorbell_lock)); |
746 | 736 | ||
747 | return 0; | 737 | return 0; |
@@ -750,19 +740,16 @@ int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags) | |||
750 | int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) | 740 | int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) |
751 | { | 741 | { |
752 | struct mthca_cq *cq = to_mcq(ibcq); | 742 | struct mthca_cq *cq = to_mcq(ibcq); |
753 | __be32 doorbell[2]; | 743 | __be32 db_rec[2]; |
754 | u32 sn; | 744 | u32 dbhi; |
755 | __be32 ci; | 745 | u32 sn = cq->arm_sn & 3; |
756 | |||
757 | sn = cq->arm_sn & 3; | ||
758 | ci = cpu_to_be32(cq->cons_index); | ||
759 | 746 | ||
760 | doorbell[0] = ci; | 747 | db_rec[0] = cpu_to_be32(cq->cons_index); |
761 | doorbell[1] = cpu_to_be32((cq->cqn << 8) | (2 << 5) | (sn << 3) | | 748 | db_rec[1] = cpu_to_be32((cq->cqn << 8) | (2 << 5) | (sn << 3) | |
762 | ((flags & IB_CQ_SOLICITED_MASK) == | 749 | ((flags & IB_CQ_SOLICITED_MASK) == |
763 | IB_CQ_SOLICITED ? 1 : 2)); | 750 | IB_CQ_SOLICITED ? 1 : 2)); |
764 | 751 | ||
765 | mthca_write_db_rec(doorbell, cq->arm_db); | 752 | mthca_write_db_rec(db_rec, cq->arm_db); |
766 | 753 | ||
767 | /* | 754 | /* |
768 | * Make sure that the doorbell record in host memory is | 755 | * Make sure that the doorbell record in host memory is |
@@ -770,14 +757,12 @@ int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) | |||
770 | */ | 757 | */ |
771 | wmb(); | 758 | wmb(); |
772 | 759 | ||
773 | doorbell[0] = cpu_to_be32((sn << 28) | | 760 | dbhi = (sn << 28) | |
774 | ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ? | 761 | ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ? |
775 | MTHCA_ARBEL_CQ_DB_REQ_NOT_SOL : | 762 | MTHCA_ARBEL_CQ_DB_REQ_NOT_SOL : |
776 | MTHCA_ARBEL_CQ_DB_REQ_NOT) | | 763 | MTHCA_ARBEL_CQ_DB_REQ_NOT) | cq->cqn; |
777 | cq->cqn); | ||
778 | doorbell[1] = ci; | ||
779 | 764 | ||
780 | mthca_write64(doorbell, | 765 | mthca_write64(dbhi, cq->cons_index, |
781 | to_mdev(ibcq->device)->kar + MTHCA_CQ_DOORBELL, | 766 | to_mdev(ibcq->device)->kar + MTHCA_CQ_DOORBELL, |
782 | MTHCA_GET_DOORBELL_LOCK(&to_mdev(ibcq->device)->doorbell_lock)); | 767 | MTHCA_GET_DOORBELL_LOCK(&to_mdev(ibcq->device)->doorbell_lock)); |
783 | 768 | ||