Commit 703553e3 authored by Tomasz Wlostowski's avatar Tomasz Wlostowski Committed by Alessandro Rubini

FMC: show_sdb_tree: dump synthesis/commit ID info

This completes the show_sdb_tree functionality, with the
new informative fields.  The output for a verbose module is now
like this (long lines are unavoidable):

 SDB: 00000651:e6a542c9 WB4-Crossbar-GSI
 SDB: 0000ce42:00000601 WB-DMA.Control      (00001000-0000103f)
 SDB: 0000ce42:779c5443 WB-OneWire-Master   (00001100-000011ff)
 SDB: 0000ce42:00000603 WB-SPEC-CSR         (00001200-0000121f)
 SDB: 0000ce42:00000013 WB-VIC-Int.Control  (00001300-000013ff)
 SDB: 0000ce42:d5735ab4 WB-DMA.EIC          (00001400-0000140f)
 SDB: 00000651:eef0b198 WB4-Bridge-GSI      (bridge: 00002000)
 SDB:    00000651:e6a542c9 WB4-Crossbar-GSI
 SDB:    0000ce42:123c5443 WB-I2C-Master       (00003000-000030ff)
 SDB:    0000ce42:e503947e WB-SPI.Control      (00003100-0000311f)
 SDB:    0000ce42:123c5443 WB-I2C-Master       (00003200-000032ff)
 SDB:    0000ce42:00000608 WB-FMC-ADC-Core     (00003300-0000337f)
 SDB:    0000ce42:779c5443 WB-OneWire-Master   (00003400-000034ff)
 SDB:    0000ce42:26ec6086 WB-FMC-ADC.EIC      (00003500-0000350f)
 SDB:    0000ce42:00000604 WB-Timetag-Core     (00003600-0000367f)
 SDB: Synthesis repository: git://ohwr.org/fmc-projects/fmc-adc-100m14b4cha.git
 SDB: Bitstream 'spec_top_fmc_adcmc-projects/fmc-adc-100m14b4cha.git' \
         synthesized 20140116 by mcattin (ISE version 133), commit f0a539dffe6d
Signed-off-by: Tomasz Wlostowski's avatarTomasz Wlostowski <tomasz.wlostowski@cern.ch>
Acked-by: Alessandro Rubini's avatarAlessandro Rubini <rubini@gnudd.com>
parent 6ec64757
...@@ -150,11 +150,27 @@ int fmc_reprogram(struct fmc_device *fmc, struct fmc_driver *d, char *gw, ...@@ -150,11 +150,27 @@ int fmc_reprogram(struct fmc_device *fmc, struct fmc_driver *d, char *gw,
} }
EXPORT_SYMBOL(fmc_reprogram); EXPORT_SYMBOL(fmc_reprogram);
static char *__strip_trailing_space(char *buf, char *str, int len)
{
int i = len - 1;
memcpy(buf, str, len);
while(i >= 0 && buf[i] == ' ')
buf[i--] = '\0';
return buf;
}
#define __sdb_string(buf, field) ({ \
BUILD_BUG_ON(sizeof(buf) < sizeof(field)); \
__strip_trailing_space(buf, (void *)(field), sizeof(field)); \
})
static void __fmc_show_sdb_tree(const struct fmc_device *fmc, static void __fmc_show_sdb_tree(const struct fmc_device *fmc,
const struct sdb_array *arr) const struct sdb_array *arr)
{ {
unsigned long base = arr->baseaddr; unsigned long base = arr->baseaddr;
int i, j, n = arr->len, level = arr->level; int i, j, n = arr->len, level = arr->level;
char buf[64];
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
union sdb_record *r; union sdb_record *r;
...@@ -190,8 +206,8 @@ static void __fmc_show_sdb_tree(const struct fmc_device *fmc, ...@@ -190,8 +206,8 @@ static void __fmc_show_sdb_tree(const struct fmc_device *fmc,
p->name, p->name,
__be64_to_cpu(c->addr_first) + base); __be64_to_cpu(c->addr_first) + base);
if (IS_ERR(arr->subtree[i])) { if (IS_ERR(arr->subtree[i])) {
printk(KERN_CONT "(bridge error %li)\n", dev_info(&fmc->dev, "SDB: (bridge error %li)\n",
PTR_ERR(arr->subtree[i])); PTR_ERR(arr->subtree[i]));
break; break;
} }
__fmc_show_sdb_tree(fmc, arr->subtree[i]); __fmc_show_sdb_tree(fmc, arr->subtree[i]);
...@@ -200,10 +216,20 @@ static void __fmc_show_sdb_tree(const struct fmc_device *fmc, ...@@ -200,10 +216,20 @@ static void __fmc_show_sdb_tree(const struct fmc_device *fmc,
printk(KERN_CONT "integration\n"); printk(KERN_CONT "integration\n");
break; break;
case sdb_type_repo_url: case sdb_type_repo_url:
printk(KERN_CONT "repo-url\n"); printk(KERN_CONT "Synthesis repository: %s\n",
__sdb_string(buf, r->repo_url.repo_url));
break; break;
case sdb_type_synthesis: case sdb_type_synthesis:
printk(KERN_CONT "synthesis-info\n"); printk(KERN_CONT "Bitstream '%s' ",
__sdb_string(buf, r->synthesis.syn_name));
printk(KERN_CONT "synthesized %08x by %s ",
__be32_to_cpu(r->synthesis.date),
__sdb_string(buf, r->synthesis.user_name));
printk(KERN_CONT "(%s version %x), ",
__sdb_string(buf, r->synthesis.tool_name),
__be32_to_cpu(r->synthesis.tool_version));
printk(KERN_CONT "commit %pm\n",
r->synthesis.commit_id);
break; break;
case sdb_type_empty: case sdb_type_empty:
printk(KERN_CONT "empty\n"); printk(KERN_CONT "empty\n");
......
...@@ -14,6 +14,8 @@ union sdb_record { ...@@ -14,6 +14,8 @@ union sdb_record {
struct sdb_bridge bridge; struct sdb_bridge bridge;
struct sdb_integration integr; struct sdb_integration integr;
struct sdb_empty empty; struct sdb_empty empty;
struct sdb_synthesis synthesis;
struct sdb_repo_url repo_url;
}; };
struct fmc_device; struct fmc_device;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment