[SRU][Eoan][PATCH 0/6] alsa/sof: let legacy hda driver and sof driver co-exist

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 0/6] alsa/sof: let legacy hda driver and sof driver co-exist

Hui Wang
BugLink: http://bugs.launchpad.net/bugs/1837828

These patches are already in the unstable and focal kernel, and I
already backported them to oem-b-osp1 kernel before these patches are
merged to mainline kernel, now it is time to backport them to eoan
kernel.

[Impact]
So far, if we want the sof driver to work, we need to blacklist
snd_hda_intel.ko, but on some paltforms with nv hdmi or amd hdmi,
we need these two driver co-exist.

[Fix]
Intel sent the patches to fix this issue, it is merged to kernel-5.4.


[Test Case]
remove snd_hda_intel.ko from blacklist, the two drivers (sof and hda)
worked well.

[Regression Risk]
Low. We already tested these patches on some Dell and LENOVO machines.


Hui Wang (1):
  UBUNTU: [Config] Enable SND_HDA_INTEL_DETECT_DMIC

Pierre-Louis Bossart (5):
  ASoC: Intel: Skylake: move NHLT header to common directory
  ALSA: hda: move parts of NHLT code to new module
  ALSA: hda: intel-nhlt: handle NHLT VENDOR_DEFINED DMIC geometry
  ASoC: Intel: Skylake: use common NHLT module
  ALSA: hda/intel: stop probe if DMICS are detected on Skylake+
    platforms

 debian.master/config/annotations              |   4 +
 debian.master/config/config.common.ubuntu     |   2 +
 .../skl-nhlt.h => include/sound/intel-nhlt.h  |  51 +++++++--
 sound/hda/Kconfig                             |   5 +
 sound/hda/Makefile                            |   3 +
 sound/hda/intel-nhlt.c                        | 107 ++++++++++++++++++
 sound/pci/hda/Kconfig                         |  10 ++
 sound/pci/hda/hda_intel.c                     |  34 ++++++
 sound/soc/intel/Kconfig                       |   1 +
 sound/soc/intel/skylake/skl-nhlt.c            |  91 +--------------
 sound/soc/intel/skylake/skl-ssp-clk.c         |   1 +
 sound/soc/intel/skylake/skl-topology.c        |   1 +
 sound/soc/intel/skylake/skl.c                 |  12 +-
 sound/soc/intel/skylake/skl.h                 |   4 -
 14 files changed, 218 insertions(+), 108 deletions(-)
 rename sound/soc/intel/skylake/skl-nhlt.h => include/sound/intel-nhlt.h (65%)
 create mode 100644 sound/hda/intel-nhlt.c

--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 1/6] ASoC: Intel: Skylake: move NHLT header to common directory

Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1837828

Prepare move from NHLT code to common directory, starting with header.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Takashi Iwai <[hidden email]>
(cherry picked from commit 63643b5902c4bf096b504b0563f5426ba5baef15)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/intel/skylake/skl-nhlt.h => include/sound/intel-nhlt.h | 0
 sound/soc/intel/skylake/skl-nhlt.c                               | 1 +
 sound/soc/intel/skylake/skl-ssp-clk.c                            | 1 +
 sound/soc/intel/skylake/skl-topology.c                           | 1 +
 sound/soc/intel/skylake/skl.h                                    | 1 -
 5 files changed, 3 insertions(+), 1 deletion(-)
 rename sound/soc/intel/skylake/skl-nhlt.h => include/sound/intel-nhlt.h (100%)

diff --git a/sound/soc/intel/skylake/skl-nhlt.h b/include/sound/intel-nhlt.h
similarity index 100%
rename from sound/soc/intel/skylake/skl-nhlt.h
rename to include/sound/intel-nhlt.h
diff --git a/sound/soc/intel/skylake/skl-nhlt.c b/sound/soc/intel/skylake/skl-nhlt.c
index e01815cec6fd..8ae61666adf4 100644
--- a/sound/soc/intel/skylake/skl-nhlt.c
+++ b/sound/soc/intel/skylake/skl-nhlt.c
@@ -9,6 +9,7 @@
  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  */
 #include <linux/pci.h>
+#include <sound/intel-nhlt.h>
 #include "skl.h"
 #include "skl-i2s.h"
 
diff --git a/sound/soc/intel/skylake/skl-ssp-clk.c b/sound/soc/intel/skylake/skl-ssp-clk.c
index 5bb6e40d4d3e..5bfcd46452f9 100644
--- a/sound/soc/intel/skylake/skl-ssp-clk.c
+++ b/sound/soc/intel/skylake/skl-ssp-clk.c
@@ -11,6 +11,7 @@
 #include <linux/platform_device.h>
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
+#include <sound/intel-nhlt.h>
 #include "skl.h"
 #include "skl-ssp-clk.h"
 #include "skl-topology.h"
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 6241e35213af..f8a501cf5fbd 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -12,6 +12,7 @@
 #include <linux/types.h>
 #include <linux/firmware.h>
 #include <linux/uuid.h>
+#include <sound/intel-nhlt.h>
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
diff --git a/sound/soc/intel/skylake/skl.h b/sound/soc/intel/skylake/skl.h
index 6070666a6392..928e8115a1a7 100644
--- a/sound/soc/intel/skylake/skl.h
+++ b/sound/soc/intel/skylake/skl.h
@@ -16,7 +16,6 @@
 #include <sound/hdaudio_ext.h>
 #include <sound/hda_codec.h>
 #include <sound/soc.h>
