xref: /linux/drivers/ntb/hw/epf/ntb_hw_epf.c (revision 0e2b2a76278153d1ac312b0691cb65dabb9aef3e)
1 // SPDX-License-Identifier: GPL-2.0
2 /**
3  * Host side endpoint driver to implement Non-Transparent Bridge functionality
4  *
5  * Copyright (C) 2020 Texas Instruments
6  * Author: Kishon Vijay Abraham I <kishon@ti.com>
7  */
8 
9 #include <linux/delay.h>
10 #include <linux/module.h>
11 #include <linux/pci.h>
12 #include <linux/slab.h>
13 #include <linux/ntb.h>
14 
15 #define NTB_EPF_COMMAND		0x0
16 #define CMD_CONFIGURE_DOORBELL	1
17 #define CMD_TEARDOWN_DOORBELL	2
18 #define CMD_CONFIGURE_MW	3
19 #define CMD_TEARDOWN_MW		4
20 #define CMD_LINK_UP		5
21 #define CMD_LINK_DOWN		6
22 
23 #define NTB_EPF_ARGUMENT	0x4
24 #define MSIX_ENABLE		BIT(16)
25 
26 #define NTB_EPF_CMD_STATUS	0x8
27 #define COMMAND_STATUS_OK	1
28 #define COMMAND_STATUS_ERROR	2
29 
30 #define NTB_EPF_LINK_STATUS	0x0A
31 #define LINK_STATUS_UP		BIT(0)
32 
33 #define NTB_EPF_TOPOLOGY	0x0C
34 #define NTB_EPF_LOWER_ADDR	0x10
35 #define NTB_EPF_UPPER_ADDR	0x14
36 #define NTB_EPF_LOWER_SIZE	0x18
37 #define NTB_EPF_UPPER_SIZE	0x1C
38 #define NTB_EPF_MW_COUNT	0x20
39 #define NTB_EPF_MW1_OFFSET	0x24
40 #define NTB_EPF_SPAD_OFFSET	0x28
41 #define NTB_EPF_SPAD_COUNT	0x2C
42 #define NTB_EPF_DB_ENTRY_SIZE	0x30
43 #define NTB_EPF_DB_DATA(n)	(0x34 + (n) * 4)
44 #define NTB_EPF_DB_OFFSET(n)	(0xB4 + (n) * 4)
45 
46 #define NTB_EPF_MIN_DB_COUNT	3
47 #define NTB_EPF_MAX_DB_COUNT	31
48 
49 #define NTB_EPF_COMMAND_TIMEOUT	1000 /* 1 Sec */
50 
51 enum pci_barno {
52 	BAR_0,
53 	BAR_1,
54 	BAR_2,
55 	BAR_3,
56 	BAR_4,
57 	BAR_5,
58 };
59 
60 struct ntb_epf_dev {
61 	struct ntb_dev ntb;
62 	struct device *dev;
63 	/* Mutex to protect providing commands to NTB EPF */
64 	struct mutex cmd_lock;
65 
66 	enum pci_barno ctrl_reg_bar;
67 	enum pci_barno peer_spad_reg_bar;
68 	enum pci_barno db_reg_bar;
69 	enum pci_barno mw_bar;
70 
71 	unsigned int mw_count;
72 	unsigned int spad_count;
73 	unsigned int db_count;
74 
75 	void __iomem *ctrl_reg;
76 	void __iomem *db_reg;
77 	void __iomem *peer_spad_reg;
78 
79 	unsigned int self_spad;
80 	unsigned int peer_spad;
81 
82 	int db_val;
83 	u64 db_valid_mask;
84 };
85 
86 #define ntb_ndev(__ntb) container_of(__ntb, struct ntb_epf_dev, ntb)
87 
88 struct ntb_epf_data {
89 	/* BAR that contains both control region and self spad region */
90 	enum pci_barno ctrl_reg_bar;
91 	/* BAR that contains peer spad region */
92 	enum pci_barno peer_spad_reg_bar;
93 	/* BAR that contains Doorbell region and Memory window '1' */
94 	enum pci_barno db_reg_bar;
95 	/* BAR that contains memory windows*/
96 	enum pci_barno mw_bar;
97 };
98 
99 static int ntb_epf_send_command(struct ntb_epf_dev *ndev, u32 command,
100 				u32 argument)
101 {
102 	ktime_t timeout;
103 	bool timedout;
104 	int ret = 0;
105 	u32 status;
106 
107 	mutex_lock(&ndev->cmd_lock);
108 	writel(argument, ndev->ctrl_reg + NTB_EPF_ARGUMENT);
109 	writel(command, ndev->ctrl_reg + NTB_EPF_COMMAND);
110 
111 	timeout = ktime_add_ms(ktime_get(), NTB_EPF_COMMAND_TIMEOUT);
112 	while (1) {
113 		timedout = ktime_after(ktime_get(), timeout);
114 		status = readw(ndev->ctrl_reg + NTB_EPF_CMD_STATUS);
115 
116 		if (status == COMMAND_STATUS_ERROR) {
117 			ret = -EINVAL;
118 			break;
119 		}
120 
121 		if (status == COMMAND_STATUS_OK)
122 			break;
123 
124 		if (WARN_ON(timedout)) {
125 			ret = -ETIMEDOUT;
126 			break;
127 		}
128 
129 		usleep_range(5, 10);
130 	}
131 
132 	writew(0, ndev->ctrl_reg + NTB_EPF_CMD_STATUS);
133 	mutex_unlock(&ndev->cmd_lock);
134 
135 	return ret;
136 }
137 
138 static int ntb_epf_mw_to_bar(struct ntb_epf_dev *ndev, int idx)
139 {
140 	struct device *dev = ndev->dev;
141 
142 	if (idx < 0 || idx > ndev->mw_count) {
143 		dev_err(dev, "Unsupported Memory Window index %d\n", idx);
144 		return -EINVAL;
145 	}
146 
147 	return idx + 2;
148 }
149 
150 static int ntb_epf_mw_count(struct ntb_dev *ntb, int pidx)
151 {
152 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
153 	struct device *dev = ndev->dev;
154 
155 	if (pidx != NTB_DEF_PEER_IDX) {
156 		dev_err(dev, "Unsupported Peer ID %d\n", pidx);
157 		return -EINVAL;
158 	}
159 
160 	return ndev->mw_count;
161 }
162 
163 static int ntb_epf_mw_get_align(struct ntb_dev *ntb, int pidx, int idx,
164 				resource_size_t *addr_align,
165 				resource_size_t *size_align,
166 				resource_size_t *size_max)
167 {
168 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
169 	struct device *dev = ndev->dev;
170 	int bar;
171 
172 	if (pidx != NTB_DEF_PEER_IDX) {
173 		dev_err(dev, "Unsupported Peer ID %d\n", pidx);
174 		return -EINVAL;
175 	}
176 
177 	bar = ntb_epf_mw_to_bar(ndev, idx);
178 	if (bar < 0)
179 		return bar;
180 
181 	if (addr_align)
182 		*addr_align = SZ_4K;
183 
184 	if (size_align)
185 		*size_align = 1;
186 
187 	if (size_max)
188 		*size_max = pci_resource_len(ndev->ntb.pdev, bar);
189 
190 	return 0;
191 }
192 
193 static u64 ntb_epf_link_is_up(struct ntb_dev *ntb,
194 			      enum ntb_speed *speed,
195 			      enum ntb_width *width)
196 {
197 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
198 	u32 status;
199 
200 	status = readw(ndev->ctrl_reg + NTB_EPF_LINK_STATUS);
201 
202 	return status & LINK_STATUS_UP;
203 }
204 
205 static u32 ntb_epf_spad_read(struct ntb_dev *ntb, int idx)
206 {
207 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
208 	struct device *dev = ndev->dev;
209 	u32 offset;
210 
211 	if (idx < 0 || idx >= ndev->spad_count) {
212 		dev_err(dev, "READ: Invalid ScratchPad Index %d\n", idx);
213 		return 0;
214 	}
215 
216 	offset = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
217 	offset += (idx << 2);
218 
219 	return readl(ndev->ctrl_reg + offset);
220 }
221 
222 static int ntb_epf_spad_write(struct ntb_dev *ntb,
223 			      int idx, u32 val)
224 {
225 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
226 	struct device *dev = ndev->dev;
227 	u32 offset;
228 
229 	if (idx < 0 || idx >= ndev->spad_count) {
230 		dev_err(dev, "WRITE: Invalid ScratchPad Index %d\n", idx);
231 		return -EINVAL;
232 	}
233 
234 	offset = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
235 	offset += (idx << 2);
236 	writel(val, ndev->ctrl_reg + offset);
237 
238 	return 0;
239 }
240 
241 static u32 ntb_epf_peer_spad_read(struct ntb_dev *ntb, int pidx, int idx)
242 {
243 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
244 	struct device *dev = ndev->dev;
245 	u32 offset;
246 
247 	if (pidx != NTB_DEF_PEER_IDX) {
248 		dev_err(dev, "Unsupported Peer ID %d\n", pidx);
249 		return -EINVAL;
250 	}
251 
252 	if (idx < 0 || idx >= ndev->spad_count) {
253 		dev_err(dev, "WRITE: Invalid Peer ScratchPad Index %d\n", idx);
254 		return -EINVAL;
255 	}
256 
257 	offset = (idx << 2);
258 	return readl(ndev->peer_spad_reg + offset);
259 }
260 
261 static int ntb_epf_peer_spad_write(struct ntb_dev *ntb, int pidx,
262 				   int idx, u32 val)
263 {
264 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
265 	struct device *dev = ndev->dev;
266 	u32 offset;
267 
268 	if (pidx != NTB_DEF_PEER_IDX) {
269 		dev_err(dev, "Unsupported Peer ID %d\n", pidx);
270 		return -EINVAL;
271 	}
272 
273 	if (idx < 0 || idx >= ndev->spad_count) {
274 		dev_err(dev, "WRITE: Invalid Peer ScratchPad Index %d\n", idx);
275 		return -EINVAL;
276 	}
277 
278 	offset = (idx << 2);
279 	writel(val, ndev->peer_spad_reg + offset);
280 
281 	return 0;
282 }
283 
284 static int ntb_epf_link_enable(struct ntb_dev *ntb,
285 			       enum ntb_speed max_speed,
286 			       enum ntb_width max_width)
287 {
288 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
289 	struct device *dev = ndev->dev;
290 	int ret;
291 
292 	ret = ntb_epf_send_command(ndev, CMD_LINK_UP, 0);
293 	if (ret) {
294 		dev_err(dev, "Fail to enable link\n");
295 		return ret;
296 	}
297 
298 	return 0;
299 }
300 
301 static int ntb_epf_link_disable(struct ntb_dev *ntb)
302 {
303 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
304 	struct device *dev = ndev->dev;
305 	int ret;
306 
307 	ret = ntb_epf_send_command(ndev, CMD_LINK_DOWN, 0);
308 	if (ret) {
309 		dev_err(dev, "Fail to disable link\n");
310 		return ret;
311 	}
312 
313 	return 0;
314 }
315 
316 static irqreturn_t ntb_epf_vec_isr(int irq, void *dev)
317 {
318 	struct ntb_epf_dev *ndev = dev;
319 	int irq_no;
320 
321 	irq_no = irq - pci_irq_vector(ndev->ntb.pdev, 0);
322 	ndev->db_val = irq_no + 1;
323 
324 	if (irq_no == 0)
325 		ntb_link_event(&ndev->ntb);
326 	else
327 		ntb_db_event(&ndev->ntb, irq_no);
328 
329 	return IRQ_HANDLED;
330 }
331 
332 static int ntb_epf_init_isr(struct ntb_epf_dev *ndev, int msi_min, int msi_max)
333 {
334 	struct pci_dev *pdev = ndev->ntb.pdev;
335 	struct device *dev = ndev->dev;
336 	u32 argument = MSIX_ENABLE;
337 	int irq;
338 	int ret;
339 	int i;
340 
341 	irq = pci_alloc_irq_vectors(pdev, msi_min, msi_max, PCI_IRQ_MSIX);
342 	if (irq < 0) {
343 		dev_dbg(dev, "Failed to get MSIX interrupts\n");
344 		irq = pci_alloc_irq_vectors(pdev, msi_min, msi_max,
345 					    PCI_IRQ_MSI);
346 		if (irq < 0) {
347 			dev_err(dev, "Failed to get MSI interrupts\n");
348 			return irq;
349 		}
350 		argument &= ~MSIX_ENABLE;
351 	}
352 
353 	for (i = 0; i < irq; i++) {
354 		ret = request_irq(pci_irq_vector(pdev, i), ntb_epf_vec_isr,
355 				  0, "ntb_epf", ndev);
356 		if (ret) {
357 			dev_err(dev, "Failed to request irq\n");
358 			goto err_request_irq;
359 		}
360 	}
361 
362 	ndev->db_count = irq - 1;
363 
364 	ret = ntb_epf_send_command(ndev, CMD_CONFIGURE_DOORBELL,
365 				   argument | irq);
366 	if (ret) {
367 		dev_err(dev, "Failed to configure doorbell\n");
368 		goto err_configure_db;
369 	}
370 
371 	return 0;
372 
373 err_configure_db:
374 	for (i = 0; i < ndev->db_count + 1; i++)
375 		free_irq(pci_irq_vector(pdev, i), ndev);
376 
377 err_request_irq:
378 	pci_free_irq_vectors(pdev);
379 
380 	return ret;
381 }
382 
383 static int ntb_epf_peer_mw_count(struct ntb_dev *ntb)
384 {
385 	return ntb_ndev(ntb)->mw_count;
386 }
387 
388 static int ntb_epf_spad_count(struct ntb_dev *ntb)
389 {
390 	return ntb_ndev(ntb)->spad_count;
391 }
392 
393 static u64 ntb_epf_db_valid_mask(struct ntb_dev *ntb)
394 {
395 	return ntb_ndev(ntb)->db_valid_mask;
396 }
397 
398 static int ntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
399 {
400 	return 0;
401 }
402 
403 static int ntb_epf_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
404 				dma_addr_t addr, resource_size_t size)
405 {
406 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
407 	struct device *dev = ndev->dev;
408 	resource_size_t mw_size;
409 	int bar;
410 
411 	if (pidx != NTB_DEF_PEER_IDX) {
412 		dev_err(dev, "Unsupported Peer ID %d\n", pidx);
413 		return -EINVAL;
414 	}
415 
416 	bar = idx + ndev->mw_bar;
417 
418 	mw_size = pci_resource_len(ntb->pdev, bar);
419 
420 	if (size > mw_size) {
421 		dev_err(dev, "Size:%pa is greater than the MW size %pa\n",
422 			&size, &mw_size);
423 		return -EINVAL;
424 	}
425 
426 	writel(lower_32_bits(addr), ndev->ctrl_reg + NTB_EPF_LOWER_ADDR);
427 	writel(upper_32_bits(addr), ndev->ctrl_reg + NTB_EPF_UPPER_ADDR);
428 	writel(lower_32_bits(size), ndev->ctrl_reg + NTB_EPF_LOWER_SIZE);
429 	writel(upper_32_bits(size), ndev->ctrl_reg + NTB_EPF_UPPER_SIZE);
430 	ntb_epf_send_command(ndev, CMD_CONFIGURE_MW, idx);
431 
432 	return 0;
433 }
434 
435 static int ntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx)
436 {
437 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
438 	struct device *dev = ndev->dev;
439 	int ret = 0;
440 
441 	ntb_epf_send_command(ndev, CMD_TEARDOWN_MW, idx);
442 	if (ret)
443 		dev_err(dev, "Failed to teardown memory window\n");
444 
445 	return ret;
446 }
447 
448 static int ntb_epf_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
449 				    phys_addr_t *base, resource_size_t *size)
450 {
451 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
452 	u32 offset = 0;
453 	int bar;
454 
455 	if (idx == 0)
456 		offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET);
457 
458 	bar = idx + ndev->mw_bar;
459 
460 	if (base)
461 		*base = pci_resource_start(ndev->ntb.pdev, bar) + offset;
462 
463 	if (size)
464 		*size = pci_resource_len(ndev->ntb.pdev, bar) - offset;
465 
466 	return 0;
467 }
468 
469 static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
470 {
471 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
472 	u32 interrupt_num = ffs(db_bits) + 1;
473 	struct device *dev = ndev->dev;
474 	u32 db_entry_size;
475 	u32 db_offset;
476 	u32 db_data;
477 
478 	if (interrupt_num > ndev->db_count) {
479 		dev_err(dev, "DB interrupt %d greater than Max Supported %d\n",
480 			interrupt_num, ndev->db_count);
481 		return -EINVAL;
482 	}
483 
484 	db_entry_size = readl(ndev->ctrl_reg + NTB_EPF_DB_ENTRY_SIZE);
485 
486 	db_data = readl(ndev->ctrl_reg + NTB_EPF_DB_DATA(interrupt_num));
487 	db_offset = readl(ndev->ctrl_reg + NTB_EPF_DB_OFFSET(interrupt_num));
488 	writel(db_data, ndev->db_reg + (db_entry_size * interrupt_num) +
489 	       db_offset);
490 
491 	return 0;
492 }
493 
494 static u64 ntb_epf_db_read(struct ntb_dev *ntb)
495 {
496 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
497 
498 	return ndev->db_val;
499 }
500 
501 static int ntb_epf_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
502 {
503 	return 0;
504 }
505 
506 static int ntb_epf_db_clear(struct ntb_dev *ntb, u64 db_bits)
507 {
508 	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
509 
510 	ndev->db_val = 0;
511 
512 	return 0;
513 }
514 
515 static const struct ntb_dev_ops ntb_epf_ops = {
516 	.mw_count		= ntb_epf_mw_count,
517 	.spad_count		= ntb_epf_spad_count,
518 	.peer_mw_count		= ntb_epf_peer_mw_count,
519 	.db_valid_mask		= ntb_epf_db_valid_mask,
520 	.db_set_mask		= ntb_epf_db_set_mask,
521 	.mw_set_trans		= ntb_epf_mw_set_trans,
522 	.mw_clear_trans		= ntb_epf_mw_clear_trans,
523 	.peer_mw_get_addr	= ntb_epf_peer_mw_get_addr,
524 	.link_enable		= ntb_epf_link_enable,
525 	.spad_read		= ntb_epf_spad_read,
526 	.spad_write		= ntb_epf_spad_write,
527 	.peer_spad_read		= ntb_epf_peer_spad_read,
528 	.peer_spad_write	= ntb_epf_peer_spad_write,
529 	.peer_db_set		= ntb_epf_peer_db_set,
530 	.db_read		= ntb_epf_db_read,
531 	.mw_get_align		= ntb_epf_mw_get_align,
532 	.link_is_up		= ntb_epf_link_is_up,
533 	.db_clear_mask		= ntb_epf_db_clear_mask,
534 	.db_clear		= ntb_epf_db_clear,
535 	.link_disable		= ntb_epf_link_disable,
536 };
537 
538 static inline void ntb_epf_init_struct(struct ntb_epf_dev *ndev,
539 				       struct pci_dev *pdev)
540 {
541 	ndev->ntb.pdev = pdev;
542 	ndev->ntb.topo = NTB_TOPO_NONE;
543 	ndev->ntb.ops = &ntb_epf_ops;
544 }
545 
546 static int ntb_epf_init_dev(struct ntb_epf_dev *ndev)
547 {
548 	struct device *dev = ndev->dev;
549 	int ret;
550 
551 	/* One Link interrupt and rest doorbell interrupt */
552 	ret = ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + 1,
553 			       NTB_EPF_MAX_DB_COUNT + 1);
554 	if (ret) {
555 		dev_err(dev, "Failed to init ISR\n");
556 		return ret;
557 	}
558 
559 	ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
560 	ndev->mw_count = readl(ndev->ctrl_reg + NTB_EPF_MW_COUNT);
561 	ndev->spad_count = readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
562 
563 	return 0;
564 }
565 
566 static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
567 			    struct pci_dev *pdev)
568 {
569 	struct device *dev = ndev->dev;
570 	size_t spad_sz, spad_off;
571 	int ret;
572 
573 	pci_set_drvdata(pdev, ndev);
574 
575 	ret = pci_enable_device(pdev);
576 	if (ret) {
577 		dev_err(dev, "Cannot enable PCI device\n");
578 		goto err_pci_enable;
579 	}
580 
581 	ret = pci_request_regions(pdev, "ntb");
582 	if (ret) {
583 		dev_err(dev, "Cannot obtain PCI resources\n");
584 		goto err_pci_regions;
585 	}
586 
587 	pci_set_master(pdev);
588 
589 	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
590 	if (ret) {
591 		ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
592 		if (ret) {
593 			dev_err(dev, "Cannot set DMA mask\n");
594 			goto err_pci_regions;
595 		}
596 		dev_warn(&pdev->dev, "Cannot DMA highmem\n");
597 	}
598 
599 	ndev->ctrl_reg = pci_iomap(pdev, ndev->ctrl_reg_bar, 0);
600 	if (!ndev->ctrl_reg) {
601 		ret = -EIO;
602 		goto err_pci_regions;
603 	}
604 
605 	if (ndev->peer_spad_reg_bar) {
606 		ndev->peer_spad_reg = pci_iomap(pdev, ndev->peer_spad_reg_bar, 0);
607 		if (!ndev->peer_spad_reg) {
608 			ret = -EIO;
609 			goto err_pci_regions;
610 		}
611 	} else {
612 		spad_sz = 4 * readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
613 		spad_off = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
614 		ndev->peer_spad_reg = ndev->ctrl_reg + spad_off  + spad_sz;
615 	}
616 
617 	ndev->db_reg = pci_iomap(pdev, ndev->db_reg_bar, 0);
618 	if (!ndev->db_reg) {
619 		ret = -EIO;
620 		goto err_pci_regions;
621 	}
622 
623 	return 0;
624 
625 err_pci_regions:
626 	pci_disable_device(pdev);
627 
628 err_pci_enable:
629 	pci_set_drvdata(pdev, NULL);
630 
631 	return ret;
632 }
633 
634 static void ntb_epf_deinit_pci(struct ntb_epf_dev *ndev)
635 {
636 	struct pci_dev *pdev = ndev->ntb.pdev;
637 
638 	pci_iounmap(pdev, ndev->ctrl_reg);
639 	pci_iounmap(pdev, ndev->peer_spad_reg);
640 	pci_iounmap(pdev, ndev->db_reg);
641 
642 	pci_release_regions(pdev);
643 	pci_disable_device(pdev);
644 	pci_set_drvdata(pdev, NULL);
645 }
646 
647 static void ntb_epf_cleanup_isr(struct ntb_epf_dev *ndev)
648 {
649 	struct pci_dev *pdev = ndev->ntb.pdev;
650 	int i;
651 
652 	ntb_epf_send_command(ndev, CMD_TEARDOWN_DOORBELL, ndev->db_count + 1);
653 
654 	for (i = 0; i < ndev->db_count + 1; i++)
655 		free_irq(pci_irq_vector(pdev, i), ndev);
656 	pci_free_irq_vectors(pdev);
657 }
658 
659 static int ntb_epf_pci_probe(struct pci_dev *pdev,
660 			     const struct pci_device_id *id)
661 {
662 	enum pci_barno peer_spad_reg_bar = BAR_1;
663 	enum pci_barno ctrl_reg_bar = BAR_0;
664 	enum pci_barno db_reg_bar = BAR_2;
665 	enum pci_barno mw_bar = BAR_2;
666 	struct device *dev = &pdev->dev;
667 	struct ntb_epf_data *data;
668 	struct ntb_epf_dev *ndev;
669 	int ret;
670 
671 	if (pci_is_bridge(pdev))
672 		return -ENODEV;
673 
674 	ndev = devm_kzalloc(dev, sizeof(*ndev), GFP_KERNEL);
675 	if (!ndev)
676 		return -ENOMEM;
677 
678 	data = (struct ntb_epf_data *)id->driver_data;
679 	if (data) {
680 		peer_spad_reg_bar = data->peer_spad_reg_bar;
681 		ctrl_reg_bar = data->ctrl_reg_bar;
682 		db_reg_bar = data->db_reg_bar;
683 		mw_bar = data->mw_bar;
684 	}
685 
686 	ndev->peer_spad_reg_bar = peer_spad_reg_bar;
687 	ndev->ctrl_reg_bar = ctrl_reg_bar;
688 	ndev->db_reg_bar = db_reg_bar;
689 	ndev->mw_bar = mw_bar;
690 	ndev->dev = dev;
691 
692 	ntb_epf_init_struct(ndev, pdev);
693 	mutex_init(&ndev->cmd_lock);
694 
695 	ret = ntb_epf_init_pci(ndev, pdev);
696 	if (ret) {
697 		dev_err(dev, "Failed to init PCI\n");
698 		return ret;
699 	}
700 
701 	ret = ntb_epf_init_dev(ndev);
702 	if (ret) {
703 		dev_err(dev, "Failed to init device\n");
704 		goto err_init_dev;
705 	}
706 
707 	ret = ntb_register_device(&ndev->ntb);
708 	if (ret) {
709 		dev_err(dev, "Failed to register NTB device\n");
710 		goto err_register_dev;
711 	}
712 
713 	return 0;
714 
715 err_register_dev:
716 	ntb_epf_cleanup_isr(ndev);
717 
718 err_init_dev:
719 	ntb_epf_deinit_pci(ndev);
720 
721 	return ret;
722 }
723 
724 static void ntb_epf_pci_remove(struct pci_dev *pdev)
725 {
726 	struct ntb_epf_dev *ndev = pci_get_drvdata(pdev);
727 
728 	ntb_unregister_device(&ndev->ntb);
729 	ntb_epf_cleanup_isr(ndev);
730 	ntb_epf_deinit_pci(ndev);
731 }
732 
733 static const struct ntb_epf_data j721e_data = {
734 	.ctrl_reg_bar = BAR_0,
735 	.peer_spad_reg_bar = BAR_1,
736 	.db_reg_bar = BAR_2,
737 	.mw_bar = BAR_2,
738 };
739 
740 static const struct ntb_epf_data mx8_data = {
741 	.ctrl_reg_bar = BAR_0,
742 	.peer_spad_reg_bar = BAR_0,
743 	.db_reg_bar = BAR_2,
744 	.mw_bar = BAR_4,
745 };
746 
747 static const struct pci_device_id ntb_epf_pci_tbl[] = {
748 	{
749 		PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
750 		.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
751 		.driver_data = (kernel_ulong_t)&j721e_data,
752 	},
753 	{
754 		PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809),
755 		.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
756 		.driver_data = (kernel_ulong_t)&mx8_data,
757 	},
758 	{ },
759 };
760 
761 static struct pci_driver ntb_epf_pci_driver = {
762 	.name		= KBUILD_MODNAME,
763 	.id_table	= ntb_epf_pci_tbl,
764 	.probe		= ntb_epf_pci_probe,
765 	.remove		= ntb_epf_pci_remove,
766 };
767 module_pci_driver(ntb_epf_pci_driver);
768 
769 MODULE_DESCRIPTION("PCI ENDPOINT NTB HOST DRIVER");
770 MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
771 MODULE_LICENSE("GPL v2");
772