acp.c (5fe14c55fdd5f9ee3d857001b7f25904ba49766b) acp.c (d948218424bf9194860fcc10259ff42487cf4bd9)
1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2//
3// This file is provided under a dual BSD/GPLv2 license. When using or
4// redistributing this file, you may do so under either license.
5//
6// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc. All rights reserved.
7//
8// Authors: Vijendar Mukunda <Vijendar.Mukunda@amd.com>

--- 14 unchanged lines hidden (view full) ---

23#define SECURED_FIRMWARE 1
24
25static bool enable_fw_debug;
26module_param(enable_fw_debug, bool, 0444);
27MODULE_PARM_DESC(enable_fw_debug, "Enable Firmware debug");
28
29const struct dmi_system_id acp_sof_quirk_table[] = {
30 {
1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2//
3// This file is provided under a dual BSD/GPLv2 license. When using or
4// redistributing this file, you may do so under either license.
5//
6// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc. All rights reserved.
7//
8// Authors: Vijendar Mukunda <Vijendar.Mukunda@amd.com>

--- 14 unchanged lines hidden (view full) ---

23#define SECURED_FIRMWARE 1
24
25static bool enable_fw_debug;
26module_param(enable_fw_debug, bool, 0444);
27MODULE_PARM_DESC(enable_fw_debug, "Enable Firmware debug");
28
29const struct dmi_system_id acp_sof_quirk_table[] = {
30 {
31 /* Steam Deck OLED device */
31 /* Valve Jupiter device */
32 .matches = {
33 DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
34 DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),
32 .matches = {
33 DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
34 DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),
35 DMI_MATCH(DMI_PRODUCT_FAMILY, "Sephiroth"),
35 },
36 .driver_data = (void *)SECURED_FIRMWARE,
37 },
38 {}
39};
40EXPORT_SYMBOL_GPL(acp_sof_quirk_table);
41
42static int smn_write(struct pci_dev *dev, u32 smn_addr, u32 data)

--- 442 unchanged lines hidden (view full) ---

485 if (ret) {
486 dev_err(sdev->dev, "ACP Init failed\n");
487 return ret;
488 }
489 return acp_memory_init(sdev);
490}
491EXPORT_SYMBOL_NS(amd_sof_acp_resume, SND_SOC_SOF_AMD_COMMON);
492
36 },
37 .driver_data = (void *)SECURED_FIRMWARE,
38 },
39 {}
40};
41EXPORT_SYMBOL_GPL(acp_sof_quirk_table);
42
43static int smn_write(struct pci_dev *dev, u32 smn_addr, u32 data)

--- 442 unchanged lines hidden (view full) ---