-#include "skl-nhlt.h"
 #include "skl-ssp-clk.h"
 
 #define SKL_SUSPEND_DELAY 2000
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 2/6] ALSA: hda: move parts of NHLT code to new module

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1837828

Move parts of the code outside of the Skylake driver to help detect
the presence of DMICs (which are not supported by the HDaudio legacy
driver).

No functionality change (except for the removal of useless OR
operations), only indentation and checkpatch fixes, making sure
that the code compiles without ACPI and fixing an ACPI leak

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Takashi Iwai <[hidden email]>
(cherry picked from commit 303681f4356d322232dd5f6d9eb4bc62666064c5)
Signed-off-by: Hui Wang <[hidden email]>
---
 include/sound/intel-nhlt.h |  41 ++++++++++++---
 sound/hda/Kconfig          |   5 ++
 sound/hda/Makefile         |   3 ++
 sound/hda/intel-nhlt.c     | 103 +++++++++++++++++++++++++++++++++++++
 4 files changed, 144 insertions(+), 8 deletions(-)
 create mode 100644 sound/hda/intel-nhlt.c

diff --git a/include/sound/intel-nhlt.h b/include/sound/intel-nhlt.h
index f85fbf9c7ce4..857922f03931 100644
--- a/include/sound/intel-nhlt.h
+++ b/include/sound/intel-nhlt.h
@@ -1,18 +1,17 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- *  skl-nhlt.h - Intel HDA Platform NHLT header
+ *  intel-nhlt.h - Intel HDA Platform NHLT header
  *
- *  Copyright (C) 2015 Intel Corp
- *  Author: Sanjiv Kumar <[hidden email]>
- *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *  Copyright (c) 2015-2019 Intel Corporation
  */
-#ifndef __SKL_NHLT_H__
-#define __SKL_NHLT_H__
+
+#ifndef __INTEL_NHLT_H__
+#define __INTEL_NHLT_H__
 
 #include <linux/acpi.h>
 
+#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_INTEL_NHLT)
+
 struct wav_fmt {
  u16 fmt_tag;
  u16 channels;
@@ -116,4 +115,30 @@ enum {
  NHLT_MIC_ARRAY_VENDOR_DEFINED = 0xf,
 };
 
+struct nhlt_acpi_table *intel_nhlt_init(struct device *dev);
+
+void intel_nhlt_free(struct nhlt_acpi_table *addr);
+
+int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt);
+
+#else
+
+struct nhlt_acpi_table;
+
+static inline struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)
+{
+ return NULL;
+}
+
+static inline void intel_nhlt_free(struct nhlt_acpi_table *addr)
+{
+}
+
+static inline int intel_nhlt_get_dmic_geo(struct device *dev,
+  struct nhlt_acpi_table *nhlt)
+{
+ return 0;
+}
+#endif
+
 #endif
diff --git a/sound/hda/Kconfig b/sound/hda/Kconfig
index f6feced15f17..9ccbcb5a06bd 100644
--- a/sound/hda/Kconfig
+++ b/sound/hda/Kconfig
@@ -29,3 +29,8 @@ config SND_HDA_PREALLOC_SIZE
 
   Note that the pre-allocation size can be changed dynamically
   via a proc file (/proc/asound/card*/pcm*/sub*/prealloc), too.
+
+config SND_INTEL_NHLT
+ tristate
+ # this config should be selected only for Intel ACPI platforms.
+ # A fallback is provided so that the code compiles in all cases.
\ No newline at end of file
diff --git a/sound/hda/Makefile b/sound/hda/Makefile
index 2160202e2dc1..8560f6ef1b19 100644
--- a/sound/hda/Makefile
+++ b/sound/hda/Makefile
@@ -13,3 +13,6 @@ obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o
 
 #extended hda
 obj-$(CONFIG_SND_HDA_EXT_CORE) += ext/
