Revision aabcf526 hw/pci.h
b/hw/pci.h | ||
---|---|---|
323 | 323 |
pci_set_byte(&pci_config[PCI_INTERRUPT_PIN], val); |
324 | 324 |
} |
325 | 325 |
|
326 |
/* |
|
327 |
* helper functions to do bit mask operation on configuration space. |
|
328 |
* Just to set bit, use test-and-set and discard returned value. |
|
329 |
* Just to clear bit, use test-and-clear and discard returned value. |
|
330 |
* NOTE: They aren't atomic. |
|
331 |
*/ |
|
332 |
static inline uint8_t |
|
333 |
pci_byte_test_and_clear_mask(uint8_t *config, uint8_t mask) |
|
334 |
{ |
|
335 |
uint8_t val = pci_get_byte(config); |
|
336 |
pci_set_byte(config, val & ~mask); |
|
337 |
return val & mask; |
|
338 |
} |
|
339 |
|
|
340 |
static inline uint8_t |
|
341 |
pci_byte_test_and_set_mask(uint8_t *config, uint8_t mask) |
|
342 |
{ |
|
343 |
uint8_t val = pci_get_byte(config); |
|
344 |
pci_set_byte(config, val | mask); |
|
345 |
return val & mask; |
|
346 |
} |
|
347 |
|
|
348 |
static inline uint16_t |
|
349 |
pci_word_test_and_clear_mask(uint8_t *config, uint16_t mask) |
|
350 |
{ |
|
351 |
uint16_t val = pci_get_word(config); |
|
352 |
pci_set_word(config, val & ~mask); |
|
353 |
return val & mask; |
|
354 |
} |
|
355 |
|
|
356 |
static inline uint16_t |
|
357 |
pci_word_test_and_set_mask(uint8_t *config, uint16_t mask) |
|
358 |
{ |
|
359 |
uint16_t val = pci_get_word(config); |
|
360 |
pci_set_word(config, val | mask); |
|
361 |
return val & mask; |
|
362 |
} |
|
363 |
|
|
364 |
static inline uint32_t |
|
365 |
pci_long_test_and_clear_mask(uint8_t *config, uint32_t mask) |
|
366 |
{ |
|
367 |
uint32_t val = pci_get_long(config); |
|
368 |
pci_set_long(config, val & ~mask); |
|
369 |
return val & mask; |
|
370 |
} |
|
371 |
|
|
372 |
static inline uint32_t |
|
373 |
pci_long_test_and_set_mask(uint8_t *config, uint32_t mask) |
|
374 |
{ |
|
375 |
uint32_t val = pci_get_long(config); |
|
376 |
pci_set_long(config, val | mask); |
|
377 |
return val & mask; |
|
378 |
} |
|
379 |
|
|
380 |
static inline uint64_t |
|
381 |
pci_quad_test_and_clear_mask(uint8_t *config, uint64_t mask) |
|
382 |
{ |
|
383 |
uint64_t val = pci_get_quad(config); |
|
384 |
pci_set_quad(config, val & ~mask); |
|
385 |
return val & mask; |
|
386 |
} |
|
387 |
|
|
388 |
static inline uint64_t |
|
389 |
pci_quad_test_and_set_mask(uint8_t *config, uint64_t mask) |
|
390 |
{ |
|
391 |
uint64_t val = pci_get_quad(config); |
|
392 |
pci_set_quad(config, val | mask); |
|
393 |
return val & mask; |
|
394 |
} |
|
395 |
|
|
326 | 396 |
typedef int (*pci_qdev_initfn)(PCIDevice *dev); |
327 | 397 |
typedef struct { |
328 | 398 |
DeviceInfo qdev; |
Also available in: Unified diff