1 From 500b0887632165f77f2604b07df746b4a3a16d2c Mon Sep 17 00:00:00 2001
2 From: Hugo Villeneuve <hugo@hugovil.com>
3 Date: Fri, 6 Mar 2009 10:23:44 -0500
4 Subject: [PATCH 10/12] Add generic FPGA bitstream loader driver
6 This driver is a generic interface for programming a
7 bitstream into a FPGA. It can work with serial or
8 parallel programming interfaces and support multiple
9 devices and partial reconfiguration. Currently Xilinx
10 XC3S and XC4V FPGAs are implemented, but other
11 manufacturers like Altera could be easily added.
13 Signed-off-by: Hugo Villeneuve <hugo@hugovil.com>
15 drivers/misc/Kconfig | 31 ++
16 drivers/misc/Makefile | 3 +
17 drivers/misc/fpgadl.c | 806 +++++++++++++++++++++++++++++++++++++++++++++
18 drivers/misc/fpgadl_par.c | 258 +++++++++++++++
19 drivers/misc/fpgadl_ser.c | 244 ++++++++++++++
20 include/linux/fpgadl.h | 96 ++++++
21 6 files changed, 1438 insertions(+), 0 deletions(-)
22 create mode 100644 drivers/misc/fpgadl.c
23 create mode 100644 drivers/misc/fpgadl_par.c
24 create mode 100644 drivers/misc/fpgadl_ser.c
25 create mode 100644 include/linux/fpgadl.h
27 diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
28 index a11e2a0..bdc0517 100644
29 --- a/drivers/misc/Kconfig
30 +++ b/drivers/misc/Kconfig
31 @@ -510,6 +510,37 @@ config SGI_GRU_DEBUG
32 This option enables addition debugging code for the SGI GRU driver. If
33 you are unsure, say N.
36 + tristate "FPGA bitstream loader support"
38 + This option enables support for the FPGA bitstream loader.
40 + To compile this driver as a module, choose M here: the
41 + module will be called fpgadl.
46 + tristate "FPGA serial programming driver"
47 + depends on SPI_MASTER && FPGADL
49 + Say Y here if your FPGA bitstream is loaded using a serial
52 + To compile this driver as a module, choose M here: the
53 + module will be called fpgadl_ser.
56 + tristate "FPGA parallel programming driver"
60 + Say Y here if your FPGA bitstream is loaded using a parallel
63 + To compile this driver as a module, choose M here: the
64 + module will be called fpgadl_par.
66 source "drivers/misc/c2port/Kconfig"
69 diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
70 index 78be134..4fb6dfc 100644
71 --- a/drivers/misc/Makefile
72 +++ b/drivers/misc/Makefile
73 @@ -32,5 +32,8 @@ obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o
74 obj-$(CONFIG_KGDB_TESTS) += kgdbts.o
75 obj-$(CONFIG_SGI_XP) += sgi-xp/
76 obj-$(CONFIG_SGI_GRU) += sgi-gru/
77 +obj-$(CONFIG_FPGADL) += fpgadl.o
78 +obj-$(CONFIG_FPGADL_SER) += fpgadl_ser.o
79 +obj-$(CONFIG_FPGADL_PAR) += fpgadl_par.o
80 obj-$(CONFIG_HP_ILO) += hpilo.o
81 obj-$(CONFIG_C2PORT) += c2port/
82 diff --git a/drivers/misc/fpgadl.c b/drivers/misc/fpgadl.c
84 index 0000000..2f03d9b
86 +++ b/drivers/misc/fpgadl.c
89 + * fpgadl core driver
91 + * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
93 + * Based on code found in book "Linux Device Drivers" by
94 + * Alessandro Rubini and Jonathan Corbet, published by O'Reilly & Associates.
96 + * This program is free software; you can redistribute it and/or modify
97 + * it under the terms of the GNU General Public License as published by
98 + * the Free Software Foundation; either version 2 of the License, or
99 + * (at your option) any later version.
101 + * This program is distributed in the hope that it will be useful,
102 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
103 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
104 + * GNU General Public License for more details.
106 + * You should have received a copy of the GNU General Public License
107 + * along with this program; if not, write to the Free Software
108 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
111 +#include <linux/kernel.h>
112 +#include <linux/module.h>
113 +#include <linux/moduleparam.h>
114 +#include <linux/init.h>
115 +#include <linux/device.h>
116 +#include <linux/platform_device.h>
117 +#include <linux/miscdevice.h>
118 +#include <linux/string.h>
119 +#include <linux/err.h>
120 +#include <linux/fs.h>
121 +#include <linux/firmware.h>
122 +#include <linux/delay.h>
123 +#include <linux/fpgadl.h>
125 +#include <asm/gpio.h>
126 +#include <asm/uaccess.h>
128 +#define MODULE_NAME "fpgadl"
130 +/* Define this to enable verbose debug messages */
131 +#define FPGADL_DEBUG 1
133 +static const char fpgadl_driver_version[] = "v1.0";
135 +/* Module parameters */
136 +static unsigned int fpgadl_debug;
137 +EXPORT_SYMBOL_GPL(fpgadl_debug);
138 +module_param_named(debug, fpgadl_debug, int, 0644);
141 +#define INFOMSG(fmt, args...) \
143 + printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ## args); \
145 +#define DBGMSG(fmt, args...) \
147 + if (fpgadl_debug > 0) \
148 + printk(KERN_DEBUG "%s: "fmt"\n", \
149 + MODULE_NAME, ## args); \
151 +#define DBGMSG_ENTER() \
152 + DBGMSG("%s() enter", __func__);
153 +#define DBGMSG_LEAVE() \
154 + DBGMSG("%s() leave", __func__);
156 +#define INFOMSG(fmt, args...) do {} while (0)
157 +#define DBGMSG(fmt, args...) do {} while (0)
158 +#define DBGMSG_ENTER() do {} while (0)
159 +#define DBGMSG_LEAVE() do {} while (0)
162 +#define FAILMSG(fmt, args...) \
164 + printk(KERN_ERR "%s: "fmt"\n", MODULE_NAME, ## args); \
167 +#define FPGA_WAIT_TIMEOUT 100000
168 +#define XFER_SIZE 100 /* Transfer size when writing bytes to
171 +#define BITSTREAM_MAX_SIZE_OVERHEAD 10240
173 +#define XC3S_WORD_SIZE 2
174 +#define XC4V_WORD_SIZE 4
176 +#define BITSTREAM_SYNC_BYTE1 0xAA
177 +#define BITSTREAM_SYNC_BYTE2 0x99
178 +#define BITSTREAM_SYNC_BYTE3 0x55
179 +#define BITSTREAM_SYNC_BYTE4 0x66
181 +#define BITSTREAM_PACKET_HEADER_TYPE1 1
182 +#define BITSTREAM_PACKET_HEADER_TYPE2 2
183 +#define BITSTREAM_TYPE1_OPCODE_WRITE 2
184 +#define BITSTREAM_TYPE1_REG_ADDR_FDRI 2
186 +/* Structure of a TYPE1 packet. */
187 +struct t1_pkt_xc4v_t {
196 +struct t1_pkt_xc3s_t {
200 + u16 header:3; /* type */
203 +/* Structure of a TYPE2 packet. */
204 +struct t2_pkt_xc4v_t {
206 + u32 opcode:2; /* Reserved. */
210 +struct t2_pkt_xc3s_t {
212 + u16 opcode:2; /* Reserved. */
216 +#define MAX_FPGADL_DEV 4
218 +static int fpgadl_dev_count;
219 +static struct fpgadl_device *fpgadl_dev_array[MAX_FPGADL_DEV];
221 +int fpgadl_is_bitstream_loaded(const char *name)
224 + struct fpgadl_device *fpgadl_dev;
228 + for (k = 0; k < MAX_FPGADL_DEV; k++) {
229 + fpgadl_dev = fpgadl_dev_array[k];
231 + if (strncmp(fpgadl_dev->name, name, strlen(name)) == 0)
232 + return fpgadl_dev->bitstream_loaded;
235 + FAILMSG(" Device <%s> not found", name);
238 +EXPORT_SYMBOL(fpgadl_is_bitstream_loaded);
240 +/* Respond to hotplug events. */
241 +static int fpgadl_uevent(struct device *dev, struct kobj_uevent_env *env)
245 + if (add_uevent_var(env, "FPGADL_BUS_VERSION=%s", fpgadl_driver_version))
251 + * Toggles the CCLK line on the board-specific interface the number of times
252 + * specified by <cycles>.
254 +static int bitstr_load_make_clock(struct fpgadl_device *fpgadl_dev,
261 + for (k = 0; k < cycles; k++) {
262 + retval = fpgadl_dev->write_byte(fpgadl_dev, &dummy, 1);
270 +/* Search for bitstream sync word. */
271 +static int bitstr_search_sync_word(const u8 *buffer, size_t length,
272 + const u8 *sync_word, ssize_t sync_word_size)
276 + for (k = 0; k < length; k++, buffer++) {
277 + if (memcmp(buffer, sync_word, sync_word_size) == 0) {
278 + DBGMSG(" Synchronization word found at offset 0x%02X",
287 +static int bitstr_get_payload_size(int fpga_family, int sws,
288 + const u8 *buffer, ssize_t length)
292 + /* Find the payload size. */
293 + while (index < length) {
294 + switch (fpga_family) {
295 + case FPGA_FAMILY_XILINX_XC4V:
297 + u32 tmp = ntohl(*((u32 *) &buffer[index]));
298 + struct t1_pkt_xc4v_t *t1 =
299 + (struct t1_pkt_xc4v_t *) &tmp;
301 + /* Search for type 1 packet header. */
302 + if ((t1->header == BITSTREAM_PACKET_HEADER_TYPE1) &&
303 + (t1->opcode == BITSTREAM_TYPE1_OPCODE_WRITE) &&
304 + (t1->address == BITSTREAM_TYPE1_REG_ADDR_FDRI)) {
305 + if (t1->word_count != 0)
306 + return t1->word_count;
308 + struct t2_pkt_xc4v_t *t2;
310 + tmp = ntohl(*((u32 *)
311 + &buffer[index + sws]));
312 + t2 = (struct t2_pkt_xc4v_t *) &tmp;
314 + /* Search for type 2 packet header just
315 + * after type1 packet. */
317 + BITSTREAM_PACKET_HEADER_TYPE2))
318 + return t2->word_count;
323 + case FPGA_FAMILY_XILINX_XC3S:
325 + u16 tmp = ntohs(*((u16 *) &buffer[index]));
326 + struct t2_pkt_xc3s_t *t2 =
327 + (struct t2_pkt_xc3s_t *) &tmp;
329 + /* Search for type 2 packet header just after
331 + if ((t2->header == BITSTREAM_PACKET_HEADER_TYPE2)) {
332 + DBGMSG(" Type 2 packet found at offset $%02X",
334 + return ntohl(*((u32 *) &buffer[index + sws]));
336 + /* Word-size aligned when sync word has been found. */
342 + /* Word-size aligned when sync word has been found. */
346 + return 0; /* Not found */
352 + * 1: Full bitstream
353 + * 2: Partial bitstream
355 +static int bitstream_parse_header(const u8 *buffer, size_t length,
356 + int fpga_family, size_t payload_full_size)
359 + size_t payload_size = 0;
361 + BITSTREAM_SYNC_BYTE1,
362 + BITSTREAM_SYNC_BYTE2,
363 + BITSTREAM_SYNC_BYTE3,
364 + BITSTREAM_SYNC_BYTE4,
366 + int sync_word_size; /* Size in bytes */
368 + switch (fpga_family) {
369 + case FPGA_FAMILY_XILINX_XC3S:
370 + sync_word_size = XC3S_WORD_SIZE;
372 + case FPGA_FAMILY_XILINX_XC4V:
373 + sync_word_size = XC4V_WORD_SIZE;
376 + FAILMSG("Error, invalid FPGA family number");
377 + return BITSTREAM_MODE_UNKNOWN;
380 + /* Search for bitstream sync word. */
381 + index = bitstr_search_sync_word(buffer, length,
382 + sync_word, sync_word_size);
384 + FAILMSG("Error: Synchronization word not found");
385 + return BITSTREAM_MODE_UNKNOWN;
388 + /* Get payload size. */
389 + payload_size = bitstr_get_payload_size(fpga_family, sync_word_size,
390 + &buffer[index], length - index);
391 + payload_size *= sync_word_size; /* Length in bytes. */
393 + if (payload_size == 0) {
394 + /* Warning only, assuming FULL bitstream. */
395 + DBGMSG(" Warning: payload size not found");
396 + return BITSTREAM_MODE_FULL;
398 + DBGMSG(" Payload size: %d kb", payload_size / 1024);
400 + /* Is it a full or a partial bitstream? */
401 + if (payload_size == payload_full_size)
402 + return BITSTREAM_MODE_FULL;
404 + return BITSTREAM_MODE_PARTIAL;
409 + * Bitstreams supported: Full or Partial.
410 + * Note: Full bitstream that supports partial bitstream must be generated with
411 + * option "Persist = true" in ISE.
413 +static int fpgadl_bitstream_load(struct fpgadl_device *fpgadl_dev,
414 + const u8 *data, size_t size)
418 + int timeout_counter;
420 + fpgadl_dev->bitstream_loaded = 0;
422 + fpgadl_dev->bitstream_mode =
423 + bitstream_parse_header(data, size,
424 + fpgadl_dev->pdata->fpga_family,
425 + fpgadl_dev->pdata->payload_full_size);
426 + switch (fpgadl_dev->bitstream_mode) {
427 + case BITSTREAM_MODE_FULL:
428 + DBGMSG(" Bitstream type: FULL");
429 + /* Toggle PROG_B Pin and wait 300nS before proceeding. */
430 + gpio_set_value(fpgadl_dev->pdata->program_b, 0);
433 + /* Confirm that INIT_B is low */
434 + if (gpio_get_value(fpgadl_dev->pdata->init_b) != 0) {
435 + FAILMSG("Error: INIT_B not LOW when PROG is LOW");
440 + case BITSTREAM_MODE_PARTIAL:
441 + DBGMSG(" Bitstream type: PARTIAL");
443 + case BITSTREAM_MODE_UNKNOWN:
445 + FAILMSG(" Bitstream type: UNKNOWN");
450 + /* For partial bitstream, PROGRAM_B is already high. */
451 + retval = bitstr_load_make_clock(fpgadl_dev, 3);
455 + gpio_set_value(fpgadl_dev->pdata->program_b, 1);
457 + /* Wait for INIT_B pin to go high. */
458 + timeout_counter = 0;
459 + while ((gpio_get_value(fpgadl_dev->pdata->init_b) == 0) &&
460 + (timeout_counter < FPGA_WAIT_TIMEOUT)) {
461 + retval = bitstr_load_make_clock(fpgadl_dev, 3);
468 + if (timeout_counter == FPGA_WAIT_TIMEOUT) {
469 + /* Timeout error. */
470 + FAILMSG("Error: timeout while waiting for INIT_B to go HIGH");
474 + /* Send actual bitstream data to FPGA one byte at a time. */
475 + for (k = 0; k < size; k += XFER_SIZE) {
476 + retval = fpgadl_dev->write_byte(fpgadl_dev,
477 + (u8 *) &data[k], XFER_SIZE);
481 + if (fpgadl_dev->pdata->check_init_low) {
482 + if (gpio_get_value(fpgadl_dev->pdata->init_b) == 0) {
483 + /* Error if INIT_B goes low here. */
484 + FAILMSG("Error: INIT_B LOW during programming");
490 + /* Pulse the clock line ten times at the end. */
491 + retval = bitstr_load_make_clock(fpgadl_dev, 10);
495 + /* FPGA DONE pin must go high. */
496 + timeout_counter = 0;
497 + while ((gpio_get_value(fpgadl_dev->pdata->done) == 0) &&
498 + (timeout_counter < FPGA_WAIT_TIMEOUT))
501 + if (gpio_get_value(fpgadl_dev->pdata->done) == 0) {
502 + /* Timeout error. */
503 + FAILMSG("Error: timeout while waiting for DONE to go HIGH");
507 + INFOMSG("Bitstream loaded");
508 + fpgadl_dev->bitstream_loaded = 1;
514 +static int fpgadl_open(struct inode *inode, struct file *filp)
518 + struct fpgadl_device *fpgadl_dev;
521 + DBGMSG(" Opening device minor %d", MINOR(inode->i_rdev));
523 + for (k = 0; k < fpgadl_dev_count; k++) {
524 + fpgadl_dev = fpgadl_dev_array[k];
526 + if (fpgadl_dev->miscdev.minor == MINOR(inode->i_rdev)) {
534 + FAILMSG(" Invalid minor device");
538 + filp->private_data = fpgadl_dev;
540 + fpgadl_dev->bitstream_length = 0;
541 + fpgadl_dev->bitstream_data = kmalloc(fpgadl_dev->bitstream_max_size,
543 + if (!fpgadl_dev->bitstream_data) {
544 + FAILMSG("Failed to allocate memory for bitstream");
548 + fpgadl_dev->bitstream_buffer_allocated = 1;
553 +/* Write method. Fill buffer with bitstream data. */
554 +static ssize_t fpgadl_write(struct file *filp, const char __user *buff,
555 + size_t count, loff_t *offp)
557 + struct fpgadl_device *fpgadl_dev = filp->private_data;
559 + if ((fpgadl_dev->bitstream_length + count) >=
560 + fpgadl_dev->bitstream_max_size) {
561 + FAILMSG("Bitstream buffer size exceeded");
565 + if (copy_from_user(fpgadl_dev->bitstream_data +
566 + fpgadl_dev->bitstream_length,
567 + (void __user *) buff, count))
570 + fpgadl_dev->bitstream_length += count;
575 +/* Release method. This will initiate the FPGA programming. */
576 +static int fpgadl_release(struct inode *inode, struct file *filp)
579 + struct fpgadl_device *fpgadl_dev = filp->private_data;
581 + if (!fpgadl_dev->bitstream_data)
584 + retval = fpgadl_bitstream_load(fpgadl_dev,
585 + fpgadl_dev->bitstream_data,
586 + fpgadl_dev->bitstream_length);
587 + kfree(fpgadl_dev->bitstream_data);
588 + fpgadl_dev->bitstream_buffer_allocated = 0;
593 +static struct file_operations fops_fpgadl = {
594 + .owner = THIS_MODULE,
595 + .open = fpgadl_open,
596 + .write = fpgadl_write,
597 + .release = fpgadl_release
600 +/* Match fpgadl devices to drivers. Just do a simple name test. */
601 +static int fpgadl_device_match(struct device *dev,
602 + struct device_driver *drv)
605 + return !strncmp(dev->bus_id, drv->name, strlen(drv->name));
608 +static ssize_t show_version(struct device_driver *driver, char *buf)
610 + struct fpgadl_driver *fpgadldriver = to_fpgadl_driver(driver);
612 + sprintf(buf, "%s\n", fpgadldriver->version);
613 + return strlen(buf);
616 +int fpgadl_register_driver(struct fpgadl_driver *drv)
622 + /* Initialize common driver fields */
623 + drv->driver.bus = &fpgadl_bus_type;
625 + /* Register with core */
626 + res = driver_register(&drv->driver);
628 + FAILMSG(" driver_register() failed");
630 + drv->version_attr.attr.name = "version";
631 + drv->version_attr.attr.owner = drv->module;
632 + drv->version_attr.attr.mode = S_IRUGO;
633 + drv->version_attr.show = show_version;
634 + drv->version_attr.store = NULL;
635 + res = driver_create_file(&drv->driver, &drv->version_attr);
639 +EXPORT_SYMBOL(fpgadl_register_driver);
641 +void fpgadl_unregister_driver(struct fpgadl_driver *drv)
644 + driver_unregister(&drv->driver);
646 +EXPORT_SYMBOL(fpgadl_unregister_driver);
648 +/* The fpgadl bus device. */
649 +static void fpgadl_bus_release(struct device *dev)
654 +struct device fpgadl_bus = {
655 + .bus_id = "fpgadl0",
656 + .release = fpgadl_bus_release
659 +struct bus_type fpgadl_bus_type = {
661 + .match = fpgadl_device_match,
662 + .uevent = fpgadl_uevent,
664 +EXPORT_SYMBOL(fpgadl_bus_type);
666 +/* Export a simple sysfs attribute. */
667 +static ssize_t show_bus_version(struct bus_type *bus, char *buf)
669 + return snprintf(buf, PAGE_SIZE, "%s\n", fpgadl_driver_version);
672 +static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL);
676 + * For now, no references to fpgadlbus devices go out which are not
677 + * tracked via the module reference count, so we use a no-op
678 + * release function.
680 +static void fpgadl_dev_release(struct device *dev)
685 +/* Release DaVinci GPIO to FPGA control pins. */
686 +static void fpgadl_release_gpio(struct fpgadl_pdata_t *pdata)
688 + gpio_free(pdata->done);
689 + gpio_free(pdata->init_b);
690 + gpio_free(pdata->program_b);
693 +static int fpgadl_setup_gpio(struct fpgadl_pdata_t *pdata)
697 + /* Configure FPGA PROGRAM_B GPIO. */
698 + retval = gpio_request(pdata->program_b, "fpga_program_b");
699 + if (retval == 0) /* FPGA_PROGRAM_B must be initially HIGH. */
700 + retval = gpio_direction_output(pdata->program_b, 1);
704 + /* Configure FPGA INIT_B GPIO. */
705 + retval = gpio_request(pdata->init_b, "fpga_init_b");
707 + retval = gpio_direction_input(pdata->init_b);
711 + /* Configure FPGA DONE GPIO. */
712 + retval = gpio_request(pdata->done, "fpga_done");
714 + retval = gpio_direction_input(pdata->done);
721 + fpgadl_release_gpio(pdata);
725 +static void fpgadl_cleanup(struct fpgadl_device *fpgadl_dev)
732 + fpgadl_dev_array[fpgadl_dev->id] = NULL;
734 + /* Get rid of any allocated buffer, not freed */
735 + if (fpgadl_dev->bitstream_buffer_allocated)
736 + kfree(fpgadl_dev->bitstream_data);
738 + switch (fpgadl_dev->state) {
739 + case FPGADL_DEV_STATE_CHAR_DEV_REGISTERED:
740 + misc_deregister(&fpgadl_dev->miscdev);
741 + case FPGADL_DEV_STATE_GPIO_REGISTERED:
742 + fpgadl_release_gpio(fpgadl_dev->pdata);
743 + case FPGADL_DEV_STATE_DEVICE_REGISTERED:
744 + device_unregister(&fpgadl_dev->dev);
745 + case FPGADL_DEV_STATE_START:
750 +int fpgadl_register_device(struct fpgadl_device *fpgadl_dev)
753 + const struct firmware *fw_entry;
757 + fpgadl_dev->state = FPGADL_DEV_STATE_START;
759 + /* Sanity checks. */
760 + if (!fpgadl_dev->name) {
761 + FAILMSG(" Error, missing device name");
766 + if (!fpgadl_dev->write_byte) {
767 + FAILMSG(" Error, missing write_byte() callback");
772 + if (fpgadl_dev_count == MAX_FPGADL_DEV) {
773 + FAILMSG("Maximum number of devices reached (%d)",
779 + DBGMSG(" device %d", fpgadl_dev_count);
781 + /* Set some default values. */
782 + fpgadl_dev->bitstream_loaded = 0;
783 + fpgadl_dev->bitstream_buffer_allocated = 0;
784 + fpgadl_dev->bitstream_max_size =
785 + fpgadl_dev->pdata->payload_full_size +
786 + BITSTREAM_MAX_SIZE_OVERHEAD;
788 + fpgadl_dev->dev.bus = &fpgadl_bus_type;
789 + fpgadl_dev->dev.parent = &fpgadl_bus;
790 + fpgadl_dev->dev.release = fpgadl_dev_release;
791 + strncpy(fpgadl_dev->dev.bus_id, fpgadl_dev->name, BUS_ID_SIZE);
792 + res = device_register(&fpgadl_dev->dev);
794 + FAILMSG(" device_register() failed");
797 + fpgadl_dev->state = FPGADL_DEV_STATE_DEVICE_REGISTERED;
799 + res = fpgadl_setup_gpio(fpgadl_dev->pdata);
801 + FAILMSG("Error registering GPIOs");
804 + fpgadl_dev->state = FPGADL_DEV_STATE_GPIO_REGISTERED;
806 + fpgadl_dev->miscdev.name = fpgadl_dev->name;
807 + fpgadl_dev->miscdev.minor = MISC_DYNAMIC_MINOR;
808 + fpgadl_dev->miscdev.fops = &fops_fpgadl;
809 + res = misc_register(&fpgadl_dev->miscdev);
811 + FAILMSG("Error registering misc driver");
814 + DBGMSG(" MINOR = %d", fpgadl_dev->miscdev.minor);
815 + fpgadl_dev->state = FPGADL_DEV_STATE_CHAR_DEV_REGISTERED;
817 + /* Try to load firmware through hotplug if available. */
818 + res = request_firmware(&fw_entry, fpgadl_dev->pdata->bitstream_name,
821 + /* Not an error preventing the driver from being loaded. */
823 + DBGMSG("Info: firmware not available");
825 + res = fpgadl_bitstream_load(fpgadl_dev, fw_entry->data,
827 + release_firmware(fw_entry);
830 + fpgadl_dev->id = fpgadl_dev_count;
831 + fpgadl_dev_array[fpgadl_dev_count] = fpgadl_dev;
832 + fpgadl_dev_count++;
837 + fpgadl_cleanup(fpgadl_dev);
840 +EXPORT_SYMBOL(fpgadl_register_device);
842 +void fpgadl_unregister_device(struct fpgadl_device *fpgadl_dev)
845 + fpgadl_cleanup(fpgadl_dev);
847 +EXPORT_SYMBOL(fpgadl_unregister_device);
849 +static int __init fpgadl_init(void)
854 + INFOMSG("FPGA bitstream loader %s", fpgadl_driver_version);
856 + res = bus_register(&fpgadl_bus_type);
858 + FAILMSG(" bus_register() failed");
862 + if (bus_create_file(&fpgadl_bus_type, &bus_attr_version)) {
863 + FAILMSG("Unable to create version attribute");
864 + goto fail_create_file;
867 + res = device_register(&fpgadl_bus);
869 + FAILMSG(" failed registering %s", fpgadl_bus.bus_id);
877 + bus_unregister(&fpgadl_bus_type);
881 +module_init(fpgadl_init);
883 +static void __exit fpgadl_exit(void)
886 + device_unregister(&fpgadl_bus);
887 + bus_unregister(&fpgadl_bus_type);
889 +module_exit(fpgadl_exit);
891 +MODULE_AUTHOR("Hugo Villeneuve <hvilleneuve@lyrtech.com>");
892 +MODULE_DESCRIPTION("FPGA bitstream loader");
893 +MODULE_LICENSE("GPL");
894 diff --git a/drivers/misc/fpgadl_par.c b/drivers/misc/fpgadl_par.c
896 index 0000000..66f8eba
898 +++ b/drivers/misc/fpgadl_par.c
901 + * fpgadl_par.c - FPGA parallel programming driver
903 + * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
905 + * This program is free software; you can redistribute it and/or modify
906 + * it under the terms of the GNU General Public License as published by
907 + * the Free Software Foundation; either version 2 of the License, or
908 + * (at your option) any later version.
910 + * This program is distributed in the hope that it will be useful,
911 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
912 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
913 + * GNU General Public License for more details.
915 + * You should have received a copy of the GNU General Public License
916 + * along with this program; if not, write to the Free Software
917 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
920 +#include <linux/kernel.h>
921 +#include <linux/module.h>
922 +#include <linux/moduleparam.h>
923 +#include <linux/init.h>
924 +#include <linux/device.h>
925 +#include <linux/platform_device.h>
926 +#include <linux/string.h>
927 +#include <linux/err.h>
928 +#include <linux/fs.h>
929 +#include <linux/delay.h>
930 +#include <linux/bitrev.h>
931 +#include <linux/fpgadl.h>
933 +#include <asm/gpio.h> /* For ioremap() */
935 +#define MODULE_NAME "fpgadl_par"
936 +#define MODULE_VERSION_STR "v1.0"
938 +/* Define this to enable verbose debug messages */
939 +#define FPGADL_PAR_DEBUG 1
941 +/* Module parameters */
942 +static unsigned int fpgadl_par_debug;
943 +EXPORT_SYMBOL_GPL(fpgadl_par_debug);
944 +module_param_named(debug, fpgadl_par_debug, int, 0644);
946 +#ifdef FPGADL_PAR_DEBUG
947 +#define INFOMSG(fmt, args...) \
949 + printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ## args); } while (0)
950 +#define DBGMSG(fmt, args...) \
951 +do { if (fpgadl_par_debug > 0) \
952 + printk(KERN_DEBUG "%s: "fmt"\n", MODULE_NAME, ## args); } while (0)
953 +#define DBGMSG_ENTER() \
954 + DBGMSG("%s() enter", __func__);
955 +#define DBGMSG_LEAVE() \
956 + DBGMSG("%s() leave", __func__);
958 +#define INFOMSG(fmt, args...) do {} while (0)
959 +#define DBGMSG(fmt, args...) do {} while (0)
960 +#define DBGMSG_ENTER() do {} while (0)
961 +#define DBGMSG_LEAVE() do {} while (0)
964 +#define FAILMSG(fmt, args...) \
966 + printk(KERN_ERR "%s: "fmt"\n", MODULE_NAME, ## args); } while (0)
968 +struct fpgadl_par_dev_t {
971 + FPGADL_PAR_DEV_STATE_STRUCT_ALLOCATED,
972 + FPGADL_PAR_DEV_STATE_HAVE_IOREMAP,
973 + FPGADL_PAR_DEV_STATE_FPGADL_DEV_REGISTERED,
976 + struct fpgadl_device fpgadl_dev;
979 +#define MAX_FPGADL_PAR_DEV 5
981 +static int fpgadl_par_dev_count;
984 + * Writes a byte of data to the FPGA using the SelectMAP
985 + * interface. The FPGA_SELECT_MAP_REG address is within
986 + * the FPGA address space (CS3), and when we write a byte
987 + * to that address, the CCLK line will be toggled.
989 +static int selectmap_write_byte(struct fpgadl_device *fpgadl_dev,
990 + u8 *data, int size)
993 + struct fpgadl_par_dev_t *fpgadl_par_dev;
995 + fpgadl_par_dev = (struct fpgadl_par_dev_t *) fpgadl_dev->devdata;
997 + for (k = 0; k < size; k++)
998 + fpgadl_par_dev->selectmap[0] = bitrev8(data[k]);
1003 +static void fpgadl_par_cleanup(struct fpgadl_par_dev_t *dev)
1005 + DBGMSG("fpgadl_par_cleanup");
1010 + switch (dev->state) {
1011 + case FPGADL_PAR_DEV_STATE_FPGADL_DEV_REGISTERED:
1012 + fpgadl_unregister_device(&dev->fpgadl_dev);
1013 + case FPGADL_PAR_DEV_STATE_HAVE_IOREMAP:
1014 + iounmap(dev->selectmap);
1015 + case FPGADL_PAR_DEV_STATE_STRUCT_ALLOCATED:
1021 +static int __devinit fpgadl_par_probe(struct platform_device *pdev)
1025 + struct fpgadl_par_dev_t *dev = NULL;
1026 + const struct resource *selectmap_res;
1028 + DBGMSG("fpgadl_par_probe()");
1030 + if (fpgadl_par_dev_count == MAX_FPGADL_PAR_DEV) {
1031 + FAILMSG("Maximum number of devices reached (%d)",
1032 + fpgadl_par_dev_count);
1037 + DBGMSG(" device %d", fpgadl_par_dev_count);
1039 + dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1041 + FAILMSG("Failed to allocate device structure");
1045 + /* Set some default values. */
1046 + dev->state = FPGADL_PAR_DEV_STATE_STRUCT_ALLOCATED;
1048 + if (!pdev->dev.platform_data) {
1049 + FAILMSG("Error getting platform data");
1053 + dev->fpgadl_dev.pdata = pdev->dev.platform_data;
1054 + pdev->dev.driver_data = dev; /* Private driver data */
1056 + /* Assign virtual addresses to SELECTMAP I/O memory regions. */
1057 + selectmap_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1059 + if (!selectmap_res) {
1060 + FAILMSG("Error getting selectmap ressource");
1064 + len = selectmap_res->end - selectmap_res->start;
1065 + dev->selectmap = ioremap(selectmap_res->start, len);
1066 + if (!dev->selectmap) {
1067 + FAILMSG("Can't remap selectmap register");
1071 + dev->state = FPGADL_PAR_DEV_STATE_HAVE_IOREMAP;
1073 + dev->fpgadl_dev.write_byte = selectmap_write_byte;
1074 + sprintf(dev->devname, "fpgadl_par%d", fpgadl_par_dev_count);
1075 + DBGMSG(" NAME = %s", dev->devname);
1076 + dev->fpgadl_dev.name = dev->devname;
1077 + dev->fpgadl_dev.devdata = dev; /* For our write_byte() callback */
1078 + res = fpgadl_register_device(&dev->fpgadl_dev);
1080 + FAILMSG("Error registering fpgadl_par device");
1083 + dev->state = FPGADL_PAR_DEV_STATE_FPGADL_DEV_REGISTERED;
1085 + fpgadl_par_dev_count++;
1090 + fpgadl_par_cleanup(dev);
1094 +static int __devexit fpgadl_par_remove(struct platform_device *pdev)
1096 + struct fpgadl_par_dev_t *dev = platform_get_drvdata(pdev);
1098 + DBGMSG("fpgadl_par_remove()");
1100 + fpgadl_par_cleanup(dev);
1105 +static struct fpgadl_driver fpgadl_par_driver = {
1106 + .version = MODULE_VERSION_STR,
1107 + .module = THIS_MODULE,
1109 + .name = "fpgadl_par",
1113 +static struct platform_driver fpgadl_platform_driver = {
1115 + .name = MODULE_NAME,
1116 + .owner = THIS_MODULE,
1118 + .remove = fpgadl_par_remove,
1121 +static int __init fpgadl_par_init(void)
1125 + DBGMSG("fpgadl_par_init()");
1127 + /* Register with the driver core. */
1128 + res = fpgadl_register_driver(&fpgadl_par_driver);
1130 + FAILMSG("Can't register fpgadl parallel driver");
1134 + /* The probe function will be called for each platform device declared
1135 + * in board setup code. */
1136 + res = platform_driver_probe(&fpgadl_platform_driver,
1137 + fpgadl_par_probe);
1139 + FAILMSG("platform_driver_probe() failed");
1145 +module_init(fpgadl_par_init);
1147 +static void __exit fpgadl_par_exit(void)
1149 + DBGMSG("fpgadl_par_exit()");
1150 + platform_driver_unregister(&fpgadl_platform_driver);
1151 + fpgadl_unregister_driver(&fpgadl_par_driver);
1153 +module_exit(fpgadl_par_exit);
1155 +MODULE_AUTHOR("Hugo Villeneuve <hvilleneuve@lyrtech.com>");
1156 +MODULE_DESCRIPTION("FPGA parallel programming driver");
1157 +MODULE_LICENSE("GPL");
1158 diff --git a/drivers/misc/fpgadl_ser.c b/drivers/misc/fpgadl_ser.c
1159 new file mode 100644
1160 index 0000000..01ca5e0
1162 +++ b/drivers/misc/fpgadl_ser.c
1165 + * fpgadl_ser.c - FPGA serial programming driver
1167 + * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
1169 + * Based on SH SCI SPI interface
1170 + * Copyright (c) 2008 Magnus Damm
1172 + * This program is free software; you can redistribute it and/or modify
1173 + * it under the terms of the GNU General Public License as published by
1174 + * the Free Software Foundation; either version 2 of the License, or
1175 + * (at your option) any later version.
1177 + * This program is distributed in the hope that it will be useful,
1178 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1179 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1180 + * GNU General Public License for more details.
1182 + * You should have received a copy of the GNU General Public License
1183 + * along with this program; if not, write to the Free Software
1184 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1187 +#include <linux/kernel.h>
1188 +#include <linux/module.h>
1189 +#include <linux/moduleparam.h>
1190 +#include <linux/init.h>
1191 +#include <linux/device.h>
1192 +#include <linux/platform_device.h>
1193 +#include <linux/spi/spi.h>
1194 +#include <linux/fpgadl.h>
1196 +#define MODULE_NAME "fpgadl_ser"
1197 +#define MODULE_VERSION_STR "v1.0"
1199 +/* Define this to enable verbose debug messages */
1200 +#define FPGADL_SER_DEBUG 1
1202 +/* Module parameters */
1203 +static unsigned int fpgadl_ser_debug;
1204 +EXPORT_SYMBOL_GPL(fpgadl_ser_debug);
1205 +module_param_named(debug, fpgadl_ser_debug, int, 0644);
1207 +#ifdef FPGADL_SER_DEBUG
1208 +#define INFOMSG(fmt, args...) \
1210 + printk(KERN_INFO "%s: "fmt"\n", MODULE_NAME, ## args); } while (0)
1211 +#define DBGMSG(fmt, args...) \
1212 +do { if (fpgadl_ser_debug > 0) \
1213 + printk(KERN_DEBUG "%s: "fmt"\n", MODULE_NAME, ## args); } while (0)
1214 +#define DBGMSG_ENTER() \
1215 + DBGMSG("%s() enter", __func__);
1216 +#define DBGMSG_LEAVE() \
1217 + DBGMSG("%s() leave", __func__);
1219 +#define INFOMSG(fmt, args...) do {} while (0)
1220 +#define DBGMSG(fmt, args...) do {} while (0)
1221 +#define DBGMSG_ENTER() do {} while (0)
1222 +#define DBGMSG_LEAVE() do {} while (0)
1225 +#define FAILMSG(fmt, args...) \
1227 + printk(KERN_ERR "%s: "fmt"\n", MODULE_NAME, ## args); } while (0)
1229 +struct fpgadl_ser_dev_t {
1232 + FPGADL_SER_DEV_STATE_STRUCT_ALLOCATED,
1233 + FPGADL_SER_DEV_STATE_SPI_SETUP,
1234 + FPGADL_SER_DEV_STATE_FPGADL_DEV_REGISTERED,
1236 + struct spi_transfer t;
1237 + struct spi_message m;
1238 + struct spi_device *spi;
1239 + struct fpgadl_device fpgadl_dev;
1242 +#define MAX_FPGADL_SER_DEV 5
1244 +static int fpgadl_ser_dev_count;
1246 +static int fpgadl_ser_write_byte(struct fpgadl_device *fpgadl_dev,
1247 + u8 *data, int size)
1250 + struct fpgadl_ser_dev_t *fpgadl_ser_dev;
1252 + fpgadl_ser_dev = (struct fpgadl_ser_dev_t *) fpgadl_dev->devdata;
1255 + FAILMSG("NULL data pointer");
1259 + spi_message_init(&fpgadl_ser_dev->m);
1260 + fpgadl_ser_dev->t.tx_buf = data;
1261 + fpgadl_ser_dev->t.len = size;
1262 + spi_message_add_tail(&fpgadl_ser_dev->t, &fpgadl_ser_dev->m);
1264 + status = spi_sync(fpgadl_ser_dev->spi, &fpgadl_ser_dev->m);
1266 + FAILMSG("spi_sync() failed (%d)", status);
1271 +static void fpgadl_ser_cleanup(struct fpgadl_ser_dev_t *dev)
1278 + switch (dev->state) {
1279 + case FPGADL_SER_DEV_STATE_FPGADL_DEV_REGISTERED:
1280 + fpgadl_unregister_device(&dev->fpgadl_dev);
1281 + case FPGADL_SER_DEV_STATE_SPI_SETUP:
1282 + case FPGADL_SER_DEV_STATE_STRUCT_ALLOCATED:
1288 +static int __devinit fpgadl_ser_probe(struct spi_device *spi)
1291 + struct fpgadl_ser_dev_t *dev = NULL;
1295 + if (fpgadl_ser_dev_count == MAX_FPGADL_SER_DEV) {
1296 + FAILMSG("Maximum number of devices reached (%d)",
1297 + fpgadl_ser_dev_count);
1302 + DBGMSG(" device %d", fpgadl_ser_dev_count);
1304 + dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1306 + FAILMSG("Failed to allocate device structure");
1310 + /* Set some default values. */
1311 + dev->state = FPGADL_SER_DEV_STATE_STRUCT_ALLOCATED;
1313 + DBGMSG(" SPI mode = %d", spi->mode);
1315 + if (!spi->dev.platform_data) {
1316 + FAILMSG("Error getting platform data");
1320 + dev->fpgadl_dev.pdata = spi->dev.platform_data;
1321 + spi->dev.driver_data = dev; /* Private driver data */
1323 + spi->bits_per_word = 8; /* Size of Tx and Rx transfers. */
1324 + res = spi_setup(spi);
1326 + FAILMSG("Error setting-up SPI");
1330 + dev->state = FPGADL_SER_DEV_STATE_SPI_SETUP;
1332 + dev->fpgadl_dev.write_byte = fpgadl_ser_write_byte;
1333 + sprintf(dev->devname, "fpgadl_ser%d", fpgadl_ser_dev_count);
1334 + DBGMSG(" NAME = %s", dev->devname);
1335 + dev->fpgadl_dev.name = dev->devname;
1336 + dev->fpgadl_dev.devdata = dev; /* For our write_byte() callback */
1337 + res = fpgadl_register_device(&dev->fpgadl_dev);
1339 + FAILMSG("Error registering fpgadl_ser device");
1342 + dev->state = FPGADL_SER_DEV_STATE_FPGADL_DEV_REGISTERED;
1344 + fpgadl_ser_dev_count++;
1349 + fpgadl_ser_cleanup(dev);
1353 +static int __devexit fpgadl_ser_remove(struct spi_device *spi)
1355 + struct fpgadl_ser_dev_t *dev = spi_get_drvdata(spi);
1358 + fpgadl_ser_cleanup(dev);
1362 +static struct spi_driver fpgadl_ser_spi_driver = {
1364 + .name = MODULE_NAME,
1365 + .bus = &spi_bus_type,
1366 + .owner = THIS_MODULE,
1368 + .probe = fpgadl_ser_probe,
1369 + .remove = fpgadl_ser_remove,
1372 +static struct fpgadl_driver fpgadl_ser_driver = {
1373 + .version = MODULE_VERSION_STR,
1374 + .module = THIS_MODULE,
1376 + .name = "fpgadl_ser",
1380 +static int __init fpgadl_ser_init(void)
1386 + /* Register with the driver core. */
1387 + res = fpgadl_register_driver(&fpgadl_ser_driver);
1389 + FAILMSG("Can't register fpgadl serial driver");
1393 + return spi_register_driver(&fpgadl_ser_spi_driver);
1395 +module_init(fpgadl_ser_init);
1397 +static void __exit fpgadl_ser_exit(void)
1400 + spi_unregister_driver(&fpgadl_ser_spi_driver);
1401 + fpgadl_unregister_driver(&fpgadl_ser_driver);
1403 +module_exit(fpgadl_ser_exit);
1405 +MODULE_DESCRIPTION("FPGA serial programming driver");
1406 +MODULE_AUTHOR("Hugo Villeneuve");
1407 +MODULE_LICENSE("GPL");
1408 diff --git a/include/linux/fpgadl.h b/include/linux/fpgadl.h
1409 new file mode 100644
1410 index 0000000..27d83f1
1412 +++ b/include/linux/fpgadl.h
1415 + * FPGA bitstream load header file.
1417 + * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
1419 + * This program is free software; you can redistribute it and/or modify
1420 + * it under the terms of the GNU General Public License as published by
1421 + * the Free Software Foundation; either version 2 of the License, or
1422 + * (at your option) any later version.
1424 + * This program is distributed in the hope that it will be useful,
1425 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1426 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1427 + * GNU General Public License for more details.
1429 + * You should have received a copy of the GNU General Public License
1430 + * along with this program; if not, write to the Free Software
1431 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1437 +#include <linux/miscdevice.h>
1439 +/* FPGA device-specific informations and functions. */
1440 +struct fpgadl_pdata_t {
1442 + FPGA_VENDOR_XILINX,
1443 + FPGA_VENDOR_ALTERA,
1446 + FPGA_FAMILY_XILINX_XC3S,
1447 + FPGA_FAMILY_XILINX_XC4V,
1449 + ssize_t payload_full_size;
1453 + char *bitstream_name;
1454 + int check_init_low; /* Set to 1 to check that the INIT pin is low during
1455 + * programming. Normally, we should check if INIT_B
1456 + * is low during configuration, indicating a
1457 + * configuration error. But this may cause problems
1458 + * for bitstreams where the INIT_B pin is used as a
1459 + * GPIO after configuration. */
1462 +struct fpgadl_driver {
1464 + struct module *module;
1465 + struct device_driver driver;
1466 + struct driver_attribute version_attr;
1469 +struct fpgadl_device {
1473 + FPGADL_DEV_STATE_START,
1474 + FPGADL_DEV_STATE_DEVICE_REGISTERED,
1475 + FPGADL_DEV_STATE_GPIO_REGISTERED,
1476 + FPGADL_DEV_STATE_CHAR_DEV_REGISTERED,
1478 + int bitstream_buffer_allocated;
1479 + u8 *bitstream_data;
1480 + size_t bitstream_length;
1481 + size_t bitstream_max_size;
1482 + int bitstream_mode;
1483 + int bitstream_loaded;
1484 + int (*write_byte)(struct fpgadl_device *, u8 *, int);
1485 + void *devdata; /* Pointer to interface-specific (SPI/PAR) device */
1486 + struct miscdevice miscdev;
1487 + struct fpgadl_driver *driver;
1488 + struct fpgadl_pdata_t *pdata;
1489 + struct device dev;
1492 +/* Bitstream types. */
1493 +#define BITSTREAM_MODE_UNKNOWN 0
1494 +#define BITSTREAM_MODE_FULL 1
1495 +#define BITSTREAM_MODE_PARTIAL 2
1497 +extern struct bus_type fpgadl_bus_type;
1499 +#define to_fpgadl_driver(drv) container_of(drv, struct fpgadl_driver, driver);
1501 +extern int fpgadl_register_driver(struct fpgadl_driver *drv);
1502 +extern void fpgadl_unregister_driver(struct fpgadl_driver *drv);
1504 +extern int fpgadl_register_device(struct fpgadl_device *fpgadldev);
1505 +extern void fpgadl_unregister_device(struct fpgadl_device *fpgadldev);
1507 +int fpgadl_is_bitstream_loaded(const char *name);
1509 +#endif /* FPGADL_H */