+
+snd-intel-nhlt-objs := intel-nhlt.o
+obj-$(CONFIG_SND_INTEL_NHLT) += snd-intel-nhlt.o
diff --git a/sound/hda/intel-nhlt.c b/sound/hda/intel-nhlt.c
new file mode 100644
index 000000000000..7a62e03ba407
--- /dev/null
+++ b/sound/hda/intel-nhlt.c
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2015-2019 Intel Corporation
+
+#include <linux/acpi.h>
+#include <sound/intel-nhlt.h>
+
+#define NHLT_ACPI_HEADER_SIG "NHLT"
+
+/* Unique identification for getting NHLT blobs */
+static guid_t osc_guid =
+ GUID_INIT(0xA69F886E, 0x6CEB, 0x4594,
+  0xA4, 0x1F, 0x7B, 0x5D, 0xCE, 0x24, 0xC5, 0x53);
+
+struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)
+{
+ acpi_handle handle;
+ union acpi_object *obj;
+ struct nhlt_resource_desc *nhlt_ptr;
+ struct nhlt_acpi_table *nhlt_table = NULL;
+
+ handle = ACPI_HANDLE(dev);
+ if (!handle) {
+ dev_err(dev, "Didn't find ACPI_HANDLE\n");
+ return NULL;
+ }
+
+ obj = acpi_evaluate_dsm(handle, &osc_guid, 1, 1, NULL);
+
+ if (!obj)
+ return NULL;
+
+ if (obj->type != ACPI_TYPE_BUFFER) {
+ dev_dbg(dev, "No NHLT table found\n");
+ ACPI_FREE(obj);
+ return NULL;
+ }
+
+ nhlt_ptr = (struct nhlt_resource_desc  *)obj->buffer.pointer;
+ if (nhlt_ptr->length)
+ nhlt_table = (struct nhlt_acpi_table *)
+ memremap(nhlt_ptr->min_addr, nhlt_ptr->length,
+ MEMREMAP_WB);
+ ACPI_FREE(obj);
+ if (nhlt_table &&
+    (strncmp(nhlt_table->header.signature,
+     NHLT_ACPI_HEADER_SIG,
+     strlen(NHLT_ACPI_HEADER_SIG)) != 0)) {
+ memunmap(nhlt_table);
+ dev_err(dev, "NHLT ACPI header signature incorrect\n");
+ return NULL;
+ }
+ return nhlt_table;
+}
+EXPORT_SYMBOL_GPL(intel_nhlt_init);
+
+void intel_nhlt_free(struct nhlt_acpi_table *nhlt)
+{
+ memunmap((void *)nhlt);
+}
+EXPORT_SYMBOL_GPL(intel_nhlt_free);
+
+int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
+{
+ struct nhlt_endpoint *epnt;
+ struct nhlt_dmic_array_config *cfg;
+ unsigned int dmic_geo = 0;
+ u8 j;
+
+ if (!nhlt)
+ return 0;
+
+ epnt = (struct nhlt_endpoint *)nhlt->desc;
+
+ for (j = 0; j < nhlt->endpoint_count; j++) {
+ if (epnt->linktype == NHLT_LINK_DMIC) {
+ cfg = (struct nhlt_dmic_array_config  *)
+ (epnt->config.caps);
+ switch (cfg->array_type) {
+ case NHLT_MIC_ARRAY_2CH_SMALL:
+ case NHLT_MIC_ARRAY_2CH_BIG:
+ dmic_geo = MIC_ARRAY_2CH;
+ break;
+
+ case NHLT_MIC_ARRAY_4CH_1ST_GEOM:
+ case NHLT_MIC_ARRAY_4CH_L_SHAPED:
+ case NHLT_MIC_ARRAY_4CH_2ND_GEOM:
+ dmic_geo = MIC_ARRAY_4CH;
+ break;
+
+ default:
+ dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
+ cfg->array_type);
+ }
+ }
+ epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
+ }
+
+ return dmic_geo;
+}
+EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("Intel NHLT driver");
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 3/6] ALSA: hda: intel-nhlt: handle NHLT VENDOR_DEFINED DMIC geometry

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1837828

