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 */