Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /**
0003  * Host side endpoint driver to implement Non-Transparent Bridge functionality
0004  *
0005  * Copyright (C) 2020 Texas Instruments
0006  * Author: Kishon Vijay Abraham I <kishon@ti.com>
0007  */
0008 
0009 #include <linux/delay.h>
0010 #include <linux/module.h>
0011 #include <linux/pci.h>
0012 #include <linux/slab.h>
0013 #include <linux/ntb.h>
0014 
0015 #define NTB_EPF_COMMAND     0x0
0016 #define CMD_CONFIGURE_DOORBELL  1
0017 #define CMD_TEARDOWN_DOORBELL   2
0018 #define CMD_CONFIGURE_MW    3
0019 #define CMD_TEARDOWN_MW     4
0020 #define CMD_LINK_UP     5
0021 #define CMD_LINK_DOWN       6
0022 
0023 #define NTB_EPF_ARGUMENT    0x4
0024 #define MSIX_ENABLE     BIT(16)
0025 
0026 #define NTB_EPF_CMD_STATUS  0x8
0027 #define COMMAND_STATUS_OK   1
0028 #define COMMAND_STATUS_ERROR    2
0029 
0030 #define NTB_EPF_LINK_STATUS 0x0A
0031 #define LINK_STATUS_UP      BIT(0)
0032 
0033 #define NTB_EPF_TOPOLOGY    0x0C
0034 #define NTB_EPF_LOWER_ADDR  0x10
0035 #define NTB_EPF_UPPER_ADDR  0x14
0036 #define NTB_EPF_LOWER_SIZE  0x18
0037 #define NTB_EPF_UPPER_SIZE  0x1C
0038 #define NTB_EPF_MW_COUNT    0x20
0039 #define NTB_EPF_MW1_OFFSET  0x24
0040 #define NTB_EPF_SPAD_OFFSET 0x28
0041 #define NTB_EPF_SPAD_COUNT  0x2C
0042 #define NTB_EPF_DB_ENTRY_SIZE   0x30
0043 #define NTB_EPF_DB_DATA(n)  (0x34 + (n) * 4)
0044 #define NTB_EPF_DB_OFFSET(n)    (0xB4 + (n) * 4)
0045 
0046 #define NTB_EPF_MIN_DB_COUNT    3
0047 #define NTB_EPF_MAX_DB_COUNT    31
0048 
0049 #define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */
0050 
0051 enum pci_barno {
0052     BAR_0,
0053     BAR_1,
0054     BAR_2,
0055     BAR_3,
0056     BAR_4,
0057     BAR_5,
0058 };
0059 
0060 struct ntb_epf_dev {
0061     struct ntb_dev ntb;
0062     struct device *dev;
0063     /* Mutex to protect providing commands to NTB EPF */
0064     struct mutex cmd_lock;
0065 
0066     enum pci_barno ctrl_reg_bar;
0067     enum pci_barno peer_spad_reg_bar;
0068     enum pci_barno db_reg_bar;
0069     enum pci_barno mw_bar;
0070 
0071     unsigned int mw_count;
0072     unsigned int spad_count;
0073     unsigned int db_count;
0074 
0075     void __iomem *ctrl_reg;
0076     void __iomem *db_reg;
0077     void __iomem *peer_spad_reg;
0078 
0079     unsigned int self_spad;
0080     unsigned int peer_spad;
0081 
0082     int db_val;
0083     u64 db_valid_mask;
0084 };
0085 
0086 #define ntb_ndev(__ntb) container_of(__ntb, struct ntb_epf_dev, ntb)
0087 
0088 struct ntb_epf_data {
0089     /* BAR that contains both control region and self spad region */
0090     enum pci_barno ctrl_reg_bar;
0091     /* BAR that contains peer spad region */
0092     enum pci_barno peer_spad_reg_bar;
0093     /* BAR that contains Doorbell region and Memory window '1' */
0094     enum pci_barno db_reg_bar;
0095     /* BAR that contains memory windows*/
0096     enum pci_barno mw_bar;
0097 };
0098 
0099 static int ntb_epf_send_command(struct ntb_epf_dev *ndev, u32 command,
0100                 u32 argument)
0101 {
0102     ktime_t timeout;
0103     bool timedout;
0104     int ret = 0;
0105     u32 status;
0106 
0107     mutex_lock(&ndev->cmd_lock);
0108     writel(argument, ndev->ctrl_reg + NTB_EPF_ARGUMENT);
0109     writel(command, ndev->ctrl_reg + NTB_EPF_COMMAND);
0110 
0111     timeout = ktime_add_ms(ktime_get(), NTB_EPF_COMMAND_TIMEOUT);
0112     while (1) {
0113         timedout = ktime_after(ktime_get(), timeout);
0114         status = readw(ndev->ctrl_reg + NTB_EPF_CMD_STATUS);
0115 
0116         if (status == COMMAND_STATUS_ERROR) {
0117             ret = -EINVAL;
0118             break;
0119         }
0120 
0121         if (status == COMMAND_STATUS_OK)
0122             break;
0123 
0124         if (WARN_ON(timedout)) {
0125             ret = -ETIMEDOUT;
0126             break;
0127         }
0128 
0129         usleep_range(5, 10);
0130     }
0131 
0132     writew(0, ndev->ctrl_reg + NTB_EPF_CMD_STATUS);
0133     mutex_unlock(&ndev->cmd_lock);
0134 
0135     return ret;
0136 }
0137 
0138 static int ntb_epf_mw_to_bar(struct ntb_epf_dev *ndev, int idx)
0139 {
0140     struct device *dev = ndev->dev;
0141 
0142     if (idx < 0 || idx > ndev->mw_count) {
0143         dev_err(dev, "Unsupported Memory Window index %d\n", idx);
0144         return -EINVAL;
0145     }
0146 
0147     return idx + 2;
0148 }
0149 
0150 static int ntb_epf_mw_count(struct ntb_dev *ntb, int pidx)
0151 {
0152     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0153     struct device *dev = ndev->dev;
0154 
0155     if (pidx != NTB_DEF_PEER_IDX) {
0156         dev_err(dev, "Unsupported Peer ID %d\n", pidx);
0157         return -EINVAL;
0158     }
0159 
0160     return ndev->mw_count;
0161 }
0162 
0163 static int ntb_epf_mw_get_align(struct ntb_dev *ntb, int pidx, int idx,
0164                 resource_size_t *addr_align,
0165                 resource_size_t *size_align,
0166                 resource_size_t *size_max)
0167 {
0168     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0169     struct device *dev = ndev->dev;
0170     int bar;
0171 
0172     if (pidx != NTB_DEF_PEER_IDX) {
0173         dev_err(dev, "Unsupported Peer ID %d\n", pidx);
0174         return -EINVAL;
0175     }
0176 
0177     bar = ntb_epf_mw_to_bar(ndev, idx);
0178     if (bar < 0)
0179         return bar;
0180 
0181     if (addr_align)
0182         *addr_align = SZ_4K;
0183 
0184     if (size_align)
0185         *size_align = 1;
0186 
0187     if (size_max)
0188         *size_max = pci_resource_len(ndev->ntb.pdev, bar);
0189 
0190     return 0;
0191 }
0192 
0193 static u64 ntb_epf_link_is_up(struct ntb_dev *ntb,
0194                   enum ntb_speed *speed,
0195                   enum ntb_width *width)
0196 {
0197     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0198     u32 status;
0199 
0200     status = readw(ndev->ctrl_reg + NTB_EPF_LINK_STATUS);
0201 
0202     return status & LINK_STATUS_UP;
0203 }
0204 
0205 static u32 ntb_epf_spad_read(struct ntb_dev *ntb, int idx)
0206 {
0207     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0208     struct device *dev = ndev->dev;
0209     u32 offset;
0210 
0211     if (idx < 0 || idx >= ndev->spad_count) {
0212         dev_err(dev, "READ: Invalid ScratchPad Index %d\n", idx);
0213         return 0;
0214     }
0215 
0216     offset = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
0217     offset += (idx << 2);
0218 
0219     return readl(ndev->ctrl_reg + offset);
0220 }
0221 
0222 static int ntb_epf_spad_write(struct ntb_dev *ntb,
0223                   int idx, u32 val)
0224 {
0225     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0226     struct device *dev = ndev->dev;
0227     u32 offset;
0228 
0229     if (idx < 0 || idx >= ndev->spad_count) {
0230         dev_err(dev, "WRITE: Invalid ScratchPad Index %d\n", idx);
0231         return -EINVAL;
0232     }
0233 
0234     offset = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
0235     offset += (idx << 2);
0236     writel(val, ndev->ctrl_reg + offset);
0237 
0238     return 0;
0239 }
0240 
0241 static u32 ntb_epf_peer_spad_read(struct ntb_dev *ntb, int pidx, int idx)
0242 {
0243     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0244     struct device *dev = ndev->dev;
0245     u32 offset;
0246 
0247     if (pidx != NTB_DEF_PEER_IDX) {
0248         dev_err(dev, "Unsupported Peer ID %d\n", pidx);
0249         return -EINVAL;
0250     }
0251 
0252     if (idx < 0 || idx >= ndev->spad_count) {
0253         dev_err(dev, "WRITE: Invalid Peer ScratchPad Index %d\n", idx);
0254         return -EINVAL;
0255     }
0256 
0257     offset = (idx << 2);
0258     return readl(ndev->peer_spad_reg + offset);
0259 }
0260 
0261 static int ntb_epf_peer_spad_write(struct ntb_dev *ntb, int pidx,
0262                    int idx, u32 val)
0263 {
0264     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0265     struct device *dev = ndev->dev;
0266     u32 offset;
0267 
0268     if (pidx != NTB_DEF_PEER_IDX) {
0269         dev_err(dev, "Unsupported Peer ID %d\n", pidx);
0270         return -EINVAL;
0271     }
0272 
0273     if (idx < 0 || idx >= ndev->spad_count) {
0274         dev_err(dev, "WRITE: Invalid Peer ScratchPad Index %d\n", idx);
0275         return -EINVAL;
0276     }
0277 
0278     offset = (idx << 2);
0279     writel(val, ndev->peer_spad_reg + offset);
0280 
0281     return 0;
0282 }
0283 
0284 static int ntb_epf_link_enable(struct ntb_dev *ntb,
0285                    enum ntb_speed max_speed,
0286                    enum ntb_width max_width)
0287 {
0288     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0289     struct device *dev = ndev->dev;
0290     int ret;
0291 
0292     ret = ntb_epf_send_command(ndev, CMD_LINK_UP, 0);
0293     if (ret) {
0294         dev_err(dev, "Fail to enable link\n");
0295         return ret;
0296     }
0297 
0298     return 0;
0299 }
0300 
0301 static int ntb_epf_link_disable(struct ntb_dev *ntb)
0302 {
0303     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0304     struct device *dev = ndev->dev;
0305     int ret;
0306 
0307     ret = ntb_epf_send_command(ndev, CMD_LINK_DOWN, 0);
0308     if (ret) {
0309         dev_err(dev, "Fail to disable link\n");
0310         return ret;
0311     }
0312 
0313     return 0;
0314 }
0315 
0316 static irqreturn_t ntb_epf_vec_isr(int irq, void *dev)
0317 {
0318     struct ntb_epf_dev *ndev = dev;
0319     int irq_no;
0320 
0321     irq_no = irq - pci_irq_vector(ndev->ntb.pdev, 0);
0322     ndev->db_val = irq_no + 1;
0323 
0324     if (irq_no == 0)
0325         ntb_link_event(&ndev->ntb);
0326     else
0327         ntb_db_event(&ndev->ntb, irq_no);
0328 
0329     return IRQ_HANDLED;
0330 }
0331 
0332 static int ntb_epf_init_isr(struct ntb_epf_dev *ndev, int msi_min, int msi_max)
0333 {
0334     struct pci_dev *pdev = ndev->ntb.pdev;
0335     struct device *dev = ndev->dev;
0336     u32 argument = MSIX_ENABLE;
0337     int irq;
0338     int ret;
0339     int i;
0340 
0341     irq = pci_alloc_irq_vectors(pdev, msi_min, msi_max, PCI_IRQ_MSIX);
0342     if (irq < 0) {
0343         dev_dbg(dev, "Failed to get MSIX interrupts\n");
0344         irq = pci_alloc_irq_vectors(pdev, msi_min, msi_max,
0345                         PCI_IRQ_MSI);
0346         if (irq < 0) {
0347             dev_err(dev, "Failed to get MSI interrupts\n");
0348             return irq;
0349         }
0350         argument &= ~MSIX_ENABLE;
0351     }
0352 
0353     for (i = 0; i < irq; i++) {
0354         ret = request_irq(pci_irq_vector(pdev, i), ntb_epf_vec_isr,
0355                   0, "ntb_epf", ndev);
0356         if (ret) {
0357             dev_err(dev, "Failed to request irq\n");
0358             goto err_request_irq;
0359         }
0360     }
0361 
0362     ndev->db_count = irq - 1;
0363 
0364     ret = ntb_epf_send_command(ndev, CMD_CONFIGURE_DOORBELL,
0365                    argument | irq);
0366     if (ret) {
0367         dev_err(dev, "Failed to configure doorbell\n");
0368         goto err_configure_db;
0369     }
0370 
0371     return 0;
0372 
0373 err_configure_db:
0374     for (i = 0; i < ndev->db_count + 1; i++)
0375         free_irq(pci_irq_vector(pdev, i), ndev);
0376 
0377 err_request_irq:
0378     pci_free_irq_vectors(pdev);
0379 
0380     return ret;
0381 }
0382 
0383 static int ntb_epf_peer_mw_count(struct ntb_dev *ntb)
0384 {
0385     return ntb_ndev(ntb)->mw_count;
0386 }
0387 
0388 static int ntb_epf_spad_count(struct ntb_dev *ntb)
0389 {
0390     return ntb_ndev(ntb)->spad_count;
0391 }
0392 
0393 static u64 ntb_epf_db_valid_mask(struct ntb_dev *ntb)
0394 {
0395     return ntb_ndev(ntb)->db_valid_mask;
0396 }
0397 
0398 static int ntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
0399 {
0400     return 0;
0401 }
0402 
0403 static int ntb_epf_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
0404                 dma_addr_t addr, resource_size_t size)
0405 {
0406     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0407     struct device *dev = ndev->dev;
0408     resource_size_t mw_size;
0409     int bar;
0410 
0411     if (pidx != NTB_DEF_PEER_IDX) {
0412         dev_err(dev, "Unsupported Peer ID %d\n", pidx);
0413         return -EINVAL;
0414     }
0415 
0416     bar = idx + ndev->mw_bar;
0417 
0418     mw_size = pci_resource_len(ntb->pdev, bar);
0419 
0420     if (size > mw_size) {
0421         dev_err(dev, "Size:%pa is greater than the MW size %pa\n",
0422             &size, &mw_size);
0423         return -EINVAL;
0424     }
0425 
0426     writel(lower_32_bits(addr), ndev->ctrl_reg + NTB_EPF_LOWER_ADDR);
0427     writel(upper_32_bits(addr), ndev->ctrl_reg + NTB_EPF_UPPER_ADDR);
0428     writel(lower_32_bits(size), ndev->ctrl_reg + NTB_EPF_LOWER_SIZE);
0429     writel(upper_32_bits(size), ndev->ctrl_reg + NTB_EPF_UPPER_SIZE);
0430     ntb_epf_send_command(ndev, CMD_CONFIGURE_MW, idx);
0431 
0432     return 0;
0433 }
0434 
0435 static int ntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx)
0436 {
0437     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0438     struct device *dev = ndev->dev;
0439     int ret = 0;
0440 
0441     ntb_epf_send_command(ndev, CMD_TEARDOWN_MW, idx);
0442     if (ret)
0443         dev_err(dev, "Failed to teardown memory window\n");
0444 
0445     return ret;
0446 }
0447 
0448 static int ntb_epf_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
0449                     phys_addr_t *base, resource_size_t *size)
0450 {
0451     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0452     u32 offset = 0;
0453     int bar;
0454 
0455     if (idx == 0)
0456         offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET);
0457 
0458     bar = idx + ndev->mw_bar;
0459 
0460     if (base)
0461         *base = pci_resource_start(ndev->ntb.pdev, bar) + offset;
0462 
0463     if (size)
0464         *size = pci_resource_len(ndev->ntb.pdev, bar) - offset;
0465 
0466     return 0;
0467 }
0468 
0469 static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
0470 {
0471     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0472     u32 interrupt_num = ffs(db_bits) + 1;
0473     struct device *dev = ndev->dev;
0474     u32 db_entry_size;
0475     u32 db_offset;
0476     u32 db_data;
0477 
0478     if (interrupt_num > ndev->db_count) {
0479         dev_err(dev, "DB interrupt %d greater than Max Supported %d\n",
0480             interrupt_num, ndev->db_count);
0481         return -EINVAL;
0482     }
0483 
0484     db_entry_size = readl(ndev->ctrl_reg + NTB_EPF_DB_ENTRY_SIZE);
0485 
0486     db_data = readl(ndev->ctrl_reg + NTB_EPF_DB_DATA(interrupt_num));
0487     db_offset = readl(ndev->ctrl_reg + NTB_EPF_DB_OFFSET(interrupt_num));
0488     writel(db_data, ndev->db_reg + (db_entry_size * interrupt_num) +
0489            db_offset);
0490 
0491     return 0;
0492 }
0493 
0494 static u64 ntb_epf_db_read(struct ntb_dev *ntb)
0495 {
0496     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0497 
0498     return ndev->db_val;
0499 }
0500 
0501 static int ntb_epf_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
0502 {
0503     return 0;
0504 }
0505 
0506 static int ntb_epf_db_clear(struct ntb_dev *ntb, u64 db_bits)
0507 {
0508     struct ntb_epf_dev *ndev = ntb_ndev(ntb);
0509 
0510     ndev->db_val = 0;
0511 
0512     return 0;
0513 }
0514 
0515 static const struct ntb_dev_ops ntb_epf_ops = {
0516     .mw_count       = ntb_epf_mw_count,
0517     .spad_count     = ntb_epf_spad_count,
0518     .peer_mw_count      = ntb_epf_peer_mw_count,
0519     .db_valid_mask      = ntb_epf_db_valid_mask,
0520     .db_set_mask        = ntb_epf_db_set_mask,
0521     .mw_set_trans       = ntb_epf_mw_set_trans,
0522     .mw_clear_trans     = ntb_epf_mw_clear_trans,
0523     .peer_mw_get_addr   = ntb_epf_peer_mw_get_addr,
0524     .link_enable        = ntb_epf_link_enable,
0525     .spad_read      = ntb_epf_spad_read,
0526     .spad_write     = ntb_epf_spad_write,
0527     .peer_spad_read     = ntb_epf_peer_spad_read,
0528     .peer_spad_write    = ntb_epf_peer_spad_write,
0529     .peer_db_set        = ntb_epf_peer_db_set,
0530     .db_read        = ntb_epf_db_read,
0531     .mw_get_align       = ntb_epf_mw_get_align,
0532     .link_is_up     = ntb_epf_link_is_up,
0533     .db_clear_mask      = ntb_epf_db_clear_mask,
0534     .db_clear       = ntb_epf_db_clear,
0535     .link_disable       = ntb_epf_link_disable,
0536 };
0537 
0538 static inline void ntb_epf_init_struct(struct ntb_epf_dev *ndev,
0539                        struct pci_dev *pdev)
0540 {
0541     ndev->ntb.pdev = pdev;
0542     ndev->ntb.topo = NTB_TOPO_NONE;
0543     ndev->ntb.ops = &ntb_epf_ops;
0544 }
0545 
0546 static int ntb_epf_init_dev(struct ntb_epf_dev *ndev)
0547 {
0548     struct device *dev = ndev->dev;
0549     int ret;
0550 
0551     /* One Link interrupt and rest doorbell interrupt */
0552     ret = ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + 1,
0553                    NTB_EPF_MAX_DB_COUNT + 1);
0554     if (ret) {
0555         dev_err(dev, "Failed to init ISR\n");
0556         return ret;
0557     }
0558 
0559     ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
0560     ndev->mw_count = readl(ndev->ctrl_reg + NTB_EPF_MW_COUNT);
0561     ndev->spad_count = readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
0562 
0563     return 0;
0564 }
0565 
0566 static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
0567                 struct pci_dev *pdev)
0568 {
0569     struct device *dev = ndev->dev;
0570     size_t spad_sz, spad_off;
0571     int ret;
0572 
0573     pci_set_drvdata(pdev, ndev);
0574 
0575     ret = pci_enable_device(pdev);
0576     if (ret) {
0577         dev_err(dev, "Cannot enable PCI device\n");
0578         goto err_pci_enable;
0579     }
0580 
0581     ret = pci_request_regions(pdev, "ntb");
0582     if (ret) {
0583         dev_err(dev, "Cannot obtain PCI resources\n");
0584         goto err_pci_regions;
0585     }
0586 
0587     pci_set_master(pdev);
0588 
0589     ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
0590     if (ret) {
0591         ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
0592         if (ret) {
0593             dev_err(dev, "Cannot set DMA mask\n");
0594             goto err_dma_mask;
0595         }
0596         dev_warn(&pdev->dev, "Cannot DMA highmem\n");
0597     }
0598 
0599     ndev->ctrl_reg = pci_iomap(pdev, ndev->ctrl_reg_bar, 0);
0600     if (!ndev->ctrl_reg) {
0601         ret = -EIO;
0602         goto err_dma_mask;
0603     }
0604 
0605     if (ndev->peer_spad_reg_bar) {
0606         ndev->peer_spad_reg = pci_iomap(pdev, ndev->peer_spad_reg_bar, 0);
0607         if (!ndev->peer_spad_reg) {
0608             ret = -EIO;
0609             goto err_dma_mask;
0610         }
0611     } else {
0612         spad_sz = 4 * readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
0613         spad_off = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
0614         ndev->peer_spad_reg = ndev->ctrl_reg + spad_off  + spad_sz;
0615     }
0616 
0617     ndev->db_reg = pci_iomap(pdev, ndev->db_reg_bar, 0);
0618     if (!ndev->db_reg) {
0619         ret = -EIO;
0620         goto err_dma_mask;
0621     }
0622 
0623     return 0;
0624 
0625 err_dma_mask:
0626     pci_clear_master(pdev);
0627 
0628 err_pci_regions:
0629     pci_disable_device(pdev);
0630 
0631 err_pci_enable:
0632     pci_set_drvdata(pdev, NULL);
0633 
0634     return ret;
0635 }
0636 
0637 static void ntb_epf_deinit_pci(struct ntb_epf_dev *ndev)
0638 {
0639     struct pci_dev *pdev = ndev->ntb.pdev;
0640 
0641     pci_iounmap(pdev, ndev->ctrl_reg);
0642     pci_iounmap(pdev, ndev->peer_spad_reg);
0643     pci_iounmap(pdev, ndev->db_reg);
0644 
0645     pci_clear_master(pdev);
0646     pci_release_regions(pdev);
0647     pci_disable_device(pdev);
0648     pci_set_drvdata(pdev, NULL);
0649 }
0650 
0651 static void ntb_epf_cleanup_isr(struct ntb_epf_dev *ndev)
0652 {
0653     struct pci_dev *pdev = ndev->ntb.pdev;
0654     int i;
0655 
0656     ntb_epf_send_command(ndev, CMD_TEARDOWN_DOORBELL, ndev->db_count + 1);
0657 
0658     for (i = 0; i < ndev->db_count + 1; i++)
0659         free_irq(pci_irq_vector(pdev, i), ndev);
0660     pci_free_irq_vectors(pdev);
0661 }
0662 
0663 static int ntb_epf_pci_probe(struct pci_dev *pdev,
0664                  const struct pci_device_id *id)
0665 {
0666     enum pci_barno peer_spad_reg_bar = BAR_1;
0667     enum pci_barno ctrl_reg_bar = BAR_0;
0668     enum pci_barno db_reg_bar = BAR_2;
0669     enum pci_barno mw_bar = BAR_2;
0670     struct device *dev = &pdev->dev;
0671     struct ntb_epf_data *data;
0672     struct ntb_epf_dev *ndev;
0673     int ret;
0674 
0675     if (pci_is_bridge(pdev))
0676         return -ENODEV;
0677 
0678     ndev = devm_kzalloc(dev, sizeof(*ndev), GFP_KERNEL);
0679     if (!ndev)
0680         return -ENOMEM;
0681 
0682     data = (struct ntb_epf_data *)id->driver_data;
0683     if (data) {
0684         peer_spad_reg_bar = data->peer_spad_reg_bar;
0685         ctrl_reg_bar = data->ctrl_reg_bar;
0686         db_reg_bar = data->db_reg_bar;
0687         mw_bar = data->mw_bar;
0688     }
0689 
0690     ndev->peer_spad_reg_bar = peer_spad_reg_bar;
0691     ndev->ctrl_reg_bar = ctrl_reg_bar;
0692     ndev->db_reg_bar = db_reg_bar;
0693     ndev->mw_bar = mw_bar;
0694     ndev->dev = dev;
0695 
0696     ntb_epf_init_struct(ndev, pdev);
0697     mutex_init(&ndev->cmd_lock);
0698 
0699     ret = ntb_epf_init_pci(ndev, pdev);
0700     if (ret) {
0701         dev_err(dev, "Failed to init PCI\n");
0702         return ret;
0703     }
0704 
0705     ret = ntb_epf_init_dev(ndev);
0706     if (ret) {
0707         dev_err(dev, "Failed to init device\n");
0708         goto err_init_dev;
0709     }
0710 
0711     ret = ntb_register_device(&ndev->ntb);
0712     if (ret) {
0713         dev_err(dev, "Failed to register NTB device\n");
0714         goto err_register_dev;
0715     }
0716 
0717     return 0;
0718 
0719 err_register_dev:
0720     ntb_epf_cleanup_isr(ndev);
0721 
0722 err_init_dev:
0723     ntb_epf_deinit_pci(ndev);
0724 
0725     return ret;
0726 }
0727 
0728 static void ntb_epf_pci_remove(struct pci_dev *pdev)
0729 {
0730     struct ntb_epf_dev *ndev = pci_get_drvdata(pdev);
0731 
0732     ntb_unregister_device(&ndev->ntb);
0733     ntb_epf_cleanup_isr(ndev);
0734     ntb_epf_deinit_pci(ndev);
0735 }
0736 
0737 static const struct ntb_epf_data j721e_data = {
0738     .ctrl_reg_bar = BAR_0,
0739     .peer_spad_reg_bar = BAR_1,
0740     .db_reg_bar = BAR_2,
0741     .mw_bar = BAR_2,
0742 };
0743 
0744 static const struct ntb_epf_data mx8_data = {
0745     .ctrl_reg_bar = BAR_0,
0746     .peer_spad_reg_bar = BAR_0,
0747     .db_reg_bar = BAR_2,
0748     .mw_bar = BAR_4,
0749 };
0750 
0751 static const struct pci_device_id ntb_epf_pci_tbl[] = {
0752     {
0753         PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
0754         .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
0755         .driver_data = (kernel_ulong_t)&j721e_data,
0756     },
0757     {
0758         PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809),
0759         .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
0760         .driver_data = (kernel_ulong_t)&mx8_data,
0761     },
0762     { },
0763 };
0764 
0765 static struct pci_driver ntb_epf_pci_driver = {
0766     .name       = KBUILD_MODNAME,
0767     .id_table   = ntb_epf_pci_tbl,
0768     .probe      = ntb_epf_pci_probe,
0769     .remove     = ntb_epf_pci_remove,
0770 };
0771 module_pci_driver(ntb_epf_pci_driver);
0772 
0773 MODULE_DESCRIPTION("PCI ENDPOINT NTB HOST DRIVER");
0774 MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
0775 MODULE_LICENSE("GPL v2");