Skip to content

Commit ebb09b3

Browse files
leonidravichjonmason
authored andcommitted
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>
1 parent c59666b commit ebb09b3

File tree

5 files changed

+69
-13
lines changed

5 files changed

+69
-13
lines changed

drivers/ntb/hw/intel/ntb_hw_gen1.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ int ndev_mw_to_bar(struct intel_ntb_dev *ndev, int idx)
180180
return ndev->reg->mw_bar[idx];
181181
}
182182

183-
static inline int ndev_db_addr(struct intel_ntb_dev *ndev,
183+
void ndev_db_addr(struct intel_ntb_dev *ndev,
184184
phys_addr_t *db_addr, resource_size_t *db_size,
185185
phys_addr_t reg_addr, unsigned long reg)
186186
{
@@ -196,8 +196,6 @@ static inline int ndev_db_addr(struct intel_ntb_dev *ndev,
196196
*db_size = ndev->reg->db_size;
197197
dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size);
198198
}
199-
200-
return 0;
201199
}
202200

203201
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)
11111109
ndev->self_reg->db_mask);
11121110
}
11131111

1114-
int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
1115-
resource_size_t *db_size)
1112+
static int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
1113+
resource_size_t *db_size, u64 *db_data, int db_bit)
11161114
{
1115+
u64 db_bits;
11171116
struct intel_ntb_dev *ndev = ntb_ndev(ntb);
11181117

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,
11201127
ndev->peer_reg->db_bell);
1128+
1129+
if (db_data)
1130+
*db_data = db_bits;
1131+
1132+
1133+
return 0;
11211134
}
11221135

11231136
static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits)

drivers/ntb/hw/intel/ntb_hw_gen1.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ extern struct intel_b2b_addr xeon_b2b_dsd_addr;
147147
int ndev_init_isr(struct intel_ntb_dev *ndev, int msix_min, int msix_max,
148148
int msix_shift, int total_shift);
149149
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);
150153
u64 ndev_db_read(struct intel_ntb_dev *ndev, void __iomem *mmio);
151154
int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits,
152155
void __iomem *mmio);
@@ -166,8 +169,6 @@ int intel_ntb_db_vector_count(struct ntb_dev *ntb);
166169
u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector);
167170
int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits);
168171
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);
171172
int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb);
172173
int intel_ntb_spad_count(struct ntb_dev *ntb);
173174
u32 intel_ntb_spad_read(struct ntb_dev *ntb, int idx);

drivers/ntb/hw/intel/ntb_hw_gen3.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,37 @@ static int intel_ntb3_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
532532
return 0;
533533
}
534534

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+
535566
static int intel_ntb3_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
536567
{
537568
struct intel_ntb_dev *ndev = ntb_ndev(ntb);
@@ -584,7 +615,7 @@ const struct ntb_dev_ops intel_ntb3_ops = {
584615
.db_clear = intel_ntb3_db_clear,
585616
.db_set_mask = intel_ntb_db_set_mask,
586617
.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,
588619
.peer_db_set = intel_ntb3_peer_db_set,
589620
.spad_is_unsafe = intel_ntb_spad_is_unsafe,
590621
.spad_count = intel_ntb_spad_count,

drivers/ntb/hw/mscc/ntb_hw_switchtec.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,11 +710,16 @@ static u64 switchtec_ntb_db_read_mask(struct ntb_dev *ntb)
710710

711711
static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb,
712712
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)
714716
{
715717
struct switchtec_ntb *sndev = ntb_sndev(ntb);
716718
unsigned long offset;
717719

720+
if (unlikely(db_bit >= BITS_PER_LONG_LONG))
721+
return -EINVAL;
722+
718723
offset = (unsigned long)sndev->mmio_peer_dbmsg->odb -
719724
(unsigned long)sndev->stdev->mmio;
720725

@@ -724,6 +729,8 @@ static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb,
724729
*db_addr = pci_resource_start(ntb->pdev, 0) + offset;
725730
if (db_size)
726731
*db_size = sizeof(u32);
732+
if (db_data)
733+
*db_data = BIT_ULL(db_bit) << sndev->db_peer_shift;
727734

728735
return 0;
729736
}

include/linux/ntb.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ struct ntb_dev_ops {
296296
int (*db_clear_mask)(struct ntb_dev *ntb, u64 db_bits);
297297

298298
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);
300301
u64 (*peer_db_read)(struct ntb_dev *ntb);
301302
int (*peer_db_set)(struct ntb_dev *ntb, u64 db_bits);
302303
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)
10781079
* @ntb: NTB device context.
10791080
* @db_addr: OUT - The address of the peer doorbell register.
10801081
* @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
10811084
*
10821085
* Return the address of the peer doorbell register. This may be used, for
10831086
* 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)
10911094
*/
10921095
static inline int ntb_peer_db_addr(struct ntb_dev *ntb,
10931096
phys_addr_t *db_addr,
1094-
resource_size_t *db_size)
1097+
resource_size_t *db_size,
1098+
u64 *db_data, int db_bit)
10951099
{
10961100
if (!ntb->ops->peer_db_addr)
10971101
return -EINVAL;
10981102

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);
11001104
}
11011105

11021106
/**

0 commit comments

Comments
 (0)