File Index
Files and directories
Sign in
FILE

ntb_hw_epf.c

File preview with syntax highlighting.

linux-6.19.14/drivers/ntb/hw/epf/ntb_hw_epf.c C
  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
 51enum pci_barno {
 52	NO_BAR = -1,
 53	BAR_0,
 54	BAR_1,
 55	BAR_2,
 56	BAR_3,
 57	BAR_4,
 58	BAR_5,
 59};
 60
 61enum epf_ntb_bar {
 62	BAR_CONFIG,
 63	BAR_PEER_SPAD,
 64	BAR_DB,
 65	BAR_MW1,
 66	BAR_MW2,
 67	BAR_MW3,
 68	BAR_MW4,
 69	NTB_BAR_NUM,
 70};
 71
 72#define NTB_EPF_MAX_MW_COUNT	(NTB_BAR_NUM - BAR_MW1)
 73
 74struct ntb_epf_dev {
 75	struct ntb_dev ntb;
 76	struct device *dev;
 77	/* Mutex to protect providing commands to NTB EPF */
 78	struct mutex cmd_lock;
 79
 80	const enum pci_barno *barno_map;
 81
 82	unsigned int mw_count;
 83	unsigned int spad_count;
 84	unsigned int db_count;
 85
 86	void __iomem *ctrl_reg;
 87	void __iomem *db_reg;
 88	void __iomem *peer_spad_reg;
 89
 90	unsigned int self_spad;
 91	unsigned int peer_spad;
 92
 93	int db_val;
 94	u64 db_valid_mask;
 95};
 96
 97#define ntb_ndev(__ntb) container_of(__ntb, struct ntb_epf_dev, ntb)
 98
 99static 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
