Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Simple PCIe FMC carrier SPEC - Software
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
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 PCIe FMC carrier SPEC - Software
Commits
98ca8c01
Commit
98ca8c01
authored
Dec 15, 2015
by
Federico Vaga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add nyab support
Signed-off-by:
Federico Vaga
<
federico.vaga@cern.ch
>
parent
d56cd47c
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
73 additions
and
1 deletion
+73
-1
Kbuild
kernel/Kbuild
+2
-0
Makefile
kernel/Makefile
+1
-0
spec-pci.c
kernel/spec-pci.c
+69
-1
spec.h
kernel/spec.h
+1
-0
No files found.
kernel/Kbuild
View file @
98ca8c01
KBUILD_EXTRA_SYMBOLS := $(FMC_BUS_ABS)/kernel/Module.symvers
KBUILD_EXTRA_SYMBOLS += $(NYAB)/kernel/Module.symvers
# add versions of supermodule. It is useful when spec-sw is included as sub-module
# of a bigger project that we want to track
...
...
@@ -18,6 +19,7 @@ LINUXINCLUDE := -I$(FMC_BUS_ABS)/kernel/include -I$(src)/include/linux $(LINUXI
ccflags-y += -I$(src)/include
ccflags-y += $(WR_NIC_CFLAGS)
ccflags-y += -DGIT_VERSION=\"$(GIT_VERSION)\"
ccflags-y += -I$(NYAB)/kernel
# this is a bad hack. Sometimes we are a submodule, and wr-nic can
...
...
kernel/Makefile
100644 → 100755
View file @
98ca8c01
...
...
@@ -16,6 +16,7 @@ export GIT_VERSION
FMC_BUS_VERSION
?=
$(
shell
cd
$(FMC_BUS_ABS)
;
git describe
--always
--dirty
--long
--tags
)
export
FMC_BUS_VERSION
all modules
:
$(MAKE)
-C
$(LINUX)
M
=
$(
shell
/bin/pwd
)
FMC_BUS_ABS
=
$(FMC_BUS_ABS)
modules
...
...
kernel/spec-pci.c
View file @
98ca8c01
...
...
@@ -23,7 +23,7 @@
#include <linux/version.h>
#include <linux/fs.h>
#include <linux/vmalloc.h>
#include <nyab.h>
#include "spec.h"
#include "loader-ll.h"
...
...
@@ -194,6 +194,51 @@ static void spec_destroy_misc_device(struct spec_dev *spec)
}
/* * * * * * END MISC DEVICE * * * * */
struct
spec_nyab_data
{
char
fmc_slot
[
NYAB_MAX_STR_LEN
];
char
bitstream
[
NYAB_MAX_STR_LEN
];
};
/**
* It validates carrier private data
*/
static
int
spec_nyab_validate
(
struct
nyab_carrier
*
carrier
)
{
struct
spec_dev
*
spec
=
dev_get_drvdata
(
carrier
->
dev
.
parent
);
struct
spec_nyab_data
*
data
;
int
i
,
err
;
if
(
strncasecmp
(
carrier
->
carr
->
name
,
"SPEC"
,
64
))
{
dev_err
(
&
carrier
->
dev
,
"Description for '%s' but the carrier is 'spec'"
,
carrier
->
carr
->
name
);
return
-
EINVAL
;
}
if
(
sizeof
(
struct
spec_nyab_data
)
!=
carrier
->
private
.
len
)
{
dev_err
(
&
carrier
->
dev
,
"Carrier private data length differ from descriptor"
);
return
-
EINVAL
;
}
data
=
carrier
->
private
.
data
;
if
(
strncmp
(
data
->
fmc_slot
,
spec
->
fmc
->
id
.
product_name
,
NYAB_MAX_STR_LEN
))
{
dev_err
(
&
carrier
->
dev
,
"Expected '%s' mezzanine in slot %d, found '%s'"
,
data
->
fmc_slot
[
i
],
i
,
spec
->
fmc
->
id
.
product_name
);
return
-
EINVAL
;
}
err
=
spec_load_fpga_file
(
spec
,
data
->
bitstream
);
if
(
err
)
return
err
;
return
0
;
}
static
const
struct
nyab_carrier_operations
spec_nyab_op
=
{
.
validate
=
spec_nyab_validate
,
};
static
int
spec_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
id
)
{
...
...
@@ -265,8 +310,28 @@ static int spec_probe(struct pci_dev *pdev,
goto
failed_misc
;
}
/* Load NYAB carrier device for our FPGA */
spec
->
ncarrier
=
nyab_carrier_alloc
(
&
pdev
->
dev
,
0
);
if
(
!
spec
->
ncarrier
)
{
ret
=
-
ENOMEM
;
goto
failed_nyab_alloc
;
}
spec
->
ncarrier
->
op
=
&
spec_nyab_op
;
spec
->
ncarrier
->
irq
=
pdev
->
irq
;
spec
->
ncarrier
->
kernel_va
=
spec
->
remap
[
0
];
ret
=
nyab_carrier_register
(
spec
->
ncarrier
,
pdev
->
bus
->
number
<<
16
|
pdev
->
devfn
);
if
(
ret
)
goto
failed_nyab_reg
;
return
0
;
failed_nyab_reg:
nyab_carrier_free
(
spec
->
ncarrier
);
failed_nyab_alloc:
spec_destroy_misc_device
(
spec
);
failed_misc:
spec_fmc_destroy
(
spec
);
out_unmap:
...
...
@@ -291,6 +356,9 @@ static void spec_remove(struct pci_dev *pdev)
dev_info
(
&
pdev
->
dev
,
"remove
\n
"
);
nyab_carrier_unregister
(
spec
->
ncarrier
);
nyab_carrier_free
(
spec
->
ncarrier
);
spec_destroy_misc_device
(
spec
);
spec_fmc_destroy
(
spec
);
for
(
i
=
0
;
i
<
3
;
i
++
)
{
...
...
kernel/spec.h
View file @
98ca8c01
...
...
@@ -42,6 +42,7 @@ struct spec_dev {
struct
miscdevice
mdev
;
char
name
[
SPEC_NAME_LEN
];
struct
nyab_carrier
*
ncarrier
;
};
#define SPEC_FLAG_FAKE_EEPROM 0x00000001
...
...
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