pci: introduce helper functions to test-and-{clear, set} mask in configuration space
This patch introduces helper functions to test-and-{clear, set} mask in configuration
space. pci_{byte, word, long, quad}_test_and_{clear, set}_mask().
They will be used later.
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						parent
						
							1a4f5971b6
						
					
				
				
					commit
					aabcf5266f
				
			
							
								
								
									
										70
									
								
								hw/pci.h
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								hw/pci.h
									
									
									
									
									
								
							@@ -323,6 +323,76 @@ pci_config_set_interrupt_pin(uint8_t *pci_config, uint8_t val)
 | 
			
		||||
    pci_set_byte(&pci_config[PCI_INTERRUPT_PIN], val);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * helper functions to do bit mask operation on configuration space.
 | 
			
		||||
 * Just to set bit, use test-and-set and discard returned value.
 | 
			
		||||
 * Just to clear bit, use test-and-clear and discard returned value.
 | 
			
		||||
 * NOTE: They aren't atomic.
 | 
			
		||||
 */
 | 
			
		||||
static inline uint8_t
 | 
			
		||||
pci_byte_test_and_clear_mask(uint8_t *config, uint8_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t val = pci_get_byte(config);
 | 
			
		||||
    pci_set_byte(config, val & ~mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint8_t
 | 
			
		||||
pci_byte_test_and_set_mask(uint8_t *config, uint8_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t val = pci_get_byte(config);
 | 
			
		||||
    pci_set_byte(config, val | mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint16_t
 | 
			
		||||
pci_word_test_and_clear_mask(uint8_t *config, uint16_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t val = pci_get_word(config);
 | 
			
		||||
    pci_set_word(config, val & ~mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint16_t
 | 
			
		||||
pci_word_test_and_set_mask(uint8_t *config, uint16_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t val = pci_get_word(config);
 | 
			
		||||
    pci_set_word(config, val | mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t
 | 
			
		||||
pci_long_test_and_clear_mask(uint8_t *config, uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t val = pci_get_long(config);
 | 
			
		||||
    pci_set_long(config, val & ~mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t
 | 
			
		||||
pci_long_test_and_set_mask(uint8_t *config, uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t val = pci_get_long(config);
 | 
			
		||||
    pci_set_long(config, val | mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint64_t
 | 
			
		||||
pci_quad_test_and_clear_mask(uint8_t *config, uint64_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint64_t val = pci_get_quad(config);
 | 
			
		||||
    pci_set_quad(config, val & ~mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint64_t
 | 
			
		||||
pci_quad_test_and_set_mask(uint8_t *config, uint64_t mask)
 | 
			
		||||
{
 | 
			
		||||
    uint64_t val = pci_get_quad(config);
 | 
			
		||||
    pci_set_quad(config, val | mask);
 | 
			
		||||
    return val & mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef int (*pci_qdev_initfn)(PCIDevice *dev);
 | 
			
		||||
typedef struct {
 | 
			
		||||
    DeviceInfo qdev;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user