The NHLT spec defines a VENDOR_DEFINED geometry, which requires
reading additional information to figure out the number of
microphones.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Takashi Iwai <[hidden email]>
(cherry picked from commit 7a33ea70e1868ee578fe2e9a85dd300efa1a35d5)
Signed-off-by: Hui Wang <[hidden email]>
---
 include/sound/intel-nhlt.h | 10 ++++++++--
 sound/hda/intel-nhlt.c     |  6 +++++-
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/include/sound/intel-nhlt.h b/include/sound/intel-nhlt.h
index 857922f03931..f657fd8fc0ad 100644
--- a/include/sound/intel-nhlt.h
+++ b/include/sound/intel-nhlt.h
@@ -96,16 +96,22 @@ struct nhlt_resource_desc  {
 #define MIC_ARRAY_2CH 2
 #define MIC_ARRAY_4CH 4
 
-struct nhlt_tdm_config {
+struct nhlt_device_specific_config {
  u8 virtual_slot;
  u8 config_type;
 } __packed;
 
 struct nhlt_dmic_array_config {
- struct nhlt_tdm_config tdm_config;
+ struct nhlt_device_specific_config device_config;
  u8 array_type;
 } __packed;
 
+struct nhlt_vendor_dmic_array_config {
+ struct nhlt_dmic_array_config dmic_config;
+ u8 nb_mics;
+ /* TODO add vendor mic config */
+} __packed;
+
 enum {
  NHLT_MIC_ARRAY_2CH_SMALL = 0xa,
  NHLT_MIC_ARRAY_2CH_BIG = 0xb,
diff --git a/sound/hda/intel-nhlt.c b/sound/hda/intel-nhlt.c
index 7a62e03ba407..daede96f28ee 100644
--- a/sound/hda/intel-nhlt.c
+++ b/sound/hda/intel-nhlt.c
@@ -63,6 +63,7 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
 {
  struct nhlt_endpoint *epnt;
  struct nhlt_dmic_array_config *cfg;
+ struct nhlt_vendor_dmic_array_config *cfg_vendor;
  unsigned int dmic_geo = 0;
  u8 j;
 
@@ -86,7 +87,10 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
  case NHLT_MIC_ARRAY_4CH_2ND_GEOM:
  dmic_geo = MIC_ARRAY_4CH;
  break;
-
+ case NHLT_MIC_ARRAY_VENDOR_DEFINED:
+ cfg_vendor = (struct nhlt_vendor_dmic_array_config *)cfg;
+ dmic_geo = cfg_vendor->nb_mics;
+ break;
  default:
  dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
  cfg->array_type);
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 4/6] ASoC: Intel: Skylake: use common NHLT module

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1837828

No functionality change, only use common functions now.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Takashi Iwai <[hidden email]>
(cherry picked from commit 1169cbf6b98e11397715d457e42070e066325fc0)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/intel/Kconfig            |  1 +
 sound/soc/intel/skylake/skl-nhlt.c | 90 ------------------------------
 sound/soc/intel/skylake/skl.c      | 12 ++--
 sound/soc/intel/skylake/skl.h      |  3 -
 4 files changed, 9 insertions(+), 97 deletions(-)

diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
index 0e2ac88eaedb..f646ec4292f3 100644
--- a/sound/soc/intel/Kconfig
+++ b/sound/soc/intel/Kconfig
@@ -218,6 +218,7 @@ config SND_SOC_INTEL_SKYLAKE_COMMON
  select SND_SOC_INTEL_SST
  select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC
  select SND_SOC_ACPI_INTEL_MATCH
+ select SND_INTEL_NHLT
  help
   If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/
   GeminiLake or CannonLake platform with the DSP enabled in the BIOS
diff --git a/sound/soc/intel/skylake/skl-nhlt.c b/sound/soc/intel/skylake/skl-nhlt.c
index 8ae61666adf4..e6c4745155af 100644
--- a/sound/soc/intel/skylake/skl-nhlt.c
+++ b/sound/soc/intel/skylake/skl-nhlt.c
@@ -13,54 +13,6 @@
 #include "skl.h"
 #include "skl-i2s.h"
 
-#define NHLT_ACPI_HEADER_SIG "NHLT"
-
-/* Unique identification for getting NHLT blobs */
-static guid_t osc_guid =
- GUID_INIT(0xA69F886E, 0x6CEB, 0x4594,
-  0xA4, 0x1F, 0x7B, 0x5D, 0xCE, 0x24, 0xC5, 0x53);
-
-
-struct nhlt_acpi_table *skl_nhlt_init(struct device *dev)
-{
- acpi_handle handle;
- union acpi_object *obj;
- struct nhlt_resource_desc  *nhlt_ptr = NULL;
- struct nhlt_acpi_table *nhlt_table = NULL;
-
- handle = ACPI_HANDLE(dev);
- if (!handle) {
- dev_err(dev, "Didn't find ACPI_HANDLE\n");
- return NULL;
- }
-
- obj = acpi_evaluate_dsm(handle, &osc_guid, 1, 1, NULL);
- if (obj && obj->type == ACPI_TYPE_BUFFER) {
- nhlt_ptr = (struct nhlt_resource_desc  *)obj->buffer.pointer;
- if (nhlt_ptr->length)
- nhlt_table = (struct nhlt_acpi_table *)
- memremap(nhlt_ptr->min_addr, nhlt_ptr->length,
- MEMREMAP_WB);
- ACPI_FREE(obj);
- if (nhlt_table && (strncmp(nhlt_table->header.signature,
- NHLT_ACPI_HEADER_SIG,
- strlen(NHLT_ACPI_HEADER_SIG)) != 0)) {
- memunmap(nhlt_table);
- dev_err(dev, "NHLT ACPI header signature incorrect\n");
- return NULL;
- }
- return nhlt_table;
- }
-
- dev_err(dev, "device specific method to extract NHLT blob failed\n");
- return NULL;
-}
-
-void skl_nhlt_free(struct nhlt_acpi_table *nhlt)
-{
- memunmap((void *) nhlt);
-}
-
 static struct nhlt_specific_cfg *skl_get_specific_cfg(
  struct device *dev, struct nhlt_fmt *fmt,
  u8 no_ch, u32 rate, u16 bps, u8 linktype)
@@ -163,48 +115,6 @@ struct nhlt_specific_cfg
  return NULL;
 }
 
-int skl_get_dmic_geo(struct skl *skl)
-{
- struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt;
- struct nhlt_endpoint *epnt;
- struct nhlt_dmic_array_config *cfg;
- struct device *dev = &skl->pci->dev;
- unsigned int dmic_geo = 0;
- u8 j;
-
- if (!nhlt)
- return 0;
-
- epnt = (struct nhlt_endpoint *)nhlt->desc;
-
- for (j = 0; j < nhlt->endpoint_count; j++) {
- if (epnt->linktype == NHLT_LINK_DMIC) {
- cfg = (struct nhlt_dmic_array_config  *)
- (epnt->config.caps);
- switch (cfg->array_type) {
- case NHLT_MIC_ARRAY_2CH_SMALL:
- case NHLT_MIC_ARRAY_2CH_BIG:
- dmic_geo |= MIC_ARRAY_2CH;
- break;
-
- case NHLT_MIC_ARRAY_4CH_1ST_GEOM:
- case NHLT_MIC_ARRAY_4CH_L_SHAPED:
- case NHLT_MIC_ARRAY_4CH_2ND_GEOM:
- dmic_geo |= MIC_ARRAY_4CH;
- break;
-
- default:
- dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
- cfg->array_type);
-
- }
- }
- epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
- }
-
- return dmic_geo;
-}
-
 static void skl_nhlt_trim_space(char *trim)
 {
  char *s = trim;
diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c
index 3362e71b4563..2b5159890a57 100644
--- a/sound/soc/intel/skylake/skl.c
+++ b/sound/soc/intel/skylake/skl.c
@@ -26,9 +26,11 @@
 #include <sound/hdaudio.h>
 #include <sound/hda_i915.h>
 #include <sound/hda_codec.h>
+#include <sound/intel-nhlt.h>
 #include "skl.h"
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
+
 #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC)
 #include "../../../soc/codecs/hdac_hda.h"
 #endif
@@ -516,7 +518,9 @@ static int skl_find_machine(struct skl *skl, void *driver_data)
 
  if (pdata) {
  skl->use_tplg_pcm = pdata->use_tplg_pcm;
- mach->mach_params.dmic_num = skl_get_dmic_geo(skl);
+ mach->mach_params.dmic_num =
+ intel_nhlt_get_dmic_geo(&skl->pci->dev,
+ skl->nhlt);
  }
 
  return 0;
@@ -1029,7 +1033,7 @@ static int skl_probe(struct pci_dev *pci,
 
  device_disable_async_suspend(bus->dev);
 
- skl->nhlt = skl_nhlt_init(bus->dev);
+ skl->nhlt = intel_nhlt_init(bus->dev);
 
  if (skl->nhlt == NULL) {
 #if !IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC)
@@ -1095,7 +1099,7 @@ static int skl_probe(struct pci_dev *pci,
 out_clk_free:
  skl_clock_device_unregister(skl);
 out_nhlt_free:
- skl_nhlt_free(skl->nhlt);
+ intel_nhlt_free(skl->nhlt);
 out_free:
  skl_free(bus);
 
@@ -1144,7 +1148,7 @@ static void skl_remove(struct pci_dev *pci)
  skl_dmic_device_unregister(skl);
  skl_clock_device_unregister(skl);
  skl_nhlt_remove_sysfs(skl);
- skl_nhlt_free(skl->nhlt);
+ intel_nhlt_free(skl->nhlt);
  skl_free(bus);
  dev_set_drvdata(&pci->dev, NULL);
 }
diff --git a/sound/soc/intel/skylake/skl.h b/sound/soc/intel/skylake/skl.h
index 928e8115a1a7..f4dd6c767993 100644
--- a/sound/soc/intel/skylake/skl.h
+++ b/sound/soc/intel/skylake/skl.h
@@ -128,13 +128,10 @@ struct skl_dsp_ops {
 int skl_platform_unregister(struct device *dev);
 int skl_platform_register(struct device *dev);
 
-struct nhlt_acpi_table *skl_nhlt_init(struct device *dev);
-void skl_nhlt_free(struct nhlt_acpi_table *addr);
 struct nhlt_specific_cfg *skl_get_ep_blob(struct skl *skl, u32 instance,
  u8 link_type, u8 s_fmt, u8 no_ch,
  u32 s_rate, u8 dirn, u8 dev_type);
 
-int skl_get_dmic_geo(struct skl *skl);
 int skl_nhlt_update_topology_bin(struct skl *skl);
 int skl_init_dsp(struct skl *skl);
 int skl_free_dsp(struct skl *skl);
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 5/6] ALSA: hda/intel: stop probe if DMICS are detected on Skylake+ platforms

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1837828

The legacy HD-Audio driver cannot handle Skylake+ platforms with
digital microphones. For those platforms, the SOF or SST drivers need
to be used.

This patch provides an automatic way of detecting the presence of
DMICs using NHTL information reported by the BIOS. A kernel kconfig
option or a kernel module parameter provide an opt-in means of
stopping the probe. The kernel would then look for an alternate driver
registered for the same PCI ID to probe.

With this capability, distros no longer have to blacklist
snd-hda-intel, but still need to make sure the SOF/SST drivers are
functional by providing the relevant firmware and topology files in
/lib/firmware/intel

The coexistence between SOF and SST drivers and their dynamic
detection is not addressed by this patch, different mechanisms need to
be used, e.g. DMI-based quirks.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Takashi Iwai <[hidden email]>
(cherry picked from commit 8c57588313805d4e12a3d470dee3405c2236655f)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/pci/hda/Kconfig     | 10 ++++++++++
 sound/pci/hda/hda_intel.c | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/sound/pci/hda/Kconfig b/sound/pci/hda/Kconfig
index 35d934309cb2..b5966014b5f7 100644
--- a/sound/pci/hda/Kconfig
+++ b/sound/pci/hda/Kconfig
@@ -12,6 +12,7 @@ config SND_HDA_INTEL
  tristate "HD Audio PCI"
  depends on SND_PCI
  select SND_HDA
+ select SND_INTEL_NHLT if ACPI
  help
   Say Y here to include support for Intel "High Definition
   Audio" (Azalia) and its compatible devices.
@@ -22,6 +23,15 @@ config SND_HDA_INTEL
   To compile this driver as a module, choose M here: the module
   will be called snd-hda-intel.
 
+config SND_HDA_INTEL_DETECT_DMIC
+ bool "DMIC detection and probe abort"
+ depends on SND_HDA_INTEL
+ help
+  Say Y to detect digital microphones on SKL+ devices. DMICs
+  cannot be handled by the HDaudio legacy driver and are
+  currently only supported by the SOF driver.
+  If unsure say N.
+
 config SND_HDA_TEGRA
  tristate "NVIDIA Tegra HD Audio"
  depends on ARCH_TEGRA
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 7503a908bba4..d25b3c9dbb09 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -46,6 +46,7 @@
 #include <sound/initval.h>
 #include <sound/hdaudio.h>
 #include <sound/hda_i915.h>
+#include <sound/intel-nhlt.h>
 #include <linux/vgaarb.h>
 #include <linux/vga_switcheroo.h>
 #include <linux/firmware.h>
@@ -125,6 +126,7 @@ static char *patch[SNDRV_CARDS];
 static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
  CONFIG_SND_HDA_INPUT_BEEP_MODE};
 #endif
+static bool dmic_detect = IS_ENABLED(CONFIG_SND_HDA_INTEL_DETECT_DMIC);
 
 module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
@@ -159,6 +161,8 @@ module_param_array(beep_mode, bool, NULL, 0444);
 MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
     "(0=off, 1=on) (default=1).");
 #endif
+module_param(dmic_detect, bool, 0444);
+MODULE_PARM_DESC(dmic_detect, "DMIC detect on SKL+ platforms");
 
 #ifdef CONFIG_PM
 static int param_set_xint(const char *val, const struct kernel_param *kp);
@@ -2091,6 +2095,25 @@ static const struct hda_controller_ops pci_hda_ops = {
  .position_check = azx_position_check,
 };
 
+static int azx_check_dmic(struct pci_dev *pci, struct azx *chip)
+{
+ struct nhlt_acpi_table *nhlt;
+ int ret = 0;
+
+ if (chip->driver_type == AZX_DRIVER_SKL &&
+    pci->class != 0x040300) {
+ nhlt = intel_nhlt_init(&pci->dev);
+ if (nhlt) {
+ if (intel_nhlt_get_dmic_geo(&pci->dev, nhlt)) {
+ ret = -ENODEV;
+ dev_info(&pci->dev, "Digital mics found on Skylake+ platform, aborting probe\n");
+ }
+ intel_nhlt_free(nhlt);
+ }
+ }
+ return ret;
+}
+
 static int azx_probe(struct pci_dev *pci,
      const struct pci_device_id *pci_id)
 {
@@ -2121,6 +2144,17 @@ static int azx_probe(struct pci_dev *pci,
  card->private_data = chip;
  hda = container_of(chip, struct hda_intel, chip);
 
+ /*
+ * stop probe if digital microphones detected on Skylake+ platform
+ * with the DSP enabled. This is an opt-in behavior defined at build
+ * time or at run-time with a module parameter
+ */
+ if (dmic_detect) {
+ err = azx_check_dmic(pci, chip);
+ if (err < 0)
+ goto out_free;
+ }
+
  pci_set_drvdata(pci, card);
 
  err = register_vga_switcheroo(chip);
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Eoan][PATCH 6/6] UBUNTU: [Config] Enable SND_HDA_INTEL_DETECT_DMIC

Hui Wang
In reply to this post by Hui Wang
BugLink: https://bugs.launchpad.net/bugs/1837828

Signed-off-by: Hui Wang <[hidden email]>
---
 debian.master/config/annotations          | 4 ++++
 debian.master/config/config.common.ubuntu | 2 ++
 2 files changed, 6 insertions(+)

diff --git a/debian.master/config/annotations b/debian.master/config/annotations
index 5daaac920896..cf19d1d69028 100644
--- a/debian.master/config/annotations
+++ b/debian.master/config/annotations
@@ -8078,6 +8078,8 @@ CONFIG_SND_AC97_POWER_SAVE_DEFAULT              policy<{'amd64': '0', 'arm64': '
 
 # Menu: Device Drivers >> Sound card support >> Advanced Linux Sound Architecture >> HD-Audio
 CONFIG_SND_HDA_INTEL                            policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'ppc64el': 'm'}>
+CONFIG_SND_HDA_INTEL_DETECT_DMIC                policy<{'amd64': 'y', 'arm64': 'y', 'armhf': 'y', 'i386': 'y', 'ppc64el': 'y'}>
+CONFIG_SND_HDA_INTEL_DETECT_DMIC                note<LP:1837828>
 CONFIG_SND_HDA_TEGRA                            policy<{'armhf-generic': 'm'}>
 CONFIG_SND_HDA_HWDEP                            policy<{'amd64': 'y', 'arm64': 'y', 'armhf': 'y', 'i386': 'y', 'ppc64el': 'y'}>
 CONFIG_SND_HDA_RECONFIG                         policy<{'amd64': 'y', 'arm64': 'y', 'armhf': 'y', 'i386': 'y', 'ppc64el': 'y'}>
@@ -8215,6 +8217,8 @@ CONFIG_SND_VIA82XX_MODEM                        policy<{'amd64': 'm', 'arm64': '
 CONFIG_SND_VIRTUOSO                             policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'ppc64el': 'm'}>
 CONFIG_SND_VX222                                policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'ppc64el': 'm'}>
 CONFIG_SND_YMFPCI                               policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'ppc64el': 'm'}>
