Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: SOF: amd: Use AMD_NODE

All consumers of SMN in the kernel should be doing it through the
functions provided by AMD_NODE.

Stop using the local SMN read/write symbols and switch to the AMD_NODE
provided ones.

Tested by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com>

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://patch.msgid.link/20250217231747.1656228-6-superm1@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Mario Limonciello and committed by
Mark Brown
f120cf33 8f969537

+17 -44
+1
sound/soc/sof/amd/Kconfig
··· 25 25 select SND_SOC_SOF_ACP_PROBES 26 26 select SND_SOC_ACPI_AMD_MATCH 27 27 select SND_SOC_ACPI if ACPI 28 + depends on AMD_NODE 28 29 help 29 30 This option is not user-selectable but automatically handled by 30 31 'select' statements at a higher level
+16 -40
sound/soc/sof/amd/acp.c
··· 16 16 #include <linux/module.h> 17 17 #include <linux/pci.h> 18 18 19 + #include <asm/amd_node.h> 20 + 19 21 #include "../ops.h" 20 22 #include "acp.h" 21 23 #include "acp-dsp-offset.h" ··· 43 41 {} 44 42 }; 45 43 EXPORT_SYMBOL_GPL(acp_sof_quirk_table); 46 - 47 - static int smn_write(struct pci_dev *dev, u32 smn_addr, u32 data) 48 - { 49 - pci_write_config_dword(dev, 0x60, smn_addr); 50 - pci_write_config_dword(dev, 0x64, data); 51 - 52 - return 0; 53 - } 54 - 55 - static int smn_read(struct pci_dev *dev, u32 smn_addr) 56 - { 57 - u32 data = 0; 58 - 59 - pci_write_config_dword(dev, 0x60, smn_addr); 60 - pci_read_config_dword(dev, 0x64, &data); 61 - 62 - return data; 63 - } 64 44 65 45 static void init_dma_descriptor(struct acp_dev_data *adata) 66 46 { ··· 192 208 static int psp_mbox_ready(struct acp_dev_data *adata, bool ack) 193 209 { 194 210 struct snd_sof_dev *sdev = adata->dev; 195 - int ret; 196 - u32 data; 211 + int ret, data; 197 212 198 - ret = read_poll_timeout(smn_read, data, data & MBOX_READY_MASK, MBOX_DELAY_US, 199 - ACP_PSP_TIMEOUT_US, false, adata->smn_dev, MP0_C2PMSG_114_REG); 213 + ret = read_poll_timeout(smn_read_register, data, data > 0 && data & MBOX_READY_MASK, 214 + MBOX_DELAY_US, ACP_PSP_TIMEOUT_US, false, MP0_C2PMSG_114_REG); 215 + 200 216 if (!ret) 201 217 return 0; 202 218 ··· 224 240 return -EINVAL; 225 241 226 242 /* Get a non-zero Doorbell value from PSP */ 227 - ret = read_poll_timeout(smn_read, data, data, MBOX_DELAY_US, ACP_PSP_TIMEOUT_US, false, 228 - adata->smn_dev, MP0_C2PMSG_73_REG); 243 + ret = read_poll_timeout(smn_read_register, data, data > 0, MBOX_DELAY_US, 244 + ACP_PSP_TIMEOUT_US, false, MP0_C2PMSG_73_REG); 229 245 230 246 if (ret) { 231 247 dev_err(sdev->dev, "Failed to get Doorbell from MBOX %x\n", MP0_C2PMSG_73_REG); ··· 237 253 if (ret) 238 254 return ret; 239 255 240 - smn_write(adata->smn_dev, MP0_C2PMSG_114_REG, cmd); 256 + ret = amd_smn_write(0, MP0_C2PMSG_114_REG, cmd); 257 + if (ret) 258 + return ret; 241 259 242 260 /* Ring the Doorbell for PSP */ 243 - smn_write(adata->smn_dev, MP0_C2PMSG_73_REG, data); 261 + ret = amd_smn_write(0, MP0_C2PMSG_73_REG, data); 262 + if (ret) 263 + return ret; 244 264 245 265 /* Check MBOX ready as PSP ack */ 246 266 ret = psp_mbox_ready(adata, 1); ··· 758 770 adata->pci_rev = pci->revision; 759 771 mutex_init(&adata->acp_lock); 760 772 sdev->pdata->hw_pdata = adata; 761 - adata->smn_dev = pci_get_device(PCI_VENDOR_ID_AMD, chip->host_bridge_id, NULL); 762 - if (!adata->smn_dev) { 763 - dev_err(sdev->dev, "Failed to get host bridge device\n"); 764 - ret = -ENODEV; 765 - goto unregister_dev; 766 - } 767 773 768 774 ret = acp_init(sdev); 769 775 if (ret < 0) 770 - goto free_smn_dev; 776 + goto unregister_dev; 771 777 772 778 sdev->ipc_irq = pci->irq; 773 779 ret = request_threaded_irq(sdev->ipc_irq, acp_irq_handler, acp_irq_thread, ··· 769 787 if (ret < 0) { 770 788 dev_err(sdev->dev, "failed to register IRQ %d\n", 771 789 sdev->ipc_irq); 772 - goto free_smn_dev; 790 + goto unregister_dev; 773 791 } 774 792 775 793 /* scan SoundWire capabilities exposed by DSDT */ ··· 782 800 if (ret < 0) { 783 801 dev_err(sdev->dev, "error: SoundWire probe error\n"); 784 802 free_irq(sdev->ipc_irq, sdev); 785 - pci_dev_put(adata->smn_dev); 786 803 return ret; 787 804 } 788 805 ··· 827 846 828 847 free_ipc_irq: 829 848 free_irq(sdev->ipc_irq, sdev); 830 - free_smn_dev: 831 - pci_dev_put(adata->smn_dev); 832 849 unregister_dev: 833 850 platform_device_unregister(adata->dmic_dev); 834 851 return ret; ··· 836 857 void amd_sof_acp_remove(struct snd_sof_dev *sdev) 837 858 { 838 859 struct acp_dev_data *adata = sdev->pdata->hw_pdata; 839 - 840 - if (adata->smn_dev) 841 - pci_dev_put(adata->smn_dev); 842 860 843 861 if (adata->sdw) 844 862 amd_sof_sdw_exit(sdev);
-1
sound/soc/sof/amd/acp.h
··· 255 255 struct dma_descriptor dscr_info[ACP_MAX_DESC]; 256 256 struct acp_dsp_stream stream_buf[ACP_MAX_STREAM]; 257 257 struct acp_dsp_stream *dtrace_stream; 258 - struct pci_dev *smn_dev; 259 258 struct acp_dsp_stream *probe_stream; 260 259 bool enable_fw_debug; 261 260 bool is_dram_in_use;
-1
sound/soc/sof/amd/pci-rmb.c
··· 28 28 #define ACP6X_FUTURE_REG_ACLK_0 0x1854 29 29 30 30 static const struct sof_amd_acp_desc rembrandt_chip_info = { 31 - .host_bridge_id = HOST_BRIDGE_RMB, 32 31 .pgfsm_base = ACP6X_PGFSM_BASE, 33 32 .ext_intr_stat = ACP6X_EXT_INTR_STAT, 34 33 .dsp_intr_base = ACP6X_DSP_SW_INTR_BASE,
-1
sound/soc/sof/amd/pci-rn.c
··· 28 28 #define ACP3X_FUTURE_REG_ACLK_0 0x1860 29 29 30 30 static const struct sof_amd_acp_desc renoir_chip_info = { 31 - .host_bridge_id = HOST_BRIDGE_CZN, 32 31 .pgfsm_base = ACP3X_PGFSM_BASE, 33 32 .ext_intr_stat = ACP3X_EXT_INTR_STAT, 34 33 .dsp_intr_base = ACP3X_DSP_SW_INTR_BASE,
-1
sound/soc/sof/amd/pci-vangogh.c
··· 27 27 28 28 static const struct sof_amd_acp_desc vangogh_chip_info = { 29 29 .name = "vangogh", 30 - .host_bridge_id = HOST_BRIDGE_VGH, 31 30 .pgfsm_base = ACP5X_PGFSM_BASE, 32 31 .ext_intr_stat = ACP5X_EXT_INTR_STAT, 33 32 .dsp_intr_base = ACP5X_DSP_SW_INTR_BASE,