19 #include <linux/kernel.h>
20 #include <linux/module.h>
25 #include <linux/slab.h>
35 static const char drv_name[] =
"carma-fpga-program";
43 #define FW_SIZE_EP2S90 12849552
44 #define FW_SIZE_EP2S130 18662880
85 static void fpga_drop_firmware_data(
struct fpga_dev *
priv)
96 static void fpga_dev_remove(
struct kref *ref)
101 fpga_drop_firmware_data(priv);
118 static void ledtrig_fpga_programmed(
bool enabled)
131 #define FPGA_CONFIG_CONTROL 0x40
132 #define FPGA_CONFIG_STATUS 0x44
133 #define FPGA_CONFIG_FIFO_SIZE 0x48
134 #define FPGA_CONFIG_FIFO_USED 0x4C
135 #define FPGA_CONFIG_TOTAL_BYTE_COUNT 0x50
136 #define FPGA_CONFIG_CUR_BYTE_COUNT 0x54
138 #define FPGA_FIFO_ADDRESS 0x3000
145 #define CFG_STATUS_ERR_MASK 0xfffe
167 #define CFG_CTL_ENABLE (1 << 0)
168 #define CFG_CTL_RESET (1 << 1)
169 #define CFG_CTL_DMA (1 << 2)
179 static void fpga_programmer_disable(
struct fpga_dev *
priv)
200 dev_err(priv->
dev,
"Configuration failed, dumping status registers\n");
201 dev_err(priv->
dev,
"Control: 0x%.8x\n", control);
202 dev_err(priv->
dev,
"Status: 0x%.8x\n", status);
203 dev_err(priv->
dev,
"FIFO Size: 0x%.8x\n", size);
204 dev_err(priv->
dev,
"FIFO Used: 0x%.8x\n", used);
205 dev_err(priv->
dev,
"FIFO Total: 0x%.8x\n", total);
206 dev_err(priv->
dev,
"FIFO Curr: 0x%.8x\n", curr);
213 #define CTL_PWR_CONTROL 0x2006
214 #define CTL_PWR_STATUS 0x200A
215 #define CTL_PWR_FAIL 0x200B
217 #define PWR_CONTROL_ENABLE 0x01
219 #define PWR_STATUS_ERROR_MASK 0x10
220 #define PWR_STATUS_GOOD 0x0f
225 static bool fpga_power_good(
struct fpga_dev *priv)
239 static void fpga_disable_power_supplies(
struct fpga_dev *priv)
274 "power goods: status 0x%.2x\n", val);
279 "alarm bit set: status 0x%.2x\n", val);
292 static int fpga_enable_power_supplies(
struct fpga_dev *priv)
296 if (fpga_power_good(priv)) {
297 dev_dbg(priv->
dev,
"power was already good\n");
303 if (fpga_power_good(priv))
309 return fpga_power_good(priv) ? 0 : -
ETIMEDOUT;
315 static bool fpga_power_enabled(
struct fpga_dev *priv)
329 static bool fpga_running(
struct fpga_dev *priv)
331 if (!fpga_power_good(priv))
350 static int fpga_program_block(
struct fpga_dev *priv,
void *
buf,
size_t count)
353 int size = fpga_fifo_size(priv->
regs);
363 len =
min_t(
size_t, count, size);
367 for (i = 0; i < len / 4; i++)
368 fpga_fifo_write(priv->
regs, data[i]);
377 if (fpga_fifo_empty(priv->
regs)) {
384 if (fpga_config_error(priv->
regs)) {
416 fpga_programmer_disable(priv);
419 fpga_set_byte_count(priv->
regs, priv->
bytes);
423 fpga_programmer_enable(priv,
false);
424 dev_dbg(priv->
dev,
"enabled the controller\n");
427 ret = fpga_program_block(priv, priv->
vb.vaddr, priv->
bytes);
429 goto out_disable_controller;
434 dev_err(priv->
dev,
"Timed out waiting for completion\n");
436 goto out_disable_controller;
442 out_disable_controller:
443 fpga_programmer_disable(priv);
447 #define FIFO_DMA_ADDRESS 0xf0003000
448 #define FIFO_MAX_LEN 4096
474 fpga_programmer_disable(priv);
480 dev_err(priv->
dev,
"Unable to allocate dst scatterlist\n");
507 dev_err(priv->
dev,
"Unable to map buffer for DMA\n");
515 memset(&config, 0,
sizeof(config));
520 (
unsigned long)&config);
522 dev_err(priv->
dev,
"DMA slave configuration failed\n");
528 dev_err(priv->
dev,
"DMA external control setup failed\n");
533 tx = chan->
device->device_prep_dma_sg(chan,
534 table.
sgl, num_pages,
537 dev_err(priv->
dev,
"Unable to prep DMA transaction\n");
544 dev_err(priv->
dev,
"Unable to submit DMA transaction\n");
552 fpga_set_byte_count(priv->
regs, priv->
bytes);
556 fpga_programmer_enable(priv,
true);
557 dev_dbg(priv->
dev,
"enabled the controller\n");
562 dev_err(priv->
dev,
"Timed out waiting for completion\n");
564 goto out_disable_controller;
570 out_disable_controller:
571 fpga_programmer_disable(priv);
591 fpga_dump_registers(priv);
594 fpga_programmer_disable(priv);
612 static int fpga_do_stop(
struct fpga_dev *priv)
617 ledtrig_fpga_programmed(
false);
632 dev_err(priv->
dev,
"Incorrect bitfile size: got %zu bytes, "
633 "should be %zu bytes\n",
638 if (!fpga_power_enabled(priv)) {
643 if (!fpga_power_good(priv)) {
649 ledtrig_fpga_programmed(
false);
652 ret = fpga_program_dma(priv);
656 dev_warn(priv->
dev,
"Falling back to CPU programming\n");
657 ret = fpga_program_cpu(priv);
661 dev_err(priv->
dev,
"Unable to program FPGA's\n");
666 fpga_drop_firmware_data(priv);
668 dev_dbg(priv->
dev,
"FPGA programming successful\n");
669 ledtrig_fpga_programmed(
true);
687 unsigned int nr_pages;
696 kref_get(&priv->
ref);
710 dev_err(priv->
dev,
"unable to allocate data buffer\n");
712 kref_put(&priv->
ref, fpga_dev_remove);
720 static int fpga_release(
struct inode *inode,
struct file *filp)
725 kref_put(&priv->
ref, fpga_dev_remove);
730 size_t count, loff_t *f_pos)
751 count =
min_t(
size_t, priv->
bytes - *f_pos, count);
786 filp->
f_pos = newpos;
792 .release = fpga_release,
795 .llseek = fpga_llseek,
827 const char *buf,
size_t count)
837 ret = fpga_enable_power_supplies(priv);
842 fpga_disable_power_supplies(priv);
856 const char *buf,
size_t count)
870 ret = val ? fpga_do_program(priv) : fpga_do_stop(priv);
885 penable_show, penable_store);
888 program_show, program_store);
890 static struct attribute *fpga_attributes[] = {
891 &dev_attr_power_fail.attr,
892 &dev_attr_power_good.attr,
893 &dev_attr_power_enable.attr,
894 &dev_attr_program.attr,
899 .attrs = fpga_attributes,
906 #define SYS_REG_VERSION 0x00
907 #define SYS_REG_GEOGRAPHIC 0x10
909 static bool dma_filter(
struct dma_chan *
chan,
void *data)
932 fpga_disable_power_supplies(priv);
941 kref_put(&priv->
ref, fpga_dev_remove);
946 #define CTL_CPLD_VERSION 0x2000
951 struct device *this_device;
960 dev_err(&op->
dev,
"Unable to allocate private data\n");
968 priv->
miscdev.fops = &fpga_fops;
970 kref_init(&priv->
ref);
987 dev_err(&op->
dev,
"Unable to acquire DMA channel #0\n");
995 dev_err(&op->
dev,
"Unable to ioremap registers\n");
997 goto out_dma_release_channel;
1003 dev_err(&op->
dev,
"Unable to ioremap IMMR\n");
1005 goto out_unmap_regs;
1017 dev_err(&op->
dev,
"External DMA control not configured\n");
1019 goto out_unmap_immr;
1033 if (ver != 0x02 && ver != 0x03) {
1034 dev_err(&op->
dev,
"CTL-CPLD is not version 0x02 or 0x03!\n");
1036 goto out_unmap_immr;
1046 dev_err(&op->
dev,
"Unable to find IRQ line\n");
1048 goto out_unmap_immr;
1056 goto out_irq_dispose_mapping;
1065 dev_err(&op->
dev,
"Unable to register miscdevice\n");
1070 this_device = priv->
miscdev.this_device;
1074 dev_err(&op->
dev,
"Unable to create sysfs files\n");
1075 goto out_misc_deregister;
1078 dev_info(priv->
dev,
"CARMA FPGA Programmer: %s rev%s with %s FPGAs\n",
1079 (ver & (1 << 17)) ?
"Correlator" :
"Digitizer",
1080 (ver & (1 << 16)) ?
"B" :
"A",
1081 (ver & (1 << 18)) ?
"EP2S130" :
"EP2S90");
1085 out_misc_deregister:
1089 out_irq_dispose_mapping:
1095 out_dma_release_channel:
1098 kref_put(&priv->
ref, fpga_dev_remove);
1104 { .compatible =
"carma,fpga-programmer", },
1109 .probe = fpga_of_probe,
1110 .remove = fpga_of_remove,
1113 .of_match_table = fpga_of_match,
1128 static void __exit fpga_exit(
void)