+CONFIG_SND_INTEL_NHLT                           policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'ppc64el': 'm'}>
+CONFIG_SND_INTEL_NHLT                           note<LP:1837828>
 
 # Menu: Device Drivers >> Sound card support >> Advanced Linux Sound Architecture >> PCMCIA sound devices
 CONFIG_SND_PCMCIA                               policy<{'amd64': 'y', 'i386': 'y'}>
diff --git a/debian.master/config/config.common.ubuntu b/debian.master/config/config.common.ubuntu
index b8b567f8e01e..db023e6fc676 100644
--- a/debian.master/config/config.common.ubuntu
+++ b/debian.master/config/config.common.ubuntu
@@ -8862,6 +8862,7 @@ CONFIG_SND_HDA_I915=y
 CONFIG_SND_HDA_INPUT_BEEP=y
 CONFIG_SND_HDA_INPUT_BEEP_MODE=0
 CONFIG_SND_HDA_INTEL=m
+CONFIG_SND_HDA_INTEL_DETECT_DMIC=y
 CONFIG_SND_HDA_PATCH_LOADER=y
 CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1
 CONFIG_SND_HDA_PREALLOC_SIZE=64
@@ -8881,6 +8882,7 @@ CONFIG_SND_INDIGOIO=m
 CONFIG_SND_INDIGOIOX=m
 CONFIG_SND_INTEL8X0=m
 CONFIG_SND_INTEL8X0M=m
+CONFIG_SND_INTEL_NHLT=m
 CONFIG_SND_INTERWAVE=m
 CONFIG_SND_INTERWAVE_STB=m
 CONFIG_SND_ISA=y
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK: [SRU][Eoan][PATCH 0/6] alsa/sof: let legacy hda driver and sof driver co-exist

Sultan Alsawaf
In reply to this post by Hui Wang
On Mon, Feb 10, 2020 at 04:44:03PM +0800, Hui Wang wrote:

> BugLink: http://bugs.launchpad.net/bugs/1837828
>
> These patches are already in the unstable and focal kernel, and I
> already backported them to oem-b-osp1 kernel before these patches are
> merged to mainline kernel, now it is time to backport them to eoan
> kernel.
>
> [Impact]
> So far, if we want the sof driver to work, we need to blacklist
> snd_hda_intel.ko, but on some paltforms with nv hdmi or amd hdmi,
> we need these two driver co-exist.
>
> [Fix]
> Intel sent the patches to fix this issue, it is merged to kernel-5.4.
>
>
> [Test Case]
> remove snd_hda_intel.ko from blacklist, the two drivers (sof and hda)
> worked well.
>
> [Regression Risk]
> Low. We already tested these patches on some Dell and LENOVO machines.
>
>
> Hui Wang (1):
>   UBUNTU: [Config] Enable SND_HDA_INTEL_DETECT_DMIC
>
> Pierre-Louis Bossart (5):
>   ASoC: Intel: Skylake: move NHLT header to common directory
>   ALSA: hda: move parts of NHLT code to new module
>   ALSA: hda: intel-nhlt: handle NHLT VENDOR_DEFINED DMIC geometry
>   ASoC: Intel: Skylake: use common NHLT module
>   ALSA: hda/intel: stop probe if DMICS are detected on Skylake+
>     platforms
>
>  debian.master/config/annotations              |   4 +
>  debian.master/config/config.common.ubuntu     |   2 +
>  .../skl-nhlt.h => include/sound/intel-nhlt.h  |  51 +++++++--
>  sound/hda/Kconfig                             |   5 +
>  sound/hda/Makefile                            |   3 +
>  sound/hda/intel-nhlt.c                        | 107 ++++++++++++++++++
>  sound/pci/hda/Kconfig                         |  10 ++
>  sound/pci/hda/hda_intel.c                     |  34 ++++++
>  sound/soc/intel/Kconfig                       |   1 +
>  sound/soc/intel/skylake/skl-nhlt.c            |  91 +--------------
>  sound/soc/intel/skylake/skl-ssp-clk.c         |   1 +
>  sound/soc/intel/skylake/skl-topology.c        |   1 +
>  sound/soc/intel/skylake/skl.c                 |  12 +-
>  sound/soc/intel/skylake/skl.h                 |   4 -
>  14 files changed, 218 insertions(+), 108 deletions(-)
>  rename sound/soc/intel/skylake/skl-nhlt.h => include/sound/intel-nhlt.h (65%)
>  create mode 100644 sound/hda/intel-nhlt.c
>
> --
> 2.17.1
>
>
> --
> kernel-team mailing list
> [hidden email]
> https://lists.ubuntu.com/mailman/listinfo/kernel-team

