aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ntb
diff options
context:
space:
mode:
authorLeonid Ravich <lravich@gmail.com>2019-02-12 15:09:28 -0500
committerJon Mason <jdmason@kudzu.us>2019-02-13 11:03:18 -0500
commitebb09b33c60c46fd4f7ffa0af9e693eebe765d1b (patch)
treed41b706a6f27e5b4d9270cf3e62b6a4249037ab3 /drivers/ntb
parentc59666bb32b91da84b1d3df0e88789de9e827f61 (diff)
NTB: add new parameter to peer_db_addr() db_bit and db_data
NTB door bell usage depends on NTB hardware. ex: intel NTB gen1 has one peer door bell register which can be controlled by the bitmap writen to it, while Intel NTB gen3 has a registers per door bell and the data trigering the each door bell is always 1. therefore exposing only peer door bell address forcing the user to be aware of such low level details Signed-off-by: Leonid Ravich <Leonid.Ravich@emc.com> Acked-by: Logan Gunthorpe <logang@deltatee.com> Acked-by: Dave Jiang <dave.jiang@intel.com> Acked-by: Allen Hubbe <allenbh@gmail.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
Diffstat (limited to 'drivers/ntb')
-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
4 files changed, 62 insertions, 10 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}