16
#include <drivers/char_dev.h>
17
#include <drivers/fpga.h>
18
#include <framework/mod/options.h>
19
#include <kernel/task/resource/idesc.h>
20
#include <lib/libds/indexator.h>
21
#include <mem/misc/pool.h>
24
#define FPGA_MAX OPTION_GET(NUMBER, fpga_pool_sz)
26
static struct fpga fpga_tab[FPGA_MAX];
27
INDEX_DEF(fpga_idx, 0, FPGA_MAX);
29
static const struct char_dev_ops fpga_dev_ops;
31
static int fpga_dev_open(struct char_dev *cdev, struct idesc *idesc) {
35
fpga = (struct fpga *)cdev;
37
err = fpga->ops->config_init(fpga);
39
log_error("Failed to init config for FPGA");
46
static void fpga_dev_close(struct char_dev *cdev) {
50
fpga = (struct fpga *)cdev;
52
err = fpga->ops->config_complete(fpga);
54
log_error(".conf_complete() finished with error code %d", err);
58
static ssize_t fpga_dev_read(struct char_dev *cdev, void *buf, size_t nbyte) {
63
static ssize_t fpga_dev_write(struct char_dev *cdev, const void *buf,
68
fpga = (struct fpga *)cdev;
70
err = fpga->ops->config_write(fpga, buf, nbyte);
72
log_error("Failed to write FPGA config");
79
struct fpga *fpga_register(struct fpga_ops *ops, void *priv) {
84
id = index_alloc(&fpga_idx, INDEX_MIN);
85
snprintf(name, sizeof(name), "fpga%d", id);
87
fpga_tab[id] = (struct fpga){
93
char_dev_init(&fpga_tab[id].cdev, name, &fpga_dev_ops);
95
err = char_dev_register(&fpga_tab[id].cdev);
97
index_free(&fpga_idx, id);
101
return &fpga_tab[id];
104
int fpga_unregister(struct fpga *fpga) {
109
index_free(&fpga_idx, fpga->id);
111
char_dev_unregister(&fpga->cdev);
116
struct fpga *fpga_by_id(size_t id) {
117
if (id >= FPGA_MAX) {
121
if (!index_locked(&fpga_idx, id)) {
125
return &fpga_tab[id];
128
size_t fpga_max_id(void) {
132
static const struct char_dev_ops fpga_dev_ops = {
133
.open = fpga_dev_open,
134
.close = fpga_dev_close,
135
.read = fpga_dev_read,
136
.write = fpga_dev_write,