Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Simple VME FMC Carrier SVEC - Software
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
Simple VME FMC Carrier SVEC - Software
Commits
a57d349d
Commit
a57d349d
authored
Nov 20, 2015
by
Federico Vaga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
TEMP kernel: add nyab support
Signed-off-by:
Federico Vaga
<
federico.vaga@gmail.com
>
parent
28431f5d
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
85 additions
and
2 deletions
+85
-2
Makefile
kernel/Makefile
+3
-2
svec-drv.c
kernel/svec-drv.c
+80
-0
svec.h
kernel/svec.h
+2
-0
No files found.
kernel/Makefile
View file @
a57d349d
LINUX
?=
/lib/modules/
$(
shell
uname
-r
)
/build
NYAB
?=
$(HOME)
/git/nyab
FMC_BUS
?=
$(
shell
pwd
)
/../fmc-bus
export
FMC_BUS
...
...
@@ -16,12 +16,13 @@ endif
# include our header before to avoid conflicts with the kernel
LINUXINCLUDE
:=
-I
$(FMC_BUS)
/kernel/include
$(LINUXINCLUDE)
ccflags-y
+=
-I
$(NYAB)
/kernel
ccflags-y
+=
-DDEBUG
ccflags-y
+=
-DGIT_VERSION
=
\"
$(GIT_VERSION)
\"
KBUILD_EXTRA_SYMBOLS
+=
$(obj)
/Module.symvers.vme
KBUILD_EXTRA_SYMBOLS
+=
$(obj)
/Module.symvers.fmc
KBUILD_EXTRA_SYMBOLS
+=
$(NYAB)
/kernel/Module.symvers
obj-m
:=
svec.o
svec-objs
:=
svec-drv.o
...
...
kernel/svec-drv.c
View file @
a57d349d
...
...
@@ -17,6 +17,7 @@
#include <linux/delay.h>
#include <linux/jhash.h>
#include <linux/fmc-sdb.h>
#include <nyab.h>
#include "svec.h"
#include "hw/xloader_regs.h"
...
...
@@ -378,6 +379,9 @@ static int svec_remove(struct device *pdev, unsigned int ndev)
{
struct
svec_dev
*
svec
=
dev_get_drvdata
(
pdev
);
nyab_carrier_unregister
(
svec
->
ncarrier
);
nyab_carrier_free
(
svec
->
ncarrier
);
if
(
test_bit
(
SVEC_FLAG_FMCS_REGISTERED
,
&
svec
->
flags
))
{
svec_fmc_destroy
(
svec
);
clear_bit
(
SVEC_FLAG_FMCS_REGISTERED
,
&
svec
->
flags
);
...
...
@@ -703,6 +707,9 @@ int svec_reconfigure(struct svec_dev *svec, struct fmc_gateware *gw)
set_bit
(
SVEC_FLAG_FMCS_REGISTERED
,
&
svec
->
flags
);
}
/* Update NYAB base kernel address */
svec
->
ncarrier
->
kernel_va
=
svec
->
map
[
MAP_REG
]
->
kernel_va
;
return
0
;
failed_unmap:
svec_unmap_window
(
svec
,
MAP_REG
);
...
...
@@ -793,6 +800,56 @@ static void svec_destroy_misc_device(struct svec_dev *svec)
}
/* * * * * * END MISC DEVICE * * * * */
struct
svec_nyab_data
{
char
fmc_slot
[
2
][
NYAB_MAX_STR_LEN
];
char
bitstream
[
NYAB_MAX_STR_LEN
];
};
/**
* It validates carrier private data
*/
static
int
svec_nyab_validate
(
struct
nyab_carrier
*
carrier
)
{
struct
svec_dev
*
svec
=
dev_get_drvdata
(
carrier
->
dev
.
parent
);
struct
svec_nyab_data
*
data
;
int
i
,
err
;
/* verify that the the description is for SVEC */
if
(
strncasecmp
(
carrier
->
carr
->
name
,
"SVEC"
,
64
))
{
dev_err
(
&
carrier
->
dev
,
"Description for '%s' but the carrier is 'svec'"
,
carrier
->
carr
->
name
);
return
-
EINVAL
;
}
if
(
sizeof
(
struct
svec_nyab_data
)
!=
carrier
->
private
.
len
)
{
dev_err
(
&
carrier
->
dev
,
"Carrier private data length differ from descriptor"
);
return
-
EINVAL
;
}
data
=
carrier
->
private
.
data
;
for
(
i
=
0
;
i
<
2
;
++
i
)
{
if
(
strncmp
(
data
->
fmc_slot
[
i
],
svec
->
fmcs
[
i
]
->
id
.
product_name
,
NYAB_MAX_STR_LEN
))
{
dev_err
(
&
carrier
->
dev
,
"Expected '%s' mezzanine in slot %d, found '%s'"
,
data
->
fmc_slot
[
i
],
i
,
svec
->
fmcs
[
i
]
->
id
.
product_name
);
return
-
EINVAL
;
}
}
err
=
svec_load_fpga_file
(
svec
,
data
->
bitstream
);
if
(
err
)
return
err
;
svec_setup_csr
(
svec
);
return
0
;
}
static
const
struct
nyab_carrier_operations
svec_nyab_op
=
{
.
validate
=
svec_nyab_validate
,
};
static
int
svec_probe
(
struct
device
*
pdev
,
unsigned
int
ndev
)
{
...
...
@@ -877,11 +934,34 @@ static int svec_probe(struct device *pdev, unsigned int ndev)
goto
failed_misc
;
}
/* Load NYAB carrier device for our FPGA */
svec
->
ncarrier
=
nyab_carrier_alloc
(
pdev
,
0
);
if
(
!
svec
->
ncarrier
)
{
error
=
-
ENOMEM
;
goto
failed_nyab_alloc
;
}
svec
->
ncarrier
->
op
=
&
svec_nyab_op
;
svec
->
ncarrier
->
irq
=
svec
->
cfg_cur
.
interrupt_vector
;
/* Map user address space & give control to the FMCs */
svec_reconfigure
(
svec
,
NULL
);
error
=
nyab_carrier_register
(
svec
->
ncarrier
,
svec
->
lun
);
if
(
error
)
goto
failed_nyab_reg
;
return
0
;
failed_nyab_reg:
if
(
test_bit
(
SVEC_FLAG_FMCS_REGISTERED
,
&
svec
->
flags
))
{
svec_fmc_destroy
(
svec
);
clear_bit
(
SVEC_FLAG_FMCS_REGISTERED
,
&
svec
->
flags
);
}
svec_unmap_window
(
svec
,
MAP_CR_CSR
);
svec_unmap_window
(
svec
,
MAP_REG
);
nyab_carrier_free
(
svec
->
ncarrier
);
failed_nyab_alloc:
failed_misc:
svec_remove_sysfs_files
(
svec
);
failed:
...
...
kernel/svec.h
View file @
a57d349d
...
...
@@ -92,6 +92,8 @@ struct svec_dev {
void
*
fw_buffer
;
int
fw_length
;
struct
nyab_carrier
*
ncarrier
;
};
/* Functions and data in svec-vme.c */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment