Lines Matching +full:disable +full:- +full:mmu +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2013--2024 Intel Corporation
8 #include <linux/dma-mapping.h>
16 #include <linux/pci-ats.h>
23 #include <media/ipu-bridge.h>
24 #include <media/ipu6-pci-table.h>
27 #include "ipu6-bus.h"
28 #include "ipu6-buttress.h"
29 #include "ipu6-cpd.h"
30 #include "ipu6-isys.h"
31 #include "ipu6-mmu.h"
32 #include "ipu6-platform-buttress-regs.h"
33 #include "ipu6-platform-isys-csi2-reg.h"
34 #include "ipu6-platform-regs.h"
245 dma_addr = sg_dma_address(isp->isys->fw_sgt.sgl);
247 dma_addr = sg_dma_address(isp->psys->fw_sgt.sgl);
249 pg_offset = server_fw_addr - dma_addr;
250 prog = (struct ipu6_cell_program *)((uintptr_t)isp->cpd_fw->data +
252 spc_base = base + prog->regs_addr;
253 if (spc_base != (base + hw_variant->spc_offset))
254 dev_warn(&isp->pdev->dev,
256 base + hw_variant->spc_offset, spc_base);
257 writel(server_fw_addr + prog->blob_offset +
258 prog->icache_source, spc_base + IPU6_PSYS_REG_SPC_ICACHE_BASE);
261 writel(prog->start[1], spc_base + IPU6_PSYS_REG_SPC_START_PC);
262 writel(pkg_dir_vied_address, base + hw_variant->dmem_offset);
270 void __iomem *dmem_base = base + hw_variant->dmem_offset;
271 void __iomem *spc_regs_base = base + hw_variant->spc_offset;
278 if (isp->secure_mode)
293 u8 hw_ver = isp->hw_ver;
373 struct device *dev = &pdev->dev;
386 return ERR_PTR(-ENOMEM);
388 pdata->base = base;
389 pdata->ipdata = ipdata;
399 isys_adev->mmu = ipu6_mmu_init(dev, base, ISYS_MMID,
400 &ipdata->hw_variant);
401 if (IS_ERR(isys_adev->mmu)) {
402 put_device(&isys_adev->auxdev.dev);
404 return dev_err_cast_probe(dev, isys_adev->mmu,
405 "ipu6_mmu_init(isys_adev->mmu) failed\n");
408 isys_adev->mmu->dev = &isys_adev->auxdev.dev;
430 return ERR_PTR(-ENOMEM);
432 pdata->base = base;
433 pdata->ipdata = ipdata;
439 return dev_err_cast_probe(&pdev->dev, psys_adev,
443 psys_adev->mmu = ipu6_mmu_init(&pdev->dev, base, PSYS_MMID,
444 &ipdata->hw_variant);
445 if (IS_ERR(psys_adev->mmu)) {
446 put_device(&psys_adev->auxdev.dev);
448 return dev_err_cast_probe(&pdev->dev, psys_adev->mmu,
449 "ipu6_mmu_init(psys_adev->mmu) failed\n");
452 psys_adev->mmu->dev = &psys_adev->auxdev.dev;
476 return dev_err_probe(&dev->dev, ret, "Request msi failed");
483 u32 val = readl(isp->base + BUTTRESS_REG_BTRS_CTRL);
495 writel(val, isp->base + BUTTRESS_REG_BTRS_CTRL);
501 struct device *dev = &pdev->dev;
511 return -ENOMEM;
513 isp->pdev = pdev;
514 INIT_LIST_HEAD(&isp->devices);
523 isp->base = pcim_iomap_region(pdev, IPU6_PCI_BAR, IPU6_NAME);
524 if (IS_ERR(isp->base))
525 return dev_err_probe(dev, PTR_ERR(isp->base),
531 isp->cpd_metadata_cmpnt_size = sizeof(struct ipu6_cpd_metadata_cmpnt);
532 switch (id->device) {
534 isp->hw_ver = IPU6_VER_6;
535 isp->cpd_fw_name = IPU6_FIRMWARE_NAME;
538 isp->hw_ver = IPU6_VER_6SE;
539 isp->cpd_fw_name = IPU6SE_FIRMWARE_NAME;
540 isp->cpd_metadata_cmpnt_size =
545 isp->hw_ver = IPU6_VER_6EP;
546 isp->cpd_fw_name = IPU6EP_FIRMWARE_NAME;
549 isp->hw_ver = IPU6_VER_6EP;
550 isp->cpd_fw_name = IPU6EPADLN_FIRMWARE_NAME;
553 isp->hw_ver = IPU6_VER_6EP_MTL;
554 isp->cpd_fw_name = IPU6EPMTL_FIRMWARE_NAME;
557 return dev_err_probe(dev, -ENODEV,
559 id->device);
564 isys_base = isp->base + isys_ipdata.hw_variant.offset;
565 psys_base = isp->base + psys_ipdata.hw_variant.offset;
573 ret = ipu6_pci_config_setup(pdev, isp->hw_ver);
581 ret = request_firmware(&isp->cpd_fw, isp->cpd_fw_name, dev);
583 dev_err_probe(&isp->pdev->dev, ret,
585 isp->cpd_fw_name);
589 ret = ipu6_cpd_validate_cpd_file(isp, isp->cpd_fw->data,
590 isp->cpd_fw->size);
592 dev_err_probe(&isp->pdev->dev, ret,
600 ret = -ENOMEM;
604 isp->isys = ipu6_isys_init(pdev, dev, isys_ctrl, isys_base,
606 if (IS_ERR(isp->isys)) {
607 ret = PTR_ERR(isp->isys);
614 ret = -ENOMEM;
618 isp->psys = ipu6_psys_init(pdev, &isp->isys->auxdev.dev, psys_ctrl,
620 if (IS_ERR(isp->psys)) {
621 ret = PTR_ERR(isp->psys);
625 ret = pm_runtime_resume_and_get(&isp->psys->auxdev.dev);
629 ret = ipu6_mmu_hw_init(isp->psys->mmu);
631 dev_err_probe(&isp->pdev->dev, ret,
632 "Failed to set MMU hardware\n");
636 ret = ipu6_buttress_map_fw_image(isp->psys, isp->cpd_fw,
637 &isp->psys->fw_sgt);
639 dev_err_probe(&isp->pdev->dev, ret, "failed to map fw image\n");
643 ret = ipu6_cpd_create_pkg_dir(isp->psys, isp->cpd_fw->data);
645 dev_err_probe(&isp->pdev->dev, ret,
650 ret = devm_request_threaded_irq(dev, pdev->irq, ipu6_buttress_isr,
660 dev_err_probe(&isp->pdev->dev, ret,
665 ipu6_mmu_hw_cleanup(isp->psys->mmu);
666 pm_runtime_put(&isp->psys->auxdev.dev);
671 val = readl(isp->base + BUTTRESS_REG_SKU);
674 dev_info(dev, "IPU%u-v%u[%x] hardware version %d\n", version, sku_id,
675 pdev->device, isp->hw_ver);
680 isp->bus_ready_to_probe = true;
685 devm_free_irq(dev, pdev->irq, isp);
687 if (isp->psys) {
688 ipu6_cpd_free_pkg_dir(isp->psys);
689 ipu6_buttress_unmap_fw_image(isp->psys, &isp->psys->fw_sgt);
691 if (!IS_ERR_OR_NULL(isp->psys) && !IS_ERR_OR_NULL(isp->psys->mmu))
692 ipu6_mmu_cleanup(isp->psys->mmu);
693 if (!IS_ERR_OR_NULL(isp->isys) && !IS_ERR_OR_NULL(isp->isys->mmu))
694 ipu6_mmu_cleanup(isp->isys->mmu);
696 release_firmware(isp->cpd_fw);
706 struct ipu6_mmu *isys_mmu = isp->isys->mmu;
707 struct ipu6_mmu *psys_mmu = isp->psys->mmu;
709 devm_free_irq(&pdev->dev, pdev->irq, isp);
710 ipu6_cpd_free_pkg_dir(isp->psys);
712 ipu6_buttress_unmap_fw_image(isp->psys, &isp->psys->fw_sgt);
717 pm_runtime_forbid(&pdev->dev);
718 pm_runtime_get_noresume(&pdev->dev);
720 release_firmware(isp->cpd_fw);
730 pm_runtime_forbid(&isp->pdev->dev);
738 if (isp->secure_mode)
741 isp->need_ipc_reset = true;
742 pm_runtime_allow(&isp->pdev->dev);
747 * PCI device level PM state transitions (D0<->D3)
753 synchronize_irq(pdev->irq);
761 struct ipu6_buttress *b = &isp->buttress;
767 isp->secure_mode = ipu6_buttress_get_secure_mode(isp);
769 isp->secure_mode ? "secure" : "non-secure");
773 ret = ipu6_buttress_ipc_reset(isp, &b->cse);
775 dev_err(&isp->pdev->dev, "IPC reset protocol failed!\n");
777 ret = pm_runtime_resume_and_get(&isp->psys->auxdev.dev);
779 dev_err(&isp->psys->auxdev.dev, "Failed to get runtime PM\n");
785 dev_err(&isp->pdev->dev, "FW authentication failed(%d)\n", ret);
787 pm_runtime_put(&isp->psys->auxdev.dev);
801 if (isp->need_ipc_reset) {
802 struct ipu6_buttress *b = &isp->buttress;
804 isp->need_ipc_reset = false;
805 ret = ipu6_buttress_ipc_reset(isp, &b->cse);
807 dev_err(&isp->pdev->dev, "IPC reset protocol failed\n");