/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to protocols/default.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-11-18 02:25:02 UTC
  • Revision ID: csa@suren.me-20151118022502-2yu6oagexn3048jq
Provide API calls for register and bank address resolution

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
#include "error.h"
8
8
#include "bar.h"
9
9
#include "datacpy.h"
 
10
#include "pci.h"
10
11
 
11
12
#define default_datacpy(dst, src, access, bank)   pcilib_datacpy(dst, src, access, 1, bank->raw_endianess)
12
13
 
 
14
uintptr_t pcilib_default_resolve(pcilib_t *ctx, pcilib_register_bank_context_t *bank_ctx, pcilib_address_resolution_flags_t flags, pcilib_register_addr_t reg_addr) {
 
15
    uintptr_t addr;
 
16
    const pcilib_register_bank_description_t *b = bank_ctx->bank;
 
17
 
 
18
    if (reg_addr == PCILIB_REGISTER_ADDRESS_INVALID) reg_addr = 0;
 
19
 
 
20
    switch (flags&PCILIB_ADDRESS_RESOLUTION_MASK_ACCESS_MODE) {
 
21
     case 0:
 
22
        if (b->read_addr != b->write_addr)
 
23
            return PCILIB_ADDRESS_INVALID;
 
24
     case PCILIB_ADDRESS_RESOLUTION_FLAG_READ_ONLY:
 
25
        addr = b->read_addr + reg_addr;
 
26
        break;
 
27
     case PCILIB_ADDRESS_RESOLUTION_FLAG_WRITE_ONLY:
 
28
        addr = b->write_addr + reg_addr;
 
29
     default:
 
30
        return PCILIB_ADDRESS_INVALID;
 
31
    }
 
32
 
 
33
    switch (flags&PCILIB_ADDRESS_RESOLUTION_MASK_ADDRESS_TYPE) {
 
34
     case 0:
 
35
        return (uintptr_t)pcilib_resolve_bar_address(ctx, b->bar, addr);
 
36
     case PCILIB_ADDRESS_RESOLUTION_FLAG_BUS_ADDRESS:
 
37
     case PCILIB_ADDRESS_RESOLUTION_FLAG_PHYS_ADDRESS:
 
38
        return ctx->board_info.bar_start[b->bar] + addr;
 
39
    }
 
40
 
 
41
    return PCILIB_ADDRESS_INVALID;
 
42
}
 
43
 
13
44
int pcilib_default_read(pcilib_t *ctx, pcilib_register_bank_context_t *bank_ctx, pcilib_register_addr_t addr, pcilib_register_value_t *value) {
14
45
    char *ptr;
15
46
    pcilib_register_value_t val = 0;
18
49
 
19
50
    int access = b->access / 8;
20
51
 
21
 
    ptr =  pcilib_resolve_register_address(ctx, b->bar, b->read_addr + addr);
 
52
    ptr =  pcilib_resolve_bar_address(ctx, b->bar, b->read_addr + addr);
22
53
    default_datacpy(&val, ptr, access, b);
23
54
 
24
55
//    *value = val&BIT_MASK(bits);
35
66
 
36
67
    int access = b->access / 8;
37
68
 
38
 
    ptr =  pcilib_resolve_register_address(ctx, b->bar, b->write_addr + addr);
 
69
    ptr =  pcilib_resolve_bar_address(ctx, b->bar, b->write_addr + addr);
39
70
    default_datacpy(ptr, &value, access, b);
40
71
 
41
72
    return 0;