diff options
-rw-r--r-- | arch/powerpc/boot/Makefile | 3 | ||||
-rw-r--r-- | arch/powerpc/include/asm/systbl.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/unistd.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/uapi/asm/unistd.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_32.c | 6 | ||||
-rw-r--r-- | arch/powerpc/lib/copy_32.S | 11 | ||||
-rw-r--r-- | arch/powerpc/mm/hugepage-hash64.c | 3 | ||||
-rw-r--r-- | arch/powerpc/platforms/pasemi/msi.c | 5 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/pci-ioda.c | 16 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/pci.c | 5 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/dlpar.c | 4 | ||||
-rw-r--r-- | arch/powerpc/sysdev/fsl_msi.c | 5 | ||||
-rw-r--r-- | arch/powerpc/sysdev/mpic_u3msi.c | 5 | ||||
-rw-r--r-- | arch/powerpc/sysdev/ppc4xx_msi.c | 5 | ||||
-rw-r--r-- | drivers/misc/cxl/Makefile | 2 | ||||
-rw-r--r-- | drivers/misc/cxl/pci.c | 2 | ||||
-rw-r--r-- | drivers/misc/cxl/vphb.c | 6 |
17 files changed, 65 insertions, 17 deletions
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 73eddda53b8e..4eec430d8fa8 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -28,6 +28,9 @@ BOOTCFLAGS += -m64 | |||
28 | endif | 28 | endif |
29 | ifdef CONFIG_CPU_BIG_ENDIAN | 29 | ifdef CONFIG_CPU_BIG_ENDIAN |
30 | BOOTCFLAGS += -mbig-endian | 30 | BOOTCFLAGS += -mbig-endian |
31 | else | ||
32 | BOOTCFLAGS += -mlittle-endian | ||
33 | BOOTCFLAGS += $(call cc-option,-mabi=elfv2) | ||
31 | endif | 34 | endif |
32 | 35 | ||
33 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc | 36 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 71f2b3f02cf8..4d65499ee1c1 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -368,3 +368,4 @@ SYSCALL_SPU(memfd_create) | |||
368 | SYSCALL_SPU(bpf) | 368 | SYSCALL_SPU(bpf) |
369 | COMPAT_SYS(execveat) | 369 | COMPAT_SYS(execveat) |
370 | PPC64ONLY(switch_endian) | 370 | PPC64ONLY(switch_endian) |
371 | SYSCALL_SPU(userfaultfd) | ||
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index f4f8b667d75b..4a055b6c2a64 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <uapi/asm/unistd.h> | 12 | #include <uapi/asm/unistd.h> |
13 | 13 | ||
14 | 14 | ||
15 | #define __NR_syscalls 364 | 15 | #define __NR_syscalls 365 |
16 | 16 | ||
17 | #define __NR__exit __NR_exit | 17 | #define __NR__exit __NR_exit |
18 | #define NR_syscalls __NR_syscalls | 18 | #define NR_syscalls __NR_syscalls |
diff --git a/arch/powerpc/include/uapi/asm/unistd.h b/arch/powerpc/include/uapi/asm/unistd.h index e4aa173dae62..6ad58d4c879b 100644 --- a/arch/powerpc/include/uapi/asm/unistd.h +++ b/arch/powerpc/include/uapi/asm/unistd.h | |||
@@ -386,5 +386,6 @@ | |||
386 | #define __NR_bpf 361 | 386 | #define __NR_bpf 361 |
387 | #define __NR_execveat 362 | 387 | #define __NR_execveat 362 |
388 | #define __NR_switch_endian 363 | 388 | #define __NR_switch_endian 363 |
389 | #define __NR_userfaultfd 364 | ||
389 | 390 | ||
390 | #endif /* _UAPI_ASM_POWERPC_UNISTD_H_ */ | 391 | #endif /* _UAPI_ASM_POWERPC_UNISTD_H_ */ |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index bb02e9f6944e..ad8c9db61237 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/udbg.h> | 38 | #include <asm/udbg.h> |
39 | #include <asm/mmu_context.h> | 39 | #include <asm/mmu_context.h> |
40 | #include <asm/epapr_hcalls.h> | 40 | #include <asm/epapr_hcalls.h> |
41 | #include <asm/code-patching.h> | ||
41 | 42 | ||
42 | #define DBG(fmt...) | 43 | #define DBG(fmt...) |
43 | 44 | ||
@@ -109,6 +110,8 @@ notrace unsigned long __init early_init(unsigned long dt_ptr) | |||
109 | * This is called very early on the boot process, after a minimal | 110 | * This is called very early on the boot process, after a minimal |
110 | * MMU environment has been set up but before MMU_init is called. | 111 | * MMU environment has been set up but before MMU_init is called. |
111 | */ | 112 | */ |
113 | extern unsigned int memset_nocache_branch; /* Insn to be replaced by NOP */ | ||
114 | |||
112 | notrace void __init machine_init(u64 dt_ptr) | 115 | notrace void __init machine_init(u64 dt_ptr) |
113 | { | 116 | { |
114 | lockdep_init(); | 117 | lockdep_init(); |
@@ -116,6 +119,9 @@ notrace void __init machine_init(u64 dt_ptr) | |||
116 | /* Enable early debugging if any specified (see udbg.h) */ | 119 | /* Enable early debugging if any specified (see udbg.h) */ |
117 | udbg_early_init(); | 120 | udbg_early_init(); |
118 | 121 | ||
122 | patch_instruction((unsigned int *)&memcpy, PPC_INST_NOP); | ||
123 | patch_instruction(&memset_nocache_branch, PPC_INST_NOP); | ||
124 | |||
119 | /* Do some early initialization based on the flat device tree */ | 125 | /* Do some early initialization based on the flat device tree */ |
120 | early_init_devtree(__va(dt_ptr)); | 126 | early_init_devtree(__va(dt_ptr)); |
121 | 127 | ||
diff --git a/arch/powerpc/lib/copy_32.S b/arch/powerpc/lib/copy_32.S index 2ef50c629470..c44df2dbedd5 100644 --- a/arch/powerpc/lib/copy_32.S +++ b/arch/powerpc/lib/copy_32.S | |||
@@ -73,6 +73,10 @@ CACHELINE_MASK = (L1_CACHE_BYTES-1) | |||
73 | * Use dcbz on the complete cache lines in the destination | 73 | * Use dcbz on the complete cache lines in the destination |
74 | * to set them to zero. This requires that the destination | 74 | * to set them to zero. This requires that the destination |
75 | * area is cacheable. -- paulus | 75 | * area is cacheable. -- paulus |
76 | * | ||
77 | * During early init, cache might not be active yet, so dcbz cannot be used. | ||
78 | * We therefore skip the optimised bloc that uses dcbz. This jump is | ||
79 | * replaced by a nop once cache is active. This is done in machine_init() | ||
76 | */ | 80 | */ |
77 | _GLOBAL(memset) | 81 | _GLOBAL(memset) |
78 | rlwimi r4,r4,8,16,23 | 82 | rlwimi r4,r4,8,16,23 |
@@ -88,6 +92,8 @@ _GLOBAL(memset) | |||
88 | subf r6,r0,r6 | 92 | subf r6,r0,r6 |
89 | cmplwi 0,r4,0 | 93 | cmplwi 0,r4,0 |
90 | bne 2f /* Use normal procedure if r4 is not zero */ | 94 | bne 2f /* Use normal procedure if r4 is not zero */ |
95 | _GLOBAL(memset_nocache_branch) | ||
96 | b 2f /* Skip optimised bloc until cache is enabled */ | ||
91 | 97 | ||
92 | clrlwi r7,r6,32-LG_CACHELINE_BYTES | 98 | clrlwi r7,r6,32-LG_CACHELINE_BYTES |
93 | add r8,r7,r5 | 99 | add r8,r7,r5 |
@@ -128,6 +134,10 @@ _GLOBAL(memset) | |||
128 | * the destination area is cacheable. | 134 | * the destination area is cacheable. |
129 | * We only use this version if the source and dest don't overlap. | 135 | * We only use this version if the source and dest don't overlap. |
130 | * -- paulus. | 136 | * -- paulus. |
137 | * | ||
138 | * During early init, cache might not be active yet, so dcbz cannot be used. | ||
139 | * We therefore jump to generic_memcpy which doesn't use dcbz. This jump is | ||
140 | * replaced by a nop once cache is active. This is done in machine_init() | ||
131 | */ | 141 | */ |
132 | _GLOBAL(memmove) | 142 | _GLOBAL(memmove) |
133 | cmplw 0,r3,r4 | 143 | cmplw 0,r3,r4 |
@@ -135,6 +145,7 @@ _GLOBAL(memmove) | |||
135 | /* fall through */ | 145 | /* fall through */ |
136 | 146 | ||
137 | _GLOBAL(memcpy) | 147 | _GLOBAL(memcpy) |
148 | b generic_memcpy | ||
138 | add r7,r3,r5 /* test if the src & dst overlap */ | 149 | add r7,r3,r5 /* test if the src & dst overlap */ |
139 | add r8,r4,r5 | 150 | add r8,r4,r5 |
140 | cmplw 0,r4,r7 | 151 | cmplw 0,r4,r7 |
diff --git a/arch/powerpc/mm/hugepage-hash64.c b/arch/powerpc/mm/hugepage-hash64.c index 43dafb9d6a46..4d87122cf6a7 100644 --- a/arch/powerpc/mm/hugepage-hash64.c +++ b/arch/powerpc/mm/hugepage-hash64.c | |||
@@ -85,7 +85,6 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, | |||
85 | BUG_ON(index >= 4096); | 85 | BUG_ON(index >= 4096); |
86 | 86 | ||
87 | vpn = hpt_vpn(ea, vsid, ssize); | 87 | vpn = hpt_vpn(ea, vsid, ssize); |
88 | hash = hpt_hash(vpn, shift, ssize); | ||
89 | hpte_slot_array = get_hpte_slot_array(pmdp); | 88 | hpte_slot_array = get_hpte_slot_array(pmdp); |
90 | if (psize == MMU_PAGE_4K) { | 89 | if (psize == MMU_PAGE_4K) { |
91 | /* | 90 | /* |
@@ -101,6 +100,7 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, | |||
101 | valid = hpte_valid(hpte_slot_array, index); | 100 | valid = hpte_valid(hpte_slot_array, index); |
102 | if (valid) { | 101 | if (valid) { |
103 | /* update the hpte bits */ | 102 | /* update the hpte bits */ |
103 | hash = hpt_hash(vpn, shift, ssize); | ||
104 | hidx = hpte_hash_index(hpte_slot_array, index); | 104 | hidx = hpte_hash_index(hpte_slot_array, index); |
105 | if (hidx & _PTEIDX_SECONDARY) | 105 | if (hidx & _PTEIDX_SECONDARY) |
106 | hash = ~hash; | 106 | hash = ~hash; |
@@ -126,6 +126,7 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, | |||
126 | if (!valid) { | 126 | if (!valid) { |
127 | unsigned long hpte_group; | 127 | unsigned long hpte_group; |
128 | 128 | ||
129 | hash = hpt_hash(vpn, shift, ssize); | ||
129 | /* insert new entry */ | 130 | /* insert new entry */ |
130 | pa = pmd_pfn(__pmd(old_pmd)) << PAGE_SHIFT; | 131 | pa = pmd_pfn(__pmd(old_pmd)) << PAGE_SHIFT; |
131 | new_pmd |= _PAGE_HASHPTE; | 132 | new_pmd |= _PAGE_HASHPTE; |
diff --git a/arch/powerpc/platforms/pasemi/msi.c b/arch/powerpc/platforms/pasemi/msi.c index e66ef1943338..b304a9fe55cc 100644 --- a/arch/powerpc/platforms/pasemi/msi.c +++ b/arch/powerpc/platforms/pasemi/msi.c | |||
@@ -63,6 +63,7 @@ static struct irq_chip mpic_pasemi_msi_chip = { | |||
63 | static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev) | 63 | static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev) |
64 | { | 64 | { |
65 | struct msi_desc *entry; | 65 | struct msi_desc *entry; |
66 | irq_hw_number_t hwirq; | ||
66 | 67 | ||
67 | pr_debug("pasemi_msi_teardown_msi_irqs, pdev %p\n", pdev); | 68 | pr_debug("pasemi_msi_teardown_msi_irqs, pdev %p\n", pdev); |
68 | 69 | ||
@@ -70,10 +71,10 @@ static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev) | |||
70 | if (entry->irq == NO_IRQ) | 71 | if (entry->irq == NO_IRQ) |
71 | continue; | 72 | continue; |
72 | 73 | ||
74 | hwirq = virq_to_hw(entry->irq); | ||
73 | irq_set_msi_desc(entry->irq, NULL); | 75 | irq_set_msi_desc(entry->irq, NULL); |
74 | msi_bitmap_free_hwirqs(&msi_mpic->msi_bitmap, | ||
75 | virq_to_hw(entry->irq), ALLOC_CHUNK); | ||
76 | irq_dispose_mapping(entry->irq); | 76 | irq_dispose_mapping(entry->irq); |
77 | msi_bitmap_free_hwirqs(&msi_mpic->msi_bitmap, hwirq, ALLOC_CHUNK); | ||
77 | } | 78 | } |
78 | 79 | ||
79 | return; | 80 | return; |
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 2927cd5c8303..414fd1a00fda 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -2049,9 +2049,23 @@ static long pnv_pci_ioda2_setup_default_config(struct pnv_ioda_pe *pe) | |||
2049 | struct iommu_table *tbl = NULL; | 2049 | struct iommu_table *tbl = NULL; |
2050 | long rc; | 2050 | long rc; |
2051 | 2051 | ||
2052 | /* | ||
2053 | * crashkernel= specifies the kdump kernel's maximum memory at | ||
2054 | * some offset and there is no guaranteed the result is a power | ||
2055 | * of 2, which will cause errors later. | ||
2056 | */ | ||
2057 | const u64 max_memory = __rounddown_pow_of_two(memory_hotplug_max()); | ||
2058 | |||
2059 | /* | ||
2060 | * In memory constrained environments, e.g. kdump kernel, the | ||
2061 | * DMA window can be larger than available memory, which will | ||
2062 | * cause errors later. | ||
2063 | */ | ||
2064 | const u64 window_size = min((u64)pe->table_group.tce32_size, max_memory); | ||
2065 | |||
2052 | rc = pnv_pci_ioda2_create_table(&pe->table_group, 0, | 2066 | rc = pnv_pci_ioda2_create_table(&pe->table_group, 0, |
2053 | IOMMU_PAGE_SHIFT_4K, | 2067 | IOMMU_PAGE_SHIFT_4K, |
2054 | pe->table_group.tce32_size, | 2068 | window_size, |
2055 | POWERNV_IOMMU_DEFAULT_LEVELS, &tbl); | 2069 | POWERNV_IOMMU_DEFAULT_LEVELS, &tbl); |
2056 | if (rc) { | 2070 | if (rc) { |
2057 | pe_err(pe, "Failed to create 32-bit TCE table, err %ld", | 2071 | pe_err(pe, "Failed to create 32-bit TCE table, err %ld", |
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 9b2480b265c0..f2dd77234240 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
@@ -99,6 +99,7 @@ void pnv_teardown_msi_irqs(struct pci_dev *pdev) | |||
99 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); | 99 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); |
100 | struct pnv_phb *phb = hose->private_data; | 100 | struct pnv_phb *phb = hose->private_data; |
101 | struct msi_desc *entry; | 101 | struct msi_desc *entry; |
102 | irq_hw_number_t hwirq; | ||
102 | 103 | ||
103 | if (WARN_ON(!phb)) | 104 | if (WARN_ON(!phb)) |
104 | return; | 105 | return; |
@@ -106,10 +107,10 @@ void pnv_teardown_msi_irqs(struct pci_dev *pdev) | |||
106 | for_each_pci_msi_entry(entry, pdev) { | 107 | for_each_pci_msi_entry(entry, pdev) { |
107 | if (entry->irq == NO_IRQ) | 108 | if (entry->irq == NO_IRQ) |
108 | continue; | 109 | continue; |
110 | hwirq = virq_to_hw(entry->irq); | ||
109 | irq_set_msi_desc(entry->irq, NULL); | 111 | irq_set_msi_desc(entry->irq, NULL); |
110 | msi_bitmap_free_hwirqs(&phb->msi_bmp, | ||
111 | virq_to_hw(entry->irq) - phb->msi_base, 1); | ||
112 | irq_dispose_mapping(entry->irq); | 112 | irq_dispose_mapping(entry->irq); |
113 | msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq - phb->msi_base, 1); | ||
113 | } | 114 | } |
114 | } | 115 | } |
115 | #endif /* CONFIG_PCI_MSI */ | 116 | #endif /* CONFIG_PCI_MSI */ |
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c index 47d9cebe7159..db17827eb746 100644 --- a/arch/powerpc/platforms/pseries/dlpar.c +++ b/arch/powerpc/platforms/pseries/dlpar.c | |||
@@ -422,8 +422,10 @@ static ssize_t dlpar_cpu_probe(const char *buf, size_t count) | |||
422 | 422 | ||
423 | dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent); | 423 | dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent); |
424 | of_node_put(parent); | 424 | of_node_put(parent); |
425 | if (!dn) | 425 | if (!dn) { |
426 | dlpar_release_drc(drc_index); | ||
426 | return -EINVAL; | 427 | return -EINVAL; |
428 | } | ||
427 | 429 | ||
428 | rc = dlpar_attach_node(dn); | 430 | rc = dlpar_attach_node(dn); |
429 | if (rc) { | 431 | if (rc) { |
diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c index 5916da1856a7..48a576aa47b9 100644 --- a/arch/powerpc/sysdev/fsl_msi.c +++ b/arch/powerpc/sysdev/fsl_msi.c | |||
@@ -128,15 +128,16 @@ static void fsl_teardown_msi_irqs(struct pci_dev *pdev) | |||
128 | { | 128 | { |
129 | struct msi_desc *entry; | 129 | struct msi_desc *entry; |
130 | struct fsl_msi *msi_data; | 130 | struct fsl_msi *msi_data; |
131 | irq_hw_number_t hwirq; | ||
131 | 132 | ||
132 | for_each_pci_msi_entry(entry, pdev) { | 133 | for_each_pci_msi_entry(entry, pdev) { |
133 | if (entry->irq == NO_IRQ) | 134 | if (entry->irq == NO_IRQ) |
134 | continue; | 135 | continue; |
136 | hwirq = virq_to_hw(entry->irq); | ||
135 | msi_data = irq_get_chip_data(entry->irq); | 137 | msi_data = irq_get_chip_data(entry->irq); |
136 | irq_set_msi_desc(entry->irq, NULL); | 138 | irq_set_msi_desc(entry->irq, NULL); |
137 | msi_bitmap_free_hwirqs(&msi_data->bitmap, | ||
138 | virq_to_hw(entry->irq), 1); | ||
139 | irq_dispose_mapping(entry->irq); | 139 | irq_dispose_mapping(entry->irq); |
140 | msi_bitmap_free_hwirqs(&msi_data->bitmap, hwirq, 1); | ||
140 | } | 141 | } |
141 | 142 | ||
142 | return; | 143 | return; |
diff --git a/arch/powerpc/sysdev/mpic_u3msi.c b/arch/powerpc/sysdev/mpic_u3msi.c index 70fbd5694a8b..2cbc7e29b85f 100644 --- a/arch/powerpc/sysdev/mpic_u3msi.c +++ b/arch/powerpc/sysdev/mpic_u3msi.c | |||
@@ -107,15 +107,16 @@ static u64 find_u4_magic_addr(struct pci_dev *pdev, unsigned int hwirq) | |||
107 | static void u3msi_teardown_msi_irqs(struct pci_dev *pdev) | 107 | static void u3msi_teardown_msi_irqs(struct pci_dev *pdev) |
108 | { | 108 | { |
109 | struct msi_desc *entry; | 109 | struct msi_desc *entry; |
110 | irq_hw_number_t hwirq; | ||
110 | 111 | ||
111 | for_each_pci_msi_entry(entry, pdev) { | 112 | for_each_pci_msi_entry(entry, pdev) { |
112 | if (entry->irq == NO_IRQ) | 113 | if (entry->irq == NO_IRQ) |
113 | continue; | 114 | continue; |
114 | 115 | ||
116 | hwirq = virq_to_hw(entry->irq); | ||
115 | irq_set_msi_desc(entry->irq, NULL); | 117 | irq_set_msi_desc(entry->irq, NULL); |
116 | msi_bitmap_free_hwirqs(&msi_mpic->msi_bitmap, | ||
117 | virq_to_hw(entry->irq), 1); | ||
118 | irq_dispose_mapping(entry->irq); | 118 | irq_dispose_mapping(entry->irq); |
119 | msi_bitmap_free_hwirqs(&msi_mpic->msi_bitmap, hwirq, 1); | ||
119 | } | 120 | } |
120 | 121 | ||
121 | return; | 122 | return; |
diff --git a/arch/powerpc/sysdev/ppc4xx_msi.c b/arch/powerpc/sysdev/ppc4xx_msi.c index 24d0470c1698..8fb806135043 100644 --- a/arch/powerpc/sysdev/ppc4xx_msi.c +++ b/arch/powerpc/sysdev/ppc4xx_msi.c | |||
@@ -124,16 +124,17 @@ void ppc4xx_teardown_msi_irqs(struct pci_dev *dev) | |||
124 | { | 124 | { |
125 | struct msi_desc *entry; | 125 | struct msi_desc *entry; |
126 | struct ppc4xx_msi *msi_data = &ppc4xx_msi; | 126 | struct ppc4xx_msi *msi_data = &ppc4xx_msi; |
127 | irq_hw_number_t hwirq; | ||
127 | 128 | ||
128 | dev_dbg(&dev->dev, "PCIE-MSI: tearing down msi irqs\n"); | 129 | dev_dbg(&dev->dev, "PCIE-MSI: tearing down msi irqs\n"); |
129 | 130 | ||
130 | for_each_pci_msi_entry(entry, dev) { | 131 | for_each_pci_msi_entry(entry, dev) { |
131 | if (entry->irq == NO_IRQ) | 132 | if (entry->irq == NO_IRQ) |
132 | continue; | 133 | continue; |
134 | hwirq = virq_to_hw(entry->irq); | ||
133 | irq_set_msi_desc(entry->irq, NULL); | 135 | irq_set_msi_desc(entry->irq, NULL); |
134 | msi_bitmap_free_hwirqs(&msi_data->bitmap, | ||
135 | virq_to_hw(entry->irq), 1); | ||
136 | irq_dispose_mapping(entry->irq); | 136 | irq_dispose_mapping(entry->irq); |
137 | msi_bitmap_free_hwirqs(&msi_data->bitmap, hwirq, 1); | ||
137 | } | 138 | } |
138 | } | 139 | } |
139 | 140 | ||
diff --git a/drivers/misc/cxl/Makefile b/drivers/misc/cxl/Makefile index 6f484dfe78f9..6982f603fadc 100644 --- a/drivers/misc/cxl/Makefile +++ b/drivers/misc/cxl/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | ccflags-y := -Werror | 1 | ccflags-y := -Werror -Wno-unused-const-variable |
2 | 2 | ||
3 | cxl-y += main.o file.o irq.o fault.o native.o | 3 | cxl-y += main.o file.o irq.o fault.o native.o |
4 | cxl-y += context.o sysfs.o debugfs.o pci.o trace.o | 4 | cxl-y += context.o sysfs.o debugfs.o pci.o trace.o |
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index 02c85160bfe9..a5e977192b61 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c | |||
@@ -1249,8 +1249,6 @@ static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
1249 | int slice; | 1249 | int slice; |
1250 | int rc; | 1250 | int rc; |
1251 | 1251 | ||
1252 | pci_dev_get(dev); | ||
1253 | |||
1254 | if (cxl_verbose) | 1252 | if (cxl_verbose) |
1255 | dump_cxl_config_space(dev); | 1253 | dump_cxl_config_space(dev); |
1256 | 1254 | ||
diff --git a/drivers/misc/cxl/vphb.c b/drivers/misc/cxl/vphb.c index 6dd16a6d153f..94b520896b18 100644 --- a/drivers/misc/cxl/vphb.c +++ b/drivers/misc/cxl/vphb.c | |||
@@ -48,6 +48,12 @@ static bool cxl_pci_enable_device_hook(struct pci_dev *dev) | |||
48 | 48 | ||
49 | phb = pci_bus_to_host(dev->bus); | 49 | phb = pci_bus_to_host(dev->bus); |
50 | afu = (struct cxl_afu *)phb->private_data; | 50 | afu = (struct cxl_afu *)phb->private_data; |
51 | |||
52 | if (!cxl_adapter_link_ok(afu->adapter)) { | ||
53 | dev_warn(&dev->dev, "%s: Device link is down, refusing to enable AFU\n", __func__); | ||
54 | return false; | ||
55 | } | ||
56 | |||
51 | set_dma_ops(&dev->dev, &dma_direct_ops); | 57 | set_dma_ops(&dev->dev, &dma_direct_ops); |
52 | set_dma_offset(&dev->dev, PAGE_OFFSET); | 58 | set_dma_offset(&dev->dev, PAGE_OFFSET); |
53 | 59 | ||