Acked-by: Sultan Alsawaf <[hidden email]>

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK: [SRU][Eoan][PATCH 0/6] alsa/sof: let legacy hda driver and sof driver co-exist

Kleber Souza
In reply to this post by Hui Wang
On 10.02.20 09:44, Hui Wang wrote:

> BugLink: http://bugs.launchpad.net/bugs/1837828
>
> These patches are already in the unstable and focal kernel, and I
> already backported them to oem-b-osp1 kernel before these patches are
> merged to mainline kernel, now it is time to backport them to eoan
> kernel.
>
> [Impact]
> So far, if we want the sof driver to work, we need to blacklist
> snd_hda_intel.ko, but on some paltforms with nv hdmi or amd hdmi,
> we need these two driver co-exist.
>
> [Fix]
> Intel sent the patches to fix this issue, it is merged to kernel-5.4.
>
>
> [Test Case]
> remove snd_hda_intel.ko from blacklist, the two drivers (sof and hda)
> worked well.
>
> [Regression Risk]
> Low. We already tested these patches on some Dell and LENOVO machines.
>
>
> Hui Wang (1):
>   UBUNTU: [Config] Enable SND_HDA_INTEL_DETECT_DMIC
>
> Pierre-Louis Bossart (5):
>   ASoC: Intel: Skylake: move NHLT header to common directory
>   ALSA: hda: move parts of NHLT code to new module
>   ALSA: hda: intel-nhlt: handle NHLT VENDOR_DEFINED DMIC geometry
>   ASoC: Intel: Skylake: use common NHLT module
>   ALSA: hda/intel: stop probe if DMICS are detected on Skylake+
>     platforms
>
>  debian.master/config/annotations              |   4 +
>  debian.master/config/config.common.ubuntu     |   2 +
>  .../skl-nhlt.h => include/sound/intel-nhlt.h  |  51 +++++++--
>  sound/hda/Kconfig                             |   5 +
>  sound/hda/Makefile                            |   3 +
>  sound/hda/intel-nhlt.c                        | 107 ++++++++++++++++++
>  sound/pci/hda/Kconfig                         |  10 ++
>  sound/pci/hda/hda_intel.c                     |  34 ++++++
>  sound/soc/intel/Kconfig                       |   1 +
>  sound/soc/intel/skylake/skl-nhlt.c            |  91 +--------------
>  sound/soc/intel/skylake/skl-ssp-clk.c         |   1 +
>  sound/soc/intel/skylake/skl-topology.c        |   1 +
>  sound/soc/intel/skylake/skl.c                 |  12 +-
>  sound/soc/intel/skylake/skl.h                 |   4 -
>  14 files changed, 218 insertions(+), 108 deletions(-)
>  rename sound/soc/intel/skylake/skl-nhlt.h => include/sound/intel-nhlt.h (65%)
>  create mode 100644 sound/hda/intel-nhlt.c
>

