|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 8/9] vpci/msi: add MSI handlers
(Adding maintainers to the Cc...)
On Thu, Apr 20, 2017 at 04:17:42PM +0100, Roger Pau Monne wrote:
[...]
> diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
> index 75564b9d93..277e860d25 100644
> --- a/xen/include/xen/vpci.h
> +++ b/xen/include/xen/vpci.h
> @@ -88,9 +88,35 @@ struct vpci {
>
> /* List of capabilities supported by the device. */
> struct list_head cap_list;
> +
> + /* MSI data. */
> + struct vpci_msi {
> + /* Maximum number of vectors supported by the device. */
> + unsigned int max_vectors;
> + /* Current guest-written number of vectors. */
> + unsigned int guest_vectors;
> + /* Number of vectors configured. */
> + unsigned int vectors;
> + /* Address and data fields. */
> + uint64_t address;
> + uint16_t data;
> + /* PIRQ */
> + int pirq;
> + /* Mask bitfield. */
> + uint32_t mask;
> + /* MSI enabled? */
> + bool enabled;
I've realized that the enabled field is not needed, just checking if pirq != -1
is enough to know if MSIs are enabled or not, so I've folded the following diff
into this patch which removes the enabled field, no functional change.
---8<---
diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c
index aea6c68907..329945b30f 100644
--- a/xen/drivers/vpci/msi.c
+++ b/xen/drivers/vpci/msi.c
@@ -46,7 +46,7 @@ static int vpci_msi_control_read(struct pci_dev *pdev,
unsigned int reg,
{
struct vpci_msi *msi = data;
- if ( msi->enabled )
+ if ( msi->pirq != -1 )
val->word |= PCI_MSI_FLAGS_ENABLE;
if ( msi->masking )
val->word |= PCI_MSI_FLAGS_MASKBIT;
@@ -74,7 +74,7 @@ static int vpci_msi_control_write(struct pci_dev *pdev,
unsigned int reg,
msi->guest_vectors = vectors;
- if ( !((val.word ^ msi->enabled) & PCI_MSI_FLAGS_ENABLE) )
+ if ( !!(val.word & PCI_MSI_FLAGS_ENABLE) == (msi->pirq != -1) )
return 0;
if ( val.word & PCI_MSI_FLAGS_ENABLE )
@@ -87,7 +87,7 @@ static int vpci_msi_control_write(struct pci_dev *pdev,
unsigned int reg,
.entry_nr = vectors,
};
- ASSERT(!msi->enabled);
+ ASSERT(msi->pirq == -1);
/* Get a PIRQ. */
rc = allocate_and_map_msi_pirq(pdev->domain, &index, &msi->pirq,
@@ -149,11 +149,10 @@ static int vpci_msi_control_write(struct pci_dev *pdev,
unsigned int reg,
__msi_set_enable(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn),
PCI_FUNC(pdev->devfn), reg - PCI_MSI_FLAGS, 1);
- msi->enabled = true;
}
else
{
- ASSERT(msi->enabled);
+ ASSERT(msi->pirq != -1);
__msi_set_enable(pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn),
PCI_FUNC(pdev->devfn), reg - PCI_MSI_FLAGS, 0);
@@ -178,7 +177,6 @@ static int vpci_msi_control_write(struct pci_dev *pdev,
unsigned int reg,
msi->pirq = -1;
msi->vectors = 0;
- msi->enabled = false;
}
return 0;
@@ -426,7 +424,7 @@ static void vpci_dump_msi(unsigned char key)
printk("Device %04x:%02x:%02x.%u\n", seg, bus, slot, func);
printk("Enabled: %u Supports masking: %u 64-bit addresses: %u\n",
- msi->enabled, msi->masking, msi->address64);
+ msi->pirq != -1, msi->masking, msi->address64);
printk("Max vectors: %u guest vectors: %u enabled vectors: %u\n",
msi->max_vectors, msi->guest_vectors, msi->vectors);
diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
index 277e860d25..ad5347b118 100644
--- a/xen/include/xen/vpci.h
+++ b/xen/include/xen/vpci.h
@@ -100,12 +100,10 @@ struct vpci {
/* Address and data fields. */
uint64_t address;
uint16_t data;
- /* PIRQ */
+ /* PIRQ (if this field is different than -1, MSIs are enabled) */
int pirq;
/* Mask bitfield. */
uint32_t mask;
- /* MSI enabled? */
- bool enabled;
/* Supports per-vector masking? */
bool masking;
/* 64-bit address capable? */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |