415
416
return pcilib_get_register_attr_by_id(ctx, reg, attr, val);
419
pcilib_register_info_t *pcilib_get_register_info(pcilib_t *ctx, const char *req_bank_name, const char *req_reg_name, pcilib_list_flags_t flags) {
420
pcilib_register_t i, from, to, pos = 0;
421
pcilib_register_info_t *info;
422
pcilib_register_bank_t bank;
423
pcilib_register_bank_addr_t bank_addr;
424
const char *bank_name;
426
info = (pcilib_register_info_t*)malloc((ctx->num_reg + 1) * sizeof(pcilib_register_info_t));
427
if (!info) return NULL;
430
bank = pcilib_find_register_bank_by_name(ctx, req_bank_name);
431
if (bank == PCILIB_REGISTER_BANK_INVALID) {
432
pcilib_error("The specified bank (%s) is not found", req_bank_name);
435
bank_addr = ctx->banks[bank].addr;
436
bank_name = req_bank_name;
438
bank_addr = PCILIB_REGISTER_BANK_INVALID;
443
pcilib_register_t reg = pcilib_find_register(ctx, req_bank_name, req_reg_name);
444
if (reg == PCILIB_REGISTER_INVALID) {
445
pcilib_error("The specified register (%s) is not found", req_reg_name);
455
for (i = from; i < to; i++) {
456
const pcilib_register_value_range_t *range = &ctx->register_ctx[i].range;
457
const pcilib_register_value_name_t *names = NULL;
460
if (ctx->registers[i].bank != bank_addr) continue;
462
if (ctx->registers[i].bank != bank_addr) {
463
bank_addr = ctx->registers[i].bank;
464
bank = pcilib_find_register_bank_by_addr(ctx, bank_addr);
465
if (bank == PCILIB_REGISTER_BANK_INVALID) bank_name = NULL;
466
else bank_name = ctx->banks[bank].name;
470
if (ctx->registers[i].views) {
472
for (j = 0; ctx->registers[i].views[j].view; j++) {
473
pcilib_view_t view = pcilib_find_view_by_name(ctx, ctx->registers[i].views[j].view);
474
if ((view != PCILIB_VIEW_INVALID)&&((ctx->views[view]->api == &pcilib_enum_view_xml_api)||(ctx->views[view]->api == &pcilib_enum_view_static_api)))
475
names = ((pcilib_enum_view_description_t*)(ctx->views[view]))->names;
479
if (range->min == range->max)
482
info[pos++] = (pcilib_register_info_t){
484
.name = ctx->registers[i].name,
485
.description = ctx->registers[i].description,
487
.mode = ctx->registers[i].mode,
488
.defvalue = ctx->registers[i].defvalue,
493
memset(&info[pos], 0, sizeof(pcilib_register_info_t));
497
pcilib_register_info_t *pcilib_get_register_list(pcilib_t *ctx, const char *req_bank_name, pcilib_list_flags_t flags) {
498
return pcilib_get_register_info(ctx, req_bank_name, NULL, flags);
501
void pcilib_free_register_info(pcilib_t *ctx, pcilib_register_info_t *info) {