486 if (ret) {
487 dev_err(sdev->dev, "ACP Init failed\n");
488 return ret;
489 }
490 return acp_memory_init(sdev);
491}
492EXPORT_SYMBOL_NS(amd_sof_acp_resume, SND_SOC_SOF_AMD_COMMON);
493
494#if IS_ENABLED(CONFIG_SND_SOC_SOF_AMD_SOUNDWIRE)
495static int acp_sof_scan_sdw_devices(struct snd_sof_dev *sdev, u64 addr)
496{
497 struct acpi_device *sdw_dev;
498 struct acp_dev_data *acp_data;
499 const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
500
501 if (!addr)
502 return -ENODEV;
503
504 acp_data = sdev->pdata->hw_pdata;
505 sdw_dev = acpi_find_child_device(ACPI_COMPANION(sdev->dev), addr, 0);
506 if (!sdw_dev)
507 return -ENODEV;
508
509 acp_data->info.handle = sdw_dev->handle;
510 acp_data->info.count = desc->sdw_max_link_count;
511
512 return amd_sdw_scan_controller(&acp_data->info);
513}
514
515static int amd_sof_sdw_probe(struct snd_sof_dev *sdev)
516{
517 struct acp_dev_data *acp_data;
518 struct sdw_amd_res sdw_res;
519 int ret;
520
521 acp_data = sdev->pdata->hw_pdata;
522
523 memset(&sdw_res, 0, sizeof(sdw_res));
524 sdw_res.addr = acp_data->addr;
525 sdw_res.reg_range = acp_data->reg_range;
526 sdw_res.handle = acp_data->info.handle;
527 sdw_res.parent = sdev->dev;
528 sdw_res.dev = sdev->dev;
529 sdw_res.acp_lock = &acp_data->acp_lock;
530 sdw_res.count = acp_data->info.count;
531 sdw_res.link_mask = acp_data->info.link_mask;
532 sdw_res.mmio_base = sdev->bar[ACP_DSP_BAR];
533
534 ret = sdw_amd_probe(&sdw_res, &acp_data->sdw);
535 if (ret)
536 dev_err(sdev->dev, "SoundWire probe failed\n");
537 return ret;
538}
539
540static int amd_sof_sdw_exit(struct snd_sof_dev *sdev)
541{
542 struct acp_dev_data *acp_data;
543
544 acp_data = sdev->pdata->hw_pdata;
545 if (acp_data->sdw)
546 sdw_amd_exit(acp_data->sdw);
547 acp_data->sdw = NULL;
548
549 return 0;
550}
551
552#else
553static int acp_sof_scan_sdw_devices(struct snd_sof_dev *sdev, u64 addr)
554{
555 return 0;
556}
557
558static int amd_sof_sdw_probe(struct snd_sof_dev *sdev)
559{
560 return 0;
561}
562
563static int amd_sof_sdw_exit(struct snd_sof_dev *sdev)
564{
565 return 0;
566}
567#endif
568
493int amd_sof_acp_probe(struct snd_sof_dev *sdev)
494{
495 struct pci_dev *pci = to_pci_dev(sdev->dev);
569int amd_sof_acp_probe(struct snd_sof_dev *sdev)
570{
571 struct pci_dev *pci = to_pci_dev(sdev->dev);
572 struct snd_sof_pdata *plat_data = sdev->pdata;
496 struct acp_dev_data *adata;
497 const struct sof_amd_acp_desc *chip;
498 const struct dmi_system_id *dmi_id;
499 unsigned int addr;
500 int ret;
501
502 chip = get_chip_info(sdev->pdata);
503 if (!chip) {

--- 16 unchanged lines hidden (view full) ---

520 sdev->bar[ACP_DSP_BAR] = devm_ioremap(sdev->dev, addr, pci_resource_len(pci, ACP_DSP_BAR));
521 if (!sdev->bar[ACP_DSP_BAR]) {
522 dev_err(sdev->dev, "ioremap error\n");
523 ret = -ENXIO;
524 goto unregister_dev;
525 }
526
527 pci_set_master(pci);
573 struct acp_dev_data *adata;
574 const struct sof_amd_acp_desc *chip;
575 const struct dmi_system_id *dmi_id;
576 unsigned int addr;
577 int ret;
578
579 chip = get_chip_info(sdev->pdata);
580 if (!chip) {

--- 16 unchanged lines hidden (view full) ---

597 sdev->bar[ACP_DSP_BAR] = devm_ioremap(sdev->dev, addr, pci_resource_len(pci, ACP_DSP_BAR));
598 if (!sdev->bar[ACP_DSP_BAR]) {
599 dev_err(sdev->dev, "ioremap error\n");
600 ret = -ENXIO;
601 goto unregister_dev;
602 }
603
604 pci_set_master(pci);
528
605 adata->addr = addr;
606 adata->reg_range = chip->reg_end_addr - chip->reg_start_addr;
607 mutex_init(&adata->acp_lock);
529 sdev->pdata->hw_pdata = adata;
530 adata->smn_dev = pci_get_device(PCI_VENDOR_ID_AMD, chip->host_bridge_id, NULL);
531 if (!adata->smn_dev) {
532 dev_err(sdev->dev, "Failed to get host bridge device\n");
533 ret = -ENODEV;
534 goto unregister_dev;
535 }
536

--- 5 unchanged lines hidden (view full) ---

542 sdev->ipc_irq);
543 goto free_smn_dev;
544 }
545
546 ret = acp_init(sdev);
547 if (ret < 0)
548 goto free_ipc_irq;
549
608 sdev->pdata->hw_pdata = adata;
609 adata->smn_dev = pci_get_device(PCI_VENDOR_ID_AMD, chip->host_bridge_id, NULL);
610 if (!adata->smn_dev) {
611 dev_err(sdev->dev, "Failed to get host bridge device\n");
612 ret = -ENODEV;
613 goto unregister_dev;
614 }
615

--- 5 unchanged lines hidden (view full) ---

621 sdev->ipc_irq);
622 goto free_smn_dev;
623 }
624
625 ret = acp_init(sdev);
626 if (ret < 0)
627 goto free_ipc_irq;
628
629 /* scan SoundWire capabilities exposed by DSDT */
630 ret = acp_sof_scan_sdw_devices(sdev, chip->sdw_acpi_dev_addr);
631 if (ret < 0) {
632 dev_dbg(sdev->dev, "skipping SoundWire, not detected with ACPI scan\n");
633 goto skip_soundwire;
634 }
635 ret = amd_sof_sdw_probe(sdev);
636 if (ret < 0) {
637 dev_err(sdev->dev, "error: SoundWire probe error\n");
638 free_irq(sdev->ipc_irq, sdev);
639 pci_dev_put(adata->smn_dev);
640 return ret;
641 }
642
643skip_soundwire:
550 sdev->dsp_box.offset = 0;
551 sdev->dsp_box.size = BOX_SIZE_512;
552
553 sdev->host_box.offset = sdev->dsp_box.offset + sdev->dsp_box.size;
554 sdev->host_box.size = BOX_SIZE_512;
555
556 sdev->debug_box.offset = sdev->host_box.offset + sdev->host_box.size;
557 sdev->debug_box.size = BOX_SIZE_1024;
558
559 adata->signed_fw_image = false;
560 dmi_id = dmi_first_match(acp_sof_quirk_table);
561 if (dmi_id && dmi_id->driver_data) {
644 sdev->dsp_box.offset = 0;
645 sdev->dsp_box.size = BOX_SIZE_512;
646
647 sdev->host_box.offset = sdev->dsp_box.offset + sdev->dsp_box.size;
648 sdev->host_box.size = BOX_SIZE_512;
649
650 sdev->debug_box.offset = sdev->host_box.offset + sdev->host_box.size;
651 sdev->debug_box.size = BOX_SIZE_1024;
652
653 adata->signed_fw_image = false;
654 dmi_id = dmi_first_match(acp_sof_quirk_table);
655 if (dmi_id && dmi_id->driver_data) {
562 adata->fw_code_bin = devm_kasprintf(sdev->dev, GFP_KERNEL,
563 "sof-%s-code.bin",
564 chip->name);
565 if (!adata->fw_code_bin) {
566 ret = -ENOMEM;
567 goto free_ipc_irq;
568 }
569
570 adata->fw_data_bin = devm_kasprintf(sdev->dev, GFP_KERNEL,
571 "sof-%s-data.bin",
572 chip->name);
573 if (!adata->fw_data_bin) {
574 ret = -ENOMEM;
575 goto free_ipc_irq;
576 }
577
656 adata->fw_code_bin = kasprintf(GFP_KERNEL, "%s/sof-%s-code.bin",
657 plat_data->fw_filename_prefix,
658 chip->name);
659 adata->fw_data_bin = kasprintf(GFP_KERNEL, "%s/sof-%s-data.bin",
660 plat_data->fw_filename_prefix,
661 chip->name);
578 adata->signed_fw_image = dmi_id->driver_data;
662 adata->signed_fw_image = dmi_id->driver_data;
579 }
580
663
664 dev_dbg(sdev->dev, "fw_code_bin:%s, fw_data_bin:%s\n", adata->fw_code_bin,
665 adata->fw_data_bin);
666 }
581 adata->enable_fw_debug = enable_fw_debug;
582 acp_memory_init(sdev);
583
584 acp_dsp_stream_init(sdev);
585
586 return 0;
587
588free_ipc_irq:

