24
25
static int pcilib_detect_model(pcilib_t *ctx, const char *model) {
27
// Registers & Banks must be copied!
28
const pcilib_model_description_t *model_info = NULL;
29
const pcilib_board_info_t *board_info = pcilib_get_board_info(ctx);
30
// Check for DMA models
31
model_info = pcilib_find_plugin_model(ctx, board_info->vendor_id, board_info->device_id, model);
33
memcpy(&ctx->model_info, model_info, sizeof(pcilib_model_description_t));
34
memcpy(&ctx->dma, model_info->dma, sizeof(pcilib_dma_description_t));
36
// If not found, check for DMA models
31
37
for (i = 0; pcilib_dma[i].name; i++) {
32
38
if (!strcasecmp(model, pcilib_dma[i].name))
36
42
if (pcilib_dma[i].api) {
43
model_info = &ctx->model_info;
37
44
memcpy(&ctx->dma, &pcilib_dma[i], sizeof(pcilib_dma_description_t));
38
45
ctx->model_info.dma = &ctx->dma;
40
if (pcilib_dma[i].banks)
41
pcilib_add_register_banks(ctx, 0, pcilib_dma[i].banks);
43
if (pcilib_dma[i].registers)
44
pcilib_add_registers(ctx, 0, pcilib_dma[i].registers);
46
if (pcilib_dma[i].engines) {
47
for (j = 0; pcilib_dma[i].engines[j].addr_bits; j++)
48
memcpy(ctx->engines, pcilib_dma[i].engines, j * sizeof(pcilib_dma_engine_description_t));
49
// Precedens of register configuration: DMA/Event Initialization (top), XML, Event Description, DMA Description (least)
51
const pcilib_dma_description_t *dma = model_info->dma;
55
pcilib_add_register_banks(ctx, 0, dma->banks);
58
pcilib_add_registers(ctx, 0, dma->registers);
61
for (j = 0; dma->engines[j].addr_bits; j++);
62
memcpy(ctx->engines, dma->engines, j * sizeof(pcilib_dma_engine_description_t));
49
63
ctx->num_engines = j;
51
65
ctx->dma.engines = ctx->engines;
56
// Check for XML models (DMA + XML registers)
68
if (model_info->protocols)
69
pcilib_add_register_protocols(ctx, 0, model_info->protocols);
71
if (model_info->banks)
72
pcilib_add_register_banks(ctx, 0, model_info->banks);
58
// Check for specified model
60
// Iterate other all other models
74
if (model_info->registers)
75
pcilib_add_registers(ctx, 0, model_info->registers);
77
if (model_info->ranges)
78
pcilib_add_register_ranges(ctx, 0, model_info->ranges);
63
83
// Check for all installed models
64
84
// memcpy(&ctx->model_info, model, sizeof(pcilib_model_description_t));
65
85
// how we reconcile the banks from event model and dma description? The banks specified in the DMA description should override corresponding banks of events...
88
if ((model)&&(!model_info)/*&&(no xml)*/)
69
89
return PCILIB_ERROR_NOTFOUND;
71
// Otherwise, simple pci access (all model members are set to NULL)