summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ntb/hw/intel/ntb_hw_gen1.c25
-rw-r--r--drivers/ntb/hw/intel/ntb_hw_gen1.h5
-rw-r--r--drivers/ntb/hw/intel/ntb_hw_gen3.c33
-rw-r--r--drivers/ntb/hw/mscc/ntb_hw_switchtec.c9
-rw-r--r--include/linux/ntb.h10
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
183static inline int ndev_db_addr(struct intel_ntb_dev *ndev, 183void 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
203u64 ndev_db_read(struct intel_ntb_dev *ndev, 201u64 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
1114int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, 1112static 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
1123static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits) 1136static 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;
147int ndev_init_isr(struct intel_ntb_dev *ndev, int msix_min, int msix_max, 147int 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);
149enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd); 149enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd);
150void 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);
150u64 ndev_db_read(struct intel_ntb_dev *ndev, void __iomem *mmio); 153u64 ndev_db_read(struct intel_ntb_dev *ndev, void __iomem *mmio);
151int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits, 154int 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);
166u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector); 169u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector);
167int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits); 170int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits);
168int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits); 171int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits);
169int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
170 resource_size_t *db_size);
171int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb); 172int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb);
172int intel_ntb_spad_count(struct ntb_dev *ntb); 173int intel_ntb_spad_count(struct ntb_dev *ntb);
173u32 intel_ntb_spad_read(struct ntb_dev *ntb, int idx); 174u32 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
535int 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
535static int intel_ntb3_peer_db_set(struct ntb_dev *ntb, u64 db_bits) 566static 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
711static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb, 711static 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 */
1092static inline int ntb_peer_db_addr(struct ntb_dev *ntb, 1095static 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/**