Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
M
Mock Turtle
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
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
Mock Turtle
Commits
eada2a9e
Commit
eada2a9e
authored
May 04, 2018
by
Federico Vaga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sw:drv: add debug interface
Signed-off-by:
Federico Vaga
<
federico.vaga@cern.ch
>
parent
2c425e43
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
121 additions
and
16 deletions
+121
-16
linux-driver.rst
doc/software/linux-driver.rst
+9
-0
Makefile
software/kernel/Makefile
+1
-0
mockturtle-core.c
software/kernel/mockturtle-core.c
+4
-11
mockturtle-dbg.c
software/kernel/mockturtle-dbg.c
+101
-0
mockturtle-drv.h
software/kernel/mockturtle-drv.h
+6
-5
No files found.
doc/software/linux-driver.rst
View file @
eada2a9e
...
...
@@ -244,3 +244,12 @@ You can find the HMQ *sysfs* attributes at::
.. [1] https://www.kernel.org/doc/Documentation/driver-model/platform.txt
Debugging Interface
-------------------
The driver exports on debugfs a file in YAML format which contains status
information: variable values, register values. This file is named as
the Mock Turtle instance that represents "trtl-%04x".::
cat /sys/kernel/debug/trtl-0001
software/kernel/Makefile
View file @
eada2a9e
...
...
@@ -25,6 +25,7 @@ mockturtle-y := mockturtle-core.o
mockturtle-y
+=
mockturtle-cpu.o
mockturtle-y
+=
mockturtle-hmq.o
mockturtle-y
+=
mockturtle-tty.o
mockturtle-y
+=
mockturtle-dbg.o
all modules
:
$(MAKE)
-C
$(LINUX)
M
=
$(
shell
/bin/pwd
)
modules
...
...
software/kernel/mockturtle-core.c
View file @
eada2a9e
...
...
@@ -14,7 +14,6 @@
#include <linux/vmalloc.h>
#include <linux/interrupt.h>
#include <linux/byteorder/generic.h>
#include <linux/debugfs.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/spinlock.h>
...
...
@@ -637,13 +636,6 @@ int trtl_probe(struct platform_device *pdev)
goto
out_cfg
;
}
trtl
->
dbg_dir
=
debugfs_create_dir
(
dev_name
(
&
trtl
->
dev
),
NULL
);
if
(
IS_ERR_OR_NULL
(
trtl
->
dbg_dir
))
{
dev_err
(
&
pdev
->
dev
,
"Cannot create debugfs
\n
"
);
err
=
PTR_ERR
(
trtl
->
dbg_dir
);
goto
out_dbg
;
}
/* Reset all CPUs */
trtl_cpu_reset_set
(
trtl
,
(
1
<<
trtl
->
cfgrom
.
n_cpu
)
-
1
);
...
...
@@ -691,13 +683,13 @@ int trtl_probe(struct platform_device *pdev)
dev_info
(
&
trtl
->
dev
,
"%s: Application ID: 0x%08x
\n
"
,
__func__
,
trtl
->
cfgrom
.
app_id
);
trtl_debugfs_init
(
trtl
);
return
0
;
out_cpu:
while
(
--
i
)
trtl_remove_cpu
(
trtl
,
i
);
debugfs_remove_recursive
(
trtl
->
dbg_dir
);
out_dbg:
out_rom:
sysfs_remove_bin_file
(
&
trtl
->
dev
.
kobj
,
&
trtl_config_rom_sysfs
);
out_cfg:
...
...
@@ -717,6 +709,8 @@ int trtl_remove(struct platform_device *pdev)
struct
trtl_dev
*
trtl
=
platform_get_drvdata
(
pdev
);
int
i
;
trtl_debugfs_exit
(
trtl
);
trtl_tty_remove
(
trtl
);
for
(
i
=
0
;
i
<
trtl
->
cfgrom
.
n_cpu
;
++
i
)
...
...
@@ -727,7 +721,6 @@ int trtl_remove(struct platform_device *pdev)
free_irq
(
platform_get_irq
(
pdev
,
TRTL_IRQ_HMQ_OUT
),
trtl
);
free_irq
(
platform_get_irq
(
pdev
,
TRTL_IRQ_NOT
),
trtl
);
debugfs_remove_recursive
(
trtl
->
dbg_dir
);
sysfs_remove_bin_file
(
&
trtl
->
dev
.
kobj
,
&
trtl_config_rom_sysfs
);
/* FIXME cannot explain why, but without sleep the _kernel_ crash */
...
...
software/kernel/mockturtle-dbg.c
0 → 100644
View file @
eada2a9e
/*
* Copyright (C) 2014-2016 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/seq_file.h>
#include <hw/mockturtle_cpu_csr.h>
#include "mockturtle-drv.h"
static
int
trtl_dbg_info_seq_read
(
struct
seq_file
*
s
,
void
*
data
)
{
struct
trtl_dev
*
trtl
=
s
->
private
;
struct
trtl_cpu
*
cpu
;
struct
trtl_hmq
*
hmq
;
int
i
,
k
;
seq_printf
(
s
,
"%s
\n
"
,
dev_name
(
&
trtl
->
dev
));
seq_printf
(
s
,
"cpu-core:
\n
"
);
seq_printf
(
s
,
" HMQ input status LO: 0x%x:
\n
"
,
trtl_ioread
(
trtl
,
trtl
->
base_csr
+
MT_CPU_CSR_REG_HMQI_STATUS_LO
));
seq_printf
(
s
,
" HMQ input status HI: 0x%x:
\n
"
,
trtl_ioread
(
trtl
,
trtl
->
base_csr
+
MT_CPU_CSR_REG_HMQI_STATUS_HI
));
seq_printf
(
s
,
" HMQ output status LO: 0x%x:
\n
"
,
trtl_ioread
(
trtl
,
trtl
->
base_csr
+
MT_CPU_CSR_REG_HMQO_STATUS_LO
));
seq_printf
(
s
,
" HMQ output status HI: 0x%x:
\n
"
,
trtl_ioread
(
trtl
,
trtl
->
base_csr
+
MT_CPU_CSR_REG_HMQO_STATUS_HI
));
seq_printf
(
s
,
" cpu-core:
\n
"
);
for
(
i
=
0
;
i
<
trtl
->
cfgrom
.
n_cpu
;
++
i
)
{
cpu
=
&
trtl
->
cpu
[
i
];
seq_printf
(
s
,
" - index: %d
\n
"
,
cpu
->
index
);
seq_printf
(
s
,
" name: %s
\n
"
,
dev_name
(
&
cpu
->
dev
));
seq_printf
(
s
,
" hmq:
\n
"
);
for
(
k
=
0
;
k
<
trtl
->
cfgrom
.
n_hmq
[
i
];
++
k
)
{
hmq
=
&
cpu
->
hmq
[
k
];
seq_printf
(
s
,
" - index: %d
\n
"
,
hmq
->
index
);
seq_printf
(
s
,
" name: %s
\n
"
,
dev_name
(
&
hmq
->
dev
));
seq_printf
(
s
,
" buf-in-r: %d (look user)
\n
"
,
hmq
->
buf_in
.
idx_r
);
seq_printf
(
s
,
" buf-in-w: %d
\n
"
,
hmq
->
buf_in
.
idx_w
);
seq_printf
(
s
,
" buf-out-r: %d
\n
"
,
hmq
->
buf_out
.
idx_r
);
seq_printf
(
s
,
" buf-out-w: %d
\n
"
,
hmq
->
buf_out
.
idx_w
);
}
}
return
0
;
}
static
int
trtl_dbg_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
single_open
(
file
,
trtl_dbg_info_seq_read
,
inode
->
i_private
);
}
static
const
struct
file_operations
trtl_dbg_info_ops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
trtl_dbg_info_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
single_release
,
};
/**
* It creates the debug info file
* @trtl: the mock turtle device instance
*/
void
trtl_debugfs_init
(
struct
trtl_dev
*
trtl
)
{
char
name
[
20
];
trtl
->
dbg_dir
=
debugfs_create_dir
(
dev_name
(
&
trtl
->
dev
),
NULL
);
if
(
IS_ERR_OR_NULL
(
trtl
->
dbg_dir
))
{
dev_err
(
&
trtl
->
dev
,
"Cannot create debugfs
\n
"
);
return
;
}
trtl
->
dbg_info
=
debugfs_create_file
(
"info"
,
0444
,
trtl
->
dbg_dir
,
trtl
,
&
trtl_dbg_info_ops
);
if
(
IS_ERR_OR_NULL
(
trtl
->
dbg_info
))
{
dev_err
(
&
trtl
->
dev
,
"Cannot create debugfs file: %ld
\n
"
,
PTR_ERR
(
trtl
->
dbg_info
));
trtl
->
dbg_info
=
NULL
;
}
}
/**
* It removes the debug info file
* @trtl: the mock turtle device instance
*/
void
trtl_debugfs_exit
(
struct
trtl_dev
*
trtl
)
{
if
(
trtl
->
dbg_dir
)
debugfs_remove_recursive
(
trtl
->
dbg_dir
);
}
software/kernel/mockturtle-drv.h
View file @
eada2a9e
...
...
@@ -182,7 +182,6 @@ struct trtl_cpu {
int
index
;
/**< instance number */
struct
device
dev
;
/**< device representing a single CPU */
struct
dentry
*
dbg_msg
;
/**< debug messages interface */
struct
circ_buf
cbuf
;
/**< debug circular buffer */
struct
spinlock
lock
;
struct
trtl_hmq
hmq
[
TRTL_MAX_MQ_CHAN
];
/**< list of HMQ slots used by
...
...
@@ -214,8 +213,6 @@ struct trtl_dev {
enum
trtl_smem_modifier
mod
;
/**< smem operation modifier */
struct
dentry
*
dbg_dir
;
/**< root debug directory */
uint32_t
message_sequence
;
/**< message sequence number */
struct
spinlock
lock_cpu_sel
;
struct
spinlock
lock_hmq_sel
;
...
...
@@ -223,6 +220,9 @@ struct trtl_dev {
const
struct
trtl_config_rom
cfgrom
;
/**< synthesis configuration ROM */
struct
tty_driver
*
tty_driver
;
struct
dentry
*
dbg_dir
;
/**< root debug directory */
struct
dentry
*
dbg_info
;
/**< information */
};
static
inline
u32
trtl_ioread
(
struct
trtl_dev
*
trtl
,
void
*
addr
)
...
...
@@ -242,7 +242,6 @@ extern int trtl_minor_get(struct device *dev, enum trtl_dev_type type);
extern
void
trtl_minor_put
(
struct
device
*
dev
);
/* CPU data */
extern
const
struct
file_operations
trtl_cpu_dbg_fops
;
extern
const
struct
file_operations
trtl_cpu_fops
;
extern
const
struct
attribute_group
*
trtl_cpu_groups
[];
extern
void
trtl_cpu_reset_set
(
struct
trtl_dev
*
trtl
,
uint8_t
mask
);
...
...
@@ -258,7 +257,9 @@ extern void trtl_hmq_purge(struct trtl_hmq *hmq);
/* TTY */
extern
int
trtl_tty_probe
(
struct
trtl_dev
*
trtl
);
extern
void
trtl_tty_remove
(
struct
trtl_dev
*
trtl
);
/* DBG */
extern
void
trtl_debugfs_init
(
struct
trtl_dev
*
trtl
);
extern
void
trtl_debugfs_exit
(
struct
trtl_dev
*
trtl
);
extern
struct
class
trtl_cdev_class
;
...
...
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