312
return PCILIB_ERROR_NOTFOUND;
318
static int pcilib_map_data_space(pcilib_t *ctx, uintptr_t addr) {
322
if (!ctx->data_space) {
323
const pci_board_info *board_info = pcilib_get_board_info(ctx);
325
err = pcilib_map_register_space(ctx);
327
pcilib_error("Error mapping register space");
336
for (i = 0; i < PCILIB_MAX_BANKS; i++) {
337
if ((i == ctx->reg_bar)||(!board_info->bar_length[i])) continue;
340
if (board_info->bar_start[i] == addr) {
356
if (addr) pcilib_error("Unable to find the specified data space (%lx)", addr);
357
else pcilib_error("Unable to find the data space");
358
return PCILIB_ERROR_NOTFOUND;
361
ctx->data_bar = data_bar;
362
ctx->data_space = pcilib_map_bar(ctx, data_bar);
363
ctx->data_size = board_info->bar_length[data_bar];
365
if (!ctx->data_space) {
366
pcilib_error("Unable to map the data space");
367
return PCILIB_ERROR_FAILED;
307
374
static void pcilib_unmap_register_space(pcilib_t *ctx) {
308
375
if (ctx->reg_space) {
491
585
pcilib_error("Big-endian byte order support is not implemented");
492
586
return PCILIB_ERROR_NOTSUPPORTED;
494
for (i = 0, res = value; (res > 0)&&(i <= n); ++i) {
495
buf[i] = res & BIT_MASK(b->access);
588
if (b->access == sizeof(res) * 8) {
591
for (i = 0, res = value; (res > 0)&&(i <= n); ++i) {
592
buf[i] = res & BIT_MASK(b->access);
500
pcilib_error("Value %i is to big to fit in the register %s", value, r->name);
501
return PCILIB_ERROR_OUTOFRANGE;
597
pcilib_error("Value %i is too big to fit in the register %s", value, r->name);
598
return PCILIB_ERROR_OUTOFRANGE;
505
603
err = pcilib_write_register_space_internal(ctx, r->bank, r->addr, n, bits, buf);
513
611
reg = pcilib_find_register(ctx, bank, regname);
514
if (reg < 0) pcilib_error("Register (%s) is not found", regname);
613
pcilib_error("Register (%s) is not found", regname);
614
return PCILIB_ERROR_NOTFOUND;
516
617
return pcilib_write_register_by_id(ctx, reg, value);
621
int pcilib_reset(pcilib_t *ctx) {
622
pcilib_event_api_description_t *api;
624
pcilib_model_t model = pcilib_get_model(ctx);
626
api = pcilib_model[model].event_api;
628
pcilib_error("Event API is not supported by the selected model");
629
return PCILIB_ERROR_NOTSUPPORTED;
633
return api->reset(ctx->event_ctx);
638
int pcilib_start(pcilib_t *ctx, pcilib_event_t event_mask, void *callback, void *user) {
639
pcilib_event_api_description_t *api;
641
pcilib_model_t model = pcilib_get_model(ctx);
643
api = pcilib_model[model].event_api;
645
pcilib_error("Event API is not supported by the selected model");
646
return PCILIB_ERROR_NOTSUPPORTED;
650
return api->start(ctx->event_ctx, event_mask, callback, user);
655
int pcilib_stop(pcilib_t *ctx) {
656
pcilib_event_api_description_t *api;
658
pcilib_model_t model = pcilib_get_model(ctx);
660
api = pcilib_model[model].event_api;
662
pcilib_error("Event API is not supported by the selected model");
663
return PCILIB_ERROR_NOTSUPPORTED;
667
return api->stop(ctx->event_ctx);
672
int pcilib_trigger(pcilib_t *ctx, pcilib_event_t event, size_t trigger_size, void *trigger_data) {
673
pcilib_event_api_description_t *api;
675
pcilib_model_t model = pcilib_get_model(ctx);
677
api = pcilib_model[model].event_api;
679
pcilib_error("Event API is not supported by the selected model");
680
return PCILIB_ERROR_NOTSUPPORTED;
684
return api->trigger(ctx->event_ctx, event, trigger_size, trigger_data);
686
pcilib_error("Self triggering is not supported by the selected model");
687
return PCILIB_ERROR_NOTSUPPORTED;
691
void *pcilib_get_data(pcilib_t *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t *size) {
692
pcilib_event_api_description_t *api = pcilib_model[ctx->model].event_api;
694
pcilib_error("Event API is not supported by the selected model");
699
return api->get_data(ctx->event_ctx, event_id, data_type, size);
704
int pcilib_return_data(pcilib_t *ctx, pcilib_event_id_t event_id) {
705
pcilib_event_api_description_t *api = pcilib_model[ctx->model].event_api;
707
pcilib_error("Event API is not supported by the selected model");
708
return PCILIB_ERROR_NOTSUPPORTED;
711
if (api->return_data)
712
return api->return_data(ctx->event_ctx, event_id);
723
} pcilib_grab_callback_user_data_t;
725
static int pcilib_grab_callback(pcilib_event_t event, pcilib_event_id_t event_id, void *vuser) {
731
pcilib_grab_callback_user_data_t *user = (pcilib_grab_callback_user_data_t*)vuser;
733
data = pcilib_get_data(user->ctx, event_id, PCILIB_EVENT_DATA, &size);
735
pcilib_error("Error getting event data");
736
return PCILIB_ERROR_FAILED;
740
if ((user->size)&&(*(user->size) < size)) {
741
pcilib_error("The supplied buffer does not have enough space to hold the event data. Buffer size is %z, but %z is required", user->size, size);
742
return PCILIB_ERROR_MEMORY;
745
*(user->size) = size;
747
*(user->data) = malloc(size);
748
if (!*(user->data)) {
749
pcilib_error("Memory allocation (%i bytes) for event data is failed");
750
return PCILIB_ERROR_MEMORY;
752
if (*(user->size)) *(user->size) = size;
756
memcpy(*(user->data), data, size);
758
err = pcilib_return_data(user->ctx, event_id);
762
*(user->data) = NULL;
764
pcilib_error("The event data had been overwritten before it was returned, data corruption may occur");
771
int pcilib_grab(pcilib_t *ctx, pcilib_event_t event_mask, size_t *size, void **data, const struct timespec *timeout) {
774
pcilib_grab_callback_user_data_t user = {ctx, size, data};
776
err = pcilib_start(ctx, event_mask, pcilib_grab_callback, &user);
778
if (timeout) nanosleep(timeout, NULL);
779
else err = pcilib_trigger(ctx, event_mask, 0, NULL);