1 // SPDX-License-Identifier: GPL-2.0
3 * Host side endpoint driver to implement Non-Transparent Bridge functionality
5 * Copyright (C) 2020 Texas Instruments
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>
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
21 #define CMD_LINK_DOWN 6
23 #define NTB_EPF_ARGUMENT 0x4
24 #define MSIX_ENABLE BIT(16)
26 #define NTB_EPF_CMD_STATUS 0x8
27 #define COMMAND_STATUS_OK 1
28 #define COMMAND_STATUS_ERROR 2
30 #define NTB_EPF_LINK_STATUS 0x0A
31 #define LINK_STATUS_UP BIT(0)
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)
46 #define NTB_EPF_MIN_DB_COUNT 3
47 #define NTB_EPF_MAX_DB_COUNT 31
49 #define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */
63 /* Mutex to protect providing commands to NTB EPF */
64 struct mutex cmd_lock;
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;
71 unsigned int mw_count;
72 unsigned int spad_count;
73 unsigned int db_count;
75 void __iomem *ctrl_reg;
77 void __iomem *peer_spad_reg;
79 unsigned int self_spad;
80 unsigned int peer_spad;
86 #define ntb_ndev(__ntb) container_of(__ntb, struct ntb_epf_dev, ntb)
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;
99 static int ntb_epf_send_command(struct ntb_epf_dev *ndev, u32 command,
107 mutex_lock(&ndev->cmd_lock);
108 writel(argument, ndev->ctrl_reg + NTB_EPF_ARGUMENT);
109 writel(command, ndev->ctrl_reg + NTB_EPF_COMMAND);
111 timeout = ktime_add_ms(ktime_get(), NTB_EPF_COMMAND_TIMEOUT);
113 timedout = ktime_after(ktime_get(), timeout);
114 status = readw(ndev->ctrl_reg + NTB_EPF_CMD_STATUS);
116 if (status == COMMAND_STATUS_ERROR) {
121 if (status == COMMAND_STATUS_OK)
124 if (WARN_ON(timedout)) {
132 writew(0, ndev->ctrl_reg + NTB_EPF_CMD_STATUS);
133 mutex_unlock(&ndev->cmd_lock);
138 static int ntb_epf_mw_to_bar(struct ntb_epf_dev *ndev, int idx)
140 struct device *dev = ndev->dev;
142 if (idx < 0 || idx > ndev->mw_count) {
143 dev_err(dev, "Unsupported Memory Window index %d\n", idx);
150 static int ntb_epf_mw_count(struct ntb_dev *ntb, int pidx)
152 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
153 struct device *dev = ndev->dev;
155 if (pidx != NTB_DEF_PEER_IDX) {
156 dev_err(dev, "Unsupported Peer ID %d\n", pidx);
160 return ndev->mw_count;
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)
168 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
169 struct device *dev = ndev->dev;
172 if (pidx != NTB_DEF_PEER_IDX) {
173 dev_err(dev, "Unsupported Peer ID %d\n", pidx);
177 bar = ntb_epf_mw_to_bar(ndev, idx);
188 *size_max = pci_resource_len(ndev->ntb.pdev, bar);
193 static u64 ntb_epf_link_is_up(struct ntb_dev *ntb,
194 enum ntb_speed *speed,
195 enum ntb_width *width)
197 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
200 status = readw(ndev->ctrl_reg + NTB_EPF_LINK_STATUS);
202 return status & LINK_STATUS_UP;
205 static u32 ntb_epf_spad_read(struct ntb_dev *ntb, int idx)
207 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
208 struct device *dev = ndev->dev;
211 if (idx < 0 || idx >= ndev->spad_count) {
212 dev_err(dev, "READ: Invalid ScratchPad Index %d\n", idx);
216 offset = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
217 offset += (idx << 2);
219 return readl(ndev->ctrl_reg + offset);
222 static int ntb_epf_spad_write(struct ntb_dev *ntb,
225 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
226 struct device *dev = ndev->dev;
229 if (idx < 0 || idx >= ndev->spad_count) {
230 dev_err(dev, "WRITE: Invalid ScratchPad Index %d\n", idx);
234 offset = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
235 offset += (idx << 2);
236 writel(val, ndev->ctrl_reg + offset);
241 static u32 ntb_epf_peer_spad_read(struct ntb_dev *ntb, int pidx, int idx)
243 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
244 struct device *dev = ndev->dev;
247 if (pidx != NTB_DEF_PEER_IDX) {
248 dev_err(dev, "Unsupported Peer ID %d\n", pidx);
252 if (idx < 0 || idx >= ndev->spad_count) {
253 dev_err(dev, "WRITE: Invalid Peer ScratchPad Index %d\n", idx);
258 return readl(ndev->peer_spad_reg + offset);
261 static int ntb_epf_peer_spad_write(struct ntb_dev *ntb, int pidx,
264 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
265 struct device *dev = ndev->dev;
268 if (pidx != NTB_DEF_PEER_IDX) {
269 dev_err(dev, "Unsupported Peer ID %d\n", pidx);
273 if (idx < 0 || idx >= ndev->spad_count) {
274 dev_err(dev, "WRITE: Invalid Peer ScratchPad Index %d\n", idx);
279 writel(val, ndev->peer_spad_reg + offset);
284 static int ntb_epf_link_enable(struct ntb_dev *ntb,
285 enum ntb_speed max_speed,
286 enum ntb_width max_width)
288 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
289 struct device *dev = ndev->dev;
292 ret = ntb_epf_send_command(ndev, CMD_LINK_UP, 0);
294 dev_err(dev, "Fail to enable link\n");
301 static int ntb_epf_link_disable(struct ntb_dev *ntb)
303 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
304 struct device *dev = ndev->dev;
307 ret = ntb_epf_send_command(ndev, CMD_LINK_DOWN, 0);
309 dev_err(dev, "Fail to disable link\n");
316 static irqreturn_t ntb_epf_vec_isr(int irq, void *dev)
318 struct ntb_epf_dev *ndev = dev;
321 irq_no = irq - pci_irq_vector(ndev->ntb.pdev, 0);
322 ndev->db_val = irq_no + 1;
325 ntb_link_event(&ndev->ntb);
327 ntb_db_event(&ndev->ntb, irq_no);
332 static int ntb_epf_init_isr(struct ntb_epf_dev *ndev, int msi_min, int msi_max)
334 struct pci_dev *pdev = ndev->ntb.pdev;
335 struct device *dev = ndev->dev;
336 u32 argument = MSIX_ENABLE;
341 irq = pci_alloc_irq_vectors(pdev, msi_min, msi_max, PCI_IRQ_MSIX);
343 dev_dbg(dev, "Failed to get MSIX interrupts\n");
344 irq = pci_alloc_irq_vectors(pdev, msi_min, msi_max,
347 dev_err(dev, "Failed to get MSI interrupts\n");
350 argument &= ~MSIX_ENABLE;
353 for (i = 0; i < irq; i++) {
354 ret = request_irq(pci_irq_vector(pdev, i), ntb_epf_vec_isr,
357 dev_err(dev, "Failed to request irq\n");
358 goto err_request_irq;
362 ndev->db_count = irq - 1;
364 ret = ntb_epf_send_command(ndev, CMD_CONFIGURE_DOORBELL,
367 dev_err(dev, "Failed to configure doorbell\n");
368 goto err_configure_db;
374 for (i = 0; i < ndev->db_count + 1; i++)
375 free_irq(pci_irq_vector(pdev, i), ndev);
378 pci_free_irq_vectors(pdev);
383 static int ntb_epf_peer_mw_count(struct ntb_dev *ntb)
385 return ntb_ndev(ntb)->mw_count;
388 static int ntb_epf_spad_count(struct ntb_dev *ntb)
390 return ntb_ndev(ntb)->spad_count;
393 static u64 ntb_epf_db_valid_mask(struct ntb_dev *ntb)
395 return ntb_ndev(ntb)->db_valid_mask;
398 static int ntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
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)
406 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
407 struct device *dev = ndev->dev;
408 resource_size_t mw_size;
411 if (pidx != NTB_DEF_PEER_IDX) {
412 dev_err(dev, "Unsupported Peer ID %d\n", pidx);
416 bar = idx + ndev->mw_bar;
418 mw_size = pci_resource_len(ntb->pdev, bar);
420 if (size > mw_size) {
421 dev_err(dev, "Size:%pa is greater than the MW size %pa\n",
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);
435 static int ntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx)
437 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
438 struct device *dev = ndev->dev;
441 ntb_epf_send_command(ndev, CMD_TEARDOWN_MW, idx);
443 dev_err(dev, "Failed to teardown memory window\n");
448 static int ntb_epf_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
449 phys_addr_t *base, resource_size_t *size)
451 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
456 offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET);
458 bar = idx + ndev->mw_bar;
461 *base = pci_resource_start(ndev->ntb.pdev, bar) + offset;
464 *size = pci_resource_len(ndev->ntb.pdev, bar) - offset;
469 static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
471 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
472 u32 interrupt_num = ffs(db_bits) + 1;
473 struct device *dev = ndev->dev;
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);
484 db_entry_size = readl(ndev->ctrl_reg + NTB_EPF_DB_ENTRY_SIZE);
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) +
494 static u64 ntb_epf_db_read(struct ntb_dev *ntb)
496 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
501 static int ntb_epf_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
506 static int ntb_epf_db_clear(struct ntb_dev *ntb, u64 db_bits)
508 struct ntb_epf_dev *ndev = ntb_ndev(ntb);
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,
538 static inline void ntb_epf_init_struct(struct ntb_epf_dev *ndev,
539 struct pci_dev *pdev)
541 ndev->ntb.pdev = pdev;
542 ndev->ntb.topo = NTB_TOPO_NONE;
543 ndev->ntb.ops = &ntb_epf_ops;
546 static int ntb_epf_init_dev(struct ntb_epf_dev *ndev)
548 struct device *dev = ndev->dev;
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);
555 dev_err(dev, "Failed to init ISR\n");
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);
566 static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
567 struct pci_dev *pdev)
569 struct device *dev = ndev->dev;
570 size_t spad_sz, spad_off;
573 pci_set_drvdata(pdev, ndev);
575 ret = pci_enable_device(pdev);
577 dev_err(dev, "Cannot enable PCI device\n");
581 ret = pci_request_regions(pdev, "ntb");
583 dev_err(dev, "Cannot obtain PCI resources\n");
584 goto err_pci_regions;
587 pci_set_master(pdev);
589 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
591 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
593 dev_err(dev, "Cannot set DMA mask\n");
596 dev_warn(&pdev->dev, "Cannot DMA highmem\n");
599 ndev->ctrl_reg = pci_iomap(pdev, ndev->ctrl_reg_bar, 0);
600 if (!ndev->ctrl_reg) {
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) {
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;
617 ndev->db_reg = pci_iomap(pdev, ndev->db_reg_bar, 0);
626 pci_clear_master(pdev);
629 pci_disable_device(pdev);
632 pci_set_drvdata(pdev, NULL);
637 static void ntb_epf_deinit_pci(struct ntb_epf_dev *ndev)
639 struct pci_dev *pdev = ndev->ntb.pdev;
641 pci_iounmap(pdev, ndev->ctrl_reg);
642 pci_iounmap(pdev, ndev->peer_spad_reg);
643 pci_iounmap(pdev, ndev->db_reg);
645 pci_clear_master(pdev);
646 pci_release_regions(pdev);
647 pci_disable_device(pdev);
648 pci_set_drvdata(pdev, NULL);
651 static void ntb_epf_cleanup_isr(struct ntb_epf_dev *ndev)
653 struct pci_dev *pdev = ndev->ntb.pdev;
656 ntb_epf_send_command(ndev, CMD_TEARDOWN_DOORBELL, ndev->db_count + 1);
658 for (i = 0; i < ndev->db_count + 1; i++)
659 free_irq(pci_irq_vector(pdev, i), ndev);
660 pci_free_irq_vectors(pdev);
663 static int ntb_epf_pci_probe(struct pci_dev *pdev,
664 const struct pci_device_id *id)
666 enum pci_barno peer_spad_reg_bar = BAR_1;
667 enum pci_barno ctrl_reg_bar = BAR_0;
668 enum pci_barno db_reg_bar = BAR_2;
669 enum pci_barno mw_bar = BAR_2;
670 struct device *dev = &pdev->dev;
671 struct ntb_epf_data *data;
672 struct ntb_epf_dev *ndev;
675 if (pci_is_bridge(pdev))
678 ndev = devm_kzalloc(dev, sizeof(*ndev), GFP_KERNEL);
682 data = (struct ntb_epf_data *)id->driver_data;
684 peer_spad_reg_bar = data->peer_spad_reg_bar;
685 ctrl_reg_bar = data->ctrl_reg_bar;
686 db_reg_bar = data->db_reg_bar;
687 mw_bar = data->mw_bar;
690 ndev->peer_spad_reg_bar = peer_spad_reg_bar;
691 ndev->ctrl_reg_bar = ctrl_reg_bar;
692 ndev->db_reg_bar = db_reg_bar;
693 ndev->mw_bar = mw_bar;
696 ntb_epf_init_struct(ndev, pdev);
697 mutex_init(&ndev->cmd_lock);
699 ret = ntb_epf_init_pci(ndev, pdev);
701 dev_err(dev, "Failed to init PCI\n");
705 ret = ntb_epf_init_dev(ndev);
707 dev_err(dev, "Failed to init device\n");
711 ret = ntb_register_device(&ndev->ntb);
713 dev_err(dev, "Failed to register NTB device\n");
714 goto err_register_dev;
720 ntb_epf_cleanup_isr(ndev);
723 ntb_epf_deinit_pci(ndev);
728 static void ntb_epf_pci_remove(struct pci_dev *pdev)
730 struct ntb_epf_dev *ndev = pci_get_drvdata(pdev);
732 ntb_unregister_device(&ndev->ntb);
733 ntb_epf_cleanup_isr(ndev);
734 ntb_epf_deinit_pci(ndev);
737 static const struct ntb_epf_data j721e_data = {
738 .ctrl_reg_bar = BAR_0,
739 .peer_spad_reg_bar = BAR_1,
744 static const struct ntb_epf_data mx8_data = {
745 .ctrl_reg_bar = BAR_0,
746 .peer_spad_reg_bar = BAR_0,
751 static const struct pci_device_id ntb_epf_pci_tbl[] = {
753 PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
754 .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
755 .driver_data = (kernel_ulong_t)&j721e_data,
758 PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809),
759 .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
760 .driver_data = (kernel_ulong_t)&mx8_data,
765 static struct pci_driver ntb_epf_pci_driver = {
766 .name = KBUILD_MODNAME,
767 .id_table = ntb_epf_pci_tbl,
768 .probe = ntb_epf_pci_probe,
769 .remove = ntb_epf_pci_remove,
771 module_pci_driver(ntb_epf_pci_driver);
773 MODULE_DESCRIPTION("PCI ENDPOINT NTB HOST DRIVER");
775 MODULE_LICENSE("GPL v2");