]>
git.ipfire.org Git - thirdparty/pciutils.git/blob - lib/access.c
2 * The PCI Library -- User Access
4 * Copyright (c) 1997--2014 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
17 pci_scan_bus(struct pci_access
*a
)
23 pci_alloc_dev(struct pci_access
*a
)
25 struct pci_dev
*d
= pci_malloc(a
, sizeof(struct pci_dev
));
27 memset(d
, 0, sizeof(*d
));
29 d
->methods
= a
->methods
;
32 if (d
->methods
->init_dev
)
33 d
->methods
->init_dev(d
);
38 pci_link_dev(struct pci_access
*a
, struct pci_dev
*d
)
44 * Applications compiled with older versions of libpci do not expect
45 * 32-bit domain numbers. To keep them working, we keep a 16-bit
46 * version of the domain number at the previous location in struct
47 * pci_dev. This will keep backward compatibility on systems which
48 * don't require large domain numbers.
50 if (d
->domain
> 0xffff)
51 d
->domain_16
= 0xffff;
53 d
->domain_16
= d
->domain
;
59 pci_get_dev(struct pci_access
*a
, int domain
, int bus
, int dev
, int func
)
61 struct pci_dev
*d
= pci_alloc_dev(a
);
70 void pci_free_dev(struct pci_dev
*d
)
72 if (d
->methods
->cleanup_dev
)
73 d
->methods
->cleanup_dev(d
);
75 pci_mfree(d
->module_alias
);
77 pci_mfree(d
->phy_slot
);
82 pci_read_data(struct pci_dev
*d
, void *buf
, int pos
, int len
)
85 d
->access
->error("Unaligned read: pos=%02x, len=%d", pos
, len
);
86 if (pos
+ len
<= d
->cache_len
)
87 memcpy(buf
, d
->cache
+ pos
, len
);
88 else if (!d
->methods
->read(d
, pos
, buf
, len
))
89 memset(buf
, 0xff, len
);
93 pci_read_byte(struct pci_dev
*d
, int pos
)
96 pci_read_data(d
, &buf
, pos
, 1);
101 pci_read_word(struct pci_dev
*d
, int pos
)
104 pci_read_data(d
, &buf
, pos
, 2);
105 return le16_to_cpu(buf
);
109 pci_read_long(struct pci_dev
*d
, int pos
)
112 pci_read_data(d
, &buf
, pos
, 4);
113 return le32_to_cpu(buf
);
117 pci_read_block(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
119 return d
->methods
->read(d
, pos
, buf
, len
);
123 pci_read_vpd(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
125 return d
->methods
->read_vpd
? d
->methods
->read_vpd(d
, pos
, buf
, len
) : 0;
129 pci_write_data(struct pci_dev
*d
, void *buf
, int pos
, int len
)
132 d
->access
->error("Unaligned write: pos=%02x,len=%d", pos
, len
);
133 if (pos
+ len
<= d
->cache_len
)
134 memcpy(d
->cache
+ pos
, buf
, len
);
135 return d
->methods
->write(d
, pos
, buf
, len
);
139 pci_write_byte(struct pci_dev
*d
, int pos
, byte data
)
141 return pci_write_data(d
, &data
, pos
, 1);
145 pci_write_word(struct pci_dev
*d
, int pos
, word data
)
147 word buf
= cpu_to_le16(data
);
148 return pci_write_data(d
, &buf
, pos
, 2);
152 pci_write_long(struct pci_dev
*d
, int pos
, u32 data
)
154 u32 buf
= cpu_to_le32(data
);
155 return pci_write_data(d
, &buf
, pos
, 4);
159 pci_write_block(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
161 if (pos
< d
->cache_len
)
163 int l
= (pos
+ len
>= d
->cache_len
) ? (d
->cache_len
- pos
) : len
;
164 memcpy(d
->cache
+ pos
, buf
, l
);
166 return d
->methods
->write(d
, pos
, buf
, len
);
170 pci_fill_info_v35(struct pci_dev
*d
, int flags
)
172 if (flags
& PCI_FILL_RESCAN
)
174 flags
&= ~PCI_FILL_RESCAN
;
178 if (flags
& ~d
->known_fields
)
179 d
->known_fields
|= d
->methods
->fill_info(d
, flags
& ~d
->known_fields
);
180 return d
->known_fields
;
183 /* In version 3.1, pci_fill_info got new flags => versioned alias */
184 /* In versions 3.2, 3.3, 3.4 and 3.5, the same has happened */
185 STATIC_ALIAS(int pci_fill_info(struct pci_dev
*d
, int flags
), pci_fill_info_v35(d
, flags
));
186 DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev
*d
, int flags
), pci_fill_info_v35
);
187 DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev
*d
, int flags
), pci_fill_info_v35
);
188 DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev
*d
, int flags
), pci_fill_info_v35
);
189 DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev
*d
, int flags
), pci_fill_info_v35
);
190 DEFINE_ALIAS(int pci_fill_info_v34(struct pci_dev
*d
, int flags
), pci_fill_info_v35
);
191 SYMBOL_VERSION(pci_fill_info_v30
, pci_fill_info@LIBPCI_3
.0
);
192 SYMBOL_VERSION(pci_fill_info_v31
, pci_fill_info@LIBPCI_3
.1
);
193 SYMBOL_VERSION(pci_fill_info_v32
, pci_fill_info@LIBPCI_3
.2
);
194 SYMBOL_VERSION(pci_fill_info_v33
, pci_fill_info@LIBPCI_3
.3
);
195 SYMBOL_VERSION(pci_fill_info_v34
, pci_fill_info@LIBPCI_3
.4
);
196 SYMBOL_VERSION(pci_fill_info_v35
, pci_fill_info@@LIBPCI_3
.5
);
199 pci_setup_cache(struct pci_dev
*d
, byte
*cache
, int len
)