133
char *pcilib_resolve_bar_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr) {
134
if (bar == PCILIB_BAR_DETECT) {
135
bar = pcilib_detect_bar(ctx, addr, 1);
136
if (bar != PCILIB_BAR_INVALID) {
137
size_t offset = addr - ctx->board_info.bar_start[bar];
138
if ((offset < ctx->board_info.bar_length[bar])&&(ctx->bar_space[bar])) {
139
if (!ctx->bar_space[bar]) {
140
if (!pcilib_map_bar(ctx, bar)) {
141
pcilib_error("Failed to map the requested bar (%i)", bar);
145
return ctx->bar_space[bar] + offset + (ctx->board_info.bar_start[bar] & ctx->page_mask);
149
if (!ctx->bar_space[bar]) {
150
if (!pcilib_map_bar(ctx, bar)) {
151
pcilib_error("Failed to map the requested bar (%i)", bar);
156
if (addr < ctx->board_info.bar_length[bar]) {
157
return ctx->bar_space[bar] + addr + (ctx->board_info.bar_start[bar] & ctx->page_mask);
160
if ((addr >= ctx->board_info.bar_start[bar])&&(addr < (ctx->board_info.bar_start[bar] + ctx->board_info.bar_length[ctx->reg_bar]))) {
161
return ctx->bar_space[bar] + (addr - ctx->board_info.bar_start[bar]) + (ctx->board_info.bar_start[bar] & ctx->page_mask);
133
168
int pcilib_map_register_space(pcilib_t *ctx) {
135
170
pcilib_register_bank_t i;
221
char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr) {
222
if (bar == PCILIB_BAR_DETECT) {
223
// First checking the default register bar
224
size_t offset = addr - ctx->board_info.bar_start[ctx->reg_bar];
225
if ((addr > ctx->board_info.bar_start[ctx->reg_bar])&&(offset < ctx->board_info.bar_length[ctx->reg_bar])) {
226
return pcilib_resolve_bar_address(ctx, ctx->reg_bar, addr - ctx->board_info.bar_start[ctx->reg_bar]);
229
// Otherwise trying to detect
230
return pcilib_resolve_bar_address(ctx, bar, addr);
233
int pcilib_map_data_space(pcilib_t *ctx, uintptr_t addr) {
237
if (!ctx->data_bar_mapped) {
238
const pcilib_board_info_t *board_info = pcilib_get_board_info(ctx);
239
if (!board_info) return PCILIB_ERROR_FAILED;
241
err = pcilib_map_register_space(ctx);
243
pcilib_error("Error mapping register space");
249
for (i = 0; i < PCILIB_MAX_BARS; i++) {
250
if ((ctx->bar_space[i])||(!board_info->bar_length[i])) continue;
253
if (board_info->bar_start[i] == addr) {
269
if (addr) pcilib_error("Unable to find the specified data space (%lx)", addr);
270
else pcilib_error("Unable to find the data space");
271
return PCILIB_ERROR_NOTFOUND;
274
ctx->data_bar = data_bar;
276
if (!ctx->bar_space[data_bar]) {
277
char *data_space = pcilib_map_bar(ctx, data_bar);
278
if (data_space) ctx->bar_space[data_bar] = data_space;
280
pcilib_error("Unable to map the data space");
281
return PCILIB_ERROR_FAILED;
285
ctx->data_bar_mapped = 0;
291
char *pcilib_resolve_data_space(pcilib_t *ctx, uintptr_t addr, size_t *size) {
294
err = pcilib_map_data_space(ctx, addr);
296
pcilib_error("Failed to map the specified address space (%lx)", addr);
300
if (size) *size = ctx->board_info.bar_length[ctx->data_bar];
302
return ctx->bar_space[ctx->data_bar] + (ctx->board_info.bar_start[ctx->data_bar] & ctx->page_mask);
186
306
int pcilib_read(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, size_t size, void *buf) {