cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ntb_hw_epf.c (16892B)


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