blob: 7be89832db19f90ca2e1182fe91b77fa08efcea1 [file] [log] [blame]
Ira Snyder0e1d7152011-02-11 13:34:30 +00001/*
2 * CARMA Board DATA-FPGA Programmer
3 *
4 * Copyright (c) 2009-2011 Ira W. Snyder <iws@ovro.caltech.edu>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version.
10 */
11
12#include <linux/dma-mapping.h>
Rob Herring5af50732013-09-17 14:28:33 -050013#include <linux/of_address.h>
14#include <linux/of_irq.h>
Ira Snyder0e1d7152011-02-11 13:34:30 +000015#include <linux/of_platform.h>
16#include <linux/completion.h>
17#include <linux/miscdevice.h>
18#include <linux/dmaengine.h>
19#include <linux/interrupt.h>
20#include <linux/highmem.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/mutex.h>
24#include <linux/delay.h>
25#include <linux/init.h>
26#include <linux/leds.h>
27#include <linux/slab.h>
28#include <linux/kref.h>
29#include <linux/fs.h>
30#include <linux/io.h>
31
32#include <media/videobuf-dma-sg.h>
33
34/* MPC8349EMDS specific get_immrbase() */
35#include <sysdev/fsl_soc.h>
36
37static const char drv_name[] = "carma-fpga-program";
38
39/*
40 * Firmware images are always this exact size
41 *
42 * 12849552 bytes for a CARMA Digitizer Board (EP2S90 FPGAs)
43 * 18662880 bytes for a CARMA Correlator Board (EP2S130 FPGAs)
44 */
45#define FW_SIZE_EP2S90 12849552
46#define FW_SIZE_EP2S130 18662880
47
48struct fpga_dev {
49 struct miscdevice miscdev;
50
51 /* Reference count */
52 struct kref ref;
53
54 /* Device Registers */
55 struct device *dev;
56 void __iomem *regs;
57 void __iomem *immr;
58
59 /* Freescale DMA Device */
60 struct dma_chan *chan;
61
62 /* Interrupts */
63 int irq, status;
64 struct completion completion;
65
66 /* FPGA Bitfile */
67 struct mutex lock;
68
69 struct videobuf_dmabuf vb;
70 bool vb_allocated;
71
72 /* max size and written bytes */
73 size_t fw_size;
74 size_t bytes;
75};
76
77/*
78 * FPGA Bitfile Helpers
79 */
80
81/**
82 * fpga_drop_firmware_data() - drop the bitfile image from memory
83 * @priv: the driver's private data structure
84 *
85 * LOCKING: must hold priv->lock
86 */
87static void fpga_drop_firmware_data(struct fpga_dev *priv)
88{
89 videobuf_dma_free(&priv->vb);
90 priv->vb_allocated = false;
91 priv->bytes = 0;
92}
93
94/*
95 * Private Data Reference Count
96 */
97
98static void fpga_dev_remove(struct kref *ref)
99{
100 struct fpga_dev *priv = container_of(ref, struct fpga_dev, ref);
101
102 /* free any firmware image that was not programmed */
103 fpga_drop_firmware_data(priv);
104
105 mutex_destroy(&priv->lock);
106 kfree(priv);
107}
108
109/*
110 * LED Trigger (could be a seperate module)
111 */
112
113/*
114 * NOTE: this whole thing does have the problem that whenever the led's are
115 * NOTE: first set to use the fpga trigger, they could be in the wrong state
116 */
117
118DEFINE_LED_TRIGGER(ledtrig_fpga);
119
120static void ledtrig_fpga_programmed(bool enabled)
121{
122 if (enabled)
123 led_trigger_event(ledtrig_fpga, LED_FULL);
124 else
125 led_trigger_event(ledtrig_fpga, LED_OFF);
126}
127
128/*
129 * FPGA Register Helpers
130 */
131
132/* Register Definitions */
133#define FPGA_CONFIG_CONTROL 0x40
134#define FPGA_CONFIG_STATUS 0x44
135#define FPGA_CONFIG_FIFO_SIZE 0x48
136#define FPGA_CONFIG_FIFO_USED 0x4C
137#define FPGA_CONFIG_TOTAL_BYTE_COUNT 0x50
138#define FPGA_CONFIG_CUR_BYTE_COUNT 0x54
139
140#define FPGA_FIFO_ADDRESS 0x3000
141
142static int fpga_fifo_size(void __iomem *regs)
143{
144 return ioread32be(regs + FPGA_CONFIG_FIFO_SIZE);
145}
146
147#define CFG_STATUS_ERR_MASK 0xfffe
148
149static int fpga_config_error(void __iomem *regs)
150{
151 return ioread32be(regs + FPGA_CONFIG_STATUS) & CFG_STATUS_ERR_MASK;
152}
153
154static int fpga_fifo_empty(void __iomem *regs)
155{
156 return ioread32be(regs + FPGA_CONFIG_FIFO_USED) == 0;
157}
158
159static void fpga_fifo_write(void __iomem *regs, u32 val)
160{
161 iowrite32be(val, regs + FPGA_FIFO_ADDRESS);
162}
163
164static void fpga_set_byte_count(void __iomem *regs, u32 count)
165{
166 iowrite32be(count, regs + FPGA_CONFIG_TOTAL_BYTE_COUNT);
167}
168
169#define CFG_CTL_ENABLE (1 << 0)
170#define CFG_CTL_RESET (1 << 1)
171#define CFG_CTL_DMA (1 << 2)
172
173static void fpga_programmer_enable(struct fpga_dev *priv, bool dma)
174{
175 u32 val;
176
177 val = (dma) ? (CFG_CTL_ENABLE | CFG_CTL_DMA) : CFG_CTL_ENABLE;
178 iowrite32be(val, priv->regs + FPGA_CONFIG_CONTROL);
179}
180
181static void fpga_programmer_disable(struct fpga_dev *priv)
182{
183 iowrite32be(0x0, priv->regs + FPGA_CONFIG_CONTROL);
184}
185
186static void fpga_dump_registers(struct fpga_dev *priv)
187{
188 u32 control, status, size, used, total, curr;
189
190 /* good status: do nothing */
191 if (priv->status == 0)
192 return;
193
194 /* Dump all status registers */
195 control = ioread32be(priv->regs + FPGA_CONFIG_CONTROL);
196 status = ioread32be(priv->regs + FPGA_CONFIG_STATUS);
197 size = ioread32be(priv->regs + FPGA_CONFIG_FIFO_SIZE);
198 used = ioread32be(priv->regs + FPGA_CONFIG_FIFO_USED);
199 total = ioread32be(priv->regs + FPGA_CONFIG_TOTAL_BYTE_COUNT);
200 curr = ioread32be(priv->regs + FPGA_CONFIG_CUR_BYTE_COUNT);
201
202 dev_err(priv->dev, "Configuration failed, dumping status registers\n");
203 dev_err(priv->dev, "Control: 0x%.8x\n", control);
204 dev_err(priv->dev, "Status: 0x%.8x\n", status);
205 dev_err(priv->dev, "FIFO Size: 0x%.8x\n", size);
206 dev_err(priv->dev, "FIFO Used: 0x%.8x\n", used);
207 dev_err(priv->dev, "FIFO Total: 0x%.8x\n", total);
208 dev_err(priv->dev, "FIFO Curr: 0x%.8x\n", curr);
209}
210
211/*
212 * FPGA Power Supply Code
213 */
214
215#define CTL_PWR_CONTROL 0x2006
216#define CTL_PWR_STATUS 0x200A
217#define CTL_PWR_FAIL 0x200B
218
219#define PWR_CONTROL_ENABLE 0x01
220
221#define PWR_STATUS_ERROR_MASK 0x10
222#define PWR_STATUS_GOOD 0x0f
223
224/*
225 * Determine if the FPGA power is good for all supplies
226 */
227static bool fpga_power_good(struct fpga_dev *priv)
228{
229 u8 val;
230
231 val = ioread8(priv->regs + CTL_PWR_STATUS);
232 if (val & PWR_STATUS_ERROR_MASK)
233 return false;
234
235 return val == PWR_STATUS_GOOD;
236}
237
238/*
239 * Disable the FPGA power supplies
240 */
241static void fpga_disable_power_supplies(struct fpga_dev *priv)
242{
243 unsigned long start;
244 u8 val;
245
246 iowrite8(0x0, priv->regs + CTL_PWR_CONTROL);
247
248 /*
249 * Wait 500ms for the power rails to discharge
250 *
251 * Without this delay, the CTL-CPLD state machine can get into a
252 * state where it is waiting for the power-goods to assert, but they
253 * never do. This only happens when enabling and disabling the
254 * power sequencer very rapidly.
255 *
256 * The loop below will also wait for the power goods to de-assert,
257 * but testing has shown that they are always disabled by the time
258 * the sleep completes. However, omitting the sleep and only waiting
259 * for the power-goods to de-assert was not sufficient to ensure
260 * that the power sequencer would not wedge itself.
261 */
262 msleep(500);
263
264 start = jiffies;
265 while (time_before(jiffies, start + HZ)) {
266 val = ioread8(priv->regs + CTL_PWR_STATUS);
267 if (!(val & PWR_STATUS_GOOD))
268 break;
269
270 usleep_range(5000, 10000);
271 }
272
273 val = ioread8(priv->regs + CTL_PWR_STATUS);
274 if (val & PWR_STATUS_GOOD) {
275 dev_err(priv->dev, "power disable failed: "
276 "power goods: status 0x%.2x\n", val);
277 }
278
279 if (val & PWR_STATUS_ERROR_MASK) {
280 dev_err(priv->dev, "power disable failed: "
281 "alarm bit set: status 0x%.2x\n", val);
282 }
283}
284
285/**
286 * fpga_enable_power_supplies() - enable the DATA-FPGA power supplies
287 * @priv: the driver's private data structure
288 *
289 * Enable the DATA-FPGA power supplies, waiting up to 1 second for
290 * them to enable successfully.
291 *
292 * Returns 0 on success, -ERRNO otherwise
293 */
294static int fpga_enable_power_supplies(struct fpga_dev *priv)
295{
296 unsigned long start = jiffies;
297
298 if (fpga_power_good(priv)) {
299 dev_dbg(priv->dev, "power was already good\n");
300 return 0;
301 }
302
303 iowrite8(PWR_CONTROL_ENABLE, priv->regs + CTL_PWR_CONTROL);
304 while (time_before(jiffies, start + HZ)) {
305 if (fpga_power_good(priv))
306 return 0;
307
308 usleep_range(5000, 10000);
309 }
310
311 return fpga_power_good(priv) ? 0 : -ETIMEDOUT;
312}
313
314/*
315 * Determine if the FPGA power supplies are all enabled
316 */
317static bool fpga_power_enabled(struct fpga_dev *priv)
318{
319 u8 val;
320
321 val = ioread8(priv->regs + CTL_PWR_CONTROL);
322 if (val & PWR_CONTROL_ENABLE)
323 return true;
324
325 return false;
326}
327
328/*
329 * Determine if the FPGA's are programmed and running correctly
330 */
331static bool fpga_running(struct fpga_dev *priv)
332{
333 if (!fpga_power_good(priv))
334 return false;
335
336 /* Check the config done bit */
337 return ioread32be(priv->regs + FPGA_CONFIG_STATUS) & (1 << 18);
338}
339
340/*
341 * FPGA Programming Code
342 */
343
344/**
345 * fpga_program_block() - put a block of data into the programmer's FIFO
346 * @priv: the driver's private data structure
347 * @buf: the data to program
348 * @count: the length of data to program (must be a multiple of 4 bytes)
349 *
350 * Returns 0 on success, -ERRNO otherwise
351 */
352static int fpga_program_block(struct fpga_dev *priv, void *buf, size_t count)
353{
354 u32 *data = buf;
355 int size = fpga_fifo_size(priv->regs);
356 int i, len;
357 unsigned long timeout;
358
359 /* enforce correct data length for the FIFO */
360 BUG_ON(count % 4 != 0);
361
362 while (count > 0) {
363
364 /* Get the size of the block to write (maximum is FIFO_SIZE) */
365 len = min_t(size_t, count, size);
366 timeout = jiffies + HZ / 4;
367
368 /* Write the block */
369 for (i = 0; i < len / 4; i++)
370 fpga_fifo_write(priv->regs, data[i]);
371
372 /* Update the amounts left */
373 count -= len;
374 data += len / 4;
375
376 /* Wait for the fifo to empty */
377 while (true) {
378
379 if (fpga_fifo_empty(priv->regs)) {
380 break;
381 } else {
382 dev_dbg(priv->dev, "Fifo not empty\n");
383 cpu_relax();
384 }
385
386 if (fpga_config_error(priv->regs)) {
387 dev_err(priv->dev, "Error detected\n");
388 return -EIO;
389 }
390
391 if (time_after(jiffies, timeout)) {
392 dev_err(priv->dev, "Fifo drain timeout\n");
393 return -ETIMEDOUT;
394 }
395
396 usleep_range(5000, 10000);
397 }
398 }
399
400 return 0;
401}
402
403/**
404 * fpga_program_cpu() - program the DATA-FPGA's using the CPU
405 * @priv: the driver's private data structure
406 *
407 * This is useful when the DMA programming method fails. It is possible to
408 * wedge the Freescale DMA controller such that the DMA programming method
409 * always fails. This method has always succeeded.
410 *
411 * Returns 0 on success, -ERRNO otherwise
412 */
413static noinline int fpga_program_cpu(struct fpga_dev *priv)
414{
415 int ret;
416
417 /* Disable the programmer */
418 fpga_programmer_disable(priv);
419
420 /* Set the total byte count */
421 fpga_set_byte_count(priv->regs, priv->bytes);
422 dev_dbg(priv->dev, "total byte count %u bytes\n", priv->bytes);
423
424 /* Enable the controller for programming */
425 fpga_programmer_enable(priv, false);
426 dev_dbg(priv->dev, "enabled the controller\n");
427
428 /* Write each chunk of the FPGA bitfile to FPGA programmer */
429 ret = fpga_program_block(priv, priv->vb.vaddr, priv->bytes);
430 if (ret)
431 goto out_disable_controller;
432
433 /* Wait for the interrupt handler to signal that programming finished */
434 ret = wait_for_completion_timeout(&priv->completion, 2 * HZ);
435 if (!ret) {
436 dev_err(priv->dev, "Timed out waiting for completion\n");
437 ret = -ETIMEDOUT;
438 goto out_disable_controller;
439 }
440
441 /* Retrieve the status from the interrupt handler */
442 ret = priv->status;
443
444out_disable_controller:
445 fpga_programmer_disable(priv);
446 return ret;
447}
448
449#define FIFO_DMA_ADDRESS 0xf0003000
450#define FIFO_MAX_LEN 4096
451
452/**
453 * fpga_program_dma() - program the DATA-FPGA's using the DMA engine
454 * @priv: the driver's private data structure
455 *
456 * Program the DATA-FPGA's using the Freescale DMA engine. This requires that
457 * the engine is programmed such that the hardware DMA request lines can
458 * control the entire DMA transaction. The system controller FPGA then
459 * completely offloads the programming from the CPU.
460 *
461 * Returns 0 on success, -ERRNO otherwise
462 */
463static noinline int fpga_program_dma(struct fpga_dev *priv)
464{
465 struct videobuf_dmabuf *vb = &priv->vb;
466 struct dma_chan *chan = priv->chan;
467 struct dma_async_tx_descriptor *tx;
468 size_t num_pages, len, avail = 0;
469 struct dma_slave_config config;
470 struct scatterlist *sg;
471 struct sg_table table;
472 dma_cookie_t cookie;
473 int ret, i;
474
475 /* Disable the programmer */
476 fpga_programmer_disable(priv);
477
478 /* Allocate a scatterlist for the DMA destination */
479 num_pages = DIV_ROUND_UP(priv->bytes, FIFO_MAX_LEN);
480 ret = sg_alloc_table(&table, num_pages, GFP_KERNEL);
481 if (ret) {
482 dev_err(priv->dev, "Unable to allocate dst scatterlist\n");
483 ret = -ENOMEM;
484 goto out_return;
485 }
486
487 /*
488 * This is an ugly hack
489 *
490 * We fill in a scatterlist as if it were mapped for DMA. This is
491 * necessary because there exists no better structure for this
492 * inside the kernel code.
493 *
494 * As an added bonus, we can use the DMAEngine API for all of this,
495 * rather than inventing another extremely similar API.
496 */
497 avail = priv->bytes;
498 for_each_sg(table.sgl, sg, num_pages, i) {
499 len = min_t(size_t, avail, FIFO_MAX_LEN);
500 sg_dma_address(sg) = FIFO_DMA_ADDRESS;
501 sg_dma_len(sg) = len;
502
503 avail -= len;
504 }
505
506 /* Map the buffer for DMA */
507 ret = videobuf_dma_map(priv->dev, &priv->vb);
508 if (ret) {
509 dev_err(priv->dev, "Unable to map buffer for DMA\n");
510 goto out_free_table;
511 }
512
513 /*
514 * Configure the DMA channel to transfer FIFO_SIZE / 2 bytes per
515 * transaction, and then put it under external control
516 */
517 memset(&config, 0, sizeof(config));
Vinod Koul1d0c81e2011-10-14 10:42:56 +0530518 config.direction = DMA_MEM_TO_DEV;
Ira Snyder0e1d7152011-02-11 13:34:30 +0000519 config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
520 config.dst_maxburst = fpga_fifo_size(priv->regs) / 2 / 4;
521 ret = chan->device->device_control(chan, DMA_SLAVE_CONFIG,
522 (unsigned long)&config);
523 if (ret) {
524 dev_err(priv->dev, "DMA slave configuration failed\n");
525 goto out_dma_unmap;
526 }
527
528 ret = chan->device->device_control(chan, FSLDMA_EXTERNAL_START, 1);
529 if (ret) {
530 dev_err(priv->dev, "DMA external control setup failed\n");
531 goto out_dma_unmap;
532 }
533
534 /* setup and submit the DMA transaction */
535 tx = chan->device->device_prep_dma_sg(chan,
536 table.sgl, num_pages,
537 vb->sglist, vb->sglen, 0);
538 if (!tx) {
539 dev_err(priv->dev, "Unable to prep DMA transaction\n");
540 ret = -ENOMEM;
541 goto out_dma_unmap;
542 }
543
544 cookie = tx->tx_submit(tx);
545 if (dma_submit_error(cookie)) {
546 dev_err(priv->dev, "Unable to submit DMA transaction\n");
547 ret = -ENOMEM;
548 goto out_dma_unmap;
549 }
550
Bartlomiej Zolnierkiewiczb9ee8682012-11-08 09:59:54 +0000551 dma_async_issue_pending(chan);
Ira Snyder0e1d7152011-02-11 13:34:30 +0000552
553 /* Set the total byte count */
554 fpga_set_byte_count(priv->regs, priv->bytes);
555 dev_dbg(priv->dev, "total byte count %u bytes\n", priv->bytes);
556
557 /* Enable the controller for DMA programming */
558 fpga_programmer_enable(priv, true);
559 dev_dbg(priv->dev, "enabled the controller\n");
560
561 /* Wait for the interrupt handler to signal that programming finished */
562 ret = wait_for_completion_timeout(&priv->completion, 2 * HZ);
563 if (!ret) {
564 dev_err(priv->dev, "Timed out waiting for completion\n");
565 ret = -ETIMEDOUT;
566 goto out_disable_controller;
567 }
568
569 /* Retrieve the status from the interrupt handler */
570 ret = priv->status;
571
572out_disable_controller:
573 fpga_programmer_disable(priv);
574out_dma_unmap:
575 videobuf_dma_unmap(priv->dev, vb);
576out_free_table:
577 sg_free_table(&table);
578out_return:
579 return ret;
580}
581
582/*
583 * Interrupt Handling
584 */
585
586static irqreturn_t fpga_irq(int irq, void *dev_id)
587{
588 struct fpga_dev *priv = dev_id;
589
590 /* Save the status */
591 priv->status = fpga_config_error(priv->regs) ? -EIO : 0;
592 dev_dbg(priv->dev, "INTERRUPT status %d\n", priv->status);
593 fpga_dump_registers(priv);
594
595 /* Disabling the programmer clears the interrupt */
596 fpga_programmer_disable(priv);
597
598 /* Notify any waiters */
599 complete(&priv->completion);
600
601 return IRQ_HANDLED;
602}
603
604/*
605 * SYSFS Helpers
606 */
607
608/**
609 * fpga_do_stop() - deconfigure (reset) the DATA-FPGA's
610 * @priv: the driver's private data structure
611 *
612 * LOCKING: must hold priv->lock
613 */
614static int fpga_do_stop(struct fpga_dev *priv)
615{
616 u32 val;
617
618 /* Set the led to unprogrammed */
619 ledtrig_fpga_programmed(false);
620
621 /* Pulse the config line to reset the FPGA's */
622 val = CFG_CTL_ENABLE | CFG_CTL_RESET;
623 iowrite32be(val, priv->regs + FPGA_CONFIG_CONTROL);
624 iowrite32be(0x0, priv->regs + FPGA_CONFIG_CONTROL);
625
626 return 0;
627}
628
629static noinline int fpga_do_program(struct fpga_dev *priv)
630{
631 int ret;
632
633 if (priv->bytes != priv->fw_size) {
634 dev_err(priv->dev, "Incorrect bitfile size: got %zu bytes, "
635 "should be %zu bytes\n",
636 priv->bytes, priv->fw_size);
637 return -EINVAL;
638 }
639
640 if (!fpga_power_enabled(priv)) {
641 dev_err(priv->dev, "Power not enabled\n");
642 return -EINVAL;
643 }
644
645 if (!fpga_power_good(priv)) {
646 dev_err(priv->dev, "Power not good\n");
647 return -EINVAL;
648 }
649
650 /* Set the LED to unprogrammed */
651 ledtrig_fpga_programmed(false);
652
653 /* Try to program the FPGA's using DMA */
654 ret = fpga_program_dma(priv);
655
656 /* If DMA failed or doesn't exist, try with CPU */
657 if (ret) {
658 dev_warn(priv->dev, "Falling back to CPU programming\n");
659 ret = fpga_program_cpu(priv);
660 }
661
662 if (ret) {
663 dev_err(priv->dev, "Unable to program FPGA's\n");
664 return ret;
665 }
666
667 /* Drop the firmware bitfile from memory */
668 fpga_drop_firmware_data(priv);
669
670 dev_dbg(priv->dev, "FPGA programming successful\n");
671 ledtrig_fpga_programmed(true);
672
673 return 0;
674}
675
676/*
677 * File Operations
678 */
679
680static int fpga_open(struct inode *inode, struct file *filp)
681{
682 /*
683 * The miscdevice layer puts our struct miscdevice into the
684 * filp->private_data field. We use this to find our private
685 * data and then overwrite it with our own private structure.
686 */
687 struct fpga_dev *priv = container_of(filp->private_data,
688 struct fpga_dev, miscdev);
689 unsigned int nr_pages;
690 int ret;
691
692 /* We only allow one process at a time */
693 ret = mutex_lock_interruptible(&priv->lock);
694 if (ret)
695 return ret;
696
697 filp->private_data = priv;
698 kref_get(&priv->ref);
699
700 /* Truncation: drop any existing data */
701 if (filp->f_flags & O_TRUNC)
702 priv->bytes = 0;
703
704 /* Check if we have already allocated a buffer */
705 if (priv->vb_allocated)
706 return 0;
707
708 /* Allocate a buffer to hold enough data for the bitfile */
709 nr_pages = DIV_ROUND_UP(priv->fw_size, PAGE_SIZE);
710 ret = videobuf_dma_init_kernel(&priv->vb, DMA_TO_DEVICE, nr_pages);
711 if (ret) {
712 dev_err(priv->dev, "unable to allocate data buffer\n");
713 mutex_unlock(&priv->lock);
714 kref_put(&priv->ref, fpga_dev_remove);
715 return ret;
716 }
717
718 priv->vb_allocated = true;
719 return 0;
720}
721
722static int fpga_release(struct inode *inode, struct file *filp)
723{
724 struct fpga_dev *priv = filp->private_data;
725
726 mutex_unlock(&priv->lock);
727 kref_put(&priv->ref, fpga_dev_remove);
728 return 0;
729}
730
731static ssize_t fpga_write(struct file *filp, const char __user *buf,
732 size_t count, loff_t *f_pos)
733{
734 struct fpga_dev *priv = filp->private_data;
735
736 /* FPGA bitfiles have an exact size: disallow anything else */
737 if (priv->bytes >= priv->fw_size)
738 return -ENOSPC;
739
740 count = min_t(size_t, priv->fw_size - priv->bytes, count);
741 if (copy_from_user(priv->vb.vaddr + priv->bytes, buf, count))
742 return -EFAULT;
743
744 priv->bytes += count;
745 return count;
746}
747
748static ssize_t fpga_read(struct file *filp, char __user *buf, size_t count,
749 loff_t *f_pos)
750{
751 struct fpga_dev *priv = filp->private_data;
752
753 count = min_t(size_t, priv->bytes - *f_pos, count);
754 if (copy_to_user(buf, priv->vb.vaddr + *f_pos, count))
755 return -EFAULT;
756
757 *f_pos += count;
758 return count;
759}
760
761static loff_t fpga_llseek(struct file *filp, loff_t offset, int origin)
762{
763 struct fpga_dev *priv = filp->private_data;
764 loff_t newpos;
765
766 /* only read-only opens are allowed to seek */
767 if ((filp->f_flags & O_ACCMODE) != O_RDONLY)
768 return -EINVAL;
769
770 switch (origin) {
771 case SEEK_SET: /* seek relative to the beginning of the file */
772 newpos = offset;
773 break;
774 case SEEK_CUR: /* seek relative to current position in the file */
775 newpos = filp->f_pos + offset;
776 break;
777 case SEEK_END: /* seek relative to the end of the file */
778 newpos = priv->fw_size - offset;
779 break;
780 default:
781 return -EINVAL;
782 }
783
784 /* check for sanity */
785 if (newpos > priv->fw_size)
786 return -EINVAL;
787
788 filp->f_pos = newpos;
789 return newpos;
790}
791
792static const struct file_operations fpga_fops = {
793 .open = fpga_open,
794 .release = fpga_release,
795 .write = fpga_write,
796 .read = fpga_read,
797 .llseek = fpga_llseek,
798};
799
800/*
801 * Device Attributes
802 */
803
804static ssize_t pfail_show(struct device *dev, struct device_attribute *attr,
805 char *buf)
806{
807 struct fpga_dev *priv = dev_get_drvdata(dev);
808 u8 val;
809
810 val = ioread8(priv->regs + CTL_PWR_FAIL);
811 return snprintf(buf, PAGE_SIZE, "0x%.2x\n", val);
812}
813
814static ssize_t pgood_show(struct device *dev, struct device_attribute *attr,
815 char *buf)
816{
817 struct fpga_dev *priv = dev_get_drvdata(dev);
818 return snprintf(buf, PAGE_SIZE, "%d\n", fpga_power_good(priv));
819}
820
821static ssize_t penable_show(struct device *dev, struct device_attribute *attr,
822 char *buf)
823{
824 struct fpga_dev *priv = dev_get_drvdata(dev);
825 return snprintf(buf, PAGE_SIZE, "%d\n", fpga_power_enabled(priv));
826}
827
828static ssize_t penable_store(struct device *dev, struct device_attribute *attr,
829 const char *buf, size_t count)
830{
831 struct fpga_dev *priv = dev_get_drvdata(dev);
832 unsigned long val;
833 int ret;
834
Jingoo Hanf7b41272013-06-04 13:15:16 +0900835 ret = kstrtoul(buf, 0, &val);
836 if (ret)
837 return ret;
Ira Snyder0e1d7152011-02-11 13:34:30 +0000838
839 if (val) {
840 ret = fpga_enable_power_supplies(priv);
841 if (ret)
842 return ret;
843 } else {
844 fpga_do_stop(priv);
845 fpga_disable_power_supplies(priv);
846 }
847
848 return count;
849}
850
851static ssize_t program_show(struct device *dev, struct device_attribute *attr,
852 char *buf)
853{
854 struct fpga_dev *priv = dev_get_drvdata(dev);
855 return snprintf(buf, PAGE_SIZE, "%d\n", fpga_running(priv));
856}
857
858static ssize_t program_store(struct device *dev, struct device_attribute *attr,
859 const char *buf, size_t count)
860{
861 struct fpga_dev *priv = dev_get_drvdata(dev);
862 unsigned long val;
863 int ret;
864
Jingoo Hanf7b41272013-06-04 13:15:16 +0900865 ret = kstrtoul(buf, 0, &val);
866 if (ret)
867 return ret;
Ira Snyder0e1d7152011-02-11 13:34:30 +0000868
869 /* We can't have an image writer and be programming simultaneously */
870 if (mutex_lock_interruptible(&priv->lock))
871 return -ERESTARTSYS;
872
873 /* Program or Reset the FPGA's */
874 ret = val ? fpga_do_program(priv) : fpga_do_stop(priv);
875 if (ret)
876 goto out_unlock;
877
878 /* Success */
879 ret = count;
880
881out_unlock:
882 mutex_unlock(&priv->lock);
883 return ret;
884}
885
886static DEVICE_ATTR(power_fail, S_IRUGO, pfail_show, NULL);
887static DEVICE_ATTR(power_good, S_IRUGO, pgood_show, NULL);
888static DEVICE_ATTR(power_enable, S_IRUGO | S_IWUSR,
889 penable_show, penable_store);
890
891static DEVICE_ATTR(program, S_IRUGO | S_IWUSR,
892 program_show, program_store);
893
894static struct attribute *fpga_attributes[] = {
895 &dev_attr_power_fail.attr,
896 &dev_attr_power_good.attr,
897 &dev_attr_power_enable.attr,
898 &dev_attr_program.attr,
899 NULL,
900};
901
902static const struct attribute_group fpga_attr_group = {
903 .attrs = fpga_attributes,
904};
905
906/*
907 * OpenFirmware Device Subsystem
908 */
909
910#define SYS_REG_VERSION 0x00
911#define SYS_REG_GEOGRAPHIC 0x10
912
913static bool dma_filter(struct dma_chan *chan, void *data)
914{
915 /*
916 * DMA Channel #0 is the only acceptable device
917 *
918 * This probably won't survive an unload/load cycle of the Freescale
919 * DMAEngine driver, but that won't be a problem
920 */
921 return chan->chan_id == 0 && chan->device->dev_id == 0;
922}
923
924static int fpga_of_remove(struct platform_device *op)
925{
Jingoo Han9093ca82013-05-23 19:35:23 +0900926 struct fpga_dev *priv = platform_get_drvdata(op);
Ira Snyder0e1d7152011-02-11 13:34:30 +0000927 struct device *this_device = priv->miscdev.this_device;
928
929 sysfs_remove_group(&this_device->kobj, &fpga_attr_group);
930 misc_deregister(&priv->miscdev);
931
932 free_irq(priv->irq, priv);
933 irq_dispose_mapping(priv->irq);
934
935 /* make sure the power supplies are off */
936 fpga_disable_power_supplies(priv);
937
938 /* unmap registers */
939 iounmap(priv->immr);
940 iounmap(priv->regs);
941
942 dma_release_channel(priv->chan);
943
944 /* drop our reference to the private data structure */
945 kref_put(&priv->ref, fpga_dev_remove);
946 return 0;
947}
948
949/* CTL-CPLD Version Register */
950#define CTL_CPLD_VERSION 0x2000
951
Al Viro49334022011-11-08 19:57:05 -0500952static int fpga_of_probe(struct platform_device *op)
Ira Snyder0e1d7152011-02-11 13:34:30 +0000953{
954 struct device_node *of_node = op->dev.of_node;
955 struct device *this_device;
956 struct fpga_dev *priv;
957 dma_cap_mask_t mask;
958 u32 ver;
959 int ret;
960
961 /* Allocate private data */
962 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
963 if (!priv) {
964 dev_err(&op->dev, "Unable to allocate private data\n");
965 ret = -ENOMEM;
966 goto out_return;
967 }
968
969 /* Setup the miscdevice */
970 priv->miscdev.minor = MISC_DYNAMIC_MINOR;
971 priv->miscdev.name = drv_name;
972 priv->miscdev.fops = &fpga_fops;
973
974 kref_init(&priv->ref);
975
Jingoo Han9093ca82013-05-23 19:35:23 +0900976 platform_set_drvdata(op, priv);
Ira Snyder0e1d7152011-02-11 13:34:30 +0000977 priv->dev = &op->dev;
978 mutex_init(&priv->lock);
979 init_completion(&priv->completion);
980 videobuf_dma_init(&priv->vb);
981
982 dev_set_drvdata(priv->dev, priv);
983 dma_cap_zero(mask);
984 dma_cap_set(DMA_MEMCPY, mask);
Ira Snyder0e1d7152011-02-11 13:34:30 +0000985 dma_cap_set(DMA_SLAVE, mask);
986 dma_cap_set(DMA_SG, mask);
987
988 /* Get control of DMA channel #0 */
989 priv->chan = dma_request_channel(mask, dma_filter, NULL);
990 if (!priv->chan) {
991 dev_err(&op->dev, "Unable to acquire DMA channel #0\n");
992 ret = -ENODEV;
993 goto out_free_priv;
994 }
995
996 /* Remap the registers for use */
997 priv->regs = of_iomap(of_node, 0);
998 if (!priv->regs) {
999 dev_err(&op->dev, "Unable to ioremap registers\n");
1000 ret = -ENOMEM;
1001 goto out_dma_release_channel;
1002 }
1003
1004 /* Remap the IMMR for use */
1005 priv->immr = ioremap(get_immrbase(), 0x100000);
1006 if (!priv->immr) {
1007 dev_err(&op->dev, "Unable to ioremap IMMR\n");
1008 ret = -ENOMEM;
1009 goto out_unmap_regs;
1010 }
1011
1012 /*
1013 * Check that external DMA is configured
1014 *
1015 * U-Boot does this for us, but we should check it and bail out if
1016 * there is a problem. Failing to have this register setup correctly
1017 * will cause the DMA controller to transfer a single cacheline
1018 * worth of data, then wedge itself.
1019 */
1020 if ((ioread32be(priv->immr + 0x114) & 0xE00) != 0xE00) {
1021 dev_err(&op->dev, "External DMA control not configured\n");
1022 ret = -ENODEV;
1023 goto out_unmap_immr;
1024 }
1025
1026 /*
1027 * Check the CTL-CPLD version
1028 *
1029 * This driver uses the CTL-CPLD DATA-FPGA power sequencer, and we
1030 * don't want to run on any version of the CTL-CPLD that does not use
1031 * a compatible register layout.
1032 *
1033 * v2: changed register layout, added power sequencer
1034 * v3: added glitch filter on the i2c overcurrent/overtemp outputs
1035 */
1036 ver = ioread8(priv->regs + CTL_CPLD_VERSION);
1037 if (ver != 0x02 && ver != 0x03) {
1038 dev_err(&op->dev, "CTL-CPLD is not version 0x02 or 0x03!\n");
1039 ret = -ENODEV;
1040 goto out_unmap_immr;
1041 }
1042
1043 /* Set the exact size that the firmware image should be */
1044 ver = ioread32be(priv->regs + SYS_REG_VERSION);
1045 priv->fw_size = (ver & (1 << 18)) ? FW_SIZE_EP2S130 : FW_SIZE_EP2S90;
1046
1047 /* Find the correct IRQ number */
1048 priv->irq = irq_of_parse_and_map(of_node, 0);
1049 if (priv->irq == NO_IRQ) {
1050 dev_err(&op->dev, "Unable to find IRQ line\n");
1051 ret = -ENODEV;
1052 goto out_unmap_immr;
1053 }
1054
1055 /* Request the IRQ */
1056 ret = request_irq(priv->irq, fpga_irq, IRQF_SHARED, drv_name, priv);
1057 if (ret) {
1058 dev_err(&op->dev, "Unable to request IRQ %d\n", priv->irq);
1059 ret = -ENODEV;
1060 goto out_irq_dispose_mapping;
1061 }
1062
1063 /* Reset and stop the FPGA's, just in case */
1064 fpga_do_stop(priv);
1065
1066 /* Register the miscdevice */
1067 ret = misc_register(&priv->miscdev);
1068 if (ret) {
1069 dev_err(&op->dev, "Unable to register miscdevice\n");
1070 goto out_free_irq;
1071 }
1072
1073 /* Create the sysfs files */
1074 this_device = priv->miscdev.this_device;
1075 dev_set_drvdata(this_device, priv);
1076 ret = sysfs_create_group(&this_device->kobj, &fpga_attr_group);
1077 if (ret) {
1078 dev_err(&op->dev, "Unable to create sysfs files\n");
1079 goto out_misc_deregister;
1080 }
1081
1082 dev_info(priv->dev, "CARMA FPGA Programmer: %s rev%s with %s FPGAs\n",
1083 (ver & (1 << 17)) ? "Correlator" : "Digitizer",
1084 (ver & (1 << 16)) ? "B" : "A",
1085 (ver & (1 << 18)) ? "EP2S130" : "EP2S90");
1086
1087 return 0;
1088
1089out_misc_deregister:
1090 misc_deregister(&priv->miscdev);
1091out_free_irq:
1092 free_irq(priv->irq, priv);
1093out_irq_dispose_mapping:
1094 irq_dispose_mapping(priv->irq);
1095out_unmap_immr:
1096 iounmap(priv->immr);
1097out_unmap_regs:
1098 iounmap(priv->regs);
1099out_dma_release_channel:
1100 dma_release_channel(priv->chan);
1101out_free_priv:
1102 kref_put(&priv->ref, fpga_dev_remove);
1103out_return:
1104 return ret;
1105}
1106
1107static struct of_device_id fpga_of_match[] = {
1108 { .compatible = "carma,fpga-programmer", },
1109 {},
1110};
1111
Al Viro49334022011-11-08 19:57:05 -05001112static struct platform_driver fpga_of_driver = {
Ira Snyder0e1d7152011-02-11 13:34:30 +00001113 .probe = fpga_of_probe,
1114 .remove = fpga_of_remove,
1115 .driver = {
1116 .name = drv_name,
1117 .of_match_table = fpga_of_match,
1118 .owner = THIS_MODULE,
1119 },
1120};
1121
1122/*
1123 * Module Init / Exit
1124 */
1125
1126static int __init fpga_init(void)
1127{
1128 led_trigger_register_simple("fpga", &ledtrig_fpga);
Al Viro49334022011-11-08 19:57:05 -05001129 return platform_driver_register(&fpga_of_driver);
Ira Snyder0e1d7152011-02-11 13:34:30 +00001130}
1131
1132static void __exit fpga_exit(void)
1133{
Al Viro49334022011-11-08 19:57:05 -05001134 platform_driver_unregister(&fpga_of_driver);
Ira Snyder0e1d7152011-02-11 13:34:30 +00001135 led_trigger_unregister_simple(ledtrig_fpga);
1136}
1137
1138MODULE_AUTHOR("Ira W. Snyder <iws@ovro.caltech.edu>");
1139MODULE_DESCRIPTION("CARMA Board DATA-FPGA Programmer");
1140MODULE_LICENSE("GPL");
1141
1142module_init(fpga_init);
1143module_exit(fpga_exit);