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 --- |