138static 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 ndev->barno_map[BAR_MW1 + idx];
148}
149
150static 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
163static 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
193static 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
205static 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
222static 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
241static 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
261static 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
284static 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
301static 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
316static 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
332static 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
373err_configure_db:
374	for (i = 0; i < ndev->db_count + 1; i++)
375		free_irq(pci_irq_vector(pdev, i), ndev);
376
377err_request_irq:
378	pci_free_irq_vectors(pdev);
379
380	return ret;
381}
382
383static int ntb_epf_peer_mw_count(struct ntb_dev *ntb)
384{
385	return ntb_ndev(ntb)->mw_count;
386}
387
388static int ntb_epf_spad_count(struct ntb_dev *ntb)
389{
390	return ntb_ndev(ntb)->spad_count;
391}
392
393static u64 ntb_epf_db_valid_mask(struct ntb_dev *ntb)
394{
395	return ntb_ndev(ntb)->db_valid_mask;
396}
397
398static int ntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
399{
400	return 0;
401}
402
403static 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 = ntb_epf_mw_to_bar(ndev, idx);
417	if (bar < 0)
418		return bar;
419
420	mw_size = pci_resource_len(ntb->pdev, bar);
421
422	if (size > mw_size) {
423		dev_err(dev, "Size:%pa is greater than the MW size %pa\n",
424			&size, &mw_size);
425		return -EINVAL;
426	}
427
428	writel(lower_32_bits(addr), ndev->ctrl_reg + NTB_EPF_LOWER_ADDR);
429	writel(upper_32_bits(addr), ndev->ctrl_reg + NTB_EPF_UPPER_ADDR);
430	writel(lower_32_bits(size), ndev->ctrl_reg + NTB_EPF_LOWER_SIZE);
431	writel(upper_32_bits(size), ndev->ctrl_reg + NTB_EPF_UPPER_SIZE);
432	ntb_epf_send_command(ndev, CMD_CONFIGURE_MW, idx);
433
434	return 0;
435}
436
437static int ntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx)
438{
439	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
440	struct device *dev = ndev->dev;
441	int ret = 0;
442
443	ntb_epf_send_command(ndev, CMD_TEARDOWN_MW, idx);
444	if (ret)
445		dev_err(dev, "Failed to teardown memory window\n");
446
447	return ret;
448}
449
450static int ntb_epf_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
451				    phys_addr_t *base, resource_size_t *size)
452{
453	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
454	u32 offset = 0;
455	int bar;
456
457	if (idx == 0)
458		offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET);
459
460	bar = ntb_epf_mw_to_bar(ndev, idx);
461	if (bar < 0)
462		return bar;
463
464	if (base)
465		*base = pci_resource_start(ndev->ntb.pdev, bar) + offset;
466
467	if (size)
468		*size = pci_resource_len(ndev->ntb.pdev, bar) - offset;
469
470	return 0;
471}
472
473static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
474{
475	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
476	u32 interrupt_num = ffs(db_bits) + 1;
477	struct device *dev = ndev->dev;
478	u32 db_entry_size;
479	u32 db_offset;
480	u32 db_data;
481
482	if (interrupt_num > ndev->db_count) {
483		dev_err(dev, "DB interrupt %d greater than Max Supported %d\n",
484			interrupt_num, ndev->db_count);
485		return -EINVAL;
486	}
487
488	db_entry_size = readl(ndev->ctrl_reg + NTB_EPF_DB_ENTRY_SIZE);
489
490	db_data = readl(ndev->ctrl_reg + NTB_EPF_DB_DATA(interrupt_num));
491	db_offset = readl(ndev->ctrl_reg + NTB_EPF_DB_OFFSET(interrupt_num));
492	writel(db_data, ndev->db_reg + (db_entry_size * interrupt_num) +
493	       db_offset);
494
495	return 0;
496}
497
498static u64 ntb_epf_db_read(struct ntb_dev *ntb)
499{
500	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
501
502	return ndev->db_val;
503}
504
505static int ntb_epf_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
506{
507	return 0;
508}
509
510static int ntb_epf_db_clear(struct ntb_dev *ntb, u64 db_bits)
511{
512	struct ntb_epf_dev *ndev = ntb_ndev(ntb);
513
514	ndev->db_val = 0;
515
516	return 0;
517}
518
519static const struct ntb_dev_ops ntb_epf_ops = {
520	.mw_count		= ntb_epf_mw_count,
521	.spad_count		= ntb_epf_spad_count,
522	.peer_mw_count		= ntb_epf_peer_mw_count,
523	.db_valid_mask		= ntb_epf_db_valid_mask,
524	.db_set_mask		= ntb_epf_db_set_mask,
525	.mw_set_trans		= ntb_epf_mw_set_trans,
526	.mw_clear_trans		= ntb_epf_mw_clear_trans,
527	.peer_mw_get_addr	= ntb_epf_peer_mw_get_addr,
528	.link_enable		= ntb_epf_link_enable,
529	.spad_read		= ntb_epf_spad_read,
530	.spad_write		= ntb_epf_spad_write,
531	.peer_spad_read		= ntb_epf_peer_spad_read,
532	.peer_spad_write	= ntb_epf_peer_spad_write,
533	.peer_db_set		= ntb_epf_peer_db_set,
534	.db_read		= ntb_epf_db_read,
535	.mw_get_align		= ntb_epf_mw_get_align,
536	.link_is_up		= ntb_epf_link_is_up,
537	.db_clear_mask		= ntb_epf_db_clear_mask,
538	.db_clear		= ntb_epf_db_clear,
539	.link_disable		= ntb_epf_link_disable,
540};
541
542static inline void ntb_epf_init_struct(struct ntb_epf_dev *ndev,
543				       struct pci_dev *pdev)
544{
545	ndev->ntb.pdev = pdev;
546	ndev->ntb.topo = NTB_TOPO_NONE;
547	ndev->ntb.ops = &ntb_epf_ops;
548}
549
550static int ntb_epf_init_dev(struct ntb_epf_dev *ndev)
551{
552	struct device *dev = ndev->dev;
553	int ret;
554
555	/* One Link interrupt and rest doorbell interrupt */
556	ret = ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + 1,
557			       NTB_EPF_MAX_DB_COUNT + 1);
558	if (ret) {
559		dev_err(dev, "Failed to init ISR\n");
560		return ret;
561	}
562
563	ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
564	ndev->mw_count = readl(ndev->ctrl_reg + NTB_EPF_MW_COUNT);
565	ndev->spad_count = readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
566
567	if (ndev->mw_count > NTB_EPF_MAX_MW_COUNT) {
568		dev_err(dev, "Unsupported MW count: %u\n", ndev->mw_count);
569		return -EINVAL;
570	}
571
572	return 0;
573}
574
575static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
576			    struct pci_dev *pdev)
577{
578	struct device *dev = ndev->dev;
579	size_t spad_sz, spad_off;
580	int ret;
581
582	pci_set_drvdata(pdev, ndev);
583
584	ret = pci_enable_device(pdev);
585	if (ret) {
586		dev_err(dev, "Cannot enable PCI device\n");
587		goto err_pci_enable;
588	}
589
590	ret = pci_request_regions(pdev, "ntb");
591	if (ret) {
592		dev_err(dev, "Cannot obtain PCI resources\n");
593		goto err_pci_regions;
594	}
595
596	pci_set_master(pdev);
597
598	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
599	if (ret) {
600		ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
601		if (ret) {
602			dev_err(dev, "Cannot set DMA mask\n");
603			goto err_pci_regions;
604		}
605		dev_warn(&pdev->dev, "Cannot DMA highmem\n");
606	}
607
608	ndev->ctrl_reg = pci_iomap(pdev, ndev->barno_map[BAR_CONFIG], 0);
609	if (!ndev->ctrl_reg) {
610		ret = -EIO;
611		goto err_pci_regions;
612	}
613
614	if (ndev->barno_map[BAR_PEER_SPAD] != ndev->barno_map[BAR_CONFIG]) {
615		ndev->peer_spad_reg = pci_iomap(pdev,
616						ndev->barno_map[BAR_PEER_SPAD], 0);
617		if (!ndev->peer_spad_reg) {
618			ret = -EIO;
619			goto err_pci_regions;
620		}
621	} else {
622		spad_sz = 4 * readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
623		spad_off = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET);
624		ndev->peer_spad_reg = ndev->ctrl_reg + spad_off  + spad_sz;
625	}
626
627	ndev->db_reg = pci_iomap(pdev, ndev->barno_map[BAR_DB], 0);
628	if (!ndev->db_reg) {
629		ret = -EIO;
630		goto err_pci_regions;
631	}
632
633	return 0;
634
635err_pci_regions:
636	pci_disable_device(pdev);
637
638err_pci_enable:
639	pci_set_drvdata(pdev, NULL);
640
641	return ret;
642}
643
644static void ntb_epf_deinit_pci(struct ntb_epf_dev *ndev)
645{
646	struct pci_dev *pdev = ndev->ntb.pdev;
647
648	pci_iounmap(pdev, ndev->ctrl_reg);
649	pci_iounmap(pdev, ndev->peer_spad_reg);
650	pci_iounmap(pdev, ndev->db_reg);
651
652	pci_release_regions(pdev);
653	pci_disable_device(pdev);
654	pci_set_drvdata(pdev, NULL);
655}
656
657static void ntb_epf_cleanup_isr(struct ntb_epf_dev *ndev)
658{
659	struct pci_dev *pdev = ndev->ntb.pdev;
660	int i;
661
662	ntb_epf_send_command(ndev, CMD_TEARDOWN_DOORBELL, ndev->db_count + 1);
663
664	for (i = 0; i < ndev->db_count + 1; i++)
665		free_irq(pci_irq_vector(pdev, i), ndev);
666	pci_free_irq_vectors(pdev);
667}
668
669static int ntb_epf_pci_probe(struct pci_dev *pdev,
670			     const struct pci_device_id *id)
671{
672	struct device *dev = &pdev->dev;
673	struct ntb_epf_dev *ndev;
674	int ret;
675
676	if (pci_is_bridge(pdev))
677		return -ENODEV;
678
679	ndev = devm_kzalloc(dev, sizeof(*ndev), GFP_KERNEL);
680	if (!ndev)
681		return -ENOMEM;
682
683	ndev->barno_map = (const enum pci_barno *)id->driver_data;
684	if (!ndev->barno_map)
685		return -EINVAL;
686
687	ndev->dev = dev;
688
689	ntb_epf_init_struct(ndev, pdev);
690	mutex_init(&ndev->cmd_lock);
691
692	ret = ntb_epf_init_pci(ndev, pdev);
693	if (ret) {
694		dev_err(dev, "Failed to init PCI\n");
695		return ret;
696	}
697
698	ret = ntb_epf_init_dev(ndev);
699	if (ret) {
700		dev_err(dev, "Failed to init device\n");
701		goto err_init_dev;
702	}
703
704	ret = ntb_register_device(&ndev->ntb);
705	if (ret) {
706		dev_err(dev, "Failed to register NTB device\n");
707		goto err_register_dev;
708	}
709
710	return 0;
711
712err_register_dev:
713	ntb_epf_cleanup_isr(ndev);
714
715err_init_dev:
716	ntb_epf_deinit_pci(ndev);
717
718	return ret;
719}
720
721static void ntb_epf_pci_remove(struct pci_dev *pdev)
722{
723	struct ntb_epf_dev *ndev = pci_get_drvdata(pdev);
724
725	ntb_unregister_device(&ndev->ntb);
726	ntb_epf_cleanup_isr(ndev);
727	ntb_epf_deinit_pci(ndev);
728}
729
730static const enum pci_barno j721e_map[NTB_BAR_NUM] = {
731	[BAR_CONFIG]	= BAR_0,
732	[BAR_PEER_SPAD]	= BAR_1,
733	[BAR_DB]	= BAR_2,
734	[BAR_MW1]	= BAR_2,
735	[BAR_MW2]	= BAR_3,
736	[BAR_MW3]	= BAR_4,
737	[BAR_MW4]	= BAR_5
738};
739
740static const enum pci_barno mx8_map[NTB_BAR_NUM] = {
741	[BAR_CONFIG]	= BAR_0,
742	[BAR_PEER_SPAD]	= BAR_0,
743	[BAR_DB]	= BAR_2,
744	[BAR_MW1]	= BAR_4,
745	[BAR_MW2]	= BAR_5,
746	[BAR_MW3]	= NO_BAR,
747	[BAR_MW4]	= NO_BAR
748};
749
750static const enum pci_barno rcar_barno[NTB_BAR_NUM] = {
751	[BAR_CONFIG]	= BAR_0,
752	[BAR_PEER_SPAD]	= BAR_0,
753	[BAR_DB]	= BAR_4,
754	[BAR_MW1]	= BAR_2,
755	[BAR_MW2]	= NO_BAR,
756	[BAR_MW3]	= NO_BAR,
757	[BAR_MW4]	= NO_BAR,
758};
759
760static const struct pci_device_id ntb_epf_pci_tbl[] = {
761	{
762		PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
763		.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
764		.driver_data = (kernel_ulong_t)j721e_map,
765	},
766	{
767		PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809),
768		.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
769		.driver_data = (kernel_ulong_t)mx8_map,
770	},
771	{
772		PCI_DEVICE(PCI_VENDOR_ID_RENESAS, 0x0030),
773		.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
774		.driver_data = (kernel_ulong_t)rcar_barno,
775	},
776	{ },
777};
778
779static struct pci_driver ntb_epf_pci_driver = {
780	.name		= KBUILD_MODNAME,
781	.id_table	= ntb_epf_pci_tbl,
782	.probe		= ntb_epf_pci_probe,
783	.remove		= ntb_epf_pci_remove,
784};
785module_pci_driver(ntb_epf_pci_driver);
786
787MODULE_DESCRIPTION("PCI ENDPOINT NTB HOST DRIVER");
788MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
789MODULE_LICENSE("GPL v2");
~/ Read-only file preview.