272
272
return pcilib_find_register_protocol_by_name(ctx, protocol);
275
uintptr_t pcilib_resolve_bank_address_by_id(pcilib_t *ctx, pcilib_address_resolution_flags_t flags, pcilib_register_bank_t bank) {
276
pcilib_register_bank_context_t *bctx = ctx->bank_ctx[bank];
278
if (!bctx->api->resolve)
279
return PCILIB_ADDRESS_INVALID;
281
return bctx->api->resolve(ctx, bctx, flags, PCILIB_REGISTER_ADDRESS_INVALID);
284
uintptr_t pcilib_resolve_bank_address(pcilib_t *ctx, pcilib_address_resolution_flags_t flags, const char *bank) {
285
pcilib_register_bank_t bank_id = pcilib_find_register_bank(ctx, bank);
286
if (bank_id == PCILIB_REGISTER_BANK_INVALID) {
287
if (bank) pcilib_error("Invalid register bank is specified (%s)", bank);
288
else pcilib_error("Register bank should be specified");
289
return PCILIB_ADDRESS_INVALID;
292
return pcilib_resolve_bank_address_by_id(ctx, flags, bank_id);
295
uintptr_t pcilib_resolve_register_address_by_id(pcilib_t *ctx, pcilib_address_resolution_flags_t flags, pcilib_register_t reg) {
296
pcilib_register_bank_context_t *bctx = ctx->bank_ctx[ctx->register_ctx[reg].bank];
298
if (!bctx->api->resolve)
299
return PCILIB_ADDRESS_INVALID;
301
return bctx->api->resolve(ctx, bctx, 0, ctx->registers[reg].addr);
304
uintptr_t pcilib_resolve_register_address(pcilib_t *ctx, pcilib_address_resolution_flags_t flags, const char *bank, const char *regname) {
305
pcilib_register_t reg = pcilib_find_register(ctx, bank, regname);
306
if (reg == PCILIB_REGISTER_INVALID) {
307
pcilib_error("Register (%s) is not found", regname);
308
return PCILIB_ADDRESS_INVALID;
311
return pcilib_resolve_register_address_by_id(ctx, flags, reg);
275
314
int pcilib_get_register_bank_attr_by_id(pcilib_t *ctx, pcilib_register_bank_t bank, const char *attr, pcilib_value_t *val) {
276
315
assert(bank < ctx->num_banks);