Clean cherry-picks, already in Focal and linux-oem-osp1.

Acked-by: Kleber Sacilotto de Souza <[hidden email]>

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

APPLIED: [SRU][Eoan][PATCH 0/6] alsa/sof: let legacy hda driver and sof driver co-exist

Kleber Souza
In reply to this post by Hui Wang
On 10.02.20 09:44, Hui Wang wrote:

> BugLink: http://bugs.launchpad.net/bugs/1837828
>
> These patches are already in the unstable and focal kernel, and I
> already backported them to oem-b-osp1 kernel before these patches are
> merged to mainline kernel, now it is time to backport them to eoan
> kernel.
>
> [Impact]
> So far, if we want the sof driver to work, we need to blacklist
> snd_hda_intel.ko, but on some paltforms with nv hdmi or amd hdmi,
> we need these two driver co-exist.
>
> [Fix]
> Intel sent the patches to fix this issue, it is merged to kernel-5.4.
>
>
> [Test Case]
> remove snd_hda_intel.ko from blacklist, the two drivers (sof and hda)
> worked well.
>
> [Regression Risk]
> Low. We already tested these patches on some Dell and LENOVO machines.
>
>
> Hui Wang (1):
>   UBUNTU: [Config] Enable SND_HDA_INTEL_DETECT_DMIC
>
> Pierre-Louis Bossart (5):
>   ASoC: Intel: Skylake: move NHLT header to common directory
>   ALSA: hda: move parts of NHLT code to new module
>   ALSA: hda: intel-nhlt: handle NHLT VENDOR_DEFINED DMIC geometry
>   ASoC: Intel: Skylake: use common NHLT module
>   ALSA: hda/intel: stop probe if DMICS are detected on Skylake+
>     platforms
>
>  debian.master/config/annotations              |   4 +
>  debian.master/config/config.common.ubuntu     |   2 +
>  .../skl-nhlt.h => include/sound/intel-nhlt.h  |  51 +++++++--
>  sound/hda/Kconfig                             |   5 +
>  sound/hda/Makefile                            |   3 +
>  sound/hda/intel-nhlt.c                        | 107 ++++++++++++++++++
>  sound/pci/hda/Kconfig                         |  10 ++
>  sound/pci/hda/hda_intel.c                     |  34 ++++++
>  sound/soc/intel/Kconfig                       |   1 +
>  sound/soc/intel/skylake/skl-nhlt.c            |  91 +--------------
>  sound/soc/intel/skylake/skl-ssp-clk.c         |   1 +
>  sound/soc/intel/skylake/skl-topology.c        |   1 +
>  sound/soc/intel/skylake/skl.c                 |  12 +-
>  sound/soc/intel/skylake/skl.h                 |   4 -
>  14 files changed, 218 insertions(+), 108 deletions(-)
>  rename sound/soc/intel/skylake/skl-nhlt.h => include/sound/intel-nhlt.h (65%)
>  create mode 100644 sound/hda/intel-nhlt.c
>

Applied to eoan/linux.

Thanks,
Kleber

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team