[coreboot-gerrit] Change in coreboot[master]: soc/intel/common: Add Intel HDA common block driver

Duncan Laurie (Code Review) gerrit at coreboot.org
Tue Jan 9 19:00:08 CET 2018


Duncan Laurie has uploaded this change for review. ( https://review.coreboot.org/23187


Change subject: soc/intel/common: Add Intel HDA common block driver
......................................................................

soc/intel/common: Add Intel HDA common block driver

There is common HDA code in soc/intel/common that provides generic
HDA support functions, but it does not provide a driver.

This change adds a common block driver for HDA that provides a
ramstage driver for SOCs that need to initialize an HDA codec.

The HDA infrastructure in coreboot relies on global variables which
are only defined if the HDA verb table is present.  In order to prevent
compile errors this change also adds a new config option to indicate
that a mainboard provides an HDA verb table.

This was tested on a kabylake system with an HDA codec to ensure
that it properly detected it and ran the codec init steps.

Change-Id: I41b4c54d3c81e1f09810cfaf934ffacafca1cf38
Signed-off-by: Duncan Laurie <dlaurie at chromium.org>
---
M src/include/device/pci_ids.h
M src/soc/intel/cannonlake/Kconfig
A src/soc/intel/common/block/hda/Kconfig
A src/soc/intel/common/block/hda/Makefile.inc
A src/soc/intel/common/block/hda/hda.c
M src/soc/intel/skylake/Kconfig
6 files changed, 91 insertions(+), 0 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/87/23187/1

diff --git a/src/include/device/pci_ids.h b/src/include/device/pci_ids.h
index a7018f7..e84d864 100644
--- a/src/include/device/pci_ids.h
+++ b/src/include/device/pci_ids.h
@@ -2907,6 +2907,7 @@
 #define PCI_DEVICE_ID_INTEL_GLK_AUDIO		0x3198
 #define PCI_DEVICE_ID_INTEL_CNL_AUDIO		0x9dc8
 #define PCI_DEVICE_ID_INTEL_SKL_AUDIO		0x9d70
+#define PCI_DEVICE_ID_INTEL_KBL_AUDIO		0x9d71
 
 /* Intel HECI/ME device Ids */
 #define PCI_DEVICE_ID_INTEL_APL_CSE0		0x5a9a
diff --git a/src/soc/intel/cannonlake/Kconfig b/src/soc/intel/cannonlake/Kconfig
index 715cdf4..36c8e2f 100644
--- a/src/soc/intel/cannonlake/Kconfig
+++ b/src/soc/intel/cannonlake/Kconfig
@@ -53,6 +53,7 @@
 	select SOC_INTEL_COMMON_BLOCK_GPIO
 	select SOC_INTEL_COMMON_BLOCK_GRAPHICS
 	select SOC_INTEL_COMMON_BLOCK_GSPI_VERSION_2
+	select SOC_INTEL_COMMON_BLOCK_HDA
 	select SOC_INTEL_COMMON_BLOCK_ITSS
 	select SOC_INTEL_COMMON_BLOCK_I2C
 	select SOC_INTEL_COMMON_BLOCK_LPC
diff --git a/src/soc/intel/common/block/hda/Kconfig b/src/soc/intel/common/block/hda/Kconfig
new file mode 100644
index 0000000..ca415bc
--- /dev/null
+++ b/src/soc/intel/common/block/hda/Kconfig
@@ -0,0 +1,4 @@
+config SOC_INTEL_COMMON_BLOCK_HDA
+	bool
+	help
+	  Intel Processor common High Definition Audio driver support
diff --git a/src/soc/intel/common/block/hda/Makefile.inc b/src/soc/intel/common/block/hda/Makefile.inc
new file mode 100644
index 0000000..88cd96e
--- /dev/null
+++ b/src/soc/intel/common/block/hda/Makefile.inc
@@ -0,0 +1,4 @@
+ifeq ($(CONFIG_MAINBOARD_HAS_HDA_VERB_TABLE),y)
+ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_HDA) += hda.c
+ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/hda_verb.c
+endif
diff --git a/src/soc/intel/common/block/hda/hda.c b/src/soc/intel/common/block/hda/hda.c
new file mode 100644
index 0000000..3f87fcc
--- /dev/null
+++ b/src/soc/intel/common/block/hda/hda.c
@@ -0,0 +1,80 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2017 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <console/console.h>
+#include <device/device.h>
+#include <device/azalia_device.h>
+#include <device/pci.h>
+#include <device/pci_ids.h>
+#include <device/pci_ops.h>
+#include <soc/intel/common/hda_verb.h>
+#include <soc/ramstage.h>
+
+static void codecs_init(uint8_t *base, u32 codec_mask)
+{
+	int i;
+
+	/* Can support up to 4 codecs */
+	for (i = 3; i >= 0; i--) {
+		if (codec_mask & (1 << i))
+			hda_codec_init(base, i,
+				       cim_verb_data_size, cim_verb_data);
+	}
+
+	if (pc_beep_verbs_size)
+		hda_codec_write(base, pc_beep_verbs_size, pc_beep_verbs);
+}
+
+static void hda_init(struct device *dev)
+{
+	struct resource *res;
+	int codec_mask;
+	uint8_t *base;
+
+	res = find_resource(dev, PCI_BASE_ADDRESS_0);
+	if (!res)
+		return;
+
+	base = res2mmio(res, 0, 0);
+	if (!base)
+		return;
+
+	codec_mask = hda_codec_detect(base);
+	if (codec_mask) {
+		printk(BIOS_INFO, "HDA: codec_mask = %02x\n", codec_mask);
+		codecs_init(base, codec_mask);
+	}
+}
+
+static struct device_operations hda_ops = {
+	.read_resources		= &pci_dev_read_resources,
+	.set_resources		= &pci_dev_set_resources,
+	.enable_resources	= &pci_dev_enable_resources,
+	.init			= &hda_init,
+	.ops_pci		= &pci_dev_ops_pci,
+};
+
+static const unsigned short pci_device_ids[] = {
+	PCI_DEVICE_ID_INTEL_SKL_AUDIO,
+	PCI_DEVICE_ID_INTEL_KBL_AUDIO,
+	PCI_DEVICE_ID_INTEL_CNL_AUDIO,
+	0
+};
+
+static const struct pci_driver pch_hda __pci_driver = {
+	.ops		= &hda_ops,
+	.vendor		= PCI_VENDOR_ID_INTEL,
+	.devices	= pci_device_ids,
+};
diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig
index 7bb16d2..54039c4 100644
--- a/src/soc/intel/skylake/Kconfig
+++ b/src/soc/intel/skylake/Kconfig
@@ -63,6 +63,7 @@
 	select SOC_INTEL_COMMON_BLOCK_GPIO_LEGACY_MACROS
 	select SOC_INTEL_COMMON_BLOCK_GRAPHICS
 	select SOC_INTEL_COMMON_BLOCK_GSPI
+	select SOC_INTEL_COMMON_BLOCK_HDA
 	select SOC_INTEL_COMMON_BLOCK_ITSS
 	select SOC_INTEL_COMMON_BLOCK_I2C
 	select SOC_INTEL_COMMON_BLOCK_LPC

-- 
To view, visit https://review.coreboot.org/23187
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I41b4c54d3c81e1f09810cfaf934ffacafca1cf38
Gerrit-Change-Number: 23187
Gerrit-PatchSet: 1
Gerrit-Owner: Duncan Laurie <dlaurie at chromium.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180109/407c57f1/attachment-0001.html>


More information about the coreboot-gerrit mailing list