1 /* SPDX-License-Identifier: GPL-2.0+ */
2 #ifndef KP2000_PCIE_H
3 #define KP2000_PCIE_H
4 #include <linux/types.h>
5 #include <linux/pci.h>
6 #include "../kpc.h"
7 #include "dma_common_defs.h"
8 
9 
10 /*      System Register Map (BAR 1, Start Addr 0)
11  *
12  *  BAR Size:
13  *  1048576 (0x100000) bytes = 131072 (0x20000) registers = 256 pages (4K)
14  *
15  *             6         5         4         3         2         1         0
16  *          3210987654321098765432109876543210987654321098765432109876543210
17  *      0   <--------------------------- MAGIC ---------------------------->
18  *      1   <----------- Card ID ---------><----------- Revision ---------->
19  *      2   <--------- Date Stamp --------><--------- Time Stamp ---------->
20  *      3   <-------- Core Tbl Len -------><-------- Core Tbl Offset ------>
21  *      4   <---------------------------- SSID ---------------------------->
22  *      5                                                           < HWID >
23  *      6   <------------------------- FPGA DDNA -------------------------->
24  *      7   <------------------------ CPLD Config ------------------------->
25  *      8   <----------------------- IRQ Mask Flags ----------------------->
26  *      9   <---------------------- IRQ Active Flags ---------------------->
27  */
28 
29 #define REG_WIDTH			8
30 #define REG_MAGIC_NUMBER		(0 * REG_WIDTH)
31 #define REG_CARD_ID_AND_BUILD		(1 * REG_WIDTH)
32 #define REG_DATE_AND_TIME_STAMPS	(2 * REG_WIDTH)
33 #define REG_CORE_TABLE_OFFSET		(3 * REG_WIDTH)
34 #define REG_FPGA_SSID			(4 * REG_WIDTH)
35 #define REG_FPGA_HW_ID			(5 * REG_WIDTH)
36 #define REG_FPGA_DDNA			(6 * REG_WIDTH)
37 #define REG_CPLD_CONFIG			(7 * REG_WIDTH)
38 #define REG_INTERRUPT_MASK		(8 * REG_WIDTH)
39 #define REG_INTERRUPT_ACTIVE		(9 * REG_WIDTH)
40 #define REG_PCIE_ERROR_COUNT		(10 * REG_WIDTH)
41 
42 #define KP2000_MAGIC_VALUE		0x196C61482231894DULL
43 
44 #define PCI_VENDOR_ID_DAKTRONICS	0x1c33
45 #define PCI_DEVICE_ID_DAKTRONICS	0x6021
46 
47 #define DMA_BAR				0
48 #define REG_BAR				1
49 
50 struct kp2000_device {
51 	struct pci_dev		*pdev;
52 	char			name[16];
53 
54 	unsigned int		card_num;
55 	struct mutex		sem;
56 
57 	void __iomem		*sysinfo_regs_base;
58 	void __iomem		*regs_bar_base;
59 	struct resource		regs_base_resource;
60 	void __iomem		*dma_bar_base;
61 	void __iomem		*dma_common_regs;
62 	struct resource		dma_base_resource;
63 
64 	// "System Registers"
65 	u32			card_id;
66 	u32			build_version;
67 	u32			build_datestamp;
68 	u32			build_timestamp;
69 	u32			core_table_offset;
70 	u32			core_table_length;
71 	u8			core_table_rev;
72 	u8			hardware_revision;
73 	u64			ssid;
74 	u64			ddna;
75 
76 	// IRQ stuff
77 	unsigned int		irq;
78 
79 	struct list_head	uio_devices_list;
80 };
81 
82 extern struct class *kpc_uio_class;
83 extern struct attribute *kpc_uio_class_attrs[];
84 
85 int kp2000_probe_cores(struct kp2000_device *pcard);
86 void kp2000_remove_cores(struct kp2000_device *pcard);
87 
88 // Define this quick little macro because the expression is used frequently
89 #define PCARD_TO_DEV(pcard)	(&(pcard->pdev->dev))
90 
91 #endif /* KP2000_PCIE_H */
92