/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to pcilib/register.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-10-19 04:59:53 UTC
  • Revision ID: csa@suren.me-20151019045953-h4ur2flqzf3ky412
Provide register listings in public API

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
#include "tools.h"
20
20
#include "error.h"
21
21
#include "property.h"
 
22
#include "views/enum.h"
22
23
 
23
24
int pcilib_add_registers(pcilib_t *ctx, pcilib_model_modification_flags_t flags, size_t n, const pcilib_register_description_t *registers, pcilib_register_t *ids) {
24
25
        // DS: Overrride existing registers 
414
415
 
415
416
    return pcilib_get_register_attr_by_id(ctx, reg, attr, val);
416
417
}
 
418
 
 
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;
 
425
 
 
426
    info = (pcilib_register_info_t*)malloc((ctx->num_reg + 1) * sizeof(pcilib_register_info_t));
 
427
    if (!info) return NULL;
 
428
 
 
429
    if (req_bank_name) {
 
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);
 
433
            return NULL;
 
434
        }
 
435
        bank_addr = ctx->banks[bank].addr;
 
436
        bank_name = req_bank_name;
 
437
    } else {
 
438
        bank_addr = PCILIB_REGISTER_BANK_INVALID;
 
439
        bank_name = NULL;
 
440
    }
 
441
 
 
442
    if (req_reg_name) {
 
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);
 
446
            return NULL;
 
447
        }
 
448
        from = reg;
 
449
        to = reg + 1;
 
450
    } else {
 
451
        from = 0;
 
452
        to = ctx->num_reg;
 
453
    }
 
454
 
 
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;
 
458
 
 
459
        if (req_bank_name) {
 
460
            if (ctx->registers[i].bank != bank_addr) continue;
 
461
        } else {
 
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;
 
467
            }
 
468
        }
 
469
 
 
470
        if (ctx->registers[i].views) {
 
471
            int j;
 
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;
 
476
            }
 
477
        }
 
478
 
 
479
        if (range->min == range->max) 
 
480
            range = NULL;
 
481
 
 
482
        info[pos++] = (pcilib_register_info_t){
 
483
            .id = i,
 
484
            .name = ctx->registers[i].name,
 
485
            .description = ctx->registers[i].description,
 
486
            .bank = bank_name,
 
487
            .mode = ctx->registers[i].mode,
 
488
            .defvalue = ctx->registers[i].defvalue,
 
489
            .range = range,
 
490
            .values = names
 
491
        };
 
492
    }
 
493
    memset(&info[pos], 0, sizeof(pcilib_register_info_t));
 
494
    return info;
 
495
}
 
496
 
 
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);
 
499
}
 
500
 
 
501
void pcilib_free_register_info(pcilib_t *ctx, pcilib_register_info_t *info) {
 
502
    if (info)
 
503
        free(info);
 
504
}