OSDN Git Service

ASoC: SOF: Intel: hda: add a parameter to disable MSI
authorGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Mon, 22 Jul 2019 14:13:57 +0000 (09:13 -0500)
committerMark Brown <broonie@kernel.org>
Tue, 23 Jul 2019 11:21:45 +0000 (12:21 +0100)
Enabling MSI on HDA can fail, in which case the legacy PCI IRQ mode
will be used. To make testing this mode easier add an "enable_msi"
module parameter, which is only enabled if debugging is enabled too.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20190722141402.7194-17-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda.c
sound/soc/sof/sof-priv.h

index 7f66539..79cce20 100644 (file)
@@ -46,6 +46,12 @@ struct hda_dsp_msg_code {
        const char *msg;
 };
 
+static bool hda_use_msi = IS_ENABLED(CONFIG_PCI);
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG)
+module_param_named(use_msi, hda_use_msi, bool, 0444);
+MODULE_PARM_DESC(use_msi, "SOF HDA use PCI MSI mode");
+#endif
+
 static const struct hda_dsp_msg_code hda_dsp_rom_msg[] = {
        {HDA_DSP_ROM_FW_MANIFEST_LOADED, "status: manifest loaded"},
        {HDA_DSP_ROM_FW_FW_LOADED, "status: fw loaded"},
@@ -529,11 +535,18 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
         * register our IRQ
         * let's try to enable msi firstly
         * if it fails, use legacy interrupt mode
-        * TODO: support interrupt mode selection with kernel parameter
-        *       support msi multiple vectors
+        * TODO: support msi multiple vectors
         */
-       ret = pci_alloc_irq_vectors(pci, 1, 1, PCI_IRQ_MSI);
-       if (ret < 0) {
+       if (hda_use_msi && !pci_alloc_irq_vectors(pci, 1, 1, PCI_IRQ_MSI)) {
+               dev_info(sdev->dev, "use msi interrupt mode\n");
+               hdev->irq = pci_irq_vector(pci, 0);
+               /* ipc irq number is the same of hda irq */
+               sdev->ipc_irq = hdev->irq;
+               /* initialised to "false" by kzalloc() */
+               sdev->msi_enabled = true;
+       }
+
+       if (!sdev->msi_enabled) {
                dev_info(sdev->dev, "use legacy interrupt mode\n");
                /*
                 * in IO-APIC mode, hda->irq and ipc_irq are using the same
@@ -541,13 +554,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
                 */
                hdev->irq = pci->irq;
                sdev->ipc_irq = pci->irq;
-               sdev->msi_enabled = 0;
-       } else {
-               dev_info(sdev->dev, "use msi interrupt mode\n");
-               hdev->irq = pci_irq_vector(pci, 0);
-               /* ipc irq number is the same of hda irq */
-               sdev->ipc_irq = hdev->irq;
-               sdev->msi_enabled = 1;
        }
 
        dev_dbg(sdev->dev, "using HDA IRQ %d\n", hdev->irq);
index b8c9274..983eade 100644 (file)
@@ -435,7 +435,7 @@ struct snd_sof_dev {
        u32 dtrace_error;
        u32 dtrace_draining;
 
-       u32 msi_enabled;
+       bool msi_enabled;
 
        void *private;                  /* core does not touch this */
 };