summaryrefslogtreecommitdiffstats
path: root/pcitool
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@suren.me>2015-10-19 06:59:53 +0200
committerSuren A. Chilingaryan <csa@suren.me>2015-10-19 06:59:53 +0200
commit8ba85a9aff0009d03090a1ba3e9d7e146f02b7bf (patch)
treeef9eb3a20cc6da36ff6c875dc6221ec0b6af780c /pcitool
parentfa54d4c2ca8ffcece7a9c6e9c784e2150cbed78b (diff)
downloadpcitool-8ba85a9aff0009d03090a1ba3e9d7e146f02b7bf.tar.gz
pcitool-8ba85a9aff0009d03090a1ba3e9d7e146f02b7bf.tar.bz2
pcitool-8ba85a9aff0009d03090a1ba3e9d7e146f02b7bf.tar.xz
pcitool-8ba85a9aff0009d03090a1ba3e9d7e146f02b7bf.zip
Provide register listings in public API
Diffstat (limited to 'pcitool')
-rw-r--r--pcitool/cli.c195
1 files changed, 139 insertions, 56 deletions
diff --git a/pcitool/cli.c b/pcitool/cli.c
index 71919a2..4debb75 100644
--- a/pcitool/cli.c
+++ b/pcitool/cli.c
@@ -32,6 +32,8 @@
#include "pcitool/sysinfo.h"
#include "pcitool/formaters.h"
+#include "views/transform.h"
+#include "views/enum.h"
#include "pci.h"
#include "plugin.h"
#include "config.h"
@@ -659,10 +661,114 @@ void List(pcilib_t *handle, const pcilib_model_description_t *model_info, const
}
}
-void RegisterInfo(pcilib_t *handle, pcilib_register_t reg) {
+void ViewInfo(pcilib_t *handle, pcilib_register_t reg, size_t id) {
int err;
+
+ int i;
pcilib_value_t val = {0};
+ pcilib_register_value_name_t *vnames;
+
+ pcilib_view_t view;
+ const pcilib_model_description_t *model_info = pcilib_get_model_description(handle);
+ const pcilib_register_description_t *r;
+ const pcilib_view_description_t *v;
+
+ if (reg == PCILIB_REGISTER_INVALID) {
+ r = NULL;
+ view = id;
+ } else {
+ r = &model_info->registers[reg];
+ view = pcilib_find_view_by_name(handle, r->views[id].view);
+ }
+
+ if (view == PCILIB_VIEW_INVALID) return;
+ v = model_info->views[view];
+
+ if (r) {
+ printf(" View %s (", r->views[id].name);
+ } else {
+ printf("%s\n", v->name);
+ printf(" Data type : ");
+ }
+ switch (v->type) {
+ case PCILIB_TYPE_STRING:
+ printf("char*");
+ break;
+ case PCILIB_TYPE_DOUBLE:
+ printf("double");
+ break;
+ case PCILIB_TYPE_LONG:
+ printf("long");
+ break;
+ default:
+ printf("unknown");
+ }
+ if (r) printf(")");
+ printf("\n");
+
+ if (r) {
+ err = pcilib_read_register_view_by_id(handle, reg, r->views[id].name, &val);
+ } else {
+ err = pcilib_get_property(handle, v->name, &val);
+ }
+ if (!err) err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
+
+ if (err)
+ printf(" Current value : error %i\n", err);
+ else {
+ printf(" Current value : %s", val.sval);
+ if (v->unit) printf(" (units: %s)", v->unit);
+ printf("\n");
+ }
+
+ if (v->unit) {
+ pcilib_unit_t unit = pcilib_find_unit_by_name(handle, v->unit);
+
+ printf(" Supported units: %s", v->unit);
+
+ if (unit != PCILIB_UNIT_INVALID) {
+ const pcilib_unit_description_t *u = &model_info->units[unit];
+
+ for (i = 0; u->transforms[i].unit; i++)
+ printf(", %s", u->transforms[i].unit);
+ }
+ printf("\n");
+ }
+
+ printf(" Access : ");
+ if ((v->mode&PCILIB_REGISTER_RW) == 0) printf("-");
+ if (v->mode&PCILIB_REGISTER_R) printf("R");
+ if (v->mode&PCILIB_REGISTER_W) printf("W");
+ printf("\n");
+
+ if ((v->api == &pcilib_enum_view_static_api)||(v->api == &pcilib_enum_view_xml_api)) {
+ vnames = ((pcilib_enum_view_description_t*)v)->names;
+ printf(" Value aliases :");
+ for (i = 0; vnames[i].name; i++) {
+ if (i) printf(",");
+ printf(" %s = %u", vnames[i].name, vnames[i].value);
+ if (vnames[i].min != vnames[i].max)
+ printf(" (%u - %u)", vnames[i].min, vnames[i].max);
+ }
+ printf("\n");
+ } else if (v->api == &pcilib_transform_view_api) {
+ const pcilib_transform_view_description_t *tv = (const pcilib_transform_view_description_t*)v;
+ if (tv->read_from_reg)
+ printf(" Read function : %s\n", tv->read_from_reg);
+ if (tv->write_to_reg)
+ printf(" Write function : %s\n", tv->write_to_reg);
+ }
+
+ if (v->description)
+ printf(" Description : %s\n", v->description);
+}
+
+void RegisterInfo(pcilib_t *handle, pcilib_register_t reg) {
+ int err;
+
+ int i;
pcilib_register_value_t regval;
+ pcilib_register_info_t *info;
const pcilib_model_description_t *model_info = pcilib_get_model_description(handle);
const pcilib_register_description_t *r = &model_info->registers[reg];
@@ -670,7 +776,9 @@ void RegisterInfo(pcilib_t *handle, pcilib_register_t reg) {
const pcilib_register_bank_description_t *b = &model_info->banks[bank];
err = pcilib_read_register_by_id(handle, reg, &regval);
-
+
+ info = pcilib_get_register_info(handle, b->name, r->name, 0);
+ if (!info) Error("Can't obtain register info for %s", r->name);
printf("%s/%s\n", b->name, r->name);
printf(" Current value: ");
@@ -680,11 +788,23 @@ void RegisterInfo(pcilib_t *handle, pcilib_register_t reg) {
if (r->mode&PCILIB_REGISTER_W) {
printf(" (default: ");
printf(b->format, r->defvalue);
+ if (info->range) {
+ printf(", range: ");
+ printf(b->format, info->range->min);
+ printf (" - ");
+ printf(b->format, info->range->max);
+ }
printf(")");
}
printf("\n");
printf(" Address : 0x%x [%u:%u]\n", r->addr, r->offset, r->offset + r->bits);
+ if ((info->values)&&(info->values[0].name)) {
+ printf(" Value aliases:");
+ for (i = 0; info->values[i].name; i++)
+ printf(" %s", info->values[i].name);
+ printf("\n");
+ }
printf(" Access : ");
if ((r->mode&PCILIB_REGISTER_RW) == 0) printf("-");
if (r->mode&PCILIB_REGISTER_R) printf("R");
@@ -698,60 +818,13 @@ void RegisterInfo(pcilib_t *handle, pcilib_register_t reg) {
printf(" Description : %s\n", r->description);
if (r->views) {
- int i;
printf("\nSupported Views:\n");
for (i = 0; r->views[i].name; i++) {
- pcilib_view_t view = pcilib_find_view_by_name(handle, r->views[i].view);
- if (view == PCILIB_VIEW_INVALID) continue;
-
- const pcilib_view_description_t *v = model_info->views[view];
-
- printf(" View %s (", r->views[i].name);
- switch (v->type) {
- case PCILIB_TYPE_STRING:
- printf("char*");
- break;
- case PCILIB_TYPE_DOUBLE:
- printf("double");
- break;
- default:
- printf("unknown");
- }
- printf(")\n");
-
- err = pcilib_read_register_view(handle, b->name, r->name, r->views[i].name, &val);
- if (!err) err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
-
- if (err)
- printf(" Current value : error %i\n", err);
- else {
- printf(" Current value : %s", val.sval);
- if (v->unit) printf(" (units: %s)", v->unit);
- printf("\n");
- }
-
- if (v->unit) {
- pcilib_unit_t unit = pcilib_find_unit_by_name(handle, v->unit);
-
- printf(" Supported units: %s", v->unit);
-
- if (unit != PCILIB_UNIT_INVALID) {
- int j;
- const pcilib_unit_description_t *u = &model_info->units[unit];
-
- for (j = 0; u->transforms[j].unit; j++)
- printf(", %s", u->transforms[j].unit);
- }
- printf("\n");
- }
-
- if (v->description)
- printf(" Description : %s\n", v->description);
+ ViewInfo(handle, reg, i);
}
}
-
-// printf("Type: %s". r->rw
+ pcilib_free_register_info(handle, info);
}
void Info(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *target) {
@@ -780,13 +853,23 @@ void Info(pcilib_t *handle, const pcilib_model_description_t *model_info, const
printf("\n");
if (target) {
- pcilib_register_t reg;
+ if (*target == '/') {
+ pcilib_view_t view;
+ view = pcilib_find_view_by_name(handle, target);
+ if (view != PCILIB_VIEW_INVALID)
+ return ViewInfo(handle, PCILIB_REGISTER_INVALID, view);
+
+ Error(" No property %s is found", target);
+ } else {
+ pcilib_register_t reg;
- reg = pcilib_find_register(handle, NULL, target);
- if (reg != PCILIB_REGISTER_INVALID)
- return RegisterInfo(handle, reg);
+ reg = pcilib_find_register(handle, NULL, target);
+ if (reg != PCILIB_REGISTER_INVALID)
+ return RegisterInfo(handle, reg);
+
+ Error(" No register %s is found", target);
+ }
- Error(" No register %s is found", target);
}
List(handle, model_info, (char*)-1, 0);