Linux-libre 5.7.3-gnu
[librecmc/linux-libre.git] / drivers / staging / kpc2000 / kpc2000 / pcie.h
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 */