diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/alpha/include/asm/fcntl.h | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/core_marvel.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/core_titan.c | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/pci_impl.h | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/pci_iommu.c | 4 | ||||
-rw-r--r-- | arch/arm/include/asm/hardware/iop3xx-adma.h | 81 | ||||
-rw-r--r-- | arch/arm/include/asm/hardware/iop_adma.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/include/mach/adma.h | 119 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/setup.c | 17 | ||||
-rw-r--r-- | arch/arm/plat-iop/adma.c | 4 | ||||
-rw-r--r-- | arch/frv/kernel/pm.c | 14 | ||||
-rw-r--r-- | arch/mips/lasat/sysctl.c | 18 | ||||
-rw-r--r-- | arch/parisc/include/asm/fcntl.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fsldma.h | 136 | ||||
-rw-r--r-- | arch/s390/appldata/appldata_base.c | 9 | ||||
-rw-r--r-- | arch/s390/kernel/debug.c | 4 | ||||
-rw-r--r-- | arch/s390/mm/cmm.c | 4 | ||||
-rw-r--r-- | arch/sh/drivers/dma/Kconfig | 12 | ||||
-rw-r--r-- | arch/sh/drivers/dma/Makefile | 3 | ||||
-rw-r--r-- | arch/sh/include/asm/dma-sh.h | 13 | ||||
-rw-r--r-- | arch/x86/include/asm/nmi.h | 3 | ||||
-rw-r--r-- | arch/x86/kernel/apic/nmi.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/vsyscall_64.c | 10 | ||||
-rw-r--r-- | arch/x86/mm/fault.c | 19 |
24 files changed, 413 insertions, 74 deletions
diff --git a/arch/alpha/include/asm/fcntl.h b/arch/alpha/include/asm/fcntl.h index 25da0017ec87..e42823e954aa 100644 --- a/arch/alpha/include/asm/fcntl.h +++ b/arch/alpha/include/asm/fcntl.h | |||
@@ -26,6 +26,8 @@ | |||
26 | #define F_GETOWN 6 /* for sockets. */ | 26 | #define F_GETOWN 6 /* for sockets. */ |
27 | #define F_SETSIG 10 /* for sockets. */ | 27 | #define F_SETSIG 10 /* for sockets. */ |
28 | #define F_GETSIG 11 /* for sockets. */ | 28 | #define F_GETSIG 11 /* for sockets. */ |
29 | #define F_SETOWN_EX 12 | ||
30 | #define F_GETOWN_EX 13 | ||
29 | 31 | ||
30 | /* for posix fcntl() and lockf() */ | 32 | /* for posix fcntl() and lockf() */ |
31 | #define F_RDLCK 1 | 33 | #define F_RDLCK 1 |
diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c index e302daecbe56..8e059e58b0ac 100644 --- a/arch/alpha/kernel/core_marvel.c +++ b/arch/alpha/kernel/core_marvel.c | |||
@@ -1016,7 +1016,7 @@ marvel_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *m | |||
1016 | { | 1016 | { |
1017 | struct marvel_agp_aperture *aper = agp->aperture.sysdata; | 1017 | struct marvel_agp_aperture *aper = agp->aperture.sysdata; |
1018 | return iommu_bind(aper->arena, aper->pg_start + pg_start, | 1018 | return iommu_bind(aper->arena, aper->pg_start + pg_start, |
1019 | mem->page_count, mem->memory); | 1019 | mem->page_count, mem->pages); |
1020 | } | 1020 | } |
1021 | 1021 | ||
1022 | static int | 1022 | static int |
diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c index 319fcb74611e..76686497b1e2 100644 --- a/arch/alpha/kernel/core_titan.c +++ b/arch/alpha/kernel/core_titan.c | |||
@@ -680,7 +680,7 @@ titan_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *me | |||
680 | { | 680 | { |
681 | struct titan_agp_aperture *aper = agp->aperture.sysdata; | 681 | struct titan_agp_aperture *aper = agp->aperture.sysdata; |
682 | return iommu_bind(aper->arena, aper->pg_start + pg_start, | 682 | return iommu_bind(aper->arena, aper->pg_start + pg_start, |
683 | mem->page_count, mem->memory); | 683 | mem->page_count, mem->pages); |
684 | } | 684 | } |
685 | 685 | ||
686 | static int | 686 | static int |
diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index 00edd04b585e..85457b2d4516 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h | |||
@@ -198,7 +198,7 @@ extern unsigned long size_for_memory(unsigned long max); | |||
198 | 198 | ||
199 | extern int iommu_reserve(struct pci_iommu_arena *, long, long); | 199 | extern int iommu_reserve(struct pci_iommu_arena *, long, long); |
200 | extern int iommu_release(struct pci_iommu_arena *, long, long); | 200 | extern int iommu_release(struct pci_iommu_arena *, long, long); |
201 | extern int iommu_bind(struct pci_iommu_arena *, long, long, unsigned long *); | 201 | extern int iommu_bind(struct pci_iommu_arena *, long, long, struct page **); |
202 | extern int iommu_unbind(struct pci_iommu_arena *, long, long); | 202 | extern int iommu_unbind(struct pci_iommu_arena *, long, long); |
203 | 203 | ||
204 | 204 | ||
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index d15aedfe6066..8449504f5e0b 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c | |||
@@ -876,7 +876,7 @@ iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count) | |||
876 | 876 | ||
877 | int | 877 | int |
878 | iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, | 878 | iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, |
879 | unsigned long *physaddrs) | 879 | struct page **pages) |
880 | { | 880 | { |
881 | unsigned long flags; | 881 | unsigned long flags; |
882 | unsigned long *ptes; | 882 | unsigned long *ptes; |
@@ -896,7 +896,7 @@ iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, | |||
896 | } | 896 | } |
897 | 897 | ||
898 | for(i = 0, j = pg_start; i < pg_count; i++, j++) | 898 | for(i = 0, j = pg_start; i < pg_count; i++, j++) |
899 | ptes[j] = mk_iommu_pte(physaddrs[i]); | 899 | ptes[j] = mk_iommu_pte(page_to_phys(pages[i])); |
900 | 900 | ||
901 | spin_unlock_irqrestore(&arena->lock, flags); | 901 | spin_unlock_irqrestore(&arena->lock, flags); |
902 | 902 | ||
diff --git a/arch/arm/include/asm/hardware/iop3xx-adma.h b/arch/arm/include/asm/hardware/iop3xx-adma.h index 83e6ba338e2c..1a8c7279a28b 100644 --- a/arch/arm/include/asm/hardware/iop3xx-adma.h +++ b/arch/arm/include/asm/hardware/iop3xx-adma.h | |||
@@ -187,11 +187,74 @@ union iop3xx_desc { | |||
187 | void *ptr; | 187 | void *ptr; |
188 | }; | 188 | }; |
189 | 189 | ||
190 | /* No support for p+q operations */ | ||
191 | static inline int | ||
192 | iop_chan_pq_slot_count(size_t len, int src_cnt, int *slots_per_op) | ||
193 | { | ||
194 | BUG(); | ||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | static inline void | ||
199 | iop_desc_init_pq(struct iop_adma_desc_slot *desc, int src_cnt, | ||
200 | unsigned long flags) | ||
201 | { | ||
202 | BUG(); | ||
203 | } | ||
204 | |||
205 | static inline void | ||
206 | iop_desc_set_pq_addr(struct iop_adma_desc_slot *desc, dma_addr_t *addr) | ||
207 | { | ||
208 | BUG(); | ||
209 | } | ||
210 | |||
211 | static inline void | ||
212 | iop_desc_set_pq_src_addr(struct iop_adma_desc_slot *desc, int src_idx, | ||
213 | dma_addr_t addr, unsigned char coef) | ||
214 | { | ||
215 | BUG(); | ||
216 | } | ||
217 | |||
218 | static inline int | ||
219 | iop_chan_pq_zero_sum_slot_count(size_t len, int src_cnt, int *slots_per_op) | ||
220 | { | ||
221 | BUG(); | ||
222 | return 0; | ||
223 | } | ||
224 | |||
225 | static inline void | ||
226 | iop_desc_init_pq_zero_sum(struct iop_adma_desc_slot *desc, int src_cnt, | ||
227 | unsigned long flags) | ||
228 | { | ||
229 | BUG(); | ||
230 | } | ||
231 | |||
232 | static inline void | ||
233 | iop_desc_set_pq_zero_sum_byte_count(struct iop_adma_desc_slot *desc, u32 len) | ||
234 | { | ||
235 | BUG(); | ||
236 | } | ||
237 | |||
238 | #define iop_desc_set_pq_zero_sum_src_addr iop_desc_set_pq_src_addr | ||
239 | |||
240 | static inline void | ||
241 | iop_desc_set_pq_zero_sum_addr(struct iop_adma_desc_slot *desc, int pq_idx, | ||
242 | dma_addr_t *src) | ||
243 | { | ||
244 | BUG(); | ||
245 | } | ||
246 | |||
190 | static inline int iop_adma_get_max_xor(void) | 247 | static inline int iop_adma_get_max_xor(void) |
191 | { | 248 | { |
192 | return 32; | 249 | return 32; |
193 | } | 250 | } |
194 | 251 | ||
252 | static inline int iop_adma_get_max_pq(void) | ||
253 | { | ||
254 | BUG(); | ||
255 | return 0; | ||
256 | } | ||
257 | |||
195 | static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan) | 258 | static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan) |
196 | { | 259 | { |
197 | int id = chan->device->id; | 260 | int id = chan->device->id; |
@@ -332,6 +395,11 @@ static inline int iop_chan_zero_sum_slot_count(size_t len, int src_cnt, | |||
332 | return slot_cnt; | 395 | return slot_cnt; |
333 | } | 396 | } |
334 | 397 | ||
398 | static inline int iop_desc_is_pq(struct iop_adma_desc_slot *desc) | ||
399 | { | ||
400 | return 0; | ||
401 | } | ||
402 | |||
335 | static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, | 403 | static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, |
336 | struct iop_adma_chan *chan) | 404 | struct iop_adma_chan *chan) |
337 | { | 405 | { |
@@ -349,6 +417,14 @@ static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, | |||
349 | return 0; | 417 | return 0; |
350 | } | 418 | } |
351 | 419 | ||
420 | |||
421 | static inline u32 iop_desc_get_qdest_addr(struct iop_adma_desc_slot *desc, | ||
422 | struct iop_adma_chan *chan) | ||
423 | { | ||
424 | BUG(); | ||
425 | return 0; | ||
426 | } | ||
427 | |||
352 | static inline u32 iop_desc_get_byte_count(struct iop_adma_desc_slot *desc, | 428 | static inline u32 iop_desc_get_byte_count(struct iop_adma_desc_slot *desc, |
353 | struct iop_adma_chan *chan) | 429 | struct iop_adma_chan *chan) |
354 | { | 430 | { |
@@ -756,13 +832,14 @@ static inline void iop_desc_set_block_fill_val(struct iop_adma_desc_slot *desc, | |||
756 | hw_desc->src[0] = val; | 832 | hw_desc->src[0] = val; |
757 | } | 833 | } |
758 | 834 | ||
759 | static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) | 835 | static inline enum sum_check_flags |
836 | iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) | ||
760 | { | 837 | { |
761 | struct iop3xx_desc_aau *hw_desc = desc->hw_desc; | 838 | struct iop3xx_desc_aau *hw_desc = desc->hw_desc; |
762 | struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; | 839 | struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; |
763 | 840 | ||
764 | iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en)); | 841 | iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en)); |
765 | return desc_ctrl.zero_result_err; | 842 | return desc_ctrl.zero_result_err << SUM_CHECK_P; |
766 | } | 843 | } |
767 | 844 | ||
768 | static inline void iop_chan_append(struct iop_adma_chan *chan) | 845 | static inline void iop_chan_append(struct iop_adma_chan *chan) |
diff --git a/arch/arm/include/asm/hardware/iop_adma.h b/arch/arm/include/asm/hardware/iop_adma.h index 385c6e8cbbd2..59b8c3892f76 100644 --- a/arch/arm/include/asm/hardware/iop_adma.h +++ b/arch/arm/include/asm/hardware/iop_adma.h | |||
@@ -86,6 +86,7 @@ struct iop_adma_chan { | |||
86 | * @idx: pool index | 86 | * @idx: pool index |
87 | * @unmap_src_cnt: number of xor sources | 87 | * @unmap_src_cnt: number of xor sources |
88 | * @unmap_len: transaction bytecount | 88 | * @unmap_len: transaction bytecount |
89 | * @tx_list: list of descriptors that are associated with one operation | ||
89 | * @async_tx: support for the async_tx api | 90 | * @async_tx: support for the async_tx api |
90 | * @group_list: list of slots that make up a multi-descriptor transaction | 91 | * @group_list: list of slots that make up a multi-descriptor transaction |
91 | * for example transfer lengths larger than the supported hw max | 92 | * for example transfer lengths larger than the supported hw max |
@@ -102,10 +103,12 @@ struct iop_adma_desc_slot { | |||
102 | u16 idx; | 103 | u16 idx; |
103 | u16 unmap_src_cnt; | 104 | u16 unmap_src_cnt; |
104 | size_t unmap_len; | 105 | size_t unmap_len; |
106 | struct list_head tx_list; | ||
105 | struct dma_async_tx_descriptor async_tx; | 107 | struct dma_async_tx_descriptor async_tx; |
106 | union { | 108 | union { |
107 | u32 *xor_check_result; | 109 | u32 *xor_check_result; |
108 | u32 *crc32_result; | 110 | u32 *crc32_result; |
111 | u32 *pq_check_result; | ||
109 | }; | 112 | }; |
110 | }; | 113 | }; |
111 | 114 | ||
diff --git a/arch/arm/mach-iop13xx/include/mach/adma.h b/arch/arm/mach-iop13xx/include/mach/adma.h index 5722e86f2174..6d3782d85a9f 100644 --- a/arch/arm/mach-iop13xx/include/mach/adma.h +++ b/arch/arm/mach-iop13xx/include/mach/adma.h | |||
@@ -150,6 +150,8 @@ static inline int iop_adma_get_max_xor(void) | |||
150 | return 16; | 150 | return 16; |
151 | } | 151 | } |
152 | 152 | ||
153 | #define iop_adma_get_max_pq iop_adma_get_max_xor | ||
154 | |||
153 | static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan) | 155 | static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan) |
154 | { | 156 | { |
155 | return __raw_readl(ADMA_ADAR(chan)); | 157 | return __raw_readl(ADMA_ADAR(chan)); |
@@ -211,7 +213,10 @@ iop_chan_xor_slot_count(size_t len, int src_cnt, int *slots_per_op) | |||
211 | #define IOP_ADMA_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT | 213 | #define IOP_ADMA_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT |
212 | #define IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT | 214 | #define IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT |
213 | #define IOP_ADMA_XOR_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT | 215 | #define IOP_ADMA_XOR_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT |
216 | #define IOP_ADMA_PQ_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT | ||
214 | #define iop_chan_zero_sum_slot_count(l, s, o) iop_chan_xor_slot_count(l, s, o) | 217 | #define iop_chan_zero_sum_slot_count(l, s, o) iop_chan_xor_slot_count(l, s, o) |
218 | #define iop_chan_pq_slot_count iop_chan_xor_slot_count | ||
219 | #define iop_chan_pq_zero_sum_slot_count iop_chan_xor_slot_count | ||
215 | 220 | ||
216 | static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, | 221 | static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, |
217 | struct iop_adma_chan *chan) | 222 | struct iop_adma_chan *chan) |
@@ -220,6 +225,13 @@ static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, | |||
220 | return hw_desc->dest_addr; | 225 | return hw_desc->dest_addr; |
221 | } | 226 | } |
222 | 227 | ||
228 | static inline u32 iop_desc_get_qdest_addr(struct iop_adma_desc_slot *desc, | ||
229 | struct iop_adma_chan *chan) | ||
230 | { | ||
231 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | ||
232 | return hw_desc->q_dest_addr; | ||
233 | } | ||
234 | |||
223 | static inline u32 iop_desc_get_byte_count(struct iop_adma_desc_slot *desc, | 235 | static inline u32 iop_desc_get_byte_count(struct iop_adma_desc_slot *desc, |
224 | struct iop_adma_chan *chan) | 236 | struct iop_adma_chan *chan) |
225 | { | 237 | { |
@@ -319,6 +331,58 @@ iop_desc_init_zero_sum(struct iop_adma_desc_slot *desc, int src_cnt, | |||
319 | return 1; | 331 | return 1; |
320 | } | 332 | } |
321 | 333 | ||
334 | static inline void | ||
335 | iop_desc_init_pq(struct iop_adma_desc_slot *desc, int src_cnt, | ||
336 | unsigned long flags) | ||
337 | { | ||
338 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | ||
339 | union { | ||
340 | u32 value; | ||
341 | struct iop13xx_adma_desc_ctrl field; | ||
342 | } u_desc_ctrl; | ||
343 | |||
344 | u_desc_ctrl.value = 0; | ||
345 | u_desc_ctrl.field.src_select = src_cnt - 1; | ||
346 | u_desc_ctrl.field.xfer_dir = 3; /* local to internal bus */ | ||
347 | u_desc_ctrl.field.pq_xfer_en = 1; | ||
348 | u_desc_ctrl.field.p_xfer_dis = !!(flags & DMA_PREP_PQ_DISABLE_P); | ||
349 | u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT; | ||
350 | hw_desc->desc_ctrl = u_desc_ctrl.value; | ||
351 | } | ||
352 | |||
353 | static inline int iop_desc_is_pq(struct iop_adma_desc_slot *desc) | ||
354 | { | ||
355 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | ||
356 | union { | ||
357 | u32 value; | ||
358 | struct iop13xx_adma_desc_ctrl field; | ||
359 | } u_desc_ctrl; | ||
360 | |||
361 | u_desc_ctrl.value = hw_desc->desc_ctrl; | ||
362 | return u_desc_ctrl.field.pq_xfer_en; | ||
363 | } | ||
364 | |||
365 | static inline void | ||
366 | iop_desc_init_pq_zero_sum(struct iop_adma_desc_slot *desc, int src_cnt, | ||
367 | unsigned long flags) | ||
368 | { | ||
369 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | ||
370 | union { | ||
371 | u32 value; | ||
372 | struct iop13xx_adma_desc_ctrl field; | ||
373 | } u_desc_ctrl; | ||
374 | |||
375 | u_desc_ctrl.value = 0; | ||
376 | u_desc_ctrl.field.src_select = src_cnt - 1; | ||
377 | u_desc_ctrl.field.xfer_dir = 3; /* local to internal bus */ | ||
378 | u_desc_ctrl.field.zero_result = 1; | ||
379 | u_desc_ctrl.field.status_write_back_en = 1; | ||
380 | u_desc_ctrl.field.pq_xfer_en = 1; | ||
381 | u_desc_ctrl.field.p_xfer_dis = !!(flags & DMA_PREP_PQ_DISABLE_P); | ||
382 | u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT; | ||
383 | hw_desc->desc_ctrl = u_desc_ctrl.value; | ||
384 | } | ||
385 | |||
322 | static inline void iop_desc_set_byte_count(struct iop_adma_desc_slot *desc, | 386 | static inline void iop_desc_set_byte_count(struct iop_adma_desc_slot *desc, |
323 | struct iop_adma_chan *chan, | 387 | struct iop_adma_chan *chan, |
324 | u32 byte_count) | 388 | u32 byte_count) |
@@ -351,6 +415,7 @@ iop_desc_set_zero_sum_byte_count(struct iop_adma_desc_slot *desc, u32 len) | |||
351 | } | 415 | } |
352 | } | 416 | } |
353 | 417 | ||
418 | #define iop_desc_set_pq_zero_sum_byte_count iop_desc_set_zero_sum_byte_count | ||
354 | 419 | ||
355 | static inline void iop_desc_set_dest_addr(struct iop_adma_desc_slot *desc, | 420 | static inline void iop_desc_set_dest_addr(struct iop_adma_desc_slot *desc, |
356 | struct iop_adma_chan *chan, | 421 | struct iop_adma_chan *chan, |
@@ -361,6 +426,16 @@ static inline void iop_desc_set_dest_addr(struct iop_adma_desc_slot *desc, | |||
361 | hw_desc->upper_dest_addr = 0; | 426 | hw_desc->upper_dest_addr = 0; |
362 | } | 427 | } |
363 | 428 | ||
429 | static inline void | ||
430 | iop_desc_set_pq_addr(struct iop_adma_desc_slot *desc, dma_addr_t *addr) | ||
431 | { | ||
432 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | ||
433 | |||
434 | hw_desc->dest_addr = addr[0]; | ||
435 | hw_desc->q_dest_addr = addr[1]; | ||
436 | hw_desc->upper_dest_addr = 0; | ||
437 | } | ||
438 | |||
364 | static inline void iop_desc_set_memcpy_src_addr(struct iop_adma_desc_slot *desc, | 439 | static inline void iop_desc_set_memcpy_src_addr(struct iop_adma_desc_slot *desc, |
365 | dma_addr_t addr) | 440 | dma_addr_t addr) |
366 | { | 441 | { |
@@ -389,6 +464,29 @@ static inline void iop_desc_set_xor_src_addr(struct iop_adma_desc_slot *desc, | |||
389 | } | 464 | } |
390 | 465 | ||
391 | static inline void | 466 | static inline void |
467 | iop_desc_set_pq_src_addr(struct iop_adma_desc_slot *desc, int src_idx, | ||
468 | dma_addr_t addr, unsigned char coef) | ||
469 | { | ||
470 | int slot_cnt = desc->slot_cnt, slots_per_op = desc->slots_per_op; | ||
471 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc, *iter; | ||
472 | struct iop13xx_adma_src *src; | ||
473 | int i = 0; | ||
474 | |||
475 | do { | ||
476 | iter = iop_hw_desc_slot_idx(hw_desc, i); | ||
477 | src = &iter->src[src_idx]; | ||
478 | src->src_addr = addr; | ||
479 | src->pq_upper_src_addr = 0; | ||
480 | src->pq_dmlt = coef; | ||
481 | slot_cnt -= slots_per_op; | ||
482 | if (slot_cnt) { | ||
483 | i += slots_per_op; | ||
484 | addr += IOP_ADMA_PQ_MAX_BYTE_COUNT; | ||
485 | } | ||
486 | } while (slot_cnt); | ||
487 | } | ||
488 | |||
489 | static inline void | ||
392 | iop_desc_init_interrupt(struct iop_adma_desc_slot *desc, | 490 | iop_desc_init_interrupt(struct iop_adma_desc_slot *desc, |
393 | struct iop_adma_chan *chan) | 491 | struct iop_adma_chan *chan) |
394 | { | 492 | { |
@@ -399,6 +497,15 @@ iop_desc_init_interrupt(struct iop_adma_desc_slot *desc, | |||
399 | } | 497 | } |
400 | 498 | ||
401 | #define iop_desc_set_zero_sum_src_addr iop_desc_set_xor_src_addr | 499 | #define iop_desc_set_zero_sum_src_addr iop_desc_set_xor_src_addr |
500 | #define iop_desc_set_pq_zero_sum_src_addr iop_desc_set_pq_src_addr | ||
501 | |||
502 | static inline void | ||
503 | iop_desc_set_pq_zero_sum_addr(struct iop_adma_desc_slot *desc, int pq_idx, | ||
504 | dma_addr_t *src) | ||
505 | { | ||
506 | iop_desc_set_xor_src_addr(desc, pq_idx, src[pq_idx]); | ||
507 | iop_desc_set_xor_src_addr(desc, pq_idx+1, src[pq_idx+1]); | ||
508 | } | ||
402 | 509 | ||
403 | static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc, | 510 | static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc, |
404 | u32 next_desc_addr) | 511 | u32 next_desc_addr) |
@@ -428,18 +535,20 @@ static inline void iop_desc_set_block_fill_val(struct iop_adma_desc_slot *desc, | |||
428 | hw_desc->block_fill_data = val; | 535 | hw_desc->block_fill_data = val; |
429 | } | 536 | } |
430 | 537 | ||
431 | static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) | 538 | static inline enum sum_check_flags |
539 | iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) | ||
432 | { | 540 | { |
433 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | 541 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; |
434 | struct iop13xx_adma_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; | 542 | struct iop13xx_adma_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; |
435 | struct iop13xx_adma_byte_count byte_count = hw_desc->byte_count_field; | 543 | struct iop13xx_adma_byte_count byte_count = hw_desc->byte_count_field; |
544 | enum sum_check_flags flags; | ||
436 | 545 | ||
437 | BUG_ON(!(byte_count.tx_complete && desc_ctrl.zero_result)); | 546 | BUG_ON(!(byte_count.tx_complete && desc_ctrl.zero_result)); |
438 | 547 | ||
439 | if (desc_ctrl.pq_xfer_en) | 548 | flags = byte_count.zero_result_err_q << SUM_CHECK_Q; |
440 | return byte_count.zero_result_err_q; | 549 | flags |= byte_count.zero_result_err << SUM_CHECK_P; |
441 | else | 550 | |
442 | return byte_count.zero_result_err; | 551 | return flags; |
443 | } | 552 | } |
444 | 553 | ||
445 | static inline void iop_chan_append(struct iop_adma_chan *chan) | 554 | static inline void iop_chan_append(struct iop_adma_chan *chan) |
diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c index bee42c609df6..5c147fb66a01 100644 --- a/arch/arm/mach-iop13xx/setup.c +++ b/arch/arm/mach-iop13xx/setup.c | |||
@@ -477,10 +477,8 @@ void __init iop13xx_platform_init(void) | |||
477 | plat_data = &iop13xx_adma_0_data; | 477 | plat_data = &iop13xx_adma_0_data; |
478 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); | 478 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); |
479 | dma_cap_set(DMA_XOR, plat_data->cap_mask); | 479 | dma_cap_set(DMA_XOR, plat_data->cap_mask); |
480 | dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); | 480 | dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); |
481 | dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); | ||
482 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); | 481 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); |
483 | dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); | ||
484 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); | 482 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); |
485 | break; | 483 | break; |
486 | case IOP13XX_INIT_ADMA_1: | 484 | case IOP13XX_INIT_ADMA_1: |
@@ -489,10 +487,8 @@ void __init iop13xx_platform_init(void) | |||
489 | plat_data = &iop13xx_adma_1_data; | 487 | plat_data = &iop13xx_adma_1_data; |
490 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); | 488 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); |
491 | dma_cap_set(DMA_XOR, plat_data->cap_mask); | 489 | dma_cap_set(DMA_XOR, plat_data->cap_mask); |
492 | dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); | 490 | dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); |
493 | dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); | ||
494 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); | 491 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); |
495 | dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); | ||
496 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); | 492 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); |
497 | break; | 493 | break; |
498 | case IOP13XX_INIT_ADMA_2: | 494 | case IOP13XX_INIT_ADMA_2: |
@@ -501,14 +497,11 @@ void __init iop13xx_platform_init(void) | |||
501 | plat_data = &iop13xx_adma_2_data; | 497 | plat_data = &iop13xx_adma_2_data; |
502 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); | 498 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); |
503 | dma_cap_set(DMA_XOR, plat_data->cap_mask); | 499 | dma_cap_set(DMA_XOR, plat_data->cap_mask); |
504 | dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); | 500 | dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); |
505 | dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); | ||
506 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); | 501 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); |
507 | dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); | ||
508 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); | 502 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); |
509 | dma_cap_set(DMA_PQ_XOR, plat_data->cap_mask); | 503 | dma_cap_set(DMA_PQ, plat_data->cap_mask); |
510 | dma_cap_set(DMA_PQ_UPDATE, plat_data->cap_mask); | 504 | dma_cap_set(DMA_PQ_VAL, plat_data->cap_mask); |
511 | dma_cap_set(DMA_PQ_ZERO_SUM, plat_data->cap_mask); | ||
512 | break; | 505 | break; |
513 | } | 506 | } |
514 | } | 507 | } |
diff --git a/arch/arm/plat-iop/adma.c b/arch/arm/plat-iop/adma.c index 3c127aabe214..1ff6a37e893c 100644 --- a/arch/arm/plat-iop/adma.c +++ b/arch/arm/plat-iop/adma.c | |||
@@ -179,7 +179,6 @@ static int __init iop3xx_adma_cap_init(void) | |||
179 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); | 179 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); |
180 | #else | 180 | #else |
181 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask); | 181 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask); |
182 | dma_cap_set(DMA_MEMCPY_CRC32C, iop3xx_dma_0_data.cap_mask); | ||
183 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); | 182 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); |
184 | #endif | 183 | #endif |
185 | 184 | ||
@@ -188,7 +187,6 @@ static int __init iop3xx_adma_cap_init(void) | |||
188 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); | 187 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); |
189 | #else | 188 | #else |
190 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask); | 189 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask); |
191 | dma_cap_set(DMA_MEMCPY_CRC32C, iop3xx_dma_1_data.cap_mask); | ||
192 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); | 190 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); |
193 | #endif | 191 | #endif |
194 | 192 | ||
@@ -198,7 +196,7 @@ static int __init iop3xx_adma_cap_init(void) | |||
198 | dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); | 196 | dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); |
199 | #else | 197 | #else |
200 | dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask); | 198 | dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask); |
201 | dma_cap_set(DMA_ZERO_SUM, iop3xx_aau_data.cap_mask); | 199 | dma_cap_set(DMA_XOR_VAL, iop3xx_aau_data.cap_mask); |
202 | dma_cap_set(DMA_MEMSET, iop3xx_aau_data.cap_mask); | 200 | dma_cap_set(DMA_MEMSET, iop3xx_aau_data.cap_mask); |
203 | dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); | 201 | dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); |
204 | #endif | 202 | #endif |
diff --git a/arch/frv/kernel/pm.c b/arch/frv/kernel/pm.c index be722fc1acff..0d4d3e3a4cfc 100644 --- a/arch/frv/kernel/pm.c +++ b/arch/frv/kernel/pm.c | |||
@@ -150,7 +150,7 @@ static int user_atoi(char __user *ubuf, size_t len) | |||
150 | /* | 150 | /* |
151 | * Send us to sleep. | 151 | * Send us to sleep. |
152 | */ | 152 | */ |
153 | static int sysctl_pm_do_suspend(ctl_table *ctl, int write, struct file *filp, | 153 | static int sysctl_pm_do_suspend(ctl_table *ctl, int write, |
154 | void __user *buffer, size_t *lenp, loff_t *fpos) | 154 | void __user *buffer, size_t *lenp, loff_t *fpos) |
155 | { | 155 | { |
156 | int retval, mode; | 156 | int retval, mode; |
@@ -198,13 +198,13 @@ static int try_set_cmode(int new_cmode) | |||
198 | } | 198 | } |
199 | 199 | ||
200 | 200 | ||
201 | static int cmode_procctl(ctl_table *ctl, int write, struct file *filp, | 201 | static int cmode_procctl(ctl_table *ctl, int write, |
202 | void __user *buffer, size_t *lenp, loff_t *fpos) | 202 | void __user *buffer, size_t *lenp, loff_t *fpos) |
203 | { | 203 | { |
204 | int new_cmode; | 204 | int new_cmode; |
205 | 205 | ||
206 | if (!write) | 206 | if (!write) |
207 | return proc_dointvec(ctl, write, filp, buffer, lenp, fpos); | 207 | return proc_dointvec(ctl, write, buffer, lenp, fpos); |
208 | 208 | ||
209 | new_cmode = user_atoi(buffer, *lenp); | 209 | new_cmode = user_atoi(buffer, *lenp); |
210 | 210 | ||
@@ -301,13 +301,13 @@ static int try_set_cm(int new_cm) | |||
301 | return 0; | 301 | return 0; |
302 | } | 302 | } |
303 | 303 | ||
304 | static int p0_procctl(ctl_table *ctl, int write, struct file *filp, | 304 | static int p0_procctl(ctl_table *ctl, int write, |
305 | void __user *buffer, size_t *lenp, loff_t *fpos) | 305 | void __user *buffer, size_t *lenp, loff_t *fpos) |
306 | { | 306 | { |
307 | int new_p0; | 307 | int new_p0; |
308 | 308 | ||
309 | if (!write) | 309 | if (!write) |
310 | return proc_dointvec(ctl, write, filp, buffer, lenp, fpos); | 310 | return proc_dointvec(ctl, write, buffer, lenp, fpos); |
311 | 311 | ||
312 | new_p0 = user_atoi(buffer, *lenp); | 312 | new_p0 = user_atoi(buffer, *lenp); |
313 | 313 | ||
@@ -345,13 +345,13 @@ static int p0_sysctl(ctl_table *table, | |||
345 | return 1; | 345 | return 1; |
346 | } | 346 | } |
347 | 347 | ||
348 | static int cm_procctl(ctl_table *ctl, int write, struct file *filp, | 348 | static int cm_procctl(ctl_table *ctl, int write, |
349 | void __user *buffer, size_t *lenp, loff_t *fpos) | 349 | void __user *buffer, size_t *lenp, loff_t *fpos) |
350 | { | 350 | { |
351 | int new_cm; | 351 | int new_cm; |
352 | 352 | ||
353 | if (!write) | 353 | if (!write) |
354 | return proc_dointvec(ctl, write, filp, buffer, lenp, fpos); | 354 | return proc_dointvec(ctl, write, buffer, lenp, fpos); |
355 | 355 | ||
356 | new_cm = user_atoi(buffer, *lenp); | 356 | new_cm = user_atoi(buffer, *lenp); |
357 | 357 | ||
diff --git a/arch/mips/lasat/sysctl.c b/arch/mips/lasat/sysctl.c index 3f04d4c406b7..b3deed8db619 100644 --- a/arch/mips/lasat/sysctl.c +++ b/arch/mips/lasat/sysctl.c | |||
@@ -56,12 +56,12 @@ int sysctl_lasatstring(ctl_table *table, | |||
56 | 56 | ||
57 | 57 | ||
58 | /* And the same for proc */ | 58 | /* And the same for proc */ |
59 | int proc_dolasatstring(ctl_table *table, int write, struct file *filp, | 59 | int proc_dolasatstring(ctl_table *table, int write, |
60 | void *buffer, size_t *lenp, loff_t *ppos) | 60 | void *buffer, size_t *lenp, loff_t *ppos) |
61 | { | 61 | { |
62 | int r; | 62 | int r; |
63 | 63 | ||
64 | r = proc_dostring(table, write, filp, buffer, lenp, ppos); | 64 | r = proc_dostring(table, write, buffer, lenp, ppos); |
65 | if ((!write) || r) | 65 | if ((!write) || r) |
66 | return r; | 66 | return r; |
67 | 67 | ||
@@ -71,12 +71,12 @@ int proc_dolasatstring(ctl_table *table, int write, struct file *filp, | |||
71 | } | 71 | } |
72 | 72 | ||
73 | /* proc function to write EEPROM after changing int entry */ | 73 | /* proc function to write EEPROM after changing int entry */ |
74 | int proc_dolasatint(ctl_table *table, int write, struct file *filp, | 74 | int proc_dolasatint(ctl_table *table, int write, |
75 | void *buffer, size_t *lenp, loff_t *ppos) | 75 | void *buffer, size_t *lenp, loff_t *ppos) |
76 | { | 76 | { |
77 | int r; | 77 | int r; |
78 | 78 | ||
79 | r = proc_dointvec(table, write, filp, buffer, lenp, ppos); | 79 | r = proc_dointvec(table, write, buffer, lenp, ppos); |
80 | if ((!write) || r) | 80 | if ((!write) || r) |
81 | return r; | 81 | return r; |
82 | 82 | ||
@@ -89,7 +89,7 @@ int proc_dolasatint(ctl_table *table, int write, struct file *filp, | |||
89 | static int rtctmp; | 89 | static int rtctmp; |
90 | 90 | ||
91 | /* proc function to read/write RealTime Clock */ | 91 | /* proc function to read/write RealTime Clock */ |
92 | int proc_dolasatrtc(ctl_table *table, int write, struct file *filp, | 92 | int proc_dolasatrtc(ctl_table *table, int write, |
93 | void *buffer, size_t *lenp, loff_t *ppos) | 93 | void *buffer, size_t *lenp, loff_t *ppos) |
94 | { | 94 | { |
95 | struct timespec ts; | 95 | struct timespec ts; |
@@ -102,7 +102,7 @@ int proc_dolasatrtc(ctl_table *table, int write, struct file *filp, | |||
102 | if (rtctmp < 0) | 102 | if (rtctmp < 0) |
103 | rtctmp = 0; | 103 | rtctmp = 0; |
104 | } | 104 | } |
105 | r = proc_dointvec(table, write, filp, buffer, lenp, ppos); | 105 | r = proc_dointvec(table, write, buffer, lenp, ppos); |
106 | if (r) | 106 | if (r) |
107 | return r; | 107 | return r; |
108 | 108 | ||
@@ -154,7 +154,7 @@ int sysctl_lasat_rtc(ctl_table *table, | |||
154 | #endif | 154 | #endif |
155 | 155 | ||
156 | #ifdef CONFIG_INET | 156 | #ifdef CONFIG_INET |
157 | int proc_lasat_ip(ctl_table *table, int write, struct file *filp, | 157 | int proc_lasat_ip(ctl_table *table, int write, |
158 | void *buffer, size_t *lenp, loff_t *ppos) | 158 | void *buffer, size_t *lenp, loff_t *ppos) |
159 | { | 159 | { |
160 | unsigned int ip; | 160 | unsigned int ip; |
@@ -231,12 +231,12 @@ static int sysctl_lasat_prid(ctl_table *table, | |||
231 | return 0; | 231 | return 0; |
232 | } | 232 | } |
233 | 233 | ||
234 | int proc_lasat_prid(ctl_table *table, int write, struct file *filp, | 234 | int proc_lasat_prid(ctl_table *table, int write, |
235 | void *buffer, size_t *lenp, loff_t *ppos) | 235 | void *buffer, size_t *lenp, loff_t *ppos) |
236 | { | 236 | { |
237 | int r; | 237 | int r; |
238 | 238 | ||
239 | r = proc_dointvec(table, write, filp, buffer, lenp, ppos); | 239 | r = proc_dointvec(table, write, buffer, lenp, ppos); |
240 | if (r < 0) | 240 | if (r < 0) |
241 | return r; | 241 | return r; |
242 | if (write) { | 242 | if (write) { |
diff --git a/arch/parisc/include/asm/fcntl.h b/arch/parisc/include/asm/fcntl.h index 1e1c824764ee..5f39d5597ced 100644 --- a/arch/parisc/include/asm/fcntl.h +++ b/arch/parisc/include/asm/fcntl.h | |||
@@ -28,6 +28,8 @@ | |||
28 | #define F_SETOWN 12 /* for sockets. */ | 28 | #define F_SETOWN 12 /* for sockets. */ |
29 | #define F_SETSIG 13 /* for sockets. */ | 29 | #define F_SETSIG 13 /* for sockets. */ |
30 | #define F_GETSIG 14 /* for sockets. */ | 30 | #define F_GETSIG 14 /* for sockets. */ |
31 | #define F_GETOWN_EX 15 | ||
32 | #define F_SETOWN_EX 16 | ||
31 | 33 | ||
32 | /* for posix fcntl() and lockf() */ | 34 | /* for posix fcntl() and lockf() */ |
33 | #define F_RDLCK 01 | 35 | #define F_RDLCK 01 |
diff --git a/arch/powerpc/include/asm/fsldma.h b/arch/powerpc/include/asm/fsldma.h new file mode 100644 index 000000000000..a67aeed17d40 --- /dev/null +++ b/arch/powerpc/include/asm/fsldma.h | |||
@@ -0,0 +1,136 @@ | |||
1 | /* | ||
2 | * Freescale MPC83XX / MPC85XX DMA Controller | ||
3 | * | ||
4 | * Copyright (c) 2009 Ira W. Snyder <iws@ovro.caltech.edu> | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public License | ||
7 | * version 2. This program is licensed "as is" without any warranty of any | ||
8 | * kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #ifndef __ARCH_POWERPC_ASM_FSLDMA_H__ | ||
12 | #define __ARCH_POWERPC_ASM_FSLDMA_H__ | ||
13 | |||
14 | #include <linux/dmaengine.h> | ||
15 | |||
16 | /* | ||
17 | * Definitions for the Freescale DMA controller's DMA_SLAVE implemention | ||
18 | * | ||
19 | * The Freescale DMA_SLAVE implementation was designed to handle many-to-many | ||
20 | * transfers. An example usage would be an accelerated copy between two | ||
21 | * scatterlists. Another example use would be an accelerated copy from | ||
22 | * multiple non-contiguous device buffers into a single scatterlist. | ||
23 | * | ||
24 | * A DMA_SLAVE transaction is defined by a struct fsl_dma_slave. This | ||
25 | * structure contains a list of hardware addresses that should be copied | ||
26 | * to/from the scatterlist passed into device_prep_slave_sg(). The structure | ||
27 | * also has some fields to enable hardware-specific features. | ||
28 | */ | ||
29 | |||
30 | /** | ||
31 | * struct fsl_dma_hw_addr | ||
32 | * @entry: linked list entry | ||
33 | * @address: the hardware address | ||
34 | * @length: length to transfer | ||
35 | * | ||
36 | * Holds a single physical hardware address / length pair for use | ||
37 | * with the DMAEngine DMA_SLAVE API. | ||
38 | */ | ||
39 | struct fsl_dma_hw_addr { | ||
40 | struct list_head entry; | ||
41 | |||
42 | dma_addr_t address; | ||
43 | size_t length; | ||
44 | }; | ||
45 | |||
46 | /** | ||
47 | * struct fsl_dma_slave | ||
48 | * @addresses: a linked list of struct fsl_dma_hw_addr structures | ||
49 | * @request_count: value for DMA request count | ||
50 | * @src_loop_size: setup and enable constant source-address DMA transfers | ||
51 | * @dst_loop_size: setup and enable constant destination address DMA transfers | ||
52 | * @external_start: enable externally started DMA transfers | ||
53 | * @external_pause: enable externally paused DMA transfers | ||
54 | * | ||
55 | * Holds a list of address / length pairs for use with the DMAEngine | ||
56 | * DMA_SLAVE API implementation for the Freescale DMA controller. | ||
57 | */ | ||
58 | struct fsl_dma_slave { | ||
59 | |||
60 | /* List of hardware address/length pairs */ | ||
61 | struct list_head addresses; | ||
62 | |||
63 | /* Support for extra controller features */ | ||
64 | unsigned int request_count; | ||
65 | unsigned int src_loop_size; | ||
66 | unsigned int dst_loop_size; | ||
67 | bool external_start; | ||
68 | bool external_pause; | ||
69 | }; | ||
70 | |||
71 | /** | ||
72 | * fsl_dma_slave_append - add an address/length pair to a struct fsl_dma_slave | ||
73 | * @slave: the &struct fsl_dma_slave to add to | ||
74 | * @address: the hardware address to add | ||
75 | * @length: the length of bytes to transfer from @address | ||
76 | * | ||
77 | * Add a hardware address/length pair to a struct fsl_dma_slave. Returns 0 on | ||
78 | * success, -ERRNO otherwise. | ||
79 | */ | ||
80 | static inline int fsl_dma_slave_append(struct fsl_dma_slave *slave, | ||
81 | dma_addr_t address, size_t length) | ||
82 | { | ||
83 | struct fsl_dma_hw_addr *addr; | ||
84 | |||
85 | addr = kzalloc(sizeof(*addr), GFP_ATOMIC); | ||
86 | if (!addr) | ||
87 | return -ENOMEM; | ||
88 | |||
89 | INIT_LIST_HEAD(&addr->entry); | ||
90 | addr->address = address; | ||
91 | addr->length = length; | ||
92 | |||
93 | list_add_tail(&addr->entry, &slave->addresses); | ||
94 | return 0; | ||
95 | } | ||
96 | |||
97 | /** | ||
98 | * fsl_dma_slave_free - free a struct fsl_dma_slave | ||
99 | * @slave: the struct fsl_dma_slave to free | ||
100 | * | ||
101 | * Free a struct fsl_dma_slave and all associated address/length pairs | ||
102 | */ | ||
103 | static inline void fsl_dma_slave_free(struct fsl_dma_slave *slave) | ||
104 | { | ||
105 | struct fsl_dma_hw_addr *addr, *tmp; | ||
106 | |||
107 | if (slave) { | ||
108 | list_for_each_entry_safe(addr, tmp, &slave->addresses, entry) { | ||
109 | list_del(&addr->entry); | ||
110 | kfree(addr); | ||
111 | } | ||
112 | |||
113 | kfree(slave); | ||
114 | } | ||
115 | } | ||
116 | |||
117 | /** | ||
118 | * fsl_dma_slave_alloc - allocate a struct fsl_dma_slave | ||
119 | * @gfp: the flags to pass to kmalloc when allocating this structure | ||
120 | * | ||
121 | * Allocate a struct fsl_dma_slave for use by the DMA_SLAVE API. Returns a new | ||
122 | * struct fsl_dma_slave on success, or NULL on failure. | ||
123 | */ | ||
124 | static inline struct fsl_dma_slave *fsl_dma_slave_alloc(gfp_t gfp) | ||
125 | { | ||
126 | struct fsl_dma_slave *slave; | ||
127 | |||
128 | slave = kzalloc(sizeof(*slave), gfp); | ||
129 | if (!slave) | ||
130 | return NULL; | ||
131 | |||
132 | INIT_LIST_HEAD(&slave->addresses); | ||
133 | return slave; | ||
134 | } | ||
135 | |||
136 | #endif /* __ARCH_POWERPC_ASM_FSLDMA_H__ */ | ||
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 264528e4f58d..b55fd7ed1c31 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -50,10 +50,9 @@ static struct platform_device *appldata_pdev; | |||
50 | * /proc entries (sysctl) | 50 | * /proc entries (sysctl) |
51 | */ | 51 | */ |
52 | static const char appldata_proc_name[APPLDATA_PROC_NAME_LENGTH] = "appldata"; | 52 | static const char appldata_proc_name[APPLDATA_PROC_NAME_LENGTH] = "appldata"; |
53 | static int appldata_timer_handler(ctl_table *ctl, int write, struct file *filp, | 53 | static int appldata_timer_handler(ctl_table *ctl, int write, |
54 | void __user *buffer, size_t *lenp, loff_t *ppos); | 54 | void __user *buffer, size_t *lenp, loff_t *ppos); |
55 | static int appldata_interval_handler(ctl_table *ctl, int write, | 55 | static int appldata_interval_handler(ctl_table *ctl, int write, |
56 | struct file *filp, | ||
57 | void __user *buffer, | 56 | void __user *buffer, |
58 | size_t *lenp, loff_t *ppos); | 57 | size_t *lenp, loff_t *ppos); |
59 | 58 | ||
@@ -247,7 +246,7 @@ __appldata_vtimer_setup(int cmd) | |||
247 | * Start/Stop timer, show status of timer (0 = not active, 1 = active) | 246 | * Start/Stop timer, show status of timer (0 = not active, 1 = active) |
248 | */ | 247 | */ |
249 | static int | 248 | static int |
250 | appldata_timer_handler(ctl_table *ctl, int write, struct file *filp, | 249 | appldata_timer_handler(ctl_table *ctl, int write, |
251 | void __user *buffer, size_t *lenp, loff_t *ppos) | 250 | void __user *buffer, size_t *lenp, loff_t *ppos) |
252 | { | 251 | { |
253 | int len; | 252 | int len; |
@@ -289,7 +288,7 @@ out: | |||
289 | * current timer interval. | 288 | * current timer interval. |
290 | */ | 289 | */ |
291 | static int | 290 | static int |
292 | appldata_interval_handler(ctl_table *ctl, int write, struct file *filp, | 291 | appldata_interval_handler(ctl_table *ctl, int write, |
293 | void __user *buffer, size_t *lenp, loff_t *ppos) | 292 | void __user *buffer, size_t *lenp, loff_t *ppos) |
294 | { | 293 | { |
295 | int len, interval; | 294 | int len, interval; |
@@ -335,7 +334,7 @@ out: | |||
335 | * monitoring (0 = not in process, 1 = in process) | 334 | * monitoring (0 = not in process, 1 = in process) |
336 | */ | 335 | */ |
337 | static int | 336 | static int |
338 | appldata_generic_handler(ctl_table *ctl, int write, struct file *filp, | 337 | appldata_generic_handler(ctl_table *ctl, int write, |
339 | void __user *buffer, size_t *lenp, loff_t *ppos) | 338 | void __user *buffer, size_t *lenp, loff_t *ppos) |
340 | { | 339 | { |
341 | struct appldata_ops *ops = NULL, *tmp_ops; | 340 | struct appldata_ops *ops = NULL, *tmp_ops; |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index 4c512561687d..20f282c911c2 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
@@ -881,11 +881,11 @@ static int debug_active=1; | |||
881 | * if debug_active is already off | 881 | * if debug_active is already off |
882 | */ | 882 | */ |
883 | static int | 883 | static int |
884 | s390dbf_procactive(ctl_table *table, int write, struct file *filp, | 884 | s390dbf_procactive(ctl_table *table, int write, |
885 | void __user *buffer, size_t *lenp, loff_t *ppos) | 885 | void __user *buffer, size_t *lenp, loff_t *ppos) |
886 | { | 886 | { |
887 | if (!write || debug_stoppable || !debug_active) | 887 | if (!write || debug_stoppable || !debug_active) |
888 | return proc_dointvec(table, write, filp, buffer, lenp, ppos); | 888 | return proc_dointvec(table, write, buffer, lenp, ppos); |
889 | else | 889 | else |
890 | return 0; | 890 | return 0; |
891 | } | 891 | } |
diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c index 413c240cbca7..b201135cc18c 100644 --- a/arch/s390/mm/cmm.c +++ b/arch/s390/mm/cmm.c | |||
@@ -262,7 +262,7 @@ cmm_skip_blanks(char *cp, char **endp) | |||
262 | static struct ctl_table cmm_table[]; | 262 | static struct ctl_table cmm_table[]; |
263 | 263 | ||
264 | static int | 264 | static int |
265 | cmm_pages_handler(ctl_table *ctl, int write, struct file *filp, | 265 | cmm_pages_handler(ctl_table *ctl, int write, |
266 | void __user *buffer, size_t *lenp, loff_t *ppos) | 266 | void __user *buffer, size_t *lenp, loff_t *ppos) |
267 | { | 267 | { |
268 | char buf[16], *p; | 268 | char buf[16], *p; |
@@ -303,7 +303,7 @@ cmm_pages_handler(ctl_table *ctl, int write, struct file *filp, | |||
303 | } | 303 | } |
304 | 304 | ||
305 | static int | 305 | static int |
306 | cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp, | 306 | cmm_timeout_handler(ctl_table *ctl, int write, |
307 | void __user *buffer, size_t *lenp, loff_t *ppos) | 307 | void __user *buffer, size_t *lenp, loff_t *ppos) |
308 | { | 308 | { |
309 | char buf[64], *p; | 309 | char buf[64], *p; |
diff --git a/arch/sh/drivers/dma/Kconfig b/arch/sh/drivers/dma/Kconfig index b91fa8dbf047..4d58eb0973d4 100644 --- a/arch/sh/drivers/dma/Kconfig +++ b/arch/sh/drivers/dma/Kconfig | |||
@@ -1,12 +1,9 @@ | |||
1 | menu "DMA support" | 1 | menu "DMA support" |
2 | 2 | ||
3 | config SH_DMA_API | ||
4 | bool | ||
5 | 3 | ||
6 | config SH_DMA | 4 | config SH_DMA |
7 | bool "SuperH on-chip DMA controller (DMAC) support" | 5 | bool "SuperH on-chip DMA controller (DMAC) support" |
8 | depends on CPU_SH3 || CPU_SH4 | 6 | depends on CPU_SH3 || CPU_SH4 |
9 | select SH_DMA_API | ||
10 | default n | 7 | default n |
11 | 8 | ||
12 | config SH_DMA_IRQ_MULTI | 9 | config SH_DMA_IRQ_MULTI |
@@ -19,6 +16,15 @@ config SH_DMA_IRQ_MULTI | |||
19 | CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \ | 16 | CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \ |
20 | CPU_SUBTYPE_SH7760 | 17 | CPU_SUBTYPE_SH7760 |
21 | 18 | ||
19 | config SH_DMA_API | ||
20 | depends on SH_DMA | ||
21 | bool "SuperH DMA API support" | ||
22 | default n | ||
23 | help | ||
24 | SH_DMA_API always enabled DMA API of used SuperH. | ||
25 | If you want to use DMA ENGINE, you must not enable this. | ||
26 | Please enable DMA_ENGINE and SH_DMAE. | ||
27 | |||
22 | config NR_ONCHIP_DMA_CHANNELS | 28 | config NR_ONCHIP_DMA_CHANNELS |
23 | int | 29 | int |
24 | depends on SH_DMA | 30 | depends on SH_DMA |
diff --git a/arch/sh/drivers/dma/Makefile b/arch/sh/drivers/dma/Makefile index c6068137b46f..d88c9484762c 100644 --- a/arch/sh/drivers/dma/Makefile +++ b/arch/sh/drivers/dma/Makefile | |||
@@ -2,8 +2,7 @@ | |||
2 | # Makefile for the SuperH DMA specific kernel interface routines under Linux. | 2 | # Makefile for the SuperH DMA specific kernel interface routines under Linux. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-$(CONFIG_SH_DMA_API) += dma-api.o dma-sysfs.o | 5 | obj-$(CONFIG_SH_DMA_API) += dma-sh.o dma-api.o dma-sysfs.o |
6 | obj-$(CONFIG_SH_DMA) += dma-sh.o | ||
7 | obj-$(CONFIG_PVR2_DMA) += dma-pvr2.o | 6 | obj-$(CONFIG_PVR2_DMA) += dma-pvr2.o |
8 | obj-$(CONFIG_G2_DMA) += dma-g2.o | 7 | obj-$(CONFIG_G2_DMA) += dma-g2.o |
9 | obj-$(CONFIG_SH_DMABRG) += dmabrg.o | 8 | obj-$(CONFIG_SH_DMABRG) += dmabrg.o |
diff --git a/arch/sh/include/asm/dma-sh.h b/arch/sh/include/asm/dma-sh.h index 68a5f4cb0343..78eed3e0bdf5 100644 --- a/arch/sh/include/asm/dma-sh.h +++ b/arch/sh/include/asm/dma-sh.h | |||
@@ -116,4 +116,17 @@ static u32 dma_base_addr[] __maybe_unused = { | |||
116 | #define CHCR 0x0C | 116 | #define CHCR 0x0C |
117 | #define DMAOR 0x40 | 117 | #define DMAOR 0x40 |
118 | 118 | ||
119 | /* | ||
120 | * for dma engine | ||
121 | * | ||
122 | * SuperH DMA mode | ||
123 | */ | ||
124 | #define SHDMA_MIX_IRQ (1 << 1) | ||
125 | #define SHDMA_DMAOR1 (1 << 2) | ||
126 | #define SHDMA_DMAE1 (1 << 3) | ||
127 | |||
128 | struct sh_dmae_pdata { | ||
129 | unsigned int mode; | ||
130 | }; | ||
131 | |||
119 | #endif /* __DMA_SH_H */ | 132 | #endif /* __DMA_SH_H */ |
diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h index e63cf7d441e1..139d4c1a33a7 100644 --- a/arch/x86/include/asm/nmi.h +++ b/arch/x86/include/asm/nmi.h | |||
@@ -40,8 +40,7 @@ extern unsigned int nmi_watchdog; | |||
40 | #define NMI_INVALID 3 | 40 | #define NMI_INVALID 3 |
41 | 41 | ||
42 | struct ctl_table; | 42 | struct ctl_table; |
43 | struct file; | 43 | extern int proc_nmi_enabled(struct ctl_table *, int , |
44 | extern int proc_nmi_enabled(struct ctl_table *, int , struct file *, | ||
45 | void __user *, size_t *, loff_t *); | 44 | void __user *, size_t *, loff_t *); |
46 | extern int unknown_nmi_panic; | 45 | extern int unknown_nmi_panic; |
47 | 46 | ||
diff --git a/arch/x86/kernel/apic/nmi.c b/arch/x86/kernel/apic/nmi.c index cb66a22d98ad..7ff61d6a188a 100644 --- a/arch/x86/kernel/apic/nmi.c +++ b/arch/x86/kernel/apic/nmi.c | |||
@@ -508,14 +508,14 @@ static int unknown_nmi_panic_callback(struct pt_regs *regs, int cpu) | |||
508 | /* | 508 | /* |
509 | * proc handler for /proc/sys/kernel/nmi | 509 | * proc handler for /proc/sys/kernel/nmi |
510 | */ | 510 | */ |
511 | int proc_nmi_enabled(struct ctl_table *table, int write, struct file *file, | 511 | int proc_nmi_enabled(struct ctl_table *table, int write, |
512 | void __user *buffer, size_t *length, loff_t *ppos) | 512 | void __user *buffer, size_t *length, loff_t *ppos) |
513 | { | 513 | { |
514 | int old_state; | 514 | int old_state; |
515 | 515 | ||
516 | nmi_watchdog_enabled = (atomic_read(&nmi_active) > 0) ? 1 : 0; | 516 | nmi_watchdog_enabled = (atomic_read(&nmi_active) > 0) ? 1 : 0; |
517 | old_state = nmi_watchdog_enabled; | 517 | old_state = nmi_watchdog_enabled; |
518 | proc_dointvec(table, write, file, buffer, length, ppos); | 518 | proc_dointvec(table, write, buffer, length, ppos); |
519 | if (!!old_state == !!nmi_watchdog_enabled) | 519 | if (!!old_state == !!nmi_watchdog_enabled) |
520 | return 0; | 520 | return 0; |
521 | 521 | ||
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index cf53a78e2dcf..8cb4974ff599 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -228,19 +228,11 @@ static long __vsyscall(3) venosys_1(void) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | #ifdef CONFIG_SYSCTL | 230 | #ifdef CONFIG_SYSCTL |
231 | |||
232 | static int | ||
233 | vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp, | ||
234 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
235 | { | ||
236 | return proc_dointvec(ctl, write, filp, buffer, lenp, ppos); | ||
237 | } | ||
238 | |||
239 | static ctl_table kernel_table2[] = { | 231 | static ctl_table kernel_table2[] = { |
240 | { .procname = "vsyscall64", | 232 | { .procname = "vsyscall64", |
241 | .data = &vsyscall_gtod_data.sysctl_enabled, .maxlen = sizeof(int), | 233 | .data = &vsyscall_gtod_data.sysctl_enabled, .maxlen = sizeof(int), |
242 | .mode = 0644, | 234 | .mode = 0644, |
243 | .proc_handler = vsyscall_sysctl_change }, | 235 | .proc_handler = proc_dointvec }, |
244 | {} | 236 | {} |
245 | }; | 237 | }; |
246 | 238 | ||
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 82728f2c6d55..f4cee9028cf0 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -167,6 +167,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address, | |||
167 | info.si_errno = 0; | 167 | info.si_errno = 0; |
168 | info.si_code = si_code; | 168 | info.si_code = si_code; |
169 | info.si_addr = (void __user *)address; | 169 | info.si_addr = (void __user *)address; |
170 | info.si_addr_lsb = si_code == BUS_MCEERR_AR ? PAGE_SHIFT : 0; | ||
170 | 171 | ||
171 | force_sig_info(si_signo, &info, tsk); | 172 | force_sig_info(si_signo, &info, tsk); |
172 | } | 173 | } |
@@ -790,10 +791,12 @@ out_of_memory(struct pt_regs *regs, unsigned long error_code, | |||
790 | } | 791 | } |
791 | 792 | ||
792 | static void | 793 | static void |
793 | do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address) | 794 | do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, |
795 | unsigned int fault) | ||
794 | { | 796 | { |
795 | struct task_struct *tsk = current; | 797 | struct task_struct *tsk = current; |
796 | struct mm_struct *mm = tsk->mm; | 798 | struct mm_struct *mm = tsk->mm; |
799 | int code = BUS_ADRERR; | ||
797 | 800 | ||
798 | up_read(&mm->mmap_sem); | 801 | up_read(&mm->mmap_sem); |
799 | 802 | ||
@@ -809,7 +812,15 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address) | |||
809 | tsk->thread.error_code = error_code; | 812 | tsk->thread.error_code = error_code; |
810 | tsk->thread.trap_no = 14; | 813 | tsk->thread.trap_no = 14; |
811 | 814 | ||
812 | force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk); | 815 | #ifdef CONFIG_MEMORY_FAILURE |
816 | if (fault & VM_FAULT_HWPOISON) { | ||
817 | printk(KERN_ERR | ||
818 | "MCE: Killing %s:%d due to hardware memory corruption fault at %lx\n", | ||
819 | tsk->comm, tsk->pid, address); | ||
820 | code = BUS_MCEERR_AR; | ||
821 | } | ||
822 | #endif | ||
823 | force_sig_info_fault(SIGBUS, code, address, tsk); | ||
813 | } | 824 | } |
814 | 825 | ||
815 | static noinline void | 826 | static noinline void |
@@ -819,8 +830,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
819 | if (fault & VM_FAULT_OOM) { | 830 | if (fault & VM_FAULT_OOM) { |
820 | out_of_memory(regs, error_code, address); | 831 | out_of_memory(regs, error_code, address); |
821 | } else { | 832 | } else { |
822 | if (fault & VM_FAULT_SIGBUS) | 833 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON)) |
823 | do_sigbus(regs, error_code, address); | 834 | do_sigbus(regs, error_code, address, fault); |
824 | else | 835 | else |
825 | BUG(); | 836 | BUG(); |
826 | } | 837 | } |