--- 8 unchanged lines hidden (view full) ---

597
598void amd_sof_acp_remove(struct snd_sof_dev *sdev)
599{
600 struct acp_dev_data *adata = sdev->pdata->hw_pdata;
601
602 if (adata->smn_dev)
603 pci_dev_put(adata->smn_dev);
604
667 adata->enable_fw_debug = enable_fw_debug;
668 acp_memory_init(sdev);
669
670 acp_dsp_stream_init(sdev);
671
672 return 0;
673
674free_ipc_irq:

--- 8 unchanged lines hidden (view full) ---

683
684void amd_sof_acp_remove(struct snd_sof_dev *sdev)
685{
686 struct acp_dev_data *adata = sdev->pdata->hw_pdata;
687
688 if (adata->smn_dev)
689 pci_dev_put(adata->smn_dev);
690
691 if (adata->sdw)
692 amd_sof_sdw_exit(sdev);
693
605 if (sdev->ipc_irq)
606 free_irq(sdev->ipc_irq, sdev);
607
608 if (adata->dmic_dev)
609 platform_device_unregister(adata->dmic_dev);
610
611 acp_reset(sdev);
612}
613EXPORT_SYMBOL_NS(amd_sof_acp_remove, SND_SOC_SOF_AMD_COMMON);
614
615MODULE_DESCRIPTION("AMD ACP sof driver");
694 if (sdev->ipc_irq)
695 free_irq(sdev->ipc_irq, sdev);
696
697 if (adata->dmic_dev)
698 platform_device_unregister(adata->dmic_dev);
699
700 acp_reset(sdev);
701}
702EXPORT_SYMBOL_NS(amd_sof_acp_remove, SND_SOC_SOF_AMD_COMMON);
703
704MODULE_DESCRIPTION("AMD ACP sof driver");
705MODULE_IMPORT_NS(SOUNDWIRE_AMD_INIT);
706MODULE_IMPORT_NS(SND_AMD_SOUNDWIRE_ACPI);
616MODULE_LICENSE("Dual BSD/GPL");
707MODULE_LICENSE("Dual BSD/GPL");