1 // SPDX-License-Identifier: GPL-2.0+
2 #include <linux/kernel.h>
4 #include <linux/init.h>
5 #include <linux/module.h>
7 #include <linux/types.h>
8 #include <linux/export.h>
9 #include <linux/slab.h>
11 #include <linux/errno.h>
12 #include <linux/cdev.h>
13 #include <linux/rwsem.h>
14 #include <linux/uaccess.h>
16 #include <linux/mfd/core.h>
17 #include <linux/platform_device.h>
18 #include <linux/ioport.h>
19 #include <linux/io-64-nonatomic-lo-hi.h>
20 #include <linux/interrupt.h>
21 #include <linux/workqueue.h>
22 #include <linux/device.h>
23 #include <linux/sched.h>
24 #include <linux/jiffies.h>
28 static DEFINE_IDA(card_num_ida
);
30 /*******************************************************
32 ******************************************************/
34 static ssize_t
ssid_show(struct device
*dev
, struct device_attribute
*attr
,
37 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
39 return sprintf(buf
, "%016llx\n", pcard
->ssid
);
41 static DEVICE_ATTR_RO(ssid
);
43 static ssize_t
ddna_show(struct device
*dev
, struct device_attribute
*attr
,
46 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
48 return sprintf(buf
, "%016llx\n", pcard
->ddna
);
50 static DEVICE_ATTR_RO(ddna
);
52 static ssize_t
card_id_show(struct device
*dev
, struct device_attribute
*attr
,
55 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
57 return sprintf(buf
, "%08x\n", pcard
->card_id
);
59 static DEVICE_ATTR_RO(card_id
);
61 static ssize_t
hw_rev_show(struct device
*dev
, struct device_attribute
*attr
,
64 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
66 return sprintf(buf
, "%08x\n", pcard
->hardware_revision
);
68 static DEVICE_ATTR_RO(hw_rev
);
70 static ssize_t
build_show(struct device
*dev
, struct device_attribute
*attr
,
73 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
75 return sprintf(buf
, "%08x\n", pcard
->build_version
);
77 static DEVICE_ATTR_RO(build
);
79 static ssize_t
build_date_show(struct device
*dev
,
80 struct device_attribute
*attr
, char *buf
)
82 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
84 return sprintf(buf
, "%08x\n", pcard
->build_datestamp
);
86 static DEVICE_ATTR_RO(build_date
);
88 static ssize_t
build_time_show(struct device
*dev
,
89 struct device_attribute
*attr
, char *buf
)
91 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
93 return sprintf(buf
, "%08x\n", pcard
->build_timestamp
);
95 static DEVICE_ATTR_RO(build_time
);
97 static ssize_t
cpld_reg_show(struct device
*dev
, struct device_attribute
*attr
,
100 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
103 val
= readq(pcard
->sysinfo_regs_base
+ REG_CPLD_CONFIG
);
104 return sprintf(buf
, "%016llx\n", val
);
106 static DEVICE_ATTR_RO(cpld_reg
);
108 static ssize_t
cpld_reconfigure(struct device
*dev
,
109 struct device_attribute
*attr
,
110 const char *buf
, size_t count
)
112 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
113 unsigned long wr_val
;
116 rv
= kstrtoul(buf
, 0, &wr_val
);
122 wr_val
= wr_val
<< 8;
123 wr_val
|= 0x1; // Set the "Configure Go" bit
124 writeq(wr_val
, pcard
->sysinfo_regs_base
+ REG_CPLD_CONFIG
);
127 static DEVICE_ATTR(cpld_reconfigure
, 0220, NULL
, cpld_reconfigure
);
129 static ssize_t
irq_mask_reg_show(struct device
*dev
,
130 struct device_attribute
*attr
, char *buf
)
132 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
135 val
= readq(pcard
->sysinfo_regs_base
+ REG_INTERRUPT_MASK
);
136 return sprintf(buf
, "%016llx\n", val
);
138 static DEVICE_ATTR_RO(irq_mask_reg
);
140 static ssize_t
irq_active_reg_show(struct device
*dev
,
141 struct device_attribute
*attr
, char *buf
)
143 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
146 val
= readq(pcard
->sysinfo_regs_base
+ REG_INTERRUPT_ACTIVE
);
147 return sprintf(buf
, "%016llx\n", val
);
149 static DEVICE_ATTR_RO(irq_active_reg
);
151 static ssize_t
pcie_error_count_reg_show(struct device
*dev
,
152 struct device_attribute
*attr
,
155 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
158 val
= readq(pcard
->sysinfo_regs_base
+ REG_PCIE_ERROR_COUNT
);
159 return sprintf(buf
, "%016llx\n", val
);
161 static DEVICE_ATTR_RO(pcie_error_count_reg
);
163 static ssize_t
core_table_offset_show(struct device
*dev
,
164 struct device_attribute
*attr
, char *buf
)
166 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
168 return sprintf(buf
, "%08x\n", pcard
->core_table_offset
);
170 static DEVICE_ATTR_RO(core_table_offset
);
172 static ssize_t
core_table_length_show(struct device
*dev
,
173 struct device_attribute
*attr
, char *buf
)
175 struct kp2000_device
*pcard
= dev_get_drvdata(dev
);
177 return sprintf(buf
, "%08x\n", pcard
->core_table_length
);
179 static DEVICE_ATTR_RO(core_table_length
);
181 static const struct attribute
*kp_attr_list
[] = {
184 &dev_attr_card_id
.attr
,
185 &dev_attr_hw_rev
.attr
,
186 &dev_attr_build
.attr
,
187 &dev_attr_build_date
.attr
,
188 &dev_attr_build_time
.attr
,
189 &dev_attr_cpld_reg
.attr
,
190 &dev_attr_cpld_reconfigure
.attr
,
191 &dev_attr_irq_mask_reg
.attr
,
192 &dev_attr_irq_active_reg
.attr
,
193 &dev_attr_pcie_error_count_reg
.attr
,
194 &dev_attr_core_table_offset
.attr
,
195 &dev_attr_core_table_length
.attr
,
199 /*******************************************************
201 ******************************************************/
203 static void wait_and_read_ssid(struct kp2000_device
*pcard
)
205 u64 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_FPGA_SSID
);
206 unsigned long timeout
;
208 if (read_val
& 0x8000000000000000UL
) {
209 pcard
->ssid
= read_val
;
213 timeout
= jiffies
+ (HZ
* 2);
215 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_FPGA_SSID
);
216 if (read_val
& 0x8000000000000000UL
) {
217 pcard
->ssid
= read_val
;
222 } while (time_before(jiffies
, timeout
));
224 dev_notice(&pcard
->pdev
->dev
, "SSID didn't show up!\n");
226 // Timed out waiting for the SSID to show up, stick all zeros in the
231 static int read_system_regs(struct kp2000_device
*pcard
)
235 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_MAGIC_NUMBER
);
236 if (read_val
!= KP2000_MAGIC_VALUE
) {
237 dev_err(&pcard
->pdev
->dev
,
238 "Invalid magic! Got: 0x%016llx Want: 0x%016llx\n",
239 read_val
, KP2000_MAGIC_VALUE
);
243 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_CARD_ID_AND_BUILD
);
244 pcard
->card_id
= (read_val
& 0xFFFFFFFF00000000UL
) >> 32;
245 pcard
->build_version
= (read_val
& 0x00000000FFFFFFFFUL
) >> 0;
247 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_DATE_AND_TIME_STAMPS
);
248 pcard
->build_datestamp
= (read_val
& 0xFFFFFFFF00000000UL
) >> 32;
249 pcard
->build_timestamp
= (read_val
& 0x00000000FFFFFFFFUL
) >> 0;
251 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_CORE_TABLE_OFFSET
);
252 pcard
->core_table_length
= (read_val
& 0xFFFFFFFF00000000UL
) >> 32;
253 pcard
->core_table_offset
= (read_val
& 0x00000000FFFFFFFFUL
) >> 0;
255 wait_and_read_ssid(pcard
);
257 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_FPGA_HW_ID
);
258 pcard
->core_table_rev
= (read_val
& 0x0000000000000F00) >> 8;
259 pcard
->hardware_revision
= (read_val
& 0x000000000000001F);
261 read_val
= readq(pcard
->sysinfo_regs_base
+ REG_FPGA_DDNA
);
262 pcard
->ddna
= read_val
;
264 dev_info(&pcard
->pdev
->dev
,
265 "system_regs: %08x %08x %08x %08x %02x %d %d %016llx %016llx\n",
267 pcard
->build_version
,
268 pcard
->build_datestamp
,
269 pcard
->build_timestamp
,
270 pcard
->hardware_revision
,
271 pcard
->core_table_rev
,
272 pcard
->core_table_length
,
276 if (pcard
->core_table_rev
> 1) {
277 dev_err(&pcard
->pdev
->dev
,
278 "core table entry revision is higher than we can deal with, cannot continue with this card!\n");
285 static irqreturn_t
kp2000_irq_handler(int irq
, void *dev_id
)
287 struct kp2000_device
*pcard
= dev_id
;
289 writel(KPC_DMA_CARD_IRQ_ENABLE
|
290 KPC_DMA_CARD_USER_INTERRUPT_MODE
|
291 KPC_DMA_CARD_USER_INTERRUPT_ACTIVE
,
292 pcard
->dma_common_regs
);
296 static int kp2000_pcie_probe(struct pci_dev
*pdev
,
297 const struct pci_device_id
*id
)
300 struct kp2000_device
*pcard
;
301 unsigned long reg_bar_phys_addr
;
302 unsigned long reg_bar_phys_len
;
303 unsigned long dma_bar_phys_addr
;
304 unsigned long dma_bar_phys_len
;
307 pcard
= kzalloc(sizeof(*pcard
), GFP_KERNEL
);
310 dev_dbg(&pdev
->dev
, "probe: allocated struct kp2000_device @ %p\n",
313 err
= ida_simple_get(&card_num_ida
, 1, INT_MAX
, GFP_KERNEL
);
315 dev_err(&pdev
->dev
, "probe: failed to get card number (%d)\n",
319 pcard
->card_num
= err
;
320 scnprintf(pcard
->name
, 16, "kpcard%u", pcard
->card_num
);
322 mutex_init(&pcard
->sem
);
323 mutex_lock(&pcard
->sem
);
326 pci_set_drvdata(pdev
, pcard
);
328 err
= pci_enable_device(pcard
->pdev
);
330 dev_err(&pcard
->pdev
->dev
,
331 "probe: failed to enable PCIE2000 PCIe device (%d)\n",
336 /* Setup the Register BAR */
337 reg_bar_phys_addr
= pci_resource_start(pcard
->pdev
, REG_BAR
);
338 reg_bar_phys_len
= pci_resource_len(pcard
->pdev
, REG_BAR
);
340 pcard
->regs_bar_base
= ioremap(reg_bar_phys_addr
, PAGE_SIZE
);
341 if (!pcard
->regs_bar_base
) {
342 dev_err(&pcard
->pdev
->dev
,
343 "probe: REG_BAR could not remap memory to virtual space\n");
345 goto err_disable_device
;
347 dev_dbg(&pcard
->pdev
->dev
,
348 "probe: REG_BAR virt hardware address start [%p]\n",
349 pcard
->regs_bar_base
);
351 err
= pci_request_region(pcard
->pdev
, REG_BAR
, KP_DRIVER_NAME_KP2000
);
353 dev_err(&pcard
->pdev
->dev
,
354 "probe: failed to acquire PCI region (%d)\n",
360 pcard
->regs_base_resource
.start
= reg_bar_phys_addr
;
361 pcard
->regs_base_resource
.end
= reg_bar_phys_addr
+
362 reg_bar_phys_len
- 1;
363 pcard
->regs_base_resource
.flags
= IORESOURCE_MEM
;
365 /* Setup the DMA BAR */
366 dma_bar_phys_addr
= pci_resource_start(pcard
->pdev
, DMA_BAR
);
367 dma_bar_phys_len
= pci_resource_len(pcard
->pdev
, DMA_BAR
);
369 pcard
->dma_bar_base
= ioremap(dma_bar_phys_addr
,
371 if (!pcard
->dma_bar_base
) {
372 dev_err(&pcard
->pdev
->dev
,
373 "probe: DMA_BAR could not remap memory to virtual space\n");
375 goto err_release_regs
;
377 dev_dbg(&pcard
->pdev
->dev
,
378 "probe: DMA_BAR virt hardware address start [%p]\n",
379 pcard
->dma_bar_base
);
381 pcard
->dma_common_regs
= pcard
->dma_bar_base
+ KPC_DMA_COMMON_OFFSET
;
383 err
= pci_request_region(pcard
->pdev
, DMA_BAR
, "kp2000_pcie");
385 dev_err(&pcard
->pdev
->dev
,
386 "probe: failed to acquire PCI region (%d)\n", err
);
391 pcard
->dma_base_resource
.start
= dma_bar_phys_addr
;
392 pcard
->dma_base_resource
.end
= dma_bar_phys_addr
+
393 dma_bar_phys_len
- 1;
394 pcard
->dma_base_resource
.flags
= IORESOURCE_MEM
;
396 /* Read System Regs */
397 pcard
->sysinfo_regs_base
= pcard
->regs_bar_base
;
398 err
= read_system_regs(pcard
);
400 goto err_release_dma
;
402 // Disable all "user" interrupts because they're not used yet.
403 writeq(0xFFFFFFFFFFFFFFFFUL
,
404 pcard
->sysinfo_regs_base
+ REG_INTERRUPT_MASK
);
406 // let the card master PCIe
407 pci_set_master(pcard
->pdev
);
409 // enable IO and mem if not already done
410 pci_read_config_word(pcard
->pdev
, PCI_COMMAND
, ®val
);
411 regval
|= (PCI_COMMAND_IO
| PCI_COMMAND_MEMORY
);
412 pci_write_config_word(pcard
->pdev
, PCI_COMMAND
, regval
);
414 // Clear relaxed ordering bit
415 pcie_capability_clear_and_set_word(pcard
->pdev
, PCI_EXP_DEVCTL
,
416 PCI_EXP_DEVCTL_RELAX_EN
, 0);
418 // Set Max_Payload_Size and Max_Read_Request_Size
419 regval
= (0x0) << 5; // Max_Payload_Size = 128 B
420 pcie_capability_clear_and_set_word(pcard
->pdev
, PCI_EXP_DEVCTL
,
421 PCI_EXP_DEVCTL_PAYLOAD
, regval
);
422 regval
= (0x0) << 12; // Max_Read_Request_Size = 128 B
423 pcie_capability_clear_and_set_word(pcard
->pdev
, PCI_EXP_DEVCTL
,
424 PCI_EXP_DEVCTL_READRQ
, regval
);
426 // Enable error reporting for: Correctable Errors, Non-Fatal Errors,
427 // Fatal Errors, Unsupported Requests
428 pcie_capability_clear_and_set_word(pcard
->pdev
, PCI_EXP_DEVCTL
, 0,
429 PCI_EXP_DEVCTL_CERE
|
430 PCI_EXP_DEVCTL_NFERE
|
431 PCI_EXP_DEVCTL_FERE
|
432 PCI_EXP_DEVCTL_URRE
);
434 err
= dma_set_mask(PCARD_TO_DEV(pcard
), DMA_BIT_MASK(64));
436 dev_err(&pcard
->pdev
->dev
,
437 "CANNOT use DMA mask %0llx\n", DMA_BIT_MASK(64));
438 goto err_release_dma
;
440 dev_dbg(&pcard
->pdev
->dev
,
441 "Using DMA mask %0llx\n", dma_get_mask(PCARD_TO_DEV(pcard
)));
443 err
= pci_enable_msi(pcard
->pdev
);
445 goto err_release_dma
;
447 err
= request_irq(pcard
->pdev
->irq
, kp2000_irq_handler
, IRQF_SHARED
,
450 dev_err(&pcard
->pdev
->dev
,
451 "%s: failed to request_irq: %d\n", __func__
, err
);
452 goto err_disable_msi
;
455 err
= sysfs_create_files(&pdev
->dev
.kobj
, kp_attr_list
);
457 dev_err(&pdev
->dev
, "Failed to add sysfs files: %d\n", err
);
461 err
= kp2000_probe_cores(pcard
);
463 goto err_remove_sysfs
;
465 /* Enable IRQs in HW */
466 writel(KPC_DMA_CARD_IRQ_ENABLE
| KPC_DMA_CARD_USER_INTERRUPT_MODE
,
467 pcard
->dma_common_regs
);
469 mutex_unlock(&pcard
->sem
);
473 sysfs_remove_files(&pdev
->dev
.kobj
, kp_attr_list
);
475 free_irq(pcard
->pdev
->irq
, pcard
);
477 pci_disable_msi(pcard
->pdev
);
479 pci_release_region(pdev
, DMA_BAR
);
481 iounmap(pcard
->dma_bar_base
);
483 pci_release_region(pdev
, REG_BAR
);
485 iounmap(pcard
->regs_bar_base
);
487 pci_disable_device(pcard
->pdev
);
489 mutex_unlock(&pcard
->sem
);
490 ida_simple_remove(&card_num_ida
, pcard
->card_num
);
496 static void kp2000_pcie_remove(struct pci_dev
*pdev
)
498 struct kp2000_device
*pcard
= pci_get_drvdata(pdev
);
503 mutex_lock(&pcard
->sem
);
504 kp2000_remove_cores(pcard
);
505 mfd_remove_devices(PCARD_TO_DEV(pcard
));
506 sysfs_remove_files(&pdev
->dev
.kobj
, kp_attr_list
);
507 free_irq(pcard
->pdev
->irq
, pcard
);
508 pci_disable_msi(pcard
->pdev
);
509 if (pcard
->dma_bar_base
) {
510 iounmap(pcard
->dma_bar_base
);
511 pci_release_region(pdev
, DMA_BAR
);
512 pcard
->dma_bar_base
= NULL
;
514 if (pcard
->regs_bar_base
) {
515 iounmap(pcard
->regs_bar_base
);
516 pci_release_region(pdev
, REG_BAR
);
517 pcard
->regs_bar_base
= NULL
;
519 pci_disable_device(pcard
->pdev
);
520 pci_set_drvdata(pdev
, NULL
);
521 mutex_unlock(&pcard
->sem
);
522 ida_simple_remove(&card_num_ida
, pcard
->card_num
);
526 struct class *kpc_uio_class
;
527 ATTRIBUTE_GROUPS(kpc_uio_class
);
529 static const struct pci_device_id kp2000_pci_device_ids
[] = {
530 { PCI_DEVICE(PCI_VENDOR_ID_DAKTRONICS
, PCI_DEVICE_ID_DAKTRONICS
) },
531 { PCI_DEVICE(PCI_VENDOR_ID_DAKTRONICS
, PCI_DEVICE_ID_DAKTRONICS_KADOKA_P2KR0
) },
534 MODULE_DEVICE_TABLE(pci
, kp2000_pci_device_ids
);
536 static struct pci_driver kp2000_driver_inst
= {
537 .name
= "kp2000_pcie",
538 .id_table
= kp2000_pci_device_ids
,
539 .probe
= kp2000_pcie_probe
,
540 .remove
= kp2000_pcie_remove
,
543 static int __init
kp2000_pcie_init(void)
545 kpc_uio_class
= class_create(THIS_MODULE
, "kpc_uio");
546 if (IS_ERR(kpc_uio_class
))
547 return PTR_ERR(kpc_uio_class
);
549 kpc_uio_class
->dev_groups
= kpc_uio_class_groups
;
550 return pci_register_driver(&kp2000_driver_inst
);
552 module_init(kp2000_pcie_init
);
554 static void __exit
kp2000_pcie_exit(void)
556 pci_unregister_driver(&kp2000_driver_inst
);
557 class_destroy(kpc_uio_class
);
558 ida_destroy(&card_num_ida
);
560 module_exit(kp2000_pcie_exit
);
562 MODULE_LICENSE("GPL");
563 MODULE_AUTHOR("Lee.Brooke@Daktronics.com, Matt.Sickler@Daktronics.com");
564 MODULE_SOFTDEP("pre: uio post: kpc_nwl_dma kpc_i2c kpc_spi");