192
197
return ctx->event_ctx;
196
static pcilib_bar_t pcilib_detect_bar(pcilib_t *ctx, uintptr_t addr, size_t size) {
200
const pcilib_board_info_t *board_info = pcilib_get_board_info(ctx);
201
if (!board_info) return PCILIB_BAR_INVALID;
203
for (i = 0; i < PCILIB_MAX_BARS; i++) {
204
if (board_info->bar_length[i] > 0) {
205
if ((addr >= board_info->bar_start[i])&&((board_info->bar_start[i] + board_info->bar_length[i]) >= (addr + size))) return i;
212
if (n > 0) return n - 1;
214
return PCILIB_BAR_INVALID;
217
int pcilib_detect_address(pcilib_t *ctx, pcilib_bar_t *bar, uintptr_t *addr, size_t size) {
218
const pcilib_board_info_t *board_info = pcilib_get_board_info(ctx);
219
if (!board_info) return PCILIB_ERROR_NOTFOUND;
221
if (*bar == PCILIB_BAR_DETECT) {
222
*bar = pcilib_detect_bar(ctx, *addr, size);
223
if (*bar == PCILIB_BAR_INVALID) {
224
pcilib_error("The requested data block at address 0x%x with size %zu does not belongs to any available memory bank", *addr, size);
225
return PCILIB_ERROR_NOTFOUND;
227
if (*addr < board_info->bar_start[*bar])
228
*addr += board_info->bar_start[*bar];
230
if ((*addr < board_info->bar_start[*bar])||((board_info->bar_start[*bar] + board_info->bar_length[*bar]) < (((uintptr_t)*addr) + size))) {
231
if ((board_info->bar_length[*bar]) >= (((uintptr_t)*addr) + size)) {
232
*addr += board_info->bar_start[*bar];
234
pcilib_error("The requested data block at address 0x%x with size %zu does not belong the specified memory bank (Bar %i: starting at 0x%x with size 0x%x)", *addr, size, *bar, board_info->bar_start[*bar], board_info->bar_length[*bar]);
235
return PCILIB_ERROR_NOTFOUND;
240
*addr -= board_info->bar_start[*bar];
241
*addr += board_info->bar_start[*bar] & ctx->page_mask;
246
void *pcilib_map_bar(pcilib_t *ctx, pcilib_bar_t bar) {
250
const pcilib_board_info_t *board_info = pcilib_get_board_info(ctx);
251
if (!board_info) return NULL;
253
if (ctx->bar_space[bar]) return ctx->bar_space[bar];
255
ret = ioctl( ctx->handle, PCIDRIVER_IOC_MMAP_MODE, PCIDRIVER_MMAP_PCI );
257
pcilib_error("PCIDRIVER_IOC_MMAP_MODE ioctl have failed", bar);
261
ret = ioctl( ctx->handle, PCIDRIVER_IOC_MMAP_AREA, PCIDRIVER_BAR0 + bar );
263
pcilib_error("PCIDRIVER_IOC_MMAP_AREA ioctl have failed for bank %i", bar);
267
#ifdef PCILIB_FILE_IO
268
file_io_handle = open("/root/data", O_RDWR);
269
res = mmap( 0, board_info->bar_length[bar], PROT_WRITE | PROT_READ, MAP_SHARED, ctx->file_io_handle, 0 );
271
res = mmap( 0, board_info->bar_length[bar], PROT_WRITE | PROT_READ, MAP_SHARED, ctx->handle, 0 );
273
if ((!res)||(res == MAP_FAILED)) {
274
pcilib_error("Failed to mmap data bank %i", bar);
282
void pcilib_unmap_bar(pcilib_t *ctx, pcilib_bar_t bar, void *data) {
283
const pcilib_board_info_t *board_info = pcilib_get_board_info(ctx);
284
if (!board_info) return;
286
if (ctx->bar_space[bar]) return;
288
munmap(data, board_info->bar_length[bar]);
289
#ifdef PCILIB_FILE_IO
290
close(ctx->file_io_handle);
294
int pcilib_map_register_space(pcilib_t *ctx) {
296
pcilib_register_bank_t i;
298
if (!ctx->reg_bar_mapped) {
299
const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
300
const pcilib_register_bank_description_t *banks = model_info->banks;
302
for (i = 0; ((banks)&&(banks[i].access)); i++) {
305
pcilib_bar_t bar = banks[i].bar;
307
if (bar == PCILIB_BAR_DETECT) {
308
uintptr_t addr = banks[0].read_addr;
310
err = pcilib_detect_address(ctx, &bar, &addr, 1);
313
if (!ctx->bar_space[bar]) {
314
reg_space = pcilib_map_bar(ctx, bar);
315
// pcilib_memcpy(&buf, reg_space, 8);
318
ctx->bar_space[bar] = reg_space;
320
return PCILIB_ERROR_FAILED;
323
} else if (!ctx->bar_space[bar]) {
324
reg_space = pcilib_map_bar(ctx, bar);
326
ctx->bar_space[bar] = reg_space;
328
return PCILIB_ERROR_FAILED;
330
// pcilib_memcpy(&buf, reg_space, 8);
334
if (!i) ctx->reg_bar = bar;
338
ctx->reg_bar_mapped = 1;
344
200
int pcilib_map_data_space(pcilib_t *ctx, uintptr_t addr) {
508
int pcilib_read(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, size_t size, void *buf) {
511
pcilib_detect_address(ctx, &bar, &addr, size);
512
data = pcilib_map_bar(ctx, bar);
514
pcilib_memcpy(buf, data + addr, size);
516
pcilib_unmap_bar(ctx, bar, data);
521
int pcilib_write(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, size_t size, void *buf) {
524
pcilib_detect_address(ctx, &bar, &addr, size);
525
data = pcilib_map_bar(ctx, bar);
527
pcilib_memcpy(data + addr, buf, size);
529
pcilib_unmap_bar(ctx, bar, data);
535
int pcilib_read_fifo(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, uint8_t fifo_size, size_t n, void *buf) {
539
pcilib_detect_address(ctx, &bar, &addr, fifo_size);
540
data = pcilib_map_bar(ctx, bar);
542
for (i = 0; i < n; i++) {
543
pcilib_memcpy(buf + i * fifo_size, data + addr, fifo_size);
546
pcilib_unmap_bar(ctx, bar, data);
551
int pcilib_write_fifo(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, uint8_t fifo_size, size_t n, void *buf) {
555
pcilib_detect_address(ctx, &bar, &addr, fifo_size);
556
data = pcilib_map_bar(ctx, bar);
558
for (i = 0; i < n; i++) {
559
pcilib_memcpy(data + addr, buf + i * fifo_size, fifo_size);
562
pcilib_unmap_bar(ctx, bar, data);