* [PATCH v2 1/4] PCI/MSI: Conservatively generalize no_64bit_msi into msi_addr_mask
2026-01-21 3:49 [PATCH v2 0/4] PCI/MSI: Generalize no_64bit_msi into msi_addr_mask Vivian Wang
@ 2026-01-21 3:49 ` Vivian Wang
2026-01-21 8:21 ` Takashi Iwai
2026-01-21 23:40 ` Bjorn Helgaas
2026-01-21 3:49 ` [PATCH v2 2/4] PCI/MSI: Check msi_addr_mask in msi_verify_entries() Vivian Wang
` (2 subsequent siblings)
3 siblings, 2 replies; 10+ messages in thread
From: Vivian Wang @ 2026-01-21 3:49 UTC (permalink / raw)
To: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai
Cc: Han Gao, Vivian Wang, linuxppc-dev, linux-kernel, amd-gfx,
dri-devel, netdev, linux-pci, linux-sound, linux-riscv, sophgo
Some PCI devices have PCI_MSI_FLAGS_64BIT in the MSI capability, but
implement less than 64 address bits. This breaks on platforms where such
a device is assigned an MSI address higher than what's reachable.
Currently, we deal with this with a single no_64bit_msi flag, and
(notably on powerpc) forces 32-bit MSI address for these devices.
However, on some platforms the MSI doorbell address is above 32-bit but
within device ability.
As a first step to enabling MSI on those combinations of devices and
platforms, conservatively generalize the single-bit flag no_64bit_msi
into msi_addr_mask. (The name msi_addr_mask is chosen to avoid confusion
with msi_mask.)
The translation is essentially:
- no_64bit_msi = 1 -> msi_addr_mask = DMA_BIT_MASK(32)
- no_64bit_msi = 0 -> msi_addr_mask = DMA_BIT_MASK(64)
- if (no_64bit_msi) -> if (msi_addr_mask < DMA_BIT_MASK(64))
Since no values other than DMA_BIT_MASK(32) and DMA_BIT_MASK(64) is
used, no functional change is intended. Future patches that make use of
intermediate values of msi_addr_mask will follow, allowing devices that
cannot use full 64-bit addresses for MSI to work on platforms with MSI
doorbell above 32-bit address space.
Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
---
v2: Minor rewording. No code changes.
checkpatch complains about the comment include/linux/pci.h, which I have
formatted similarly with other comments in the vicinity.
---
arch/powerpc/platforms/powernv/pci-ioda.c | 2 +-
arch/powerpc/platforms/pseries/msi.c | 4 ++--
drivers/gpu/drm/radeon/radeon_irq_kms.c | 2 +-
drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c | 2 +-
drivers/pci/msi/msi.c | 2 +-
drivers/pci/msi/pcidev_msi.c | 2 +-
drivers/pci/probe.c | 7 +++++++
include/linux/pci.h | 8 +++++++-
sound/hda/controllers/intel.c | 2 +-
9 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index b0c1d9d16fb5..1c78fdfb7b03 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1666,7 +1666,7 @@ static int __pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
return -ENXIO;
/* Force 32-bit MSI on some broken devices */
- if (dev->no_64bit_msi)
+ if (dev->msi_addr_mask < DMA_BIT_MASK(64))
is_64 = 0;
/* Assign XIVE to PE */
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
index a82aaa786e9e..7473c7ca1db0 100644
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -383,7 +383,7 @@ static int rtas_prepare_msi_irqs(struct pci_dev *pdev, int nvec_in, int type,
*/
again:
if (type == PCI_CAP_ID_MSI) {
- if (pdev->no_64bit_msi) {
+ if (pdev->msi_addr_mask < DMA_BIT_MASK(64)) {
rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
if (rc < 0) {
/*
@@ -409,7 +409,7 @@ static int rtas_prepare_msi_irqs(struct pci_dev *pdev, int nvec_in, int type,
if (use_32bit_msi_hack && rc > 0)
rtas_hack_32bit_msi_gen2(pdev);
} else {
- if (pdev->no_64bit_msi)
+ if (pdev->msi_addr_mask < DMA_BIT_MASK(64))
rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSIX_FN, nvec);
else
rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
index 9961251b44ba..d550554a6f3f 100644
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
@@ -252,7 +252,7 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
*/
if (rdev->family < CHIP_BONAIRE) {
dev_info(rdev->dev, "radeon: MSI limited to 32-bit\n");
- rdev->pdev->no_64bit_msi = 1;
+ rdev->pdev->msi_addr_mask = DMA_BIT_MASK(32);
}
/* force MSI on */
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
index 70d86c5f52fb..0671deae9a28 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
@@ -331,7 +331,7 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
#ifdef CONFIG_PPC64
/* Ensure MSI/MSI-X interrupts lie within addressable physical memory */
- pdev->no_64bit_msi = 1;
+ pdev->msi_addr_mask = DMA_BIT_MASK(32);
#endif
err = ionic_setup_one(ionic);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 34d664139f48..48f5f03d1479 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -322,7 +322,7 @@ static int msi_verify_entries(struct pci_dev *dev)
{
struct msi_desc *entry;
- if (!dev->no_64bit_msi)
+ if (dev->msi_addr_mask == DMA_BIT_MASK(64))
return 0;
msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
diff --git a/drivers/pci/msi/pcidev_msi.c b/drivers/pci/msi/pcidev_msi.c
index 5520aff53b56..0b0346813092 100644
--- a/drivers/pci/msi/pcidev_msi.c
+++ b/drivers/pci/msi/pcidev_msi.c
@@ -24,7 +24,7 @@ void pci_msi_init(struct pci_dev *dev)
}
if (!(ctrl & PCI_MSI_FLAGS_64BIT))
- dev->no_64bit_msi = 1;
+ dev->msi_addr_mask = DMA_BIT_MASK(32);
}
void pci_msix_init(struct pci_dev *dev)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 41183aed8f5d..a2bff57176a3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2047,6 +2047,13 @@ int pci_setup_device(struct pci_dev *dev)
*/
dev->dma_mask = 0xffffffff;
+ /*
+ * Assume 64-bit addresses for MSI initially. Will be changed to 32-bit
+ * if MSI (rather than MSI-X) capability does not have
+ * PCI_MSI_FLAGS_64BIT. Can also be overridden by driver.
+ */
+ dev->msi_addr_mask = DMA_BIT_MASK(64);
+
dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
dev->bus->number, PCI_SLOT(dev->devfn),
PCI_FUNC(dev->devfn));
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 864775651c6f..0fe32fef0331 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -377,6 +377,13 @@ struct pci_dev {
0xffffffff. You only need to change
this if your device has broken DMA
or supports 64-bit transfers. */
+ u64 msi_addr_mask; /* Mask of the bits of bus address for
+ MSI that this device implements.
+ Normally set based on device
+ capabilities. You only need to
+ change this if your device claims
+ to support 64-bit MSI but implements
+ fewer than 64 address bits. */
struct device_dma_parameters dma_parms;
@@ -441,7 +448,6 @@ struct pci_dev {
unsigned int is_busmaster:1; /* Is busmaster */
unsigned int no_msi:1; /* May not use MSI */
- unsigned int no_64bit_msi:1; /* May only use 32-bit MSIs */
unsigned int block_cfg_access:1; /* Config space access blocked */
unsigned int broken_parity_status:1; /* Generates false positive parity */
unsigned int irq_reroute_variant:2; /* Needs IRQ rerouting variant */
diff --git a/sound/hda/controllers/intel.c b/sound/hda/controllers/intel.c
index 1e8e3d61291a..c9542ebdf7e2 100644
--- a/sound/hda/controllers/intel.c
+++ b/sound/hda/controllers/intel.c
@@ -1905,7 +1905,7 @@ static int azx_first_init(struct azx *chip)
if (chip->msi && chip->driver_caps & AZX_DCAPS_NO_MSI64) {
dev_dbg(card->dev, "Disabling 64bit MSI\n");
- pci->no_64bit_msi = true;
+ pci->msi_addr_mask = DMA_BIT_MASK(32);
}
pci_set_master(pci);
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH v2 1/4] PCI/MSI: Conservatively generalize no_64bit_msi into msi_addr_mask
2026-01-21 3:49 ` [PATCH v2 1/4] PCI/MSI: Conservatively generalize " Vivian Wang
@ 2026-01-21 8:21 ` Takashi Iwai
2026-01-21 23:40 ` Bjorn Helgaas
1 sibling, 0 replies; 10+ messages in thread
From: Takashi Iwai @ 2026-01-21 8:21 UTC (permalink / raw)
To: Vivian Wang
Cc: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai, Han Gao,
linuxppc-dev, linux-kernel, amd-gfx, dri-devel, netdev, linux-pci,
linux-sound, linux-riscv, sophgo
On Wed, 21 Jan 2026 04:49:37 +0100,
Vivian Wang wrote:
>
> Some PCI devices have PCI_MSI_FLAGS_64BIT in the MSI capability, but
> implement less than 64 address bits. This breaks on platforms where such
> a device is assigned an MSI address higher than what's reachable.
>
> Currently, we deal with this with a single no_64bit_msi flag, and
> (notably on powerpc) forces 32-bit MSI address for these devices.
> However, on some platforms the MSI doorbell address is above 32-bit but
> within device ability.
>
> As a first step to enabling MSI on those combinations of devices and
> platforms, conservatively generalize the single-bit flag no_64bit_msi
> into msi_addr_mask. (The name msi_addr_mask is chosen to avoid confusion
> with msi_mask.)
>
> The translation is essentially:
>
> - no_64bit_msi = 1 -> msi_addr_mask = DMA_BIT_MASK(32)
> - no_64bit_msi = 0 -> msi_addr_mask = DMA_BIT_MASK(64)
> - if (no_64bit_msi) -> if (msi_addr_mask < DMA_BIT_MASK(64))
>
> Since no values other than DMA_BIT_MASK(32) and DMA_BIT_MASK(64) is
> used, no functional change is intended. Future patches that make use of
> intermediate values of msi_addr_mask will follow, allowing devices that
> cannot use full 64-bit addresses for MSI to work on platforms with MSI
> doorbell above 32-bit address space.
>
> Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
For the sound part:
Acked-by: Takashi Iwai <tiwai@suse.de>
thanks,
Takashi
>
> ---
>
> v2: Minor rewording. No code changes.
>
> checkpatch complains about the comment include/linux/pci.h, which I have
> formatted similarly with other comments in the vicinity.
> ---
> arch/powerpc/platforms/powernv/pci-ioda.c | 2 +-
> arch/powerpc/platforms/pseries/msi.c | 4 ++--
> drivers/gpu/drm/radeon/radeon_irq_kms.c | 2 +-
> drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c | 2 +-
> drivers/pci/msi/msi.c | 2 +-
> drivers/pci/msi/pcidev_msi.c | 2 +-
> drivers/pci/probe.c | 7 +++++++
> include/linux/pci.h | 8 +++++++-
> sound/hda/controllers/intel.c | 2 +-
> 9 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
> index b0c1d9d16fb5..1c78fdfb7b03 100644
> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
> @@ -1666,7 +1666,7 @@ static int __pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
> return -ENXIO;
>
> /* Force 32-bit MSI on some broken devices */
> - if (dev->no_64bit_msi)
> + if (dev->msi_addr_mask < DMA_BIT_MASK(64))
> is_64 = 0;
>
> /* Assign XIVE to PE */
> diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
> index a82aaa786e9e..7473c7ca1db0 100644
> --- a/arch/powerpc/platforms/pseries/msi.c
> +++ b/arch/powerpc/platforms/pseries/msi.c
> @@ -383,7 +383,7 @@ static int rtas_prepare_msi_irqs(struct pci_dev *pdev, int nvec_in, int type,
> */
> again:
> if (type == PCI_CAP_ID_MSI) {
> - if (pdev->no_64bit_msi) {
> + if (pdev->msi_addr_mask < DMA_BIT_MASK(64)) {
> rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
> if (rc < 0) {
> /*
> @@ -409,7 +409,7 @@ static int rtas_prepare_msi_irqs(struct pci_dev *pdev, int nvec_in, int type,
> if (use_32bit_msi_hack && rc > 0)
> rtas_hack_32bit_msi_gen2(pdev);
> } else {
> - if (pdev->no_64bit_msi)
> + if (pdev->msi_addr_mask < DMA_BIT_MASK(64))
> rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSIX_FN, nvec);
> else
> rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
> diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
> index 9961251b44ba..d550554a6f3f 100644
> --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
> @@ -252,7 +252,7 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
> */
> if (rdev->family < CHIP_BONAIRE) {
> dev_info(rdev->dev, "radeon: MSI limited to 32-bit\n");
> - rdev->pdev->no_64bit_msi = 1;
> + rdev->pdev->msi_addr_mask = DMA_BIT_MASK(32);
> }
>
> /* force MSI on */
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
> index 70d86c5f52fb..0671deae9a28 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
> @@ -331,7 +331,7 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>
> #ifdef CONFIG_PPC64
> /* Ensure MSI/MSI-X interrupts lie within addressable physical memory */
> - pdev->no_64bit_msi = 1;
> + pdev->msi_addr_mask = DMA_BIT_MASK(32);
> #endif
>
> err = ionic_setup_one(ionic);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 34d664139f48..48f5f03d1479 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -322,7 +322,7 @@ static int msi_verify_entries(struct pci_dev *dev)
> {
> struct msi_desc *entry;
>
> - if (!dev->no_64bit_msi)
> + if (dev->msi_addr_mask == DMA_BIT_MASK(64))
> return 0;
>
> msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> diff --git a/drivers/pci/msi/pcidev_msi.c b/drivers/pci/msi/pcidev_msi.c
> index 5520aff53b56..0b0346813092 100644
> --- a/drivers/pci/msi/pcidev_msi.c
> +++ b/drivers/pci/msi/pcidev_msi.c
> @@ -24,7 +24,7 @@ void pci_msi_init(struct pci_dev *dev)
> }
>
> if (!(ctrl & PCI_MSI_FLAGS_64BIT))
> - dev->no_64bit_msi = 1;
> + dev->msi_addr_mask = DMA_BIT_MASK(32);
> }
>
> void pci_msix_init(struct pci_dev *dev)
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 41183aed8f5d..a2bff57176a3 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -2047,6 +2047,13 @@ int pci_setup_device(struct pci_dev *dev)
> */
> dev->dma_mask = 0xffffffff;
>
> + /*
> + * Assume 64-bit addresses for MSI initially. Will be changed to 32-bit
> + * if MSI (rather than MSI-X) capability does not have
> + * PCI_MSI_FLAGS_64BIT. Can also be overridden by driver.
> + */
> + dev->msi_addr_mask = DMA_BIT_MASK(64);
> +
> dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
> dev->bus->number, PCI_SLOT(dev->devfn),
> PCI_FUNC(dev->devfn));
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 864775651c6f..0fe32fef0331 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -377,6 +377,13 @@ struct pci_dev {
> 0xffffffff. You only need to change
> this if your device has broken DMA
> or supports 64-bit transfers. */
> + u64 msi_addr_mask; /* Mask of the bits of bus address for
> + MSI that this device implements.
> + Normally set based on device
> + capabilities. You only need to
> + change this if your device claims
> + to support 64-bit MSI but implements
> + fewer than 64 address bits. */
>
> struct device_dma_parameters dma_parms;
>
> @@ -441,7 +448,6 @@ struct pci_dev {
>
> unsigned int is_busmaster:1; /* Is busmaster */
> unsigned int no_msi:1; /* May not use MSI */
> - unsigned int no_64bit_msi:1; /* May only use 32-bit MSIs */
> unsigned int block_cfg_access:1; /* Config space access blocked */
> unsigned int broken_parity_status:1; /* Generates false positive parity */
> unsigned int irq_reroute_variant:2; /* Needs IRQ rerouting variant */
> diff --git a/sound/hda/controllers/intel.c b/sound/hda/controllers/intel.c
> index 1e8e3d61291a..c9542ebdf7e2 100644
> --- a/sound/hda/controllers/intel.c
> +++ b/sound/hda/controllers/intel.c
> @@ -1905,7 +1905,7 @@ static int azx_first_init(struct azx *chip)
>
> if (chip->msi && chip->driver_caps & AZX_DCAPS_NO_MSI64) {
> dev_dbg(card->dev, "Disabling 64bit MSI\n");
> - pci->no_64bit_msi = true;
> + pci->msi_addr_mask = DMA_BIT_MASK(32);
> }
>
> pci_set_master(pci);
>
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH v2 1/4] PCI/MSI: Conservatively generalize no_64bit_msi into msi_addr_mask
2026-01-21 3:49 ` [PATCH v2 1/4] PCI/MSI: Conservatively generalize " Vivian Wang
2026-01-21 8:21 ` Takashi Iwai
@ 2026-01-21 23:40 ` Bjorn Helgaas
1 sibling, 0 replies; 10+ messages in thread
From: Bjorn Helgaas @ 2026-01-21 23:40 UTC (permalink / raw)
To: Vivian Wang
Cc: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai, Han Gao,
linuxppc-dev, linux-kernel, amd-gfx, dri-devel, netdev, linux-pci,
linux-sound, linux-riscv, sophgo, Thomas Gleixner
[+cc Thomas]
On Wed, Jan 21, 2026 at 11:49:37AM +0800, Vivian Wang wrote:
> Some PCI devices have PCI_MSI_FLAGS_64BIT in the MSI capability, but
> implement less than 64 address bits. This breaks on platforms where such
> a device is assigned an MSI address higher than what's reachable.
>
> Currently, we deal with this with a single no_64bit_msi flag, and
> (notably on powerpc) forces 32-bit MSI address for these devices.
> However, on some platforms the MSI doorbell address is above 32-bit but
> within device ability.
>
> As a first step to enabling MSI on those combinations of devices and
> platforms, conservatively generalize the single-bit flag no_64bit_msi
> into msi_addr_mask. (The name msi_addr_mask is chosen to avoid confusion
> with msi_mask.)
>
> The translation is essentially:
>
> - no_64bit_msi = 1 -> msi_addr_mask = DMA_BIT_MASK(32)
> - no_64bit_msi = 0 -> msi_addr_mask = DMA_BIT_MASK(64)
> - if (no_64bit_msi) -> if (msi_addr_mask < DMA_BIT_MASK(64))
>
> Since no values other than DMA_BIT_MASK(32) and DMA_BIT_MASK(64) is
> used, no functional change is intended. Future patches that make use of
> intermediate values of msi_addr_mask will follow, allowing devices that
> cannot use full 64-bit addresses for MSI to work on platforms with MSI
> doorbell above 32-bit address space.
>
> Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
>
> ---
>
> v2: Minor rewording. No code changes.
>
> checkpatch complains about the comment include/linux/pci.h, which I have
> formatted similarly with other comments in the vicinity.
> ---
> arch/powerpc/platforms/powernv/pci-ioda.c | 2 +-
> arch/powerpc/platforms/pseries/msi.c | 4 ++--
> drivers/gpu/drm/radeon/radeon_irq_kms.c | 2 +-
> drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c | 2 +-
> drivers/pci/msi/msi.c | 2 +-
> drivers/pci/msi/pcidev_msi.c | 2 +-
> drivers/pci/probe.c | 7 +++++++
> include/linux/pci.h | 8 +++++++-
> sound/hda/controllers/intel.c | 2 +-
> 9 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
> index b0c1d9d16fb5..1c78fdfb7b03 100644
> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
> @@ -1666,7 +1666,7 @@ static int __pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
> return -ENXIO;
>
> /* Force 32-bit MSI on some broken devices */
> - if (dev->no_64bit_msi)
> + if (dev->msi_addr_mask < DMA_BIT_MASK(64))
> is_64 = 0;
>
> /* Assign XIVE to PE */
> diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
> index a82aaa786e9e..7473c7ca1db0 100644
> --- a/arch/powerpc/platforms/pseries/msi.c
> +++ b/arch/powerpc/platforms/pseries/msi.c
> @@ -383,7 +383,7 @@ static int rtas_prepare_msi_irqs(struct pci_dev *pdev, int nvec_in, int type,
> */
> again:
> if (type == PCI_CAP_ID_MSI) {
> - if (pdev->no_64bit_msi) {
> + if (pdev->msi_addr_mask < DMA_BIT_MASK(64)) {
> rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
> if (rc < 0) {
> /*
> @@ -409,7 +409,7 @@ static int rtas_prepare_msi_irqs(struct pci_dev *pdev, int nvec_in, int type,
> if (use_32bit_msi_hack && rc > 0)
> rtas_hack_32bit_msi_gen2(pdev);
> } else {
> - if (pdev->no_64bit_msi)
> + if (pdev->msi_addr_mask < DMA_BIT_MASK(64))
> rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSIX_FN, nvec);
> else
> rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
> diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
> index 9961251b44ba..d550554a6f3f 100644
> --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
> @@ -252,7 +252,7 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
> */
> if (rdev->family < CHIP_BONAIRE) {
> dev_info(rdev->dev, "radeon: MSI limited to 32-bit\n");
> - rdev->pdev->no_64bit_msi = 1;
> + rdev->pdev->msi_addr_mask = DMA_BIT_MASK(32);
> }
>
> /* force MSI on */
> diff --git a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
> index 70d86c5f52fb..0671deae9a28 100644
> --- a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
> +++ b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
> @@ -331,7 +331,7 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>
> #ifdef CONFIG_PPC64
> /* Ensure MSI/MSI-X interrupts lie within addressable physical memory */
> - pdev->no_64bit_msi = 1;
> + pdev->msi_addr_mask = DMA_BIT_MASK(32);
> #endif
>
> err = ionic_setup_one(ionic);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 34d664139f48..48f5f03d1479 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -322,7 +322,7 @@ static int msi_verify_entries(struct pci_dev *dev)
> {
> struct msi_desc *entry;
>
> - if (!dev->no_64bit_msi)
> + if (dev->msi_addr_mask == DMA_BIT_MASK(64))
> return 0;
>
> msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> diff --git a/drivers/pci/msi/pcidev_msi.c b/drivers/pci/msi/pcidev_msi.c
> index 5520aff53b56..0b0346813092 100644
> --- a/drivers/pci/msi/pcidev_msi.c
> +++ b/drivers/pci/msi/pcidev_msi.c
> @@ -24,7 +24,7 @@ void pci_msi_init(struct pci_dev *dev)
> }
>
> if (!(ctrl & PCI_MSI_FLAGS_64BIT))
> - dev->no_64bit_msi = 1;
> + dev->msi_addr_mask = DMA_BIT_MASK(32);
> }
>
> void pci_msix_init(struct pci_dev *dev)
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 41183aed8f5d..a2bff57176a3 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -2047,6 +2047,13 @@ int pci_setup_device(struct pci_dev *dev)
> */
> dev->dma_mask = 0xffffffff;
>
> + /*
> + * Assume 64-bit addresses for MSI initially. Will be changed to 32-bit
> + * if MSI (rather than MSI-X) capability does not have
> + * PCI_MSI_FLAGS_64BIT. Can also be overridden by driver.
> + */
> + dev->msi_addr_mask = DMA_BIT_MASK(64);
> +
> dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
> dev->bus->number, PCI_SLOT(dev->devfn),
> PCI_FUNC(dev->devfn));
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 864775651c6f..0fe32fef0331 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -377,6 +377,13 @@ struct pci_dev {
> 0xffffffff. You only need to change
> this if your device has broken DMA
> or supports 64-bit transfers. */
> + u64 msi_addr_mask; /* Mask of the bits of bus address for
> + MSI that this device implements.
> + Normally set based on device
> + capabilities. You only need to
> + change this if your device claims
> + to support 64-bit MSI but implements
> + fewer than 64 address bits. */
>
> struct device_dma_parameters dma_parms;
>
> @@ -441,7 +448,6 @@ struct pci_dev {
>
> unsigned int is_busmaster:1; /* Is busmaster */
> unsigned int no_msi:1; /* May not use MSI */
> - unsigned int no_64bit_msi:1; /* May only use 32-bit MSIs */
> unsigned int block_cfg_access:1; /* Config space access blocked */
> unsigned int broken_parity_status:1; /* Generates false positive parity */
> unsigned int irq_reroute_variant:2; /* Needs IRQ rerouting variant */
> diff --git a/sound/hda/controllers/intel.c b/sound/hda/controllers/intel.c
> index 1e8e3d61291a..c9542ebdf7e2 100644
> --- a/sound/hda/controllers/intel.c
> +++ b/sound/hda/controllers/intel.c
> @@ -1905,7 +1905,7 @@ static int azx_first_init(struct azx *chip)
>
> if (chip->msi && chip->driver_caps & AZX_DCAPS_NO_MSI64) {
> dev_dbg(card->dev, "Disabling 64bit MSI\n");
> - pci->no_64bit_msi = true;
> + pci->msi_addr_mask = DMA_BIT_MASK(32);
> }
>
> pci_set_master(pci);
>
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 2/4] PCI/MSI: Check msi_addr_mask in msi_verify_entries()
2026-01-21 3:49 [PATCH v2 0/4] PCI/MSI: Generalize no_64bit_msi into msi_addr_mask Vivian Wang
2026-01-21 3:49 ` [PATCH v2 1/4] PCI/MSI: Conservatively generalize " Vivian Wang
@ 2026-01-21 3:49 ` Vivian Wang
2026-01-21 23:38 ` Bjorn Helgaas
2026-01-21 3:49 ` [PATCH v2 3/4] drm/radeon: Raise msi_addr_mask to dma_bits Vivian Wang
2026-01-21 3:49 ` [PATCH v2 4/4] ALSA: hda/intel: " Vivian Wang
3 siblings, 1 reply; 10+ messages in thread
From: Vivian Wang @ 2026-01-21 3:49 UTC (permalink / raw)
To: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai
Cc: Han Gao, Vivian Wang, linuxppc-dev, linux-kernel, amd-gfx,
dri-devel, netdev, linux-pci, linux-sound, linux-riscv, sophgo
Instead of a 32-bit/64-bit dichotomy, check the MSI address against
msi_addr_mask.
This allows platforms with MSI doorbell above 32-bit address space to
work with devices without full 64-bit MSI address support, as long as
the doorbell is within addressable range of MSI of the device.
Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
---
v2: No changes
---
drivers/pci/msi/msi.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 48f5f03d1479..2ecbcd6c436a 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -321,14 +321,17 @@ static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
static int msi_verify_entries(struct pci_dev *dev)
{
struct msi_desc *entry;
+ u64 address;
if (dev->msi_addr_mask == DMA_BIT_MASK(64))
return 0;
msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
- if (entry->msg.address_hi) {
- pci_err(dev, "arch assigned 64-bit MSI address %#x%08x but device only supports 32 bits\n",
- entry->msg.address_hi, entry->msg.address_lo);
+ address = (u64)entry->msg.address_hi << 32 |
+ entry->msg.address_lo;
+ if (address & ~dev->msi_addr_mask) {
+ pci_err(dev, "arch assigned 64-bit MSI address %llx above device MSI address mask %llx\n",
+ address, dev->msi_addr_mask);
break;
}
}
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH v2 2/4] PCI/MSI: Check msi_addr_mask in msi_verify_entries()
2026-01-21 3:49 ` [PATCH v2 2/4] PCI/MSI: Check msi_addr_mask in msi_verify_entries() Vivian Wang
@ 2026-01-21 23:38 ` Bjorn Helgaas
2026-01-22 10:22 ` Vivian Wang
0 siblings, 1 reply; 10+ messages in thread
From: Bjorn Helgaas @ 2026-01-21 23:38 UTC (permalink / raw)
To: Vivian Wang
Cc: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai, Han Gao,
linuxppc-dev, linux-kernel, amd-gfx, dri-devel, netdev, linux-pci,
linux-sound, linux-riscv, sophgo, Thomas Gleixner
[+cc Thomas, thread at https://lore.kernel.org/r/20260121-pci-msi-addr-mask-v2-0-f42593168989@iscas.ac.cn]
On Wed, Jan 21, 2026 at 11:49:38AM +0800, Vivian Wang wrote:
> Instead of a 32-bit/64-bit dichotomy, check the MSI address against
> msi_addr_mask.
>
> This allows platforms with MSI doorbell above 32-bit address space to
> work with devices without full 64-bit MSI address support, as long as
> the doorbell is within addressable range of MSI of the device.
>
> Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
>
> ---
> v2: No changes
> ---
> drivers/pci/msi/msi.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 48f5f03d1479..2ecbcd6c436a 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -321,14 +321,17 @@ static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
> static int msi_verify_entries(struct pci_dev *dev)
> {
> struct msi_desc *entry;
> + u64 address;
>
> if (dev->msi_addr_mask == DMA_BIT_MASK(64))
> return 0;
>
> msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> - if (entry->msg.address_hi) {
> - pci_err(dev, "arch assigned 64-bit MSI address %#x%08x but device only supports 32 bits\n",
> - entry->msg.address_hi, entry->msg.address_lo);
> + address = (u64)entry->msg.address_hi << 32 |
> + entry->msg.address_lo;
> + if (address & ~dev->msi_addr_mask) {
> + pci_err(dev, "arch assigned 64-bit MSI address %llx above device MSI address mask %llx\n",
Use %#llx so it's clear these addresses are hex. The previous message
did that, not sure why you dropped it.
> + address, dev->msi_addr_mask);
> break;
> }
> }
>
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH v2 2/4] PCI/MSI: Check msi_addr_mask in msi_verify_entries()
2026-01-21 23:38 ` Bjorn Helgaas
@ 2026-01-22 10:22 ` Vivian Wang
0 siblings, 0 replies; 10+ messages in thread
From: Vivian Wang @ 2026-01-22 10:22 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai, Han Gao,
linuxppc-dev, linux-kernel, amd-gfx, dri-devel, netdev, linux-pci,
linux-sound, linux-riscv, sophgo, Thomas Gleixner
On 1/22/26 07:38, Bjorn Helgaas wrote:
> [+cc Thomas, thread at https://lore.kernel.org/r/20260121-pci-msi-addr-mask-v2-0-f42593168989@iscas.ac.cn]
>
> On Wed, Jan 21, 2026 at 11:49:38AM +0800, Vivian Wang wrote:
>> Instead of a 32-bit/64-bit dichotomy, check the MSI address against
>> msi_addr_mask.
>>
>> This allows platforms with MSI doorbell above 32-bit address space to
>> work with devices without full 64-bit MSI address support, as long as
>> the doorbell is within addressable range of MSI of the device.
>>
>> Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
>>
>> ---
>> v2: No changes
>> ---
>> drivers/pci/msi/msi.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
>> index 48f5f03d1479..2ecbcd6c436a 100644
>> --- a/drivers/pci/msi/msi.c
>> +++ b/drivers/pci/msi/msi.c
>> @@ -321,14 +321,17 @@ static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
>> static int msi_verify_entries(struct pci_dev *dev)
>> {
>> struct msi_desc *entry;
>> + u64 address;
>>
>> if (dev->msi_addr_mask == DMA_BIT_MASK(64))
>> return 0;
>>
>> msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
>> - if (entry->msg.address_hi) {
>> - pci_err(dev, "arch assigned 64-bit MSI address %#x%08x but device only supports 32 bits\n",
>> - entry->msg.address_hi, entry->msg.address_lo);
>> + address = (u64)entry->msg.address_hi << 32 |
>> + entry->msg.address_lo;
>> + if (address & ~dev->msi_addr_mask) {
>> + pci_err(dev, "arch assigned 64-bit MSI address %llx above device MSI address mask %llx\n",
> Use %#llx so it's clear these addresses are hex. The previous message
> did that, not sure why you dropped it.
Thanks for catching. I misunderstood the purpose of the original message
formatting.
I will fix this in v3.
Vivian "dramforever" Wang
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 3/4] drm/radeon: Raise msi_addr_mask to dma_bits
2026-01-21 3:49 [PATCH v2 0/4] PCI/MSI: Generalize no_64bit_msi into msi_addr_mask Vivian Wang
2026-01-21 3:49 ` [PATCH v2 1/4] PCI/MSI: Conservatively generalize " Vivian Wang
2026-01-21 3:49 ` [PATCH v2 2/4] PCI/MSI: Check msi_addr_mask in msi_verify_entries() Vivian Wang
@ 2026-01-21 3:49 ` Vivian Wang
2026-01-21 3:49 ` [PATCH v2 4/4] ALSA: hda/intel: " Vivian Wang
3 siblings, 0 replies; 10+ messages in thread
From: Vivian Wang @ 2026-01-21 3:49 UTC (permalink / raw)
To: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai
Cc: Han Gao, Vivian Wang, linuxppc-dev, linux-kernel, amd-gfx,
dri-devel, netdev, linux-pci, linux-sound, linux-riscv, sophgo
The code was originally written using no_64bit_msi, which restricts the
device to 32-bit MSI addresses.
Since msi_addr_mask is introduced, use DMA_BIT_MASK(dma_bits) instead of
DMA_BIT_MASK(32) here for msi_addr_mask, describing the restriction more
precisely and allowing these devices to work on platforms with MSI
doorbell address above 32-bit space, as long as it is within the
hardware's addressable space.
Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
---
v2: Set msi_addr_mask to same as DMA addr mask (Christian), and minor
rewording
---
drivers/gpu/drm/radeon/radeon_device.c | 1 +
drivers/gpu/drm/radeon/radeon_irq_kms.c | 10 ----------
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 60afaa8e56b4..5faae0361361 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1374,6 +1374,7 @@ int radeon_device_init(struct radeon_device *rdev,
pr_warn("radeon: No suitable DMA available\n");
return r;
}
+ rdev->pdev->msi_addr_mask = DMA_BIT_MASK(dma_bits);
rdev->need_swiotlb = drm_need_swiotlb(dma_bits);
/* Registers mapping */
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
index d550554a6f3f..839d619e5602 100644
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
@@ -245,16 +245,6 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
if (rdev->flags & RADEON_IS_AGP)
return false;
- /*
- * Older chips have a HW limitation, they can only generate 40 bits
- * of address for "64-bit" MSIs which breaks on some platforms, notably
- * IBM POWER servers, so we limit them
- */
- if (rdev->family < CHIP_BONAIRE) {
- dev_info(rdev->dev, "radeon: MSI limited to 32-bit\n");
- rdev->pdev->msi_addr_mask = DMA_BIT_MASK(32);
- }
-
/* force MSI on */
if (radeon_msi == 1)
return true;
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v2 4/4] ALSA: hda/intel: Raise msi_addr_mask to dma_bits
2026-01-21 3:49 [PATCH v2 0/4] PCI/MSI: Generalize no_64bit_msi into msi_addr_mask Vivian Wang
` (2 preceding siblings ...)
2026-01-21 3:49 ` [PATCH v2 3/4] drm/radeon: Raise msi_addr_mask to dma_bits Vivian Wang
@ 2026-01-21 3:49 ` Vivian Wang
2026-01-21 8:15 ` Takashi Iwai
3 siblings, 1 reply; 10+ messages in thread
From: Vivian Wang @ 2026-01-21 3:49 UTC (permalink / raw)
To: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai
Cc: Han Gao, Vivian Wang, linuxppc-dev, linux-kernel, amd-gfx,
dri-devel, netdev, linux-pci, linux-sound, linux-riscv, sophgo
The code was originally written using no_64bit_msi, which restricts the
device to 32-bit MSI addresses.
Since msi_addr_mask is introduced, use DMA_BIT_MASK(dma_bits) instead of
DMA_BIT_MASK(32) here for msi_addr_mask, describing the restriction more
precisely and allowing these devices to work on platforms with MSI
doorbell address above 32-bit space, as long as it is within the
hardware's addressable space.
Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
---
v2: No changes
hda/intel maintainers: I don't know if this is the correct restriction.
Please help with checking. Thanks.
---
sound/hda/controllers/intel.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/sound/hda/controllers/intel.c b/sound/hda/controllers/intel.c
index c9542ebdf7e2..a44de2306a2b 100644
--- a/sound/hda/controllers/intel.c
+++ b/sound/hda/controllers/intel.c
@@ -1903,11 +1903,6 @@ static int azx_first_init(struct azx *chip)
chip->gts_present = true;
#endif
- if (chip->msi && chip->driver_caps & AZX_DCAPS_NO_MSI64) {
- dev_dbg(card->dev, "Disabling 64bit MSI\n");
- pci->msi_addr_mask = DMA_BIT_MASK(32);
- }
-
pci_set_master(pci);
gcap = azx_readw(chip, GCAP);
@@ -1958,6 +1953,11 @@ static int azx_first_init(struct azx *chip)
dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32));
dma_set_max_seg_size(&pci->dev, UINT_MAX);
+ if (chip->msi && chip->driver_caps & AZX_DCAPS_NO_MSI64) {
+ dev_dbg(card->dev, "Restricting MSI to %u-bit\n", dma_bits);
+ pci->msi_addr_mask = DMA_BIT_MASK(dma_bits);
+ }
+
/* read number of streams from GCAP register instead of using
* hardcoded value
*/
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH v2 4/4] ALSA: hda/intel: Raise msi_addr_mask to dma_bits
2026-01-21 3:49 ` [PATCH v2 4/4] ALSA: hda/intel: " Vivian Wang
@ 2026-01-21 8:15 ` Takashi Iwai
0 siblings, 0 replies; 10+ messages in thread
From: Takashi Iwai @ 2026-01-21 8:15 UTC (permalink / raw)
To: Vivian Wang
Cc: Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Alex Deucher, Christian König,
David Airlie, Simona Vetter, Creeley, Brett, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Bjorn Helgaas, Jaroslav Kysela, Takashi Iwai, Han Gao,
linuxppc-dev, linux-kernel, amd-gfx, dri-devel, netdev, linux-pci,
linux-sound, linux-riscv, sophgo
On Wed, 21 Jan 2026 04:49:40 +0100,
Vivian Wang wrote:
>
> The code was originally written using no_64bit_msi, which restricts the
> device to 32-bit MSI addresses.
>
> Since msi_addr_mask is introduced, use DMA_BIT_MASK(dma_bits) instead of
> DMA_BIT_MASK(32) here for msi_addr_mask, describing the restriction more
> precisely and allowing these devices to work on platforms with MSI
> doorbell address above 32-bit space, as long as it is within the
> hardware's addressable space.
>
> Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
>
> ---
> v2: No changes
>
> hda/intel maintainers: I don't know if this is the correct restriction.
> Please help with checking. Thanks.
The quirk is used only for AMD graphics chips, so this should
(hopefully) work.
Acked-by: Takashi Iwai <tiwai@suse.de>
thanks,
Takashi
^ permalink raw reply [flat|nested] 10+ messages in thread