diff options
-rw-r--r-- | drivers/ntb/hw/intel/ntb_hw_gen1.c | 25 | ||||
-rw-r--r-- | drivers/ntb/hw/intel/ntb_hw_gen1.h | 5 | ||||
-rw-r--r-- | drivers/ntb/hw/intel/ntb_hw_gen3.c | 33 | ||||
-rw-r--r-- | drivers/ntb/hw/mscc/ntb_hw_switchtec.c | 9 | ||||
-rw-r--r-- | include/linux/ntb.h | 10 |
5 files changed, 69 insertions, 13 deletions
diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c index 2ad263f708da..bb57ec239029 100644 --- a/drivers/ntb/hw/intel/ntb_hw_gen1.c +++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c | |||
@@ -180,7 +180,7 @@ int ndev_mw_to_bar(struct intel_ntb_dev *ndev, int idx) | |||
180 | return ndev->reg->mw_bar[idx]; | 180 | return ndev->reg->mw_bar[idx]; |
181 | } | 181 | } |
182 | 182 | ||
183 | static inline int ndev_db_addr(struct intel_ntb_dev *ndev, | 183 | void ndev_db_addr(struct intel_ntb_dev *ndev, |
184 | phys_addr_t *db_addr, resource_size_t *db_size, | 184 | phys_addr_t *db_addr, resource_size_t *db_size, |
185 | phys_addr_t reg_addr, unsigned long reg) | 185 | phys_addr_t reg_addr, unsigned long reg) |
186 | { | 186 | { |
@@ -196,8 +196,6 @@ static inline int ndev_db_addr(struct intel_ntb_dev *ndev, | |||
196 | *db_size = ndev->reg->db_size; | 196 | *db_size = ndev->reg->db_size; |
197 | dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size); | 197 | dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size); |
198 | } | 198 | } |
199 | |||
200 | return 0; | ||
201 | } | 199 | } |
202 | 200 | ||
203 | u64 ndev_db_read(struct intel_ntb_dev *ndev, | 201 | u64 ndev_db_read(struct intel_ntb_dev *ndev, |
@@ -1111,13 +1109,28 @@ int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits) | |||
1111 | ndev->self_reg->db_mask); | 1109 | ndev->self_reg->db_mask); |
1112 | } | 1110 | } |
1113 | 1111 | ||
1114 | int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, | 1112 | static int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, |
1115 | resource_size_t *db_size) | 1113 | resource_size_t *db_size, u64 *db_data, int db_bit) |
1116 | { | 1114 | { |
1115 | u64 db_bits; | ||
1117 | struct intel_ntb_dev *ndev = ntb_ndev(ntb); | 1116 | struct intel_ntb_dev *ndev = ntb_ndev(ntb); |
1118 | 1117 | ||
1119 | return ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr, | 1118 | if (unlikely(db_bit >= BITS_PER_LONG_LONG)) |
1119 | return -EINVAL; | ||
1120 | |||
1121 | db_bits = BIT_ULL(db_bit); | ||
1122 | |||
1123 | if (unlikely(db_bits & ~ntb_ndev(ntb)->db_valid_mask)) | ||
1124 | return -EINVAL; | ||
1125 | |||
1126 | ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr, | ||
1120 | ndev->peer_reg->db_bell); | 1127 | ndev->peer_reg->db_bell); |
1128 | |||
1129 | if (db_data) | ||
1130 | *db_data = db_bits; | ||
1131 | |||
1132 | |||
1133 | return 0; | ||
1121 | } | 1134 | } |
1122 | 1135 | ||
1123 | static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits) | 1136 | static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits) |
diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.h b/drivers/ntb/hw/intel/ntb_hw_gen1.h index ad8ec1444436..544cf5c06f4d 100644 --- a/drivers/ntb/hw/intel/ntb_hw_gen1.h +++ b/drivers/ntb/hw/intel/ntb_hw_gen1.h | |||
@@ -147,6 +147,9 @@ extern struct intel_b2b_addr xeon_b2b_dsd_addr; | |||
147 | int ndev_init_isr(struct intel_ntb_dev *ndev, int msix_min, int msix_max, | 147 | int ndev_init_isr(struct intel_ntb_dev *ndev, int msix_min, int msix_max, |
148 | int msix_shift, int total_shift); | 148 | int msix_shift, int total_shift); |
149 | enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd); | 149 | enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd); |
150 | void ndev_db_addr(struct intel_ntb_dev *ndev, | ||
151 | phys_addr_t *db_addr, resource_size_t *db_size, | ||
152 | phys_addr_t reg_addr, unsigned long reg); | ||
150 | u64 ndev_db_read(struct intel_ntb_dev *ndev, void __iomem *mmio); | 153 | u64 ndev_db_read(struct intel_ntb_dev *ndev, void __iomem *mmio); |
151 | int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits, | 154 | int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits, |
152 | void __iomem *mmio); | 155 | void __iomem *mmio); |
@@ -166,8 +169,6 @@ int intel_ntb_db_vector_count(struct ntb_dev *ntb); | |||
166 | u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector); | 169 | u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector); |
167 | int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits); | 170 | int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits); |
168 | int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits); | 171 | int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits); |
169 | int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, | ||
170 | resource_size_t *db_size); | ||
171 | int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb); | 172 | int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb); |
172 | int intel_ntb_spad_count(struct ntb_dev *ntb); | 173 | int intel_ntb_spad_count(struct ntb_dev *ntb); |
173 | u32 intel_ntb_spad_read(struct ntb_dev *ntb, int idx); | 174 | u32 intel_ntb_spad_read(struct ntb_dev *ntb, int idx); |
diff --git a/drivers/ntb/hw/intel/ntb_hw_gen3.c b/drivers/ntb/hw/intel/ntb_hw_gen3.c index b3fa24778f94..f475b56a3f49 100644 --- a/drivers/ntb/hw/intel/ntb_hw_gen3.c +++ b/drivers/ntb/hw/intel/ntb_hw_gen3.c | |||
@@ -532,6 +532,37 @@ static int intel_ntb3_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx, | |||
532 | return 0; | 532 | return 0; |
533 | } | 533 | } |
534 | 534 | ||
535 | int intel_ntb3_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, | ||
536 | resource_size_t *db_size, | ||
537 | u64 *db_data, int db_bit) | ||
538 | { | ||
539 | phys_addr_t db_addr_base; | ||
540 | struct intel_ntb_dev *ndev = ntb_ndev(ntb); | ||
541 | |||
542 | if (unlikely(db_bit >= BITS_PER_LONG_LONG)) | ||
543 | return -EINVAL; | ||
544 | |||
545 | if (unlikely(BIT_ULL(db_bit) & ~ntb_ndev(ntb)->db_valid_mask)) | ||
546 | return -EINVAL; | ||
547 | |||
548 | ndev_db_addr(ndev, &db_addr_base, db_size, ndev->peer_addr, | ||
549 | ndev->peer_reg->db_bell); | ||
550 | |||
551 | if (db_addr) { | ||
552 | *db_addr = db_addr_base + (db_bit * 4); | ||
553 | dev_dbg(&ndev->ntb.pdev->dev, "Peer db addr %llx db bit %d\n", | ||
554 | *db_addr, db_bit); | ||
555 | } | ||
556 | |||
557 | if (db_data) { | ||
558 | *db_data = 1; | ||
559 | dev_dbg(&ndev->ntb.pdev->dev, "Peer db data %llx db bit %d\n", | ||
560 | *db_data, db_bit); | ||
561 | } | ||
562 | |||
563 | return 0; | ||
564 | } | ||
565 | |||
535 | static int intel_ntb3_peer_db_set(struct ntb_dev *ntb, u64 db_bits) | 566 | static int intel_ntb3_peer_db_set(struct ntb_dev *ntb, u64 db_bits) |
536 | { | 567 | { |
537 | struct intel_ntb_dev *ndev = ntb_ndev(ntb); | 568 | struct intel_ntb_dev *ndev = ntb_ndev(ntb); |
@@ -584,7 +615,7 @@ const struct ntb_dev_ops intel_ntb3_ops = { | |||
584 | .db_clear = intel_ntb3_db_clear, | 615 | .db_clear = intel_ntb3_db_clear, |
585 | .db_set_mask = intel_ntb_db_set_mask, | 616 | .db_set_mask = intel_ntb_db_set_mask, |
586 | .db_clear_mask = intel_ntb_db_clear_mask, | 617 | .db_clear_mask = intel_ntb_db_clear_mask, |
587 | .peer_db_addr = intel_ntb_peer_db_addr, | 618 | .peer_db_addr = intel_ntb3_peer_db_addr, |
588 | .peer_db_set = intel_ntb3_peer_db_set, | 619 | .peer_db_set = intel_ntb3_peer_db_set, |
589 | .spad_is_unsafe = intel_ntb_spad_is_unsafe, | 620 | .spad_is_unsafe = intel_ntb_spad_is_unsafe, |
590 | .spad_count = intel_ntb_spad_count, | 621 | .spad_count = intel_ntb_spad_count, |
diff --git a/drivers/ntb/hw/mscc/ntb_hw_switchtec.c b/drivers/ntb/hw/mscc/ntb_hw_switchtec.c index f6f00354047b..9ae944597708 100644 --- a/drivers/ntb/hw/mscc/ntb_hw_switchtec.c +++ b/drivers/ntb/hw/mscc/ntb_hw_switchtec.c | |||
@@ -710,11 +710,16 @@ static u64 switchtec_ntb_db_read_mask(struct ntb_dev *ntb) | |||
710 | 710 | ||
711 | static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb, | 711 | static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb, |
712 | phys_addr_t *db_addr, | 712 | phys_addr_t *db_addr, |
713 | resource_size_t *db_size) | 713 | resource_size_t *db_size, |
714 | u64 *db_data, | ||
715 | int db_bit) | ||
714 | { | 716 | { |
715 | struct switchtec_ntb *sndev = ntb_sndev(ntb); | 717 | struct switchtec_ntb *sndev = ntb_sndev(ntb); |
716 | unsigned long offset; | 718 | unsigned long offset; |
717 | 719 | ||
720 | if (unlikely(db_bit >= BITS_PER_LONG_LONG)) | ||
721 | return -EINVAL; | ||
722 | |||
718 | offset = (unsigned long)sndev->mmio_peer_dbmsg->odb - | 723 | offset = (unsigned long)sndev->mmio_peer_dbmsg->odb - |
719 | (unsigned long)sndev->stdev->mmio; | 724 | (unsigned long)sndev->stdev->mmio; |
720 | 725 | ||
@@ -724,6 +729,8 @@ static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb, | |||
724 | *db_addr = pci_resource_start(ntb->pdev, 0) + offset; | 729 | *db_addr = pci_resource_start(ntb->pdev, 0) + offset; |
725 | if (db_size) | 730 | if (db_size) |
726 | *db_size = sizeof(u32); | 731 | *db_size = sizeof(u32); |
732 | if (db_data) | ||
733 | *db_data = BIT_ULL(db_bit) << sndev->db_peer_shift; | ||
727 | 734 | ||
728 | return 0; | 735 | return 0; |
729 | } | 736 | } |
diff --git a/include/linux/ntb.h b/include/linux/ntb.h index 181d16601dd9..56a92e3ae3ae 100644 --- a/include/linux/ntb.h +++ b/include/linux/ntb.h | |||
@@ -296,7 +296,8 @@ struct ntb_dev_ops { | |||
296 | int (*db_clear_mask)(struct ntb_dev *ntb, u64 db_bits); | 296 | int (*db_clear_mask)(struct ntb_dev *ntb, u64 db_bits); |
297 | 297 | ||
298 | int (*peer_db_addr)(struct ntb_dev *ntb, | 298 | int (*peer_db_addr)(struct ntb_dev *ntb, |
299 | phys_addr_t *db_addr, resource_size_t *db_size); | 299 | phys_addr_t *db_addr, resource_size_t *db_size, |
300 | u64 *db_data, int db_bit); | ||
300 | u64 (*peer_db_read)(struct ntb_dev *ntb); | 301 | u64 (*peer_db_read)(struct ntb_dev *ntb); |
301 | int (*peer_db_set)(struct ntb_dev *ntb, u64 db_bits); | 302 | int (*peer_db_set)(struct ntb_dev *ntb, u64 db_bits); |
302 | int (*peer_db_clear)(struct ntb_dev *ntb, u64 db_bits); | 303 | int (*peer_db_clear)(struct ntb_dev *ntb, u64 db_bits); |
@@ -1078,6 +1079,8 @@ static inline int ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits) | |||
1078 | * @ntb: NTB device context. | 1079 | * @ntb: NTB device context. |
1079 | * @db_addr: OUT - The address of the peer doorbell register. | 1080 | * @db_addr: OUT - The address of the peer doorbell register. |
1080 | * @db_size: OUT - The number of bytes to write the peer doorbell register. | 1081 | * @db_size: OUT - The number of bytes to write the peer doorbell register. |
1082 | * @db_data: OUT - The data of peer doorbell register | ||
1083 | * @db_bit: door bell bit number | ||
1081 | * | 1084 | * |
1082 | * Return the address of the peer doorbell register. This may be used, for | 1085 | * Return the address of the peer doorbell register. This may be used, for |
1083 | * example, by drivers that offload memory copy operations to a dma engine. | 1086 | * example, by drivers that offload memory copy operations to a dma engine. |
@@ -1091,12 +1094,13 @@ static inline int ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits) | |||
1091 | */ | 1094 | */ |
1092 | static inline int ntb_peer_db_addr(struct ntb_dev *ntb, | 1095 | static inline int ntb_peer_db_addr(struct ntb_dev *ntb, |
1093 | phys_addr_t *db_addr, | 1096 | phys_addr_t *db_addr, |
1094 | resource_size_t *db_size) | 1097 | resource_size_t *db_size, |
1098 | u64 *db_data, int db_bit) | ||
1095 | { | 1099 | { |
1096 | if (!ntb->ops->peer_db_addr) | 1100 | if (!ntb->ops->peer_db_addr) |
1097 | return -EINVAL; | 1101 | return -EINVAL; |
1098 | 1102 | ||
1099 | return ntb->ops->peer_db_addr(ntb, db_addr, db_size); | 1103 | return ntb->ops->peer_db_addr(ntb, db_addr, db_size, db_data, db_bit); |
1100 | } | 1104 | } |
1101 | 1105 | ||
1102 | /** | 1106 | /** |