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"); |