diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-12 13:34:20 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-12 13:34:20 -0500 |
commit | a971526e4db7992362e938e53e2deb57e847ecc9 (patch) | |
tree | 4ad2426b163d29335d21e8d43cfc7df601332740 | |
parent | 7807563183c4c1bec1bcc815e8bcc40d807c81b7 (diff) | |
parent | 78c0cbffebe60e1182c8f077de2c06a1a48dc5ae (diff) |
Merge branch 'parisc-4.4-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc fixes from Helge Deller:
"Fix the boot crash on Mako machines with Huge Pages, prevent a panic
with SATA controllers (and others) by correctly calculating the IOMMU
space, hook up the mlock2 syscall and drop unneeded code in the parisc
pci code"
* 'parisc-4.4-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
parisc: Disable huge pages on Mako machines
parisc: Wire up mlock2 syscall
parisc: Remove unused pcibios_init_bus()
parisc iommu: fix panic due to trying to allocate too large region
-rw-r--r-- | arch/parisc/include/asm/pgtable.h | 3 | ||||
-rw-r--r-- | arch/parisc/include/uapi/asm/unistd.h | 3 | ||||
-rw-r--r-- | arch/parisc/kernel/pci.c | 18 | ||||
-rw-r--r-- | arch/parisc/kernel/syscall_table.S | 1 | ||||
-rw-r--r-- | drivers/parisc/iommu-helpers.h | 15 |
5 files changed, 13 insertions, 27 deletions
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h index d8534f95915a..291cee28ccb6 100644 --- a/arch/parisc/include/asm/pgtable.h +++ b/arch/parisc/include/asm/pgtable.h | |||
@@ -372,7 +372,8 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; } | |||
372 | */ | 372 | */ |
373 | #ifdef CONFIG_HUGETLB_PAGE | 373 | #ifdef CONFIG_HUGETLB_PAGE |
374 | #define pte_huge(pte) (pte_val(pte) & _PAGE_HUGE) | 374 | #define pte_huge(pte) (pte_val(pte) & _PAGE_HUGE) |
375 | #define pte_mkhuge(pte) (__pte(pte_val(pte) | _PAGE_HUGE)) | 375 | #define pte_mkhuge(pte) (__pte(pte_val(pte) | \ |
376 | (parisc_requires_coherency() ? 0 : _PAGE_HUGE))) | ||
376 | #else | 377 | #else |
377 | #define pte_huge(pte) (0) | 378 | #define pte_huge(pte) (0) |
378 | #define pte_mkhuge(pte) (pte) | 379 | #define pte_mkhuge(pte) (pte) |
diff --git a/arch/parisc/include/uapi/asm/unistd.h b/arch/parisc/include/uapi/asm/unistd.h index 33170384d3ac..35bdccbb2036 100644 --- a/arch/parisc/include/uapi/asm/unistd.h +++ b/arch/parisc/include/uapi/asm/unistd.h | |||
@@ -360,8 +360,9 @@ | |||
360 | #define __NR_execveat (__NR_Linux + 342) | 360 | #define __NR_execveat (__NR_Linux + 342) |
361 | #define __NR_membarrier (__NR_Linux + 343) | 361 | #define __NR_membarrier (__NR_Linux + 343) |
362 | #define __NR_userfaultfd (__NR_Linux + 344) | 362 | #define __NR_userfaultfd (__NR_Linux + 344) |
363 | #define __NR_mlock2 (__NR_Linux + 345) | ||
363 | 364 | ||
364 | #define __NR_Linux_syscalls (__NR_userfaultfd + 1) | 365 | #define __NR_Linux_syscalls (__NR_mlock2 + 1) |
365 | 366 | ||
366 | 367 | ||
367 | #define __IGNORE_select /* newselect */ | 368 | #define __IGNORE_select /* newselect */ |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 64f2764a8cef..c99f3dde455c 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
@@ -171,24 +171,6 @@ void pcibios_set_master(struct pci_dev *dev) | |||
171 | } | 171 | } |
172 | 172 | ||
173 | 173 | ||
174 | void __init pcibios_init_bus(struct pci_bus *bus) | ||
175 | { | ||
176 | struct pci_dev *dev = bus->self; | ||
177 | unsigned short bridge_ctl; | ||
178 | |||
179 | /* We deal only with pci controllers and pci-pci bridges. */ | ||
180 | if (!dev || (dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
181 | return; | ||
182 | |||
183 | /* PCI-PCI bridge - set the cache line and default latency | ||
184 | (32) for primary and secondary buses. */ | ||
185 | pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 32); | ||
186 | |||
187 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bridge_ctl); | ||
188 | bridge_ctl |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR; | ||
189 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bridge_ctl); | ||
190 | } | ||
191 | |||
192 | /* | 174 | /* |
193 | * pcibios align resources() is called every time generic PCI code | 175 | * pcibios align resources() is called every time generic PCI code |
194 | * wants to generate a new address. The process of looking for | 176 | * wants to generate a new address. The process of looking for |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 78c3ef8c348d..d4ffcfbc9885 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -440,6 +440,7 @@ | |||
440 | ENTRY_COMP(execveat) | 440 | ENTRY_COMP(execveat) |
441 | ENTRY_SAME(membarrier) | 441 | ENTRY_SAME(membarrier) |
442 | ENTRY_SAME(userfaultfd) | 442 | ENTRY_SAME(userfaultfd) |
443 | ENTRY_SAME(mlock2) /* 345 */ | ||
443 | 444 | ||
444 | 445 | ||
445 | .ifne (. - 90b) - (__NR_Linux_syscalls * (91b - 90b)) | 446 | .ifne (. - 90b) - (__NR_Linux_syscalls * (91b - 90b)) |
diff --git a/drivers/parisc/iommu-helpers.h b/drivers/parisc/iommu-helpers.h index 761e77bfce5d..e56f1569f6c3 100644 --- a/drivers/parisc/iommu-helpers.h +++ b/drivers/parisc/iommu-helpers.h | |||
@@ -104,7 +104,11 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | |||
104 | struct scatterlist *contig_sg; /* contig chunk head */ | 104 | struct scatterlist *contig_sg; /* contig chunk head */ |
105 | unsigned long dma_offset, dma_len; /* start/len of DMA stream */ | 105 | unsigned long dma_offset, dma_len; /* start/len of DMA stream */ |
106 | unsigned int n_mappings = 0; | 106 | unsigned int n_mappings = 0; |
107 | unsigned int max_seg_size = dma_get_max_seg_size(dev); | 107 | unsigned int max_seg_size = min(dma_get_max_seg_size(dev), |
108 | (unsigned)DMA_CHUNK_SIZE); | ||
109 | unsigned int max_seg_boundary = dma_get_seg_boundary(dev) + 1; | ||
110 | if (max_seg_boundary) /* check if the addition above didn't overflow */ | ||
111 | max_seg_size = min(max_seg_size, max_seg_boundary); | ||
108 | 112 | ||
109 | while (nents > 0) { | 113 | while (nents > 0) { |
110 | 114 | ||
@@ -138,14 +142,11 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | |||
138 | 142 | ||
139 | /* | 143 | /* |
140 | ** First make sure current dma stream won't | 144 | ** First make sure current dma stream won't |
141 | ** exceed DMA_CHUNK_SIZE if we coalesce the | 145 | ** exceed max_seg_size if we coalesce the |
142 | ** next entry. | 146 | ** next entry. |
143 | */ | 147 | */ |
144 | if(unlikely(ALIGN(dma_len + dma_offset + startsg->length, | 148 | if (unlikely(ALIGN(dma_len + dma_offset + startsg->length, IOVP_SIZE) > |
145 | IOVP_SIZE) > DMA_CHUNK_SIZE)) | 149 | max_seg_size)) |
146 | break; | ||
147 | |||
148 | if (startsg->length + dma_len > max_seg_size) | ||
149 | break; | 150 | break; |
150 | 151 | ||
151 | /* | 152 | /* |