From 8ba85a9aff0009d03090a1ba3e9d7e146f02b7bf Mon Sep 17 00:00:00 2001 From: "Suren A. Chilingaryan" Date: Mon, 19 Oct 2015 06:59:53 +0200 Subject: Provide register listings in public API --- pcitool/cli.c | 195 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 139 insertions(+), 56 deletions(-) (limited to 'pcitool') 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, ®val); - + + 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); -- cgit v1.2.3