init.c (8632987380765dee716d460640aa58d58d52998e) init.c (a8d4a37d1bb93608501d0d0545f902061152669a)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2007-2010 Advanced Micro Devices, Inc.
4 * Author: Joerg Roedel <jroedel@suse.de>
5 * Leo Duran <leo.duran@amd.com>
6 */
7
8#define pr_fmt(fmt) "AMD-Vi: " fmt

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

801 free_pages((unsigned long)iommu->ga_log_tail, get_order(8));
802#endif
803}
804
805static int iommu_ga_log_enable(struct amd_iommu *iommu)
806{
807#ifdef CONFIG_IRQ_REMAP
808 u32 status, i;
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2007-2010 Advanced Micro Devices, Inc.
4 * Author: Joerg Roedel <jroedel@suse.de>
5 * Leo Duran <leo.duran@amd.com>
6 */
7
8#define pr_fmt(fmt) "AMD-Vi: " fmt

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

801 free_pages((unsigned long)iommu->ga_log_tail, get_order(8));
802#endif
803}
804
805static int iommu_ga_log_enable(struct amd_iommu *iommu)
806{
807#ifdef CONFIG_IRQ_REMAP
808 u32 status, i;
809 u64 entry;
809
810 if (!iommu->ga_log)
811 return -EINVAL;
812
810
811 if (!iommu->ga_log)
812 return -EINVAL;
813
813 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
814
815 /* Check if already running */
814 /* Check if already running */
816 if (status & (MMIO_STATUS_GALOG_RUN_MASK))
815 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
816 if (WARN_ON(status & (MMIO_STATUS_GALOG_RUN_MASK)))
817 return 0;
818
817 return 0;
818
819 entry = iommu_virt_to_phys(iommu->ga_log) | GA_LOG_SIZE_512;
820 memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_BASE_OFFSET,
821 &entry, sizeof(entry));
822 entry = (iommu_virt_to_phys(iommu->ga_log_tail) &
823 (BIT_ULL(52)-1)) & ~7ULL;
824 memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_TAIL_OFFSET,
825 &entry, sizeof(entry));
826 writel(0x00, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
827 writel(0x00, iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
828
829
819 iommu_feature_enable(iommu, CONTROL_GAINT_EN);
820 iommu_feature_enable(iommu, CONTROL_GALOG_EN);
821
822 for (i = 0; i < LOOP_TIMEOUT; ++i) {
823 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
824 if (status & (MMIO_STATUS_GALOG_RUN_MASK))
825 break;
826 }
827
830 iommu_feature_enable(iommu, CONTROL_GAINT_EN);
831 iommu_feature_enable(iommu, CONTROL_GALOG_EN);
832
833 for (i = 0; i < LOOP_TIMEOUT; ++i) {
834 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
835 if (status & (MMIO_STATUS_GALOG_RUN_MASK))
836 break;
837 }
838
828 if (i >= LOOP_TIMEOUT)
839 if (WARN_ON(i >= LOOP_TIMEOUT))
829 return -EINVAL;
830#endif /* CONFIG_IRQ_REMAP */
831 return 0;
832}
833
834static int iommu_init_ga_log(struct amd_iommu *iommu)
835{
836#ifdef CONFIG_IRQ_REMAP
840 return -EINVAL;
841#endif /* CONFIG_IRQ_REMAP */
842 return 0;
843}
844
845static int iommu_init_ga_log(struct amd_iommu *iommu)
846{
847#ifdef CONFIG_IRQ_REMAP
837 u64 entry;
838
839 if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir))
840 return 0;
841
842 iommu->ga_log = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
843 get_order(GA_LOG_SIZE));
844 if (!iommu->ga_log)
845 goto err_out;
846
847 iommu->ga_log_tail = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
848 get_order(8));
849 if (!iommu->ga_log_tail)
850 goto err_out;
851
848 if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir))
849 return 0;
850
851 iommu->ga_log = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
852 get_order(GA_LOG_SIZE));
853 if (!iommu->ga_log)
854 goto err_out;
855
856 iommu->ga_log_tail = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
857 get_order(8));
858 if (!iommu->ga_log_tail)
859 goto err_out;
860
852 entry = iommu_virt_to_phys(iommu->ga_log) | GA_LOG_SIZE_512;
853 memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_BASE_OFFSET,
854 &entry, sizeof(entry));
855 entry = (iommu_virt_to_phys(iommu->ga_log_tail) &
856 (BIT_ULL(52)-1)) & ~7ULL;
857 memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_TAIL_OFFSET,
858 &entry, sizeof(entry));
859 writel(0x00, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
860 writel(0x00, iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
861
862 return 0;
863err_out:
864 free_ga_log(iommu);
865 return -EINVAL;
866#else
867 return 0;
868#endif /* CONFIG_IRQ_REMAP */
869}

--- 2469 unchanged lines hidden ---
861 return 0;
862err_out:
863 free_ga_log(iommu);
864 return -EINVAL;
865#else
866 return 0;
867#endif /* CONFIG_IRQ_REMAP */
868}

--- 2469 unchanged lines hidden ---