| From 3738bd2c8310e5276bdae822eec0fa67af7f801a Mon Sep 17 00:00:00 2001 |
| From: V sujith kumar Reddy <Vsujithkumar.Reddy@amd.com> |
| Date: Thu, 25 May 2023 12:59:28 +0530 |
| Subject: [PATCH] CHROMIUM: ASoC: SOF: amd: Add sof support for phoenix |
| platform. |
| |
| Add sof support for phoenix platform |
| |
| BUG=b:290189450 |
| TEST=TESTED on myst |
| |
| Change-Id: Ic94b0db13380939ea6e439f23a4098ac0f4a26b7 |
| Signed-off-by: V sujith kumar Reddy <vsujithkumar.reddy@amd.corp-partner.google.com> |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/4672736 |
| Tested-by: Baili Deng <bailideng@google.com> |
| Reviewed-by: Baili Deng <bailideng@google.com> |
| Commit-Queue: Baili Deng <bailideng@google.com> |
| --- |
| sound/soc/sof/amd/Kconfig | 8 ++ |
| sound/soc/sof/amd/Makefile | 2 + |
| sound/soc/sof/amd/acp.h | 2 + |
| sound/soc/sof/amd/pci-phx.c | 106 ++++++++++++++++++++++++++ |
| sound/soc/sof/amd/phoenix.c | 144 ++++++++++++++++++++++++++++++++++++ |
| 5 files changed, 262 insertions(+) |
| create mode 100644 sound/soc/sof/amd/pci-phx.c |
| create mode 100644 sound/soc/sof/amd/phoenix.c |
| |
| diff --git a/sound/soc/sof/amd/Kconfig b/sound/soc/sof/amd/Kconfig |
| index f2faa08f0c0e05708f872db1082d718800ad0cbf..1fc8c416a66fb0d17b5db98dc8383e6fb71ed56d 100644 |
| --- a/sound/soc/sof/amd/Kconfig |
| +++ b/sound/soc/sof/amd/Kconfig |
| @@ -60,4 +60,12 @@ config SND_SOC_SOF_ACP_PROBES |
| This option is not user-selectable but automatically handled by |
| 'select' statements at a higher level |
| |
| +config SND_SOC_SOF_AMD_PHOENIX |
| + tristate "SOF support for PHOENIX" |
| + depends on SND_SOC_SOF_PCI |
| + select SND_SOC_SOF_AMD_COMMON |
| + help |
| + Select this option for SOF support on AMD Phoenix platform |
| + Say Y if you want to enable SOF on Phoenix. |
| + If unsure select "N". |
| endif |
| diff --git a/sound/soc/sof/amd/Makefile b/sound/soc/sof/amd/Makefile |
| index f3b375e67a6fbf7dc916ba6282bb45e6c1f0c460..af5101e47e11f6248445b5b78db8231e617e3555 100644 |
| --- a/sound/soc/sof/amd/Makefile |
| +++ b/sound/soc/sof/amd/Makefile |
| @@ -9,8 +9,10 @@ snd-sof-amd-acp-$(CONFIG_SND_SOC_SOF_ACP_PROBES) = acp-probes.o |
| snd-sof-amd-renoir-objs := pci-rn.o renoir.o |
| snd-sof-amd-rembrandt-objs := pci-rmb.o rembrandt.o |
| snd-sof-amd-vangogh-objs := pci-vangogh.o vangogh.o |
| +snd-sof-amd-phoenix-objs := pci-phx.o phoenix.o |
| |
| obj-$(CONFIG_SND_SOC_SOF_AMD_COMMON) += snd-sof-amd-acp.o |
| obj-$(CONFIG_SND_SOC_SOF_AMD_RENOIR) +=snd-sof-amd-renoir.o |
| obj-$(CONFIG_SND_SOC_SOF_AMD_REMBRANDT) +=snd-sof-amd-rembrandt.o |
| obj-$(CONFIG_SND_SOC_SOF_AMD_VANGOGH) +=snd-sof-amd-vangogh.o |
| +obj-$(CONFIG_SND_SOC_SOF_AMD_PHOENIX) +=snd-sof-amd-phoenix.o |
| diff --git a/sound/soc/sof/amd/acp.h b/sound/soc/sof/amd/acp.h |
| index 4dcceb7647694ae3706b7bbcd1dcb24a05a9dc45..92441d2e80ccd3880e0f0a17ac2e9e65d7fa9cf3 100644 |
| --- a/sound/soc/sof/amd/acp.h |
| +++ b/sound/soc/sof/amd/acp.h |
| @@ -273,6 +273,8 @@ extern struct snd_sof_dsp_ops sof_vangogh_ops; |
| int sof_vangogh_ops_init(struct snd_sof_dev *sdev); |
| extern struct snd_sof_dsp_ops sof_rembrandt_ops; |
| int sof_rembrandt_ops_init(struct snd_sof_dev *sdev); |
| +extern struct snd_sof_dsp_ops sof_phoenix_ops; |
| +int sof_phoenix_ops_init(struct snd_sof_dev *sdev); |
| |
| struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev); |
| /* Machine configuration */ |
| diff --git a/sound/soc/sof/amd/pci-phx.c b/sound/soc/sof/amd/pci-phx.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..78751b6c692676194640ac67fe4b349682403ae2 |
| --- /dev/null |
| +++ b/sound/soc/sof/amd/pci-phx.c |
| @@ -0,0 +1,106 @@ |
| +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
| +// |
| +// This file is provided under a dual BSD/GPLv2 license. When using or |
| +// redistributing this file, you may do so under either license. |
| +// |
| +// Copyright(c) 2023 Advanced Micro Devices, Inc. All rights reserved. |
| +// |
| +// Authors: Vijendar Mukunda <Vijendar.Mukunda@amd.com> |
| +// Venkata Prasad Potturu <venkataprasad.potturu@amd.com> |
| +// V Sujith Kumar Reddy <Vsujithkumar.Reddy@amd.com> |
| + |
| +/*. |
| + * PCI interface for Phoenix ACP device |
| + */ |
| + |
| +#include <linux/module.h> |
| +#include <linux/pci.h> |
| +#include <linux/platform_device.h> |
| +#include <sound/sof.h> |
| +#include <sound/soc-acpi.h> |
| + |
| +#include "../ops.h" |
| +#include "../sof-pci-dev.h" |
| +#include "../../amd/mach-config.h" |
| +#include "acp.h" |
| +#include "acp-dsp-offset.h" |
| + |
| +#define ACP_PHX_PCI_ID 0x63 |
| +#define HOST_BRIDGE_PHX 0x14e8 |
| + |
| +extern struct snd_soc_acpi_mach snd_soc_acpi_amd_phx_sof_machines[]; |
| + |
| +static const struct sof_amd_acp_desc phoenix_chip_info = { |
| + .rev = 6, |
| + .host_bridge_id = HOST_BRIDGE_PHX, |
| + .pgfsm_base = ACP6X_PGFSM_BASE, |
| + .ext_intr_stat = ACP6X_EXT_INTR_STAT, |
| + .dsp_intr_base = ACP6X_DSP_SW_INTR_BASE, |
| + .sram_pte_offset = ACP6X_SRAM_PTE_OFFSET, |
| + .hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0, |
| + .acp_clkmux_sel = ACP6X_CLKMUX_SEL, |
| + .fusion_dsp_offset = ACP6X_DSP_FUSION_RUNSTALL, |
| +}; |
| + |
| +static const struct sof_dev_desc phoenix_desc = { |
| + .machines = snd_soc_acpi_amd_phx_sof_machines, |
| + .resindex_lpe_base = 0, |
| + .resindex_pcicfg_base = -1, |
| + .resindex_imr_base = -1, |
| + .irqindex_host_ipc = -1, |
| + .chip_info = &phoenix_chip_info, |
| + .ipc_supported_mask = BIT(SOF_IPC), |
| + .ipc_default = SOF_IPC, |
| + .default_fw_path = { |
| + [SOF_IPC] = "amd/sof", |
| + }, |
| + .default_tplg_path = { |
| + [SOF_IPC] = "amd/sof-tplg", |
| + }, |
| + .default_fw_filename = { |
| + [SOF_IPC] = "sof-phx.ri", |
| + }, |
| + .nocodec_tplg_filename = "sof-acp.tplg", |
| + .ops = &sof_phoenix_ops, |
| + .ops_init = sof_phoenix_ops_init, |
| +}; |
| + |
| +static int acp_pci_phx_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) |
| +{ |
| + unsigned int flag; |
| + |
| + if (pci->revision != ACP_PHX_PCI_ID) |
| + return -ENODEV; |
| + |
| + flag = snd_amd_acp_find_config(pci); |
| + if (flag != FLAG_AMD_SOF && flag != FLAG_AMD_SOF_ONLY_DMIC) |
| + return -ENODEV; |
| + |
| + return sof_pci_probe(pci, pci_id); |
| +}; |
| + |
| +static void acp_pci_phx_remove(struct pci_dev *pci) |
| +{ |
| + sof_pci_remove(pci); |
| +} |
| + |
| +/* PCI IDs */ |
| +static const struct pci_device_id phx_pci_ids[] = { |
| + { PCI_DEVICE(PCI_VENDOR_ID_AMD, ACP_PCI_DEV_ID), |
| + .driver_data = (unsigned long)&phoenix_desc}, |
| + { 0, } |
| +}; |
| +MODULE_DEVICE_TABLE(pci, phx_pci_ids); |
| + |
| +/* pci_driver definition */ |
| +static struct pci_driver snd_sof_pci_amd_phx_driver = { |
| + .name = KBUILD_MODNAME, |
| + .id_table = phx_pci_ids, |
| + .probe = acp_pci_phx_probe, |
| + .remove = acp_pci_phx_remove, |
| +}; |
| +module_pci_driver(snd_sof_pci_amd_phx_driver); |
| + |
| +MODULE_LICENSE("Dual BSD/GPL"); |
| +MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON); |
| +MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV); |
| diff --git a/sound/soc/sof/amd/phoenix.c b/sound/soc/sof/amd/phoenix.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a90276bb539386ec0711cd1bca8aedf33c707e4c |
| --- /dev/null |
| +++ b/sound/soc/sof/amd/phoenix.c |
| @@ -0,0 +1,144 @@ |
| +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
| +// |
| +// This file is provided under a dual BSD/GPLv2 license. When using or |
| +// redistributing this file, you may do so under either license. |
| +// |
| +// Copyright(c) 2023 Advanced Micro Devices, Inc. |
| +// |
| +// Authors: Vijendar Mukunda <Vijendar.Mukunda@amd.com> |
| +// Venkata Prasad Potturu <venkataprasad.potturu@amd.com> |
| +// V Sujith Kumar Reddy <Vsujithkumar.Reddy@amd.com> |
| + |
| +/* |
| + * Hardware interface for Audio DSP on Phoenix platform |
| + */ |
| + |
| +#include <linux/platform_device.h> |
| +#include <linux/module.h> |
| + |
| +#include "../ops.h" |
| +#include "../sof-audio.h" |
| +#include "acp.h" |
| +#include "acp-dsp-offset.h" |
| + |
| +#define I2S_HS_INSTANCE 0 |
| +#define I2S_BT_INSTANCE 1 |
| +#define I2S_SP_INSTANCE 2 |
| +#define PDM_DMIC_INSTANCE 3 |
| +#define I2S_HS_VIRTUAL_INSTANCE 4 |
| + |
| +static struct snd_soc_dai_driver phoenix_sof_dai[] = { |
| + { |
| + .id = I2S_HS_INSTANCE, |
| + .name = "acp-sof-hs", |
| + .playback = { |
| + .rates = SNDRV_PCM_RATE_8000_96000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + .channels_min = 2, |
| + .channels_max = 8, |
| + .rate_min = 8000, |
| + .rate_max = 96000, |
| + }, |
| + .capture = { |
| + .rates = SNDRV_PCM_RATE_8000_48000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + /* Supporting only stereo for I2S HS controller capture */ |
| + .channels_min = 2, |
| + .channels_max = 2, |
| + .rate_min = 8000, |
| + .rate_max = 48000, |
| + }, |
| + }, |
| + { |
| + .id = I2S_BT_INSTANCE, |
| + .name = "acp-sof-bt", |
| + .playback = { |
| + .rates = SNDRV_PCM_RATE_8000_96000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + .channels_min = 2, |
| + .channels_max = 8, |
| + .rate_min = 8000, |
| + .rate_max = 96000, |
| + }, |
| + .capture = { |
| + .rates = SNDRV_PCM_RATE_8000_48000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + /* Supporting only stereo for I2S BT controller capture */ |
| + .channels_min = 2, |
| + .channels_max = 2, |
| + .rate_min = 8000, |
| + .rate_max = 48000, |
| + }, |
| + }, |
| + { |
| + .id = I2S_SP_INSTANCE, |
| + .name = "acp-sof-sp", |
| + .playback = { |
| + .rates = SNDRV_PCM_RATE_8000_96000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + .channels_min = 2, |
| + .channels_max = 8, |
| + .rate_min = 8000, |
| + .rate_max = 96000, |
| + }, |
| + .capture = { |
| + .rates = SNDRV_PCM_RATE_8000_48000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + /* Supporting only stereo for I2S SP controller capture */ |
| + .channels_min = 2, |
| + .channels_max = 2, |
| + .rate_min = 8000, |
| + .rate_max = 48000, |
| + }, |
| + }, |
| + { |
| + .id = PDM_DMIC_INSTANCE, |
| + .name = "acp-sof-dmic", |
| + .capture = { |
| + .rates = SNDRV_PCM_RATE_8000_48000, |
| + .formats = SNDRV_PCM_FMTBIT_S32_LE, |
| + .channels_min = 2, |
| + .channels_max = 4, |
| + .rate_min = 8000, |
| + .rate_max = 48000, |
| + }, |
| + }, |
| + { |
| + .id = I2S_HS_VIRTUAL_INSTANCE, |
| + .name = "acp-sof-hs-virtual", |
| + .playback = { |
| + .rates = SNDRV_PCM_RATE_8000_96000, |
| + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | |
| + SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE, |
| + .channels_min = 2, |
| + .channels_max = 8, |
| + .rate_min = 8000, |
| + .rate_max = 96000, |
| + }, |
| + }, |
| +}; |
| + |
| +/* Phoenix ops */ |
| +struct snd_sof_dsp_ops sof_phoenix_ops; |
| +EXPORT_SYMBOL_NS(sof_phoenix_ops, SND_SOC_SOF_AMD_COMMON); |
| + |
| +int sof_phoenix_ops_init(struct snd_sof_dev *sdev) |
| +{ |
| + /* common defaults */ |
| + memcpy(&sof_phoenix_ops, &sof_acp_common_ops, sizeof(struct snd_sof_dsp_ops)); |
| + |
| + sof_phoenix_ops.drv = phoenix_sof_dai; |
| + sof_phoenix_ops.num_drv = ARRAY_SIZE(phoenix_sof_dai); |
| + |
| + return 0; |
| +} |
| + |
| +MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON); |
| +MODULE_DESCRIPTION("PHOENIX SOF Driver"); |
| +MODULE_LICENSE("Dual BSD/GPL"); |
| -- |
| 2.34.1 |
| |