• Zhu Lingshan's avatar
    vDPA/ifcvf: implement shared IRQ feature · 9b3e8148
    Zhu Lingshan authored
    On some platforms/devices, there may not be enough MSI vectors
    allocated for the virtqueues and config changes. In such a case,
    the interrupt sources(virtqueues, config changes) must share
    an IRQ/vector, to avoid initialization failures, keep
    the device functional.
    
    This commit handles three cases:
    (1) number of the allocated vectors == the number of virtqueues + 1
    (config changes), every virtqueue and the config interrupt has
    a separated vector/IRQ, the best and the most likely case.
    (2) number of the allocated vectors is less than the best case, but
    greater than 1. In this case, all virtqueues share a vector/IRQ,
    the config interrupt has a separated vector/IRQ
    (3) only one vector is allocated, in this case, the virtqueues and
    the config interrupt share a vector/IRQ. The worst and most
    unlikely case.
    
    Otherwise, it needs to fail.
    
    This commit introduces some helper functions:
    ifcvf_set_vq_vector() and ifcvf_set_config_vector() sets virtqueue
    vector and config vector in the device config space, so that
    the device can send interrupt DMA.
    Signed-off-by: default avatarZhu Lingshan <lingshan.zhu@intel.com>
    Link: https://lore.kernel.org/r/20220222115428.998334-5-lingshan.zhu@intel.comSigned-off-by: default avatarTom Rix <trix@redhat.com>
    Link: https://lore.kernel.org/r/20220315124130.1710030-1-trix@redhat.comSigned-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    9b3e8148
ifcvf_main.c 21.5 KB