Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
linux-elphel
Commits
8db53331
Commit
8db53331
authored
Nov 30, 2016
by
Mikhail Karpenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add a bit more debug output to AHCI driver
parent
04b8faaf
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
10 deletions
+45
-10
ahci_elphel.c
src/drivers/ata/ahci_elphel.c
+45
-10
No files found.
src/drivers/ata/ahci_elphel.c
View file @
8db53331
...
@@ -47,6 +47,9 @@
...
@@ -47,6 +47,9 @@
#define PROP_NAME_CLB_OFFS "clb_offs"
#define PROP_NAME_CLB_OFFS "clb_offs"
#define PROP_NAME_FB_OFFS "fb_offs"
#define PROP_NAME_FB_OFFS "fb_offs"
#define DATASCOPE_OFFSET 0x1000
#define DATASCOPE_SIZE 0x200
static
struct
ata_port_operations
ahci_elphel_ops
;
static
struct
ata_port_operations
ahci_elphel_ops
;
static
const
struct
ata_port_info
ahci_elphel_port_info
;
static
const
struct
ata_port_info
ahci_elphel_port_info
;
static
struct
scsi_host_template
ahci_platform_sht
;
static
struct
scsi_host_template
ahci_platform_sht
;
...
@@ -79,8 +82,9 @@ static inline void reset_chunks(struct fvec *vects, int all);
...
@@ -79,8 +82,9 @@ static inline void reset_chunks(struct fvec *vects, int all);
static
int
check_chunks
(
struct
fvec
*
vects
);
static
int
check_chunks
(
struct
fvec
*
vects
);
static
void
dump_sg_list
(
const
struct
device
*
dev
,
const
struct
fvec
*
sgl
,
size_t
elems
);
static
void
dump_sg_list
(
const
struct
device
*
dev
,
const
struct
fvec
*
sgl
,
size_t
elems
);
static
void
dump_sg_list_uncond
(
const
struct
fvec
*
sgl
,
size_t
elems
);
static
void
dump_sg_list_uncond
(
const
struct
fvec
*
sgl
,
size_t
elems
);
static
void
dump_iomem
(
void
__iomem
*
mmio
);
static
void
dump_iomem
(
void
__iomem
*
mmio
,
size_t
sz
,
dma_addr_t
dma_addr
);
static
void
dump_dpriv_fields
(
struct
elphel_ahci_priv
*
dpriv
);
static
void
dump_dpriv_fields
(
struct
elphel_ahci_priv
*
dpriv
);
static
void
dump_current_state
(
struct
elphel_ahci_priv
*
dpriv
);
static
ssize_t
set_load_flag
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
static
ssize_t
set_load_flag
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buff
,
size_t
buff_sz
)
const
char
*
buff
,
size_t
buff_sz
)
...
@@ -219,7 +223,6 @@ static irqreturn_t elphel_irq_handler(int irq, void * dev_instance)
...
@@ -219,7 +223,6 @@ static irqreturn_t elphel_irq_handler(int irq, void * dev_instance)
struct
elphel_ahci_priv
*
dpriv
=
hpriv
->
plat_data
;
struct
elphel_ahci_priv
*
dpriv
=
hpriv
->
plat_data
;
uint32_t
irq_stat
,
host_irq_stat
;
uint32_t
irq_stat
,
host_irq_stat
;
if
(
dpriv
->
flags
&
IRQ_SIMPLE
)
{
if
(
dpriv
->
flags
&
IRQ_SIMPLE
)
{
/* handle interrupt from internal command */
/* handle interrupt from internal command */
host_irq_stat
=
readl
(
hpriv
->
mmio
+
HOST_IRQ_STAT
);
host_irq_stat
=
readl
(
hpriv
->
mmio
+
HOST_IRQ_STAT
);
...
@@ -1186,15 +1189,14 @@ void error_handler(struct elphel_ahci_priv *dpriv)
...
@@ -1186,15 +1189,14 @@ void error_handler(struct elphel_ahci_priv *dpriv)
struct
ahci_host_priv
*
hpriv
=
host
->
private_data
;
struct
ahci_host_priv
*
hpriv
=
host
->
private_data
;
struct
ata_port
*
ap
=
host
->
ports
[
DEFAULT_PORT_NUM
];
struct
ata_port
*
ap
=
host
->
ports
[
DEFAULT_PORT_NUM
];
struct
ata_link
*
link
=
&
ap
->
link
;
struct
ata_link
*
link
=
&
ap
->
link
;
struct
ahci_port_priv
*
pp
=
ap
->
private_data
;
int
pmp
=
link
->
pmp
;
int
pmp
=
link
->
pmp
;
int
rc
;
int
rc
;
unsigned
int
class
;
unsigned
int
class
;
unsigned
long
deadline
=
jiffies
+
msecs_to_jiffies
(
DEFAULT_CMD_TIMEOUT
);
unsigned
long
deadline
=
jiffies
+
msecs_to_jiffies
(
DEFAULT_CMD_TIMEOUT
);
dump_iomem
(
hpriv
->
mmio
);
dump_current_state
(
dpriv
);
dump_dpriv_fields
(
dpriv
);
dump_sg_list_uncond
(
dpriv
->
sgl
,
dpriv
->
sg_elems
);
printk
(
KERN_DEBUG
"reset command queue and all flags
\n
"
);
printk
(
KERN_DEBUG
"reset command queue and all flags
\n
"
);
reset_all_commands
(
dpriv
);
reset_all_commands
(
dpriv
);
...
@@ -1713,15 +1715,16 @@ static void dump_sg_list_uncond(const struct fvec *sgl, size_t elems)
...
@@ -1713,15 +1715,16 @@ static void dump_sg_list_uncond(const struct fvec *sgl, size_t elems)
printk
(
KERN_DEBUG
"===== end of S/G list =====
\n
"
);
printk
(
KERN_DEBUG
"===== end of S/G list =====
\n
"
);
}
}
/** Debug function, make dump of controller's memory*/
/** Debug function, make dump of controller's memory
, sz is in DW
*/
static
void
dump_iomem
(
void
__iomem
*
mmio
)
static
void
dump_iomem
(
void
__iomem
*
mmio
,
size_t
sz
,
dma_addr_t
dma_addr
)
{
{
int
i
,
col
=
0
,
pos
=
0
;
int
i
,
col
=
0
,
pos
=
0
;
u32
val
;
u32
val
;
char
str
[
512
]
=
{
0
};
char
str
[
512
]
=
{
0
};
printk
(
KERN_DEBUG
"dump AHCI iomem:
\n
"
);
if
(
dma_addr
)
for
(
i
=
0
;
i
<
100
;
i
++
)
{
printk
(
KERN_DEBUG
"DMA address: 0x%08x
\n
"
,
dma_addr
);
for
(
i
=
0
;
i
<
sz
;
i
++
)
{
val
=
ioread32
(
mmio
+
4
*
i
);
val
=
ioread32
(
mmio
+
4
*
i
);
pos
+=
snprintf
(
&
str
[
pos
],
16
,
"0x%08x "
,
val
);
pos
+=
snprintf
(
&
str
[
pos
],
16
,
"0x%08x "
,
val
);
col
++
;
col
++
;
...
@@ -1731,7 +1734,8 @@ static void dump_iomem(void __iomem *mmio)
...
@@ -1731,7 +1734,8 @@ static void dump_iomem(void __iomem *mmio)
printk
(
KERN_DEBUG
"%s
\n
"
,
str
);
printk
(
KERN_DEBUG
"%s
\n
"
,
str
);
}
}
}
}
printk
(
KERN_DEBUG
"
\n
"
);
if
(
pos
!=
0
)
printk
(
KERN_DEBUG
"%s
\n
"
,
str
);
}
}
static
void
dump_dpriv_fields
(
struct
elphel_ahci_priv
*
dpriv
)
static
void
dump_dpriv_fields
(
struct
elphel_ahci_priv
*
dpriv
)
...
@@ -1745,6 +1749,37 @@ static void dump_dpriv_fields(struct elphel_ahci_priv *dpriv)
...
@@ -1745,6 +1749,37 @@ static void dump_dpriv_fields(struct elphel_ahci_priv *dpriv)
dpriv
->
lba_ptr
.
wr_count
,
dpriv
->
curr_cmd
,
dpriv
->
max_data_sz
,
dpriv
->
curr_data_chunk
,
dpriv
->
curr_data_offset
);
dpriv
->
lba_ptr
.
wr_count
,
dpriv
->
curr_cmd
,
dpriv
->
max_data_sz
,
dpriv
->
curr_data_chunk
,
dpriv
->
curr_data_offset
);
}
}
static
void
dump_current_state
(
struct
elphel_ahci_priv
*
dpriv
)
{
struct
ata_host
*
host
=
dev_get_drvdata
(
dpriv
->
dev
);
struct
ahci_host_priv
*
hpriv
=
host
->
private_data
;
struct
ata_port
*
ap
=
host
->
ports
[
DEFAULT_PORT_NUM
];
struct
ata_link
*
link
=
&
ap
->
link
;
struct
ahci_port_priv
*
pp
=
ap
->
private_data
;
uint32_t
*
datascope_ptr
;
printk
(
KERN_DEBUG
"===== HBA memory dump ======
\n
"
);
dump_iomem
(
hpriv
->
mmio
,
100
,
dpriv
->
base_addr
);
printk
(
KERN_DEBUG
"===== command list structure dump =====
\n
"
);
dump_iomem
(
pp
->
cmd_slot
,
8
,
pp
->
cmd_slot_dma
);
printk
(
KERN_DEBUG
"===== command FIS dump =====
\n
"
);
dump_iomem
(
pp
->
cmd_tbl
,
16
,
pp
->
cmd_tbl_dma
);
printk
(
KERN_DEBUG
"===== received FIS memory (last FIS received) dump =====
\n
"
);
dump_iomem
(
pp
->
rx_fis
,
64
,
pp
->
rx_fis_dma
);
// datascope_ptr = ioremap_nocache(dpriv->base_addr + DATASCOPE_OFFSET, DATASCOPE_SIZE);
// if (datascope_ptr) {
// printk(KERN_DEBUG "===== datascope (debug) data dump =====\n");
// dump_iomem(datascope_ptr, 512, dpriv->base_addr + DATASCOPE_OFFSET);
// iounmap(datascope_ptr);
// } else {
// printk(KERN_DEBUG "unable to ioremap datascope region\n");
// }
dump_dpriv_fields
(
dpriv
);
dump_sg_list_uncond
(
dpriv
->
sgl
,
dpriv
->
sg_elems
);
}
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Elphel, Inc."
);
MODULE_AUTHOR
(
"Elphel, Inc."
);
MODULE_DESCRIPTION
(
"Elphel AHCI SATA platform driver for elphel393 camera"
);
MODULE_DESCRIPTION
(
"Elphel AHCI SATA platform driver for elphel393 camera"
);
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