ASoC: SOF: add INTEL_IPC4 plumbing
Merge series from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>: The INTEL_IPC4 protocol and firmware architecture will rely on different sets of firmware binary and topology files. Some platforms will only support INTEL_IPC4, some will support both INTEL_IPC4 and SOF_IPC for development, and some will stay with the existing SOF_IPC. This patchset adds new IPC definitions, and search paths for firmware and topology files, along with means to override the default IPC type and search paths for development. The firmware binary names are aligned with those used by the Intel AVS driver to avoid duplicate firmware installs, but the topology will have to differ due to driver architecture differences.
This commit is contained in:
commit
7ed1bf7334
@ -16,6 +16,7 @@
|
||||
#include <sound/soc-acpi.h>
|
||||
|
||||
struct snd_sof_dsp_ops;
|
||||
struct snd_sof_dev;
|
||||
|
||||
/**
|
||||
* enum sof_fw_state - DSP firmware state definitions
|
||||
@ -47,6 +48,13 @@ enum sof_dsp_power_states {
|
||||
SOF_DSP_PM_D3,
|
||||
};
|
||||
|
||||
/* Definitions for multiple IPCs */
|
||||
enum sof_ipc_type {
|
||||
SOF_IPC,
|
||||
SOF_INTEL_IPC4,
|
||||
SOF_IPC_TYPE_COUNT
|
||||
};
|
||||
|
||||
/*
|
||||
* SOF Platform data.
|
||||
*/
|
||||
@ -83,6 +91,8 @@ struct snd_sof_pdata {
|
||||
const struct snd_soc_acpi_mach *machine;
|
||||
|
||||
void *hw_pdata;
|
||||
|
||||
enum sof_ipc_type ipc_type;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -115,14 +125,19 @@ struct sof_dev_desc {
|
||||
/* defaults for no codec mode */
|
||||
const char *nocodec_tplg_filename;
|
||||
|
||||
/* information on supported IPCs */
|
||||
unsigned int ipc_supported_mask;
|
||||
enum sof_ipc_type ipc_default;
|
||||
|
||||
/* defaults paths for firmware and topology files */
|
||||
const char *default_fw_path;
|
||||
const char *default_tplg_path;
|
||||
const char *default_fw_path[SOF_IPC_TYPE_COUNT];
|
||||
const char *default_tplg_path[SOF_IPC_TYPE_COUNT];
|
||||
|
||||
/* default firmware name */
|
||||
const char *default_fw_filename;
|
||||
const char *default_fw_filename[SOF_IPC_TYPE_COUNT];
|
||||
|
||||
const struct snd_sof_dsp_ops *ops;
|
||||
struct snd_sof_dsp_ops *ops;
|
||||
int (*ops_init)(struct snd_sof_dev *sdev);
|
||||
};
|
||||
|
||||
int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd);
|
||||
|
@ -204,7 +204,7 @@ int acp_pcm_hw_params(struct snd_sof_dev *sdev, struct snd_pcm_substream *substr
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_sof_platform_stream_params *platform_params);
|
||||
|
||||
extern const struct snd_sof_dsp_ops sof_renoir_ops;
|
||||
extern struct snd_sof_dsp_ops sof_renoir_ops;
|
||||
|
||||
/* Machine configuration */
|
||||
int snd_amd_acp_find_config(struct pci_dev *pci);
|
||||
|
@ -54,9 +54,17 @@ static const struct sof_dev_desc renoir_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &renoir_chip_info,
|
||||
.default_fw_path = "amd/sof",
|
||||
.default_tplg_path = "amd/sof-tplg",
|
||||
.default_fw_filename = "sof-rn.ri",
|
||||
.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-rn.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-acp.tplg",
|
||||
.ops = &sof_renoir_ops,
|
||||
};
|
||||
|
@ -123,7 +123,7 @@ static struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev
|
||||
}
|
||||
|
||||
/* AMD Renoir DSP ops */
|
||||
const struct snd_sof_dsp_ops sof_renoir_ops = {
|
||||
struct snd_sof_dsp_ops sof_renoir_ops = {
|
||||
/* probe and remove */
|
||||
.probe = amd_sof_acp_probe,
|
||||
.remove = amd_sof_acp_remove,
|
||||
|
@ -342,6 +342,7 @@ static void sof_probe_work(struct work_struct *work)
|
||||
int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
|
||||
{
|
||||
struct snd_sof_dev *sdev;
|
||||
int ret;
|
||||
|
||||
sdev = devm_kzalloc(dev, sizeof(*sdev), GFP_KERNEL);
|
||||
if (!sdev)
|
||||
@ -357,6 +358,11 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
|
||||
sdev->first_boot = true;
|
||||
dev_set_drvdata(dev, sdev);
|
||||
|
||||
/* init ops, if necessary */
|
||||
ret = sof_ops_init(sdev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* check all mandatory ops */
|
||||
if (!sof_ops(sdev) || !sof_ops(sdev)->probe || !sof_ops(sdev)->run ||
|
||||
!sof_ops(sdev)->block_read || !sof_ops(sdev)->block_write ||
|
||||
|
@ -331,7 +331,7 @@ EXPORT_SYMBOL_GPL(snd_sof_dbg_memory_info_init);
|
||||
|
||||
int snd_sof_dbg_init(struct snd_sof_dev *sdev)
|
||||
{
|
||||
const struct snd_sof_dsp_ops *ops = sof_ops(sdev);
|
||||
struct snd_sof_dsp_ops *ops = sof_ops(sdev);
|
||||
const struct snd_sof_debugfs_map *map;
|
||||
int i;
|
||||
int err;
|
||||
|
@ -487,7 +487,7 @@ static int imx8_dsp_set_power_state(struct snd_sof_dev *sdev,
|
||||
}
|
||||
|
||||
/* i.MX8 ops */
|
||||
static const struct snd_sof_dsp_ops sof_imx8_ops = {
|
||||
static struct snd_sof_dsp_ops sof_imx8_ops = {
|
||||
/* probe and remove */
|
||||
.probe = imx8_probe,
|
||||
.remove = imx8_remove,
|
||||
@ -550,7 +550,7 @@ static const struct snd_sof_dsp_ops sof_imx8_ops = {
|
||||
};
|
||||
|
||||
/* i.MX8X ops */
|
||||
static const struct snd_sof_dsp_ops sof_imx8x_ops = {
|
||||
static struct snd_sof_dsp_ops sof_imx8x_ops = {
|
||||
/* probe and remove */
|
||||
.probe = imx8_probe,
|
||||
.remove = imx8_remove,
|
||||
@ -613,17 +613,33 @@ static const struct snd_sof_dsp_ops sof_imx8x_ops = {
|
||||
};
|
||||
|
||||
static struct sof_dev_desc sof_of_imx8qxp_desc = {
|
||||
.default_fw_path = "imx/sof",
|
||||
.default_tplg_path = "imx/sof-tplg",
|
||||
.default_fw_filename = "sof-imx8x.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "imx/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "imx/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-imx8x.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-imx8-nocodec.tplg",
|
||||
.ops = &sof_imx8x_ops,
|
||||
};
|
||||
|
||||
static struct sof_dev_desc sof_of_imx8qm_desc = {
|
||||
.default_fw_path = "imx/sof",
|
||||
.default_tplg_path = "imx/sof-tplg",
|
||||
.default_fw_filename = "sof-imx8.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "imx/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "imx/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-imx8.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-imx8-nocodec.tplg",
|
||||
.ops = &sof_imx8_ops,
|
||||
};
|
||||
|
@ -412,7 +412,7 @@ static int imx8m_dsp_suspend(struct snd_sof_dev *sdev, unsigned int target_state
|
||||
}
|
||||
|
||||
/* i.MX8 ops */
|
||||
static const struct snd_sof_dsp_ops sof_imx8m_ops = {
|
||||
static struct snd_sof_dsp_ops sof_imx8m_ops = {
|
||||
/* probe and remove */
|
||||
.probe = imx8m_probe,
|
||||
.remove = imx8m_remove,
|
||||
@ -473,9 +473,17 @@ static const struct snd_sof_dsp_ops sof_imx8m_ops = {
|
||||
};
|
||||
|
||||
static struct sof_dev_desc sof_of_imx8mp_desc = {
|
||||
.default_fw_path = "imx/sof",
|
||||
.default_tplg_path = "imx/sof-tplg",
|
||||
.default_fw_filename = "sof-imx8m.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "imx/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "imx/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-imx8m.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-imx8-nocodec.tplg",
|
||||
.ops = &sof_imx8m_ops,
|
||||
};
|
||||
|
@ -6,7 +6,7 @@ snd-sof-acpi-intel-bdw-objs := bdw.o
|
||||
snd-sof-intel-hda-common-objs := hda.o hda-loader.o hda-stream.o hda-trace.o \
|
||||
hda-dsp.o hda-ipc.o hda-ctrl.o hda-pcm.o \
|
||||
hda-dai.o hda-bus.o \
|
||||
apl.o cnl.o tgl.o icl.o
|
||||
apl.o cnl.o tgl.o icl.o hda-common-ops.o
|
||||
snd-sof-intel-hda-common-$(CONFIG_SND_SOC_SOF_HDA_PROBES) += hda-probes.o
|
||||
|
||||
snd-sof-intel-hda-objs := hda-codec.o
|
||||
|
@ -26,108 +26,40 @@ static const struct snd_sof_debugfs_map apl_dsp_debugfs[] = {
|
||||
};
|
||||
|
||||
/* apollolake ops */
|
||||
const struct snd_sof_dsp_ops sof_apl_ops = {
|
||||
struct snd_sof_dsp_ops sof_apl_ops;
|
||||
EXPORT_SYMBOL_NS(sof_apl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
int sof_apl_ops_init(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/* common defaults */
|
||||
memcpy(&sof_apl_ops, &sof_hda_common_ops, sizeof(struct snd_sof_dsp_ops));
|
||||
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
.read = sof_io_read,
|
||||
.write64 = sof_io_write64,
|
||||
.read64 = sof_io_read64,
|
||||
|
||||
/* Block IO */
|
||||
.block_read = sof_block_read,
|
||||
.block_write = sof_block_write,
|
||||
|
||||
/* Mailbox IO */
|
||||
.mailbox_read = sof_mailbox_read,
|
||||
.mailbox_write = sof_mailbox_write,
|
||||
sof_apl_ops.shutdown = hda_dsp_shutdown;
|
||||
|
||||
/* doorbell */
|
||||
.irq_thread = hda_dsp_ipc_irq_thread,
|
||||
sof_apl_ops.irq_thread = hda_dsp_ipc_irq_thread;
|
||||
|
||||
/* ipc */
|
||||
.send_msg = hda_dsp_ipc_send_msg,
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.set_stream_data_offset = hda_set_stream_data_offset,
|
||||
|
||||
/* machine driver */
|
||||
.machine_select = hda_machine_select,
|
||||
.machine_register = sof_machine_register,
|
||||
.machine_unregister = sof_machine_unregister,
|
||||
.set_mach_params = hda_set_mach_params,
|
||||
sof_apl_ops.send_msg = hda_dsp_ipc_send_msg;
|
||||
|
||||
/* debug */
|
||||
.debug_map = apl_dsp_debugfs,
|
||||
.debug_map_count = ARRAY_SIZE(apl_dsp_debugfs),
|
||||
.dbg_dump = hda_dsp_dump,
|
||||
.ipc_dump = hda_ipc_dump,
|
||||
.debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem,
|
||||
|
||||
/* stream callbacks */
|
||||
.pcm_open = hda_dsp_pcm_open,
|
||||
.pcm_close = hda_dsp_pcm_close,
|
||||
.pcm_hw_params = hda_dsp_pcm_hw_params,
|
||||
.pcm_hw_free = hda_dsp_stream_hw_free,
|
||||
.pcm_trigger = hda_dsp_pcm_trigger,
|
||||
.pcm_pointer = hda_dsp_pcm_pointer,
|
||||
.pcm_ack = hda_dsp_pcm_ack,
|
||||
|
||||
/* firmware loading */
|
||||
.load_firmware = snd_sof_load_firmware_raw,
|
||||
sof_apl_ops.debug_map = apl_dsp_debugfs;
|
||||
sof_apl_ops.debug_map_count = ARRAY_SIZE(apl_dsp_debugfs);
|
||||
sof_apl_ops.ipc_dump = hda_ipc_dump;
|
||||
|
||||
/* firmware run */
|
||||
.run = hda_dsp_cl_boot_firmware,
|
||||
sof_apl_ops.run = hda_dsp_cl_boot_firmware;
|
||||
|
||||
/* pre/post fw run */
|
||||
.pre_fw_run = hda_dsp_pre_fw_run,
|
||||
.post_fw_run = hda_dsp_post_fw_run,
|
||||
|
||||
/* parse platform specific extended manifest */
|
||||
.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,
|
||||
sof_apl_ops.post_fw_run = hda_dsp_post_fw_run;
|
||||
|
||||
/* dsp core get/put */
|
||||
.core_get = hda_dsp_core_get,
|
||||
sof_apl_ops.core_get = hda_dsp_core_get;
|
||||
|
||||
/* trace callback */
|
||||
.trace_init = hda_dsp_trace_init,
|
||||
.trace_release = hda_dsp_trace_release,
|
||||
.trace_trigger = hda_dsp_trace_trigger,
|
||||
|
||||
/* client ops */
|
||||
.register_ipc_clients = hda_register_clients,
|
||||
.unregister_ipc_clients = hda_unregister_clients,
|
||||
|
||||
/* DAI drivers */
|
||||
.drv = skl_dai,
|
||||
.num_drv = SOF_SKL_NUM_DAIS,
|
||||
|
||||
/* PM */
|
||||
.suspend = hda_dsp_suspend,
|
||||
.resume = hda_dsp_resume,
|
||||
.runtime_suspend = hda_dsp_runtime_suspend,
|
||||
.runtime_resume = hda_dsp_runtime_resume,
|
||||
.runtime_idle = hda_dsp_runtime_idle,
|
||||
.set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume,
|
||||
.set_power_state = hda_dsp_set_power_state,
|
||||
|
||||
/* ALSA HW info flags */
|
||||
.hw_info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
||||
|
||||
.dsp_arch_ops = &sof_xtensa_arch_ops,
|
||||
return 0;
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_apl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
EXPORT_SYMBOL_NS(sof_apl_ops_init, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc apl_chip_info = {
|
||||
/* Apollolake */
|
||||
@ -139,9 +71,12 @@ const struct sof_intel_dsp_desc apl_chip_info = {
|
||||
.ipc_ack = HDA_DSP_REG_HIPCIE,
|
||||
.ipc_ack_mask = HDA_DSP_REG_HIPCIE_DONE,
|
||||
.ipc_ctl = HDA_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 150,
|
||||
.ssp_count = APL_SSP_COUNT,
|
||||
.ssp_base_offset = APL_SSP_BASE_OFFSET,
|
||||
.quirks = SOF_INTEL_PROCEN_FMT_QUIRK,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_1_5_PLUS,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(apl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
@ -567,7 +567,7 @@ static struct snd_soc_dai_driver bdw_dai[] = {
|
||||
};
|
||||
|
||||
/* broadwell ops */
|
||||
static const struct snd_sof_dsp_ops sof_bdw_ops = {
|
||||
static struct snd_sof_dsp_ops sof_bdw_ops = {
|
||||
/*Device init */
|
||||
.probe = bdw_probe,
|
||||
|
||||
@ -637,6 +637,7 @@ static const struct snd_sof_dsp_ops sof_bdw_ops = {
|
||||
static const struct sof_intel_dsp_desc bdw_chip_info = {
|
||||
.cores_num = 1,
|
||||
.host_managed_cores_mask = 1,
|
||||
.hw_ip_version = SOF_INTEL_BROADWELL,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc sof_acpi_broadwell_desc = {
|
||||
@ -646,9 +647,17 @@ static const struct sof_dev_desc sof_acpi_broadwell_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = 0,
|
||||
.chip_info = &bdw_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-bdw.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-bdw.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-bdw-nocodec.tplg",
|
||||
.ops = &sof_bdw_ops,
|
||||
};
|
||||
|
@ -216,7 +216,7 @@ irq:
|
||||
}
|
||||
|
||||
/* baytrail ops */
|
||||
static const struct snd_sof_dsp_ops sof_byt_ops = {
|
||||
static struct snd_sof_dsp_ops sof_byt_ops = {
|
||||
/* device init */
|
||||
.probe = byt_acpi_probe,
|
||||
.remove = byt_remove,
|
||||
@ -295,10 +295,11 @@ static const struct snd_sof_dsp_ops sof_byt_ops = {
|
||||
static const struct sof_intel_dsp_desc byt_chip_info = {
|
||||
.cores_num = 1,
|
||||
.host_managed_cores_mask = 1,
|
||||
.hw_ip_version = SOF_INTEL_BAYTRAIL,
|
||||
};
|
||||
|
||||
/* cherrytrail and braswell ops */
|
||||
static const struct snd_sof_dsp_ops sof_cht_ops = {
|
||||
static struct snd_sof_dsp_ops sof_cht_ops = {
|
||||
/* device init */
|
||||
.probe = byt_acpi_probe,
|
||||
.remove = byt_remove,
|
||||
@ -378,6 +379,7 @@ static const struct snd_sof_dsp_ops sof_cht_ops = {
|
||||
static const struct sof_intel_dsp_desc cht_chip_info = {
|
||||
.cores_num = 1,
|
||||
.host_managed_cores_mask = 1,
|
||||
.hw_ip_version = SOF_INTEL_BAYTRAIL,
|
||||
};
|
||||
|
||||
/* BYTCR uses different IRQ index */
|
||||
@ -388,9 +390,17 @@ static const struct sof_dev_desc sof_acpi_baytrailcr_desc = {
|
||||
.resindex_imr_base = 2,
|
||||
.irqindex_host_ipc = 0,
|
||||
.chip_info = &byt_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-byt.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-byt.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-byt-nocodec.tplg",
|
||||
.ops = &sof_byt_ops,
|
||||
};
|
||||
@ -402,9 +412,17 @@ static const struct sof_dev_desc sof_acpi_baytrail_desc = {
|
||||
.resindex_imr_base = 2,
|
||||
.irqindex_host_ipc = 5,
|
||||
.chip_info = &byt_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-byt.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-byt.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-byt-nocodec.tplg",
|
||||
.ops = &sof_byt_ops,
|
||||
};
|
||||
@ -416,9 +434,17 @@ static const struct sof_dev_desc sof_acpi_cherrytrail_desc = {
|
||||
.resindex_imr_base = 2,
|
||||
.irqindex_host_ipc = 5,
|
||||
.chip_info = &cht_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cht.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-cht.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-cht-nocodec.tplg",
|
||||
.ops = &sof_cht_ops,
|
||||
};
|
||||
|
@ -244,108 +244,40 @@ void cnl_ipc_dump(struct snd_sof_dev *sdev)
|
||||
}
|
||||
|
||||
/* cannonlake ops */
|
||||
const struct snd_sof_dsp_ops sof_cnl_ops = {
|
||||
struct snd_sof_dsp_ops sof_cnl_ops;
|
||||
EXPORT_SYMBOL_NS(sof_cnl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
int sof_cnl_ops_init(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/* common defaults */
|
||||
memcpy(&sof_cnl_ops, &sof_hda_common_ops, sizeof(struct snd_sof_dsp_ops));
|
||||
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
.read = sof_io_read,
|
||||
.write64 = sof_io_write64,
|
||||
.read64 = sof_io_read64,
|
||||
|
||||
/* Block IO */
|
||||
.block_read = sof_block_read,
|
||||
.block_write = sof_block_write,
|
||||
|
||||
/* Mailbox IO */
|
||||
.mailbox_read = sof_mailbox_read,
|
||||
.mailbox_write = sof_mailbox_write,
|
||||
sof_cnl_ops.shutdown = hda_dsp_shutdown;
|
||||
|
||||
/* doorbell */
|
||||
.irq_thread = cnl_ipc_irq_thread,
|
||||
sof_cnl_ops.irq_thread = cnl_ipc_irq_thread;
|
||||
|
||||
/* ipc */
|
||||
.send_msg = cnl_ipc_send_msg,
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.set_stream_data_offset = hda_set_stream_data_offset,
|
||||
|
||||
/* machine driver */
|
||||
.machine_select = hda_machine_select,
|
||||
.machine_register = sof_machine_register,
|
||||
.machine_unregister = sof_machine_unregister,
|
||||
.set_mach_params = hda_set_mach_params,
|
||||
sof_cnl_ops.send_msg = cnl_ipc_send_msg;
|
||||
|
||||
/* debug */
|
||||
.debug_map = cnl_dsp_debugfs,
|
||||
.debug_map_count = ARRAY_SIZE(cnl_dsp_debugfs),
|
||||
.dbg_dump = hda_dsp_dump,
|
||||
.ipc_dump = cnl_ipc_dump,
|
||||
.debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem,
|
||||
|
||||
/* stream callbacks */
|
||||
.pcm_open = hda_dsp_pcm_open,
|
||||
.pcm_close = hda_dsp_pcm_close,
|
||||
.pcm_hw_params = hda_dsp_pcm_hw_params,
|
||||
.pcm_hw_free = hda_dsp_stream_hw_free,
|
||||
.pcm_trigger = hda_dsp_pcm_trigger,
|
||||
.pcm_pointer = hda_dsp_pcm_pointer,
|
||||
.pcm_ack = hda_dsp_pcm_ack,
|
||||
|
||||
/* firmware loading */
|
||||
.load_firmware = snd_sof_load_firmware_raw,
|
||||
sof_cnl_ops.debug_map = cnl_dsp_debugfs;
|
||||
sof_cnl_ops.debug_map_count = ARRAY_SIZE(cnl_dsp_debugfs);
|
||||
sof_cnl_ops.ipc_dump = cnl_ipc_dump;
|
||||
|
||||
/* pre/post fw run */
|
||||
.pre_fw_run = hda_dsp_pre_fw_run,
|
||||
.post_fw_run = hda_dsp_post_fw_run,
|
||||
|
||||
/* parse platform specific extended manifest */
|
||||
.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,
|
||||
|
||||
/* dsp core get/put */
|
||||
.core_get = hda_dsp_core_get,
|
||||
sof_cnl_ops.post_fw_run = hda_dsp_post_fw_run;
|
||||
|
||||
/* firmware run */
|
||||
.run = hda_dsp_cl_boot_firmware,
|
||||
sof_cnl_ops.run = hda_dsp_cl_boot_firmware;
|
||||
|
||||
/* trace callback */
|
||||
.trace_init = hda_dsp_trace_init,
|
||||
.trace_release = hda_dsp_trace_release,
|
||||
.trace_trigger = hda_dsp_trace_trigger,
|
||||
/* dsp core get/put */
|
||||
sof_cnl_ops.core_get = hda_dsp_core_get;
|
||||
|
||||
/* client ops */
|
||||
.register_ipc_clients = hda_register_clients,
|
||||
.unregister_ipc_clients = hda_unregister_clients,
|
||||
|
||||
/* DAI drivers */
|
||||
.drv = skl_dai,
|
||||
.num_drv = SOF_SKL_NUM_DAIS,
|
||||
|
||||
/* PM */
|
||||
.suspend = hda_dsp_suspend,
|
||||
.resume = hda_dsp_resume,
|
||||
.runtime_suspend = hda_dsp_runtime_suspend,
|
||||
.runtime_resume = hda_dsp_runtime_resume,
|
||||
.runtime_idle = hda_dsp_runtime_idle,
|
||||
.set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume,
|
||||
.set_power_state = hda_dsp_set_power_state,
|
||||
|
||||
/* ALSA HW info flags */
|
||||
.hw_info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
||||
|
||||
.dsp_arch_ops = &sof_xtensa_arch_ops,
|
||||
return 0;
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_cnl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
EXPORT_SYMBOL_NS(sof_cnl_ops_init, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc cnl_chip_info = {
|
||||
/* Cannonlake */
|
||||
@ -357,12 +289,15 @@ const struct sof_intel_dsp_desc cnl_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = CNL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_1_8,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(cnl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
@ -383,11 +318,14 @@ const struct sof_intel_dsp_desc jsl_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_2_0,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(jsl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
107
sound/soc/sof/intel/hda-common-ops.c
Normal file
107
sound/soc/sof/intel/hda-common-ops.c
Normal file
@ -0,0 +1,107 @@
|
||||
// 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) 2022 Intel Corporation. All rights reserved.
|
||||
//
|
||||
|
||||
/*
|
||||
* common ops for SKL+ HDAudio platforms
|
||||
*/
|
||||
|
||||
#include "../sof-priv.h"
|
||||
#include "hda.h"
|
||||
#include "../sof-audio.h"
|
||||
|
||||
struct snd_sof_dsp_ops sof_hda_common_ops = {
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
.read = sof_io_read,
|
||||
.write64 = sof_io_write64,
|
||||
.read64 = sof_io_read64,
|
||||
|
||||
/* Block IO */
|
||||
.block_read = sof_block_read,
|
||||
.block_write = sof_block_write,
|
||||
|
||||
/* Mailbox IO */
|
||||
.mailbox_read = sof_mailbox_read,
|
||||
.mailbox_write = sof_mailbox_write,
|
||||
|
||||
/* ipc */
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.set_stream_data_offset = hda_set_stream_data_offset,
|
||||
|
||||
/* machine driver */
|
||||
.machine_select = hda_machine_select,
|
||||
.machine_register = sof_machine_register,
|
||||
.machine_unregister = sof_machine_unregister,
|
||||
.set_mach_params = hda_set_mach_params,
|
||||
|
||||
/* debug */
|
||||
.dbg_dump = hda_dsp_dump,
|
||||
.debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem,
|
||||
|
||||
/* stream callbacks */
|
||||
.pcm_open = hda_dsp_pcm_open,
|
||||
.pcm_close = hda_dsp_pcm_close,
|
||||
.pcm_hw_params = hda_dsp_pcm_hw_params,
|
||||
.pcm_hw_free = hda_dsp_stream_hw_free,
|
||||
.pcm_trigger = hda_dsp_pcm_trigger,
|
||||
.pcm_pointer = hda_dsp_pcm_pointer,
|
||||
.pcm_ack = hda_dsp_pcm_ack,
|
||||
|
||||
/* firmware loading */
|
||||
.load_firmware = snd_sof_load_firmware_raw,
|
||||
|
||||
/* pre/post fw run */
|
||||
.pre_fw_run = hda_dsp_pre_fw_run,
|
||||
|
||||
/* firmware run */
|
||||
.run = hda_dsp_cl_boot_firmware,
|
||||
|
||||
/* parse platform specific extended manifest */
|
||||
.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,
|
||||
|
||||
/* dsp core get/put */
|
||||
|
||||
/* trace callback */
|
||||
.trace_init = hda_dsp_trace_init,
|
||||
.trace_release = hda_dsp_trace_release,
|
||||
.trace_trigger = hda_dsp_trace_trigger,
|
||||
|
||||
/* client ops */
|
||||
.register_ipc_clients = hda_register_clients,
|
||||
.unregister_ipc_clients = hda_unregister_clients,
|
||||
|
||||
/* DAI drivers */
|
||||
.drv = skl_dai,
|
||||
.num_drv = SOF_SKL_NUM_DAIS,
|
||||
|
||||
/* PM */
|
||||
.suspend = hda_dsp_suspend,
|
||||
.resume = hda_dsp_resume,
|
||||
.runtime_suspend = hda_dsp_runtime_suspend,
|
||||
.runtime_resume = hda_dsp_runtime_resume,
|
||||
.runtime_idle = hda_dsp_runtime_idle,
|
||||
.set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume,
|
||||
.set_power_state = hda_dsp_set_power_state,
|
||||
|
||||
/* ALSA HW info flags */
|
||||
.hw_info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
||||
|
||||
.dsp_arch_ops = &sof_xtensa_arch_ops,
|
||||
};
|
@ -24,8 +24,6 @@
|
||||
#include "../sof-priv.h"
|
||||
#include "hda.h"
|
||||
|
||||
#define HDA_CL_STREAM_FORMAT 0x40
|
||||
|
||||
static void hda_ssp_set_cbp_cfp(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
|
||||
@ -43,9 +41,9 @@ static void hda_ssp_set_cbp_cfp(struct snd_sof_dev *sdev)
|
||||
}
|
||||
}
|
||||
|
||||
static struct hdac_ext_stream *cl_stream_prepare(struct snd_sof_dev *sdev, unsigned int format,
|
||||
unsigned int size, struct snd_dma_buffer *dmab,
|
||||
int direction)
|
||||
struct hdac_ext_stream *hda_cl_stream_prepare(struct snd_sof_dev *sdev, unsigned int format,
|
||||
unsigned int size, struct snd_dma_buffer *dmab,
|
||||
int direction)
|
||||
{
|
||||
struct hdac_ext_stream *hext_stream;
|
||||
struct hdac_stream *hstream;
|
||||
@ -173,7 +171,7 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
|
||||
|
||||
/* step 7: wait for ROM init */
|
||||
ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
|
||||
HDA_DSP_SRAM_REG_ROM_STATUS, status,
|
||||
chip->rom_status_reg, status,
|
||||
((status & HDA_DSP_ROM_STS_MASK)
|
||||
== HDA_DSP_ROM_INIT),
|
||||
HDA_DSP_REG_POLL_INTERVAL_US,
|
||||
@ -190,8 +188,8 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
|
||||
|
||||
if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS)
|
||||
dev_err(sdev->dev,
|
||||
"error: %s: timeout HDA_DSP_SRAM_REG_ROM_STATUS read\n",
|
||||
__func__);
|
||||
"%s: timeout with rom_status_reg (%#x) read\n",
|
||||
__func__, chip->rom_status_reg);
|
||||
|
||||
err:
|
||||
flags = SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX | SOF_DBG_DUMP_OPTIONAL;
|
||||
@ -236,8 +234,8 @@ static int cl_trigger(struct snd_sof_dev *sdev,
|
||||
}
|
||||
}
|
||||
|
||||
static int cl_cleanup(struct snd_sof_dev *sdev, struct snd_dma_buffer *dmab,
|
||||
struct hdac_ext_stream *hext_stream)
|
||||
int hda_cl_cleanup(struct snd_sof_dev *sdev, struct snd_dma_buffer *dmab,
|
||||
struct hdac_ext_stream *hext_stream)
|
||||
{
|
||||
struct hdac_stream *hstream = &hext_stream->hstream;
|
||||
int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
|
||||
@ -268,8 +266,10 @@ static int cl_cleanup(struct snd_sof_dev *sdev, struct snd_dma_buffer *dmab,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_stream)
|
||||
int hda_cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_stream)
|
||||
{
|
||||
struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
|
||||
const struct sof_intel_dsp_desc *chip = hda->desc;
|
||||
unsigned int reg;
|
||||
int ret, status;
|
||||
|
||||
@ -280,7 +280,7 @@ static int cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_str
|
||||
}
|
||||
|
||||
status = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
|
||||
HDA_DSP_SRAM_REG_ROM_STATUS, reg,
|
||||
chip->rom_status_reg, reg,
|
||||
((reg & HDA_DSP_ROM_STS_MASK)
|
||||
== HDA_DSP_ROM_FW_ENTERED),
|
||||
HDA_DSP_REG_POLL_INTERVAL_US,
|
||||
@ -293,8 +293,8 @@ static int cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_str
|
||||
|
||||
if (status < 0) {
|
||||
dev_err(sdev->dev,
|
||||
"error: %s: timeout HDA_DSP_SRAM_REG_ROM_STATUS read\n",
|
||||
__func__);
|
||||
"%s: timeout with rom_status_reg (%#x) read\n",
|
||||
__func__, chip->rom_status_reg);
|
||||
}
|
||||
|
||||
ret = cl_trigger(sdev, hext_stream, SNDRV_PCM_TRIGGER_STOP);
|
||||
@ -328,8 +328,8 @@ int hda_dsp_cl_boot_firmware_iccmax(struct snd_sof_dev *sdev)
|
||||
stripped_firmware.size = plat_data->fw->size - plat_data->fw_offset;
|
||||
|
||||
/* prepare capture stream for ICCMAX */
|
||||
iccmax_stream = cl_stream_prepare(sdev, HDA_CL_STREAM_FORMAT, stripped_firmware.size,
|
||||
&dmab_bdl, SNDRV_PCM_STREAM_CAPTURE);
|
||||
iccmax_stream = hda_cl_stream_prepare(sdev, HDA_CL_STREAM_FORMAT, stripped_firmware.size,
|
||||
&dmab_bdl, SNDRV_PCM_STREAM_CAPTURE);
|
||||
if (IS_ERR(iccmax_stream)) {
|
||||
dev_err(sdev->dev, "error: dma prepare for ICCMAX stream failed\n");
|
||||
return PTR_ERR(iccmax_stream);
|
||||
@ -341,7 +341,7 @@ int hda_dsp_cl_boot_firmware_iccmax(struct snd_sof_dev *sdev)
|
||||
* Perform iccmax stream cleanup. This should be done even if firmware loading fails.
|
||||
* If the cleanup also fails, we return the initial error
|
||||
*/
|
||||
ret1 = cl_cleanup(sdev, &dmab_bdl, iccmax_stream);
|
||||
ret1 = hda_cl_cleanup(sdev, &dmab_bdl, iccmax_stream);
|
||||
if (ret1 < 0) {
|
||||
dev_err(sdev->dev, "error: ICCMAX stream cleanup failed\n");
|
||||
|
||||
@ -420,8 +420,9 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev)
|
||||
init_waitqueue_head(&sdev->boot_wait);
|
||||
|
||||
/* prepare DMA for code loader stream */
|
||||
hext_stream = cl_stream_prepare(sdev, HDA_CL_STREAM_FORMAT, stripped_firmware.size,
|
||||
&dmab, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
hext_stream = hda_cl_stream_prepare(sdev, HDA_CL_STREAM_FORMAT,
|
||||
stripped_firmware.size,
|
||||
&dmab, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
if (IS_ERR(hext_stream)) {
|
||||
dev_err(sdev->dev, "error: dma prepare for fw loading failed\n");
|
||||
return PTR_ERR(hext_stream);
|
||||
@ -475,7 +476,7 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev)
|
||||
* Continue with code loading and firmware boot
|
||||
*/
|
||||
hda->boot_iteration = HDA_FW_BOOT_ATTEMPTS;
|
||||
ret = cl_copy_fw(sdev, hext_stream);
|
||||
ret = hda_cl_copy_fw(sdev, hext_stream);
|
||||
if (!ret)
|
||||
dev_dbg(sdev->dev, "Firmware download successful, booting...\n");
|
||||
else
|
||||
@ -488,7 +489,7 @@ cleanup:
|
||||
* This should be done even if firmware loading fails.
|
||||
* If the cleanup also fails, we return the initial error
|
||||
*/
|
||||
ret1 = cl_cleanup(sdev, &dmab, hext_stream);
|
||||
ret1 = hda_cl_cleanup(sdev, &dmab, hext_stream);
|
||||
if (ret1 < 0) {
|
||||
dev_err(sdev->dev, "error: Code loader DSP cleanup failed\n");
|
||||
|
||||
|
@ -406,11 +406,13 @@ static const struct hda_dsp_msg_code hda_dsp_rom_msg[] = {
|
||||
|
||||
static void hda_dsp_get_status(struct snd_sof_dev *sdev, const char *level)
|
||||
{
|
||||
const struct sof_intel_dsp_desc *chip;
|
||||
u32 status;
|
||||
int i;
|
||||
|
||||
chip = get_chip_info(sdev->pdata);
|
||||
status = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
|
||||
HDA_DSP_SRAM_REG_ROM_STATUS);
|
||||
chip->rom_status_reg);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hda_dsp_rom_msg); i++) {
|
||||
if (status == hda_dsp_rom_msg[i].code) {
|
||||
@ -456,13 +458,15 @@ static void hda_dsp_get_registers(struct snd_sof_dev *sdev,
|
||||
static void hda_dsp_dump_ext_rom_status(struct snd_sof_dev *sdev, const char *level,
|
||||
u32 flags)
|
||||
{
|
||||
const struct sof_intel_dsp_desc *chip;
|
||||
char msg[128];
|
||||
int len = 0;
|
||||
u32 value;
|
||||
int i;
|
||||
|
||||
chip = get_chip_info(sdev->pdata);
|
||||
for (i = 0; i < HDA_EXT_ROM_STATUS_SIZE; i++) {
|
||||
value = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_ROM_STATUS + i * 0x4);
|
||||
value = snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg + i * 0x4);
|
||||
len += snprintf(msg + len, sizeof(msg) - len, " 0x%x", value);
|
||||
}
|
||||
|
||||
@ -493,6 +497,17 @@ void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags)
|
||||
}
|
||||
}
|
||||
|
||||
static bool hda_check_ipc_irq(struct snd_sof_dev *sdev)
|
||||
{
|
||||
const struct sof_intel_dsp_desc *chip;
|
||||
|
||||
chip = get_chip_info(sdev->pdata);
|
||||
if (chip && chip->check_ipc_irq)
|
||||
return chip->check_ipc_irq(sdev);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void hda_ipc_irq_dump(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||
@ -816,7 +831,7 @@ static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
|
||||
if (hda_dsp_check_stream_irq(sdev))
|
||||
hda_dsp_stream_threaded_handler(irq, sdev);
|
||||
|
||||
if (hda_dsp_check_ipc_irq(sdev))
|
||||
if (hda_check_ipc_irq(sdev))
|
||||
sof_ops(sdev)->irq_thread(irq, sdev);
|
||||
|
||||
if (hda_dsp_check_sdw_irq(sdev))
|
||||
@ -1274,7 +1289,7 @@ static struct snd_soc_acpi_mach *hda_sdw_machine_select(struct snd_sof_dev *sdev
|
||||
mach->mach_params.links = mach->links;
|
||||
mach->mach_params.link_mask = mach->link_mask;
|
||||
mach->mach_params.platform = dev_name(sdev->dev);
|
||||
pdata->fw_filename = pdata->desc->default_fw_filename;
|
||||
pdata->fw_filename = pdata->desc->default_fw_filename[pdata->ipc_type];
|
||||
pdata->tplg_filename = mach->sof_tplg_filename;
|
||||
|
||||
/*
|
||||
|
@ -223,8 +223,8 @@
|
||||
#define HDA_DSP_REG_POLL_INTERVAL_US 500 /* 0.5 msec */
|
||||
#define HDA_DSP_REG_POLL_RETRY_COUNT 50
|
||||
|
||||
#define HDA_DSP_ADSPIC_IPC 1
|
||||
#define HDA_DSP_ADSPIS_IPC 1
|
||||
#define HDA_DSP_ADSPIC_IPC BIT(0)
|
||||
#define HDA_DSP_ADSPIS_IPC BIT(0)
|
||||
|
||||
/* Intel HD Audio General DSP Registers */
|
||||
#define HDA_DSP_GEN_BASE 0x0
|
||||
@ -268,8 +268,8 @@
|
||||
/* HIPCTE */
|
||||
#define HDA_DSP_REG_HIPCTE_MSG_MASK 0x3FFFFFFF
|
||||
|
||||
#define HDA_DSP_ADSPIC_CL_DMA 0x2
|
||||
#define HDA_DSP_ADSPIS_CL_DMA 0x2
|
||||
#define HDA_DSP_ADSPIC_CL_DMA BIT(1)
|
||||
#define HDA_DSP_ADSPIS_CL_DMA BIT(1)
|
||||
|
||||
/* Delay before scheduling D0i3 entry */
|
||||
#define BXT_D0I3_DELAY 5000
|
||||
@ -588,6 +588,13 @@ int hda_dsp_ipc_cmd_done(struct snd_sof_dev *sdev, int dir);
|
||||
*/
|
||||
int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_cl_boot_firmware_iccmax(struct snd_sof_dev *sdev);
|
||||
int hda_cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_stream);
|
||||
struct hdac_ext_stream *hda_cl_stream_prepare(struct snd_sof_dev *sdev, unsigned int format,
|
||||
unsigned int size, struct snd_dma_buffer *dmab,
|
||||
int direction);
|
||||
int hda_cl_cleanup(struct snd_sof_dev *sdev, struct snd_dma_buffer *dmab,
|
||||
struct hdac_ext_stream *hext_stream);
|
||||
#define HDA_CL_STREAM_FORMAT 0x40
|
||||
|
||||
/* pre and post fw run ops */
|
||||
int hda_dsp_pre_fw_run(struct snd_sof_dev *sdev);
|
||||
@ -687,14 +694,19 @@ extern struct snd_soc_dai_driver skl_dai[];
|
||||
/*
|
||||
* Platform Specific HW abstraction Ops.
|
||||
*/
|
||||
extern const struct snd_sof_dsp_ops sof_apl_ops;
|
||||
extern const struct snd_sof_dsp_ops sof_cnl_ops;
|
||||
extern const struct snd_sof_dsp_ops sof_tgl_ops;
|
||||
extern const struct snd_sof_dsp_ops sof_icl_ops;
|
||||
extern struct snd_sof_dsp_ops sof_hda_common_ops;
|
||||
|
||||
extern struct snd_sof_dsp_ops sof_apl_ops;
|
||||
int sof_apl_ops_init(struct snd_sof_dev *sdev);
|
||||
extern struct snd_sof_dsp_ops sof_cnl_ops;
|
||||
int sof_cnl_ops_init(struct snd_sof_dev *sdev);
|
||||
extern struct snd_sof_dsp_ops sof_tgl_ops;
|
||||
int sof_tgl_ops_init(struct snd_sof_dev *sdev);
|
||||
extern struct snd_sof_dsp_ops sof_icl_ops;
|
||||
int sof_icl_ops_init(struct snd_sof_dev *sdev);
|
||||
|
||||
extern const struct sof_intel_dsp_desc apl_chip_info;
|
||||
extern const struct sof_intel_dsp_desc cnl_chip_info;
|
||||
extern const struct sof_intel_dsp_desc skl_chip_info;
|
||||
extern const struct sof_intel_dsp_desc icl_chip_info;
|
||||
extern const struct sof_intel_dsp_desc tgl_chip_info;
|
||||
extern const struct sof_intel_dsp_desc tglh_chip_info;
|
||||
|
@ -88,109 +88,41 @@ static int icl_dsp_post_fw_run(struct snd_sof_dev *sdev)
|
||||
}
|
||||
|
||||
/* Icelake ops */
|
||||
const struct snd_sof_dsp_ops sof_icl_ops = {
|
||||
struct snd_sof_dsp_ops sof_icl_ops;
|
||||
EXPORT_SYMBOL_NS(sof_icl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
int sof_icl_ops_init(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/* common defaults */
|
||||
memcpy(&sof_icl_ops, &sof_hda_common_ops, sizeof(struct snd_sof_dsp_ops));
|
||||
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
.read = sof_io_read,
|
||||
.write64 = sof_io_write64,
|
||||
.read64 = sof_io_read64,
|
||||
|
||||
/* Block IO */
|
||||
.block_read = sof_block_read,
|
||||
.block_write = sof_block_write,
|
||||
|
||||
/* Mailbox IO */
|
||||
.mailbox_read = sof_mailbox_read,
|
||||
.mailbox_write = sof_mailbox_write,
|
||||
sof_icl_ops.shutdown = hda_dsp_shutdown;
|
||||
|
||||
/* doorbell */
|
||||
.irq_thread = cnl_ipc_irq_thread,
|
||||
sof_icl_ops.irq_thread = cnl_ipc_irq_thread;
|
||||
|
||||
/* ipc */
|
||||
.send_msg = cnl_ipc_send_msg,
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.set_stream_data_offset = hda_set_stream_data_offset,
|
||||
|
||||
/* machine driver */
|
||||
.machine_select = hda_machine_select,
|
||||
.machine_register = sof_machine_register,
|
||||
.machine_unregister = sof_machine_unregister,
|
||||
.set_mach_params = hda_set_mach_params,
|
||||
sof_icl_ops.send_msg = cnl_ipc_send_msg;
|
||||
|
||||
/* debug */
|
||||
.debug_map = icl_dsp_debugfs,
|
||||
.debug_map_count = ARRAY_SIZE(icl_dsp_debugfs),
|
||||
.dbg_dump = hda_dsp_dump,
|
||||
.ipc_dump = cnl_ipc_dump,
|
||||
.debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem,
|
||||
|
||||
/* stream callbacks */
|
||||
.pcm_open = hda_dsp_pcm_open,
|
||||
.pcm_close = hda_dsp_pcm_close,
|
||||
.pcm_hw_params = hda_dsp_pcm_hw_params,
|
||||
.pcm_hw_free = hda_dsp_stream_hw_free,
|
||||
.pcm_trigger = hda_dsp_pcm_trigger,
|
||||
.pcm_pointer = hda_dsp_pcm_pointer,
|
||||
.pcm_ack = hda_dsp_pcm_ack,
|
||||
|
||||
/* firmware loading */
|
||||
.load_firmware = snd_sof_load_firmware_raw,
|
||||
sof_icl_ops.debug_map = icl_dsp_debugfs;
|
||||
sof_icl_ops.debug_map_count = ARRAY_SIZE(icl_dsp_debugfs);
|
||||
sof_icl_ops.ipc_dump = cnl_ipc_dump;
|
||||
|
||||
/* pre/post fw run */
|
||||
.pre_fw_run = hda_dsp_pre_fw_run,
|
||||
.post_fw_run = icl_dsp_post_fw_run,
|
||||
|
||||
/* parse platform specific extended manifest */
|
||||
.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,
|
||||
|
||||
/* dsp core get/put */
|
||||
.core_get = hda_dsp_core_get,
|
||||
sof_icl_ops.post_fw_run = icl_dsp_post_fw_run;
|
||||
|
||||
/* firmware run */
|
||||
.run = hda_dsp_cl_boot_firmware_iccmax,
|
||||
.stall = icl_dsp_core_stall,
|
||||
sof_icl_ops.run = hda_dsp_cl_boot_firmware_iccmax;
|
||||
sof_icl_ops.stall = icl_dsp_core_stall;
|
||||
|
||||
/* trace callback */
|
||||
.trace_init = hda_dsp_trace_init,
|
||||
.trace_release = hda_dsp_trace_release,
|
||||
.trace_trigger = hda_dsp_trace_trigger,
|
||||
/* dsp core get/put */
|
||||
sof_icl_ops.core_get = hda_dsp_core_get;
|
||||
|
||||
/* client ops */
|
||||
.register_ipc_clients = hda_register_clients,
|
||||
.unregister_ipc_clients = hda_unregister_clients,
|
||||
|
||||
/* DAI drivers */
|
||||
.drv = skl_dai,
|
||||
.num_drv = SOF_SKL_NUM_DAIS,
|
||||
|
||||
/* PM */
|
||||
.suspend = hda_dsp_suspend,
|
||||
.resume = hda_dsp_resume,
|
||||
.runtime_suspend = hda_dsp_runtime_suspend,
|
||||
.runtime_resume = hda_dsp_runtime_resume,
|
||||
.runtime_idle = hda_dsp_runtime_idle,
|
||||
.set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume,
|
||||
.set_power_state = hda_dsp_set_power_state,
|
||||
|
||||
/* ALSA HW info flags */
|
||||
.hw_info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
||||
|
||||
.dsp_arch_ops = &sof_xtensa_arch_ops,
|
||||
return 0;
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_icl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
EXPORT_SYMBOL_NS(sof_icl_ops_init, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc icl_chip_info = {
|
||||
/* Icelake */
|
||||
@ -202,11 +134,14 @@ const struct sof_intel_dsp_desc icl_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_2_0,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(icl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
@ -27,11 +27,23 @@ static const struct sof_dev_desc bxt_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &apl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-apl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/apl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-apl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-apl-nocodec.tplg",
|
||||
.ops = &sof_apl_ops,
|
||||
.ops_init = sof_apl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc glk_desc = {
|
||||
@ -42,11 +54,23 @@ static const struct sof_dev_desc glk_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &apl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-glk.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/glk",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-glk.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-glk-nocodec.tplg",
|
||||
.ops = &sof_apl_ops,
|
||||
.ops_init = sof_apl_ops_init,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
|
@ -28,11 +28,23 @@ static const struct sof_dev_desc cnl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cnl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/cnl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-cnl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
.ops_init = sof_cnl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc cfl_desc = {
|
||||
@ -44,11 +56,23 @@ static const struct sof_dev_desc cfl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cfl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/cnl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-cfl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
.ops_init = sof_cnl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc cml_desc = {
|
||||
@ -60,11 +84,23 @@ static const struct sof_dev_desc cml_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cml.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/cnl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-cml.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
.ops_init = sof_cnl_ops_init,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
|
@ -28,11 +28,23 @@ static const struct sof_dev_desc icl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &icl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-icl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/icl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-icl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-icl-nocodec.tplg",
|
||||
.ops = &sof_icl_ops,
|
||||
.ops_init = sof_icl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc jsl_desc = {
|
||||
@ -43,11 +55,23 @@ static const struct sof_dev_desc jsl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &jsl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-jsl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/jsl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-jsl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-jsl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
.ops_init = sof_cnl_ops_init,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
|
@ -28,11 +28,23 @@ static const struct sof_dev_desc tgl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &tgl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-tgl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/tgl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-tgl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
.ops_init = sof_tgl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc tglh_desc = {
|
||||
@ -44,11 +56,23 @@ static const struct sof_dev_desc tglh_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &tglh_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-tgl-h.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/tgl-h",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-tgl-h.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
.ops_init = sof_tgl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc ehl_desc = {
|
||||
@ -59,11 +83,23 @@ static const struct sof_dev_desc ehl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &ehl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-ehl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/ehl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-ehl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-ehl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
.ops_init = sof_tgl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc adls_desc = {
|
||||
@ -75,11 +111,23 @@ static const struct sof_dev_desc adls_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &adls_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-adl-s.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/adl-s",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-adl-s.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
.ops_init = sof_tgl_ops_init,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc adl_desc = {
|
||||
@ -91,11 +139,23 @@ static const struct sof_dev_desc adl_desc = {
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &tgl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-adl.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
[SOF_INTEL_IPC4] = "intel/avs/adl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
[SOF_INTEL_IPC4] = "intel/avs-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-adl.ri",
|
||||
[SOF_INTEL_IPC4] = "dsp_basefw.bin",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
.ops_init = sof_tgl_ops_init,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
@ -140,4 +200,3 @@ module_pci_driver(snd_sof_pci_intel_tgl_driver);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
||||
|
@ -136,7 +136,7 @@ irq:
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct snd_sof_dsp_ops sof_tng_ops = {
|
||||
struct snd_sof_dsp_ops sof_tng_ops = {
|
||||
/* device init */
|
||||
.probe = tangier_pci_probe,
|
||||
|
||||
@ -210,6 +210,7 @@ const struct snd_sof_dsp_ops sof_tng_ops = {
|
||||
const struct sof_intel_dsp_desc tng_chip_info = {
|
||||
.cores_num = 1,
|
||||
.host_managed_cores_mask = 1,
|
||||
.hw_ip_version = SOF_INTEL_TANGIER,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc tng_desc = {
|
||||
@ -219,9 +220,17 @@ static const struct sof_dev_desc tng_desc = {
|
||||
.resindex_imr_base = 0,
|
||||
.irqindex_host_ipc = -1,
|
||||
.chip_info = &tng_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-byt.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "intel/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "intel/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-byt.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-byt.tplg",
|
||||
.ops = &sof_tng_ops,
|
||||
};
|
||||
|
@ -11,6 +11,17 @@
|
||||
#ifndef __SOF_INTEL_SHIM_H
|
||||
#define __SOF_INTEL_SHIM_H
|
||||
|
||||
enum sof_intel_hw_ip_version {
|
||||
SOF_INTEL_TANGIER,
|
||||
SOF_INTEL_BAYTRAIL,
|
||||
SOF_INTEL_BROADWELL,
|
||||
SOF_INTEL_CAVS_1_5, /* SkyLake, KabyLake, AmberLake */
|
||||
SOF_INTEL_CAVS_1_5_PLUS,/* ApolloLake, GeminiLake */
|
||||
SOF_INTEL_CAVS_1_8, /* CannonLake, CometLake, CoffeeLake */
|
||||
SOF_INTEL_CAVS_2_0, /* IceLake, JasperLake */
|
||||
SOF_INTEL_CAVS_2_5, /* TigerLake, AlderLake */
|
||||
};
|
||||
|
||||
/*
|
||||
* SHIM registers for BYT, BSW, CHT, BDW
|
||||
*/
|
||||
@ -164,16 +175,19 @@ struct sof_intel_dsp_desc {
|
||||
int ipc_ack;
|
||||
int ipc_ack_mask;
|
||||
int ipc_ctl;
|
||||
int rom_status_reg;
|
||||
int rom_init_timeout;
|
||||
int ssp_count; /* ssp count of the platform */
|
||||
int ssp_base_offset; /* base address of the SSPs */
|
||||
u32 sdw_shim_base;
|
||||
u32 sdw_alh_base;
|
||||
u32 quirks;
|
||||
enum sof_intel_hw_ip_version hw_ip_version;
|
||||
bool (*check_sdw_irq)(struct snd_sof_dev *sdev);
|
||||
bool (*check_ipc_irq)(struct snd_sof_dev *sdev);
|
||||
};
|
||||
|
||||
extern const struct snd_sof_dsp_ops sof_tng_ops;
|
||||
extern struct snd_sof_dsp_ops sof_tng_ops;
|
||||
|
||||
extern const struct sof_intel_dsp_desc tng_chip_info;
|
||||
|
||||
|
@ -59,109 +59,41 @@ static int tgl_dsp_core_put(struct snd_sof_dev *sdev, int core)
|
||||
}
|
||||
|
||||
/* Tigerlake ops */
|
||||
const struct snd_sof_dsp_ops sof_tgl_ops = {
|
||||
struct snd_sof_dsp_ops sof_tgl_ops;
|
||||
EXPORT_SYMBOL_NS(sof_tgl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
int sof_tgl_ops_init(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/* common defaults */
|
||||
memcpy(&sof_tgl_ops, &sof_hda_common_ops, sizeof(struct snd_sof_dsp_ops));
|
||||
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
.read = sof_io_read,
|
||||
.write64 = sof_io_write64,
|
||||
.read64 = sof_io_read64,
|
||||
|
||||
/* Block IO */
|
||||
.block_read = sof_block_read,
|
||||
.block_write = sof_block_write,
|
||||
|
||||
/* Mailbox IO */
|
||||
.mailbox_read = sof_mailbox_read,
|
||||
.mailbox_write = sof_mailbox_write,
|
||||
sof_tgl_ops.shutdown = hda_dsp_shutdown;
|
||||
|
||||
/* doorbell */
|
||||
.irq_thread = cnl_ipc_irq_thread,
|
||||
sof_tgl_ops.irq_thread = cnl_ipc_irq_thread;
|
||||
|
||||
/* ipc */
|
||||
.send_msg = cnl_ipc_send_msg,
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.set_stream_data_offset = hda_set_stream_data_offset,
|
||||
|
||||
/* machine driver */
|
||||
.machine_select = hda_machine_select,
|
||||
.machine_register = sof_machine_register,
|
||||
.machine_unregister = sof_machine_unregister,
|
||||
.set_mach_params = hda_set_mach_params,
|
||||
sof_tgl_ops.send_msg = cnl_ipc_send_msg;
|
||||
|
||||
/* debug */
|
||||
.debug_map = tgl_dsp_debugfs,
|
||||
.debug_map_count = ARRAY_SIZE(tgl_dsp_debugfs),
|
||||
.dbg_dump = hda_dsp_dump,
|
||||
.ipc_dump = cnl_ipc_dump,
|
||||
.debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem,
|
||||
|
||||
/* stream callbacks */
|
||||
.pcm_open = hda_dsp_pcm_open,
|
||||
.pcm_close = hda_dsp_pcm_close,
|
||||
.pcm_hw_params = hda_dsp_pcm_hw_params,
|
||||
.pcm_hw_free = hda_dsp_stream_hw_free,
|
||||
.pcm_trigger = hda_dsp_pcm_trigger,
|
||||
.pcm_pointer = hda_dsp_pcm_pointer,
|
||||
.pcm_ack = hda_dsp_pcm_ack,
|
||||
|
||||
/* firmware loading */
|
||||
.load_firmware = snd_sof_load_firmware_raw,
|
||||
sof_tgl_ops.debug_map = tgl_dsp_debugfs;
|
||||
sof_tgl_ops.debug_map_count = ARRAY_SIZE(tgl_dsp_debugfs);
|
||||
sof_tgl_ops.ipc_dump = cnl_ipc_dump;
|
||||
|
||||
/* pre/post fw run */
|
||||
.pre_fw_run = hda_dsp_pre_fw_run,
|
||||
.post_fw_run = hda_dsp_post_fw_run,
|
||||
|
||||
/* parse platform specific extended manifest */
|
||||
.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,
|
||||
|
||||
/* dsp core get/put */
|
||||
.core_get = tgl_dsp_core_get,
|
||||
.core_put = tgl_dsp_core_put,
|
||||
sof_tgl_ops.post_fw_run = hda_dsp_post_fw_run;
|
||||
|
||||
/* firmware run */
|
||||
.run = hda_dsp_cl_boot_firmware_iccmax,
|
||||
sof_tgl_ops.run = hda_dsp_cl_boot_firmware_iccmax;
|
||||
|
||||
/* trace callback */
|
||||
.trace_init = hda_dsp_trace_init,
|
||||
.trace_release = hda_dsp_trace_release,
|
||||
.trace_trigger = hda_dsp_trace_trigger,
|
||||
/* dsp core get/put */
|
||||
sof_tgl_ops.core_get = tgl_dsp_core_get;
|
||||
sof_tgl_ops.core_put = tgl_dsp_core_put;
|
||||
|
||||
/* client ops */
|
||||
.register_ipc_clients = hda_register_clients,
|
||||
.unregister_ipc_clients = hda_unregister_clients,
|
||||
|
||||
/* DAI drivers */
|
||||
.drv = skl_dai,
|
||||
.num_drv = SOF_SKL_NUM_DAIS,
|
||||
|
||||
/* PM */
|
||||
.suspend = hda_dsp_suspend,
|
||||
.resume = hda_dsp_resume,
|
||||
.runtime_suspend = hda_dsp_runtime_suspend,
|
||||
.runtime_resume = hda_dsp_runtime_resume,
|
||||
.runtime_idle = hda_dsp_runtime_idle,
|
||||
.set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume,
|
||||
.set_power_state = hda_dsp_set_power_state,
|
||||
|
||||
/* ALSA HW info flags */
|
||||
.hw_info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
||||
|
||||
.dsp_arch_ops = &sof_xtensa_arch_ops,
|
||||
return 0;
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_tgl_ops, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
EXPORT_SYMBOL_NS(sof_tgl_ops_init, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc tgl_chip_info = {
|
||||
/* Tigerlake , Alderlake */
|
||||
@ -173,12 +105,15 @@ const struct sof_intel_dsp_desc tgl_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_2_5,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(tgl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
@ -192,12 +127,15 @@ const struct sof_intel_dsp_desc tglh_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_2_5,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(tglh_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
@ -211,12 +149,15 @@ const struct sof_intel_dsp_desc ehl_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_2_5,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(ehl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
@ -230,11 +171,14 @@ const struct sof_intel_dsp_desc adls_chip_info = {
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_status_reg = HDA_DSP_SRAM_REG_ROM_STATUS,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
.sdw_shim_base = SDW_SHIM_BASE,
|
||||
.sdw_alh_base = SDW_ALH_BASE,
|
||||
.check_sdw_irq = hda_common_check_sdw_irq,
|
||||
.check_ipc_irq = hda_dsp_check_ipc_irq,
|
||||
.hw_ip_version = SOF_INTEL_CAVS_2_5,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(adls_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
@ -393,7 +393,7 @@ static struct snd_soc_dai_driver mt8195_dai[] = {
|
||||
};
|
||||
|
||||
/* mt8195 ops */
|
||||
static const struct snd_sof_dsp_ops sof_mt8195_ops = {
|
||||
static struct snd_sof_dsp_ops sof_mt8195_ops = {
|
||||
/* probe and remove */
|
||||
.probe = mt8195_dsp_probe,
|
||||
.remove = mt8195_dsp_remove,
|
||||
@ -440,9 +440,17 @@ static const struct snd_sof_dsp_ops sof_mt8195_ops = {
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc sof_of_mt8195_desc = {
|
||||
.default_fw_path = "mediatek/sof",
|
||||
.default_tplg_path = "mediatek/sof-tplg",
|
||||
.default_fw_filename = "sof-mt8195.ri",
|
||||
.ipc_supported_mask = BIT(SOF_IPC),
|
||||
.ipc_default = SOF_IPC,
|
||||
.default_fw_path = {
|
||||
[SOF_IPC] = "mediatek/sof",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC] = "mediatek/sof-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC] = "sof-mt8195.ri",
|
||||
},
|
||||
.nocodec_tplg_filename = "sof-mt8195-nocodec.tplg",
|
||||
.ops = &sof_mt8195_ops,
|
||||
};
|
||||
|
@ -21,6 +21,14 @@
|
||||
#define sof_ops(sdev) \
|
||||
((sdev)->pdata->desc->ops)
|
||||
|
||||
static inline int sof_ops_init(struct snd_sof_dev *sdev)
|
||||
{
|
||||
if (sdev->pdata->desc->ops_init)
|
||||
return sdev->pdata->desc->ops_init(sdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mandatory operations are verified during probing */
|
||||
|
||||
/* init */
|
||||
|
@ -393,7 +393,7 @@ static int sof_pcm_open(struct snd_soc_component *component,
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
|
||||
const struct snd_sof_dsp_ops *ops = sof_ops(sdev);
|
||||
struct snd_sof_dsp_ops *ops = sof_ops(sdev);
|
||||
struct snd_sof_pcm *spcm;
|
||||
struct snd_soc_tplg_stream_caps *caps;
|
||||
int ret;
|
||||
|
@ -74,20 +74,20 @@ int sof_acpi_probe(struct platform_device *pdev, const struct sof_dev_desc *desc
|
||||
|
||||
sof_pdata->desc = desc;
|
||||
sof_pdata->dev = &pdev->dev;
|
||||
sof_pdata->fw_filename = desc->default_fw_filename;
|
||||
sof_pdata->fw_filename = desc->default_fw_filename[SOF_IPC];
|
||||
|
||||
/* alternate fw and tplg filenames ? */
|
||||
if (fw_path)
|
||||
sof_pdata->fw_filename_prefix = fw_path;
|
||||
else
|
||||
sof_pdata->fw_filename_prefix =
|
||||
sof_pdata->desc->default_fw_path;
|
||||
sof_pdata->desc->default_fw_path[SOF_IPC];
|
||||
|
||||
if (tplg_path)
|
||||
sof_pdata->tplg_filename_prefix = tplg_path;
|
||||
else
|
||||
sof_pdata->tplg_filename_prefix =
|
||||
sof_pdata->desc->default_tplg_path;
|
||||
sof_pdata->desc->default_tplg_path[SOF_IPC];
|
||||
|
||||
/* set callback to be called on successful device probe to enable runtime_pm */
|
||||
sof_pdata->sof_probe_complete = sof_acpi_probe_complete;
|
||||
|
@ -652,7 +652,8 @@ int sof_machine_check(struct snd_sof_dev *sdev)
|
||||
return -ENOMEM;
|
||||
|
||||
mach->drv_name = "sof-nocodec";
|
||||
sof_pdata->tplg_filename = desc->nocodec_tplg_filename;
|
||||
if (!sof_pdata->tplg_filename)
|
||||
sof_pdata->tplg_filename = desc->nocodec_tplg_filename;
|
||||
|
||||
sof_pdata->machine = mach;
|
||||
snd_sof_set_mach_params(mach, sdev);
|
||||
|
@ -64,17 +64,17 @@ int sof_of_probe(struct platform_device *pdev)
|
||||
|
||||
sof_pdata->desc = desc;
|
||||
sof_pdata->dev = &pdev->dev;
|
||||
sof_pdata->fw_filename = desc->default_fw_filename;
|
||||
sof_pdata->fw_filename = desc->default_fw_filename[SOF_IPC];
|
||||
|
||||
if (fw_path)
|
||||
sof_pdata->fw_filename_prefix = fw_path;
|
||||
else
|
||||
sof_pdata->fw_filename_prefix = sof_pdata->desc->default_fw_path;
|
||||
sof_pdata->fw_filename_prefix = sof_pdata->desc->default_fw_path[SOF_IPC];
|
||||
|
||||
if (tplg_path)
|
||||
sof_pdata->tplg_filename_prefix = tplg_path;
|
||||
else
|
||||
sof_pdata->tplg_filename_prefix = sof_pdata->desc->default_tplg_path;
|
||||
sof_pdata->tplg_filename_prefix = sof_pdata->desc->default_tplg_path[SOF_IPC];
|
||||
|
||||
/* set callback to be called on successful device probe to enable runtime_pm */
|
||||
sof_pdata->sof_probe_complete = sof_of_probe_complete;
|
||||
|
@ -23,21 +23,29 @@ static char *fw_path;
|
||||
module_param(fw_path, charp, 0444);
|
||||
MODULE_PARM_DESC(fw_path, "alternate path for SOF firmware.");
|
||||
|
||||
static char *fw_filename;
|
||||
module_param(fw_filename, charp, 0444);
|
||||
MODULE_PARM_DESC(fw_filename, "alternate filename for SOF firmware.");
|
||||
|
||||
static char *tplg_path;
|
||||
module_param(tplg_path, charp, 0444);
|
||||
MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology.");
|
||||
|
||||
static char *tplg_filename;
|
||||
module_param(tplg_filename, charp, 0444);
|
||||
MODULE_PARM_DESC(tplg_filename, "alternate filename for SOF topology.");
|
||||
|
||||
static int sof_pci_debug;
|
||||
module_param_named(sof_pci_debug, sof_pci_debug, int, 0444);
|
||||
MODULE_PARM_DESC(sof_pci_debug, "SOF PCI debug options (0x0 all off)");
|
||||
|
||||
static const char *sof_override_tplg_name;
|
||||
static const char *sof_dmi_override_tplg_name;
|
||||
|
||||
#define SOF_PCI_DISABLE_PM_RUNTIME BIT(0)
|
||||
|
||||
static int sof_tplg_cb(const struct dmi_system_id *id)
|
||||
{
|
||||
sof_override_tplg_name = id->driver_data;
|
||||
sof_dmi_override_tplg_name = id->driver_data;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -173,7 +181,17 @@ int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
|
||||
sof_pdata->name = pci_name(pci);
|
||||
sof_pdata->desc = desc;
|
||||
sof_pdata->dev = dev;
|
||||
sof_pdata->fw_filename = desc->default_fw_filename;
|
||||
|
||||
sof_pdata->ipc_type = desc->ipc_default;
|
||||
|
||||
if (fw_filename) {
|
||||
sof_pdata->fw_filename = fw_filename;
|
||||
|
||||
dev_dbg(dev, "Module parameter used, changed fw filename to %s\n",
|
||||
sof_pdata->fw_filename);
|
||||
} else {
|
||||
sof_pdata->fw_filename = desc->default_fw_filename[sof_pdata->ipc_type];
|
||||
}
|
||||
|
||||
/*
|
||||
* for platforms using the SOF community key, change the
|
||||
@ -193,7 +211,7 @@ int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
|
||||
} else if (dmi_check_system(community_key_platforms)) {
|
||||
sof_pdata->fw_filename_prefix =
|
||||
devm_kasprintf(dev, GFP_KERNEL, "%s/%s",
|
||||
sof_pdata->desc->default_fw_path,
|
||||
sof_pdata->desc->default_fw_path[sof_pdata->ipc_type],
|
||||
"community");
|
||||
|
||||
dev_dbg(dev,
|
||||
@ -201,18 +219,29 @@ int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
|
||||
sof_pdata->fw_filename_prefix);
|
||||
} else {
|
||||
sof_pdata->fw_filename_prefix =
|
||||
sof_pdata->desc->default_fw_path;
|
||||
sof_pdata->desc->default_fw_path[sof_pdata->ipc_type];
|
||||
}
|
||||
|
||||
if (tplg_path)
|
||||
sof_pdata->tplg_filename_prefix = tplg_path;
|
||||
else
|
||||
sof_pdata->tplg_filename_prefix =
|
||||
sof_pdata->desc->default_tplg_path;
|
||||
sof_pdata->desc->default_tplg_path[sof_pdata->ipc_type];
|
||||
|
||||
dmi_check_system(sof_tplg_table);
|
||||
if (sof_override_tplg_name)
|
||||
sof_pdata->tplg_filename = sof_override_tplg_name;
|
||||
/*
|
||||
* the topology filename will be provided in the machine descriptor, unless
|
||||
* it is overridden by a module parameter or DMI quirk.
|
||||
*/
|
||||
if (tplg_filename) {
|
||||
sof_pdata->tplg_filename = tplg_filename;
|
||||
|
||||
dev_dbg(dev, "Module parameter used, changed tplg filename to %s\n",
|
||||
sof_pdata->tplg_filename);
|
||||
} else {
|
||||
dmi_check_system(sof_tplg_table);
|
||||
if (sof_dmi_override_tplg_name)
|
||||
sof_pdata->tplg_filename = sof_dmi_override_tplg_name;
|
||||
}
|
||||
|
||||
/* set callback to be called on successful device probe to enable runtime_pm */
|
||||
sof_pdata->sof_probe_complete = sof_pci_probe_complete;
|
||||
|
Loading…
Reference in New Issue
Block a user