Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx into for-linus

NeilBrown 4b3df566 1ef04fef

+9135 -3307
+45 -30
Documentation/crypto/async-tx-api.txt
··· 54 54 55 55 3.1 General format of the API: 56 56 struct dma_async_tx_descriptor * 57 - async_<operation>(<op specific parameters>, 58 - enum async_tx_flags flags, 59 - struct dma_async_tx_descriptor *dependency, 60 - dma_async_tx_callback callback_routine, 61 - void *callback_parameter); 57 + async_<operation>(<op specific parameters>, struct async_submit ctl *submit) 62 58 63 59 3.2 Supported operations: 64 - memcpy - memory copy between a source and a destination buffer 65 - memset - fill a destination buffer with a byte value 66 - xor - xor a series of source buffers and write the result to a 67 - destination buffer 68 - xor_zero_sum - xor a series of source buffers and set a flag if the 69 - result is zero. The implementation attempts to prevent 70 - writes to memory 60 + memcpy - memory copy between a source and a destination buffer 61 + memset - fill a destination buffer with a byte value 62 + xor - xor a series of source buffers and write the result to a 63 + destination buffer 64 + xor_val - xor a series of source buffers and set a flag if the 65 + result is zero. The implementation attempts to prevent 66 + writes to memory 67 + pq - generate the p+q (raid6 syndrome) from a series of source buffers 68 + pq_val - validate that a p and or q buffer are in sync with a given series of 69 + sources 70 + datap - (raid6_datap_recov) recover a raid6 data block and the p block 71 + from the given sources 72 + 2data - (raid6_2data_recov) recover 2 raid6 data blocks from the given 73 + sources 71 74 72 75 3.3 Descriptor management: 73 76 The return value is non-NULL and points to a 'descriptor' when the operation ··· 83 80 recycle (or free) the descriptor. A descriptor can be acked by one of the 84 81 following methods: 85 82 1/ setting the ASYNC_TX_ACK flag if no child operations are to be submitted 86 - 2/ setting the ASYNC_TX_DEP_ACK flag to acknowledge the parent 87 - descriptor of a new operation. 83 + 2/ submitting an unacknowledged descriptor as a dependency to another 84 + async_tx call will implicitly set the acknowledged state. 88 85 3/ calling async_tx_ack() on the descriptor. 89 86 90 87 3.4 When does the operation execute? ··· 122 119 Perform a xor->copy->xor operation where each operation depends on the 123 120 result from the previous operation: 124 121 125 - void complete_xor_copy_xor(void *param) 122 + void callback(void *param) 126 123 { 127 - printk("complete\n"); 124 + struct completion *cmp = param; 125 + 126 + complete(cmp); 128 127 } 129 128 130 - int run_xor_copy_xor(struct page **xor_srcs, 131 - int xor_src_cnt, 132 - struct page *xor_dest, 133 - size_t xor_len, 134 - struct page *copy_src, 135 - struct page *copy_dest, 136 - size_t copy_len) 129 + void run_xor_copy_xor(struct page **xor_srcs, 130 + int xor_src_cnt, 131 + struct page *xor_dest, 132 + size_t xor_len, 133 + struct page *copy_src, 134 + struct page *copy_dest, 135 + size_t copy_len) 137 136 { 138 137 struct dma_async_tx_descriptor *tx; 138 + addr_conv_t addr_conv[xor_src_cnt]; 139 + struct async_submit_ctl submit; 140 + addr_conv_t addr_conv[NDISKS]; 141 + struct completion cmp; 139 142 140 - tx = async_xor(xor_dest, xor_srcs, 0, xor_src_cnt, xor_len, 141 - ASYNC_TX_XOR_DROP_DST, NULL, NULL, NULL); 142 - tx = async_memcpy(copy_dest, copy_src, 0, 0, copy_len, 143 - ASYNC_TX_DEP_ACK, tx, NULL, NULL); 144 - tx = async_xor(xor_dest, xor_srcs, 0, xor_src_cnt, xor_len, 145 - ASYNC_TX_XOR_DROP_DST | ASYNC_TX_DEP_ACK | ASYNC_TX_ACK, 146 - tx, complete_xor_copy_xor, NULL); 143 + init_async_submit(&submit, ASYNC_TX_XOR_DROP_DST, NULL, NULL, NULL, 144 + addr_conv); 145 + tx = async_xor(xor_dest, xor_srcs, 0, xor_src_cnt, xor_len, &submit) 146 + 147 + submit->depend_tx = tx; 148 + tx = async_memcpy(copy_dest, copy_src, 0, 0, copy_len, &submit); 149 + 150 + init_completion(&cmp); 151 + init_async_submit(&submit, ASYNC_TX_XOR_DROP_DST | ASYNC_TX_ACK, tx, 152 + callback, &cmp, addr_conv); 153 + tx = async_xor(xor_dest, xor_srcs, 0, xor_src_cnt, xor_len, &submit); 147 154 148 155 async_tx_issue_pending_all(); 156 + 157 + wait_for_completion(&cmp); 149 158 } 150 159 151 160 See include/linux/async_tx.h for more information on the flags. See the
+79 -2
arch/arm/include/asm/hardware/iop3xx-adma.h
··· 187 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 247 static inline int iop_adma_get_max_xor(void) 191 248 { 192 249 return 32; 250 + } 251 + 252 + static inline int iop_adma_get_max_pq(void) 253 + { 254 + BUG(); 255 + return 0; 193 256 } 194 257 195 258 static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan) ··· 395 332 return slot_cnt; 396 333 } 397 334 335 + static inline int iop_desc_is_pq(struct iop_adma_desc_slot *desc) 336 + { 337 + return 0; 338 + } 339 + 398 340 static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, 399 341 struct iop_adma_chan *chan) 400 342 { ··· 414 346 default: 415 347 BUG(); 416 348 } 349 + return 0; 350 + } 351 + 352 + 353 + static inline u32 iop_desc_get_qdest_addr(struct iop_adma_desc_slot *desc, 354 + struct iop_adma_chan *chan) 355 + { 356 + BUG(); 417 357 return 0; 418 358 } 419 359 ··· 832 756 hw_desc->src[0] = val; 833 757 } 834 758 835 - static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) 759 + static inline enum sum_check_flags 760 + iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) 836 761 { 837 762 struct iop3xx_desc_aau *hw_desc = desc->hw_desc; 838 763 struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; 839 764 840 765 iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en)); 841 - return desc_ctrl.zero_result_err; 766 + return desc_ctrl.zero_result_err << SUM_CHECK_P; 842 767 } 843 768 844 769 static inline void iop_chan_append(struct iop_adma_chan *chan)
+3
arch/arm/include/asm/hardware/iop_adma.h
··· 86 86 * @idx: pool index 87 87 * @unmap_src_cnt: number of xor sources 88 88 * @unmap_len: transaction bytecount 89 + * @tx_list: list of descriptors that are associated with one operation 89 90 * @async_tx: support for the async_tx api 90 91 * @group_list: list of slots that make up a multi-descriptor transaction 91 92 * for example transfer lengths larger than the supported hw max ··· 103 102 u16 idx; 104 103 u16 unmap_src_cnt; 105 104 size_t unmap_len; 105 + struct list_head tx_list; 106 106 struct dma_async_tx_descriptor async_tx; 107 107 union { 108 108 u32 *xor_check_result; 109 109 u32 *crc32_result; 110 + u32 *pq_check_result; 110 111 }; 111 112 }; 112 113
+114 -5
arch/arm/mach-iop13xx/include/mach/adma.h
··· 150 150 return 16; 151 151 } 152 152 153 + #define iop_adma_get_max_pq iop_adma_get_max_xor 154 + 153 155 static inline u32 iop_chan_get_current_descriptor(struct iop_adma_chan *chan) 154 156 { 155 157 return __raw_readl(ADMA_ADAR(chan)); ··· 213 211 #define IOP_ADMA_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT 214 212 #define IOP_ADMA_ZERO_SUM_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT 215 213 #define IOP_ADMA_XOR_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT 214 + #define IOP_ADMA_PQ_MAX_BYTE_COUNT ADMA_MAX_BYTE_COUNT 216 215 #define iop_chan_zero_sum_slot_count(l, s, o) iop_chan_xor_slot_count(l, s, o) 216 + #define iop_chan_pq_slot_count iop_chan_xor_slot_count 217 + #define iop_chan_pq_zero_sum_slot_count iop_chan_xor_slot_count 217 218 218 219 static inline u32 iop_desc_get_dest_addr(struct iop_adma_desc_slot *desc, 219 220 struct iop_adma_chan *chan) 220 221 { 221 222 struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 222 223 return hw_desc->dest_addr; 224 + } 225 + 226 + static inline u32 iop_desc_get_qdest_addr(struct iop_adma_desc_slot *desc, 227 + struct iop_adma_chan *chan) 228 + { 229 + struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 230 + return hw_desc->q_dest_addr; 223 231 } 224 232 225 233 static inline u32 iop_desc_get_byte_count(struct iop_adma_desc_slot *desc, ··· 331 319 return 1; 332 320 } 333 321 322 + static inline void 323 + iop_desc_init_pq(struct iop_adma_desc_slot *desc, int src_cnt, 324 + unsigned long flags) 325 + { 326 + struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 327 + union { 328 + u32 value; 329 + struct iop13xx_adma_desc_ctrl field; 330 + } u_desc_ctrl; 331 + 332 + u_desc_ctrl.value = 0; 333 + u_desc_ctrl.field.src_select = src_cnt - 1; 334 + u_desc_ctrl.field.xfer_dir = 3; /* local to internal bus */ 335 + u_desc_ctrl.field.pq_xfer_en = 1; 336 + u_desc_ctrl.field.p_xfer_dis = !!(flags & DMA_PREP_PQ_DISABLE_P); 337 + u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT; 338 + hw_desc->desc_ctrl = u_desc_ctrl.value; 339 + } 340 + 341 + static inline int iop_desc_is_pq(struct iop_adma_desc_slot *desc) 342 + { 343 + struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 344 + union { 345 + u32 value; 346 + struct iop13xx_adma_desc_ctrl field; 347 + } u_desc_ctrl; 348 + 349 + u_desc_ctrl.value = hw_desc->desc_ctrl; 350 + return u_desc_ctrl.field.pq_xfer_en; 351 + } 352 + 353 + static inline void 354 + iop_desc_init_pq_zero_sum(struct iop_adma_desc_slot *desc, int src_cnt, 355 + unsigned long flags) 356 + { 357 + struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 358 + union { 359 + u32 value; 360 + struct iop13xx_adma_desc_ctrl field; 361 + } u_desc_ctrl; 362 + 363 + u_desc_ctrl.value = 0; 364 + u_desc_ctrl.field.src_select = src_cnt - 1; 365 + u_desc_ctrl.field.xfer_dir = 3; /* local to internal bus */ 366 + u_desc_ctrl.field.zero_result = 1; 367 + u_desc_ctrl.field.status_write_back_en = 1; 368 + u_desc_ctrl.field.pq_xfer_en = 1; 369 + u_desc_ctrl.field.p_xfer_dis = !!(flags & DMA_PREP_PQ_DISABLE_P); 370 + u_desc_ctrl.field.int_en = flags & DMA_PREP_INTERRUPT; 371 + hw_desc->desc_ctrl = u_desc_ctrl.value; 372 + } 373 + 334 374 static inline void iop_desc_set_byte_count(struct iop_adma_desc_slot *desc, 335 375 struct iop_adma_chan *chan, 336 376 u32 byte_count) ··· 415 351 } 416 352 } 417 353 354 + #define iop_desc_set_pq_zero_sum_byte_count iop_desc_set_zero_sum_byte_count 418 355 419 356 static inline void iop_desc_set_dest_addr(struct iop_adma_desc_slot *desc, 420 357 struct iop_adma_chan *chan, ··· 423 358 { 424 359 struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 425 360 hw_desc->dest_addr = addr; 361 + hw_desc->upper_dest_addr = 0; 362 + } 363 + 364 + static inline void 365 + iop_desc_set_pq_addr(struct iop_adma_desc_slot *desc, dma_addr_t *addr) 366 + { 367 + struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 368 + 369 + hw_desc->dest_addr = addr[0]; 370 + hw_desc->q_dest_addr = addr[1]; 426 371 hw_desc->upper_dest_addr = 0; 427 372 } 428 373 ··· 464 389 } 465 390 466 391 static inline void 392 + iop_desc_set_pq_src_addr(struct iop_adma_desc_slot *desc, int src_idx, 393 + dma_addr_t addr, unsigned char coef) 394 + { 395 + int slot_cnt = desc->slot_cnt, slots_per_op = desc->slots_per_op; 396 + struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc, *iter; 397 + struct iop13xx_adma_src *src; 398 + int i = 0; 399 + 400 + do { 401 + iter = iop_hw_desc_slot_idx(hw_desc, i); 402 + src = &iter->src[src_idx]; 403 + src->src_addr = addr; 404 + src->pq_upper_src_addr = 0; 405 + src->pq_dmlt = coef; 406 + slot_cnt -= slots_per_op; 407 + if (slot_cnt) { 408 + i += slots_per_op; 409 + addr += IOP_ADMA_PQ_MAX_BYTE_COUNT; 410 + } 411 + } while (slot_cnt); 412 + } 413 + 414 + static inline void 467 415 iop_desc_init_interrupt(struct iop_adma_desc_slot *desc, 468 416 struct iop_adma_chan *chan) 469 417 { ··· 497 399 } 498 400 499 401 #define iop_desc_set_zero_sum_src_addr iop_desc_set_xor_src_addr 402 + #define iop_desc_set_pq_zero_sum_src_addr iop_desc_set_pq_src_addr 403 + 404 + static inline void 405 + iop_desc_set_pq_zero_sum_addr(struct iop_adma_desc_slot *desc, int pq_idx, 406 + dma_addr_t *src) 407 + { 408 + iop_desc_set_xor_src_addr(desc, pq_idx, src[pq_idx]); 409 + iop_desc_set_xor_src_addr(desc, pq_idx+1, src[pq_idx+1]); 410 + } 500 411 501 412 static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc, 502 413 u32 next_desc_addr) ··· 535 428 hw_desc->block_fill_data = val; 536 429 } 537 430 538 - static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) 431 + static inline enum sum_check_flags 432 + iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) 539 433 { 540 434 struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; 541 435 struct iop13xx_adma_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; 542 436 struct iop13xx_adma_byte_count byte_count = hw_desc->byte_count_field; 437 + enum sum_check_flags flags; 543 438 544 439 BUG_ON(!(byte_count.tx_complete && desc_ctrl.zero_result)); 545 440 546 - if (desc_ctrl.pq_xfer_en) 547 - return byte_count.zero_result_err_q; 548 - else 549 - return byte_count.zero_result_err; 441 + flags = byte_count.zero_result_err_q << SUM_CHECK_Q; 442 + flags |= byte_count.zero_result_err << SUM_CHECK_P; 443 + 444 + return flags; 550 445 } 551 446 552 447 static inline void iop_chan_append(struct iop_adma_chan *chan)
+5 -12
arch/arm/mach-iop13xx/setup.c
··· 477 477 plat_data = &iop13xx_adma_0_data; 478 478 dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); 479 479 dma_cap_set(DMA_XOR, plat_data->cap_mask); 480 - dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); 481 - dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); 480 + dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); 482 481 dma_cap_set(DMA_MEMSET, plat_data->cap_mask); 483 - dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); 484 482 dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); 485 483 break; 486 484 case IOP13XX_INIT_ADMA_1: ··· 487 489 plat_data = &iop13xx_adma_1_data; 488 490 dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); 489 491 dma_cap_set(DMA_XOR, plat_data->cap_mask); 490 - dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); 491 - dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); 492 + dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); 492 493 dma_cap_set(DMA_MEMSET, plat_data->cap_mask); 493 - dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); 494 494 dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); 495 495 break; 496 496 case IOP13XX_INIT_ADMA_2: ··· 497 501 plat_data = &iop13xx_adma_2_data; 498 502 dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); 499 503 dma_cap_set(DMA_XOR, plat_data->cap_mask); 500 - dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); 501 - dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); 504 + dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask); 502 505 dma_cap_set(DMA_MEMSET, plat_data->cap_mask); 503 - dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); 504 506 dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); 505 - dma_cap_set(DMA_PQ_XOR, plat_data->cap_mask); 506 - dma_cap_set(DMA_PQ_UPDATE, plat_data->cap_mask); 507 - dma_cap_set(DMA_PQ_ZERO_SUM, plat_data->cap_mask); 507 + dma_cap_set(DMA_PQ, plat_data->cap_mask); 508 + dma_cap_set(DMA_PQ_VAL, plat_data->cap_mask); 508 509 break; 509 510 } 510 511 }
+1 -3
arch/arm/plat-iop/adma.c
··· 179 179 dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); 180 180 #else 181 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 182 dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); 184 183 #endif 185 184 ··· 187 188 dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); 188 189 #else 189 190 dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask); 190 - dma_cap_set(DMA_MEMCPY_CRC32C, iop3xx_dma_1_data.cap_mask); 191 191 dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); 192 192 #endif 193 193 ··· 196 198 dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); 197 199 #else 198 200 dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask); 199 - dma_cap_set(DMA_ZERO_SUM, iop3xx_aau_data.cap_mask); 201 + dma_cap_set(DMA_XOR_VAL, iop3xx_aau_data.cap_mask); 200 202 dma_cap_set(DMA_MEMSET, iop3xx_aau_data.cap_mask); 201 203 dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); 202 204 #endif
+136
arch/powerpc/include/asm/fsldma.h
··· 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__ */
+9 -3
arch/sh/drivers/dma/Kconfig
··· 1 1 menu "DMA support" 2 2 3 - config SH_DMA_API 4 - bool 5 3 6 4 config SH_DMA 7 5 bool "SuperH on-chip DMA controller (DMAC) support" 8 6 depends on CPU_SH3 || CPU_SH4 9 - select SH_DMA_API 10 7 default n 11 8 12 9 config SH_DMA_IRQ_MULTI ··· 15 18 CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7764 || \ 16 19 CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \ 17 20 CPU_SUBTYPE_SH7760 21 + 22 + config SH_DMA_API 23 + depends on SH_DMA 24 + bool "SuperH DMA API support" 25 + default n 26 + help 27 + SH_DMA_API always enabled DMA API of used SuperH. 28 + If you want to use DMA ENGINE, you must not enable this. 29 + Please enable DMA_ENGINE and SH_DMAE. 18 30 19 31 config NR_ONCHIP_DMA_CHANNELS 20 32 int
+1 -2
arch/sh/drivers/dma/Makefile
··· 2 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 6 - obj-$(CONFIG_SH_DMA) += dma-sh.o 5 + obj-$(CONFIG_SH_DMA_API) += dma-sh.o dma-api.o dma-sysfs.o 7 6 obj-$(CONFIG_PVR2_DMA) += dma-pvr2.o 8 7 obj-$(CONFIG_G2_DMA) += dma-g2.o 9 8 obj-$(CONFIG_SH_DMABRG) += dmabrg.o
+13
arch/sh/include/asm/dma-sh.h
··· 116 116 #define CHCR 0x0C 117 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 132 #endif /* __DMA_SH_H */
+9
crypto/async_tx/Kconfig
··· 14 14 tristate 15 15 select ASYNC_CORE 16 16 17 + config ASYNC_PQ 18 + tristate 19 + select ASYNC_CORE 20 + 21 + config ASYNC_RAID6_RECOV 22 + tristate 23 + select ASYNC_CORE 24 + select ASYNC_PQ 25 +
+3
crypto/async_tx/Makefile
··· 2 2 obj-$(CONFIG_ASYNC_MEMCPY) += async_memcpy.o 3 3 obj-$(CONFIG_ASYNC_MEMSET) += async_memset.o 4 4 obj-$(CONFIG_ASYNC_XOR) += async_xor.o 5 + obj-$(CONFIG_ASYNC_PQ) += async_pq.o 6 + obj-$(CONFIG_ASYNC_RAID6_RECOV) += async_raid6_recov.o 7 + obj-$(CONFIG_ASYNC_RAID6_TEST) += raid6test.o
+17 -27
crypto/async_tx/async_memcpy.c
··· 33 33 * async_memcpy - attempt to copy memory with a dma engine. 34 34 * @dest: destination page 35 35 * @src: src page 36 - * @offset: offset in pages to start transaction 36 + * @dest_offset: offset into 'dest' to start transaction 37 + * @src_offset: offset into 'src' to start transaction 37 38 * @len: length in bytes 38 - * @flags: ASYNC_TX_ACK, ASYNC_TX_DEP_ACK, 39 - * @depend_tx: memcpy depends on the result of this transaction 40 - * @cb_fn: function to call when the memcpy completes 41 - * @cb_param: parameter to pass to the callback routine 39 + * @submit: submission / completion modifiers 40 + * 41 + * honored flags: ASYNC_TX_ACK 42 42 */ 43 43 struct dma_async_tx_descriptor * 44 44 async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset, 45 - unsigned int src_offset, size_t len, enum async_tx_flags flags, 46 - struct dma_async_tx_descriptor *depend_tx, 47 - dma_async_tx_callback cb_fn, void *cb_param) 45 + unsigned int src_offset, size_t len, 46 + struct async_submit_ctl *submit) 48 47 { 49 - struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_MEMCPY, 48 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_MEMCPY, 50 49 &dest, 1, &src, 1, len); 51 50 struct dma_device *device = chan ? chan->device : NULL; 52 51 struct dma_async_tx_descriptor *tx = NULL; 53 52 54 - if (device) { 53 + if (device && is_dma_copy_aligned(device, src_offset, dest_offset, len)) { 55 54 dma_addr_t dma_dest, dma_src; 56 - unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; 55 + unsigned long dma_prep_flags = 0; 57 56 57 + if (submit->cb_fn) 58 + dma_prep_flags |= DMA_PREP_INTERRUPT; 59 + if (submit->flags & ASYNC_TX_FENCE) 60 + dma_prep_flags |= DMA_PREP_FENCE; 58 61 dma_dest = dma_map_page(device->dev, dest, dest_offset, len, 59 62 DMA_FROM_DEVICE); 60 63 ··· 70 67 71 68 if (tx) { 72 69 pr_debug("%s: (async) len: %zu\n", __func__, len); 73 - async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); 70 + async_tx_submit(chan, tx, submit); 74 71 } else { 75 72 void *dest_buf, *src_buf; 76 73 pr_debug("%s: (sync) len: %zu\n", __func__, len); 77 74 78 75 /* wait for any prerequisite operations */ 79 - async_tx_quiesce(&depend_tx); 76 + async_tx_quiesce(&submit->depend_tx); 80 77 81 78 dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset; 82 79 src_buf = kmap_atomic(src, KM_USER1) + src_offset; ··· 86 83 kunmap_atomic(dest_buf, KM_USER0); 87 84 kunmap_atomic(src_buf, KM_USER1); 88 85 89 - async_tx_sync_epilog(cb_fn, cb_param); 86 + async_tx_sync_epilog(submit); 90 87 } 91 88 92 89 return tx; 93 90 } 94 91 EXPORT_SYMBOL_GPL(async_memcpy); 95 - 96 - static int __init async_memcpy_init(void) 97 - { 98 - return 0; 99 - } 100 - 101 - static void __exit async_memcpy_exit(void) 102 - { 103 - do { } while (0); 104 - } 105 - 106 - module_init(async_memcpy_init); 107 - module_exit(async_memcpy_exit); 108 92 109 93 MODULE_AUTHOR("Intel Corporation"); 110 94 MODULE_DESCRIPTION("asynchronous memcpy api");
+15 -28
crypto/async_tx/async_memset.c
··· 35 35 * @val: fill value 36 36 * @offset: offset in pages to start transaction 37 37 * @len: length in bytes 38 - * @flags: ASYNC_TX_ACK, ASYNC_TX_DEP_ACK 39 - * @depend_tx: memset depends on the result of this transaction 40 - * @cb_fn: function to call when the memcpy completes 41 - * @cb_param: parameter to pass to the callback routine 38 + * 39 + * honored flags: ASYNC_TX_ACK 42 40 */ 43 41 struct dma_async_tx_descriptor * 44 - async_memset(struct page *dest, int val, unsigned int offset, 45 - size_t len, enum async_tx_flags flags, 46 - struct dma_async_tx_descriptor *depend_tx, 47 - dma_async_tx_callback cb_fn, void *cb_param) 42 + async_memset(struct page *dest, int val, unsigned int offset, size_t len, 43 + struct async_submit_ctl *submit) 48 44 { 49 - struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_MEMSET, 45 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_MEMSET, 50 46 &dest, 1, NULL, 0, len); 51 47 struct dma_device *device = chan ? chan->device : NULL; 52 48 struct dma_async_tx_descriptor *tx = NULL; 53 49 54 - if (device) { 50 + if (device && is_dma_fill_aligned(device, offset, 0, len)) { 55 51 dma_addr_t dma_dest; 56 - unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; 52 + unsigned long dma_prep_flags = 0; 57 53 54 + if (submit->cb_fn) 55 + dma_prep_flags |= DMA_PREP_INTERRUPT; 56 + if (submit->flags & ASYNC_TX_FENCE) 57 + dma_prep_flags |= DMA_PREP_FENCE; 58 58 dma_dest = dma_map_page(device->dev, dest, offset, len, 59 59 DMA_FROM_DEVICE); 60 60 ··· 64 64 65 65 if (tx) { 66 66 pr_debug("%s: (async) len: %zu\n", __func__, len); 67 - async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); 67 + async_tx_submit(chan, tx, submit); 68 68 } else { /* run the memset synchronously */ 69 69 void *dest_buf; 70 70 pr_debug("%s: (sync) len: %zu\n", __func__, len); 71 71 72 - dest_buf = (void *) (((char *) page_address(dest)) + offset); 72 + dest_buf = page_address(dest) + offset; 73 73 74 74 /* wait for any prerequisite operations */ 75 - async_tx_quiesce(&depend_tx); 75 + async_tx_quiesce(&submit->depend_tx); 76 76 77 77 memset(dest_buf, val, len); 78 78 79 - async_tx_sync_epilog(cb_fn, cb_param); 79 + async_tx_sync_epilog(submit); 80 80 } 81 81 82 82 return tx; 83 83 } 84 84 EXPORT_SYMBOL_GPL(async_memset); 85 - 86 - static int __init async_memset_init(void) 87 - { 88 - return 0; 89 - } 90 - 91 - static void __exit async_memset_exit(void) 92 - { 93 - do { } while (0); 94 - } 95 - 96 - module_init(async_memset_init); 97 - module_exit(async_memset_exit); 98 85 99 86 MODULE_AUTHOR("Intel Corporation"); 100 87 MODULE_DESCRIPTION("asynchronous memset api");
+395
crypto/async_tx/async_pq.c
··· 1 + /* 2 + * Copyright(c) 2007 Yuri Tikhonov <yur@emcraft.com> 3 + * Copyright(c) 2009 Intel Corporation 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License as published by the Free 7 + * Software Foundation; either version 2 of the License, or (at your option) 8 + * any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, but WITHOUT 11 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 + * more details. 14 + * 15 + * You should have received a copy of the GNU General Public License along with 16 + * this program; if not, write to the Free Software Foundation, Inc., 59 17 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 + * 19 + * The full GNU General Public License is included in this distribution in the 20 + * file called COPYING. 21 + */ 22 + #include <linux/kernel.h> 23 + #include <linux/interrupt.h> 24 + #include <linux/dma-mapping.h> 25 + #include <linux/raid/pq.h> 26 + #include <linux/async_tx.h> 27 + 28 + /** 29 + * scribble - space to hold throwaway P buffer for synchronous gen_syndrome 30 + */ 31 + static struct page *scribble; 32 + 33 + static bool is_raid6_zero_block(struct page *p) 34 + { 35 + return p == (void *) raid6_empty_zero_page; 36 + } 37 + 38 + /* the struct page *blocks[] parameter passed to async_gen_syndrome() 39 + * and async_syndrome_val() contains the 'P' destination address at 40 + * blocks[disks-2] and the 'Q' destination address at blocks[disks-1] 41 + * 42 + * note: these are macros as they are used as lvalues 43 + */ 44 + #define P(b, d) (b[d-2]) 45 + #define Q(b, d) (b[d-1]) 46 + 47 + /** 48 + * do_async_gen_syndrome - asynchronously calculate P and/or Q 49 + */ 50 + static __async_inline struct dma_async_tx_descriptor * 51 + do_async_gen_syndrome(struct dma_chan *chan, struct page **blocks, 52 + const unsigned char *scfs, unsigned int offset, int disks, 53 + size_t len, dma_addr_t *dma_src, 54 + struct async_submit_ctl *submit) 55 + { 56 + struct dma_async_tx_descriptor *tx = NULL; 57 + struct dma_device *dma = chan->device; 58 + enum dma_ctrl_flags dma_flags = 0; 59 + enum async_tx_flags flags_orig = submit->flags; 60 + dma_async_tx_callback cb_fn_orig = submit->cb_fn; 61 + dma_async_tx_callback cb_param_orig = submit->cb_param; 62 + int src_cnt = disks - 2; 63 + unsigned char coefs[src_cnt]; 64 + unsigned short pq_src_cnt; 65 + dma_addr_t dma_dest[2]; 66 + int src_off = 0; 67 + int idx; 68 + int i; 69 + 70 + /* DMAs use destinations as sources, so use BIDIRECTIONAL mapping */ 71 + if (P(blocks, disks)) 72 + dma_dest[0] = dma_map_page(dma->dev, P(blocks, disks), offset, 73 + len, DMA_BIDIRECTIONAL); 74 + else 75 + dma_flags |= DMA_PREP_PQ_DISABLE_P; 76 + if (Q(blocks, disks)) 77 + dma_dest[1] = dma_map_page(dma->dev, Q(blocks, disks), offset, 78 + len, DMA_BIDIRECTIONAL); 79 + else 80 + dma_flags |= DMA_PREP_PQ_DISABLE_Q; 81 + 82 + /* convert source addresses being careful to collapse 'empty' 83 + * sources and update the coefficients accordingly 84 + */ 85 + for (i = 0, idx = 0; i < src_cnt; i++) { 86 + if (is_raid6_zero_block(blocks[i])) 87 + continue; 88 + dma_src[idx] = dma_map_page(dma->dev, blocks[i], offset, len, 89 + DMA_TO_DEVICE); 90 + coefs[idx] = scfs[i]; 91 + idx++; 92 + } 93 + src_cnt = idx; 94 + 95 + while (src_cnt > 0) { 96 + submit->flags = flags_orig; 97 + pq_src_cnt = min(src_cnt, dma_maxpq(dma, dma_flags)); 98 + /* if we are submitting additional pqs, leave the chain open, 99 + * clear the callback parameters, and leave the destination 100 + * buffers mapped 101 + */ 102 + if (src_cnt > pq_src_cnt) { 103 + submit->flags &= ~ASYNC_TX_ACK; 104 + submit->flags |= ASYNC_TX_FENCE; 105 + dma_flags |= DMA_COMPL_SKIP_DEST_UNMAP; 106 + submit->cb_fn = NULL; 107 + submit->cb_param = NULL; 108 + } else { 109 + dma_flags &= ~DMA_COMPL_SKIP_DEST_UNMAP; 110 + submit->cb_fn = cb_fn_orig; 111 + submit->cb_param = cb_param_orig; 112 + if (cb_fn_orig) 113 + dma_flags |= DMA_PREP_INTERRUPT; 114 + } 115 + if (submit->flags & ASYNC_TX_FENCE) 116 + dma_flags |= DMA_PREP_FENCE; 117 + 118 + /* Since we have clobbered the src_list we are committed 119 + * to doing this asynchronously. Drivers force forward 120 + * progress in case they can not provide a descriptor 121 + */ 122 + for (;;) { 123 + tx = dma->device_prep_dma_pq(chan, dma_dest, 124 + &dma_src[src_off], 125 + pq_src_cnt, 126 + &coefs[src_off], len, 127 + dma_flags); 128 + if (likely(tx)) 129 + break; 130 + async_tx_quiesce(&submit->depend_tx); 131 + dma_async_issue_pending(chan); 132 + } 133 + 134 + async_tx_submit(chan, tx, submit); 135 + submit->depend_tx = tx; 136 + 137 + /* drop completed sources */ 138 + src_cnt -= pq_src_cnt; 139 + src_off += pq_src_cnt; 140 + 141 + dma_flags |= DMA_PREP_CONTINUE; 142 + } 143 + 144 + return tx; 145 + } 146 + 147 + /** 148 + * do_sync_gen_syndrome - synchronously calculate a raid6 syndrome 149 + */ 150 + static void 151 + do_sync_gen_syndrome(struct page **blocks, unsigned int offset, int disks, 152 + size_t len, struct async_submit_ctl *submit) 153 + { 154 + void **srcs; 155 + int i; 156 + 157 + if (submit->scribble) 158 + srcs = submit->scribble; 159 + else 160 + srcs = (void **) blocks; 161 + 162 + for (i = 0; i < disks; i++) { 163 + if (is_raid6_zero_block(blocks[i])) { 164 + BUG_ON(i > disks - 3); /* P or Q can't be zero */ 165 + srcs[i] = blocks[i]; 166 + } else 167 + srcs[i] = page_address(blocks[i]) + offset; 168 + } 169 + raid6_call.gen_syndrome(disks, len, srcs); 170 + async_tx_sync_epilog(submit); 171 + } 172 + 173 + /** 174 + * async_gen_syndrome - asynchronously calculate a raid6 syndrome 175 + * @blocks: source blocks from idx 0..disks-3, P @ disks-2 and Q @ disks-1 176 + * @offset: common offset into each block (src and dest) to start transaction 177 + * @disks: number of blocks (including missing P or Q, see below) 178 + * @len: length of operation in bytes 179 + * @submit: submission/completion modifiers 180 + * 181 + * General note: This routine assumes a field of GF(2^8) with a 182 + * primitive polynomial of 0x11d and a generator of {02}. 183 + * 184 + * 'disks' note: callers can optionally omit either P or Q (but not 185 + * both) from the calculation by setting blocks[disks-2] or 186 + * blocks[disks-1] to NULL. When P or Q is omitted 'len' must be <= 187 + * PAGE_SIZE as a temporary buffer of this size is used in the 188 + * synchronous path. 'disks' always accounts for both destination 189 + * buffers. 190 + * 191 + * 'blocks' note: if submit->scribble is NULL then the contents of 192 + * 'blocks' may be overridden 193 + */ 194 + struct dma_async_tx_descriptor * 195 + async_gen_syndrome(struct page **blocks, unsigned int offset, int disks, 196 + size_t len, struct async_submit_ctl *submit) 197 + { 198 + int src_cnt = disks - 2; 199 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ, 200 + &P(blocks, disks), 2, 201 + blocks, src_cnt, len); 202 + struct dma_device *device = chan ? chan->device : NULL; 203 + dma_addr_t *dma_src = NULL; 204 + 205 + BUG_ON(disks > 255 || !(P(blocks, disks) || Q(blocks, disks))); 206 + 207 + if (submit->scribble) 208 + dma_src = submit->scribble; 209 + else if (sizeof(dma_addr_t) <= sizeof(struct page *)) 210 + dma_src = (dma_addr_t *) blocks; 211 + 212 + if (dma_src && device && 213 + (src_cnt <= dma_maxpq(device, 0) || 214 + dma_maxpq(device, DMA_PREP_CONTINUE) > 0) && 215 + is_dma_pq_aligned(device, offset, 0, len)) { 216 + /* run the p+q asynchronously */ 217 + pr_debug("%s: (async) disks: %d len: %zu\n", 218 + __func__, disks, len); 219 + return do_async_gen_syndrome(chan, blocks, raid6_gfexp, offset, 220 + disks, len, dma_src, submit); 221 + } 222 + 223 + /* run the pq synchronously */ 224 + pr_debug("%s: (sync) disks: %d len: %zu\n", __func__, disks, len); 225 + 226 + /* wait for any prerequisite operations */ 227 + async_tx_quiesce(&submit->depend_tx); 228 + 229 + if (!P(blocks, disks)) { 230 + P(blocks, disks) = scribble; 231 + BUG_ON(len + offset > PAGE_SIZE); 232 + } 233 + if (!Q(blocks, disks)) { 234 + Q(blocks, disks) = scribble; 235 + BUG_ON(len + offset > PAGE_SIZE); 236 + } 237 + do_sync_gen_syndrome(blocks, offset, disks, len, submit); 238 + 239 + return NULL; 240 + } 241 + EXPORT_SYMBOL_GPL(async_gen_syndrome); 242 + 243 + /** 244 + * async_syndrome_val - asynchronously validate a raid6 syndrome 245 + * @blocks: source blocks from idx 0..disks-3, P @ disks-2 and Q @ disks-1 246 + * @offset: common offset into each block (src and dest) to start transaction 247 + * @disks: number of blocks (including missing P or Q, see below) 248 + * @len: length of operation in bytes 249 + * @pqres: on val failure SUM_CHECK_P_RESULT and/or SUM_CHECK_Q_RESULT are set 250 + * @spare: temporary result buffer for the synchronous case 251 + * @submit: submission / completion modifiers 252 + * 253 + * The same notes from async_gen_syndrome apply to the 'blocks', 254 + * and 'disks' parameters of this routine. The synchronous path 255 + * requires a temporary result buffer and submit->scribble to be 256 + * specified. 257 + */ 258 + struct dma_async_tx_descriptor * 259 + async_syndrome_val(struct page **blocks, unsigned int offset, int disks, 260 + size_t len, enum sum_check_flags *pqres, struct page *spare, 261 + struct async_submit_ctl *submit) 262 + { 263 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ_VAL, 264 + NULL, 0, blocks, disks, 265 + len); 266 + struct dma_device *device = chan ? chan->device : NULL; 267 + struct dma_async_tx_descriptor *tx; 268 + enum dma_ctrl_flags dma_flags = submit->cb_fn ? DMA_PREP_INTERRUPT : 0; 269 + dma_addr_t *dma_src = NULL; 270 + 271 + BUG_ON(disks < 4); 272 + 273 + if (submit->scribble) 274 + dma_src = submit->scribble; 275 + else if (sizeof(dma_addr_t) <= sizeof(struct page *)) 276 + dma_src = (dma_addr_t *) blocks; 277 + 278 + if (dma_src && device && disks <= dma_maxpq(device, 0) && 279 + is_dma_pq_aligned(device, offset, 0, len)) { 280 + struct device *dev = device->dev; 281 + dma_addr_t *pq = &dma_src[disks-2]; 282 + int i; 283 + 284 + pr_debug("%s: (async) disks: %d len: %zu\n", 285 + __func__, disks, len); 286 + if (!P(blocks, disks)) 287 + dma_flags |= DMA_PREP_PQ_DISABLE_P; 288 + if (!Q(blocks, disks)) 289 + dma_flags |= DMA_PREP_PQ_DISABLE_Q; 290 + if (submit->flags & ASYNC_TX_FENCE) 291 + dma_flags |= DMA_PREP_FENCE; 292 + for (i = 0; i < disks; i++) 293 + if (likely(blocks[i])) { 294 + BUG_ON(is_raid6_zero_block(blocks[i])); 295 + dma_src[i] = dma_map_page(dev, blocks[i], 296 + offset, len, 297 + DMA_TO_DEVICE); 298 + } 299 + 300 + for (;;) { 301 + tx = device->device_prep_dma_pq_val(chan, pq, dma_src, 302 + disks - 2, 303 + raid6_gfexp, 304 + len, pqres, 305 + dma_flags); 306 + if (likely(tx)) 307 + break; 308 + async_tx_quiesce(&submit->depend_tx); 309 + dma_async_issue_pending(chan); 310 + } 311 + async_tx_submit(chan, tx, submit); 312 + 313 + return tx; 314 + } else { 315 + struct page *p_src = P(blocks, disks); 316 + struct page *q_src = Q(blocks, disks); 317 + enum async_tx_flags flags_orig = submit->flags; 318 + dma_async_tx_callback cb_fn_orig = submit->cb_fn; 319 + void *scribble = submit->scribble; 320 + void *cb_param_orig = submit->cb_param; 321 + void *p, *q, *s; 322 + 323 + pr_debug("%s: (sync) disks: %d len: %zu\n", 324 + __func__, disks, len); 325 + 326 + /* caller must provide a temporary result buffer and 327 + * allow the input parameters to be preserved 328 + */ 329 + BUG_ON(!spare || !scribble); 330 + 331 + /* wait for any prerequisite operations */ 332 + async_tx_quiesce(&submit->depend_tx); 333 + 334 + /* recompute p and/or q into the temporary buffer and then 335 + * check to see the result matches the current value 336 + */ 337 + tx = NULL; 338 + *pqres = 0; 339 + if (p_src) { 340 + init_async_submit(submit, ASYNC_TX_XOR_ZERO_DST, NULL, 341 + NULL, NULL, scribble); 342 + tx = async_xor(spare, blocks, offset, disks-2, len, submit); 343 + async_tx_quiesce(&tx); 344 + p = page_address(p_src) + offset; 345 + s = page_address(spare) + offset; 346 + *pqres |= !!memcmp(p, s, len) << SUM_CHECK_P; 347 + } 348 + 349 + if (q_src) { 350 + P(blocks, disks) = NULL; 351 + Q(blocks, disks) = spare; 352 + init_async_submit(submit, 0, NULL, NULL, NULL, scribble); 353 + tx = async_gen_syndrome(blocks, offset, disks, len, submit); 354 + async_tx_quiesce(&tx); 355 + q = page_address(q_src) + offset; 356 + s = page_address(spare) + offset; 357 + *pqres |= !!memcmp(q, s, len) << SUM_CHECK_Q; 358 + } 359 + 360 + /* restore P, Q and submit */ 361 + P(blocks, disks) = p_src; 362 + Q(blocks, disks) = q_src; 363 + 364 + submit->cb_fn = cb_fn_orig; 365 + submit->cb_param = cb_param_orig; 366 + submit->flags = flags_orig; 367 + async_tx_sync_epilog(submit); 368 + 369 + return NULL; 370 + } 371 + } 372 + EXPORT_SYMBOL_GPL(async_syndrome_val); 373 + 374 + static int __init async_pq_init(void) 375 + { 376 + scribble = alloc_page(GFP_KERNEL); 377 + 378 + if (scribble) 379 + return 0; 380 + 381 + pr_err("%s: failed to allocate required spare page\n", __func__); 382 + 383 + return -ENOMEM; 384 + } 385 + 386 + static void __exit async_pq_exit(void) 387 + { 388 + put_page(scribble); 389 + } 390 + 391 + module_init(async_pq_init); 392 + module_exit(async_pq_exit); 393 + 394 + MODULE_DESCRIPTION("asynchronous raid6 syndrome generation/validation"); 395 + MODULE_LICENSE("GPL");
+468
crypto/async_tx/async_raid6_recov.c
··· 1 + /* 2 + * Asynchronous RAID-6 recovery calculations ASYNC_TX API. 3 + * Copyright(c) 2009 Intel Corporation 4 + * 5 + * based on raid6recov.c: 6 + * Copyright 2002 H. Peter Anvin 7 + * 8 + * This program is free software; you can redistribute it and/or modify it 9 + * under the terms of the GNU General Public License as published by the Free 10 + * Software Foundation; either version 2 of the License, or (at your option) 11 + * any later version. 12 + * 13 + * This program is distributed in the hope that it will be useful, but WITHOUT 14 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 + * more details. 17 + * 18 + * You should have received a copy of the GNU General Public License along with 19 + * this program; if not, write to the Free Software Foundation, Inc., 51 20 + * Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21 + * 22 + */ 23 + #include <linux/kernel.h> 24 + #include <linux/interrupt.h> 25 + #include <linux/dma-mapping.h> 26 + #include <linux/raid/pq.h> 27 + #include <linux/async_tx.h> 28 + 29 + static struct dma_async_tx_descriptor * 30 + async_sum_product(struct page *dest, struct page **srcs, unsigned char *coef, 31 + size_t len, struct async_submit_ctl *submit) 32 + { 33 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ, 34 + &dest, 1, srcs, 2, len); 35 + struct dma_device *dma = chan ? chan->device : NULL; 36 + const u8 *amul, *bmul; 37 + u8 ax, bx; 38 + u8 *a, *b, *c; 39 + 40 + if (dma) { 41 + dma_addr_t dma_dest[2]; 42 + dma_addr_t dma_src[2]; 43 + struct device *dev = dma->dev; 44 + struct dma_async_tx_descriptor *tx; 45 + enum dma_ctrl_flags dma_flags = DMA_PREP_PQ_DISABLE_P; 46 + 47 + if (submit->flags & ASYNC_TX_FENCE) 48 + dma_flags |= DMA_PREP_FENCE; 49 + dma_dest[1] = dma_map_page(dev, dest, 0, len, DMA_BIDIRECTIONAL); 50 + dma_src[0] = dma_map_page(dev, srcs[0], 0, len, DMA_TO_DEVICE); 51 + dma_src[1] = dma_map_page(dev, srcs[1], 0, len, DMA_TO_DEVICE); 52 + tx = dma->device_prep_dma_pq(chan, dma_dest, dma_src, 2, coef, 53 + len, dma_flags); 54 + if (tx) { 55 + async_tx_submit(chan, tx, submit); 56 + return tx; 57 + } 58 + 59 + /* could not get a descriptor, unmap and fall through to 60 + * the synchronous path 61 + */ 62 + dma_unmap_page(dev, dma_dest[1], len, DMA_BIDIRECTIONAL); 63 + dma_unmap_page(dev, dma_src[0], len, DMA_TO_DEVICE); 64 + dma_unmap_page(dev, dma_src[1], len, DMA_TO_DEVICE); 65 + } 66 + 67 + /* run the operation synchronously */ 68 + async_tx_quiesce(&submit->depend_tx); 69 + amul = raid6_gfmul[coef[0]]; 70 + bmul = raid6_gfmul[coef[1]]; 71 + a = page_address(srcs[0]); 72 + b = page_address(srcs[1]); 73 + c = page_address(dest); 74 + 75 + while (len--) { 76 + ax = amul[*a++]; 77 + bx = bmul[*b++]; 78 + *c++ = ax ^ bx; 79 + } 80 + 81 + return NULL; 82 + } 83 + 84 + static struct dma_async_tx_descriptor * 85 + async_mult(struct page *dest, struct page *src, u8 coef, size_t len, 86 + struct async_submit_ctl *submit) 87 + { 88 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ, 89 + &dest, 1, &src, 1, len); 90 + struct dma_device *dma = chan ? chan->device : NULL; 91 + const u8 *qmul; /* Q multiplier table */ 92 + u8 *d, *s; 93 + 94 + if (dma) { 95 + dma_addr_t dma_dest[2]; 96 + dma_addr_t dma_src[1]; 97 + struct device *dev = dma->dev; 98 + struct dma_async_tx_descriptor *tx; 99 + enum dma_ctrl_flags dma_flags = DMA_PREP_PQ_DISABLE_P; 100 + 101 + if (submit->flags & ASYNC_TX_FENCE) 102 + dma_flags |= DMA_PREP_FENCE; 103 + dma_dest[1] = dma_map_page(dev, dest, 0, len, DMA_BIDIRECTIONAL); 104 + dma_src[0] = dma_map_page(dev, src, 0, len, DMA_TO_DEVICE); 105 + tx = dma->device_prep_dma_pq(chan, dma_dest, dma_src, 1, &coef, 106 + len, dma_flags); 107 + if (tx) { 108 + async_tx_submit(chan, tx, submit); 109 + return tx; 110 + } 111 + 112 + /* could not get a descriptor, unmap and fall through to 113 + * the synchronous path 114 + */ 115 + dma_unmap_page(dev, dma_dest[1], len, DMA_BIDIRECTIONAL); 116 + dma_unmap_page(dev, dma_src[0], len, DMA_TO_DEVICE); 117 + } 118 + 119 + /* no channel available, or failed to allocate a descriptor, so 120 + * perform the operation synchronously 121 + */ 122 + async_tx_quiesce(&submit->depend_tx); 123 + qmul = raid6_gfmul[coef]; 124 + d = page_address(dest); 125 + s = page_address(src); 126 + 127 + while (len--) 128 + *d++ = qmul[*s++]; 129 + 130 + return NULL; 131 + } 132 + 133 + static struct dma_async_tx_descriptor * 134 + __2data_recov_4(size_t bytes, int faila, int failb, struct page **blocks, 135 + struct async_submit_ctl *submit) 136 + { 137 + struct dma_async_tx_descriptor *tx = NULL; 138 + struct page *p, *q, *a, *b; 139 + struct page *srcs[2]; 140 + unsigned char coef[2]; 141 + enum async_tx_flags flags = submit->flags; 142 + dma_async_tx_callback cb_fn = submit->cb_fn; 143 + void *cb_param = submit->cb_param; 144 + void *scribble = submit->scribble; 145 + 146 + p = blocks[4-2]; 147 + q = blocks[4-1]; 148 + 149 + a = blocks[faila]; 150 + b = blocks[failb]; 151 + 152 + /* in the 4 disk case P + Pxy == P and Q + Qxy == Q */ 153 + /* Dx = A*(P+Pxy) + B*(Q+Qxy) */ 154 + srcs[0] = p; 155 + srcs[1] = q; 156 + coef[0] = raid6_gfexi[failb-faila]; 157 + coef[1] = raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]]; 158 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 159 + tx = async_sum_product(b, srcs, coef, bytes, submit); 160 + 161 + /* Dy = P+Pxy+Dx */ 162 + srcs[0] = p; 163 + srcs[1] = b; 164 + init_async_submit(submit, flags | ASYNC_TX_XOR_ZERO_DST, tx, cb_fn, 165 + cb_param, scribble); 166 + tx = async_xor(a, srcs, 0, 2, bytes, submit); 167 + 168 + return tx; 169 + 170 + } 171 + 172 + static struct dma_async_tx_descriptor * 173 + __2data_recov_5(size_t bytes, int faila, int failb, struct page **blocks, 174 + struct async_submit_ctl *submit) 175 + { 176 + struct dma_async_tx_descriptor *tx = NULL; 177 + struct page *p, *q, *g, *dp, *dq; 178 + struct page *srcs[2]; 179 + unsigned char coef[2]; 180 + enum async_tx_flags flags = submit->flags; 181 + dma_async_tx_callback cb_fn = submit->cb_fn; 182 + void *cb_param = submit->cb_param; 183 + void *scribble = submit->scribble; 184 + int uninitialized_var(good); 185 + int i; 186 + 187 + for (i = 0; i < 3; i++) { 188 + if (i == faila || i == failb) 189 + continue; 190 + else { 191 + good = i; 192 + break; 193 + } 194 + } 195 + BUG_ON(i >= 3); 196 + 197 + p = blocks[5-2]; 198 + q = blocks[5-1]; 199 + g = blocks[good]; 200 + 201 + /* Compute syndrome with zero for the missing data pages 202 + * Use the dead data pages as temporary storage for delta p and 203 + * delta q 204 + */ 205 + dp = blocks[faila]; 206 + dq = blocks[failb]; 207 + 208 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 209 + tx = async_memcpy(dp, g, 0, 0, bytes, submit); 210 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 211 + tx = async_mult(dq, g, raid6_gfexp[good], bytes, submit); 212 + 213 + /* compute P + Pxy */ 214 + srcs[0] = dp; 215 + srcs[1] = p; 216 + init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx, 217 + NULL, NULL, scribble); 218 + tx = async_xor(dp, srcs, 0, 2, bytes, submit); 219 + 220 + /* compute Q + Qxy */ 221 + srcs[0] = dq; 222 + srcs[1] = q; 223 + init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx, 224 + NULL, NULL, scribble); 225 + tx = async_xor(dq, srcs, 0, 2, bytes, submit); 226 + 227 + /* Dx = A*(P+Pxy) + B*(Q+Qxy) */ 228 + srcs[0] = dp; 229 + srcs[1] = dq; 230 + coef[0] = raid6_gfexi[failb-faila]; 231 + coef[1] = raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]]; 232 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 233 + tx = async_sum_product(dq, srcs, coef, bytes, submit); 234 + 235 + /* Dy = P+Pxy+Dx */ 236 + srcs[0] = dp; 237 + srcs[1] = dq; 238 + init_async_submit(submit, flags | ASYNC_TX_XOR_DROP_DST, tx, cb_fn, 239 + cb_param, scribble); 240 + tx = async_xor(dp, srcs, 0, 2, bytes, submit); 241 + 242 + return tx; 243 + } 244 + 245 + static struct dma_async_tx_descriptor * 246 + __2data_recov_n(int disks, size_t bytes, int faila, int failb, 247 + struct page **blocks, struct async_submit_ctl *submit) 248 + { 249 + struct dma_async_tx_descriptor *tx = NULL; 250 + struct page *p, *q, *dp, *dq; 251 + struct page *srcs[2]; 252 + unsigned char coef[2]; 253 + enum async_tx_flags flags = submit->flags; 254 + dma_async_tx_callback cb_fn = submit->cb_fn; 255 + void *cb_param = submit->cb_param; 256 + void *scribble = submit->scribble; 257 + 258 + p = blocks[disks-2]; 259 + q = blocks[disks-1]; 260 + 261 + /* Compute syndrome with zero for the missing data pages 262 + * Use the dead data pages as temporary storage for 263 + * delta p and delta q 264 + */ 265 + dp = blocks[faila]; 266 + blocks[faila] = (void *)raid6_empty_zero_page; 267 + blocks[disks-2] = dp; 268 + dq = blocks[failb]; 269 + blocks[failb] = (void *)raid6_empty_zero_page; 270 + blocks[disks-1] = dq; 271 + 272 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 273 + tx = async_gen_syndrome(blocks, 0, disks, bytes, submit); 274 + 275 + /* Restore pointer table */ 276 + blocks[faila] = dp; 277 + blocks[failb] = dq; 278 + blocks[disks-2] = p; 279 + blocks[disks-1] = q; 280 + 281 + /* compute P + Pxy */ 282 + srcs[0] = dp; 283 + srcs[1] = p; 284 + init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx, 285 + NULL, NULL, scribble); 286 + tx = async_xor(dp, srcs, 0, 2, bytes, submit); 287 + 288 + /* compute Q + Qxy */ 289 + srcs[0] = dq; 290 + srcs[1] = q; 291 + init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx, 292 + NULL, NULL, scribble); 293 + tx = async_xor(dq, srcs, 0, 2, bytes, submit); 294 + 295 + /* Dx = A*(P+Pxy) + B*(Q+Qxy) */ 296 + srcs[0] = dp; 297 + srcs[1] = dq; 298 + coef[0] = raid6_gfexi[failb-faila]; 299 + coef[1] = raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]]; 300 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 301 + tx = async_sum_product(dq, srcs, coef, bytes, submit); 302 + 303 + /* Dy = P+Pxy+Dx */ 304 + srcs[0] = dp; 305 + srcs[1] = dq; 306 + init_async_submit(submit, flags | ASYNC_TX_XOR_DROP_DST, tx, cb_fn, 307 + cb_param, scribble); 308 + tx = async_xor(dp, srcs, 0, 2, bytes, submit); 309 + 310 + return tx; 311 + } 312 + 313 + /** 314 + * async_raid6_2data_recov - asynchronously calculate two missing data blocks 315 + * @disks: number of disks in the RAID-6 array 316 + * @bytes: block size 317 + * @faila: first failed drive index 318 + * @failb: second failed drive index 319 + * @blocks: array of source pointers where the last two entries are p and q 320 + * @submit: submission/completion modifiers 321 + */ 322 + struct dma_async_tx_descriptor * 323 + async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb, 324 + struct page **blocks, struct async_submit_ctl *submit) 325 + { 326 + BUG_ON(faila == failb); 327 + if (failb < faila) 328 + swap(faila, failb); 329 + 330 + pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes); 331 + 332 + /* we need to preserve the contents of 'blocks' for the async 333 + * case, so punt to synchronous if a scribble buffer is not available 334 + */ 335 + if (!submit->scribble) { 336 + void **ptrs = (void **) blocks; 337 + int i; 338 + 339 + async_tx_quiesce(&submit->depend_tx); 340 + for (i = 0; i < disks; i++) 341 + ptrs[i] = page_address(blocks[i]); 342 + 343 + raid6_2data_recov(disks, bytes, faila, failb, ptrs); 344 + 345 + async_tx_sync_epilog(submit); 346 + 347 + return NULL; 348 + } 349 + 350 + switch (disks) { 351 + case 4: 352 + /* dma devices do not uniformly understand a zero source pq 353 + * operation (in contrast to the synchronous case), so 354 + * explicitly handle the 4 disk special case 355 + */ 356 + return __2data_recov_4(bytes, faila, failb, blocks, submit); 357 + case 5: 358 + /* dma devices do not uniformly understand a single 359 + * source pq operation (in contrast to the synchronous 360 + * case), so explicitly handle the 5 disk special case 361 + */ 362 + return __2data_recov_5(bytes, faila, failb, blocks, submit); 363 + default: 364 + return __2data_recov_n(disks, bytes, faila, failb, blocks, submit); 365 + } 366 + } 367 + EXPORT_SYMBOL_GPL(async_raid6_2data_recov); 368 + 369 + /** 370 + * async_raid6_datap_recov - asynchronously calculate a data and the 'p' block 371 + * @disks: number of disks in the RAID-6 array 372 + * @bytes: block size 373 + * @faila: failed drive index 374 + * @blocks: array of source pointers where the last two entries are p and q 375 + * @submit: submission/completion modifiers 376 + */ 377 + struct dma_async_tx_descriptor * 378 + async_raid6_datap_recov(int disks, size_t bytes, int faila, 379 + struct page **blocks, struct async_submit_ctl *submit) 380 + { 381 + struct dma_async_tx_descriptor *tx = NULL; 382 + struct page *p, *q, *dq; 383 + u8 coef; 384 + enum async_tx_flags flags = submit->flags; 385 + dma_async_tx_callback cb_fn = submit->cb_fn; 386 + void *cb_param = submit->cb_param; 387 + void *scribble = submit->scribble; 388 + struct page *srcs[2]; 389 + 390 + pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes); 391 + 392 + /* we need to preserve the contents of 'blocks' for the async 393 + * case, so punt to synchronous if a scribble buffer is not available 394 + */ 395 + if (!scribble) { 396 + void **ptrs = (void **) blocks; 397 + int i; 398 + 399 + async_tx_quiesce(&submit->depend_tx); 400 + for (i = 0; i < disks; i++) 401 + ptrs[i] = page_address(blocks[i]); 402 + 403 + raid6_datap_recov(disks, bytes, faila, ptrs); 404 + 405 + async_tx_sync_epilog(submit); 406 + 407 + return NULL; 408 + } 409 + 410 + p = blocks[disks-2]; 411 + q = blocks[disks-1]; 412 + 413 + /* Compute syndrome with zero for the missing data page 414 + * Use the dead data page as temporary storage for delta q 415 + */ 416 + dq = blocks[faila]; 417 + blocks[faila] = (void *)raid6_empty_zero_page; 418 + blocks[disks-1] = dq; 419 + 420 + /* in the 4 disk case we only need to perform a single source 421 + * multiplication 422 + */ 423 + if (disks == 4) { 424 + int good = faila == 0 ? 1 : 0; 425 + struct page *g = blocks[good]; 426 + 427 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, 428 + scribble); 429 + tx = async_memcpy(p, g, 0, 0, bytes, submit); 430 + 431 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, 432 + scribble); 433 + tx = async_mult(dq, g, raid6_gfexp[good], bytes, submit); 434 + } else { 435 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, 436 + scribble); 437 + tx = async_gen_syndrome(blocks, 0, disks, bytes, submit); 438 + } 439 + 440 + /* Restore pointer table */ 441 + blocks[faila] = dq; 442 + blocks[disks-1] = q; 443 + 444 + /* calculate g^{-faila} */ 445 + coef = raid6_gfinv[raid6_gfexp[faila]]; 446 + 447 + srcs[0] = dq; 448 + srcs[1] = q; 449 + init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx, 450 + NULL, NULL, scribble); 451 + tx = async_xor(dq, srcs, 0, 2, bytes, submit); 452 + 453 + init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble); 454 + tx = async_mult(dq, dq, coef, bytes, submit); 455 + 456 + srcs[0] = p; 457 + srcs[1] = dq; 458 + init_async_submit(submit, flags | ASYNC_TX_XOR_DROP_DST, tx, cb_fn, 459 + cb_param, scribble); 460 + tx = async_xor(p, srcs, 0, 2, bytes, submit); 461 + 462 + return tx; 463 + } 464 + EXPORT_SYMBOL_GPL(async_raid6_datap_recov); 465 + 466 + MODULE_AUTHOR("Dan Williams <dan.j.williams@intel.com>"); 467 + MODULE_DESCRIPTION("asynchronous RAID-6 recovery api"); 468 + MODULE_LICENSE("GPL");
+42 -45
crypto/async_tx/async_tx.c
··· 42 42 async_dmaengine_put(); 43 43 } 44 44 45 + module_init(async_tx_init); 46 + module_exit(async_tx_exit); 47 + 45 48 /** 46 49 * __async_tx_find_channel - find a channel to carry out the operation or let 47 50 * the transaction execute synchronously 48 - * @depend_tx: transaction dependency 51 + * @submit: transaction dependency and submission modifiers 49 52 * @tx_type: transaction type 50 53 */ 51 54 struct dma_chan * 52 - __async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, 53 - enum dma_transaction_type tx_type) 55 + __async_tx_find_channel(struct async_submit_ctl *submit, 56 + enum dma_transaction_type tx_type) 54 57 { 58 + struct dma_async_tx_descriptor *depend_tx = submit->depend_tx; 59 + 55 60 /* see if we can keep the chain on one channel */ 56 61 if (depend_tx && 57 62 dma_has_cap(tx_type, depend_tx->chan->device->cap_mask)) ··· 64 59 return async_dma_find_channel(tx_type); 65 60 } 66 61 EXPORT_SYMBOL_GPL(__async_tx_find_channel); 67 - #else 68 - static int __init async_tx_init(void) 69 - { 70 - printk(KERN_INFO "async_tx: api initialized (sync-only)\n"); 71 - return 0; 72 - } 73 - 74 - static void __exit async_tx_exit(void) 75 - { 76 - do { } while (0); 77 - } 78 62 #endif 79 63 80 64 ··· 77 83 async_tx_channel_switch(struct dma_async_tx_descriptor *depend_tx, 78 84 struct dma_async_tx_descriptor *tx) 79 85 { 80 - struct dma_chan *chan; 81 - struct dma_device *device; 86 + struct dma_chan *chan = depend_tx->chan; 87 + struct dma_device *device = chan->device; 82 88 struct dma_async_tx_descriptor *intr_tx = (void *) ~0; 89 + 90 + #ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH 91 + BUG(); 92 + #endif 83 93 84 94 /* first check to see if we can still append to depend_tx */ 85 95 spin_lock_bh(&depend_tx->lock); ··· 94 96 } 95 97 spin_unlock_bh(&depend_tx->lock); 96 98 97 - if (!intr_tx) 99 + /* attached dependency, flush the parent channel */ 100 + if (!intr_tx) { 101 + device->device_issue_pending(chan); 98 102 return; 99 - 100 - chan = depend_tx->chan; 101 - device = chan->device; 103 + } 102 104 103 105 /* see if we can schedule an interrupt 104 106 * otherwise poll for completion ··· 132 134 intr_tx->tx_submit(intr_tx); 133 135 async_tx_ack(intr_tx); 134 136 } 137 + device->device_issue_pending(chan); 135 138 } else { 136 139 if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) 137 140 panic("%s: DMA_ERROR waiting for depend_tx\n", ··· 143 144 144 145 145 146 /** 146 - * submit_disposition - while holding depend_tx->lock we must avoid submitting 147 - * new operations to prevent a circular locking dependency with 148 - * drivers that already hold a channel lock when calling 149 - * async_tx_run_dependencies. 147 + * submit_disposition - flags for routing an incoming operation 150 148 * @ASYNC_TX_SUBMITTED: we were able to append the new operation under the lock 151 149 * @ASYNC_TX_CHANNEL_SWITCH: when the lock is dropped schedule a channel switch 152 150 * @ASYNC_TX_DIRECT_SUBMIT: when the lock is dropped submit directly 151 + * 152 + * while holding depend_tx->lock we must avoid submitting new operations 153 + * to prevent a circular locking dependency with drivers that already 154 + * hold a channel lock when calling async_tx_run_dependencies. 153 155 */ 154 156 enum submit_disposition { 155 157 ASYNC_TX_SUBMITTED, ··· 160 160 161 161 void 162 162 async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx, 163 - enum async_tx_flags flags, struct dma_async_tx_descriptor *depend_tx, 164 - dma_async_tx_callback cb_fn, void *cb_param) 163 + struct async_submit_ctl *submit) 165 164 { 166 - tx->callback = cb_fn; 167 - tx->callback_param = cb_param; 165 + struct dma_async_tx_descriptor *depend_tx = submit->depend_tx; 166 + 167 + tx->callback = submit->cb_fn; 168 + tx->callback_param = submit->cb_param; 168 169 169 170 if (depend_tx) { 170 171 enum submit_disposition s; ··· 221 220 tx->tx_submit(tx); 222 221 } 223 222 224 - if (flags & ASYNC_TX_ACK) 223 + if (submit->flags & ASYNC_TX_ACK) 225 224 async_tx_ack(tx); 226 225 227 - if (depend_tx && (flags & ASYNC_TX_DEP_ACK)) 226 + if (depend_tx) 228 227 async_tx_ack(depend_tx); 229 228 } 230 229 EXPORT_SYMBOL_GPL(async_tx_submit); 231 230 232 231 /** 233 - * async_trigger_callback - schedules the callback function to be run after 234 - * any dependent operations have been completed. 235 - * @flags: ASYNC_TX_ACK, ASYNC_TX_DEP_ACK 236 - * @depend_tx: 'callback' requires the completion of this transaction 237 - * @cb_fn: function to call after depend_tx completes 238 - * @cb_param: parameter to pass to the callback routine 232 + * async_trigger_callback - schedules the callback function to be run 233 + * @submit: submission and completion parameters 234 + * 235 + * honored flags: ASYNC_TX_ACK 236 + * 237 + * The callback is run after any dependent operations have completed. 239 238 */ 240 239 struct dma_async_tx_descriptor * 241 - async_trigger_callback(enum async_tx_flags flags, 242 - struct dma_async_tx_descriptor *depend_tx, 243 - dma_async_tx_callback cb_fn, void *cb_param) 240 + async_trigger_callback(struct async_submit_ctl *submit) 244 241 { 245 242 struct dma_chan *chan; 246 243 struct dma_device *device; 247 244 struct dma_async_tx_descriptor *tx; 245 + struct dma_async_tx_descriptor *depend_tx = submit->depend_tx; 248 246 249 247 if (depend_tx) { 250 248 chan = depend_tx->chan; ··· 262 262 if (tx) { 263 263 pr_debug("%s: (async)\n", __func__); 264 264 265 - async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); 265 + async_tx_submit(chan, tx, submit); 266 266 } else { 267 267 pr_debug("%s: (sync)\n", __func__); 268 268 269 269 /* wait for any prerequisite operations */ 270 - async_tx_quiesce(&depend_tx); 270 + async_tx_quiesce(&submit->depend_tx); 271 271 272 - async_tx_sync_epilog(cb_fn, cb_param); 272 + async_tx_sync_epilog(submit); 273 273 } 274 274 275 275 return tx; ··· 294 294 } 295 295 } 296 296 EXPORT_SYMBOL_GPL(async_tx_quiesce); 297 - 298 - module_init(async_tx_init); 299 - module_exit(async_tx_exit); 300 297 301 298 MODULE_AUTHOR("Intel Corporation"); 302 299 MODULE_DESCRIPTION("Asynchronous Bulk Memory Transactions API");
+103 -104
crypto/async_tx/async_xor.c
··· 33 33 /* do_async_xor - dma map the pages and perform the xor with an engine */ 34 34 static __async_inline struct dma_async_tx_descriptor * 35 35 do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list, 36 - unsigned int offset, int src_cnt, size_t len, 37 - enum async_tx_flags flags, 38 - struct dma_async_tx_descriptor *depend_tx, 39 - dma_async_tx_callback cb_fn, void *cb_param) 36 + unsigned int offset, int src_cnt, size_t len, dma_addr_t *dma_src, 37 + struct async_submit_ctl *submit) 40 38 { 41 39 struct dma_device *dma = chan->device; 42 - dma_addr_t *dma_src = (dma_addr_t *) src_list; 43 40 struct dma_async_tx_descriptor *tx = NULL; 44 41 int src_off = 0; 45 42 int i; 46 - dma_async_tx_callback _cb_fn; 47 - void *_cb_param; 48 - enum async_tx_flags async_flags; 43 + dma_async_tx_callback cb_fn_orig = submit->cb_fn; 44 + void *cb_param_orig = submit->cb_param; 45 + enum async_tx_flags flags_orig = submit->flags; 49 46 enum dma_ctrl_flags dma_flags; 50 47 int xor_src_cnt; 51 48 dma_addr_t dma_dest; ··· 60 63 } 61 64 62 65 while (src_cnt) { 63 - async_flags = flags; 66 + submit->flags = flags_orig; 64 67 dma_flags = 0; 65 - xor_src_cnt = min(src_cnt, dma->max_xor); 68 + xor_src_cnt = min(src_cnt, (int)dma->max_xor); 66 69 /* if we are submitting additional xors, leave the chain open, 67 70 * clear the callback parameters, and leave the destination 68 71 * buffer mapped 69 72 */ 70 73 if (src_cnt > xor_src_cnt) { 71 - async_flags &= ~ASYNC_TX_ACK; 74 + submit->flags &= ~ASYNC_TX_ACK; 75 + submit->flags |= ASYNC_TX_FENCE; 72 76 dma_flags = DMA_COMPL_SKIP_DEST_UNMAP; 73 - _cb_fn = NULL; 74 - _cb_param = NULL; 77 + submit->cb_fn = NULL; 78 + submit->cb_param = NULL; 75 79 } else { 76 - _cb_fn = cb_fn; 77 - _cb_param = cb_param; 80 + submit->cb_fn = cb_fn_orig; 81 + submit->cb_param = cb_param_orig; 78 82 } 79 - if (_cb_fn) 83 + if (submit->cb_fn) 80 84 dma_flags |= DMA_PREP_INTERRUPT; 81 - 85 + if (submit->flags & ASYNC_TX_FENCE) 86 + dma_flags |= DMA_PREP_FENCE; 82 87 /* Since we have clobbered the src_list we are committed 83 88 * to doing this asynchronously. Drivers force forward progress 84 89 * in case they can not provide a descriptor ··· 89 90 xor_src_cnt, len, dma_flags); 90 91 91 92 if (unlikely(!tx)) 92 - async_tx_quiesce(&depend_tx); 93 + async_tx_quiesce(&submit->depend_tx); 93 94 94 95 /* spin wait for the preceeding transactions to complete */ 95 96 while (unlikely(!tx)) { ··· 100 101 dma_flags); 101 102 } 102 103 103 - async_tx_submit(chan, tx, async_flags, depend_tx, _cb_fn, 104 - _cb_param); 105 - 106 - depend_tx = tx; 107 - flags |= ASYNC_TX_DEP_ACK; 104 + async_tx_submit(chan, tx, submit); 105 + submit->depend_tx = tx; 108 106 109 107 if (src_cnt > xor_src_cnt) { 110 108 /* drop completed sources */ ··· 120 124 121 125 static void 122 126 do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset, 123 - int src_cnt, size_t len, enum async_tx_flags flags, 124 - dma_async_tx_callback cb_fn, void *cb_param) 127 + int src_cnt, size_t len, struct async_submit_ctl *submit) 125 128 { 126 129 int i; 127 130 int xor_src_cnt; 128 131 int src_off = 0; 129 132 void *dest_buf; 130 - void **srcs = (void **) src_list; 133 + void **srcs; 131 134 132 - /* reuse the 'src_list' array to convert to buffer pointers */ 135 + if (submit->scribble) 136 + srcs = submit->scribble; 137 + else 138 + srcs = (void **) src_list; 139 + 140 + /* convert to buffer pointers */ 133 141 for (i = 0; i < src_cnt; i++) 134 142 srcs[i] = page_address(src_list[i]) + offset; 135 143 136 144 /* set destination address */ 137 145 dest_buf = page_address(dest) + offset; 138 146 139 - if (flags & ASYNC_TX_XOR_ZERO_DST) 147 + if (submit->flags & ASYNC_TX_XOR_ZERO_DST) 140 148 memset(dest_buf, 0, len); 141 149 142 150 while (src_cnt > 0) { ··· 153 153 src_off += xor_src_cnt; 154 154 } 155 155 156 - async_tx_sync_epilog(cb_fn, cb_param); 156 + async_tx_sync_epilog(submit); 157 157 } 158 158 159 159 /** 160 160 * async_xor - attempt to xor a set of blocks with a dma engine. 161 - * xor_blocks always uses the dest as a source so the ASYNC_TX_XOR_ZERO_DST 162 - * flag must be set to not include dest data in the calculation. The 163 - * assumption with dma eninges is that they only use the destination 164 - * buffer as a source when it is explicity specified in the source list. 165 161 * @dest: destination page 166 - * @src_list: array of source pages (if the dest is also a source it must be 167 - * at index zero). The contents of this array may be overwritten. 168 - * @offset: offset in pages to start transaction 162 + * @src_list: array of source pages 163 + * @offset: common src/dst offset to start transaction 169 164 * @src_cnt: number of source pages 170 165 * @len: length in bytes 171 - * @flags: ASYNC_TX_XOR_ZERO_DST, ASYNC_TX_XOR_DROP_DEST, 172 - * ASYNC_TX_ACK, ASYNC_TX_DEP_ACK 173 - * @depend_tx: xor depends on the result of this transaction. 174 - * @cb_fn: function to call when the xor completes 175 - * @cb_param: parameter to pass to the callback routine 166 + * @submit: submission / completion modifiers 167 + * 168 + * honored flags: ASYNC_TX_ACK, ASYNC_TX_XOR_ZERO_DST, ASYNC_TX_XOR_DROP_DST 169 + * 170 + * xor_blocks always uses the dest as a source so the 171 + * ASYNC_TX_XOR_ZERO_DST flag must be set to not include dest data in 172 + * the calculation. The assumption with dma eninges is that they only 173 + * use the destination buffer as a source when it is explicity specified 174 + * in the source list. 175 + * 176 + * src_list note: if the dest is also a source it must be at index zero. 177 + * The contents of this array will be overwritten if a scribble region 178 + * is not specified. 176 179 */ 177 180 struct dma_async_tx_descriptor * 178 181 async_xor(struct page *dest, struct page **src_list, unsigned int offset, 179 - int src_cnt, size_t len, enum async_tx_flags flags, 180 - struct dma_async_tx_descriptor *depend_tx, 181 - dma_async_tx_callback cb_fn, void *cb_param) 182 + int src_cnt, size_t len, struct async_submit_ctl *submit) 182 183 { 183 - struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_XOR, 184 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_XOR, 184 185 &dest, 1, src_list, 185 186 src_cnt, len); 187 + dma_addr_t *dma_src = NULL; 188 + 186 189 BUG_ON(src_cnt <= 1); 187 190 188 - if (chan) { 191 + if (submit->scribble) 192 + dma_src = submit->scribble; 193 + else if (sizeof(dma_addr_t) <= sizeof(struct page *)) 194 + dma_src = (dma_addr_t *) src_list; 195 + 196 + if (dma_src && chan && is_dma_xor_aligned(chan->device, offset, 0, len)) { 189 197 /* run the xor asynchronously */ 190 198 pr_debug("%s (async): len: %zu\n", __func__, len); 191 199 192 200 return do_async_xor(chan, dest, src_list, offset, src_cnt, len, 193 - flags, depend_tx, cb_fn, cb_param); 201 + dma_src, submit); 194 202 } else { 195 203 /* run the xor synchronously */ 196 204 pr_debug("%s (sync): len: %zu\n", __func__, len); 205 + WARN_ONCE(chan, "%s: no space for dma address conversion\n", 206 + __func__); 197 207 198 208 /* in the sync case the dest is an implied source 199 209 * (assumes the dest is the first source) 200 210 */ 201 - if (flags & ASYNC_TX_XOR_DROP_DST) { 211 + if (submit->flags & ASYNC_TX_XOR_DROP_DST) { 202 212 src_cnt--; 203 213 src_list++; 204 214 } 205 215 206 216 /* wait for any prerequisite operations */ 207 - async_tx_quiesce(&depend_tx); 217 + async_tx_quiesce(&submit->depend_tx); 208 218 209 - do_sync_xor(dest, src_list, offset, src_cnt, len, 210 - flags, cb_fn, cb_param); 219 + do_sync_xor(dest, src_list, offset, src_cnt, len, submit); 211 220 212 221 return NULL; 213 222 } ··· 231 222 } 232 223 233 224 /** 234 - * async_xor_zero_sum - attempt a xor parity check with a dma engine. 225 + * async_xor_val - attempt a xor parity check with a dma engine. 235 226 * @dest: destination page used if the xor is performed synchronously 236 - * @src_list: array of source pages. The dest page must be listed as a source 237 - * at index zero. The contents of this array may be overwritten. 227 + * @src_list: array of source pages 238 228 * @offset: offset in pages to start transaction 239 229 * @src_cnt: number of source pages 240 230 * @len: length in bytes 241 231 * @result: 0 if sum == 0 else non-zero 242 - * @flags: ASYNC_TX_ACK, ASYNC_TX_DEP_ACK 243 - * @depend_tx: xor depends on the result of this transaction. 244 - * @cb_fn: function to call when the xor completes 245 - * @cb_param: parameter to pass to the callback routine 232 + * @submit: submission / completion modifiers 233 + * 234 + * honored flags: ASYNC_TX_ACK 235 + * 236 + * src_list note: if the dest is also a source it must be at index zero. 237 + * The contents of this array will be overwritten if a scribble region 238 + * is not specified. 246 239 */ 247 240 struct dma_async_tx_descriptor * 248 - async_xor_zero_sum(struct page *dest, struct page **src_list, 249 - unsigned int offset, int src_cnt, size_t len, 250 - u32 *result, enum async_tx_flags flags, 251 - struct dma_async_tx_descriptor *depend_tx, 252 - dma_async_tx_callback cb_fn, void *cb_param) 241 + async_xor_val(struct page *dest, struct page **src_list, unsigned int offset, 242 + int src_cnt, size_t len, enum sum_check_flags *result, 243 + struct async_submit_ctl *submit) 253 244 { 254 - struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_ZERO_SUM, 245 + struct dma_chan *chan = async_tx_find_channel(submit, DMA_XOR_VAL, 255 246 &dest, 1, src_list, 256 247 src_cnt, len); 257 248 struct dma_device *device = chan ? chan->device : NULL; 258 249 struct dma_async_tx_descriptor *tx = NULL; 250 + dma_addr_t *dma_src = NULL; 259 251 260 252 BUG_ON(src_cnt <= 1); 261 253 262 - if (device && src_cnt <= device->max_xor) { 263 - dma_addr_t *dma_src = (dma_addr_t *) src_list; 264 - unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; 254 + if (submit->scribble) 255 + dma_src = submit->scribble; 256 + else if (sizeof(dma_addr_t) <= sizeof(struct page *)) 257 + dma_src = (dma_addr_t *) src_list; 258 + 259 + if (dma_src && device && src_cnt <= device->max_xor && 260 + is_dma_xor_aligned(device, offset, 0, len)) { 261 + unsigned long dma_prep_flags = 0; 265 262 int i; 266 263 267 264 pr_debug("%s: (async) len: %zu\n", __func__, len); 268 265 266 + if (submit->cb_fn) 267 + dma_prep_flags |= DMA_PREP_INTERRUPT; 268 + if (submit->flags & ASYNC_TX_FENCE) 269 + dma_prep_flags |= DMA_PREP_FENCE; 269 270 for (i = 0; i < src_cnt; i++) 270 271 dma_src[i] = dma_map_page(device->dev, src_list[i], 271 272 offset, len, DMA_TO_DEVICE); 272 273 273 - tx = device->device_prep_dma_zero_sum(chan, dma_src, src_cnt, 274 - len, result, 275 - dma_prep_flags); 274 + tx = device->device_prep_dma_xor_val(chan, dma_src, src_cnt, 275 + len, result, 276 + dma_prep_flags); 276 277 if (unlikely(!tx)) { 277 - async_tx_quiesce(&depend_tx); 278 + async_tx_quiesce(&submit->depend_tx); 278 279 279 280 while (!tx) { 280 281 dma_async_issue_pending(chan); 281 - tx = device->device_prep_dma_zero_sum(chan, 282 + tx = device->device_prep_dma_xor_val(chan, 282 283 dma_src, src_cnt, len, result, 283 284 dma_prep_flags); 284 285 } 285 286 } 286 287 287 - async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); 288 + async_tx_submit(chan, tx, submit); 288 289 } else { 289 - unsigned long xor_flags = flags; 290 + enum async_tx_flags flags_orig = submit->flags; 290 291 291 292 pr_debug("%s: (sync) len: %zu\n", __func__, len); 293 + WARN_ONCE(device && src_cnt <= device->max_xor, 294 + "%s: no space for dma address conversion\n", 295 + __func__); 292 296 293 - xor_flags |= ASYNC_TX_XOR_DROP_DST; 294 - xor_flags &= ~ASYNC_TX_ACK; 297 + submit->flags |= ASYNC_TX_XOR_DROP_DST; 298 + submit->flags &= ~ASYNC_TX_ACK; 295 299 296 - tx = async_xor(dest, src_list, offset, src_cnt, len, xor_flags, 297 - depend_tx, NULL, NULL); 300 + tx = async_xor(dest, src_list, offset, src_cnt, len, submit); 298 301 299 302 async_tx_quiesce(&tx); 300 303 301 - *result = page_is_zero(dest, offset, len) ? 0 : 1; 304 + *result = !page_is_zero(dest, offset, len) << SUM_CHECK_P; 302 305 303 - async_tx_sync_epilog(cb_fn, cb_param); 306 + async_tx_sync_epilog(submit); 307 + submit->flags = flags_orig; 304 308 } 305 309 306 310 return tx; 307 311 } 308 - EXPORT_SYMBOL_GPL(async_xor_zero_sum); 309 - 310 - static int __init async_xor_init(void) 311 - { 312 - #ifdef CONFIG_ASYNC_TX_DMA 313 - /* To conserve stack space the input src_list (array of page pointers) 314 - * is reused to hold the array of dma addresses passed to the driver. 315 - * This conversion is only possible when dma_addr_t is less than the 316 - * the size of a pointer. HIGHMEM64G is known to violate this 317 - * assumption. 318 - */ 319 - BUILD_BUG_ON(sizeof(dma_addr_t) > sizeof(struct page *)); 320 - #endif 321 - 322 - return 0; 323 - } 324 - 325 - static void __exit async_xor_exit(void) 326 - { 327 - do { } while (0); 328 - } 329 - 330 - module_init(async_xor_init); 331 - module_exit(async_xor_exit); 312 + EXPORT_SYMBOL_GPL(async_xor_val); 332 313 333 314 MODULE_AUTHOR("Intel Corporation"); 334 315 MODULE_DESCRIPTION("asynchronous xor/xor-zero-sum api");
+240
crypto/async_tx/raid6test.c
··· 1 + /* 2 + * asynchronous raid6 recovery self test 3 + * Copyright (c) 2009, Intel Corporation. 4 + * 5 + * based on drivers/md/raid6test/test.c: 6 + * Copyright 2002-2007 H. Peter Anvin 7 + * 8 + * This program is free software; you can redistribute it and/or modify it 9 + * under the terms and conditions of the GNU General Public License, 10 + * version 2, as published by the Free Software Foundation. 11 + * 12 + * This program is distributed in the hope it will be useful, but WITHOUT 13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 + * more details. 16 + * 17 + * You should have received a copy of the GNU General Public License along with 18 + * this program; if not, write to the Free Software Foundation, Inc., 19 + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 20 + * 21 + */ 22 + #include <linux/async_tx.h> 23 + #include <linux/random.h> 24 + 25 + #undef pr 26 + #define pr(fmt, args...) pr_info("raid6test: " fmt, ##args) 27 + 28 + #define NDISKS 16 /* Including P and Q */ 29 + 30 + static struct page *dataptrs[NDISKS]; 31 + static addr_conv_t addr_conv[NDISKS]; 32 + static struct page *data[NDISKS+3]; 33 + static struct page *spare; 34 + static struct page *recovi; 35 + static struct page *recovj; 36 + 37 + static void callback(void *param) 38 + { 39 + struct completion *cmp = param; 40 + 41 + complete(cmp); 42 + } 43 + 44 + static void makedata(int disks) 45 + { 46 + int i, j; 47 + 48 + for (i = 0; i < disks; i++) { 49 + for (j = 0; j < PAGE_SIZE/sizeof(u32); j += sizeof(u32)) { 50 + u32 *p = page_address(data[i]) + j; 51 + 52 + *p = random32(); 53 + } 54 + 55 + dataptrs[i] = data[i]; 56 + } 57 + } 58 + 59 + static char disk_type(int d, int disks) 60 + { 61 + if (d == disks - 2) 62 + return 'P'; 63 + else if (d == disks - 1) 64 + return 'Q'; 65 + else 66 + return 'D'; 67 + } 68 + 69 + /* Recover two failed blocks. */ 70 + static void raid6_dual_recov(int disks, size_t bytes, int faila, int failb, struct page **ptrs) 71 + { 72 + struct async_submit_ctl submit; 73 + struct completion cmp; 74 + struct dma_async_tx_descriptor *tx = NULL; 75 + enum sum_check_flags result = ~0; 76 + 77 + if (faila > failb) 78 + swap(faila, failb); 79 + 80 + if (failb == disks-1) { 81 + if (faila == disks-2) { 82 + /* P+Q failure. Just rebuild the syndrome. */ 83 + init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv); 84 + tx = async_gen_syndrome(ptrs, 0, disks, bytes, &submit); 85 + } else { 86 + struct page *blocks[disks]; 87 + struct page *dest; 88 + int count = 0; 89 + int i; 90 + 91 + /* data+Q failure. Reconstruct data from P, 92 + * then rebuild syndrome 93 + */ 94 + for (i = disks; i-- ; ) { 95 + if (i == faila || i == failb) 96 + continue; 97 + blocks[count++] = ptrs[i]; 98 + } 99 + dest = ptrs[faila]; 100 + init_async_submit(&submit, ASYNC_TX_XOR_ZERO_DST, NULL, 101 + NULL, NULL, addr_conv); 102 + tx = async_xor(dest, blocks, 0, count, bytes, &submit); 103 + 104 + init_async_submit(&submit, 0, tx, NULL, NULL, addr_conv); 105 + tx = async_gen_syndrome(ptrs, 0, disks, bytes, &submit); 106 + } 107 + } else { 108 + if (failb == disks-2) { 109 + /* data+P failure. */ 110 + init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv); 111 + tx = async_raid6_datap_recov(disks, bytes, faila, ptrs, &submit); 112 + } else { 113 + /* data+data failure. */ 114 + init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv); 115 + tx = async_raid6_2data_recov(disks, bytes, faila, failb, ptrs, &submit); 116 + } 117 + } 118 + init_completion(&cmp); 119 + init_async_submit(&submit, ASYNC_TX_ACK, tx, callback, &cmp, addr_conv); 120 + tx = async_syndrome_val(ptrs, 0, disks, bytes, &result, spare, &submit); 121 + async_tx_issue_pending(tx); 122 + 123 + if (wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)) == 0) 124 + pr("%s: timeout! (faila: %d failb: %d disks: %d)\n", 125 + __func__, faila, failb, disks); 126 + 127 + if (result != 0) 128 + pr("%s: validation failure! faila: %d failb: %d sum_check_flags: %x\n", 129 + __func__, faila, failb, result); 130 + } 131 + 132 + static int test_disks(int i, int j, int disks) 133 + { 134 + int erra, errb; 135 + 136 + memset(page_address(recovi), 0xf0, PAGE_SIZE); 137 + memset(page_address(recovj), 0xba, PAGE_SIZE); 138 + 139 + dataptrs[i] = recovi; 140 + dataptrs[j] = recovj; 141 + 142 + raid6_dual_recov(disks, PAGE_SIZE, i, j, dataptrs); 143 + 144 + erra = memcmp(page_address(data[i]), page_address(recovi), PAGE_SIZE); 145 + errb = memcmp(page_address(data[j]), page_address(recovj), PAGE_SIZE); 146 + 147 + pr("%s(%d, %d): faila=%3d(%c) failb=%3d(%c) %s\n", 148 + __func__, i, j, i, disk_type(i, disks), j, disk_type(j, disks), 149 + (!erra && !errb) ? "OK" : !erra ? "ERRB" : !errb ? "ERRA" : "ERRAB"); 150 + 151 + dataptrs[i] = data[i]; 152 + dataptrs[j] = data[j]; 153 + 154 + return erra || errb; 155 + } 156 + 157 + static int test(int disks, int *tests) 158 + { 159 + struct dma_async_tx_descriptor *tx; 160 + struct async_submit_ctl submit; 161 + struct completion cmp; 162 + int err = 0; 163 + int i, j; 164 + 165 + recovi = data[disks]; 166 + recovj = data[disks+1]; 167 + spare = data[disks+2]; 168 + 169 + makedata(disks); 170 + 171 + /* Nuke syndromes */ 172 + memset(page_address(data[disks-2]), 0xee, PAGE_SIZE); 173 + memset(page_address(data[disks-1]), 0xee, PAGE_SIZE); 174 + 175 + /* Generate assumed good syndrome */ 176 + init_completion(&cmp); 177 + init_async_submit(&submit, ASYNC_TX_ACK, NULL, callback, &cmp, addr_conv); 178 + tx = async_gen_syndrome(dataptrs, 0, disks, PAGE_SIZE, &submit); 179 + async_tx_issue_pending(tx); 180 + 181 + if (wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)) == 0) { 182 + pr("error: initial gen_syndrome(%d) timed out\n", disks); 183 + return 1; 184 + } 185 + 186 + pr("testing the %d-disk case...\n", disks); 187 + for (i = 0; i < disks-1; i++) 188 + for (j = i+1; j < disks; j++) { 189 + (*tests)++; 190 + err += test_disks(i, j, disks); 191 + } 192 + 193 + return err; 194 + } 195 + 196 + 197 + static int raid6_test(void) 198 + { 199 + int err = 0; 200 + int tests = 0; 201 + int i; 202 + 203 + for (i = 0; i < NDISKS+3; i++) { 204 + data[i] = alloc_page(GFP_KERNEL); 205 + if (!data[i]) { 206 + while (i--) 207 + put_page(data[i]); 208 + return -ENOMEM; 209 + } 210 + } 211 + 212 + /* the 4-disk and 5-disk cases are special for the recovery code */ 213 + if (NDISKS > 4) 214 + err += test(4, &tests); 215 + if (NDISKS > 5) 216 + err += test(5, &tests); 217 + err += test(NDISKS, &tests); 218 + 219 + pr("\n"); 220 + pr("complete (%d tests, %d failure%s)\n", 221 + tests, err, err == 1 ? "" : "s"); 222 + 223 + for (i = 0; i < NDISKS+3; i++) 224 + put_page(data[i]); 225 + 226 + return 0; 227 + } 228 + 229 + static void raid6_test_exit(void) 230 + { 231 + } 232 + 233 + /* when compiled-in wait for drivers to load first (assumes dma drivers 234 + * are also compliled-in) 235 + */ 236 + late_initcall(raid6_test); 237 + module_exit(raid6_test_exit); 238 + MODULE_AUTHOR("Dan Williams <dan.j.williams@intel.com>"); 239 + MODULE_DESCRIPTION("asynchronous RAID-6 recovery self tests"); 240 + MODULE_LICENSE("GPL");
+109 -13
drivers/dca/dca-core.c
··· 28 28 #include <linux/device.h> 29 29 #include <linux/dca.h> 30 30 31 - #define DCA_VERSION "1.8" 31 + #define DCA_VERSION "1.12.1" 32 32 33 33 MODULE_VERSION(DCA_VERSION); 34 34 MODULE_LICENSE("GPL"); ··· 36 36 37 37 static DEFINE_SPINLOCK(dca_lock); 38 38 39 - static LIST_HEAD(dca_providers); 39 + static LIST_HEAD(dca_domains); 40 + 41 + static struct pci_bus *dca_pci_rc_from_dev(struct device *dev) 42 + { 43 + struct pci_dev *pdev = to_pci_dev(dev); 44 + struct pci_bus *bus = pdev->bus; 45 + 46 + while (bus->parent) 47 + bus = bus->parent; 48 + 49 + return bus; 50 + } 51 + 52 + static struct dca_domain *dca_allocate_domain(struct pci_bus *rc) 53 + { 54 + struct dca_domain *domain; 55 + 56 + domain = kzalloc(sizeof(*domain), GFP_NOWAIT); 57 + if (!domain) 58 + return NULL; 59 + 60 + INIT_LIST_HEAD(&domain->dca_providers); 61 + domain->pci_rc = rc; 62 + 63 + return domain; 64 + } 65 + 66 + static void dca_free_domain(struct dca_domain *domain) 67 + { 68 + list_del(&domain->node); 69 + kfree(domain); 70 + } 71 + 72 + static struct dca_domain *dca_find_domain(struct pci_bus *rc) 73 + { 74 + struct dca_domain *domain; 75 + 76 + list_for_each_entry(domain, &dca_domains, node) 77 + if (domain->pci_rc == rc) 78 + return domain; 79 + 80 + return NULL; 81 + } 82 + 83 + static struct dca_domain *dca_get_domain(struct device *dev) 84 + { 85 + struct pci_bus *rc; 86 + struct dca_domain *domain; 87 + 88 + rc = dca_pci_rc_from_dev(dev); 89 + domain = dca_find_domain(rc); 90 + 91 + if (!domain) { 92 + domain = dca_allocate_domain(rc); 93 + if (domain) 94 + list_add(&domain->node, &dca_domains); 95 + } 96 + 97 + return domain; 98 + } 40 99 41 100 static struct dca_provider *dca_find_provider_by_dev(struct device *dev) 42 101 { 43 - struct dca_provider *dca, *ret = NULL; 102 + struct dca_provider *dca; 103 + struct pci_bus *rc; 104 + struct dca_domain *domain; 44 105 45 - list_for_each_entry(dca, &dca_providers, node) { 46 - if ((!dev) || (dca->ops->dev_managed(dca, dev))) { 47 - ret = dca; 48 - break; 49 - } 106 + if (dev) { 107 + rc = dca_pci_rc_from_dev(dev); 108 + domain = dca_find_domain(rc); 109 + if (!domain) 110 + return NULL; 111 + } else { 112 + if (!list_empty(&dca_domains)) 113 + domain = list_first_entry(&dca_domains, 114 + struct dca_domain, 115 + node); 116 + else 117 + return NULL; 50 118 } 51 119 52 - return ret; 120 + list_for_each_entry(dca, &domain->dca_providers, node) 121 + if ((!dev) || (dca->ops->dev_managed(dca, dev))) 122 + return dca; 123 + 124 + return NULL; 53 125 } 54 126 55 127 /** ··· 133 61 struct dca_provider *dca; 134 62 int err, slot = -ENODEV; 135 63 unsigned long flags; 64 + struct pci_bus *pci_rc; 65 + struct dca_domain *domain; 136 66 137 67 if (!dev) 138 68 return -EFAULT; ··· 148 74 return -EEXIST; 149 75 } 150 76 151 - list_for_each_entry(dca, &dca_providers, node) { 77 + pci_rc = dca_pci_rc_from_dev(dev); 78 + domain = dca_find_domain(pci_rc); 79 + if (!domain) { 80 + spin_unlock_irqrestore(&dca_lock, flags); 81 + return -ENODEV; 82 + } 83 + 84 + list_for_each_entry(dca, &domain->dca_providers, node) { 152 85 slot = dca->ops->add_requester(dca, dev); 153 86 if (slot >= 0) 154 87 break; ··· 303 222 { 304 223 int err; 305 224 unsigned long flags; 225 + struct dca_domain *domain; 306 226 307 227 err = dca_sysfs_add_provider(dca, dev); 308 228 if (err) 309 229 return err; 310 230 311 231 spin_lock_irqsave(&dca_lock, flags); 312 - list_add(&dca->node, &dca_providers); 232 + domain = dca_get_domain(dev); 233 + if (!domain) { 234 + spin_unlock_irqrestore(&dca_lock, flags); 235 + return -ENODEV; 236 + } 237 + list_add(&dca->node, &domain->dca_providers); 313 238 spin_unlock_irqrestore(&dca_lock, flags); 314 239 315 240 blocking_notifier_call_chain(&dca_provider_chain, ··· 328 241 * unregister_dca_provider - remove a dca provider 329 242 * @dca - struct created by alloc_dca_provider() 330 243 */ 331 - void unregister_dca_provider(struct dca_provider *dca) 244 + void unregister_dca_provider(struct dca_provider *dca, struct device *dev) 332 245 { 333 246 unsigned long flags; 247 + struct pci_bus *pci_rc; 248 + struct dca_domain *domain; 334 249 335 250 blocking_notifier_call_chain(&dca_provider_chain, 336 251 DCA_PROVIDER_REMOVE, NULL); 337 252 338 253 spin_lock_irqsave(&dca_lock, flags); 254 + 339 255 list_del(&dca->node); 256 + 257 + pci_rc = dca_pci_rc_from_dev(dev); 258 + domain = dca_find_domain(pci_rc); 259 + if (list_empty(&domain->dca_providers)) 260 + dca_free_domain(domain); 261 + 340 262 spin_unlock_irqrestore(&dca_lock, flags); 341 263 342 264 dca_sysfs_remove_provider(dca); ··· 372 276 373 277 static int __init dca_init(void) 374 278 { 375 - printk(KERN_ERR "dca service started, version %s\n", DCA_VERSION); 279 + pr_info("dca service started, version %s\n", DCA_VERSION); 376 280 return dca_sysfs_init(); 377 281 } 378 282
+13 -1
drivers/dma/Kconfig
··· 17 17 18 18 comment "DMA Devices" 19 19 20 + config ASYNC_TX_DISABLE_CHANNEL_SWITCH 21 + bool 22 + 20 23 config INTEL_IOATDMA 21 24 tristate "Intel I/OAT DMA support" 22 25 depends on PCI && X86 23 26 select DMA_ENGINE 24 27 select DCA 28 + select ASYNC_TX_DISABLE_CHANNEL_SWITCH 25 29 help 26 30 Enable support for the Intel(R) I/OAT DMA engine present 27 31 in recent Intel Xeon chipsets. ··· 101 97 Support the TXx9 SoC internal DMA controller. This can be 102 98 integrated in chips such as the Toshiba TX4927/38/39. 103 99 100 + config SH_DMAE 101 + tristate "Renesas SuperH DMAC support" 102 + depends on SUPERH && SH_DMA 103 + depends on !SH_DMA_API 104 + select DMA_ENGINE 105 + help 106 + Enable support for the Renesas SuperH DMA controllers. 107 + 104 108 config DMA_ENGINE 105 109 bool 106 110 ··· 128 116 129 117 config ASYNC_TX_DMA 130 118 bool "Async_tx: Offload support for the async_tx api" 131 - depends on DMA_ENGINE && !HIGHMEM64G 119 + depends on DMA_ENGINE 132 120 help 133 121 This allows the async_tx api to take advantage of offload engines for 134 122 memcpy, memset, xor, and raid6 p+q operations. If your platform has
+2 -2
drivers/dma/Makefile
··· 1 1 obj-$(CONFIG_DMA_ENGINE) += dmaengine.o 2 2 obj-$(CONFIG_NET_DMA) += iovlock.o 3 3 obj-$(CONFIG_DMATEST) += dmatest.o 4 - obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o 5 - ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o 4 + obj-$(CONFIG_INTEL_IOATDMA) += ioat/ 6 5 obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o 7 6 obj-$(CONFIG_FSL_DMA) += fsldma.o 8 7 obj-$(CONFIG_MV_XOR) += mv_xor.o ··· 9 10 obj-$(CONFIG_AT_HDMAC) += at_hdmac.o 10 11 obj-$(CONFIG_MX3_IPU) += ipu/ 11 12 obj-$(CONFIG_TXX9_DMAC) += txx9dmac.o 13 + obj-$(CONFIG_SH_DMAE) += shdma.o
+31 -29
drivers/dma/at_hdmac.c
··· 87 87 desc = dma_pool_alloc(atdma->dma_desc_pool, gfp_flags, &phys); 88 88 if (desc) { 89 89 memset(desc, 0, sizeof(struct at_desc)); 90 + INIT_LIST_HEAD(&desc->tx_list); 90 91 dma_async_tx_descriptor_init(&desc->txd, chan); 91 92 /* txd.flags will be overwritten in prep functions */ 92 93 desc->txd.flags = DMA_CTRL_ACK; ··· 151 150 struct at_desc *child; 152 151 153 152 spin_lock_bh(&atchan->lock); 154 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 153 + list_for_each_entry(child, &desc->tx_list, desc_node) 155 154 dev_vdbg(chan2dev(&atchan->chan_common), 156 155 "moving child desc %p to freelist\n", 157 156 child); 158 - list_splice_init(&desc->txd.tx_list, &atchan->free_list); 157 + list_splice_init(&desc->tx_list, &atchan->free_list); 159 158 dev_vdbg(chan2dev(&atchan->chan_common), 160 159 "moving desc %p to freelist\n", desc); 161 160 list_add(&desc->desc_node, &atchan->free_list); ··· 248 247 param = txd->callback_param; 249 248 250 249 /* move children to free_list */ 251 - list_splice_init(&txd->tx_list, &atchan->free_list); 250 + list_splice_init(&desc->tx_list, &atchan->free_list); 252 251 /* move myself to free_list */ 253 252 list_move(&desc->desc_node, &atchan->free_list); 254 253 255 254 /* unmap dma addresses */ 256 - if (!(txd->flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 257 - if (txd->flags & DMA_COMPL_DEST_UNMAP_SINGLE) 258 - dma_unmap_single(chan2parent(&atchan->chan_common), 259 - desc->lli.daddr, 260 - desc->len, DMA_FROM_DEVICE); 261 - else 262 - dma_unmap_page(chan2parent(&atchan->chan_common), 263 - desc->lli.daddr, 264 - desc->len, DMA_FROM_DEVICE); 265 - } 266 - if (!(txd->flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 267 - if (txd->flags & DMA_COMPL_SRC_UNMAP_SINGLE) 268 - dma_unmap_single(chan2parent(&atchan->chan_common), 269 - desc->lli.saddr, 270 - desc->len, DMA_TO_DEVICE); 271 - else 272 - dma_unmap_page(chan2parent(&atchan->chan_common), 273 - desc->lli.saddr, 274 - desc->len, DMA_TO_DEVICE); 255 + if (!atchan->chan_common.private) { 256 + struct device *parent = chan2parent(&atchan->chan_common); 257 + if (!(txd->flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 258 + if (txd->flags & DMA_COMPL_DEST_UNMAP_SINGLE) 259 + dma_unmap_single(parent, 260 + desc->lli.daddr, 261 + desc->len, DMA_FROM_DEVICE); 262 + else 263 + dma_unmap_page(parent, 264 + desc->lli.daddr, 265 + desc->len, DMA_FROM_DEVICE); 266 + } 267 + if (!(txd->flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 268 + if (txd->flags & DMA_COMPL_SRC_UNMAP_SINGLE) 269 + dma_unmap_single(parent, 270 + desc->lli.saddr, 271 + desc->len, DMA_TO_DEVICE); 272 + else 273 + dma_unmap_page(parent, 274 + desc->lli.saddr, 275 + desc->len, DMA_TO_DEVICE); 276 + } 275 277 } 276 278 277 279 /* ··· 338 334 /* This one is currently in progress */ 339 335 return; 340 336 341 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 337 + list_for_each_entry(child, &desc->tx_list, desc_node) 342 338 if (!(child->lli.ctrla & ATC_DONE)) 343 339 /* Currently in progress */ 344 340 return; ··· 411 407 dev_crit(chan2dev(&atchan->chan_common), 412 408 " cookie: %d\n", bad_desc->txd.cookie); 413 409 atc_dump_lli(atchan, &bad_desc->lli); 414 - list_for_each_entry(child, &bad_desc->txd.tx_list, desc_node) 410 + list_for_each_entry(child, &bad_desc->tx_list, desc_node) 415 411 atc_dump_lli(atchan, &child->lli); 416 412 417 413 /* Pretend the descriptor completed successfully */ ··· 591 587 prev->lli.dscr = desc->txd.phys; 592 588 /* insert the link descriptor to the LD ring */ 593 589 list_add_tail(&desc->desc_node, 594 - &first->txd.tx_list); 590 + &first->tx_list); 595 591 } 596 592 prev = desc; 597 593 } ··· 650 646 651 647 reg_width = atslave->reg_width; 652 648 653 - sg_len = dma_map_sg(chan2parent(chan), sgl, sg_len, direction); 654 - 655 649 ctrla = ATC_DEFAULT_CTRLA | atslave->ctrla; 656 650 ctrlb = ATC_DEFAULT_CTRLB | ATC_IEN; 657 651 ··· 689 687 prev->lli.dscr = desc->txd.phys; 690 688 /* insert the link descriptor to the LD ring */ 691 689 list_add_tail(&desc->desc_node, 692 - &first->txd.tx_list); 690 + &first->tx_list); 693 691 } 694 692 prev = desc; 695 693 total_len += len; ··· 731 729 prev->lli.dscr = desc->txd.phys; 732 730 /* insert the link descriptor to the LD ring */ 733 731 list_add_tail(&desc->desc_node, 734 - &first->txd.tx_list); 732 + &first->tx_list); 735 733 } 736 734 prev = desc; 737 735 total_len += len;
+1
drivers/dma/at_hdmac_regs.h
··· 165 165 struct at_lli lli; 166 166 167 167 /* THEN values for driver housekeeping */ 168 + struct list_head tx_list; 168 169 struct dma_async_tx_descriptor txd; 169 170 struct list_head desc_node; 170 171 size_t len;
+56 -38
drivers/dma/dmaengine.c
··· 608 608 } 609 609 EXPORT_SYMBOL(dmaengine_put); 610 610 611 + static bool device_has_all_tx_types(struct dma_device *device) 612 + { 613 + /* A device that satisfies this test has channels that will never cause 614 + * an async_tx channel switch event as all possible operation types can 615 + * be handled. 616 + */ 617 + #ifdef CONFIG_ASYNC_TX_DMA 618 + if (!dma_has_cap(DMA_INTERRUPT, device->cap_mask)) 619 + return false; 620 + #endif 621 + 622 + #if defined(CONFIG_ASYNC_MEMCPY) || defined(CONFIG_ASYNC_MEMCPY_MODULE) 623 + if (!dma_has_cap(DMA_MEMCPY, device->cap_mask)) 624 + return false; 625 + #endif 626 + 627 + #if defined(CONFIG_ASYNC_MEMSET) || defined(CONFIG_ASYNC_MEMSET_MODULE) 628 + if (!dma_has_cap(DMA_MEMSET, device->cap_mask)) 629 + return false; 630 + #endif 631 + 632 + #if defined(CONFIG_ASYNC_XOR) || defined(CONFIG_ASYNC_XOR_MODULE) 633 + if (!dma_has_cap(DMA_XOR, device->cap_mask)) 634 + return false; 635 + #endif 636 + 637 + #if defined(CONFIG_ASYNC_PQ) || defined(CONFIG_ASYNC_PQ_MODULE) 638 + if (!dma_has_cap(DMA_PQ, device->cap_mask)) 639 + return false; 640 + #endif 641 + 642 + return true; 643 + } 644 + 611 645 static int get_dma_id(struct dma_device *device) 612 646 { 613 647 int rc; ··· 678 644 !device->device_prep_dma_memcpy); 679 645 BUG_ON(dma_has_cap(DMA_XOR, device->cap_mask) && 680 646 !device->device_prep_dma_xor); 681 - BUG_ON(dma_has_cap(DMA_ZERO_SUM, device->cap_mask) && 682 - !device->device_prep_dma_zero_sum); 647 + BUG_ON(dma_has_cap(DMA_XOR_VAL, device->cap_mask) && 648 + !device->device_prep_dma_xor_val); 649 + BUG_ON(dma_has_cap(DMA_PQ, device->cap_mask) && 650 + !device->device_prep_dma_pq); 651 + BUG_ON(dma_has_cap(DMA_PQ_VAL, device->cap_mask) && 652 + !device->device_prep_dma_pq_val); 683 653 BUG_ON(dma_has_cap(DMA_MEMSET, device->cap_mask) && 684 654 !device->device_prep_dma_memset); 685 655 BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) && ··· 698 660 BUG_ON(!device->device_is_tx_complete); 699 661 BUG_ON(!device->device_issue_pending); 700 662 BUG_ON(!device->dev); 663 + 664 + /* note: this only matters in the 665 + * CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH=y case 666 + */ 667 + if (device_has_all_tx_types(device)) 668 + dma_cap_set(DMA_ASYNC_TX, device->cap_mask); 701 669 702 670 idr_ref = kmalloc(sizeof(*idr_ref), GFP_KERNEL); 703 671 if (!idr_ref) ··· 977 933 { 978 934 tx->chan = chan; 979 935 spin_lock_init(&tx->lock); 980 - INIT_LIST_HEAD(&tx->tx_list); 981 936 } 982 937 EXPORT_SYMBOL(dma_async_tx_descriptor_init); 983 938 984 939 /* dma_wait_for_async_tx - spin wait for a transaction to complete 985 940 * @tx: in-flight transaction to wait on 986 - * 987 - * This routine assumes that tx was obtained from a call to async_memcpy, 988 - * async_xor, async_memset, etc which ensures that tx is "in-flight" (prepped 989 - * and submitted). Walking the parent chain is only meant to cover for DMA 990 - * drivers that do not implement the DMA_INTERRUPT capability and may race with 991 - * the driver's descriptor cleanup routine. 992 941 */ 993 942 enum dma_status 994 943 dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx) 995 944 { 996 - enum dma_status status; 997 - struct dma_async_tx_descriptor *iter; 998 - struct dma_async_tx_descriptor *parent; 945 + unsigned long dma_sync_wait_timeout = jiffies + msecs_to_jiffies(5000); 999 946 1000 947 if (!tx) 1001 948 return DMA_SUCCESS; 1002 949 1003 - WARN_ONCE(tx->parent, "%s: speculatively walking dependency chain for" 1004 - " %s\n", __func__, dma_chan_name(tx->chan)); 1005 - 1006 - /* poll through the dependency chain, return when tx is complete */ 1007 - do { 1008 - iter = tx; 1009 - 1010 - /* find the root of the unsubmitted dependency chain */ 1011 - do { 1012 - parent = iter->parent; 1013 - if (!parent) 1014 - break; 1015 - else 1016 - iter = parent; 1017 - } while (parent); 1018 - 1019 - /* there is a small window for ->parent == NULL and 1020 - * ->cookie == -EBUSY 1021 - */ 1022 - while (iter->cookie == -EBUSY) 1023 - cpu_relax(); 1024 - 1025 - status = dma_sync_wait(iter->chan, iter->cookie); 1026 - } while (status == DMA_IN_PROGRESS || (iter != tx)); 1027 - 1028 - return status; 950 + while (tx->cookie == -EBUSY) { 951 + if (time_after_eq(jiffies, dma_sync_wait_timeout)) { 952 + pr_err("%s timeout waiting for descriptor submission\n", 953 + __func__); 954 + return DMA_ERROR; 955 + } 956 + cpu_relax(); 957 + } 958 + return dma_sync_wait(tx->chan, tx->cookie); 1029 959 } 1030 960 EXPORT_SYMBOL_GPL(dma_wait_for_async_tx); 1031 961
+40
drivers/dma/dmatest.c
··· 48 48 MODULE_PARM_DESC(xor_sources, 49 49 "Number of xor source buffers (default: 3)"); 50 50 51 + static unsigned int pq_sources = 3; 52 + module_param(pq_sources, uint, S_IRUGO); 53 + MODULE_PARM_DESC(pq_sources, 54 + "Number of p+q source buffers (default: 3)"); 55 + 51 56 /* 52 57 * Initialization patterns. All bytes in the source buffer has bit 7 53 58 * set, all bytes in the destination buffer has bit 7 cleared. ··· 237 232 dma_cookie_t cookie; 238 233 enum dma_status status; 239 234 enum dma_ctrl_flags flags; 235 + u8 pq_coefs[pq_sources]; 240 236 int ret; 241 237 int src_cnt; 242 238 int dst_cnt; ··· 254 248 else if (thread->type == DMA_XOR) { 255 249 src_cnt = xor_sources | 1; /* force odd to ensure dst = src */ 256 250 dst_cnt = 1; 251 + } else if (thread->type == DMA_PQ) { 252 + src_cnt = pq_sources | 1; /* force odd to ensure dst = src */ 253 + dst_cnt = 2; 254 + for (i = 0; i < pq_sources; i++) 255 + pq_coefs[i] = 1; 257 256 } else 258 257 goto err_srcs; 259 258 ··· 294 283 dma_addr_t dma_dsts[dst_cnt]; 295 284 struct completion cmp; 296 285 unsigned long tmo = msecs_to_jiffies(3000); 286 + u8 align = 0; 297 287 298 288 total_tests++; 299 289 300 290 len = dmatest_random() % test_buf_size + 1; 301 291 src_off = dmatest_random() % (test_buf_size - len + 1); 302 292 dst_off = dmatest_random() % (test_buf_size - len + 1); 293 + 294 + /* honor alignment restrictions */ 295 + if (thread->type == DMA_MEMCPY) 296 + align = dev->copy_align; 297 + else if (thread->type == DMA_XOR) 298 + align = dev->xor_align; 299 + else if (thread->type == DMA_PQ) 300 + align = dev->pq_align; 301 + 302 + len = (len >> align) << align; 303 + src_off = (src_off >> align) << align; 304 + dst_off = (dst_off >> align) << align; 303 305 304 306 dmatest_init_srcs(thread->srcs, src_off, len); 305 307 dmatest_init_dsts(thread->dsts, dst_off, len); ··· 330 306 DMA_BIDIRECTIONAL); 331 307 } 332 308 309 + 333 310 if (thread->type == DMA_MEMCPY) 334 311 tx = dev->device_prep_dma_memcpy(chan, 335 312 dma_dsts[0] + dst_off, ··· 341 316 dma_dsts[0] + dst_off, 342 317 dma_srcs, xor_sources, 343 318 len, flags); 319 + else if (thread->type == DMA_PQ) { 320 + dma_addr_t dma_pq[dst_cnt]; 321 + 322 + for (i = 0; i < dst_cnt; i++) 323 + dma_pq[i] = dma_dsts[i] + dst_off; 324 + tx = dev->device_prep_dma_pq(chan, dma_pq, dma_srcs, 325 + pq_sources, pq_coefs, 326 + len, flags); 327 + } 344 328 345 329 if (!tx) { 346 330 for (i = 0; i < src_cnt; i++) ··· 493 459 op = "copy"; 494 460 else if (type == DMA_XOR) 495 461 op = "xor"; 462 + else if (type == DMA_PQ) 463 + op = "pq"; 496 464 else 497 465 return -EINVAL; 498 466 ··· 549 513 if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) { 550 514 cnt = dmatest_add_threads(dtc, DMA_XOR); 551 515 thread_count += cnt > 0 ? cnt : 0; 516 + } 517 + if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) { 518 + cnt = dmatest_add_threads(dtc, DMA_PQ); 519 + thread_count += cnt > 0 ?: 0; 552 520 } 553 521 554 522 pr_info("dmatest: Started %u threads using %s\n",
+29 -21
drivers/dma/dw_dmac.c
··· 116 116 { 117 117 struct dw_desc *child; 118 118 119 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 119 + list_for_each_entry(child, &desc->tx_list, desc_node) 120 120 dma_sync_single_for_cpu(chan2parent(&dwc->chan), 121 121 child->txd.phys, sizeof(child->lli), 122 122 DMA_TO_DEVICE); ··· 137 137 dwc_sync_desc_for_cpu(dwc, desc); 138 138 139 139 spin_lock_bh(&dwc->lock); 140 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 140 + list_for_each_entry(child, &desc->tx_list, desc_node) 141 141 dev_vdbg(chan2dev(&dwc->chan), 142 142 "moving child desc %p to freelist\n", 143 143 child); 144 - list_splice_init(&desc->txd.tx_list, &dwc->free_list); 144 + list_splice_init(&desc->tx_list, &dwc->free_list); 145 145 dev_vdbg(chan2dev(&dwc->chan), "moving desc %p to freelist\n", desc); 146 146 list_add(&desc->desc_node, &dwc->free_list); 147 147 spin_unlock_bh(&dwc->lock); ··· 209 209 param = txd->callback_param; 210 210 211 211 dwc_sync_desc_for_cpu(dwc, desc); 212 - list_splice_init(&txd->tx_list, &dwc->free_list); 212 + list_splice_init(&desc->tx_list, &dwc->free_list); 213 213 list_move(&desc->desc_node, &dwc->free_list); 214 214 215 - /* 216 - * We use dma_unmap_page() regardless of how the buffers were 217 - * mapped before they were submitted... 218 - */ 219 - if (!(txd->flags & DMA_COMPL_SKIP_DEST_UNMAP)) 220 - dma_unmap_page(chan2parent(&dwc->chan), desc->lli.dar, 221 - desc->len, DMA_FROM_DEVICE); 222 - if (!(txd->flags & DMA_COMPL_SKIP_SRC_UNMAP)) 223 - dma_unmap_page(chan2parent(&dwc->chan), desc->lli.sar, 224 - desc->len, DMA_TO_DEVICE); 215 + if (!dwc->chan.private) { 216 + struct device *parent = chan2parent(&dwc->chan); 217 + if (!(txd->flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 218 + if (txd->flags & DMA_COMPL_DEST_UNMAP_SINGLE) 219 + dma_unmap_single(parent, desc->lli.dar, 220 + desc->len, DMA_FROM_DEVICE); 221 + else 222 + dma_unmap_page(parent, desc->lli.dar, 223 + desc->len, DMA_FROM_DEVICE); 224 + } 225 + if (!(txd->flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 226 + if (txd->flags & DMA_COMPL_SRC_UNMAP_SINGLE) 227 + dma_unmap_single(parent, desc->lli.sar, 228 + desc->len, DMA_TO_DEVICE); 229 + else 230 + dma_unmap_page(parent, desc->lli.sar, 231 + desc->len, DMA_TO_DEVICE); 232 + } 233 + } 225 234 226 235 /* 227 236 * The API requires that no submissions are done from a ··· 298 289 /* This one is currently in progress */ 299 290 return; 300 291 301 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 292 + list_for_each_entry(child, &desc->tx_list, desc_node) 302 293 if (child->lli.llp == llp) 303 294 /* Currently in progress */ 304 295 return; ··· 365 356 dev_printk(KERN_CRIT, chan2dev(&dwc->chan), 366 357 " cookie: %d\n", bad_desc->txd.cookie); 367 358 dwc_dump_lli(dwc, &bad_desc->lli); 368 - list_for_each_entry(child, &bad_desc->txd.tx_list, desc_node) 359 + list_for_each_entry(child, &bad_desc->tx_list, desc_node) 369 360 dwc_dump_lli(dwc, &child->lli); 370 361 371 362 /* Pretend the descriptor completed successfully */ ··· 617 608 prev->txd.phys, sizeof(prev->lli), 618 609 DMA_TO_DEVICE); 619 610 list_add_tail(&desc->desc_node, 620 - &first->txd.tx_list); 611 + &first->tx_list); 621 612 } 622 613 prev = desc; 623 614 } ··· 667 658 reg_width = dws->reg_width; 668 659 prev = first = NULL; 669 660 670 - sg_len = dma_map_sg(chan2parent(chan), sgl, sg_len, direction); 671 - 672 661 switch (direction) { 673 662 case DMA_TO_DEVICE: 674 663 ctllo = (DWC_DEFAULT_CTLLO ··· 707 700 sizeof(prev->lli), 708 701 DMA_TO_DEVICE); 709 702 list_add_tail(&desc->desc_node, 710 - &first->txd.tx_list); 703 + &first->tx_list); 711 704 } 712 705 prev = desc; 713 706 total_len += len; ··· 753 746 sizeof(prev->lli), 754 747 DMA_TO_DEVICE); 755 748 list_add_tail(&desc->desc_node, 756 - &first->txd.tx_list); 749 + &first->tx_list); 757 750 } 758 751 prev = desc; 759 752 total_len += len; ··· 909 902 break; 910 903 } 911 904 905 + INIT_LIST_HEAD(&desc->tx_list); 912 906 dma_async_tx_descriptor_init(&desc->txd, chan); 913 907 desc->txd.tx_submit = dwc_tx_submit; 914 908 desc->txd.flags = DMA_CTRL_ACK;
+1
drivers/dma/dw_dmac_regs.h
··· 217 217 218 218 /* THEN values for driver housekeeping */ 219 219 struct list_head desc_node; 220 + struct list_head tx_list; 220 221 struct dma_async_tx_descriptor txd; 221 222 size_t len; 222 223 };
+265 -23
drivers/dma/fsldma.c
··· 34 34 #include <linux/dmapool.h> 35 35 #include <linux/of_platform.h> 36 36 37 + #include <asm/fsldma.h> 37 38 #include "fsldma.h" 38 39 39 40 static void dma_init(struct fsl_dma_chan *fsl_chan) ··· 281 280 } 282 281 283 282 /** 283 + * fsl_chan_set_request_count - Set DMA Request Count for external control 284 + * @fsl_chan : Freescale DMA channel 285 + * @size : Number of bytes to transfer in a single request 286 + * 287 + * The Freescale DMA channel can be controlled by the external signal DREQ#. 288 + * The DMA request count is how many bytes are allowed to transfer before 289 + * pausing the channel, after which a new assertion of DREQ# resumes channel 290 + * operation. 291 + * 292 + * A size of 0 disables external pause control. The maximum size is 1024. 293 + */ 294 + static void fsl_chan_set_request_count(struct fsl_dma_chan *fsl_chan, int size) 295 + { 296 + BUG_ON(size > 1024); 297 + DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, 298 + DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) 299 + | ((__ilog2(size) << 24) & 0x0f000000), 300 + 32); 301 + } 302 + 303 + /** 284 304 * fsl_chan_toggle_ext_pause - Toggle channel external pause status 285 305 * @fsl_chan : Freescale DMA channel 286 - * @size : Pause control size, 0 for disable external pause control. 287 - * The maximum is 1024. 306 + * @enable : 0 is disabled, 1 is enabled. 288 307 * 289 - * The Freescale DMA channel can be controlled by the external 290 - * signal DREQ#. The pause control size is how many bytes are allowed 291 - * to transfer before pausing the channel, after which a new assertion 292 - * of DREQ# resumes channel operation. 308 + * The Freescale DMA channel can be controlled by the external signal DREQ#. 309 + * The DMA Request Count feature should be used in addition to this feature 310 + * to set the number of bytes to transfer before pausing the channel. 293 311 */ 294 - static void fsl_chan_toggle_ext_pause(struct fsl_dma_chan *fsl_chan, int size) 312 + static void fsl_chan_toggle_ext_pause(struct fsl_dma_chan *fsl_chan, int enable) 295 313 { 296 - if (size > 1024) 297 - return; 298 - 299 - if (size) { 300 - DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, 301 - DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) 302 - | ((__ilog2(size) << 24) & 0x0f000000), 303 - 32); 314 + if (enable) 304 315 fsl_chan->feature |= FSL_DMA_CHAN_PAUSE_EXT; 305 - } else 316 + else 306 317 fsl_chan->feature &= ~FSL_DMA_CHAN_PAUSE_EXT; 307 318 } 308 319 ··· 339 326 static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx) 340 327 { 341 328 struct fsl_dma_chan *fsl_chan = to_fsl_chan(tx->chan); 342 - struct fsl_desc_sw *desc; 329 + struct fsl_desc_sw *desc = tx_to_fsl_desc(tx); 330 + struct fsl_desc_sw *child; 343 331 unsigned long flags; 344 332 dma_cookie_t cookie; 345 333 ··· 348 334 spin_lock_irqsave(&fsl_chan->desc_lock, flags); 349 335 350 336 cookie = fsl_chan->common.cookie; 351 - list_for_each_entry(desc, &tx->tx_list, node) { 337 + list_for_each_entry(child, &desc->tx_list, node) { 352 338 cookie++; 353 339 if (cookie < 0) 354 340 cookie = 1; ··· 357 343 } 358 344 359 345 fsl_chan->common.cookie = cookie; 360 - append_ld_queue(fsl_chan, tx_to_fsl_desc(tx)); 361 - list_splice_init(&tx->tx_list, fsl_chan->ld_queue.prev); 346 + append_ld_queue(fsl_chan, desc); 347 + list_splice_init(&desc->tx_list, fsl_chan->ld_queue.prev); 362 348 363 349 spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); 364 350 ··· 380 366 desc_sw = dma_pool_alloc(fsl_chan->desc_pool, GFP_ATOMIC, &pdesc); 381 367 if (desc_sw) { 382 368 memset(desc_sw, 0, sizeof(struct fsl_desc_sw)); 369 + INIT_LIST_HEAD(&desc_sw->tx_list); 383 370 dma_async_tx_descriptor_init(&desc_sw->async_tx, 384 371 &fsl_chan->common); 385 372 desc_sw->async_tx.tx_submit = fsl_dma_tx_submit; ··· 470 455 new->async_tx.flags = flags; 471 456 472 457 /* Insert the link descriptor to the LD ring */ 473 - list_add_tail(&new->node, &new->async_tx.tx_list); 458 + list_add_tail(&new->node, &new->tx_list); 474 459 475 460 /* Set End-of-link to the last link descriptor of new list*/ 476 461 set_ld_eol(fsl_chan, new); ··· 528 513 dma_dest += copy; 529 514 530 515 /* Insert the link descriptor to the LD ring */ 531 - list_add_tail(&new->node, &first->async_tx.tx_list); 516 + list_add_tail(&new->node, &first->tx_list); 532 517 } while (len); 533 518 534 519 new->async_tx.flags = flags; /* client is in control of this ack */ ··· 543 528 if (!first) 544 529 return NULL; 545 530 546 - list = &first->async_tx.tx_list; 531 + list = &first->tx_list; 547 532 list_for_each_entry_safe_reverse(new, prev, list, node) { 548 533 list_del(&new->node); 549 534 dma_pool_free(fsl_chan->desc_pool, new, new->async_tx.phys); 550 535 } 551 536 552 537 return NULL; 538 + } 539 + 540 + /** 541 + * fsl_dma_prep_slave_sg - prepare descriptors for a DMA_SLAVE transaction 542 + * @chan: DMA channel 543 + * @sgl: scatterlist to transfer to/from 544 + * @sg_len: number of entries in @scatterlist 545 + * @direction: DMA direction 546 + * @flags: DMAEngine flags 547 + * 548 + * Prepare a set of descriptors for a DMA_SLAVE transaction. Following the 549 + * DMA_SLAVE API, this gets the device-specific information from the 550 + * chan->private variable. 551 + */ 552 + static struct dma_async_tx_descriptor *fsl_dma_prep_slave_sg( 553 + struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len, 554 + enum dma_data_direction direction, unsigned long flags) 555 + { 556 + struct fsl_dma_chan *fsl_chan; 557 + struct fsl_desc_sw *first = NULL, *prev = NULL, *new = NULL; 558 + struct fsl_dma_slave *slave; 559 + struct list_head *tx_list; 560 + size_t copy; 561 + 562 + int i; 563 + struct scatterlist *sg; 564 + size_t sg_used; 565 + size_t hw_used; 566 + struct fsl_dma_hw_addr *hw; 567 + dma_addr_t dma_dst, dma_src; 568 + 569 + if (!chan) 570 + return NULL; 571 + 572 + if (!chan->private) 573 + return NULL; 574 + 575 + fsl_chan = to_fsl_chan(chan); 576 + slave = chan->private; 577 + 578 + if (list_empty(&slave->addresses)) 579 + return NULL; 580 + 581 + hw = list_first_entry(&slave->addresses, struct fsl_dma_hw_addr, entry); 582 + hw_used = 0; 583 + 584 + /* 585 + * Build the hardware transaction to copy from the scatterlist to 586 + * the hardware, or from the hardware to the scatterlist 587 + * 588 + * If you are copying from the hardware to the scatterlist and it 589 + * takes two hardware entries to fill an entire page, then both 590 + * hardware entries will be coalesced into the same page 591 + * 592 + * If you are copying from the scatterlist to the hardware and a 593 + * single page can fill two hardware entries, then the data will 594 + * be read out of the page into the first hardware entry, and so on 595 + */ 596 + for_each_sg(sgl, sg, sg_len, i) { 597 + sg_used = 0; 598 + 599 + /* Loop until the entire scatterlist entry is used */ 600 + while (sg_used < sg_dma_len(sg)) { 601 + 602 + /* 603 + * If we've used up the current hardware address/length 604 + * pair, we need to load a new one 605 + * 606 + * This is done in a while loop so that descriptors with 607 + * length == 0 will be skipped 608 + */ 609 + while (hw_used >= hw->length) { 610 + 611 + /* 612 + * If the current hardware entry is the last 613 + * entry in the list, we're finished 614 + */ 615 + if (list_is_last(&hw->entry, &slave->addresses)) 616 + goto finished; 617 + 618 + /* Get the next hardware address/length pair */ 619 + hw = list_entry(hw->entry.next, 620 + struct fsl_dma_hw_addr, entry); 621 + hw_used = 0; 622 + } 623 + 624 + /* Allocate the link descriptor from DMA pool */ 625 + new = fsl_dma_alloc_descriptor(fsl_chan); 626 + if (!new) { 627 + dev_err(fsl_chan->dev, "No free memory for " 628 + "link descriptor\n"); 629 + goto fail; 630 + } 631 + #ifdef FSL_DMA_LD_DEBUG 632 + dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new); 633 + #endif 634 + 635 + /* 636 + * Calculate the maximum number of bytes to transfer, 637 + * making sure it is less than the DMA controller limit 638 + */ 639 + copy = min_t(size_t, sg_dma_len(sg) - sg_used, 640 + hw->length - hw_used); 641 + copy = min_t(size_t, copy, FSL_DMA_BCR_MAX_CNT); 642 + 643 + /* 644 + * DMA_FROM_DEVICE 645 + * from the hardware to the scatterlist 646 + * 647 + * DMA_TO_DEVICE 648 + * from the scatterlist to the hardware 649 + */ 650 + if (direction == DMA_FROM_DEVICE) { 651 + dma_src = hw->address + hw_used; 652 + dma_dst = sg_dma_address(sg) + sg_used; 653 + } else { 654 + dma_src = sg_dma_address(sg) + sg_used; 655 + dma_dst = hw->address + hw_used; 656 + } 657 + 658 + /* Fill in the descriptor */ 659 + set_desc_cnt(fsl_chan, &new->hw, copy); 660 + set_desc_src(fsl_chan, &new->hw, dma_src); 661 + set_desc_dest(fsl_chan, &new->hw, dma_dst); 662 + 663 + /* 664 + * If this is not the first descriptor, chain the 665 + * current descriptor after the previous descriptor 666 + */ 667 + if (!first) { 668 + first = new; 669 + } else { 670 + set_desc_next(fsl_chan, &prev->hw, 671 + new->async_tx.phys); 672 + } 673 + 674 + new->async_tx.cookie = 0; 675 + async_tx_ack(&new->async_tx); 676 + 677 + prev = new; 678 + sg_used += copy; 679 + hw_used += copy; 680 + 681 + /* Insert the link descriptor into the LD ring */ 682 + list_add_tail(&new->node, &first->tx_list); 683 + } 684 + } 685 + 686 + finished: 687 + 688 + /* All of the hardware address/length pairs had length == 0 */ 689 + if (!first || !new) 690 + return NULL; 691 + 692 + new->async_tx.flags = flags; 693 + new->async_tx.cookie = -EBUSY; 694 + 695 + /* Set End-of-link to the last link descriptor of new list */ 696 + set_ld_eol(fsl_chan, new); 697 + 698 + /* Enable extra controller features */ 699 + if (fsl_chan->set_src_loop_size) 700 + fsl_chan->set_src_loop_size(fsl_chan, slave->src_loop_size); 701 + 702 + if (fsl_chan->set_dest_loop_size) 703 + fsl_chan->set_dest_loop_size(fsl_chan, slave->dst_loop_size); 704 + 705 + if (fsl_chan->toggle_ext_start) 706 + fsl_chan->toggle_ext_start(fsl_chan, slave->external_start); 707 + 708 + if (fsl_chan->toggle_ext_pause) 709 + fsl_chan->toggle_ext_pause(fsl_chan, slave->external_pause); 710 + 711 + if (fsl_chan->set_request_count) 712 + fsl_chan->set_request_count(fsl_chan, slave->request_count); 713 + 714 + return &first->async_tx; 715 + 716 + fail: 717 + /* If first was not set, then we failed to allocate the very first 718 + * descriptor, and we're done */ 719 + if (!first) 720 + return NULL; 721 + 722 + /* 723 + * First is set, so all of the descriptors we allocated have been added 724 + * to first->tx_list, INCLUDING "first" itself. Therefore we 725 + * must traverse the list backwards freeing each descriptor in turn 726 + * 727 + * We're re-using variables for the loop, oh well 728 + */ 729 + tx_list = &first->tx_list; 730 + list_for_each_entry_safe_reverse(new, prev, tx_list, node) { 731 + list_del_init(&new->node); 732 + dma_pool_free(fsl_chan->desc_pool, new, new->async_tx.phys); 733 + } 734 + 735 + return NULL; 736 + } 737 + 738 + static void fsl_dma_device_terminate_all(struct dma_chan *chan) 739 + { 740 + struct fsl_dma_chan *fsl_chan; 741 + struct fsl_desc_sw *desc, *tmp; 742 + unsigned long flags; 743 + 744 + if (!chan) 745 + return; 746 + 747 + fsl_chan = to_fsl_chan(chan); 748 + 749 + /* Halt the DMA engine */ 750 + dma_halt(fsl_chan); 751 + 752 + spin_lock_irqsave(&fsl_chan->desc_lock, flags); 753 + 754 + /* Remove and free all of the descriptors in the LD queue */ 755 + list_for_each_entry_safe(desc, tmp, &fsl_chan->ld_queue, node) { 756 + list_del(&desc->node); 757 + dma_pool_free(fsl_chan->desc_pool, desc, desc->async_tx.phys); 758 + } 759 + 760 + spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); 553 761 } 554 762 555 763 /** ··· 1121 883 new_fsl_chan->toggle_ext_start = fsl_chan_toggle_ext_start; 1122 884 new_fsl_chan->set_src_loop_size = fsl_chan_set_src_loop_size; 1123 885 new_fsl_chan->set_dest_loop_size = fsl_chan_set_dest_loop_size; 886 + new_fsl_chan->set_request_count = fsl_chan_set_request_count; 1124 887 } 1125 888 1126 889 spin_lock_init(&new_fsl_chan->desc_lock); ··· 1201 962 1202 963 dma_cap_set(DMA_MEMCPY, fdev->common.cap_mask); 1203 964 dma_cap_set(DMA_INTERRUPT, fdev->common.cap_mask); 965 + dma_cap_set(DMA_SLAVE, fdev->common.cap_mask); 1204 966 fdev->common.device_alloc_chan_resources = fsl_dma_alloc_chan_resources; 1205 967 fdev->common.device_free_chan_resources = fsl_dma_free_chan_resources; 1206 968 fdev->common.device_prep_dma_interrupt = fsl_dma_prep_interrupt; 1207 969 fdev->common.device_prep_dma_memcpy = fsl_dma_prep_memcpy; 1208 970 fdev->common.device_is_tx_complete = fsl_dma_is_complete; 1209 971 fdev->common.device_issue_pending = fsl_dma_memcpy_issue_pending; 972 + fdev->common.device_prep_slave_sg = fsl_dma_prep_slave_sg; 973 + fdev->common.device_terminate_all = fsl_dma_device_terminate_all; 1210 974 fdev->common.dev = &dev->dev; 1211 975 1212 976 fdev->irq = irq_of_parse_and_map(dev->node, 0);
+3 -1
drivers/dma/fsldma.h
··· 90 90 struct fsl_desc_sw { 91 91 struct fsl_dma_ld_hw hw; 92 92 struct list_head node; 93 + struct list_head tx_list; 93 94 struct dma_async_tx_descriptor async_tx; 94 95 struct list_head *ld; 95 96 void *priv; ··· 144 143 struct tasklet_struct tasklet; 145 144 u32 feature; 146 145 147 - void (*toggle_ext_pause)(struct fsl_dma_chan *fsl_chan, int size); 146 + void (*toggle_ext_pause)(struct fsl_dma_chan *fsl_chan, int enable); 148 147 void (*toggle_ext_start)(struct fsl_dma_chan *fsl_chan, int enable); 149 148 void (*set_src_loop_size)(struct fsl_dma_chan *fsl_chan, int size); 150 149 void (*set_dest_loop_size)(struct fsl_dma_chan *fsl_chan, int size); 150 + void (*set_request_count)(struct fsl_dma_chan *fsl_chan, int size); 151 151 }; 152 152 153 153 #define to_fsl_chan(chan) container_of(chan, struct fsl_dma_chan, common)
-202
drivers/dma/ioat.c
··· 1 - /* 2 - * Intel I/OAT DMA Linux driver 3 - * Copyright(c) 2007 - 2009 Intel Corporation. 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms and conditions of the GNU General Public License, 7 - * version 2, as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope that it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program; if not, write to the Free Software Foundation, Inc., 16 - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 17 - * 18 - * The full GNU General Public License is included in this distribution in 19 - * the file called "COPYING". 20 - * 21 - */ 22 - 23 - /* 24 - * This driver supports an Intel I/OAT DMA engine, which does asynchronous 25 - * copy operations. 26 - */ 27 - 28 - #include <linux/init.h> 29 - #include <linux/module.h> 30 - #include <linux/pci.h> 31 - #include <linux/interrupt.h> 32 - #include <linux/dca.h> 33 - #include "ioatdma.h" 34 - #include "ioatdma_registers.h" 35 - #include "ioatdma_hw.h" 36 - 37 - MODULE_VERSION(IOAT_DMA_VERSION); 38 - MODULE_LICENSE("GPL"); 39 - MODULE_AUTHOR("Intel Corporation"); 40 - 41 - static struct pci_device_id ioat_pci_tbl[] = { 42 - /* I/OAT v1 platforms */ 43 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT) }, 44 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB) }, 45 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SCNB) }, 46 - { PCI_DEVICE(PCI_VENDOR_ID_UNISYS, PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR) }, 47 - 48 - /* I/OAT v2 platforms */ 49 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB) }, 50 - 51 - /* I/OAT v3 platforms */ 52 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG0) }, 53 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG1) }, 54 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG2) }, 55 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG3) }, 56 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG4) }, 57 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG5) }, 58 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG6) }, 59 - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG7) }, 60 - { 0, } 61 - }; 62 - 63 - struct ioat_device { 64 - struct pci_dev *pdev; 65 - void __iomem *iobase; 66 - struct ioatdma_device *dma; 67 - struct dca_provider *dca; 68 - }; 69 - 70 - static int __devinit ioat_probe(struct pci_dev *pdev, 71 - const struct pci_device_id *id); 72 - static void __devexit ioat_remove(struct pci_dev *pdev); 73 - 74 - static int ioat_dca_enabled = 1; 75 - module_param(ioat_dca_enabled, int, 0644); 76 - MODULE_PARM_DESC(ioat_dca_enabled, "control support of dca service (default: 1)"); 77 - 78 - static struct pci_driver ioat_pci_driver = { 79 - .name = "ioatdma", 80 - .id_table = ioat_pci_tbl, 81 - .probe = ioat_probe, 82 - .remove = __devexit_p(ioat_remove), 83 - }; 84 - 85 - static int __devinit ioat_probe(struct pci_dev *pdev, 86 - const struct pci_device_id *id) 87 - { 88 - void __iomem *iobase; 89 - struct ioat_device *device; 90 - unsigned long mmio_start, mmio_len; 91 - int err; 92 - 93 - err = pci_enable_device(pdev); 94 - if (err) 95 - goto err_enable_device; 96 - 97 - err = pci_request_regions(pdev, ioat_pci_driver.name); 98 - if (err) 99 - goto err_request_regions; 100 - 101 - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); 102 - if (err) 103 - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 104 - if (err) 105 - goto err_set_dma_mask; 106 - 107 - err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); 108 - if (err) 109 - err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); 110 - if (err) 111 - goto err_set_dma_mask; 112 - 113 - mmio_start = pci_resource_start(pdev, 0); 114 - mmio_len = pci_resource_len(pdev, 0); 115 - iobase = ioremap(mmio_start, mmio_len); 116 - if (!iobase) { 117 - err = -ENOMEM; 118 - goto err_ioremap; 119 - } 120 - 121 - device = kzalloc(sizeof(*device), GFP_KERNEL); 122 - if (!device) { 123 - err = -ENOMEM; 124 - goto err_kzalloc; 125 - } 126 - device->pdev = pdev; 127 - pci_set_drvdata(pdev, device); 128 - device->iobase = iobase; 129 - 130 - pci_set_master(pdev); 131 - 132 - switch (readb(iobase + IOAT_VER_OFFSET)) { 133 - case IOAT_VER_1_2: 134 - device->dma = ioat_dma_probe(pdev, iobase); 135 - if (device->dma && ioat_dca_enabled) 136 - device->dca = ioat_dca_init(pdev, iobase); 137 - break; 138 - case IOAT_VER_2_0: 139 - device->dma = ioat_dma_probe(pdev, iobase); 140 - if (device->dma && ioat_dca_enabled) 141 - device->dca = ioat2_dca_init(pdev, iobase); 142 - break; 143 - case IOAT_VER_3_0: 144 - device->dma = ioat_dma_probe(pdev, iobase); 145 - if (device->dma && ioat_dca_enabled) 146 - device->dca = ioat3_dca_init(pdev, iobase); 147 - break; 148 - default: 149 - err = -ENODEV; 150 - break; 151 - } 152 - if (!device->dma) 153 - err = -ENODEV; 154 - 155 - if (err) 156 - goto err_version; 157 - 158 - return 0; 159 - 160 - err_version: 161 - kfree(device); 162 - err_kzalloc: 163 - iounmap(iobase); 164 - err_ioremap: 165 - err_set_dma_mask: 166 - pci_release_regions(pdev); 167 - pci_disable_device(pdev); 168 - err_request_regions: 169 - err_enable_device: 170 - return err; 171 - } 172 - 173 - static void __devexit ioat_remove(struct pci_dev *pdev) 174 - { 175 - struct ioat_device *device = pci_get_drvdata(pdev); 176 - 177 - dev_err(&pdev->dev, "Removing dma and dca services\n"); 178 - if (device->dca) { 179 - unregister_dca_provider(device->dca); 180 - free_dca_provider(device->dca); 181 - device->dca = NULL; 182 - } 183 - 184 - if (device->dma) { 185 - ioat_dma_remove(device->dma); 186 - device->dma = NULL; 187 - } 188 - 189 - kfree(device); 190 - } 191 - 192 - static int __init ioat_init_module(void) 193 - { 194 - return pci_register_driver(&ioat_pci_driver); 195 - } 196 - module_init(ioat_init_module); 197 - 198 - static void __exit ioat_exit_module(void) 199 - { 200 - pci_unregister_driver(&ioat_pci_driver); 201 - } 202 - module_exit(ioat_exit_module);
+2
drivers/dma/ioat/Makefile
··· 1 + obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o 2 + ioatdma-objs := pci.o dma.o dma_v2.o dma_v3.o dca.o
+1238
drivers/dma/ioat/dma.c
··· 1 + /* 2 + * Intel I/OAT DMA Linux driver 3 + * Copyright(c) 2004 - 2009 Intel Corporation. 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program; if not, write to the Free Software Foundation, Inc., 16 + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 17 + * 18 + * The full GNU General Public License is included in this distribution in 19 + * the file called "COPYING". 20 + * 21 + */ 22 + 23 + /* 24 + * This driver supports an Intel I/OAT DMA engine, which does asynchronous 25 + * copy operations. 26 + */ 27 + 28 + #include <linux/init.h> 29 + #include <linux/module.h> 30 + #include <linux/pci.h> 31 + #include <linux/interrupt.h> 32 + #include <linux/dmaengine.h> 33 + #include <linux/delay.h> 34 + #include <linux/dma-mapping.h> 35 + #include <linux/workqueue.h> 36 + #include <linux/i7300_idle.h> 37 + #include "dma.h" 38 + #include "registers.h" 39 + #include "hw.h" 40 + 41 + int ioat_pending_level = 4; 42 + module_param(ioat_pending_level, int, 0644); 43 + MODULE_PARM_DESC(ioat_pending_level, 44 + "high-water mark for pushing ioat descriptors (default: 4)"); 45 + 46 + /* internal functions */ 47 + static void ioat1_cleanup(struct ioat_dma_chan *ioat); 48 + static void ioat1_dma_start_null_desc(struct ioat_dma_chan *ioat); 49 + 50 + /** 51 + * ioat_dma_do_interrupt - handler used for single vector interrupt mode 52 + * @irq: interrupt id 53 + * @data: interrupt data 54 + */ 55 + static irqreturn_t ioat_dma_do_interrupt(int irq, void *data) 56 + { 57 + struct ioatdma_device *instance = data; 58 + struct ioat_chan_common *chan; 59 + unsigned long attnstatus; 60 + int bit; 61 + u8 intrctrl; 62 + 63 + intrctrl = readb(instance->reg_base + IOAT_INTRCTRL_OFFSET); 64 + 65 + if (!(intrctrl & IOAT_INTRCTRL_MASTER_INT_EN)) 66 + return IRQ_NONE; 67 + 68 + if (!(intrctrl & IOAT_INTRCTRL_INT_STATUS)) { 69 + writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET); 70 + return IRQ_NONE; 71 + } 72 + 73 + attnstatus = readl(instance->reg_base + IOAT_ATTNSTATUS_OFFSET); 74 + for_each_bit(bit, &attnstatus, BITS_PER_LONG) { 75 + chan = ioat_chan_by_index(instance, bit); 76 + tasklet_schedule(&chan->cleanup_task); 77 + } 78 + 79 + writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET); 80 + return IRQ_HANDLED; 81 + } 82 + 83 + /** 84 + * ioat_dma_do_interrupt_msix - handler used for vector-per-channel interrupt mode 85 + * @irq: interrupt id 86 + * @data: interrupt data 87 + */ 88 + static irqreturn_t ioat_dma_do_interrupt_msix(int irq, void *data) 89 + { 90 + struct ioat_chan_common *chan = data; 91 + 92 + tasklet_schedule(&chan->cleanup_task); 93 + 94 + return IRQ_HANDLED; 95 + } 96 + 97 + static void ioat1_cleanup_tasklet(unsigned long data); 98 + 99 + /* common channel initialization */ 100 + void ioat_init_channel(struct ioatdma_device *device, 101 + struct ioat_chan_common *chan, int idx, 102 + void (*timer_fn)(unsigned long), 103 + void (*tasklet)(unsigned long), 104 + unsigned long ioat) 105 + { 106 + struct dma_device *dma = &device->common; 107 + 108 + chan->device = device; 109 + chan->reg_base = device->reg_base + (0x80 * (idx + 1)); 110 + spin_lock_init(&chan->cleanup_lock); 111 + chan->common.device = dma; 112 + list_add_tail(&chan->common.device_node, &dma->channels); 113 + device->idx[idx] = chan; 114 + init_timer(&chan->timer); 115 + chan->timer.function = timer_fn; 116 + chan->timer.data = ioat; 117 + tasklet_init(&chan->cleanup_task, tasklet, ioat); 118 + tasklet_disable(&chan->cleanup_task); 119 + } 120 + 121 + static void ioat1_timer_event(unsigned long data); 122 + 123 + /** 124 + * ioat1_dma_enumerate_channels - find and initialize the device's channels 125 + * @device: the device to be enumerated 126 + */ 127 + static int ioat1_enumerate_channels(struct ioatdma_device *device) 128 + { 129 + u8 xfercap_scale; 130 + u32 xfercap; 131 + int i; 132 + struct ioat_dma_chan *ioat; 133 + struct device *dev = &device->pdev->dev; 134 + struct dma_device *dma = &device->common; 135 + 136 + INIT_LIST_HEAD(&dma->channels); 137 + dma->chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET); 138 + dma->chancnt &= 0x1f; /* bits [4:0] valid */ 139 + if (dma->chancnt > ARRAY_SIZE(device->idx)) { 140 + dev_warn(dev, "(%d) exceeds max supported channels (%zu)\n", 141 + dma->chancnt, ARRAY_SIZE(device->idx)); 142 + dma->chancnt = ARRAY_SIZE(device->idx); 143 + } 144 + xfercap_scale = readb(device->reg_base + IOAT_XFERCAP_OFFSET); 145 + xfercap_scale &= 0x1f; /* bits [4:0] valid */ 146 + xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale)); 147 + dev_dbg(dev, "%s: xfercap = %d\n", __func__, xfercap); 148 + 149 + #ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL 150 + if (i7300_idle_platform_probe(NULL, NULL, 1) == 0) 151 + dma->chancnt--; 152 + #endif 153 + for (i = 0; i < dma->chancnt; i++) { 154 + ioat = devm_kzalloc(dev, sizeof(*ioat), GFP_KERNEL); 155 + if (!ioat) 156 + break; 157 + 158 + ioat_init_channel(device, &ioat->base, i, 159 + ioat1_timer_event, 160 + ioat1_cleanup_tasklet, 161 + (unsigned long) ioat); 162 + ioat->xfercap = xfercap; 163 + spin_lock_init(&ioat->desc_lock); 164 + INIT_LIST_HEAD(&ioat->free_desc); 165 + INIT_LIST_HEAD(&ioat->used_desc); 166 + } 167 + dma->chancnt = i; 168 + return i; 169 + } 170 + 171 + /** 172 + * ioat_dma_memcpy_issue_pending - push potentially unrecognized appended 173 + * descriptors to hw 174 + * @chan: DMA channel handle 175 + */ 176 + static inline void 177 + __ioat1_dma_memcpy_issue_pending(struct ioat_dma_chan *ioat) 178 + { 179 + void __iomem *reg_base = ioat->base.reg_base; 180 + 181 + dev_dbg(to_dev(&ioat->base), "%s: pending: %d\n", 182 + __func__, ioat->pending); 183 + ioat->pending = 0; 184 + writeb(IOAT_CHANCMD_APPEND, reg_base + IOAT1_CHANCMD_OFFSET); 185 + } 186 + 187 + static void ioat1_dma_memcpy_issue_pending(struct dma_chan *chan) 188 + { 189 + struct ioat_dma_chan *ioat = to_ioat_chan(chan); 190 + 191 + if (ioat->pending > 0) { 192 + spin_lock_bh(&ioat->desc_lock); 193 + __ioat1_dma_memcpy_issue_pending(ioat); 194 + spin_unlock_bh(&ioat->desc_lock); 195 + } 196 + } 197 + 198 + /** 199 + * ioat1_reset_channel - restart a channel 200 + * @ioat: IOAT DMA channel handle 201 + */ 202 + static void ioat1_reset_channel(struct ioat_dma_chan *ioat) 203 + { 204 + struct ioat_chan_common *chan = &ioat->base; 205 + void __iomem *reg_base = chan->reg_base; 206 + u32 chansts, chanerr; 207 + 208 + dev_warn(to_dev(chan), "reset\n"); 209 + chanerr = readl(reg_base + IOAT_CHANERR_OFFSET); 210 + chansts = *chan->completion & IOAT_CHANSTS_STATUS; 211 + if (chanerr) { 212 + dev_err(to_dev(chan), 213 + "chan%d, CHANSTS = 0x%08x CHANERR = 0x%04x, clearing\n", 214 + chan_num(chan), chansts, chanerr); 215 + writel(chanerr, reg_base + IOAT_CHANERR_OFFSET); 216 + } 217 + 218 + /* 219 + * whack it upside the head with a reset 220 + * and wait for things to settle out. 221 + * force the pending count to a really big negative 222 + * to make sure no one forces an issue_pending 223 + * while we're waiting. 224 + */ 225 + 226 + ioat->pending = INT_MIN; 227 + writeb(IOAT_CHANCMD_RESET, 228 + reg_base + IOAT_CHANCMD_OFFSET(chan->device->version)); 229 + set_bit(IOAT_RESET_PENDING, &chan->state); 230 + mod_timer(&chan->timer, jiffies + RESET_DELAY); 231 + } 232 + 233 + static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx) 234 + { 235 + struct dma_chan *c = tx->chan; 236 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 237 + struct ioat_desc_sw *desc = tx_to_ioat_desc(tx); 238 + struct ioat_chan_common *chan = &ioat->base; 239 + struct ioat_desc_sw *first; 240 + struct ioat_desc_sw *chain_tail; 241 + dma_cookie_t cookie; 242 + 243 + spin_lock_bh(&ioat->desc_lock); 244 + /* cookie incr and addition to used_list must be atomic */ 245 + cookie = c->cookie; 246 + cookie++; 247 + if (cookie < 0) 248 + cookie = 1; 249 + c->cookie = cookie; 250 + tx->cookie = cookie; 251 + dev_dbg(to_dev(&ioat->base), "%s: cookie: %d\n", __func__, cookie); 252 + 253 + /* write address into NextDescriptor field of last desc in chain */ 254 + first = to_ioat_desc(desc->tx_list.next); 255 + chain_tail = to_ioat_desc(ioat->used_desc.prev); 256 + /* make descriptor updates globally visible before chaining */ 257 + wmb(); 258 + chain_tail->hw->next = first->txd.phys; 259 + list_splice_tail_init(&desc->tx_list, &ioat->used_desc); 260 + dump_desc_dbg(ioat, chain_tail); 261 + dump_desc_dbg(ioat, first); 262 + 263 + if (!test_and_set_bit(IOAT_COMPLETION_PENDING, &chan->state)) 264 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 265 + 266 + ioat->active += desc->hw->tx_cnt; 267 + ioat->pending += desc->hw->tx_cnt; 268 + if (ioat->pending >= ioat_pending_level) 269 + __ioat1_dma_memcpy_issue_pending(ioat); 270 + spin_unlock_bh(&ioat->desc_lock); 271 + 272 + return cookie; 273 + } 274 + 275 + /** 276 + * ioat_dma_alloc_descriptor - allocate and return a sw and hw descriptor pair 277 + * @ioat: the channel supplying the memory pool for the descriptors 278 + * @flags: allocation flags 279 + */ 280 + static struct ioat_desc_sw * 281 + ioat_dma_alloc_descriptor(struct ioat_dma_chan *ioat, gfp_t flags) 282 + { 283 + struct ioat_dma_descriptor *desc; 284 + struct ioat_desc_sw *desc_sw; 285 + struct ioatdma_device *ioatdma_device; 286 + dma_addr_t phys; 287 + 288 + ioatdma_device = ioat->base.device; 289 + desc = pci_pool_alloc(ioatdma_device->dma_pool, flags, &phys); 290 + if (unlikely(!desc)) 291 + return NULL; 292 + 293 + desc_sw = kzalloc(sizeof(*desc_sw), flags); 294 + if (unlikely(!desc_sw)) { 295 + pci_pool_free(ioatdma_device->dma_pool, desc, phys); 296 + return NULL; 297 + } 298 + 299 + memset(desc, 0, sizeof(*desc)); 300 + 301 + INIT_LIST_HEAD(&desc_sw->tx_list); 302 + dma_async_tx_descriptor_init(&desc_sw->txd, &ioat->base.common); 303 + desc_sw->txd.tx_submit = ioat1_tx_submit; 304 + desc_sw->hw = desc; 305 + desc_sw->txd.phys = phys; 306 + set_desc_id(desc_sw, -1); 307 + 308 + return desc_sw; 309 + } 310 + 311 + static int ioat_initial_desc_count = 256; 312 + module_param(ioat_initial_desc_count, int, 0644); 313 + MODULE_PARM_DESC(ioat_initial_desc_count, 314 + "ioat1: initial descriptors per channel (default: 256)"); 315 + /** 316 + * ioat1_dma_alloc_chan_resources - returns the number of allocated descriptors 317 + * @chan: the channel to be filled out 318 + */ 319 + static int ioat1_dma_alloc_chan_resources(struct dma_chan *c) 320 + { 321 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 322 + struct ioat_chan_common *chan = &ioat->base; 323 + struct ioat_desc_sw *desc; 324 + u32 chanerr; 325 + int i; 326 + LIST_HEAD(tmp_list); 327 + 328 + /* have we already been set up? */ 329 + if (!list_empty(&ioat->free_desc)) 330 + return ioat->desccount; 331 + 332 + /* Setup register to interrupt and write completion status on error */ 333 + writew(IOAT_CHANCTRL_RUN, chan->reg_base + IOAT_CHANCTRL_OFFSET); 334 + 335 + chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); 336 + if (chanerr) { 337 + dev_err(to_dev(chan), "CHANERR = %x, clearing\n", chanerr); 338 + writel(chanerr, chan->reg_base + IOAT_CHANERR_OFFSET); 339 + } 340 + 341 + /* Allocate descriptors */ 342 + for (i = 0; i < ioat_initial_desc_count; i++) { 343 + desc = ioat_dma_alloc_descriptor(ioat, GFP_KERNEL); 344 + if (!desc) { 345 + dev_err(to_dev(chan), "Only %d initial descriptors\n", i); 346 + break; 347 + } 348 + set_desc_id(desc, i); 349 + list_add_tail(&desc->node, &tmp_list); 350 + } 351 + spin_lock_bh(&ioat->desc_lock); 352 + ioat->desccount = i; 353 + list_splice(&tmp_list, &ioat->free_desc); 354 + spin_unlock_bh(&ioat->desc_lock); 355 + 356 + /* allocate a completion writeback area */ 357 + /* doing 2 32bit writes to mmio since 1 64b write doesn't work */ 358 + chan->completion = pci_pool_alloc(chan->device->completion_pool, 359 + GFP_KERNEL, &chan->completion_dma); 360 + memset(chan->completion, 0, sizeof(*chan->completion)); 361 + writel(((u64) chan->completion_dma) & 0x00000000FFFFFFFF, 362 + chan->reg_base + IOAT_CHANCMP_OFFSET_LOW); 363 + writel(((u64) chan->completion_dma) >> 32, 364 + chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH); 365 + 366 + tasklet_enable(&chan->cleanup_task); 367 + ioat1_dma_start_null_desc(ioat); /* give chain to dma device */ 368 + dev_dbg(to_dev(chan), "%s: allocated %d descriptors\n", 369 + __func__, ioat->desccount); 370 + return ioat->desccount; 371 + } 372 + 373 + /** 374 + * ioat1_dma_free_chan_resources - release all the descriptors 375 + * @chan: the channel to be cleaned 376 + */ 377 + static void ioat1_dma_free_chan_resources(struct dma_chan *c) 378 + { 379 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 380 + struct ioat_chan_common *chan = &ioat->base; 381 + struct ioatdma_device *ioatdma_device = chan->device; 382 + struct ioat_desc_sw *desc, *_desc; 383 + int in_use_descs = 0; 384 + 385 + /* Before freeing channel resources first check 386 + * if they have been previously allocated for this channel. 387 + */ 388 + if (ioat->desccount == 0) 389 + return; 390 + 391 + tasklet_disable(&chan->cleanup_task); 392 + del_timer_sync(&chan->timer); 393 + ioat1_cleanup(ioat); 394 + 395 + /* Delay 100ms after reset to allow internal DMA logic to quiesce 396 + * before removing DMA descriptor resources. 397 + */ 398 + writeb(IOAT_CHANCMD_RESET, 399 + chan->reg_base + IOAT_CHANCMD_OFFSET(chan->device->version)); 400 + mdelay(100); 401 + 402 + spin_lock_bh(&ioat->desc_lock); 403 + list_for_each_entry_safe(desc, _desc, &ioat->used_desc, node) { 404 + dev_dbg(to_dev(chan), "%s: freeing %d from used list\n", 405 + __func__, desc_id(desc)); 406 + dump_desc_dbg(ioat, desc); 407 + in_use_descs++; 408 + list_del(&desc->node); 409 + pci_pool_free(ioatdma_device->dma_pool, desc->hw, 410 + desc->txd.phys); 411 + kfree(desc); 412 + } 413 + list_for_each_entry_safe(desc, _desc, 414 + &ioat->free_desc, node) { 415 + list_del(&desc->node); 416 + pci_pool_free(ioatdma_device->dma_pool, desc->hw, 417 + desc->txd.phys); 418 + kfree(desc); 419 + } 420 + spin_unlock_bh(&ioat->desc_lock); 421 + 422 + pci_pool_free(ioatdma_device->completion_pool, 423 + chan->completion, 424 + chan->completion_dma); 425 + 426 + /* one is ok since we left it on there on purpose */ 427 + if (in_use_descs > 1) 428 + dev_err(to_dev(chan), "Freeing %d in use descriptors!\n", 429 + in_use_descs - 1); 430 + 431 + chan->last_completion = 0; 432 + chan->completion_dma = 0; 433 + ioat->pending = 0; 434 + ioat->desccount = 0; 435 + } 436 + 437 + /** 438 + * ioat1_dma_get_next_descriptor - return the next available descriptor 439 + * @ioat: IOAT DMA channel handle 440 + * 441 + * Gets the next descriptor from the chain, and must be called with the 442 + * channel's desc_lock held. Allocates more descriptors if the channel 443 + * has run out. 444 + */ 445 + static struct ioat_desc_sw * 446 + ioat1_dma_get_next_descriptor(struct ioat_dma_chan *ioat) 447 + { 448 + struct ioat_desc_sw *new; 449 + 450 + if (!list_empty(&ioat->free_desc)) { 451 + new = to_ioat_desc(ioat->free_desc.next); 452 + list_del(&new->node); 453 + } else { 454 + /* try to get another desc */ 455 + new = ioat_dma_alloc_descriptor(ioat, GFP_ATOMIC); 456 + if (!new) { 457 + dev_err(to_dev(&ioat->base), "alloc failed\n"); 458 + return NULL; 459 + } 460 + } 461 + dev_dbg(to_dev(&ioat->base), "%s: allocated: %d\n", 462 + __func__, desc_id(new)); 463 + prefetch(new->hw); 464 + return new; 465 + } 466 + 467 + static struct dma_async_tx_descriptor * 468 + ioat1_dma_prep_memcpy(struct dma_chan *c, dma_addr_t dma_dest, 469 + dma_addr_t dma_src, size_t len, unsigned long flags) 470 + { 471 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 472 + struct ioat_desc_sw *desc; 473 + size_t copy; 474 + LIST_HEAD(chain); 475 + dma_addr_t src = dma_src; 476 + dma_addr_t dest = dma_dest; 477 + size_t total_len = len; 478 + struct ioat_dma_descriptor *hw = NULL; 479 + int tx_cnt = 0; 480 + 481 + spin_lock_bh(&ioat->desc_lock); 482 + desc = ioat1_dma_get_next_descriptor(ioat); 483 + do { 484 + if (!desc) 485 + break; 486 + 487 + tx_cnt++; 488 + copy = min_t(size_t, len, ioat->xfercap); 489 + 490 + hw = desc->hw; 491 + hw->size = copy; 492 + hw->ctl = 0; 493 + hw->src_addr = src; 494 + hw->dst_addr = dest; 495 + 496 + list_add_tail(&desc->node, &chain); 497 + 498 + len -= copy; 499 + dest += copy; 500 + src += copy; 501 + if (len) { 502 + struct ioat_desc_sw *next; 503 + 504 + async_tx_ack(&desc->txd); 505 + next = ioat1_dma_get_next_descriptor(ioat); 506 + hw->next = next ? next->txd.phys : 0; 507 + dump_desc_dbg(ioat, desc); 508 + desc = next; 509 + } else 510 + hw->next = 0; 511 + } while (len); 512 + 513 + if (!desc) { 514 + struct ioat_chan_common *chan = &ioat->base; 515 + 516 + dev_err(to_dev(chan), 517 + "chan%d - get_next_desc failed\n", chan_num(chan)); 518 + list_splice(&chain, &ioat->free_desc); 519 + spin_unlock_bh(&ioat->desc_lock); 520 + return NULL; 521 + } 522 + spin_unlock_bh(&ioat->desc_lock); 523 + 524 + desc->txd.flags = flags; 525 + desc->len = total_len; 526 + list_splice(&chain, &desc->tx_list); 527 + hw->ctl_f.int_en = !!(flags & DMA_PREP_INTERRUPT); 528 + hw->ctl_f.compl_write = 1; 529 + hw->tx_cnt = tx_cnt; 530 + dump_desc_dbg(ioat, desc); 531 + 532 + return &desc->txd; 533 + } 534 + 535 + static void ioat1_cleanup_tasklet(unsigned long data) 536 + { 537 + struct ioat_dma_chan *chan = (void *)data; 538 + 539 + ioat1_cleanup(chan); 540 + writew(IOAT_CHANCTRL_RUN, chan->base.reg_base + IOAT_CHANCTRL_OFFSET); 541 + } 542 + 543 + void ioat_dma_unmap(struct ioat_chan_common *chan, enum dma_ctrl_flags flags, 544 + size_t len, struct ioat_dma_descriptor *hw) 545 + { 546 + struct pci_dev *pdev = chan->device->pdev; 547 + size_t offset = len - hw->size; 548 + 549 + if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) 550 + ioat_unmap(pdev, hw->dst_addr - offset, len, 551 + PCI_DMA_FROMDEVICE, flags, 1); 552 + 553 + if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) 554 + ioat_unmap(pdev, hw->src_addr - offset, len, 555 + PCI_DMA_TODEVICE, flags, 0); 556 + } 557 + 558 + unsigned long ioat_get_current_completion(struct ioat_chan_common *chan) 559 + { 560 + unsigned long phys_complete; 561 + u64 completion; 562 + 563 + completion = *chan->completion; 564 + phys_complete = ioat_chansts_to_addr(completion); 565 + 566 + dev_dbg(to_dev(chan), "%s: phys_complete: %#llx\n", __func__, 567 + (unsigned long long) phys_complete); 568 + 569 + if (is_ioat_halted(completion)) { 570 + u32 chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); 571 + dev_err(to_dev(chan), "Channel halted, chanerr = %x\n", 572 + chanerr); 573 + 574 + /* TODO do something to salvage the situation */ 575 + } 576 + 577 + return phys_complete; 578 + } 579 + 580 + bool ioat_cleanup_preamble(struct ioat_chan_common *chan, 581 + unsigned long *phys_complete) 582 + { 583 + *phys_complete = ioat_get_current_completion(chan); 584 + if (*phys_complete == chan->last_completion) 585 + return false; 586 + clear_bit(IOAT_COMPLETION_ACK, &chan->state); 587 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 588 + 589 + return true; 590 + } 591 + 592 + static void __cleanup(struct ioat_dma_chan *ioat, unsigned long phys_complete) 593 + { 594 + struct ioat_chan_common *chan = &ioat->base; 595 + struct list_head *_desc, *n; 596 + struct dma_async_tx_descriptor *tx; 597 + 598 + dev_dbg(to_dev(chan), "%s: phys_complete: %lx\n", 599 + __func__, phys_complete); 600 + list_for_each_safe(_desc, n, &ioat->used_desc) { 601 + struct ioat_desc_sw *desc; 602 + 603 + prefetch(n); 604 + desc = list_entry(_desc, typeof(*desc), node); 605 + tx = &desc->txd; 606 + /* 607 + * Incoming DMA requests may use multiple descriptors, 608 + * due to exceeding xfercap, perhaps. If so, only the 609 + * last one will have a cookie, and require unmapping. 610 + */ 611 + dump_desc_dbg(ioat, desc); 612 + if (tx->cookie) { 613 + chan->completed_cookie = tx->cookie; 614 + tx->cookie = 0; 615 + ioat_dma_unmap(chan, tx->flags, desc->len, desc->hw); 616 + ioat->active -= desc->hw->tx_cnt; 617 + if (tx->callback) { 618 + tx->callback(tx->callback_param); 619 + tx->callback = NULL; 620 + } 621 + } 622 + 623 + if (tx->phys != phys_complete) { 624 + /* 625 + * a completed entry, but not the last, so clean 626 + * up if the client is done with the descriptor 627 + */ 628 + if (async_tx_test_ack(tx)) 629 + list_move_tail(&desc->node, &ioat->free_desc); 630 + } else { 631 + /* 632 + * last used desc. Do not remove, so we can 633 + * append from it. 634 + */ 635 + 636 + /* if nothing else is pending, cancel the 637 + * completion timeout 638 + */ 639 + if (n == &ioat->used_desc) { 640 + dev_dbg(to_dev(chan), 641 + "%s cancel completion timeout\n", 642 + __func__); 643 + clear_bit(IOAT_COMPLETION_PENDING, &chan->state); 644 + } 645 + 646 + /* TODO check status bits? */ 647 + break; 648 + } 649 + } 650 + 651 + chan->last_completion = phys_complete; 652 + } 653 + 654 + /** 655 + * ioat1_cleanup - cleanup up finished descriptors 656 + * @chan: ioat channel to be cleaned up 657 + * 658 + * To prevent lock contention we defer cleanup when the locks are 659 + * contended with a terminal timeout that forces cleanup and catches 660 + * completion notification errors. 661 + */ 662 + static void ioat1_cleanup(struct ioat_dma_chan *ioat) 663 + { 664 + struct ioat_chan_common *chan = &ioat->base; 665 + unsigned long phys_complete; 666 + 667 + prefetch(chan->completion); 668 + 669 + if (!spin_trylock_bh(&chan->cleanup_lock)) 670 + return; 671 + 672 + if (!ioat_cleanup_preamble(chan, &phys_complete)) { 673 + spin_unlock_bh(&chan->cleanup_lock); 674 + return; 675 + } 676 + 677 + if (!spin_trylock_bh(&ioat->desc_lock)) { 678 + spin_unlock_bh(&chan->cleanup_lock); 679 + return; 680 + } 681 + 682 + __cleanup(ioat, phys_complete); 683 + 684 + spin_unlock_bh(&ioat->desc_lock); 685 + spin_unlock_bh(&chan->cleanup_lock); 686 + } 687 + 688 + static void ioat1_timer_event(unsigned long data) 689 + { 690 + struct ioat_dma_chan *ioat = (void *) data; 691 + struct ioat_chan_common *chan = &ioat->base; 692 + 693 + dev_dbg(to_dev(chan), "%s: state: %lx\n", __func__, chan->state); 694 + 695 + spin_lock_bh(&chan->cleanup_lock); 696 + if (test_and_clear_bit(IOAT_RESET_PENDING, &chan->state)) { 697 + struct ioat_desc_sw *desc; 698 + 699 + spin_lock_bh(&ioat->desc_lock); 700 + 701 + /* restart active descriptors */ 702 + desc = to_ioat_desc(ioat->used_desc.prev); 703 + ioat_set_chainaddr(ioat, desc->txd.phys); 704 + ioat_start(chan); 705 + 706 + ioat->pending = 0; 707 + set_bit(IOAT_COMPLETION_PENDING, &chan->state); 708 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 709 + spin_unlock_bh(&ioat->desc_lock); 710 + } else if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) { 711 + unsigned long phys_complete; 712 + 713 + spin_lock_bh(&ioat->desc_lock); 714 + /* if we haven't made progress and we have already 715 + * acknowledged a pending completion once, then be more 716 + * forceful with a restart 717 + */ 718 + if (ioat_cleanup_preamble(chan, &phys_complete)) 719 + __cleanup(ioat, phys_complete); 720 + else if (test_bit(IOAT_COMPLETION_ACK, &chan->state)) 721 + ioat1_reset_channel(ioat); 722 + else { 723 + u64 status = ioat_chansts(chan); 724 + 725 + /* manually update the last completion address */ 726 + if (ioat_chansts_to_addr(status) != 0) 727 + *chan->completion = status; 728 + 729 + set_bit(IOAT_COMPLETION_ACK, &chan->state); 730 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 731 + } 732 + spin_unlock_bh(&ioat->desc_lock); 733 + } 734 + spin_unlock_bh(&chan->cleanup_lock); 735 + } 736 + 737 + static enum dma_status 738 + ioat1_dma_is_complete(struct dma_chan *c, dma_cookie_t cookie, 739 + dma_cookie_t *done, dma_cookie_t *used) 740 + { 741 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 742 + 743 + if (ioat_is_complete(c, cookie, done, used) == DMA_SUCCESS) 744 + return DMA_SUCCESS; 745 + 746 + ioat1_cleanup(ioat); 747 + 748 + return ioat_is_complete(c, cookie, done, used); 749 + } 750 + 751 + static void ioat1_dma_start_null_desc(struct ioat_dma_chan *ioat) 752 + { 753 + struct ioat_chan_common *chan = &ioat->base; 754 + struct ioat_desc_sw *desc; 755 + struct ioat_dma_descriptor *hw; 756 + 757 + spin_lock_bh(&ioat->desc_lock); 758 + 759 + desc = ioat1_dma_get_next_descriptor(ioat); 760 + 761 + if (!desc) { 762 + dev_err(to_dev(chan), 763 + "Unable to start null desc - get next desc failed\n"); 764 + spin_unlock_bh(&ioat->desc_lock); 765 + return; 766 + } 767 + 768 + hw = desc->hw; 769 + hw->ctl = 0; 770 + hw->ctl_f.null = 1; 771 + hw->ctl_f.int_en = 1; 772 + hw->ctl_f.compl_write = 1; 773 + /* set size to non-zero value (channel returns error when size is 0) */ 774 + hw->size = NULL_DESC_BUFFER_SIZE; 775 + hw->src_addr = 0; 776 + hw->dst_addr = 0; 777 + async_tx_ack(&desc->txd); 778 + hw->next = 0; 779 + list_add_tail(&desc->node, &ioat->used_desc); 780 + dump_desc_dbg(ioat, desc); 781 + 782 + ioat_set_chainaddr(ioat, desc->txd.phys); 783 + ioat_start(chan); 784 + spin_unlock_bh(&ioat->desc_lock); 785 + } 786 + 787 + /* 788 + * Perform a IOAT transaction to verify the HW works. 789 + */ 790 + #define IOAT_TEST_SIZE 2000 791 + 792 + static void __devinit ioat_dma_test_callback(void *dma_async_param) 793 + { 794 + struct completion *cmp = dma_async_param; 795 + 796 + complete(cmp); 797 + } 798 + 799 + /** 800 + * ioat_dma_self_test - Perform a IOAT transaction to verify the HW works. 801 + * @device: device to be tested 802 + */ 803 + int __devinit ioat_dma_self_test(struct ioatdma_device *device) 804 + { 805 + int i; 806 + u8 *src; 807 + u8 *dest; 808 + struct dma_device *dma = &device->common; 809 + struct device *dev = &device->pdev->dev; 810 + struct dma_chan *dma_chan; 811 + struct dma_async_tx_descriptor *tx; 812 + dma_addr_t dma_dest, dma_src; 813 + dma_cookie_t cookie; 814 + int err = 0; 815 + struct completion cmp; 816 + unsigned long tmo; 817 + unsigned long flags; 818 + 819 + src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL); 820 + if (!src) 821 + return -ENOMEM; 822 + dest = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL); 823 + if (!dest) { 824 + kfree(src); 825 + return -ENOMEM; 826 + } 827 + 828 + /* Fill in src buffer */ 829 + for (i = 0; i < IOAT_TEST_SIZE; i++) 830 + src[i] = (u8)i; 831 + 832 + /* Start copy, using first DMA channel */ 833 + dma_chan = container_of(dma->channels.next, struct dma_chan, 834 + device_node); 835 + if (dma->device_alloc_chan_resources(dma_chan) < 1) { 836 + dev_err(dev, "selftest cannot allocate chan resource\n"); 837 + err = -ENODEV; 838 + goto out; 839 + } 840 + 841 + dma_src = dma_map_single(dev, src, IOAT_TEST_SIZE, DMA_TO_DEVICE); 842 + dma_dest = dma_map_single(dev, dest, IOAT_TEST_SIZE, DMA_FROM_DEVICE); 843 + flags = DMA_COMPL_SRC_UNMAP_SINGLE | DMA_COMPL_DEST_UNMAP_SINGLE | 844 + DMA_PREP_INTERRUPT; 845 + tx = device->common.device_prep_dma_memcpy(dma_chan, dma_dest, dma_src, 846 + IOAT_TEST_SIZE, flags); 847 + if (!tx) { 848 + dev_err(dev, "Self-test prep failed, disabling\n"); 849 + err = -ENODEV; 850 + goto free_resources; 851 + } 852 + 853 + async_tx_ack(tx); 854 + init_completion(&cmp); 855 + tx->callback = ioat_dma_test_callback; 856 + tx->callback_param = &cmp; 857 + cookie = tx->tx_submit(tx); 858 + if (cookie < 0) { 859 + dev_err(dev, "Self-test setup failed, disabling\n"); 860 + err = -ENODEV; 861 + goto free_resources; 862 + } 863 + dma->device_issue_pending(dma_chan); 864 + 865 + tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); 866 + 867 + if (tmo == 0 || 868 + dma->device_is_tx_complete(dma_chan, cookie, NULL, NULL) 869 + != DMA_SUCCESS) { 870 + dev_err(dev, "Self-test copy timed out, disabling\n"); 871 + err = -ENODEV; 872 + goto free_resources; 873 + } 874 + if (memcmp(src, dest, IOAT_TEST_SIZE)) { 875 + dev_err(dev, "Self-test copy failed compare, disabling\n"); 876 + err = -ENODEV; 877 + goto free_resources; 878 + } 879 + 880 + free_resources: 881 + dma->device_free_chan_resources(dma_chan); 882 + out: 883 + kfree(src); 884 + kfree(dest); 885 + return err; 886 + } 887 + 888 + static char ioat_interrupt_style[32] = "msix"; 889 + module_param_string(ioat_interrupt_style, ioat_interrupt_style, 890 + sizeof(ioat_interrupt_style), 0644); 891 + MODULE_PARM_DESC(ioat_interrupt_style, 892 + "set ioat interrupt style: msix (default), " 893 + "msix-single-vector, msi, intx)"); 894 + 895 + /** 896 + * ioat_dma_setup_interrupts - setup interrupt handler 897 + * @device: ioat device 898 + */ 899 + static int ioat_dma_setup_interrupts(struct ioatdma_device *device) 900 + { 901 + struct ioat_chan_common *chan; 902 + struct pci_dev *pdev = device->pdev; 903 + struct device *dev = &pdev->dev; 904 + struct msix_entry *msix; 905 + int i, j, msixcnt; 906 + int err = -EINVAL; 907 + u8 intrctrl = 0; 908 + 909 + if (!strcmp(ioat_interrupt_style, "msix")) 910 + goto msix; 911 + if (!strcmp(ioat_interrupt_style, "msix-single-vector")) 912 + goto msix_single_vector; 913 + if (!strcmp(ioat_interrupt_style, "msi")) 914 + goto msi; 915 + if (!strcmp(ioat_interrupt_style, "intx")) 916 + goto intx; 917 + dev_err(dev, "invalid ioat_interrupt_style %s\n", ioat_interrupt_style); 918 + goto err_no_irq; 919 + 920 + msix: 921 + /* The number of MSI-X vectors should equal the number of channels */ 922 + msixcnt = device->common.chancnt; 923 + for (i = 0; i < msixcnt; i++) 924 + device->msix_entries[i].entry = i; 925 + 926 + err = pci_enable_msix(pdev, device->msix_entries, msixcnt); 927 + if (err < 0) 928 + goto msi; 929 + if (err > 0) 930 + goto msix_single_vector; 931 + 932 + for (i = 0; i < msixcnt; i++) { 933 + msix = &device->msix_entries[i]; 934 + chan = ioat_chan_by_index(device, i); 935 + err = devm_request_irq(dev, msix->vector, 936 + ioat_dma_do_interrupt_msix, 0, 937 + "ioat-msix", chan); 938 + if (err) { 939 + for (j = 0; j < i; j++) { 940 + msix = &device->msix_entries[j]; 941 + chan = ioat_chan_by_index(device, j); 942 + devm_free_irq(dev, msix->vector, chan); 943 + } 944 + goto msix_single_vector; 945 + } 946 + } 947 + intrctrl |= IOAT_INTRCTRL_MSIX_VECTOR_CONTROL; 948 + goto done; 949 + 950 + msix_single_vector: 951 + msix = &device->msix_entries[0]; 952 + msix->entry = 0; 953 + err = pci_enable_msix(pdev, device->msix_entries, 1); 954 + if (err) 955 + goto msi; 956 + 957 + err = devm_request_irq(dev, msix->vector, ioat_dma_do_interrupt, 0, 958 + "ioat-msix", device); 959 + if (err) { 960 + pci_disable_msix(pdev); 961 + goto msi; 962 + } 963 + goto done; 964 + 965 + msi: 966 + err = pci_enable_msi(pdev); 967 + if (err) 968 + goto intx; 969 + 970 + err = devm_request_irq(dev, pdev->irq, ioat_dma_do_interrupt, 0, 971 + "ioat-msi", device); 972 + if (err) { 973 + pci_disable_msi(pdev); 974 + goto intx; 975 + } 976 + goto done; 977 + 978 + intx: 979 + err = devm_request_irq(dev, pdev->irq, ioat_dma_do_interrupt, 980 + IRQF_SHARED, "ioat-intx", device); 981 + if (err) 982 + goto err_no_irq; 983 + 984 + done: 985 + if (device->intr_quirk) 986 + device->intr_quirk(device); 987 + intrctrl |= IOAT_INTRCTRL_MASTER_INT_EN; 988 + writeb(intrctrl, device->reg_base + IOAT_INTRCTRL_OFFSET); 989 + return 0; 990 + 991 + err_no_irq: 992 + /* Disable all interrupt generation */ 993 + writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET); 994 + dev_err(dev, "no usable interrupts\n"); 995 + return err; 996 + } 997 + 998 + static void ioat_disable_interrupts(struct ioatdma_device *device) 999 + { 1000 + /* Disable all interrupt generation */ 1001 + writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET); 1002 + } 1003 + 1004 + int __devinit ioat_probe(struct ioatdma_device *device) 1005 + { 1006 + int err = -ENODEV; 1007 + struct dma_device *dma = &device->common; 1008 + struct pci_dev *pdev = device->pdev; 1009 + struct device *dev = &pdev->dev; 1010 + 1011 + /* DMA coherent memory pool for DMA descriptor allocations */ 1012 + device->dma_pool = pci_pool_create("dma_desc_pool", pdev, 1013 + sizeof(struct ioat_dma_descriptor), 1014 + 64, 0); 1015 + if (!device->dma_pool) { 1016 + err = -ENOMEM; 1017 + goto err_dma_pool; 1018 + } 1019 + 1020 + device->completion_pool = pci_pool_create("completion_pool", pdev, 1021 + sizeof(u64), SMP_CACHE_BYTES, 1022 + SMP_CACHE_BYTES); 1023 + 1024 + if (!device->completion_pool) { 1025 + err = -ENOMEM; 1026 + goto err_completion_pool; 1027 + } 1028 + 1029 + device->enumerate_channels(device); 1030 + 1031 + dma_cap_set(DMA_MEMCPY, dma->cap_mask); 1032 + dma->dev = &pdev->dev; 1033 + 1034 + if (!dma->chancnt) { 1035 + dev_err(dev, "zero channels detected\n"); 1036 + goto err_setup_interrupts; 1037 + } 1038 + 1039 + err = ioat_dma_setup_interrupts(device); 1040 + if (err) 1041 + goto err_setup_interrupts; 1042 + 1043 + err = device->self_test(device); 1044 + if (err) 1045 + goto err_self_test; 1046 + 1047 + return 0; 1048 + 1049 + err_self_test: 1050 + ioat_disable_interrupts(device); 1051 + err_setup_interrupts: 1052 + pci_pool_destroy(device->completion_pool); 1053 + err_completion_pool: 1054 + pci_pool_destroy(device->dma_pool); 1055 + err_dma_pool: 1056 + return err; 1057 + } 1058 + 1059 + int __devinit ioat_register(struct ioatdma_device *device) 1060 + { 1061 + int err = dma_async_device_register(&device->common); 1062 + 1063 + if (err) { 1064 + ioat_disable_interrupts(device); 1065 + pci_pool_destroy(device->completion_pool); 1066 + pci_pool_destroy(device->dma_pool); 1067 + } 1068 + 1069 + return err; 1070 + } 1071 + 1072 + /* ioat1_intr_quirk - fix up dma ctrl register to enable / disable msi */ 1073 + static void ioat1_intr_quirk(struct ioatdma_device *device) 1074 + { 1075 + struct pci_dev *pdev = device->pdev; 1076 + u32 dmactrl; 1077 + 1078 + pci_read_config_dword(pdev, IOAT_PCI_DMACTRL_OFFSET, &dmactrl); 1079 + if (pdev->msi_enabled) 1080 + dmactrl |= IOAT_PCI_DMACTRL_MSI_EN; 1081 + else 1082 + dmactrl &= ~IOAT_PCI_DMACTRL_MSI_EN; 1083 + pci_write_config_dword(pdev, IOAT_PCI_DMACTRL_OFFSET, dmactrl); 1084 + } 1085 + 1086 + static ssize_t ring_size_show(struct dma_chan *c, char *page) 1087 + { 1088 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 1089 + 1090 + return sprintf(page, "%d\n", ioat->desccount); 1091 + } 1092 + static struct ioat_sysfs_entry ring_size_attr = __ATTR_RO(ring_size); 1093 + 1094 + static ssize_t ring_active_show(struct dma_chan *c, char *page) 1095 + { 1096 + struct ioat_dma_chan *ioat = to_ioat_chan(c); 1097 + 1098 + return sprintf(page, "%d\n", ioat->active); 1099 + } 1100 + static struct ioat_sysfs_entry ring_active_attr = __ATTR_RO(ring_active); 1101 + 1102 + static ssize_t cap_show(struct dma_chan *c, char *page) 1103 + { 1104 + struct dma_device *dma = c->device; 1105 + 1106 + return sprintf(page, "copy%s%s%s%s%s%s\n", 1107 + dma_has_cap(DMA_PQ, dma->cap_mask) ? " pq" : "", 1108 + dma_has_cap(DMA_PQ_VAL, dma->cap_mask) ? " pq_val" : "", 1109 + dma_has_cap(DMA_XOR, dma->cap_mask) ? " xor" : "", 1110 + dma_has_cap(DMA_XOR_VAL, dma->cap_mask) ? " xor_val" : "", 1111 + dma_has_cap(DMA_MEMSET, dma->cap_mask) ? " fill" : "", 1112 + dma_has_cap(DMA_INTERRUPT, dma->cap_mask) ? " intr" : ""); 1113 + 1114 + } 1115 + struct ioat_sysfs_entry ioat_cap_attr = __ATTR_RO(cap); 1116 + 1117 + static ssize_t version_show(struct dma_chan *c, char *page) 1118 + { 1119 + struct dma_device *dma = c->device; 1120 + struct ioatdma_device *device = to_ioatdma_device(dma); 1121 + 1122 + return sprintf(page, "%d.%d\n", 1123 + device->version >> 4, device->version & 0xf); 1124 + } 1125 + struct ioat_sysfs_entry ioat_version_attr = __ATTR_RO(version); 1126 + 1127 + static struct attribute *ioat1_attrs[] = { 1128 + &ring_size_attr.attr, 1129 + &ring_active_attr.attr, 1130 + &ioat_cap_attr.attr, 1131 + &ioat_version_attr.attr, 1132 + NULL, 1133 + }; 1134 + 1135 + static ssize_t 1136 + ioat_attr_show(struct kobject *kobj, struct attribute *attr, char *page) 1137 + { 1138 + struct ioat_sysfs_entry *entry; 1139 + struct ioat_chan_common *chan; 1140 + 1141 + entry = container_of(attr, struct ioat_sysfs_entry, attr); 1142 + chan = container_of(kobj, struct ioat_chan_common, kobj); 1143 + 1144 + if (!entry->show) 1145 + return -EIO; 1146 + return entry->show(&chan->common, page); 1147 + } 1148 + 1149 + struct sysfs_ops ioat_sysfs_ops = { 1150 + .show = ioat_attr_show, 1151 + }; 1152 + 1153 + static struct kobj_type ioat1_ktype = { 1154 + .sysfs_ops = &ioat_sysfs_ops, 1155 + .default_attrs = ioat1_attrs, 1156 + }; 1157 + 1158 + void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type) 1159 + { 1160 + struct dma_device *dma = &device->common; 1161 + struct dma_chan *c; 1162 + 1163 + list_for_each_entry(c, &dma->channels, device_node) { 1164 + struct ioat_chan_common *chan = to_chan_common(c); 1165 + struct kobject *parent = &c->dev->device.kobj; 1166 + int err; 1167 + 1168 + err = kobject_init_and_add(&chan->kobj, type, parent, "quickdata"); 1169 + if (err) { 1170 + dev_warn(to_dev(chan), 1171 + "sysfs init error (%d), continuing...\n", err); 1172 + kobject_put(&chan->kobj); 1173 + set_bit(IOAT_KOBJ_INIT_FAIL, &chan->state); 1174 + } 1175 + } 1176 + } 1177 + 1178 + void ioat_kobject_del(struct ioatdma_device *device) 1179 + { 1180 + struct dma_device *dma = &device->common; 1181 + struct dma_chan *c; 1182 + 1183 + list_for_each_entry(c, &dma->channels, device_node) { 1184 + struct ioat_chan_common *chan = to_chan_common(c); 1185 + 1186 + if (!test_bit(IOAT_KOBJ_INIT_FAIL, &chan->state)) { 1187 + kobject_del(&chan->kobj); 1188 + kobject_put(&chan->kobj); 1189 + } 1190 + } 1191 + } 1192 + 1193 + int __devinit ioat1_dma_probe(struct ioatdma_device *device, int dca) 1194 + { 1195 + struct pci_dev *pdev = device->pdev; 1196 + struct dma_device *dma; 1197 + int err; 1198 + 1199 + device->intr_quirk = ioat1_intr_quirk; 1200 + device->enumerate_channels = ioat1_enumerate_channels; 1201 + device->self_test = ioat_dma_self_test; 1202 + dma = &device->common; 1203 + dma->device_prep_dma_memcpy = ioat1_dma_prep_memcpy; 1204 + dma->device_issue_pending = ioat1_dma_memcpy_issue_pending; 1205 + dma->device_alloc_chan_resources = ioat1_dma_alloc_chan_resources; 1206 + dma->device_free_chan_resources = ioat1_dma_free_chan_resources; 1207 + dma->device_is_tx_complete = ioat1_dma_is_complete; 1208 + 1209 + err = ioat_probe(device); 1210 + if (err) 1211 + return err; 1212 + ioat_set_tcp_copy_break(4096); 1213 + err = ioat_register(device); 1214 + if (err) 1215 + return err; 1216 + ioat_kobject_add(device, &ioat1_ktype); 1217 + 1218 + if (dca) 1219 + device->dca = ioat_dca_init(pdev, device->reg_base); 1220 + 1221 + return err; 1222 + } 1223 + 1224 + void __devexit ioat_dma_remove(struct ioatdma_device *device) 1225 + { 1226 + struct dma_device *dma = &device->common; 1227 + 1228 + ioat_disable_interrupts(device); 1229 + 1230 + ioat_kobject_del(device); 1231 + 1232 + dma_async_device_unregister(dma); 1233 + 1234 + pci_pool_destroy(device->dma_pool); 1235 + pci_pool_destroy(device->completion_pool); 1236 + 1237 + INIT_LIST_HEAD(&dma->channels); 1238 + }
+337
drivers/dma/ioat/dma.h
··· 1 + /* 2 + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms of the GNU General Public License as published by the Free 6 + * Software Foundation; either version 2 of the License, or (at your option) 7 + * any later version. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program; if not, write to the Free Software Foundation, Inc., 59 16 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 + * 18 + * The full GNU General Public License is included in this distribution in the 19 + * file called COPYING. 20 + */ 21 + #ifndef IOATDMA_H 22 + #define IOATDMA_H 23 + 24 + #include <linux/dmaengine.h> 25 + #include "hw.h" 26 + #include "registers.h" 27 + #include <linux/init.h> 28 + #include <linux/dmapool.h> 29 + #include <linux/cache.h> 30 + #include <linux/pci_ids.h> 31 + #include <net/tcp.h> 32 + 33 + #define IOAT_DMA_VERSION "4.00" 34 + 35 + #define IOAT_LOW_COMPLETION_MASK 0xffffffc0 36 + #define IOAT_DMA_DCA_ANY_CPU ~0 37 + 38 + #define to_ioatdma_device(dev) container_of(dev, struct ioatdma_device, common) 39 + #define to_ioat_desc(lh) container_of(lh, struct ioat_desc_sw, node) 40 + #define tx_to_ioat_desc(tx) container_of(tx, struct ioat_desc_sw, txd) 41 + #define to_dev(ioat_chan) (&(ioat_chan)->device->pdev->dev) 42 + 43 + #define chan_num(ch) ((int)((ch)->reg_base - (ch)->device->reg_base) / 0x80) 44 + 45 + /* 46 + * workaround for IOAT ver.3.0 null descriptor issue 47 + * (channel returns error when size is 0) 48 + */ 49 + #define NULL_DESC_BUFFER_SIZE 1 50 + 51 + /** 52 + * struct ioatdma_device - internal representation of a IOAT device 53 + * @pdev: PCI-Express device 54 + * @reg_base: MMIO register space base address 55 + * @dma_pool: for allocating DMA descriptors 56 + * @common: embedded struct dma_device 57 + * @version: version of ioatdma device 58 + * @msix_entries: irq handlers 59 + * @idx: per channel data 60 + * @dca: direct cache access context 61 + * @intr_quirk: interrupt setup quirk (for ioat_v1 devices) 62 + * @enumerate_channels: hw version specific channel enumeration 63 + * @cleanup_tasklet: select between the v2 and v3 cleanup routines 64 + * @timer_fn: select between the v2 and v3 timer watchdog routines 65 + * @self_test: hardware version specific self test for each supported op type 66 + * 67 + * Note: the v3 cleanup routine supports raid operations 68 + */ 69 + struct ioatdma_device { 70 + struct pci_dev *pdev; 71 + void __iomem *reg_base; 72 + struct pci_pool *dma_pool; 73 + struct pci_pool *completion_pool; 74 + struct dma_device common; 75 + u8 version; 76 + struct msix_entry msix_entries[4]; 77 + struct ioat_chan_common *idx[4]; 78 + struct dca_provider *dca; 79 + void (*intr_quirk)(struct ioatdma_device *device); 80 + int (*enumerate_channels)(struct ioatdma_device *device); 81 + void (*cleanup_tasklet)(unsigned long data); 82 + void (*timer_fn)(unsigned long data); 83 + int (*self_test)(struct ioatdma_device *device); 84 + }; 85 + 86 + struct ioat_chan_common { 87 + struct dma_chan common; 88 + void __iomem *reg_base; 89 + unsigned long last_completion; 90 + spinlock_t cleanup_lock; 91 + dma_cookie_t completed_cookie; 92 + unsigned long state; 93 + #define IOAT_COMPLETION_PENDING 0 94 + #define IOAT_COMPLETION_ACK 1 95 + #define IOAT_RESET_PENDING 2 96 + #define IOAT_KOBJ_INIT_FAIL 3 97 + struct timer_list timer; 98 + #define COMPLETION_TIMEOUT msecs_to_jiffies(100) 99 + #define IDLE_TIMEOUT msecs_to_jiffies(2000) 100 + #define RESET_DELAY msecs_to_jiffies(100) 101 + struct ioatdma_device *device; 102 + dma_addr_t completion_dma; 103 + u64 *completion; 104 + struct tasklet_struct cleanup_task; 105 + struct kobject kobj; 106 + }; 107 + 108 + struct ioat_sysfs_entry { 109 + struct attribute attr; 110 + ssize_t (*show)(struct dma_chan *, char *); 111 + }; 112 + 113 + /** 114 + * struct ioat_dma_chan - internal representation of a DMA channel 115 + */ 116 + struct ioat_dma_chan { 117 + struct ioat_chan_common base; 118 + 119 + size_t xfercap; /* XFERCAP register value expanded out */ 120 + 121 + spinlock_t desc_lock; 122 + struct list_head free_desc; 123 + struct list_head used_desc; 124 + 125 + int pending; 126 + u16 desccount; 127 + u16 active; 128 + }; 129 + 130 + static inline struct ioat_chan_common *to_chan_common(struct dma_chan *c) 131 + { 132 + return container_of(c, struct ioat_chan_common, common); 133 + } 134 + 135 + static inline struct ioat_dma_chan *to_ioat_chan(struct dma_chan *c) 136 + { 137 + struct ioat_chan_common *chan = to_chan_common(c); 138 + 139 + return container_of(chan, struct ioat_dma_chan, base); 140 + } 141 + 142 + /** 143 + * ioat_is_complete - poll the status of an ioat transaction 144 + * @c: channel handle 145 + * @cookie: transaction identifier 146 + * @done: if set, updated with last completed transaction 147 + * @used: if set, updated with last used transaction 148 + */ 149 + static inline enum dma_status 150 + ioat_is_complete(struct dma_chan *c, dma_cookie_t cookie, 151 + dma_cookie_t *done, dma_cookie_t *used) 152 + { 153 + struct ioat_chan_common *chan = to_chan_common(c); 154 + dma_cookie_t last_used; 155 + dma_cookie_t last_complete; 156 + 157 + last_used = c->cookie; 158 + last_complete = chan->completed_cookie; 159 + 160 + if (done) 161 + *done = last_complete; 162 + if (used) 163 + *used = last_used; 164 + 165 + return dma_async_is_complete(cookie, last_complete, last_used); 166 + } 167 + 168 + /* wrapper around hardware descriptor format + additional software fields */ 169 + 170 + /** 171 + * struct ioat_desc_sw - wrapper around hardware descriptor 172 + * @hw: hardware DMA descriptor (for memcpy) 173 + * @node: this descriptor will either be on the free list, 174 + * or attached to a transaction list (tx_list) 175 + * @txd: the generic software descriptor for all engines 176 + * @id: identifier for debug 177 + */ 178 + struct ioat_desc_sw { 179 + struct ioat_dma_descriptor *hw; 180 + struct list_head node; 181 + size_t len; 182 + struct list_head tx_list; 183 + struct dma_async_tx_descriptor txd; 184 + #ifdef DEBUG 185 + int id; 186 + #endif 187 + }; 188 + 189 + #ifdef DEBUG 190 + #define set_desc_id(desc, i) ((desc)->id = (i)) 191 + #define desc_id(desc) ((desc)->id) 192 + #else 193 + #define set_desc_id(desc, i) 194 + #define desc_id(desc) (0) 195 + #endif 196 + 197 + static inline void 198 + __dump_desc_dbg(struct ioat_chan_common *chan, struct ioat_dma_descriptor *hw, 199 + struct dma_async_tx_descriptor *tx, int id) 200 + { 201 + struct device *dev = to_dev(chan); 202 + 203 + dev_dbg(dev, "desc[%d]: (%#llx->%#llx) cookie: %d flags: %#x" 204 + " ctl: %#x (op: %d int_en: %d compl: %d)\n", id, 205 + (unsigned long long) tx->phys, 206 + (unsigned long long) hw->next, tx->cookie, tx->flags, 207 + hw->ctl, hw->ctl_f.op, hw->ctl_f.int_en, hw->ctl_f.compl_write); 208 + } 209 + 210 + #define dump_desc_dbg(c, d) \ 211 + ({ if (d) __dump_desc_dbg(&c->base, d->hw, &d->txd, desc_id(d)); 0; }) 212 + 213 + static inline void ioat_set_tcp_copy_break(unsigned long copybreak) 214 + { 215 + #ifdef CONFIG_NET_DMA 216 + sysctl_tcp_dma_copybreak = copybreak; 217 + #endif 218 + } 219 + 220 + static inline struct ioat_chan_common * 221 + ioat_chan_by_index(struct ioatdma_device *device, int index) 222 + { 223 + return device->idx[index]; 224 + } 225 + 226 + static inline u64 ioat_chansts(struct ioat_chan_common *chan) 227 + { 228 + u8 ver = chan->device->version; 229 + u64 status; 230 + u32 status_lo; 231 + 232 + /* We need to read the low address first as this causes the 233 + * chipset to latch the upper bits for the subsequent read 234 + */ 235 + status_lo = readl(chan->reg_base + IOAT_CHANSTS_OFFSET_LOW(ver)); 236 + status = readl(chan->reg_base + IOAT_CHANSTS_OFFSET_HIGH(ver)); 237 + status <<= 32; 238 + status |= status_lo; 239 + 240 + return status; 241 + } 242 + 243 + static inline void ioat_start(struct ioat_chan_common *chan) 244 + { 245 + u8 ver = chan->device->version; 246 + 247 + writeb(IOAT_CHANCMD_START, chan->reg_base + IOAT_CHANCMD_OFFSET(ver)); 248 + } 249 + 250 + static inline u64 ioat_chansts_to_addr(u64 status) 251 + { 252 + return status & IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR; 253 + } 254 + 255 + static inline u32 ioat_chanerr(struct ioat_chan_common *chan) 256 + { 257 + return readl(chan->reg_base + IOAT_CHANERR_OFFSET); 258 + } 259 + 260 + static inline void ioat_suspend(struct ioat_chan_common *chan) 261 + { 262 + u8 ver = chan->device->version; 263 + 264 + writeb(IOAT_CHANCMD_SUSPEND, chan->reg_base + IOAT_CHANCMD_OFFSET(ver)); 265 + } 266 + 267 + static inline void ioat_set_chainaddr(struct ioat_dma_chan *ioat, u64 addr) 268 + { 269 + struct ioat_chan_common *chan = &ioat->base; 270 + 271 + writel(addr & 0x00000000FFFFFFFF, 272 + chan->reg_base + IOAT1_CHAINADDR_OFFSET_LOW); 273 + writel(addr >> 32, 274 + chan->reg_base + IOAT1_CHAINADDR_OFFSET_HIGH); 275 + } 276 + 277 + static inline bool is_ioat_active(unsigned long status) 278 + { 279 + return ((status & IOAT_CHANSTS_STATUS) == IOAT_CHANSTS_ACTIVE); 280 + } 281 + 282 + static inline bool is_ioat_idle(unsigned long status) 283 + { 284 + return ((status & IOAT_CHANSTS_STATUS) == IOAT_CHANSTS_DONE); 285 + } 286 + 287 + static inline bool is_ioat_halted(unsigned long status) 288 + { 289 + return ((status & IOAT_CHANSTS_STATUS) == IOAT_CHANSTS_HALTED); 290 + } 291 + 292 + static inline bool is_ioat_suspended(unsigned long status) 293 + { 294 + return ((status & IOAT_CHANSTS_STATUS) == IOAT_CHANSTS_SUSPENDED); 295 + } 296 + 297 + /* channel was fatally programmed */ 298 + static inline bool is_ioat_bug(unsigned long err) 299 + { 300 + return !!(err & (IOAT_CHANERR_SRC_ADDR_ERR|IOAT_CHANERR_DEST_ADDR_ERR| 301 + IOAT_CHANERR_NEXT_ADDR_ERR|IOAT_CHANERR_CONTROL_ERR| 302 + IOAT_CHANERR_LENGTH_ERR)); 303 + } 304 + 305 + static inline void ioat_unmap(struct pci_dev *pdev, dma_addr_t addr, size_t len, 306 + int direction, enum dma_ctrl_flags flags, bool dst) 307 + { 308 + if ((dst && (flags & DMA_COMPL_DEST_UNMAP_SINGLE)) || 309 + (!dst && (flags & DMA_COMPL_SRC_UNMAP_SINGLE))) 310 + pci_unmap_single(pdev, addr, len, direction); 311 + else 312 + pci_unmap_page(pdev, addr, len, direction); 313 + } 314 + 315 + int __devinit ioat_probe(struct ioatdma_device *device); 316 + int __devinit ioat_register(struct ioatdma_device *device); 317 + int __devinit ioat1_dma_probe(struct ioatdma_device *dev, int dca); 318 + int __devinit ioat_dma_self_test(struct ioatdma_device *device); 319 + void __devexit ioat_dma_remove(struct ioatdma_device *device); 320 + struct dca_provider * __devinit ioat_dca_init(struct pci_dev *pdev, 321 + void __iomem *iobase); 322 + unsigned long ioat_get_current_completion(struct ioat_chan_common *chan); 323 + void ioat_init_channel(struct ioatdma_device *device, 324 + struct ioat_chan_common *chan, int idx, 325 + void (*timer_fn)(unsigned long), 326 + void (*tasklet)(unsigned long), 327 + unsigned long ioat); 328 + void ioat_dma_unmap(struct ioat_chan_common *chan, enum dma_ctrl_flags flags, 329 + size_t len, struct ioat_dma_descriptor *hw); 330 + bool ioat_cleanup_preamble(struct ioat_chan_common *chan, 331 + unsigned long *phys_complete); 332 + void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type); 333 + void ioat_kobject_del(struct ioatdma_device *device); 334 + extern struct sysfs_ops ioat_sysfs_ops; 335 + extern struct ioat_sysfs_entry ioat_version_attr; 336 + extern struct ioat_sysfs_entry ioat_cap_attr; 337 + #endif /* IOATDMA_H */
+871
drivers/dma/ioat/dma_v2.c
··· 1 + /* 2 + * Intel I/OAT DMA Linux driver 3 + * Copyright(c) 2004 - 2009 Intel Corporation. 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program; if not, write to the Free Software Foundation, Inc., 16 + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 17 + * 18 + * The full GNU General Public License is included in this distribution in 19 + * the file called "COPYING". 20 + * 21 + */ 22 + 23 + /* 24 + * This driver supports an Intel I/OAT DMA engine (versions >= 2), which 25 + * does asynchronous data movement and checksumming operations. 26 + */ 27 + 28 + #include <linux/init.h> 29 + #include <linux/module.h> 30 + #include <linux/pci.h> 31 + #include <linux/interrupt.h> 32 + #include <linux/dmaengine.h> 33 + #include <linux/delay.h> 34 + #include <linux/dma-mapping.h> 35 + #include <linux/workqueue.h> 36 + #include <linux/i7300_idle.h> 37 + #include "dma.h" 38 + #include "dma_v2.h" 39 + #include "registers.h" 40 + #include "hw.h" 41 + 42 + int ioat_ring_alloc_order = 8; 43 + module_param(ioat_ring_alloc_order, int, 0644); 44 + MODULE_PARM_DESC(ioat_ring_alloc_order, 45 + "ioat2+: allocate 2^n descriptors per channel" 46 + " (default: 8 max: 16)"); 47 + static int ioat_ring_max_alloc_order = IOAT_MAX_ORDER; 48 + module_param(ioat_ring_max_alloc_order, int, 0644); 49 + MODULE_PARM_DESC(ioat_ring_max_alloc_order, 50 + "ioat2+: upper limit for ring size (default: 16)"); 51 + 52 + void __ioat2_issue_pending(struct ioat2_dma_chan *ioat) 53 + { 54 + void * __iomem reg_base = ioat->base.reg_base; 55 + 56 + ioat->pending = 0; 57 + ioat->dmacount += ioat2_ring_pending(ioat); 58 + ioat->issued = ioat->head; 59 + /* make descriptor updates globally visible before notifying channel */ 60 + wmb(); 61 + writew(ioat->dmacount, reg_base + IOAT_CHAN_DMACOUNT_OFFSET); 62 + dev_dbg(to_dev(&ioat->base), 63 + "%s: head: %#x tail: %#x issued: %#x count: %#x\n", 64 + __func__, ioat->head, ioat->tail, ioat->issued, ioat->dmacount); 65 + } 66 + 67 + void ioat2_issue_pending(struct dma_chan *chan) 68 + { 69 + struct ioat2_dma_chan *ioat = to_ioat2_chan(chan); 70 + 71 + spin_lock_bh(&ioat->ring_lock); 72 + if (ioat->pending == 1) 73 + __ioat2_issue_pending(ioat); 74 + spin_unlock_bh(&ioat->ring_lock); 75 + } 76 + 77 + /** 78 + * ioat2_update_pending - log pending descriptors 79 + * @ioat: ioat2+ channel 80 + * 81 + * set pending to '1' unless pending is already set to '2', pending == 2 82 + * indicates that submission is temporarily blocked due to an in-flight 83 + * reset. If we are already above the ioat_pending_level threshold then 84 + * just issue pending. 85 + * 86 + * called with ring_lock held 87 + */ 88 + static void ioat2_update_pending(struct ioat2_dma_chan *ioat) 89 + { 90 + if (unlikely(ioat->pending == 2)) 91 + return; 92 + else if (ioat2_ring_pending(ioat) > ioat_pending_level) 93 + __ioat2_issue_pending(ioat); 94 + else 95 + ioat->pending = 1; 96 + } 97 + 98 + static void __ioat2_start_null_desc(struct ioat2_dma_chan *ioat) 99 + { 100 + struct ioat_ring_ent *desc; 101 + struct ioat_dma_descriptor *hw; 102 + int idx; 103 + 104 + if (ioat2_ring_space(ioat) < 1) { 105 + dev_err(to_dev(&ioat->base), 106 + "Unable to start null desc - ring full\n"); 107 + return; 108 + } 109 + 110 + dev_dbg(to_dev(&ioat->base), "%s: head: %#x tail: %#x issued: %#x\n", 111 + __func__, ioat->head, ioat->tail, ioat->issued); 112 + idx = ioat2_desc_alloc(ioat, 1); 113 + desc = ioat2_get_ring_ent(ioat, idx); 114 + 115 + hw = desc->hw; 116 + hw->ctl = 0; 117 + hw->ctl_f.null = 1; 118 + hw->ctl_f.int_en = 1; 119 + hw->ctl_f.compl_write = 1; 120 + /* set size to non-zero value (channel returns error when size is 0) */ 121 + hw->size = NULL_DESC_BUFFER_SIZE; 122 + hw->src_addr = 0; 123 + hw->dst_addr = 0; 124 + async_tx_ack(&desc->txd); 125 + ioat2_set_chainaddr(ioat, desc->txd.phys); 126 + dump_desc_dbg(ioat, desc); 127 + __ioat2_issue_pending(ioat); 128 + } 129 + 130 + static void ioat2_start_null_desc(struct ioat2_dma_chan *ioat) 131 + { 132 + spin_lock_bh(&ioat->ring_lock); 133 + __ioat2_start_null_desc(ioat); 134 + spin_unlock_bh(&ioat->ring_lock); 135 + } 136 + 137 + static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete) 138 + { 139 + struct ioat_chan_common *chan = &ioat->base; 140 + struct dma_async_tx_descriptor *tx; 141 + struct ioat_ring_ent *desc; 142 + bool seen_current = false; 143 + u16 active; 144 + int i; 145 + 146 + dev_dbg(to_dev(chan), "%s: head: %#x tail: %#x issued: %#x\n", 147 + __func__, ioat->head, ioat->tail, ioat->issued); 148 + 149 + active = ioat2_ring_active(ioat); 150 + for (i = 0; i < active && !seen_current; i++) { 151 + prefetch(ioat2_get_ring_ent(ioat, ioat->tail + i + 1)); 152 + desc = ioat2_get_ring_ent(ioat, ioat->tail + i); 153 + tx = &desc->txd; 154 + dump_desc_dbg(ioat, desc); 155 + if (tx->cookie) { 156 + ioat_dma_unmap(chan, tx->flags, desc->len, desc->hw); 157 + chan->completed_cookie = tx->cookie; 158 + tx->cookie = 0; 159 + if (tx->callback) { 160 + tx->callback(tx->callback_param); 161 + tx->callback = NULL; 162 + } 163 + } 164 + 165 + if (tx->phys == phys_complete) 166 + seen_current = true; 167 + } 168 + ioat->tail += i; 169 + BUG_ON(!seen_current); /* no active descs have written a completion? */ 170 + 171 + chan->last_completion = phys_complete; 172 + if (ioat->head == ioat->tail) { 173 + dev_dbg(to_dev(chan), "%s: cancel completion timeout\n", 174 + __func__); 175 + clear_bit(IOAT_COMPLETION_PENDING, &chan->state); 176 + mod_timer(&chan->timer, jiffies + IDLE_TIMEOUT); 177 + } 178 + } 179 + 180 + /** 181 + * ioat2_cleanup - clean finished descriptors (advance tail pointer) 182 + * @chan: ioat channel to be cleaned up 183 + */ 184 + static void ioat2_cleanup(struct ioat2_dma_chan *ioat) 185 + { 186 + struct ioat_chan_common *chan = &ioat->base; 187 + unsigned long phys_complete; 188 + 189 + prefetch(chan->completion); 190 + 191 + if (!spin_trylock_bh(&chan->cleanup_lock)) 192 + return; 193 + 194 + if (!ioat_cleanup_preamble(chan, &phys_complete)) { 195 + spin_unlock_bh(&chan->cleanup_lock); 196 + return; 197 + } 198 + 199 + if (!spin_trylock_bh(&ioat->ring_lock)) { 200 + spin_unlock_bh(&chan->cleanup_lock); 201 + return; 202 + } 203 + 204 + __cleanup(ioat, phys_complete); 205 + 206 + spin_unlock_bh(&ioat->ring_lock); 207 + spin_unlock_bh(&chan->cleanup_lock); 208 + } 209 + 210 + void ioat2_cleanup_tasklet(unsigned long data) 211 + { 212 + struct ioat2_dma_chan *ioat = (void *) data; 213 + 214 + ioat2_cleanup(ioat); 215 + writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); 216 + } 217 + 218 + void __ioat2_restart_chan(struct ioat2_dma_chan *ioat) 219 + { 220 + struct ioat_chan_common *chan = &ioat->base; 221 + 222 + /* set the tail to be re-issued */ 223 + ioat->issued = ioat->tail; 224 + ioat->dmacount = 0; 225 + set_bit(IOAT_COMPLETION_PENDING, &chan->state); 226 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 227 + 228 + dev_dbg(to_dev(chan), 229 + "%s: head: %#x tail: %#x issued: %#x count: %#x\n", 230 + __func__, ioat->head, ioat->tail, ioat->issued, ioat->dmacount); 231 + 232 + if (ioat2_ring_pending(ioat)) { 233 + struct ioat_ring_ent *desc; 234 + 235 + desc = ioat2_get_ring_ent(ioat, ioat->tail); 236 + ioat2_set_chainaddr(ioat, desc->txd.phys); 237 + __ioat2_issue_pending(ioat); 238 + } else 239 + __ioat2_start_null_desc(ioat); 240 + } 241 + 242 + static void ioat2_restart_channel(struct ioat2_dma_chan *ioat) 243 + { 244 + struct ioat_chan_common *chan = &ioat->base; 245 + unsigned long phys_complete; 246 + u32 status; 247 + 248 + status = ioat_chansts(chan); 249 + if (is_ioat_active(status) || is_ioat_idle(status)) 250 + ioat_suspend(chan); 251 + while (is_ioat_active(status) || is_ioat_idle(status)) { 252 + status = ioat_chansts(chan); 253 + cpu_relax(); 254 + } 255 + 256 + if (ioat_cleanup_preamble(chan, &phys_complete)) 257 + __cleanup(ioat, phys_complete); 258 + 259 + __ioat2_restart_chan(ioat); 260 + } 261 + 262 + void ioat2_timer_event(unsigned long data) 263 + { 264 + struct ioat2_dma_chan *ioat = (void *) data; 265 + struct ioat_chan_common *chan = &ioat->base; 266 + 267 + spin_lock_bh(&chan->cleanup_lock); 268 + if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) { 269 + unsigned long phys_complete; 270 + u64 status; 271 + 272 + spin_lock_bh(&ioat->ring_lock); 273 + status = ioat_chansts(chan); 274 + 275 + /* when halted due to errors check for channel 276 + * programming errors before advancing the completion state 277 + */ 278 + if (is_ioat_halted(status)) { 279 + u32 chanerr; 280 + 281 + chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); 282 + BUG_ON(is_ioat_bug(chanerr)); 283 + } 284 + 285 + /* if we haven't made progress and we have already 286 + * acknowledged a pending completion once, then be more 287 + * forceful with a restart 288 + */ 289 + if (ioat_cleanup_preamble(chan, &phys_complete)) 290 + __cleanup(ioat, phys_complete); 291 + else if (test_bit(IOAT_COMPLETION_ACK, &chan->state)) 292 + ioat2_restart_channel(ioat); 293 + else { 294 + set_bit(IOAT_COMPLETION_ACK, &chan->state); 295 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 296 + } 297 + spin_unlock_bh(&ioat->ring_lock); 298 + } else { 299 + u16 active; 300 + 301 + /* if the ring is idle, empty, and oversized try to step 302 + * down the size 303 + */ 304 + spin_lock_bh(&ioat->ring_lock); 305 + active = ioat2_ring_active(ioat); 306 + if (active == 0 && ioat->alloc_order > ioat_get_alloc_order()) 307 + reshape_ring(ioat, ioat->alloc_order-1); 308 + spin_unlock_bh(&ioat->ring_lock); 309 + 310 + /* keep shrinking until we get back to our minimum 311 + * default size 312 + */ 313 + if (ioat->alloc_order > ioat_get_alloc_order()) 314 + mod_timer(&chan->timer, jiffies + IDLE_TIMEOUT); 315 + } 316 + spin_unlock_bh(&chan->cleanup_lock); 317 + } 318 + 319 + /** 320 + * ioat2_enumerate_channels - find and initialize the device's channels 321 + * @device: the device to be enumerated 322 + */ 323 + int ioat2_enumerate_channels(struct ioatdma_device *device) 324 + { 325 + struct ioat2_dma_chan *ioat; 326 + struct device *dev = &device->pdev->dev; 327 + struct dma_device *dma = &device->common; 328 + u8 xfercap_log; 329 + int i; 330 + 331 + INIT_LIST_HEAD(&dma->channels); 332 + dma->chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET); 333 + dma->chancnt &= 0x1f; /* bits [4:0] valid */ 334 + if (dma->chancnt > ARRAY_SIZE(device->idx)) { 335 + dev_warn(dev, "(%d) exceeds max supported channels (%zu)\n", 336 + dma->chancnt, ARRAY_SIZE(device->idx)); 337 + dma->chancnt = ARRAY_SIZE(device->idx); 338 + } 339 + xfercap_log = readb(device->reg_base + IOAT_XFERCAP_OFFSET); 340 + xfercap_log &= 0x1f; /* bits [4:0] valid */ 341 + if (xfercap_log == 0) 342 + return 0; 343 + dev_dbg(dev, "%s: xfercap = %d\n", __func__, 1 << xfercap_log); 344 + 345 + /* FIXME which i/oat version is i7300? */ 346 + #ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL 347 + if (i7300_idle_platform_probe(NULL, NULL, 1) == 0) 348 + dma->chancnt--; 349 + #endif 350 + for (i = 0; i < dma->chancnt; i++) { 351 + ioat = devm_kzalloc(dev, sizeof(*ioat), GFP_KERNEL); 352 + if (!ioat) 353 + break; 354 + 355 + ioat_init_channel(device, &ioat->base, i, 356 + device->timer_fn, 357 + device->cleanup_tasklet, 358 + (unsigned long) ioat); 359 + ioat->xfercap_log = xfercap_log; 360 + spin_lock_init(&ioat->ring_lock); 361 + } 362 + dma->chancnt = i; 363 + return i; 364 + } 365 + 366 + static dma_cookie_t ioat2_tx_submit_unlock(struct dma_async_tx_descriptor *tx) 367 + { 368 + struct dma_chan *c = tx->chan; 369 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 370 + struct ioat_chan_common *chan = &ioat->base; 371 + dma_cookie_t cookie = c->cookie; 372 + 373 + cookie++; 374 + if (cookie < 0) 375 + cookie = 1; 376 + tx->cookie = cookie; 377 + c->cookie = cookie; 378 + dev_dbg(to_dev(&ioat->base), "%s: cookie: %d\n", __func__, cookie); 379 + 380 + if (!test_and_set_bit(IOAT_COMPLETION_PENDING, &chan->state)) 381 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 382 + ioat2_update_pending(ioat); 383 + spin_unlock_bh(&ioat->ring_lock); 384 + 385 + return cookie; 386 + } 387 + 388 + static struct ioat_ring_ent *ioat2_alloc_ring_ent(struct dma_chan *chan, gfp_t flags) 389 + { 390 + struct ioat_dma_descriptor *hw; 391 + struct ioat_ring_ent *desc; 392 + struct ioatdma_device *dma; 393 + dma_addr_t phys; 394 + 395 + dma = to_ioatdma_device(chan->device); 396 + hw = pci_pool_alloc(dma->dma_pool, flags, &phys); 397 + if (!hw) 398 + return NULL; 399 + memset(hw, 0, sizeof(*hw)); 400 + 401 + desc = kmem_cache_alloc(ioat2_cache, flags); 402 + if (!desc) { 403 + pci_pool_free(dma->dma_pool, hw, phys); 404 + return NULL; 405 + } 406 + memset(desc, 0, sizeof(*desc)); 407 + 408 + dma_async_tx_descriptor_init(&desc->txd, chan); 409 + desc->txd.tx_submit = ioat2_tx_submit_unlock; 410 + desc->hw = hw; 411 + desc->txd.phys = phys; 412 + return desc; 413 + } 414 + 415 + static void ioat2_free_ring_ent(struct ioat_ring_ent *desc, struct dma_chan *chan) 416 + { 417 + struct ioatdma_device *dma; 418 + 419 + dma = to_ioatdma_device(chan->device); 420 + pci_pool_free(dma->dma_pool, desc->hw, desc->txd.phys); 421 + kmem_cache_free(ioat2_cache, desc); 422 + } 423 + 424 + static struct ioat_ring_ent **ioat2_alloc_ring(struct dma_chan *c, int order, gfp_t flags) 425 + { 426 + struct ioat_ring_ent **ring; 427 + int descs = 1 << order; 428 + int i; 429 + 430 + if (order > ioat_get_max_alloc_order()) 431 + return NULL; 432 + 433 + /* allocate the array to hold the software ring */ 434 + ring = kcalloc(descs, sizeof(*ring), flags); 435 + if (!ring) 436 + return NULL; 437 + for (i = 0; i < descs; i++) { 438 + ring[i] = ioat2_alloc_ring_ent(c, flags); 439 + if (!ring[i]) { 440 + while (i--) 441 + ioat2_free_ring_ent(ring[i], c); 442 + kfree(ring); 443 + return NULL; 444 + } 445 + set_desc_id(ring[i], i); 446 + } 447 + 448 + /* link descs */ 449 + for (i = 0; i < descs-1; i++) { 450 + struct ioat_ring_ent *next = ring[i+1]; 451 + struct ioat_dma_descriptor *hw = ring[i]->hw; 452 + 453 + hw->next = next->txd.phys; 454 + } 455 + ring[i]->hw->next = ring[0]->txd.phys; 456 + 457 + return ring; 458 + } 459 + 460 + /* ioat2_alloc_chan_resources - allocate/initialize ioat2 descriptor ring 461 + * @chan: channel to be initialized 462 + */ 463 + int ioat2_alloc_chan_resources(struct dma_chan *c) 464 + { 465 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 466 + struct ioat_chan_common *chan = &ioat->base; 467 + struct ioat_ring_ent **ring; 468 + u32 chanerr; 469 + int order; 470 + 471 + /* have we already been set up? */ 472 + if (ioat->ring) 473 + return 1 << ioat->alloc_order; 474 + 475 + /* Setup register to interrupt and write completion status on error */ 476 + writew(IOAT_CHANCTRL_RUN, chan->reg_base + IOAT_CHANCTRL_OFFSET); 477 + 478 + chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); 479 + if (chanerr) { 480 + dev_err(to_dev(chan), "CHANERR = %x, clearing\n", chanerr); 481 + writel(chanerr, chan->reg_base + IOAT_CHANERR_OFFSET); 482 + } 483 + 484 + /* allocate a completion writeback area */ 485 + /* doing 2 32bit writes to mmio since 1 64b write doesn't work */ 486 + chan->completion = pci_pool_alloc(chan->device->completion_pool, 487 + GFP_KERNEL, &chan->completion_dma); 488 + if (!chan->completion) 489 + return -ENOMEM; 490 + 491 + memset(chan->completion, 0, sizeof(*chan->completion)); 492 + writel(((u64) chan->completion_dma) & 0x00000000FFFFFFFF, 493 + chan->reg_base + IOAT_CHANCMP_OFFSET_LOW); 494 + writel(((u64) chan->completion_dma) >> 32, 495 + chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH); 496 + 497 + order = ioat_get_alloc_order(); 498 + ring = ioat2_alloc_ring(c, order, GFP_KERNEL); 499 + if (!ring) 500 + return -ENOMEM; 501 + 502 + spin_lock_bh(&ioat->ring_lock); 503 + ioat->ring = ring; 504 + ioat->head = 0; 505 + ioat->issued = 0; 506 + ioat->tail = 0; 507 + ioat->pending = 0; 508 + ioat->alloc_order = order; 509 + spin_unlock_bh(&ioat->ring_lock); 510 + 511 + tasklet_enable(&chan->cleanup_task); 512 + ioat2_start_null_desc(ioat); 513 + 514 + return 1 << ioat->alloc_order; 515 + } 516 + 517 + bool reshape_ring(struct ioat2_dma_chan *ioat, int order) 518 + { 519 + /* reshape differs from normal ring allocation in that we want 520 + * to allocate a new software ring while only 521 + * extending/truncating the hardware ring 522 + */ 523 + struct ioat_chan_common *chan = &ioat->base; 524 + struct dma_chan *c = &chan->common; 525 + const u16 curr_size = ioat2_ring_mask(ioat) + 1; 526 + const u16 active = ioat2_ring_active(ioat); 527 + const u16 new_size = 1 << order; 528 + struct ioat_ring_ent **ring; 529 + u16 i; 530 + 531 + if (order > ioat_get_max_alloc_order()) 532 + return false; 533 + 534 + /* double check that we have at least 1 free descriptor */ 535 + if (active == curr_size) 536 + return false; 537 + 538 + /* when shrinking, verify that we can hold the current active 539 + * set in the new ring 540 + */ 541 + if (active >= new_size) 542 + return false; 543 + 544 + /* allocate the array to hold the software ring */ 545 + ring = kcalloc(new_size, sizeof(*ring), GFP_NOWAIT); 546 + if (!ring) 547 + return false; 548 + 549 + /* allocate/trim descriptors as needed */ 550 + if (new_size > curr_size) { 551 + /* copy current descriptors to the new ring */ 552 + for (i = 0; i < curr_size; i++) { 553 + u16 curr_idx = (ioat->tail+i) & (curr_size-1); 554 + u16 new_idx = (ioat->tail+i) & (new_size-1); 555 + 556 + ring[new_idx] = ioat->ring[curr_idx]; 557 + set_desc_id(ring[new_idx], new_idx); 558 + } 559 + 560 + /* add new descriptors to the ring */ 561 + for (i = curr_size; i < new_size; i++) { 562 + u16 new_idx = (ioat->tail+i) & (new_size-1); 563 + 564 + ring[new_idx] = ioat2_alloc_ring_ent(c, GFP_NOWAIT); 565 + if (!ring[new_idx]) { 566 + while (i--) { 567 + u16 new_idx = (ioat->tail+i) & (new_size-1); 568 + 569 + ioat2_free_ring_ent(ring[new_idx], c); 570 + } 571 + kfree(ring); 572 + return false; 573 + } 574 + set_desc_id(ring[new_idx], new_idx); 575 + } 576 + 577 + /* hw link new descriptors */ 578 + for (i = curr_size-1; i < new_size; i++) { 579 + u16 new_idx = (ioat->tail+i) & (new_size-1); 580 + struct ioat_ring_ent *next = ring[(new_idx+1) & (new_size-1)]; 581 + struct ioat_dma_descriptor *hw = ring[new_idx]->hw; 582 + 583 + hw->next = next->txd.phys; 584 + } 585 + } else { 586 + struct ioat_dma_descriptor *hw; 587 + struct ioat_ring_ent *next; 588 + 589 + /* copy current descriptors to the new ring, dropping the 590 + * removed descriptors 591 + */ 592 + for (i = 0; i < new_size; i++) { 593 + u16 curr_idx = (ioat->tail+i) & (curr_size-1); 594 + u16 new_idx = (ioat->tail+i) & (new_size-1); 595 + 596 + ring[new_idx] = ioat->ring[curr_idx]; 597 + set_desc_id(ring[new_idx], new_idx); 598 + } 599 + 600 + /* free deleted descriptors */ 601 + for (i = new_size; i < curr_size; i++) { 602 + struct ioat_ring_ent *ent; 603 + 604 + ent = ioat2_get_ring_ent(ioat, ioat->tail+i); 605 + ioat2_free_ring_ent(ent, c); 606 + } 607 + 608 + /* fix up hardware ring */ 609 + hw = ring[(ioat->tail+new_size-1) & (new_size-1)]->hw; 610 + next = ring[(ioat->tail+new_size) & (new_size-1)]; 611 + hw->next = next->txd.phys; 612 + } 613 + 614 + dev_dbg(to_dev(chan), "%s: allocated %d descriptors\n", 615 + __func__, new_size); 616 + 617 + kfree(ioat->ring); 618 + ioat->ring = ring; 619 + ioat->alloc_order = order; 620 + 621 + return true; 622 + } 623 + 624 + /** 625 + * ioat2_alloc_and_lock - common descriptor alloc boilerplate for ioat2,3 ops 626 + * @idx: gets starting descriptor index on successful allocation 627 + * @ioat: ioat2,3 channel (ring) to operate on 628 + * @num_descs: allocation length 629 + */ 630 + int ioat2_alloc_and_lock(u16 *idx, struct ioat2_dma_chan *ioat, int num_descs) 631 + { 632 + struct ioat_chan_common *chan = &ioat->base; 633 + 634 + spin_lock_bh(&ioat->ring_lock); 635 + /* never allow the last descriptor to be consumed, we need at 636 + * least one free at all times to allow for on-the-fly ring 637 + * resizing. 638 + */ 639 + while (unlikely(ioat2_ring_space(ioat) <= num_descs)) { 640 + if (reshape_ring(ioat, ioat->alloc_order + 1) && 641 + ioat2_ring_space(ioat) > num_descs) 642 + break; 643 + 644 + if (printk_ratelimit()) 645 + dev_dbg(to_dev(chan), 646 + "%s: ring full! num_descs: %d (%x:%x:%x)\n", 647 + __func__, num_descs, ioat->head, ioat->tail, 648 + ioat->issued); 649 + spin_unlock_bh(&ioat->ring_lock); 650 + 651 + /* progress reclaim in the allocation failure case we 652 + * may be called under bh_disabled so we need to trigger 653 + * the timer event directly 654 + */ 655 + spin_lock_bh(&chan->cleanup_lock); 656 + if (jiffies > chan->timer.expires && 657 + timer_pending(&chan->timer)) { 658 + struct ioatdma_device *device = chan->device; 659 + 660 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 661 + spin_unlock_bh(&chan->cleanup_lock); 662 + device->timer_fn((unsigned long) ioat); 663 + } else 664 + spin_unlock_bh(&chan->cleanup_lock); 665 + return -ENOMEM; 666 + } 667 + 668 + dev_dbg(to_dev(chan), "%s: num_descs: %d (%x:%x:%x)\n", 669 + __func__, num_descs, ioat->head, ioat->tail, ioat->issued); 670 + 671 + *idx = ioat2_desc_alloc(ioat, num_descs); 672 + return 0; /* with ioat->ring_lock held */ 673 + } 674 + 675 + struct dma_async_tx_descriptor * 676 + ioat2_dma_prep_memcpy_lock(struct dma_chan *c, dma_addr_t dma_dest, 677 + dma_addr_t dma_src, size_t len, unsigned long flags) 678 + { 679 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 680 + struct ioat_dma_descriptor *hw; 681 + struct ioat_ring_ent *desc; 682 + dma_addr_t dst = dma_dest; 683 + dma_addr_t src = dma_src; 684 + size_t total_len = len; 685 + int num_descs; 686 + u16 idx; 687 + int i; 688 + 689 + num_descs = ioat2_xferlen_to_descs(ioat, len); 690 + if (likely(num_descs) && 691 + ioat2_alloc_and_lock(&idx, ioat, num_descs) == 0) 692 + /* pass */; 693 + else 694 + return NULL; 695 + i = 0; 696 + do { 697 + size_t copy = min_t(size_t, len, 1 << ioat->xfercap_log); 698 + 699 + desc = ioat2_get_ring_ent(ioat, idx + i); 700 + hw = desc->hw; 701 + 702 + hw->size = copy; 703 + hw->ctl = 0; 704 + hw->src_addr = src; 705 + hw->dst_addr = dst; 706 + 707 + len -= copy; 708 + dst += copy; 709 + src += copy; 710 + dump_desc_dbg(ioat, desc); 711 + } while (++i < num_descs); 712 + 713 + desc->txd.flags = flags; 714 + desc->len = total_len; 715 + hw->ctl_f.int_en = !!(flags & DMA_PREP_INTERRUPT); 716 + hw->ctl_f.fence = !!(flags & DMA_PREP_FENCE); 717 + hw->ctl_f.compl_write = 1; 718 + dump_desc_dbg(ioat, desc); 719 + /* we leave the channel locked to ensure in order submission */ 720 + 721 + return &desc->txd; 722 + } 723 + 724 + /** 725 + * ioat2_free_chan_resources - release all the descriptors 726 + * @chan: the channel to be cleaned 727 + */ 728 + void ioat2_free_chan_resources(struct dma_chan *c) 729 + { 730 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 731 + struct ioat_chan_common *chan = &ioat->base; 732 + struct ioatdma_device *device = chan->device; 733 + struct ioat_ring_ent *desc; 734 + const u16 total_descs = 1 << ioat->alloc_order; 735 + int descs; 736 + int i; 737 + 738 + /* Before freeing channel resources first check 739 + * if they have been previously allocated for this channel. 740 + */ 741 + if (!ioat->ring) 742 + return; 743 + 744 + tasklet_disable(&chan->cleanup_task); 745 + del_timer_sync(&chan->timer); 746 + device->cleanup_tasklet((unsigned long) ioat); 747 + 748 + /* Delay 100ms after reset to allow internal DMA logic to quiesce 749 + * before removing DMA descriptor resources. 750 + */ 751 + writeb(IOAT_CHANCMD_RESET, 752 + chan->reg_base + IOAT_CHANCMD_OFFSET(chan->device->version)); 753 + mdelay(100); 754 + 755 + spin_lock_bh(&ioat->ring_lock); 756 + descs = ioat2_ring_space(ioat); 757 + dev_dbg(to_dev(chan), "freeing %d idle descriptors\n", descs); 758 + for (i = 0; i < descs; i++) { 759 + desc = ioat2_get_ring_ent(ioat, ioat->head + i); 760 + ioat2_free_ring_ent(desc, c); 761 + } 762 + 763 + if (descs < total_descs) 764 + dev_err(to_dev(chan), "Freeing %d in use descriptors!\n", 765 + total_descs - descs); 766 + 767 + for (i = 0; i < total_descs - descs; i++) { 768 + desc = ioat2_get_ring_ent(ioat, ioat->tail + i); 769 + dump_desc_dbg(ioat, desc); 770 + ioat2_free_ring_ent(desc, c); 771 + } 772 + 773 + kfree(ioat->ring); 774 + ioat->ring = NULL; 775 + ioat->alloc_order = 0; 776 + pci_pool_free(device->completion_pool, chan->completion, 777 + chan->completion_dma); 778 + spin_unlock_bh(&ioat->ring_lock); 779 + 780 + chan->last_completion = 0; 781 + chan->completion_dma = 0; 782 + ioat->pending = 0; 783 + ioat->dmacount = 0; 784 + } 785 + 786 + enum dma_status 787 + ioat2_is_complete(struct dma_chan *c, dma_cookie_t cookie, 788 + dma_cookie_t *done, dma_cookie_t *used) 789 + { 790 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 791 + struct ioatdma_device *device = ioat->base.device; 792 + 793 + if (ioat_is_complete(c, cookie, done, used) == DMA_SUCCESS) 794 + return DMA_SUCCESS; 795 + 796 + device->cleanup_tasklet((unsigned long) ioat); 797 + 798 + return ioat_is_complete(c, cookie, done, used); 799 + } 800 + 801 + static ssize_t ring_size_show(struct dma_chan *c, char *page) 802 + { 803 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 804 + 805 + return sprintf(page, "%d\n", (1 << ioat->alloc_order) & ~1); 806 + } 807 + static struct ioat_sysfs_entry ring_size_attr = __ATTR_RO(ring_size); 808 + 809 + static ssize_t ring_active_show(struct dma_chan *c, char *page) 810 + { 811 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 812 + 813 + /* ...taken outside the lock, no need to be precise */ 814 + return sprintf(page, "%d\n", ioat2_ring_active(ioat)); 815 + } 816 + static struct ioat_sysfs_entry ring_active_attr = __ATTR_RO(ring_active); 817 + 818 + static struct attribute *ioat2_attrs[] = { 819 + &ring_size_attr.attr, 820 + &ring_active_attr.attr, 821 + &ioat_cap_attr.attr, 822 + &ioat_version_attr.attr, 823 + NULL, 824 + }; 825 + 826 + struct kobj_type ioat2_ktype = { 827 + .sysfs_ops = &ioat_sysfs_ops, 828 + .default_attrs = ioat2_attrs, 829 + }; 830 + 831 + int __devinit ioat2_dma_probe(struct ioatdma_device *device, int dca) 832 + { 833 + struct pci_dev *pdev = device->pdev; 834 + struct dma_device *dma; 835 + struct dma_chan *c; 836 + struct ioat_chan_common *chan; 837 + int err; 838 + 839 + device->enumerate_channels = ioat2_enumerate_channels; 840 + device->cleanup_tasklet = ioat2_cleanup_tasklet; 841 + device->timer_fn = ioat2_timer_event; 842 + device->self_test = ioat_dma_self_test; 843 + dma = &device->common; 844 + dma->device_prep_dma_memcpy = ioat2_dma_prep_memcpy_lock; 845 + dma->device_issue_pending = ioat2_issue_pending; 846 + dma->device_alloc_chan_resources = ioat2_alloc_chan_resources; 847 + dma->device_free_chan_resources = ioat2_free_chan_resources; 848 + dma->device_is_tx_complete = ioat2_is_complete; 849 + 850 + err = ioat_probe(device); 851 + if (err) 852 + return err; 853 + ioat_set_tcp_copy_break(2048); 854 + 855 + list_for_each_entry(c, &dma->channels, device_node) { 856 + chan = to_chan_common(c); 857 + writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE | IOAT_DMA_DCA_ANY_CPU, 858 + chan->reg_base + IOAT_DCACTRL_OFFSET); 859 + } 860 + 861 + err = ioat_register(device); 862 + if (err) 863 + return err; 864 + 865 + ioat_kobject_add(device, &ioat2_ktype); 866 + 867 + if (dca) 868 + device->dca = ioat2_dca_init(pdev, device->reg_base); 869 + 870 + return err; 871 + }
+190
drivers/dma/ioat/dma_v2.h
··· 1 + /* 2 + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms of the GNU General Public License as published by the Free 6 + * Software Foundation; either version 2 of the License, or (at your option) 7 + * any later version. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program; if not, write to the Free Software Foundation, Inc., 59 16 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 + * 18 + * The full GNU General Public License is included in this distribution in the 19 + * file called COPYING. 20 + */ 21 + #ifndef IOATDMA_V2_H 22 + #define IOATDMA_V2_H 23 + 24 + #include <linux/dmaengine.h> 25 + #include "dma.h" 26 + #include "hw.h" 27 + 28 + 29 + extern int ioat_pending_level; 30 + extern int ioat_ring_alloc_order; 31 + 32 + /* 33 + * workaround for IOAT ver.3.0 null descriptor issue 34 + * (channel returns error when size is 0) 35 + */ 36 + #define NULL_DESC_BUFFER_SIZE 1 37 + 38 + #define IOAT_MAX_ORDER 16 39 + #define ioat_get_alloc_order() \ 40 + (min(ioat_ring_alloc_order, IOAT_MAX_ORDER)) 41 + #define ioat_get_max_alloc_order() \ 42 + (min(ioat_ring_max_alloc_order, IOAT_MAX_ORDER)) 43 + 44 + /* struct ioat2_dma_chan - ioat v2 / v3 channel attributes 45 + * @base: common ioat channel parameters 46 + * @xfercap_log; log2 of channel max transfer length (for fast division) 47 + * @head: allocated index 48 + * @issued: hardware notification point 49 + * @tail: cleanup index 50 + * @pending: lock free indicator for issued != head 51 + * @dmacount: identical to 'head' except for occasionally resetting to zero 52 + * @alloc_order: log2 of the number of allocated descriptors 53 + * @ring: software ring buffer implementation of hardware ring 54 + * @ring_lock: protects ring attributes 55 + */ 56 + struct ioat2_dma_chan { 57 + struct ioat_chan_common base; 58 + size_t xfercap_log; 59 + u16 head; 60 + u16 issued; 61 + u16 tail; 62 + u16 dmacount; 63 + u16 alloc_order; 64 + int pending; 65 + struct ioat_ring_ent **ring; 66 + spinlock_t ring_lock; 67 + }; 68 + 69 + static inline struct ioat2_dma_chan *to_ioat2_chan(struct dma_chan *c) 70 + { 71 + struct ioat_chan_common *chan = to_chan_common(c); 72 + 73 + return container_of(chan, struct ioat2_dma_chan, base); 74 + } 75 + 76 + static inline u16 ioat2_ring_mask(struct ioat2_dma_chan *ioat) 77 + { 78 + return (1 << ioat->alloc_order) - 1; 79 + } 80 + 81 + /* count of descriptors in flight with the engine */ 82 + static inline u16 ioat2_ring_active(struct ioat2_dma_chan *ioat) 83 + { 84 + return (ioat->head - ioat->tail) & ioat2_ring_mask(ioat); 85 + } 86 + 87 + /* count of descriptors pending submission to hardware */ 88 + static inline u16 ioat2_ring_pending(struct ioat2_dma_chan *ioat) 89 + { 90 + return (ioat->head - ioat->issued) & ioat2_ring_mask(ioat); 91 + } 92 + 93 + static inline u16 ioat2_ring_space(struct ioat2_dma_chan *ioat) 94 + { 95 + u16 num_descs = ioat2_ring_mask(ioat) + 1; 96 + u16 active = ioat2_ring_active(ioat); 97 + 98 + BUG_ON(active > num_descs); 99 + 100 + return num_descs - active; 101 + } 102 + 103 + /* assumes caller already checked space */ 104 + static inline u16 ioat2_desc_alloc(struct ioat2_dma_chan *ioat, u16 len) 105 + { 106 + ioat->head += len; 107 + return ioat->head - len; 108 + } 109 + 110 + static inline u16 ioat2_xferlen_to_descs(struct ioat2_dma_chan *ioat, size_t len) 111 + { 112 + u16 num_descs = len >> ioat->xfercap_log; 113 + 114 + num_descs += !!(len & ((1 << ioat->xfercap_log) - 1)); 115 + return num_descs; 116 + } 117 + 118 + /** 119 + * struct ioat_ring_ent - wrapper around hardware descriptor 120 + * @hw: hardware DMA descriptor (for memcpy) 121 + * @fill: hardware fill descriptor 122 + * @xor: hardware xor descriptor 123 + * @xor_ex: hardware xor extension descriptor 124 + * @pq: hardware pq descriptor 125 + * @pq_ex: hardware pq extension descriptor 126 + * @pqu: hardware pq update descriptor 127 + * @raw: hardware raw (un-typed) descriptor 128 + * @txd: the generic software descriptor for all engines 129 + * @len: total transaction length for unmap 130 + * @result: asynchronous result of validate operations 131 + * @id: identifier for debug 132 + */ 133 + 134 + struct ioat_ring_ent { 135 + union { 136 + struct ioat_dma_descriptor *hw; 137 + struct ioat_fill_descriptor *fill; 138 + struct ioat_xor_descriptor *xor; 139 + struct ioat_xor_ext_descriptor *xor_ex; 140 + struct ioat_pq_descriptor *pq; 141 + struct ioat_pq_ext_descriptor *pq_ex; 142 + struct ioat_pq_update_descriptor *pqu; 143 + struct ioat_raw_descriptor *raw; 144 + }; 145 + size_t len; 146 + struct dma_async_tx_descriptor txd; 147 + enum sum_check_flags *result; 148 + #ifdef DEBUG 149 + int id; 150 + #endif 151 + }; 152 + 153 + static inline struct ioat_ring_ent * 154 + ioat2_get_ring_ent(struct ioat2_dma_chan *ioat, u16 idx) 155 + { 156 + return ioat->ring[idx & ioat2_ring_mask(ioat)]; 157 + } 158 + 159 + static inline void ioat2_set_chainaddr(struct ioat2_dma_chan *ioat, u64 addr) 160 + { 161 + struct ioat_chan_common *chan = &ioat->base; 162 + 163 + writel(addr & 0x00000000FFFFFFFF, 164 + chan->reg_base + IOAT2_CHAINADDR_OFFSET_LOW); 165 + writel(addr >> 32, 166 + chan->reg_base + IOAT2_CHAINADDR_OFFSET_HIGH); 167 + } 168 + 169 + int __devinit ioat2_dma_probe(struct ioatdma_device *dev, int dca); 170 + int __devinit ioat3_dma_probe(struct ioatdma_device *dev, int dca); 171 + struct dca_provider * __devinit ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase); 172 + struct dca_provider * __devinit ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase); 173 + int ioat2_alloc_and_lock(u16 *idx, struct ioat2_dma_chan *ioat, int num_descs); 174 + int ioat2_enumerate_channels(struct ioatdma_device *device); 175 + struct dma_async_tx_descriptor * 176 + ioat2_dma_prep_memcpy_lock(struct dma_chan *c, dma_addr_t dma_dest, 177 + dma_addr_t dma_src, size_t len, unsigned long flags); 178 + void ioat2_issue_pending(struct dma_chan *chan); 179 + int ioat2_alloc_chan_resources(struct dma_chan *c); 180 + void ioat2_free_chan_resources(struct dma_chan *c); 181 + enum dma_status ioat2_is_complete(struct dma_chan *c, dma_cookie_t cookie, 182 + dma_cookie_t *done, dma_cookie_t *used); 183 + void __ioat2_restart_chan(struct ioat2_dma_chan *ioat); 184 + bool reshape_ring(struct ioat2_dma_chan *ioat, int order); 185 + void __ioat2_issue_pending(struct ioat2_dma_chan *ioat); 186 + void ioat2_cleanup_tasklet(unsigned long data); 187 + void ioat2_timer_event(unsigned long data); 188 + extern struct kobj_type ioat2_ktype; 189 + extern struct kmem_cache *ioat2_cache; 190 + #endif /* IOATDMA_V2_H */
+1223
drivers/dma/ioat/dma_v3.c
··· 1 + /* 2 + * This file is provided under a dual BSD/GPLv2 license. When using or 3 + * redistributing this file, you may do so under either license. 4 + * 5 + * GPL LICENSE SUMMARY 6 + * 7 + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 8 + * 9 + * This program is free software; you can redistribute it and/or modify it 10 + * under the terms and conditions of the GNU General Public License, 11 + * version 2, as published by the Free Software Foundation. 12 + * 13 + * This program is distributed in the hope that it will be useful, but WITHOUT 14 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 + * more details. 17 + * 18 + * You should have received a copy of the GNU General Public License along with 19 + * this program; if not, write to the Free Software Foundation, Inc., 20 + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21 + * 22 + * The full GNU General Public License is included in this distribution in 23 + * the file called "COPYING". 24 + * 25 + * BSD LICENSE 26 + * 27 + * Copyright(c) 2004-2009 Intel Corporation. All rights reserved. 28 + * 29 + * Redistribution and use in source and binary forms, with or without 30 + * modification, are permitted provided that the following conditions are met: 31 + * 32 + * * Redistributions of source code must retain the above copyright 33 + * notice, this list of conditions and the following disclaimer. 34 + * * Redistributions in binary form must reproduce the above copyright 35 + * notice, this list of conditions and the following disclaimer in 36 + * the documentation and/or other materials provided with the 37 + * distribution. 38 + * * Neither the name of Intel Corporation nor the names of its 39 + * contributors may be used to endorse or promote products derived 40 + * from this software without specific prior written permission. 41 + * 42 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 43 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 44 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 45 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 46 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 47 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 48 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 49 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 50 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 51 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 52 + * POSSIBILITY OF SUCH DAMAGE. 53 + */ 54 + 55 + /* 56 + * Support routines for v3+ hardware 57 + */ 58 + 59 + #include <linux/pci.h> 60 + #include <linux/dmaengine.h> 61 + #include <linux/dma-mapping.h> 62 + #include "registers.h" 63 + #include "hw.h" 64 + #include "dma.h" 65 + #include "dma_v2.h" 66 + 67 + /* ioat hardware assumes at least two sources for raid operations */ 68 + #define src_cnt_to_sw(x) ((x) + 2) 69 + #define src_cnt_to_hw(x) ((x) - 2) 70 + 71 + /* provide a lookup table for setting the source address in the base or 72 + * extended descriptor of an xor or pq descriptor 73 + */ 74 + static const u8 xor_idx_to_desc __read_mostly = 0xd0; 75 + static const u8 xor_idx_to_field[] __read_mostly = { 1, 4, 5, 6, 7, 0, 1, 2 }; 76 + static const u8 pq_idx_to_desc __read_mostly = 0xf8; 77 + static const u8 pq_idx_to_field[] __read_mostly = { 1, 4, 5, 0, 1, 2, 4, 5 }; 78 + 79 + static dma_addr_t xor_get_src(struct ioat_raw_descriptor *descs[2], int idx) 80 + { 81 + struct ioat_raw_descriptor *raw = descs[xor_idx_to_desc >> idx & 1]; 82 + 83 + return raw->field[xor_idx_to_field[idx]]; 84 + } 85 + 86 + static void xor_set_src(struct ioat_raw_descriptor *descs[2], 87 + dma_addr_t addr, u32 offset, int idx) 88 + { 89 + struct ioat_raw_descriptor *raw = descs[xor_idx_to_desc >> idx & 1]; 90 + 91 + raw->field[xor_idx_to_field[idx]] = addr + offset; 92 + } 93 + 94 + static dma_addr_t pq_get_src(struct ioat_raw_descriptor *descs[2], int idx) 95 + { 96 + struct ioat_raw_descriptor *raw = descs[pq_idx_to_desc >> idx & 1]; 97 + 98 + return raw->field[pq_idx_to_field[idx]]; 99 + } 100 + 101 + static void pq_set_src(struct ioat_raw_descriptor *descs[2], 102 + dma_addr_t addr, u32 offset, u8 coef, int idx) 103 + { 104 + struct ioat_pq_descriptor *pq = (struct ioat_pq_descriptor *) descs[0]; 105 + struct ioat_raw_descriptor *raw = descs[pq_idx_to_desc >> idx & 1]; 106 + 107 + raw->field[pq_idx_to_field[idx]] = addr + offset; 108 + pq->coef[idx] = coef; 109 + } 110 + 111 + static void ioat3_dma_unmap(struct ioat2_dma_chan *ioat, 112 + struct ioat_ring_ent *desc, int idx) 113 + { 114 + struct ioat_chan_common *chan = &ioat->base; 115 + struct pci_dev *pdev = chan->device->pdev; 116 + size_t len = desc->len; 117 + size_t offset = len - desc->hw->size; 118 + struct dma_async_tx_descriptor *tx = &desc->txd; 119 + enum dma_ctrl_flags flags = tx->flags; 120 + 121 + switch (desc->hw->ctl_f.op) { 122 + case IOAT_OP_COPY: 123 + if (!desc->hw->ctl_f.null) /* skip 'interrupt' ops */ 124 + ioat_dma_unmap(chan, flags, len, desc->hw); 125 + break; 126 + case IOAT_OP_FILL: { 127 + struct ioat_fill_descriptor *hw = desc->fill; 128 + 129 + if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) 130 + ioat_unmap(pdev, hw->dst_addr - offset, len, 131 + PCI_DMA_FROMDEVICE, flags, 1); 132 + break; 133 + } 134 + case IOAT_OP_XOR_VAL: 135 + case IOAT_OP_XOR: { 136 + struct ioat_xor_descriptor *xor = desc->xor; 137 + struct ioat_ring_ent *ext; 138 + struct ioat_xor_ext_descriptor *xor_ex = NULL; 139 + int src_cnt = src_cnt_to_sw(xor->ctl_f.src_cnt); 140 + struct ioat_raw_descriptor *descs[2]; 141 + int i; 142 + 143 + if (src_cnt > 5) { 144 + ext = ioat2_get_ring_ent(ioat, idx + 1); 145 + xor_ex = ext->xor_ex; 146 + } 147 + 148 + if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 149 + descs[0] = (struct ioat_raw_descriptor *) xor; 150 + descs[1] = (struct ioat_raw_descriptor *) xor_ex; 151 + for (i = 0; i < src_cnt; i++) { 152 + dma_addr_t src = xor_get_src(descs, i); 153 + 154 + ioat_unmap(pdev, src - offset, len, 155 + PCI_DMA_TODEVICE, flags, 0); 156 + } 157 + 158 + /* dest is a source in xor validate operations */ 159 + if (xor->ctl_f.op == IOAT_OP_XOR_VAL) { 160 + ioat_unmap(pdev, xor->dst_addr - offset, len, 161 + PCI_DMA_TODEVICE, flags, 1); 162 + break; 163 + } 164 + } 165 + 166 + if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) 167 + ioat_unmap(pdev, xor->dst_addr - offset, len, 168 + PCI_DMA_FROMDEVICE, flags, 1); 169 + break; 170 + } 171 + case IOAT_OP_PQ_VAL: 172 + case IOAT_OP_PQ: { 173 + struct ioat_pq_descriptor *pq = desc->pq; 174 + struct ioat_ring_ent *ext; 175 + struct ioat_pq_ext_descriptor *pq_ex = NULL; 176 + int src_cnt = src_cnt_to_sw(pq->ctl_f.src_cnt); 177 + struct ioat_raw_descriptor *descs[2]; 178 + int i; 179 + 180 + if (src_cnt > 3) { 181 + ext = ioat2_get_ring_ent(ioat, idx + 1); 182 + pq_ex = ext->pq_ex; 183 + } 184 + 185 + /* in the 'continue' case don't unmap the dests as sources */ 186 + if (dmaf_p_disabled_continue(flags)) 187 + src_cnt--; 188 + else if (dmaf_continue(flags)) 189 + src_cnt -= 3; 190 + 191 + if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 192 + descs[0] = (struct ioat_raw_descriptor *) pq; 193 + descs[1] = (struct ioat_raw_descriptor *) pq_ex; 194 + for (i = 0; i < src_cnt; i++) { 195 + dma_addr_t src = pq_get_src(descs, i); 196 + 197 + ioat_unmap(pdev, src - offset, len, 198 + PCI_DMA_TODEVICE, flags, 0); 199 + } 200 + 201 + /* the dests are sources in pq validate operations */ 202 + if (pq->ctl_f.op == IOAT_OP_XOR_VAL) { 203 + if (!(flags & DMA_PREP_PQ_DISABLE_P)) 204 + ioat_unmap(pdev, pq->p_addr - offset, 205 + len, PCI_DMA_TODEVICE, flags, 0); 206 + if (!(flags & DMA_PREP_PQ_DISABLE_Q)) 207 + ioat_unmap(pdev, pq->q_addr - offset, 208 + len, PCI_DMA_TODEVICE, flags, 0); 209 + break; 210 + } 211 + } 212 + 213 + if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 214 + if (!(flags & DMA_PREP_PQ_DISABLE_P)) 215 + ioat_unmap(pdev, pq->p_addr - offset, len, 216 + PCI_DMA_BIDIRECTIONAL, flags, 1); 217 + if (!(flags & DMA_PREP_PQ_DISABLE_Q)) 218 + ioat_unmap(pdev, pq->q_addr - offset, len, 219 + PCI_DMA_BIDIRECTIONAL, flags, 1); 220 + } 221 + break; 222 + } 223 + default: 224 + dev_err(&pdev->dev, "%s: unknown op type: %#x\n", 225 + __func__, desc->hw->ctl_f.op); 226 + } 227 + } 228 + 229 + static bool desc_has_ext(struct ioat_ring_ent *desc) 230 + { 231 + struct ioat_dma_descriptor *hw = desc->hw; 232 + 233 + if (hw->ctl_f.op == IOAT_OP_XOR || 234 + hw->ctl_f.op == IOAT_OP_XOR_VAL) { 235 + struct ioat_xor_descriptor *xor = desc->xor; 236 + 237 + if (src_cnt_to_sw(xor->ctl_f.src_cnt) > 5) 238 + return true; 239 + } else if (hw->ctl_f.op == IOAT_OP_PQ || 240 + hw->ctl_f.op == IOAT_OP_PQ_VAL) { 241 + struct ioat_pq_descriptor *pq = desc->pq; 242 + 243 + if (src_cnt_to_sw(pq->ctl_f.src_cnt) > 3) 244 + return true; 245 + } 246 + 247 + return false; 248 + } 249 + 250 + /** 251 + * __cleanup - reclaim used descriptors 252 + * @ioat: channel (ring) to clean 253 + * 254 + * The difference from the dma_v2.c __cleanup() is that this routine 255 + * handles extended descriptors and dma-unmapping raid operations. 256 + */ 257 + static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete) 258 + { 259 + struct ioat_chan_common *chan = &ioat->base; 260 + struct ioat_ring_ent *desc; 261 + bool seen_current = false; 262 + u16 active; 263 + int i; 264 + 265 + dev_dbg(to_dev(chan), "%s: head: %#x tail: %#x issued: %#x\n", 266 + __func__, ioat->head, ioat->tail, ioat->issued); 267 + 268 + active = ioat2_ring_active(ioat); 269 + for (i = 0; i < active && !seen_current; i++) { 270 + struct dma_async_tx_descriptor *tx; 271 + 272 + prefetch(ioat2_get_ring_ent(ioat, ioat->tail + i + 1)); 273 + desc = ioat2_get_ring_ent(ioat, ioat->tail + i); 274 + dump_desc_dbg(ioat, desc); 275 + tx = &desc->txd; 276 + if (tx->cookie) { 277 + chan->completed_cookie = tx->cookie; 278 + ioat3_dma_unmap(ioat, desc, ioat->tail + i); 279 + tx->cookie = 0; 280 + if (tx->callback) { 281 + tx->callback(tx->callback_param); 282 + tx->callback = NULL; 283 + } 284 + } 285 + 286 + if (tx->phys == phys_complete) 287 + seen_current = true; 288 + 289 + /* skip extended descriptors */ 290 + if (desc_has_ext(desc)) { 291 + BUG_ON(i + 1 >= active); 292 + i++; 293 + } 294 + } 295 + ioat->tail += i; 296 + BUG_ON(!seen_current); /* no active descs have written a completion? */ 297 + chan->last_completion = phys_complete; 298 + if (ioat->head == ioat->tail) { 299 + dev_dbg(to_dev(chan), "%s: cancel completion timeout\n", 300 + __func__); 301 + clear_bit(IOAT_COMPLETION_PENDING, &chan->state); 302 + mod_timer(&chan->timer, jiffies + IDLE_TIMEOUT); 303 + } 304 + } 305 + 306 + static void ioat3_cleanup(struct ioat2_dma_chan *ioat) 307 + { 308 + struct ioat_chan_common *chan = &ioat->base; 309 + unsigned long phys_complete; 310 + 311 + prefetch(chan->completion); 312 + 313 + if (!spin_trylock_bh(&chan->cleanup_lock)) 314 + return; 315 + 316 + if (!ioat_cleanup_preamble(chan, &phys_complete)) { 317 + spin_unlock_bh(&chan->cleanup_lock); 318 + return; 319 + } 320 + 321 + if (!spin_trylock_bh(&ioat->ring_lock)) { 322 + spin_unlock_bh(&chan->cleanup_lock); 323 + return; 324 + } 325 + 326 + __cleanup(ioat, phys_complete); 327 + 328 + spin_unlock_bh(&ioat->ring_lock); 329 + spin_unlock_bh(&chan->cleanup_lock); 330 + } 331 + 332 + static void ioat3_cleanup_tasklet(unsigned long data) 333 + { 334 + struct ioat2_dma_chan *ioat = (void *) data; 335 + 336 + ioat3_cleanup(ioat); 337 + writew(IOAT_CHANCTRL_RUN | IOAT3_CHANCTRL_COMPL_DCA_EN, 338 + ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); 339 + } 340 + 341 + static void ioat3_restart_channel(struct ioat2_dma_chan *ioat) 342 + { 343 + struct ioat_chan_common *chan = &ioat->base; 344 + unsigned long phys_complete; 345 + u32 status; 346 + 347 + status = ioat_chansts(chan); 348 + if (is_ioat_active(status) || is_ioat_idle(status)) 349 + ioat_suspend(chan); 350 + while (is_ioat_active(status) || is_ioat_idle(status)) { 351 + status = ioat_chansts(chan); 352 + cpu_relax(); 353 + } 354 + 355 + if (ioat_cleanup_preamble(chan, &phys_complete)) 356 + __cleanup(ioat, phys_complete); 357 + 358 + __ioat2_restart_chan(ioat); 359 + } 360 + 361 + static void ioat3_timer_event(unsigned long data) 362 + { 363 + struct ioat2_dma_chan *ioat = (void *) data; 364 + struct ioat_chan_common *chan = &ioat->base; 365 + 366 + spin_lock_bh(&chan->cleanup_lock); 367 + if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) { 368 + unsigned long phys_complete; 369 + u64 status; 370 + 371 + spin_lock_bh(&ioat->ring_lock); 372 + status = ioat_chansts(chan); 373 + 374 + /* when halted due to errors check for channel 375 + * programming errors before advancing the completion state 376 + */ 377 + if (is_ioat_halted(status)) { 378 + u32 chanerr; 379 + 380 + chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); 381 + BUG_ON(is_ioat_bug(chanerr)); 382 + } 383 + 384 + /* if we haven't made progress and we have already 385 + * acknowledged a pending completion once, then be more 386 + * forceful with a restart 387 + */ 388 + if (ioat_cleanup_preamble(chan, &phys_complete)) 389 + __cleanup(ioat, phys_complete); 390 + else if (test_bit(IOAT_COMPLETION_ACK, &chan->state)) 391 + ioat3_restart_channel(ioat); 392 + else { 393 + set_bit(IOAT_COMPLETION_ACK, &chan->state); 394 + mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT); 395 + } 396 + spin_unlock_bh(&ioat->ring_lock); 397 + } else { 398 + u16 active; 399 + 400 + /* if the ring is idle, empty, and oversized try to step 401 + * down the size 402 + */ 403 + spin_lock_bh(&ioat->ring_lock); 404 + active = ioat2_ring_active(ioat); 405 + if (active == 0 && ioat->alloc_order > ioat_get_alloc_order()) 406 + reshape_ring(ioat, ioat->alloc_order-1); 407 + spin_unlock_bh(&ioat->ring_lock); 408 + 409 + /* keep shrinking until we get back to our minimum 410 + * default size 411 + */ 412 + if (ioat->alloc_order > ioat_get_alloc_order()) 413 + mod_timer(&chan->timer, jiffies + IDLE_TIMEOUT); 414 + } 415 + spin_unlock_bh(&chan->cleanup_lock); 416 + } 417 + 418 + static enum dma_status 419 + ioat3_is_complete(struct dma_chan *c, dma_cookie_t cookie, 420 + dma_cookie_t *done, dma_cookie_t *used) 421 + { 422 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 423 + 424 + if (ioat_is_complete(c, cookie, done, used) == DMA_SUCCESS) 425 + return DMA_SUCCESS; 426 + 427 + ioat3_cleanup(ioat); 428 + 429 + return ioat_is_complete(c, cookie, done, used); 430 + } 431 + 432 + static struct dma_async_tx_descriptor * 433 + ioat3_prep_memset_lock(struct dma_chan *c, dma_addr_t dest, int value, 434 + size_t len, unsigned long flags) 435 + { 436 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 437 + struct ioat_ring_ent *desc; 438 + size_t total_len = len; 439 + struct ioat_fill_descriptor *fill; 440 + int num_descs; 441 + u64 src_data = (0x0101010101010101ULL) * (value & 0xff); 442 + u16 idx; 443 + int i; 444 + 445 + num_descs = ioat2_xferlen_to_descs(ioat, len); 446 + if (likely(num_descs) && 447 + ioat2_alloc_and_lock(&idx, ioat, num_descs) == 0) 448 + /* pass */; 449 + else 450 + return NULL; 451 + i = 0; 452 + do { 453 + size_t xfer_size = min_t(size_t, len, 1 << ioat->xfercap_log); 454 + 455 + desc = ioat2_get_ring_ent(ioat, idx + i); 456 + fill = desc->fill; 457 + 458 + fill->size = xfer_size; 459 + fill->src_data = src_data; 460 + fill->dst_addr = dest; 461 + fill->ctl = 0; 462 + fill->ctl_f.op = IOAT_OP_FILL; 463 + 464 + len -= xfer_size; 465 + dest += xfer_size; 466 + dump_desc_dbg(ioat, desc); 467 + } while (++i < num_descs); 468 + 469 + desc->txd.flags = flags; 470 + desc->len = total_len; 471 + fill->ctl_f.int_en = !!(flags & DMA_PREP_INTERRUPT); 472 + fill->ctl_f.fence = !!(flags & DMA_PREP_FENCE); 473 + fill->ctl_f.compl_write = 1; 474 + dump_desc_dbg(ioat, desc); 475 + 476 + /* we leave the channel locked to ensure in order submission */ 477 + return &desc->txd; 478 + } 479 + 480 + static struct dma_async_tx_descriptor * 481 + __ioat3_prep_xor_lock(struct dma_chan *c, enum sum_check_flags *result, 482 + dma_addr_t dest, dma_addr_t *src, unsigned int src_cnt, 483 + size_t len, unsigned long flags) 484 + { 485 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 486 + struct ioat_ring_ent *compl_desc; 487 + struct ioat_ring_ent *desc; 488 + struct ioat_ring_ent *ext; 489 + size_t total_len = len; 490 + struct ioat_xor_descriptor *xor; 491 + struct ioat_xor_ext_descriptor *xor_ex = NULL; 492 + struct ioat_dma_descriptor *hw; 493 + u32 offset = 0; 494 + int num_descs; 495 + int with_ext; 496 + int i; 497 + u16 idx; 498 + u8 op = result ? IOAT_OP_XOR_VAL : IOAT_OP_XOR; 499 + 500 + BUG_ON(src_cnt < 2); 501 + 502 + num_descs = ioat2_xferlen_to_descs(ioat, len); 503 + /* we need 2x the number of descriptors to cover greater than 5 504 + * sources 505 + */ 506 + if (src_cnt > 5) { 507 + with_ext = 1; 508 + num_descs *= 2; 509 + } else 510 + with_ext = 0; 511 + 512 + /* completion writes from the raid engine may pass completion 513 + * writes from the legacy engine, so we need one extra null 514 + * (legacy) descriptor to ensure all completion writes arrive in 515 + * order. 516 + */ 517 + if (likely(num_descs) && 518 + ioat2_alloc_and_lock(&idx, ioat, num_descs+1) == 0) 519 + /* pass */; 520 + else 521 + return NULL; 522 + i = 0; 523 + do { 524 + struct ioat_raw_descriptor *descs[2]; 525 + size_t xfer_size = min_t(size_t, len, 1 << ioat->xfercap_log); 526 + int s; 527 + 528 + desc = ioat2_get_ring_ent(ioat, idx + i); 529 + xor = desc->xor; 530 + 531 + /* save a branch by unconditionally retrieving the 532 + * extended descriptor xor_set_src() knows to not write 533 + * to it in the single descriptor case 534 + */ 535 + ext = ioat2_get_ring_ent(ioat, idx + i + 1); 536 + xor_ex = ext->xor_ex; 537 + 538 + descs[0] = (struct ioat_raw_descriptor *) xor; 539 + descs[1] = (struct ioat_raw_descriptor *) xor_ex; 540 + for (s = 0; s < src_cnt; s++) 541 + xor_set_src(descs, src[s], offset, s); 542 + xor->size = xfer_size; 543 + xor->dst_addr = dest + offset; 544 + xor->ctl = 0; 545 + xor->ctl_f.op = op; 546 + xor->ctl_f.src_cnt = src_cnt_to_hw(src_cnt); 547 + 548 + len -= xfer_size; 549 + offset += xfer_size; 550 + dump_desc_dbg(ioat, desc); 551 + } while ((i += 1 + with_ext) < num_descs); 552 + 553 + /* last xor descriptor carries the unmap parameters and fence bit */ 554 + desc->txd.flags = flags; 555 + desc->len = total_len; 556 + if (result) 557 + desc->result = result; 558 + xor->ctl_f.fence = !!(flags & DMA_PREP_FENCE); 559 + 560 + /* completion descriptor carries interrupt bit */ 561 + compl_desc = ioat2_get_ring_ent(ioat, idx + i); 562 + compl_desc->txd.flags = flags & DMA_PREP_INTERRUPT; 563 + hw = compl_desc->hw; 564 + hw->ctl = 0; 565 + hw->ctl_f.null = 1; 566 + hw->ctl_f.int_en = !!(flags & DMA_PREP_INTERRUPT); 567 + hw->ctl_f.compl_write = 1; 568 + hw->size = NULL_DESC_BUFFER_SIZE; 569 + dump_desc_dbg(ioat, compl_desc); 570 + 571 + /* we leave the channel locked to ensure in order submission */ 572 + return &desc->txd; 573 + } 574 + 575 + static struct dma_async_tx_descriptor * 576 + ioat3_prep_xor(struct dma_chan *chan, dma_addr_t dest, dma_addr_t *src, 577 + unsigned int src_cnt, size_t len, unsigned long flags) 578 + { 579 + return __ioat3_prep_xor_lock(chan, NULL, dest, src, src_cnt, len, flags); 580 + } 581 + 582 + struct dma_async_tx_descriptor * 583 + ioat3_prep_xor_val(struct dma_chan *chan, dma_addr_t *src, 584 + unsigned int src_cnt, size_t len, 585 + enum sum_check_flags *result, unsigned long flags) 586 + { 587 + /* the cleanup routine only sets bits on validate failure, it 588 + * does not clear bits on validate success... so clear it here 589 + */ 590 + *result = 0; 591 + 592 + return __ioat3_prep_xor_lock(chan, result, src[0], &src[1], 593 + src_cnt - 1, len, flags); 594 + } 595 + 596 + static void 597 + dump_pq_desc_dbg(struct ioat2_dma_chan *ioat, struct ioat_ring_ent *desc, struct ioat_ring_ent *ext) 598 + { 599 + struct device *dev = to_dev(&ioat->base); 600 + struct ioat_pq_descriptor *pq = desc->pq; 601 + struct ioat_pq_ext_descriptor *pq_ex = ext ? ext->pq_ex : NULL; 602 + struct ioat_raw_descriptor *descs[] = { (void *) pq, (void *) pq_ex }; 603 + int src_cnt = src_cnt_to_sw(pq->ctl_f.src_cnt); 604 + int i; 605 + 606 + dev_dbg(dev, "desc[%d]: (%#llx->%#llx) flags: %#x" 607 + " sz: %#x ctl: %#x (op: %d int: %d compl: %d pq: '%s%s' src_cnt: %d)\n", 608 + desc_id(desc), (unsigned long long) desc->txd.phys, 609 + (unsigned long long) (pq_ex ? pq_ex->next : pq->next), 610 + desc->txd.flags, pq->size, pq->ctl, pq->ctl_f.op, pq->ctl_f.int_en, 611 + pq->ctl_f.compl_write, 612 + pq->ctl_f.p_disable ? "" : "p", pq->ctl_f.q_disable ? "" : "q", 613 + pq->ctl_f.src_cnt); 614 + for (i = 0; i < src_cnt; i++) 615 + dev_dbg(dev, "\tsrc[%d]: %#llx coef: %#x\n", i, 616 + (unsigned long long) pq_get_src(descs, i), pq->coef[i]); 617 + dev_dbg(dev, "\tP: %#llx\n", pq->p_addr); 618 + dev_dbg(dev, "\tQ: %#llx\n", pq->q_addr); 619 + } 620 + 621 + static struct dma_async_tx_descriptor * 622 + __ioat3_prep_pq_lock(struct dma_chan *c, enum sum_check_flags *result, 623 + const dma_addr_t *dst, const dma_addr_t *src, 624 + unsigned int src_cnt, const unsigned char *scf, 625 + size_t len, unsigned long flags) 626 + { 627 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 628 + struct ioat_chan_common *chan = &ioat->base; 629 + struct ioat_ring_ent *compl_desc; 630 + struct ioat_ring_ent *desc; 631 + struct ioat_ring_ent *ext; 632 + size_t total_len = len; 633 + struct ioat_pq_descriptor *pq; 634 + struct ioat_pq_ext_descriptor *pq_ex = NULL; 635 + struct ioat_dma_descriptor *hw; 636 + u32 offset = 0; 637 + int num_descs; 638 + int with_ext; 639 + int i, s; 640 + u16 idx; 641 + u8 op = result ? IOAT_OP_PQ_VAL : IOAT_OP_PQ; 642 + 643 + dev_dbg(to_dev(chan), "%s\n", __func__); 644 + /* the engine requires at least two sources (we provide 645 + * at least 1 implied source in the DMA_PREP_CONTINUE case) 646 + */ 647 + BUG_ON(src_cnt + dmaf_continue(flags) < 2); 648 + 649 + num_descs = ioat2_xferlen_to_descs(ioat, len); 650 + /* we need 2x the number of descriptors to cover greater than 3 651 + * sources 652 + */ 653 + if (src_cnt > 3 || flags & DMA_PREP_CONTINUE) { 654 + with_ext = 1; 655 + num_descs *= 2; 656 + } else 657 + with_ext = 0; 658 + 659 + /* completion writes from the raid engine may pass completion 660 + * writes from the legacy engine, so we need one extra null 661 + * (legacy) descriptor to ensure all completion writes arrive in 662 + * order. 663 + */ 664 + if (likely(num_descs) && 665 + ioat2_alloc_and_lock(&idx, ioat, num_descs+1) == 0) 666 + /* pass */; 667 + else 668 + return NULL; 669 + i = 0; 670 + do { 671 + struct ioat_raw_descriptor *descs[2]; 672 + size_t xfer_size = min_t(size_t, len, 1 << ioat->xfercap_log); 673 + 674 + desc = ioat2_get_ring_ent(ioat, idx + i); 675 + pq = desc->pq; 676 + 677 + /* save a branch by unconditionally retrieving the 678 + * extended descriptor pq_set_src() knows to not write 679 + * to it in the single descriptor case 680 + */ 681 + ext = ioat2_get_ring_ent(ioat, idx + i + with_ext); 682 + pq_ex = ext->pq_ex; 683 + 684 + descs[0] = (struct ioat_raw_descriptor *) pq; 685 + descs[1] = (struct ioat_raw_descriptor *) pq_ex; 686 + 687 + for (s = 0; s < src_cnt; s++) 688 + pq_set_src(descs, src[s], offset, scf[s], s); 689 + 690 + /* see the comment for dma_maxpq in include/linux/dmaengine.h */ 691 + if (dmaf_p_disabled_continue(flags)) 692 + pq_set_src(descs, dst[1], offset, 1, s++); 693 + else if (dmaf_continue(flags)) { 694 + pq_set_src(descs, dst[0], offset, 0, s++); 695 + pq_set_src(descs, dst[1], offset, 1, s++); 696 + pq_set_src(descs, dst[1], offset, 0, s++); 697 + } 698 + pq->size = xfer_size; 699 + pq->p_addr = dst[0] + offset; 700 + pq->q_addr = dst[1] + offset; 701 + pq->ctl = 0; 702 + pq->ctl_f.op = op; 703 + pq->ctl_f.src_cnt = src_cnt_to_hw(s); 704 + pq->ctl_f.p_disable = !!(flags & DMA_PREP_PQ_DISABLE_P); 705 + pq->ctl_f.q_disable = !!(flags & DMA_PREP_PQ_DISABLE_Q); 706 + 707 + len -= xfer_size; 708 + offset += xfer_size; 709 + } while ((i += 1 + with_ext) < num_descs); 710 + 711 + /* last pq descriptor carries the unmap parameters and fence bit */ 712 + desc->txd.flags = flags; 713 + desc->len = total_len; 714 + if (result) 715 + desc->result = result; 716 + pq->ctl_f.fence = !!(flags & DMA_PREP_FENCE); 717 + dump_pq_desc_dbg(ioat, desc, ext); 718 + 719 + /* completion descriptor carries interrupt bit */ 720 + compl_desc = ioat2_get_ring_ent(ioat, idx + i); 721 + compl_desc->txd.flags = flags & DMA_PREP_INTERRUPT; 722 + hw = compl_desc->hw; 723 + hw->ctl = 0; 724 + hw->ctl_f.null = 1; 725 + hw->ctl_f.int_en = !!(flags & DMA_PREP_INTERRUPT); 726 + hw->ctl_f.compl_write = 1; 727 + hw->size = NULL_DESC_BUFFER_SIZE; 728 + dump_desc_dbg(ioat, compl_desc); 729 + 730 + /* we leave the channel locked to ensure in order submission */ 731 + return &desc->txd; 732 + } 733 + 734 + static struct dma_async_tx_descriptor * 735 + ioat3_prep_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src, 736 + unsigned int src_cnt, const unsigned char *scf, size_t len, 737 + unsigned long flags) 738 + { 739 + /* handle the single source multiply case from the raid6 740 + * recovery path 741 + */ 742 + if (unlikely((flags & DMA_PREP_PQ_DISABLE_P) && src_cnt == 1)) { 743 + dma_addr_t single_source[2]; 744 + unsigned char single_source_coef[2]; 745 + 746 + BUG_ON(flags & DMA_PREP_PQ_DISABLE_Q); 747 + single_source[0] = src[0]; 748 + single_source[1] = src[0]; 749 + single_source_coef[0] = scf[0]; 750 + single_source_coef[1] = 0; 751 + 752 + return __ioat3_prep_pq_lock(chan, NULL, dst, single_source, 2, 753 + single_source_coef, len, flags); 754 + } else 755 + return __ioat3_prep_pq_lock(chan, NULL, dst, src, src_cnt, scf, 756 + len, flags); 757 + } 758 + 759 + struct dma_async_tx_descriptor * 760 + ioat3_prep_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src, 761 + unsigned int src_cnt, const unsigned char *scf, size_t len, 762 + enum sum_check_flags *pqres, unsigned long flags) 763 + { 764 + /* the cleanup routine only sets bits on validate failure, it 765 + * does not clear bits on validate success... so clear it here 766 + */ 767 + *pqres = 0; 768 + 769 + return __ioat3_prep_pq_lock(chan, pqres, pq, src, src_cnt, scf, len, 770 + flags); 771 + } 772 + 773 + static struct dma_async_tx_descriptor * 774 + ioat3_prep_pqxor(struct dma_chan *chan, dma_addr_t dst, dma_addr_t *src, 775 + unsigned int src_cnt, size_t len, unsigned long flags) 776 + { 777 + unsigned char scf[src_cnt]; 778 + dma_addr_t pq[2]; 779 + 780 + memset(scf, 0, src_cnt); 781 + flags |= DMA_PREP_PQ_DISABLE_Q; 782 + pq[0] = dst; 783 + pq[1] = ~0; 784 + 785 + return __ioat3_prep_pq_lock(chan, NULL, pq, src, src_cnt, scf, len, 786 + flags); 787 + } 788 + 789 + struct dma_async_tx_descriptor * 790 + ioat3_prep_pqxor_val(struct dma_chan *chan, dma_addr_t *src, 791 + unsigned int src_cnt, size_t len, 792 + enum sum_check_flags *result, unsigned long flags) 793 + { 794 + unsigned char scf[src_cnt]; 795 + dma_addr_t pq[2]; 796 + 797 + /* the cleanup routine only sets bits on validate failure, it 798 + * does not clear bits on validate success... so clear it here 799 + */ 800 + *result = 0; 801 + 802 + memset(scf, 0, src_cnt); 803 + flags |= DMA_PREP_PQ_DISABLE_Q; 804 + pq[0] = src[0]; 805 + pq[1] = ~0; 806 + 807 + return __ioat3_prep_pq_lock(chan, result, pq, &src[1], src_cnt - 1, scf, 808 + len, flags); 809 + } 810 + 811 + static struct dma_async_tx_descriptor * 812 + ioat3_prep_interrupt_lock(struct dma_chan *c, unsigned long flags) 813 + { 814 + struct ioat2_dma_chan *ioat = to_ioat2_chan(c); 815 + struct ioat_ring_ent *desc; 816 + struct ioat_dma_descriptor *hw; 817 + u16 idx; 818 + 819 + if (ioat2_alloc_and_lock(&idx, ioat, 1) == 0) 820 + desc = ioat2_get_ring_ent(ioat, idx); 821 + else 822 + return NULL; 823 + 824 + hw = desc->hw; 825 + hw->ctl = 0; 826 + hw->ctl_f.null = 1; 827 + hw->ctl_f.int_en = 1; 828 + hw->ctl_f.fence = !!(flags & DMA_PREP_FENCE); 829 + hw->ctl_f.compl_write = 1; 830 + hw->size = NULL_DESC_BUFFER_SIZE; 831 + hw->src_addr = 0; 832 + hw->dst_addr = 0; 833 + 834 + desc->txd.flags = flags; 835 + desc->len = 1; 836 + 837 + dump_desc_dbg(ioat, desc); 838 + 839 + /* we leave the channel locked to ensure in order submission */ 840 + return &desc->txd; 841 + } 842 + 843 + static void __devinit ioat3_dma_test_callback(void *dma_async_param) 844 + { 845 + struct completion *cmp = dma_async_param; 846 + 847 + complete(cmp); 848 + } 849 + 850 + #define IOAT_NUM_SRC_TEST 6 /* must be <= 8 */ 851 + static int __devinit ioat_xor_val_self_test(struct ioatdma_device *device) 852 + { 853 + int i, src_idx; 854 + struct page *dest; 855 + struct page *xor_srcs[IOAT_NUM_SRC_TEST]; 856 + struct page *xor_val_srcs[IOAT_NUM_SRC_TEST + 1]; 857 + dma_addr_t dma_srcs[IOAT_NUM_SRC_TEST + 1]; 858 + dma_addr_t dma_addr, dest_dma; 859 + struct dma_async_tx_descriptor *tx; 860 + struct dma_chan *dma_chan; 861 + dma_cookie_t cookie; 862 + u8 cmp_byte = 0; 863 + u32 cmp_word; 864 + u32 xor_val_result; 865 + int err = 0; 866 + struct completion cmp; 867 + unsigned long tmo; 868 + struct device *dev = &device->pdev->dev; 869 + struct dma_device *dma = &device->common; 870 + 871 + dev_dbg(dev, "%s\n", __func__); 872 + 873 + if (!dma_has_cap(DMA_XOR, dma->cap_mask)) 874 + return 0; 875 + 876 + for (src_idx = 0; src_idx < IOAT_NUM_SRC_TEST; src_idx++) { 877 + xor_srcs[src_idx] = alloc_page(GFP_KERNEL); 878 + if (!xor_srcs[src_idx]) { 879 + while (src_idx--) 880 + __free_page(xor_srcs[src_idx]); 881 + return -ENOMEM; 882 + } 883 + } 884 + 885 + dest = alloc_page(GFP_KERNEL); 886 + if (!dest) { 887 + while (src_idx--) 888 + __free_page(xor_srcs[src_idx]); 889 + return -ENOMEM; 890 + } 891 + 892 + /* Fill in src buffers */ 893 + for (src_idx = 0; src_idx < IOAT_NUM_SRC_TEST; src_idx++) { 894 + u8 *ptr = page_address(xor_srcs[src_idx]); 895 + for (i = 0; i < PAGE_SIZE; i++) 896 + ptr[i] = (1 << src_idx); 897 + } 898 + 899 + for (src_idx = 0; src_idx < IOAT_NUM_SRC_TEST; src_idx++) 900 + cmp_byte ^= (u8) (1 << src_idx); 901 + 902 + cmp_word = (cmp_byte << 24) | (cmp_byte << 16) | 903 + (cmp_byte << 8) | cmp_byte; 904 + 905 + memset(page_address(dest), 0, PAGE_SIZE); 906 + 907 + dma_chan = container_of(dma->channels.next, struct dma_chan, 908 + device_node); 909 + if (dma->device_alloc_chan_resources(dma_chan) < 1) { 910 + err = -ENODEV; 911 + goto out; 912 + } 913 + 914 + /* test xor */ 915 + dest_dma = dma_map_page(dev, dest, 0, PAGE_SIZE, DMA_FROM_DEVICE); 916 + for (i = 0; i < IOAT_NUM_SRC_TEST; i++) 917 + dma_srcs[i] = dma_map_page(dev, xor_srcs[i], 0, PAGE_SIZE, 918 + DMA_TO_DEVICE); 919 + tx = dma->device_prep_dma_xor(dma_chan, dest_dma, dma_srcs, 920 + IOAT_NUM_SRC_TEST, PAGE_SIZE, 921 + DMA_PREP_INTERRUPT); 922 + 923 + if (!tx) { 924 + dev_err(dev, "Self-test xor prep failed\n"); 925 + err = -ENODEV; 926 + goto free_resources; 927 + } 928 + 929 + async_tx_ack(tx); 930 + init_completion(&cmp); 931 + tx->callback = ioat3_dma_test_callback; 932 + tx->callback_param = &cmp; 933 + cookie = tx->tx_submit(tx); 934 + if (cookie < 0) { 935 + dev_err(dev, "Self-test xor setup failed\n"); 936 + err = -ENODEV; 937 + goto free_resources; 938 + } 939 + dma->device_issue_pending(dma_chan); 940 + 941 + tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); 942 + 943 + if (dma->device_is_tx_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) { 944 + dev_err(dev, "Self-test xor timed out\n"); 945 + err = -ENODEV; 946 + goto free_resources; 947 + } 948 + 949 + dma_sync_single_for_cpu(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE); 950 + for (i = 0; i < (PAGE_SIZE / sizeof(u32)); i++) { 951 + u32 *ptr = page_address(dest); 952 + if (ptr[i] != cmp_word) { 953 + dev_err(dev, "Self-test xor failed compare\n"); 954 + err = -ENODEV; 955 + goto free_resources; 956 + } 957 + } 958 + dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_TO_DEVICE); 959 + 960 + /* skip validate if the capability is not present */ 961 + if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask)) 962 + goto free_resources; 963 + 964 + /* validate the sources with the destintation page */ 965 + for (i = 0; i < IOAT_NUM_SRC_TEST; i++) 966 + xor_val_srcs[i] = xor_srcs[i]; 967 + xor_val_srcs[i] = dest; 968 + 969 + xor_val_result = 1; 970 + 971 + for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) 972 + dma_srcs[i] = dma_map_page(dev, xor_val_srcs[i], 0, PAGE_SIZE, 973 + DMA_TO_DEVICE); 974 + tx = dma->device_prep_dma_xor_val(dma_chan, dma_srcs, 975 + IOAT_NUM_SRC_TEST + 1, PAGE_SIZE, 976 + &xor_val_result, DMA_PREP_INTERRUPT); 977 + if (!tx) { 978 + dev_err(dev, "Self-test zero prep failed\n"); 979 + err = -ENODEV; 980 + goto free_resources; 981 + } 982 + 983 + async_tx_ack(tx); 984 + init_completion(&cmp); 985 + tx->callback = ioat3_dma_test_callback; 986 + tx->callback_param = &cmp; 987 + cookie = tx->tx_submit(tx); 988 + if (cookie < 0) { 989 + dev_err(dev, "Self-test zero setup failed\n"); 990 + err = -ENODEV; 991 + goto free_resources; 992 + } 993 + dma->device_issue_pending(dma_chan); 994 + 995 + tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); 996 + 997 + if (dma->device_is_tx_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) { 998 + dev_err(dev, "Self-test validate timed out\n"); 999 + err = -ENODEV; 1000 + goto free_resources; 1001 + } 1002 + 1003 + if (xor_val_result != 0) { 1004 + dev_err(dev, "Self-test validate failed compare\n"); 1005 + err = -ENODEV; 1006 + goto free_resources; 1007 + } 1008 + 1009 + /* skip memset if the capability is not present */ 1010 + if (!dma_has_cap(DMA_MEMSET, dma_chan->device->cap_mask)) 1011 + goto free_resources; 1012 + 1013 + /* test memset */ 1014 + dma_addr = dma_map_page(dev, dest, 0, 1015 + PAGE_SIZE, DMA_FROM_DEVICE); 1016 + tx = dma->device_prep_dma_memset(dma_chan, dma_addr, 0, PAGE_SIZE, 1017 + DMA_PREP_INTERRUPT); 1018 + if (!tx) { 1019 + dev_err(dev, "Self-test memset prep failed\n"); 1020 + err = -ENODEV; 1021 + goto free_resources; 1022 + } 1023 + 1024 + async_tx_ack(tx); 1025 + init_completion(&cmp); 1026 + tx->callback = ioat3_dma_test_callback; 1027 + tx->callback_param = &cmp; 1028 + cookie = tx->tx_submit(tx); 1029 + if (cookie < 0) { 1030 + dev_err(dev, "Self-test memset setup failed\n"); 1031 + err = -ENODEV; 1032 + goto free_resources; 1033 + } 1034 + dma->device_issue_pending(dma_chan); 1035 + 1036 + tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); 1037 + 1038 + if (dma->device_is_tx_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) { 1039 + dev_err(dev, "Self-test memset timed out\n"); 1040 + err = -ENODEV; 1041 + goto free_resources; 1042 + } 1043 + 1044 + for (i = 0; i < PAGE_SIZE/sizeof(u32); i++) { 1045 + u32 *ptr = page_address(dest); 1046 + if (ptr[i]) { 1047 + dev_err(dev, "Self-test memset failed compare\n"); 1048 + err = -ENODEV; 1049 + goto free_resources; 1050 + } 1051 + } 1052 + 1053 + /* test for non-zero parity sum */ 1054 + xor_val_result = 0; 1055 + for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) 1056 + dma_srcs[i] = dma_map_page(dev, xor_val_srcs[i], 0, PAGE_SIZE, 1057 + DMA_TO_DEVICE); 1058 + tx = dma->device_prep_dma_xor_val(dma_chan, dma_srcs, 1059 + IOAT_NUM_SRC_TEST + 1, PAGE_SIZE, 1060 + &xor_val_result, DMA_PREP_INTERRUPT); 1061 + if (!tx) { 1062 + dev_err(dev, "Self-test 2nd zero prep failed\n"); 1063 + err = -ENODEV; 1064 + goto free_resources; 1065 + } 1066 + 1067 + async_tx_ack(tx); 1068 + init_completion(&cmp); 1069 + tx->callback = ioat3_dma_test_callback; 1070 + tx->callback_param = &cmp; 1071 + cookie = tx->tx_submit(tx); 1072 + if (cookie < 0) { 1073 + dev_err(dev, "Self-test 2nd zero setup failed\n"); 1074 + err = -ENODEV; 1075 + goto free_resources; 1076 + } 1077 + dma->device_issue_pending(dma_chan); 1078 + 1079 + tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); 1080 + 1081 + if (dma->device_is_tx_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) { 1082 + dev_err(dev, "Self-test 2nd validate timed out\n"); 1083 + err = -ENODEV; 1084 + goto free_resources; 1085 + } 1086 + 1087 + if (xor_val_result != SUM_CHECK_P_RESULT) { 1088 + dev_err(dev, "Self-test validate failed compare\n"); 1089 + err = -ENODEV; 1090 + goto free_resources; 1091 + } 1092 + 1093 + free_resources: 1094 + dma->device_free_chan_resources(dma_chan); 1095 + out: 1096 + src_idx = IOAT_NUM_SRC_TEST; 1097 + while (src_idx--) 1098 + __free_page(xor_srcs[src_idx]); 1099 + __free_page(dest); 1100 + return err; 1101 + } 1102 + 1103 + static int __devinit ioat3_dma_self_test(struct ioatdma_device *device) 1104 + { 1105 + int rc = ioat_dma_self_test(device); 1106 + 1107 + if (rc) 1108 + return rc; 1109 + 1110 + rc = ioat_xor_val_self_test(device); 1111 + if (rc) 1112 + return rc; 1113 + 1114 + return 0; 1115 + } 1116 + 1117 + int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca) 1118 + { 1119 + struct pci_dev *pdev = device->pdev; 1120 + struct dma_device *dma; 1121 + struct dma_chan *c; 1122 + struct ioat_chan_common *chan; 1123 + bool is_raid_device = false; 1124 + int err; 1125 + u16 dev_id; 1126 + u32 cap; 1127 + 1128 + device->enumerate_channels = ioat2_enumerate_channels; 1129 + device->self_test = ioat3_dma_self_test; 1130 + dma = &device->common; 1131 + dma->device_prep_dma_memcpy = ioat2_dma_prep_memcpy_lock; 1132 + dma->device_issue_pending = ioat2_issue_pending; 1133 + dma->device_alloc_chan_resources = ioat2_alloc_chan_resources; 1134 + dma->device_free_chan_resources = ioat2_free_chan_resources; 1135 + 1136 + dma_cap_set(DMA_INTERRUPT, dma->cap_mask); 1137 + dma->device_prep_dma_interrupt = ioat3_prep_interrupt_lock; 1138 + 1139 + cap = readl(device->reg_base + IOAT_DMA_CAP_OFFSET); 1140 + if (cap & IOAT_CAP_XOR) { 1141 + is_raid_device = true; 1142 + dma->max_xor = 8; 1143 + dma->xor_align = 2; 1144 + 1145 + dma_cap_set(DMA_XOR, dma->cap_mask); 1146 + dma->device_prep_dma_xor = ioat3_prep_xor; 1147 + 1148 + dma_cap_set(DMA_XOR_VAL, dma->cap_mask); 1149 + dma->device_prep_dma_xor_val = ioat3_prep_xor_val; 1150 + } 1151 + if (cap & IOAT_CAP_PQ) { 1152 + is_raid_device = true; 1153 + dma_set_maxpq(dma, 8, 0); 1154 + dma->pq_align = 2; 1155 + 1156 + dma_cap_set(DMA_PQ, dma->cap_mask); 1157 + dma->device_prep_dma_pq = ioat3_prep_pq; 1158 + 1159 + dma_cap_set(DMA_PQ_VAL, dma->cap_mask); 1160 + dma->device_prep_dma_pq_val = ioat3_prep_pq_val; 1161 + 1162 + if (!(cap & IOAT_CAP_XOR)) { 1163 + dma->max_xor = 8; 1164 + dma->xor_align = 2; 1165 + 1166 + dma_cap_set(DMA_XOR, dma->cap_mask); 1167 + dma->device_prep_dma_xor = ioat3_prep_pqxor; 1168 + 1169 + dma_cap_set(DMA_XOR_VAL, dma->cap_mask); 1170 + dma->device_prep_dma_xor_val = ioat3_prep_pqxor_val; 1171 + } 1172 + } 1173 + if (is_raid_device && (cap & IOAT_CAP_FILL_BLOCK)) { 1174 + dma_cap_set(DMA_MEMSET, dma->cap_mask); 1175 + dma->device_prep_dma_memset = ioat3_prep_memset_lock; 1176 + } 1177 + 1178 + 1179 + if (is_raid_device) { 1180 + dma->device_is_tx_complete = ioat3_is_complete; 1181 + device->cleanup_tasklet = ioat3_cleanup_tasklet; 1182 + device->timer_fn = ioat3_timer_event; 1183 + } else { 1184 + dma->device_is_tx_complete = ioat2_is_complete; 1185 + device->cleanup_tasklet = ioat2_cleanup_tasklet; 1186 + device->timer_fn = ioat2_timer_event; 1187 + } 1188 + 1189 + /* -= IOAT ver.3 workarounds =- */ 1190 + /* Write CHANERRMSK_INT with 3E07h to mask out the errors 1191 + * that can cause stability issues for IOAT ver.3 1192 + */ 1193 + pci_write_config_dword(pdev, IOAT_PCI_CHANERRMASK_INT_OFFSET, 0x3e07); 1194 + 1195 + /* Clear DMAUNCERRSTS Cfg-Reg Parity Error status bit 1196 + * (workaround for spurious config parity error after restart) 1197 + */ 1198 + pci_read_config_word(pdev, IOAT_PCI_DEVICE_ID_OFFSET, &dev_id); 1199 + if (dev_id == PCI_DEVICE_ID_INTEL_IOAT_TBG0) 1200 + pci_write_config_dword(pdev, IOAT_PCI_DMAUNCERRSTS_OFFSET, 0x10); 1201 + 1202 + err = ioat_probe(device); 1203 + if (err) 1204 + return err; 1205 + ioat_set_tcp_copy_break(262144); 1206 + 1207 + list_for_each_entry(c, &dma->channels, device_node) { 1208 + chan = to_chan_common(c); 1209 + writel(IOAT_DMA_DCA_ANY_CPU, 1210 + chan->reg_base + IOAT_DCACTRL_OFFSET); 1211 + } 1212 + 1213 + err = ioat_register(device); 1214 + if (err) 1215 + return err; 1216 + 1217 + ioat_kobject_add(device, &ioat2_ktype); 1218 + 1219 + if (dca) 1220 + device->dca = ioat3_dca_init(pdev, device->reg_base); 1221 + 1222 + return 0; 1223 + }
+215
drivers/dma/ioat/hw.h
··· 1 + /* 2 + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms of the GNU General Public License as published by the Free 6 + * Software Foundation; either version 2 of the License, or (at your option) 7 + * any later version. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program; if not, write to the Free Software Foundation, Inc., 59 16 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 + * 18 + * The full GNU General Public License is included in this distribution in the 19 + * file called COPYING. 20 + */ 21 + #ifndef _IOAT_HW_H_ 22 + #define _IOAT_HW_H_ 23 + 24 + /* PCI Configuration Space Values */ 25 + #define IOAT_PCI_VID 0x8086 26 + #define IOAT_MMIO_BAR 0 27 + 28 + /* CB device ID's */ 29 + #define IOAT_PCI_DID_5000 0x1A38 30 + #define IOAT_PCI_DID_CNB 0x360B 31 + #define IOAT_PCI_DID_SCNB 0x65FF 32 + #define IOAT_PCI_DID_SNB 0x402F 33 + 34 + #define IOAT_PCI_RID 0x00 35 + #define IOAT_PCI_SVID 0x8086 36 + #define IOAT_PCI_SID 0x8086 37 + #define IOAT_VER_1_2 0x12 /* Version 1.2 */ 38 + #define IOAT_VER_2_0 0x20 /* Version 2.0 */ 39 + #define IOAT_VER_3_0 0x30 /* Version 3.0 */ 40 + #define IOAT_VER_3_2 0x32 /* Version 3.2 */ 41 + 42 + struct ioat_dma_descriptor { 43 + uint32_t size; 44 + union { 45 + uint32_t ctl; 46 + struct { 47 + unsigned int int_en:1; 48 + unsigned int src_snoop_dis:1; 49 + unsigned int dest_snoop_dis:1; 50 + unsigned int compl_write:1; 51 + unsigned int fence:1; 52 + unsigned int null:1; 53 + unsigned int src_brk:1; 54 + unsigned int dest_brk:1; 55 + unsigned int bundle:1; 56 + unsigned int dest_dca:1; 57 + unsigned int hint:1; 58 + unsigned int rsvd2:13; 59 + #define IOAT_OP_COPY 0x00 60 + unsigned int op:8; 61 + } ctl_f; 62 + }; 63 + uint64_t src_addr; 64 + uint64_t dst_addr; 65 + uint64_t next; 66 + uint64_t rsv1; 67 + uint64_t rsv2; 68 + /* store some driver data in an unused portion of the descriptor */ 69 + union { 70 + uint64_t user1; 71 + uint64_t tx_cnt; 72 + }; 73 + uint64_t user2; 74 + }; 75 + 76 + struct ioat_fill_descriptor { 77 + uint32_t size; 78 + union { 79 + uint32_t ctl; 80 + struct { 81 + unsigned int int_en:1; 82 + unsigned int rsvd:1; 83 + unsigned int dest_snoop_dis:1; 84 + unsigned int compl_write:1; 85 + unsigned int fence:1; 86 + unsigned int rsvd2:2; 87 + unsigned int dest_brk:1; 88 + unsigned int bundle:1; 89 + unsigned int rsvd4:15; 90 + #define IOAT_OP_FILL 0x01 91 + unsigned int op:8; 92 + } ctl_f; 93 + }; 94 + uint64_t src_data; 95 + uint64_t dst_addr; 96 + uint64_t next; 97 + uint64_t rsv1; 98 + uint64_t next_dst_addr; 99 + uint64_t user1; 100 + uint64_t user2; 101 + }; 102 + 103 + struct ioat_xor_descriptor { 104 + uint32_t size; 105 + union { 106 + uint32_t ctl; 107 + struct { 108 + unsigned int int_en:1; 109 + unsigned int src_snoop_dis:1; 110 + unsigned int dest_snoop_dis:1; 111 + unsigned int compl_write:1; 112 + unsigned int fence:1; 113 + unsigned int src_cnt:3; 114 + unsigned int bundle:1; 115 + unsigned int dest_dca:1; 116 + unsigned int hint:1; 117 + unsigned int rsvd:13; 118 + #define IOAT_OP_XOR 0x87 119 + #define IOAT_OP_XOR_VAL 0x88 120 + unsigned int op:8; 121 + } ctl_f; 122 + }; 123 + uint64_t src_addr; 124 + uint64_t dst_addr; 125 + uint64_t next; 126 + uint64_t src_addr2; 127 + uint64_t src_addr3; 128 + uint64_t src_addr4; 129 + uint64_t src_addr5; 130 + }; 131 + 132 + struct ioat_xor_ext_descriptor { 133 + uint64_t src_addr6; 134 + uint64_t src_addr7; 135 + uint64_t src_addr8; 136 + uint64_t next; 137 + uint64_t rsvd[4]; 138 + }; 139 + 140 + struct ioat_pq_descriptor { 141 + uint32_t size; 142 + union { 143 + uint32_t ctl; 144 + struct { 145 + unsigned int int_en:1; 146 + unsigned int src_snoop_dis:1; 147 + unsigned int dest_snoop_dis:1; 148 + unsigned int compl_write:1; 149 + unsigned int fence:1; 150 + unsigned int src_cnt:3; 151 + unsigned int bundle:1; 152 + unsigned int dest_dca:1; 153 + unsigned int hint:1; 154 + unsigned int p_disable:1; 155 + unsigned int q_disable:1; 156 + unsigned int rsvd:11; 157 + #define IOAT_OP_PQ 0x89 158 + #define IOAT_OP_PQ_VAL 0x8a 159 + unsigned int op:8; 160 + } ctl_f; 161 + }; 162 + uint64_t src_addr; 163 + uint64_t p_addr; 164 + uint64_t next; 165 + uint64_t src_addr2; 166 + uint64_t src_addr3; 167 + uint8_t coef[8]; 168 + uint64_t q_addr; 169 + }; 170 + 171 + struct ioat_pq_ext_descriptor { 172 + uint64_t src_addr4; 173 + uint64_t src_addr5; 174 + uint64_t src_addr6; 175 + uint64_t next; 176 + uint64_t src_addr7; 177 + uint64_t src_addr8; 178 + uint64_t rsvd[2]; 179 + }; 180 + 181 + struct ioat_pq_update_descriptor { 182 + uint32_t size; 183 + union { 184 + uint32_t ctl; 185 + struct { 186 + unsigned int int_en:1; 187 + unsigned int src_snoop_dis:1; 188 + unsigned int dest_snoop_dis:1; 189 + unsigned int compl_write:1; 190 + unsigned int fence:1; 191 + unsigned int src_cnt:3; 192 + unsigned int bundle:1; 193 + unsigned int dest_dca:1; 194 + unsigned int hint:1; 195 + unsigned int p_disable:1; 196 + unsigned int q_disable:1; 197 + unsigned int rsvd:3; 198 + unsigned int coef:8; 199 + #define IOAT_OP_PQ_UP 0x8b 200 + unsigned int op:8; 201 + } ctl_f; 202 + }; 203 + uint64_t src_addr; 204 + uint64_t p_addr; 205 + uint64_t next; 206 + uint64_t src_addr2; 207 + uint64_t p_src; 208 + uint64_t q_src; 209 + uint64_t q_addr; 210 + }; 211 + 212 + struct ioat_raw_descriptor { 213 + uint64_t field[8]; 214 + }; 215 + #endif
+210
drivers/dma/ioat/pci.c
··· 1 + /* 2 + * Intel I/OAT DMA Linux driver 3 + * Copyright(c) 2007 - 2009 Intel Corporation. 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program; if not, write to the Free Software Foundation, Inc., 16 + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 17 + * 18 + * The full GNU General Public License is included in this distribution in 19 + * the file called "COPYING". 20 + * 21 + */ 22 + 23 + /* 24 + * This driver supports an Intel I/OAT DMA engine, which does asynchronous 25 + * copy operations. 26 + */ 27 + 28 + #include <linux/init.h> 29 + #include <linux/module.h> 30 + #include <linux/pci.h> 31 + #include <linux/interrupt.h> 32 + #include <linux/dca.h> 33 + #include "dma.h" 34 + #include "dma_v2.h" 35 + #include "registers.h" 36 + #include "hw.h" 37 + 38 + MODULE_VERSION(IOAT_DMA_VERSION); 39 + MODULE_LICENSE("Dual BSD/GPL"); 40 + MODULE_AUTHOR("Intel Corporation"); 41 + 42 + static struct pci_device_id ioat_pci_tbl[] = { 43 + /* I/OAT v1 platforms */ 44 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT) }, 45 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_CNB) }, 46 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SCNB) }, 47 + { PCI_VDEVICE(UNISYS, PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR) }, 48 + 49 + /* I/OAT v2 platforms */ 50 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB) }, 51 + 52 + /* I/OAT v3 platforms */ 53 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG0) }, 54 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG1) }, 55 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG2) }, 56 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG3) }, 57 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG4) }, 58 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG5) }, 59 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG6) }, 60 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG7) }, 61 + 62 + /* I/OAT v3.2 platforms */ 63 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF0) }, 64 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF1) }, 65 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF2) }, 66 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF3) }, 67 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF4) }, 68 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF5) }, 69 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF6) }, 70 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF7) }, 71 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF8) }, 72 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF9) }, 73 + 74 + { 0, } 75 + }; 76 + MODULE_DEVICE_TABLE(pci, ioat_pci_tbl); 77 + 78 + static int __devinit ioat_pci_probe(struct pci_dev *pdev, 79 + const struct pci_device_id *id); 80 + static void __devexit ioat_remove(struct pci_dev *pdev); 81 + 82 + static int ioat_dca_enabled = 1; 83 + module_param(ioat_dca_enabled, int, 0644); 84 + MODULE_PARM_DESC(ioat_dca_enabled, "control support of dca service (default: 1)"); 85 + 86 + struct kmem_cache *ioat2_cache; 87 + 88 + #define DRV_NAME "ioatdma" 89 + 90 + static struct pci_driver ioat_pci_driver = { 91 + .name = DRV_NAME, 92 + .id_table = ioat_pci_tbl, 93 + .probe = ioat_pci_probe, 94 + .remove = __devexit_p(ioat_remove), 95 + }; 96 + 97 + static struct ioatdma_device * 98 + alloc_ioatdma(struct pci_dev *pdev, void __iomem *iobase) 99 + { 100 + struct device *dev = &pdev->dev; 101 + struct ioatdma_device *d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL); 102 + 103 + if (!d) 104 + return NULL; 105 + d->pdev = pdev; 106 + d->reg_base = iobase; 107 + return d; 108 + } 109 + 110 + static int __devinit ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 111 + { 112 + void __iomem * const *iomap; 113 + struct device *dev = &pdev->dev; 114 + struct ioatdma_device *device; 115 + int err; 116 + 117 + err = pcim_enable_device(pdev); 118 + if (err) 119 + return err; 120 + 121 + err = pcim_iomap_regions(pdev, 1 << IOAT_MMIO_BAR, DRV_NAME); 122 + if (err) 123 + return err; 124 + iomap = pcim_iomap_table(pdev); 125 + if (!iomap) 126 + return -ENOMEM; 127 + 128 + err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); 129 + if (err) 130 + err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 131 + if (err) 132 + return err; 133 + 134 + err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); 135 + if (err) 136 + err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); 137 + if (err) 138 + return err; 139 + 140 + device = devm_kzalloc(dev, sizeof(*device), GFP_KERNEL); 141 + if (!device) 142 + return -ENOMEM; 143 + 144 + pci_set_master(pdev); 145 + 146 + device = alloc_ioatdma(pdev, iomap[IOAT_MMIO_BAR]); 147 + if (!device) 148 + return -ENOMEM; 149 + pci_set_drvdata(pdev, device); 150 + 151 + device->version = readb(device->reg_base + IOAT_VER_OFFSET); 152 + if (device->version == IOAT_VER_1_2) 153 + err = ioat1_dma_probe(device, ioat_dca_enabled); 154 + else if (device->version == IOAT_VER_2_0) 155 + err = ioat2_dma_probe(device, ioat_dca_enabled); 156 + else if (device->version >= IOAT_VER_3_0) 157 + err = ioat3_dma_probe(device, ioat_dca_enabled); 158 + else 159 + return -ENODEV; 160 + 161 + if (err) { 162 + dev_err(dev, "Intel(R) I/OAT DMA Engine init failed\n"); 163 + return -ENODEV; 164 + } 165 + 166 + return 0; 167 + } 168 + 169 + static void __devexit ioat_remove(struct pci_dev *pdev) 170 + { 171 + struct ioatdma_device *device = pci_get_drvdata(pdev); 172 + 173 + if (!device) 174 + return; 175 + 176 + dev_err(&pdev->dev, "Removing dma and dca services\n"); 177 + if (device->dca) { 178 + unregister_dca_provider(device->dca, &pdev->dev); 179 + free_dca_provider(device->dca); 180 + device->dca = NULL; 181 + } 182 + ioat_dma_remove(device); 183 + } 184 + 185 + static int __init ioat_init_module(void) 186 + { 187 + int err; 188 + 189 + pr_info("%s: Intel(R) QuickData Technology Driver %s\n", 190 + DRV_NAME, IOAT_DMA_VERSION); 191 + 192 + ioat2_cache = kmem_cache_create("ioat2", sizeof(struct ioat_ring_ent), 193 + 0, SLAB_HWCACHE_ALIGN, NULL); 194 + if (!ioat2_cache) 195 + return -ENOMEM; 196 + 197 + err = pci_register_driver(&ioat_pci_driver); 198 + if (err) 199 + kmem_cache_destroy(ioat2_cache); 200 + 201 + return err; 202 + } 203 + module_init(ioat_init_module); 204 + 205 + static void __exit ioat_exit_module(void) 206 + { 207 + pci_unregister_driver(&ioat_pci_driver); 208 + kmem_cache_destroy(ioat2_cache); 209 + } 210 + module_exit(ioat_exit_module);
+8 -5
drivers/dma/ioat_dca.c drivers/dma/ioat/dca.c
··· 33 33 #define cpu_physical_id(cpu) (cpuid_ebx(1) >> 24) 34 34 #endif 35 35 36 - #include "ioatdma.h" 37 - #include "ioatdma_registers.h" 36 + #include "dma.h" 37 + #include "registers.h" 38 38 39 39 /* 40 40 * Bit 7 of a tag map entry is the "valid" bit, if it is set then bits 0:6 ··· 242 242 }; 243 243 244 244 245 - struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase) 245 + struct dca_provider * __devinit 246 + ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase) 246 247 { 247 248 struct dca_provider *dca; 248 249 struct ioat_dca_priv *ioatdca; ··· 408 407 return slots; 409 408 } 410 409 411 - struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase) 410 + struct dca_provider * __devinit 411 + ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase) 412 412 { 413 413 struct dca_provider *dca; 414 414 struct ioat_dca_priv *ioatdca; ··· 604 602 return slots; 605 603 } 606 604 607 - struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase) 605 + struct dca_provider * __devinit 606 + ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase) 608 607 { 609 608 struct dca_provider *dca; 610 609 struct ioat_dca_priv *ioatdca;
-1741
drivers/dma/ioat_dma.c
··· 1 - /* 2 - * Intel I/OAT DMA Linux driver 3 - * Copyright(c) 2004 - 2009 Intel Corporation. 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms and conditions of the GNU General Public License, 7 - * version 2, as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope that it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program; if not, write to the Free Software Foundation, Inc., 16 - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 17 - * 18 - * The full GNU General Public License is included in this distribution in 19 - * the file called "COPYING". 20 - * 21 - */ 22 - 23 - /* 24 - * This driver supports an Intel I/OAT DMA engine, which does asynchronous 25 - * copy operations. 26 - */ 27 - 28 - #include <linux/init.h> 29 - #include <linux/module.h> 30 - #include <linux/pci.h> 31 - #include <linux/interrupt.h> 32 - #include <linux/dmaengine.h> 33 - #include <linux/delay.h> 34 - #include <linux/dma-mapping.h> 35 - #include <linux/workqueue.h> 36 - #include <linux/i7300_idle.h> 37 - #include "ioatdma.h" 38 - #include "ioatdma_registers.h" 39 - #include "ioatdma_hw.h" 40 - 41 - #define to_ioat_chan(chan) container_of(chan, struct ioat_dma_chan, common) 42 - #define to_ioatdma_device(dev) container_of(dev, struct ioatdma_device, common) 43 - #define to_ioat_desc(lh) container_of(lh, struct ioat_desc_sw, node) 44 - #define tx_to_ioat_desc(tx) container_of(tx, struct ioat_desc_sw, async_tx) 45 - 46 - #define chan_num(ch) ((int)((ch)->reg_base - (ch)->device->reg_base) / 0x80) 47 - static int ioat_pending_level = 4; 48 - module_param(ioat_pending_level, int, 0644); 49 - MODULE_PARM_DESC(ioat_pending_level, 50 - "high-water mark for pushing ioat descriptors (default: 4)"); 51 - 52 - #define RESET_DELAY msecs_to_jiffies(100) 53 - #define WATCHDOG_DELAY round_jiffies(msecs_to_jiffies(2000)) 54 - static void ioat_dma_chan_reset_part2(struct work_struct *work); 55 - static void ioat_dma_chan_watchdog(struct work_struct *work); 56 - 57 - /* 58 - * workaround for IOAT ver.3.0 null descriptor issue 59 - * (channel returns error when size is 0) 60 - */ 61 - #define NULL_DESC_BUFFER_SIZE 1 62 - 63 - /* internal functions */ 64 - static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan); 65 - static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan); 66 - 67 - static struct ioat_desc_sw * 68 - ioat1_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan); 69 - static struct ioat_desc_sw * 70 - ioat2_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan); 71 - 72 - static inline struct ioat_dma_chan *ioat_lookup_chan_by_index( 73 - struct ioatdma_device *device, 74 - int index) 75 - { 76 - return device->idx[index]; 77 - } 78 - 79 - /** 80 - * ioat_dma_do_interrupt - handler used for single vector interrupt mode 81 - * @irq: interrupt id 82 - * @data: interrupt data 83 - */ 84 - static irqreturn_t ioat_dma_do_interrupt(int irq, void *data) 85 - { 86 - struct ioatdma_device *instance = data; 87 - struct ioat_dma_chan *ioat_chan; 88 - unsigned long attnstatus; 89 - int bit; 90 - u8 intrctrl; 91 - 92 - intrctrl = readb(instance->reg_base + IOAT_INTRCTRL_OFFSET); 93 - 94 - if (!(intrctrl & IOAT_INTRCTRL_MASTER_INT_EN)) 95 - return IRQ_NONE; 96 - 97 - if (!(intrctrl & IOAT_INTRCTRL_INT_STATUS)) { 98 - writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET); 99 - return IRQ_NONE; 100 - } 101 - 102 - attnstatus = readl(instance->reg_base + IOAT_ATTNSTATUS_OFFSET); 103 - for_each_bit(bit, &attnstatus, BITS_PER_LONG) { 104 - ioat_chan = ioat_lookup_chan_by_index(instance, bit); 105 - tasklet_schedule(&ioat_chan->cleanup_task); 106 - } 107 - 108 - writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET); 109 - return IRQ_HANDLED; 110 - } 111 - 112 - /** 113 - * ioat_dma_do_interrupt_msix - handler used for vector-per-channel interrupt mode 114 - * @irq: interrupt id 115 - * @data: interrupt data 116 - */ 117 - static irqreturn_t ioat_dma_do_interrupt_msix(int irq, void *data) 118 - { 119 - struct ioat_dma_chan *ioat_chan = data; 120 - 121 - tasklet_schedule(&ioat_chan->cleanup_task); 122 - 123 - return IRQ_HANDLED; 124 - } 125 - 126 - static void ioat_dma_cleanup_tasklet(unsigned long data); 127 - 128 - /** 129 - * ioat_dma_enumerate_channels - find and initialize the device's channels 130 - * @device: the device to be enumerated 131 - */ 132 - static int ioat_dma_enumerate_channels(struct ioatdma_device *device) 133 - { 134 - u8 xfercap_scale; 135 - u32 xfercap; 136 - int i; 137 - struct ioat_dma_chan *ioat_chan; 138 - 139 - /* 140 - * IOAT ver.3 workarounds 141 - */ 142 - if (device->version == IOAT_VER_3_0) { 143 - u32 chan_err_mask; 144 - u16 dev_id; 145 - u32 dmauncerrsts; 146 - 147 - /* 148 - * Write CHANERRMSK_INT with 3E07h to mask out the errors 149 - * that can cause stability issues for IOAT ver.3 150 - */ 151 - chan_err_mask = 0x3E07; 152 - pci_write_config_dword(device->pdev, 153 - IOAT_PCI_CHANERRMASK_INT_OFFSET, 154 - chan_err_mask); 155 - 156 - /* 157 - * Clear DMAUNCERRSTS Cfg-Reg Parity Error status bit 158 - * (workaround for spurious config parity error after restart) 159 - */ 160 - pci_read_config_word(device->pdev, 161 - IOAT_PCI_DEVICE_ID_OFFSET, 162 - &dev_id); 163 - if (dev_id == PCI_DEVICE_ID_INTEL_IOAT_TBG0) { 164 - dmauncerrsts = 0x10; 165 - pci_write_config_dword(device->pdev, 166 - IOAT_PCI_DMAUNCERRSTS_OFFSET, 167 - dmauncerrsts); 168 - } 169 - } 170 - 171 - device->common.chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET); 172 - xfercap_scale = readb(device->reg_base + IOAT_XFERCAP_OFFSET); 173 - xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale)); 174 - 175 - #ifdef CONFIG_I7300_IDLE_IOAT_CHANNEL 176 - if (i7300_idle_platform_probe(NULL, NULL, 1) == 0) { 177 - device->common.chancnt--; 178 - } 179 - #endif 180 - for (i = 0; i < device->common.chancnt; i++) { 181 - ioat_chan = kzalloc(sizeof(*ioat_chan), GFP_KERNEL); 182 - if (!ioat_chan) { 183 - device->common.chancnt = i; 184 - break; 185 - } 186 - 187 - ioat_chan->device = device; 188 - ioat_chan->reg_base = device->reg_base + (0x80 * (i + 1)); 189 - ioat_chan->xfercap = xfercap; 190 - ioat_chan->desccount = 0; 191 - INIT_DELAYED_WORK(&ioat_chan->work, ioat_dma_chan_reset_part2); 192 - if (ioat_chan->device->version == IOAT_VER_2_0) 193 - writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE | 194 - IOAT_DMA_DCA_ANY_CPU, 195 - ioat_chan->reg_base + IOAT_DCACTRL_OFFSET); 196 - else if (ioat_chan->device->version == IOAT_VER_3_0) 197 - writel(IOAT_DMA_DCA_ANY_CPU, 198 - ioat_chan->reg_base + IOAT_DCACTRL_OFFSET); 199 - spin_lock_init(&ioat_chan->cleanup_lock); 200 - spin_lock_init(&ioat_chan->desc_lock); 201 - INIT_LIST_HEAD(&ioat_chan->free_desc); 202 - INIT_LIST_HEAD(&ioat_chan->used_desc); 203 - /* This should be made common somewhere in dmaengine.c */ 204 - ioat_chan->common.device = &device->common; 205 - list_add_tail(&ioat_chan->common.device_node, 206 - &device->common.channels); 207 - device->idx[i] = ioat_chan; 208 - tasklet_init(&ioat_chan->cleanup_task, 209 - ioat_dma_cleanup_tasklet, 210 - (unsigned long) ioat_chan); 211 - tasklet_disable(&ioat_chan->cleanup_task); 212 - } 213 - return device->common.chancnt; 214 - } 215 - 216 - /** 217 - * ioat_dma_memcpy_issue_pending - push potentially unrecognized appended 218 - * descriptors to hw 219 - * @chan: DMA channel handle 220 - */ 221 - static inline void __ioat1_dma_memcpy_issue_pending( 222 - struct ioat_dma_chan *ioat_chan) 223 - { 224 - ioat_chan->pending = 0; 225 - writeb(IOAT_CHANCMD_APPEND, ioat_chan->reg_base + IOAT1_CHANCMD_OFFSET); 226 - } 227 - 228 - static void ioat1_dma_memcpy_issue_pending(struct dma_chan *chan) 229 - { 230 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 231 - 232 - if (ioat_chan->pending > 0) { 233 - spin_lock_bh(&ioat_chan->desc_lock); 234 - __ioat1_dma_memcpy_issue_pending(ioat_chan); 235 - spin_unlock_bh(&ioat_chan->desc_lock); 236 - } 237 - } 238 - 239 - static inline void __ioat2_dma_memcpy_issue_pending( 240 - struct ioat_dma_chan *ioat_chan) 241 - { 242 - ioat_chan->pending = 0; 243 - writew(ioat_chan->dmacount, 244 - ioat_chan->reg_base + IOAT_CHAN_DMACOUNT_OFFSET); 245 - } 246 - 247 - static void ioat2_dma_memcpy_issue_pending(struct dma_chan *chan) 248 - { 249 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 250 - 251 - if (ioat_chan->pending > 0) { 252 - spin_lock_bh(&ioat_chan->desc_lock); 253 - __ioat2_dma_memcpy_issue_pending(ioat_chan); 254 - spin_unlock_bh(&ioat_chan->desc_lock); 255 - } 256 - } 257 - 258 - 259 - /** 260 - * ioat_dma_chan_reset_part2 - reinit the channel after a reset 261 - */ 262 - static void ioat_dma_chan_reset_part2(struct work_struct *work) 263 - { 264 - struct ioat_dma_chan *ioat_chan = 265 - container_of(work, struct ioat_dma_chan, work.work); 266 - struct ioat_desc_sw *desc; 267 - 268 - spin_lock_bh(&ioat_chan->cleanup_lock); 269 - spin_lock_bh(&ioat_chan->desc_lock); 270 - 271 - ioat_chan->completion_virt->low = 0; 272 - ioat_chan->completion_virt->high = 0; 273 - ioat_chan->pending = 0; 274 - 275 - /* 276 - * count the descriptors waiting, and be sure to do it 277 - * right for both the CB1 line and the CB2 ring 278 - */ 279 - ioat_chan->dmacount = 0; 280 - if (ioat_chan->used_desc.prev) { 281 - desc = to_ioat_desc(ioat_chan->used_desc.prev); 282 - do { 283 - ioat_chan->dmacount++; 284 - desc = to_ioat_desc(desc->node.next); 285 - } while (&desc->node != ioat_chan->used_desc.next); 286 - } 287 - 288 - /* 289 - * write the new starting descriptor address 290 - * this puts channel engine into ARMED state 291 - */ 292 - desc = to_ioat_desc(ioat_chan->used_desc.prev); 293 - switch (ioat_chan->device->version) { 294 - case IOAT_VER_1_2: 295 - writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF, 296 - ioat_chan->reg_base + IOAT1_CHAINADDR_OFFSET_LOW); 297 - writel(((u64) desc->async_tx.phys) >> 32, 298 - ioat_chan->reg_base + IOAT1_CHAINADDR_OFFSET_HIGH); 299 - 300 - writeb(IOAT_CHANCMD_START, ioat_chan->reg_base 301 - + IOAT_CHANCMD_OFFSET(ioat_chan->device->version)); 302 - break; 303 - case IOAT_VER_2_0: 304 - writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF, 305 - ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_LOW); 306 - writel(((u64) desc->async_tx.phys) >> 32, 307 - ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_HIGH); 308 - 309 - /* tell the engine to go with what's left to be done */ 310 - writew(ioat_chan->dmacount, 311 - ioat_chan->reg_base + IOAT_CHAN_DMACOUNT_OFFSET); 312 - 313 - break; 314 - } 315 - dev_err(&ioat_chan->device->pdev->dev, 316 - "chan%d reset - %d descs waiting, %d total desc\n", 317 - chan_num(ioat_chan), ioat_chan->dmacount, ioat_chan->desccount); 318 - 319 - spin_unlock_bh(&ioat_chan->desc_lock); 320 - spin_unlock_bh(&ioat_chan->cleanup_lock); 321 - } 322 - 323 - /** 324 - * ioat_dma_reset_channel - restart a channel 325 - * @ioat_chan: IOAT DMA channel handle 326 - */ 327 - static void ioat_dma_reset_channel(struct ioat_dma_chan *ioat_chan) 328 - { 329 - u32 chansts, chanerr; 330 - 331 - if (!ioat_chan->used_desc.prev) 332 - return; 333 - 334 - chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET); 335 - chansts = (ioat_chan->completion_virt->low 336 - & IOAT_CHANSTS_DMA_TRANSFER_STATUS); 337 - if (chanerr) { 338 - dev_err(&ioat_chan->device->pdev->dev, 339 - "chan%d, CHANSTS = 0x%08x CHANERR = 0x%04x, clearing\n", 340 - chan_num(ioat_chan), chansts, chanerr); 341 - writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET); 342 - } 343 - 344 - /* 345 - * whack it upside the head with a reset 346 - * and wait for things to settle out. 347 - * force the pending count to a really big negative 348 - * to make sure no one forces an issue_pending 349 - * while we're waiting. 350 - */ 351 - 352 - spin_lock_bh(&ioat_chan->desc_lock); 353 - ioat_chan->pending = INT_MIN; 354 - writeb(IOAT_CHANCMD_RESET, 355 - ioat_chan->reg_base 356 - + IOAT_CHANCMD_OFFSET(ioat_chan->device->version)); 357 - spin_unlock_bh(&ioat_chan->desc_lock); 358 - 359 - /* schedule the 2nd half instead of sleeping a long time */ 360 - schedule_delayed_work(&ioat_chan->work, RESET_DELAY); 361 - } 362 - 363 - /** 364 - * ioat_dma_chan_watchdog - watch for stuck channels 365 - */ 366 - static void ioat_dma_chan_watchdog(struct work_struct *work) 367 - { 368 - struct ioatdma_device *device = 369 - container_of(work, struct ioatdma_device, work.work); 370 - struct ioat_dma_chan *ioat_chan; 371 - int i; 372 - 373 - union { 374 - u64 full; 375 - struct { 376 - u32 low; 377 - u32 high; 378 - }; 379 - } completion_hw; 380 - unsigned long compl_desc_addr_hw; 381 - 382 - for (i = 0; i < device->common.chancnt; i++) { 383 - ioat_chan = ioat_lookup_chan_by_index(device, i); 384 - 385 - if (ioat_chan->device->version == IOAT_VER_1_2 386 - /* have we started processing anything yet */ 387 - && ioat_chan->last_completion 388 - /* have we completed any since last watchdog cycle? */ 389 - && (ioat_chan->last_completion == 390 - ioat_chan->watchdog_completion) 391 - /* has TCP stuck on one cookie since last watchdog? */ 392 - && (ioat_chan->watchdog_tcp_cookie == 393 - ioat_chan->watchdog_last_tcp_cookie) 394 - && (ioat_chan->watchdog_tcp_cookie != 395 - ioat_chan->completed_cookie) 396 - /* is there something in the chain to be processed? */ 397 - /* CB1 chain always has at least the last one processed */ 398 - && (ioat_chan->used_desc.prev != ioat_chan->used_desc.next) 399 - && ioat_chan->pending == 0) { 400 - 401 - /* 402 - * check CHANSTS register for completed 403 - * descriptor address. 404 - * if it is different than completion writeback, 405 - * it is not zero 406 - * and it has changed since the last watchdog 407 - * we can assume that channel 408 - * is still working correctly 409 - * and the problem is in completion writeback. 410 - * update completion writeback 411 - * with actual CHANSTS value 412 - * else 413 - * try resetting the channel 414 - */ 415 - 416 - completion_hw.low = readl(ioat_chan->reg_base + 417 - IOAT_CHANSTS_OFFSET_LOW(ioat_chan->device->version)); 418 - completion_hw.high = readl(ioat_chan->reg_base + 419 - IOAT_CHANSTS_OFFSET_HIGH(ioat_chan->device->version)); 420 - #if (BITS_PER_LONG == 64) 421 - compl_desc_addr_hw = 422 - completion_hw.full 423 - & IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR; 424 - #else 425 - compl_desc_addr_hw = 426 - completion_hw.low & IOAT_LOW_COMPLETION_MASK; 427 - #endif 428 - 429 - if ((compl_desc_addr_hw != 0) 430 - && (compl_desc_addr_hw != ioat_chan->watchdog_completion) 431 - && (compl_desc_addr_hw != ioat_chan->last_compl_desc_addr_hw)) { 432 - ioat_chan->last_compl_desc_addr_hw = compl_desc_addr_hw; 433 - ioat_chan->completion_virt->low = completion_hw.low; 434 - ioat_chan->completion_virt->high = completion_hw.high; 435 - } else { 436 - ioat_dma_reset_channel(ioat_chan); 437 - ioat_chan->watchdog_completion = 0; 438 - ioat_chan->last_compl_desc_addr_hw = 0; 439 - } 440 - 441 - /* 442 - * for version 2.0 if there are descriptors yet to be processed 443 - * and the last completed hasn't changed since the last watchdog 444 - * if they haven't hit the pending level 445 - * issue the pending to push them through 446 - * else 447 - * try resetting the channel 448 - */ 449 - } else if (ioat_chan->device->version == IOAT_VER_2_0 450 - && ioat_chan->used_desc.prev 451 - && ioat_chan->last_completion 452 - && ioat_chan->last_completion == ioat_chan->watchdog_completion) { 453 - 454 - if (ioat_chan->pending < ioat_pending_level) 455 - ioat2_dma_memcpy_issue_pending(&ioat_chan->common); 456 - else { 457 - ioat_dma_reset_channel(ioat_chan); 458 - ioat_chan->watchdog_completion = 0; 459 - } 460 - } else { 461 - ioat_chan->last_compl_desc_addr_hw = 0; 462 - ioat_chan->watchdog_completion 463 - = ioat_chan->last_completion; 464 - } 465 - 466 - ioat_chan->watchdog_last_tcp_cookie = 467 - ioat_chan->watchdog_tcp_cookie; 468 - } 469 - 470 - schedule_delayed_work(&device->work, WATCHDOG_DELAY); 471 - } 472 - 473 - static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx) 474 - { 475 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan); 476 - struct ioat_desc_sw *first = tx_to_ioat_desc(tx); 477 - struct ioat_desc_sw *prev, *new; 478 - struct ioat_dma_descriptor *hw; 479 - dma_cookie_t cookie; 480 - LIST_HEAD(new_chain); 481 - u32 copy; 482 - size_t len; 483 - dma_addr_t src, dst; 484 - unsigned long orig_flags; 485 - unsigned int desc_count = 0; 486 - 487 - /* src and dest and len are stored in the initial descriptor */ 488 - len = first->len; 489 - src = first->src; 490 - dst = first->dst; 491 - orig_flags = first->async_tx.flags; 492 - new = first; 493 - 494 - spin_lock_bh(&ioat_chan->desc_lock); 495 - prev = to_ioat_desc(ioat_chan->used_desc.prev); 496 - prefetch(prev->hw); 497 - do { 498 - copy = min_t(size_t, len, ioat_chan->xfercap); 499 - 500 - async_tx_ack(&new->async_tx); 501 - 502 - hw = new->hw; 503 - hw->size = copy; 504 - hw->ctl = 0; 505 - hw->src_addr = src; 506 - hw->dst_addr = dst; 507 - hw->next = 0; 508 - 509 - /* chain together the physical address list for the HW */ 510 - wmb(); 511 - prev->hw->next = (u64) new->async_tx.phys; 512 - 513 - len -= copy; 514 - dst += copy; 515 - src += copy; 516 - 517 - list_add_tail(&new->node, &new_chain); 518 - desc_count++; 519 - prev = new; 520 - } while (len && (new = ioat1_dma_get_next_descriptor(ioat_chan))); 521 - 522 - if (!new) { 523 - dev_err(&ioat_chan->device->pdev->dev, 524 - "tx submit failed\n"); 525 - spin_unlock_bh(&ioat_chan->desc_lock); 526 - return -ENOMEM; 527 - } 528 - 529 - hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS; 530 - if (first->async_tx.callback) { 531 - hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN; 532 - if (first != new) { 533 - /* move callback into to last desc */ 534 - new->async_tx.callback = first->async_tx.callback; 535 - new->async_tx.callback_param 536 - = first->async_tx.callback_param; 537 - first->async_tx.callback = NULL; 538 - first->async_tx.callback_param = NULL; 539 - } 540 - } 541 - 542 - new->tx_cnt = desc_count; 543 - new->async_tx.flags = orig_flags; /* client is in control of this ack */ 544 - 545 - /* store the original values for use in later cleanup */ 546 - if (new != first) { 547 - new->src = first->src; 548 - new->dst = first->dst; 549 - new->len = first->len; 550 - } 551 - 552 - /* cookie incr and addition to used_list must be atomic */ 553 - cookie = ioat_chan->common.cookie; 554 - cookie++; 555 - if (cookie < 0) 556 - cookie = 1; 557 - ioat_chan->common.cookie = new->async_tx.cookie = cookie; 558 - 559 - /* write address into NextDescriptor field of last desc in chain */ 560 - to_ioat_desc(ioat_chan->used_desc.prev)->hw->next = 561 - first->async_tx.phys; 562 - list_splice_tail(&new_chain, &ioat_chan->used_desc); 563 - 564 - ioat_chan->dmacount += desc_count; 565 - ioat_chan->pending += desc_count; 566 - if (ioat_chan->pending >= ioat_pending_level) 567 - __ioat1_dma_memcpy_issue_pending(ioat_chan); 568 - spin_unlock_bh(&ioat_chan->desc_lock); 569 - 570 - return cookie; 571 - } 572 - 573 - static dma_cookie_t ioat2_tx_submit(struct dma_async_tx_descriptor *tx) 574 - { 575 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan); 576 - struct ioat_desc_sw *first = tx_to_ioat_desc(tx); 577 - struct ioat_desc_sw *new; 578 - struct ioat_dma_descriptor *hw; 579 - dma_cookie_t cookie; 580 - u32 copy; 581 - size_t len; 582 - dma_addr_t src, dst; 583 - unsigned long orig_flags; 584 - unsigned int desc_count = 0; 585 - 586 - /* src and dest and len are stored in the initial descriptor */ 587 - len = first->len; 588 - src = first->src; 589 - dst = first->dst; 590 - orig_flags = first->async_tx.flags; 591 - new = first; 592 - 593 - /* 594 - * ioat_chan->desc_lock is still in force in version 2 path 595 - * it gets unlocked at end of this function 596 - */ 597 - do { 598 - copy = min_t(size_t, len, ioat_chan->xfercap); 599 - 600 - async_tx_ack(&new->async_tx); 601 - 602 - hw = new->hw; 603 - hw->size = copy; 604 - hw->ctl = 0; 605 - hw->src_addr = src; 606 - hw->dst_addr = dst; 607 - 608 - len -= copy; 609 - dst += copy; 610 - src += copy; 611 - desc_count++; 612 - } while (len && (new = ioat2_dma_get_next_descriptor(ioat_chan))); 613 - 614 - if (!new) { 615 - dev_err(&ioat_chan->device->pdev->dev, 616 - "tx submit failed\n"); 617 - spin_unlock_bh(&ioat_chan->desc_lock); 618 - return -ENOMEM; 619 - } 620 - 621 - hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_CP_STS; 622 - if (first->async_tx.callback) { 623 - hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN; 624 - if (first != new) { 625 - /* move callback into to last desc */ 626 - new->async_tx.callback = first->async_tx.callback; 627 - new->async_tx.callback_param 628 - = first->async_tx.callback_param; 629 - first->async_tx.callback = NULL; 630 - first->async_tx.callback_param = NULL; 631 - } 632 - } 633 - 634 - new->tx_cnt = desc_count; 635 - new->async_tx.flags = orig_flags; /* client is in control of this ack */ 636 - 637 - /* store the original values for use in later cleanup */ 638 - if (new != first) { 639 - new->src = first->src; 640 - new->dst = first->dst; 641 - new->len = first->len; 642 - } 643 - 644 - /* cookie incr and addition to used_list must be atomic */ 645 - cookie = ioat_chan->common.cookie; 646 - cookie++; 647 - if (cookie < 0) 648 - cookie = 1; 649 - ioat_chan->common.cookie = new->async_tx.cookie = cookie; 650 - 651 - ioat_chan->dmacount += desc_count; 652 - ioat_chan->pending += desc_count; 653 - if (ioat_chan->pending >= ioat_pending_level) 654 - __ioat2_dma_memcpy_issue_pending(ioat_chan); 655 - spin_unlock_bh(&ioat_chan->desc_lock); 656 - 657 - return cookie; 658 - } 659 - 660 - /** 661 - * ioat_dma_alloc_descriptor - allocate and return a sw and hw descriptor pair 662 - * @ioat_chan: the channel supplying the memory pool for the descriptors 663 - * @flags: allocation flags 664 - */ 665 - static struct ioat_desc_sw *ioat_dma_alloc_descriptor( 666 - struct ioat_dma_chan *ioat_chan, 667 - gfp_t flags) 668 - { 669 - struct ioat_dma_descriptor *desc; 670 - struct ioat_desc_sw *desc_sw; 671 - struct ioatdma_device *ioatdma_device; 672 - dma_addr_t phys; 673 - 674 - ioatdma_device = to_ioatdma_device(ioat_chan->common.device); 675 - desc = pci_pool_alloc(ioatdma_device->dma_pool, flags, &phys); 676 - if (unlikely(!desc)) 677 - return NULL; 678 - 679 - desc_sw = kzalloc(sizeof(*desc_sw), flags); 680 - if (unlikely(!desc_sw)) { 681 - pci_pool_free(ioatdma_device->dma_pool, desc, phys); 682 - return NULL; 683 - } 684 - 685 - memset(desc, 0, sizeof(*desc)); 686 - dma_async_tx_descriptor_init(&desc_sw->async_tx, &ioat_chan->common); 687 - switch (ioat_chan->device->version) { 688 - case IOAT_VER_1_2: 689 - desc_sw->async_tx.tx_submit = ioat1_tx_submit; 690 - break; 691 - case IOAT_VER_2_0: 692 - case IOAT_VER_3_0: 693 - desc_sw->async_tx.tx_submit = ioat2_tx_submit; 694 - break; 695 - } 696 - 697 - desc_sw->hw = desc; 698 - desc_sw->async_tx.phys = phys; 699 - 700 - return desc_sw; 701 - } 702 - 703 - static int ioat_initial_desc_count = 256; 704 - module_param(ioat_initial_desc_count, int, 0644); 705 - MODULE_PARM_DESC(ioat_initial_desc_count, 706 - "initial descriptors per channel (default: 256)"); 707 - 708 - /** 709 - * ioat2_dma_massage_chan_desc - link the descriptors into a circle 710 - * @ioat_chan: the channel to be massaged 711 - */ 712 - static void ioat2_dma_massage_chan_desc(struct ioat_dma_chan *ioat_chan) 713 - { 714 - struct ioat_desc_sw *desc, *_desc; 715 - 716 - /* setup used_desc */ 717 - ioat_chan->used_desc.next = ioat_chan->free_desc.next; 718 - ioat_chan->used_desc.prev = NULL; 719 - 720 - /* pull free_desc out of the circle so that every node is a hw 721 - * descriptor, but leave it pointing to the list 722 - */ 723 - ioat_chan->free_desc.prev->next = ioat_chan->free_desc.next; 724 - ioat_chan->free_desc.next->prev = ioat_chan->free_desc.prev; 725 - 726 - /* circle link the hw descriptors */ 727 - desc = to_ioat_desc(ioat_chan->free_desc.next); 728 - desc->hw->next = to_ioat_desc(desc->node.next)->async_tx.phys; 729 - list_for_each_entry_safe(desc, _desc, ioat_chan->free_desc.next, node) { 730 - desc->hw->next = to_ioat_desc(desc->node.next)->async_tx.phys; 731 - } 732 - } 733 - 734 - /** 735 - * ioat_dma_alloc_chan_resources - returns the number of allocated descriptors 736 - * @chan: the channel to be filled out 737 - */ 738 - static int ioat_dma_alloc_chan_resources(struct dma_chan *chan) 739 - { 740 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 741 - struct ioat_desc_sw *desc; 742 - u16 chanctrl; 743 - u32 chanerr; 744 - int i; 745 - LIST_HEAD(tmp_list); 746 - 747 - /* have we already been set up? */ 748 - if (!list_empty(&ioat_chan->free_desc)) 749 - return ioat_chan->desccount; 750 - 751 - /* Setup register to interrupt and write completion status on error */ 752 - chanctrl = IOAT_CHANCTRL_ERR_INT_EN | 753 - IOAT_CHANCTRL_ANY_ERR_ABORT_EN | 754 - IOAT_CHANCTRL_ERR_COMPLETION_EN; 755 - writew(chanctrl, ioat_chan->reg_base + IOAT_CHANCTRL_OFFSET); 756 - 757 - chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET); 758 - if (chanerr) { 759 - dev_err(&ioat_chan->device->pdev->dev, 760 - "CHANERR = %x, clearing\n", chanerr); 761 - writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET); 762 - } 763 - 764 - /* Allocate descriptors */ 765 - for (i = 0; i < ioat_initial_desc_count; i++) { 766 - desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_KERNEL); 767 - if (!desc) { 768 - dev_err(&ioat_chan->device->pdev->dev, 769 - "Only %d initial descriptors\n", i); 770 - break; 771 - } 772 - list_add_tail(&desc->node, &tmp_list); 773 - } 774 - spin_lock_bh(&ioat_chan->desc_lock); 775 - ioat_chan->desccount = i; 776 - list_splice(&tmp_list, &ioat_chan->free_desc); 777 - if (ioat_chan->device->version != IOAT_VER_1_2) 778 - ioat2_dma_massage_chan_desc(ioat_chan); 779 - spin_unlock_bh(&ioat_chan->desc_lock); 780 - 781 - /* allocate a completion writeback area */ 782 - /* doing 2 32bit writes to mmio since 1 64b write doesn't work */ 783 - ioat_chan->completion_virt = 784 - pci_pool_alloc(ioat_chan->device->completion_pool, 785 - GFP_KERNEL, 786 - &ioat_chan->completion_addr); 787 - memset(ioat_chan->completion_virt, 0, 788 - sizeof(*ioat_chan->completion_virt)); 789 - writel(((u64) ioat_chan->completion_addr) & 0x00000000FFFFFFFF, 790 - ioat_chan->reg_base + IOAT_CHANCMP_OFFSET_LOW); 791 - writel(((u64) ioat_chan->completion_addr) >> 32, 792 - ioat_chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH); 793 - 794 - tasklet_enable(&ioat_chan->cleanup_task); 795 - ioat_dma_start_null_desc(ioat_chan); /* give chain to dma device */ 796 - return ioat_chan->desccount; 797 - } 798 - 799 - /** 800 - * ioat_dma_free_chan_resources - release all the descriptors 801 - * @chan: the channel to be cleaned 802 - */ 803 - static void ioat_dma_free_chan_resources(struct dma_chan *chan) 804 - { 805 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 806 - struct ioatdma_device *ioatdma_device = to_ioatdma_device(chan->device); 807 - struct ioat_desc_sw *desc, *_desc; 808 - int in_use_descs = 0; 809 - 810 - /* Before freeing channel resources first check 811 - * if they have been previously allocated for this channel. 812 - */ 813 - if (ioat_chan->desccount == 0) 814 - return; 815 - 816 - tasklet_disable(&ioat_chan->cleanup_task); 817 - ioat_dma_memcpy_cleanup(ioat_chan); 818 - 819 - /* Delay 100ms after reset to allow internal DMA logic to quiesce 820 - * before removing DMA descriptor resources. 821 - */ 822 - writeb(IOAT_CHANCMD_RESET, 823 - ioat_chan->reg_base 824 - + IOAT_CHANCMD_OFFSET(ioat_chan->device->version)); 825 - mdelay(100); 826 - 827 - spin_lock_bh(&ioat_chan->desc_lock); 828 - switch (ioat_chan->device->version) { 829 - case IOAT_VER_1_2: 830 - list_for_each_entry_safe(desc, _desc, 831 - &ioat_chan->used_desc, node) { 832 - in_use_descs++; 833 - list_del(&desc->node); 834 - pci_pool_free(ioatdma_device->dma_pool, desc->hw, 835 - desc->async_tx.phys); 836 - kfree(desc); 837 - } 838 - list_for_each_entry_safe(desc, _desc, 839 - &ioat_chan->free_desc, node) { 840 - list_del(&desc->node); 841 - pci_pool_free(ioatdma_device->dma_pool, desc->hw, 842 - desc->async_tx.phys); 843 - kfree(desc); 844 - } 845 - break; 846 - case IOAT_VER_2_0: 847 - case IOAT_VER_3_0: 848 - list_for_each_entry_safe(desc, _desc, 849 - ioat_chan->free_desc.next, node) { 850 - list_del(&desc->node); 851 - pci_pool_free(ioatdma_device->dma_pool, desc->hw, 852 - desc->async_tx.phys); 853 - kfree(desc); 854 - } 855 - desc = to_ioat_desc(ioat_chan->free_desc.next); 856 - pci_pool_free(ioatdma_device->dma_pool, desc->hw, 857 - desc->async_tx.phys); 858 - kfree(desc); 859 - INIT_LIST_HEAD(&ioat_chan->free_desc); 860 - INIT_LIST_HEAD(&ioat_chan->used_desc); 861 - break; 862 - } 863 - spin_unlock_bh(&ioat_chan->desc_lock); 864 - 865 - pci_pool_free(ioatdma_device->completion_pool, 866 - ioat_chan->completion_virt, 867 - ioat_chan->completion_addr); 868 - 869 - /* one is ok since we left it on there on purpose */ 870 - if (in_use_descs > 1) 871 - dev_err(&ioat_chan->device->pdev->dev, 872 - "Freeing %d in use descriptors!\n", 873 - in_use_descs - 1); 874 - 875 - ioat_chan->last_completion = ioat_chan->completion_addr = 0; 876 - ioat_chan->pending = 0; 877 - ioat_chan->dmacount = 0; 878 - ioat_chan->desccount = 0; 879 - ioat_chan->watchdog_completion = 0; 880 - ioat_chan->last_compl_desc_addr_hw = 0; 881 - ioat_chan->watchdog_tcp_cookie = 882 - ioat_chan->watchdog_last_tcp_cookie = 0; 883 - } 884 - 885 - /** 886 - * ioat_dma_get_next_descriptor - return the next available descriptor 887 - * @ioat_chan: IOAT DMA channel handle 888 - * 889 - * Gets the next descriptor from the chain, and must be called with the 890 - * channel's desc_lock held. Allocates more descriptors if the channel 891 - * has run out. 892 - */ 893 - static struct ioat_desc_sw * 894 - ioat1_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan) 895 - { 896 - struct ioat_desc_sw *new; 897 - 898 - if (!list_empty(&ioat_chan->free_desc)) { 899 - new = to_ioat_desc(ioat_chan->free_desc.next); 900 - list_del(&new->node); 901 - } else { 902 - /* try to get another desc */ 903 - new = ioat_dma_alloc_descriptor(ioat_chan, GFP_ATOMIC); 904 - if (!new) { 905 - dev_err(&ioat_chan->device->pdev->dev, 906 - "alloc failed\n"); 907 - return NULL; 908 - } 909 - } 910 - 911 - prefetch(new->hw); 912 - return new; 913 - } 914 - 915 - static struct ioat_desc_sw * 916 - ioat2_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan) 917 - { 918 - struct ioat_desc_sw *new; 919 - 920 - /* 921 - * used.prev points to where to start processing 922 - * used.next points to next free descriptor 923 - * if used.prev == NULL, there are none waiting to be processed 924 - * if used.next == used.prev.prev, there is only one free descriptor, 925 - * and we need to use it to as a noop descriptor before 926 - * linking in a new set of descriptors, since the device 927 - * has probably already read the pointer to it 928 - */ 929 - if (ioat_chan->used_desc.prev && 930 - ioat_chan->used_desc.next == ioat_chan->used_desc.prev->prev) { 931 - 932 - struct ioat_desc_sw *desc; 933 - struct ioat_desc_sw *noop_desc; 934 - int i; 935 - 936 - /* set up the noop descriptor */ 937 - noop_desc = to_ioat_desc(ioat_chan->used_desc.next); 938 - /* set size to non-zero value (channel returns error when size is 0) */ 939 - noop_desc->hw->size = NULL_DESC_BUFFER_SIZE; 940 - noop_desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL; 941 - noop_desc->hw->src_addr = 0; 942 - noop_desc->hw->dst_addr = 0; 943 - 944 - ioat_chan->used_desc.next = ioat_chan->used_desc.next->next; 945 - ioat_chan->pending++; 946 - ioat_chan->dmacount++; 947 - 948 - /* try to get a few more descriptors */ 949 - for (i = 16; i; i--) { 950 - desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_ATOMIC); 951 - if (!desc) { 952 - dev_err(&ioat_chan->device->pdev->dev, 953 - "alloc failed\n"); 954 - break; 955 - } 956 - list_add_tail(&desc->node, ioat_chan->used_desc.next); 957 - 958 - desc->hw->next 959 - = to_ioat_desc(desc->node.next)->async_tx.phys; 960 - to_ioat_desc(desc->node.prev)->hw->next 961 - = desc->async_tx.phys; 962 - ioat_chan->desccount++; 963 - } 964 - 965 - ioat_chan->used_desc.next = noop_desc->node.next; 966 - } 967 - new = to_ioat_desc(ioat_chan->used_desc.next); 968 - prefetch(new); 969 - ioat_chan->used_desc.next = new->node.next; 970 - 971 - if (ioat_chan->used_desc.prev == NULL) 972 - ioat_chan->used_desc.prev = &new->node; 973 - 974 - prefetch(new->hw); 975 - return new; 976 - } 977 - 978 - static struct ioat_desc_sw *ioat_dma_get_next_descriptor( 979 - struct ioat_dma_chan *ioat_chan) 980 - { 981 - if (!ioat_chan) 982 - return NULL; 983 - 984 - switch (ioat_chan->device->version) { 985 - case IOAT_VER_1_2: 986 - return ioat1_dma_get_next_descriptor(ioat_chan); 987 - case IOAT_VER_2_0: 988 - case IOAT_VER_3_0: 989 - return ioat2_dma_get_next_descriptor(ioat_chan); 990 - } 991 - return NULL; 992 - } 993 - 994 - static struct dma_async_tx_descriptor *ioat1_dma_prep_memcpy( 995 - struct dma_chan *chan, 996 - dma_addr_t dma_dest, 997 - dma_addr_t dma_src, 998 - size_t len, 999 - unsigned long flags) 1000 - { 1001 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 1002 - struct ioat_desc_sw *new; 1003 - 1004 - spin_lock_bh(&ioat_chan->desc_lock); 1005 - new = ioat_dma_get_next_descriptor(ioat_chan); 1006 - spin_unlock_bh(&ioat_chan->desc_lock); 1007 - 1008 - if (new) { 1009 - new->len = len; 1010 - new->dst = dma_dest; 1011 - new->src = dma_src; 1012 - new->async_tx.flags = flags; 1013 - return &new->async_tx; 1014 - } else { 1015 - dev_err(&ioat_chan->device->pdev->dev, 1016 - "chan%d - get_next_desc failed: %d descs waiting, %d total desc\n", 1017 - chan_num(ioat_chan), ioat_chan->dmacount, ioat_chan->desccount); 1018 - return NULL; 1019 - } 1020 - } 1021 - 1022 - static struct dma_async_tx_descriptor *ioat2_dma_prep_memcpy( 1023 - struct dma_chan *chan, 1024 - dma_addr_t dma_dest, 1025 - dma_addr_t dma_src, 1026 - size_t len, 1027 - unsigned long flags) 1028 - { 1029 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 1030 - struct ioat_desc_sw *new; 1031 - 1032 - spin_lock_bh(&ioat_chan->desc_lock); 1033 - new = ioat2_dma_get_next_descriptor(ioat_chan); 1034 - 1035 - /* 1036 - * leave ioat_chan->desc_lock set in ioat 2 path 1037 - * it will get unlocked at end of tx_submit 1038 - */ 1039 - 1040 - if (new) { 1041 - new->len = len; 1042 - new->dst = dma_dest; 1043 - new->src = dma_src; 1044 - new->async_tx.flags = flags; 1045 - return &new->async_tx; 1046 - } else { 1047 - spin_unlock_bh(&ioat_chan->desc_lock); 1048 - dev_err(&ioat_chan->device->pdev->dev, 1049 - "chan%d - get_next_desc failed: %d descs waiting, %d total desc\n", 1050 - chan_num(ioat_chan), ioat_chan->dmacount, ioat_chan->desccount); 1051 - return NULL; 1052 - } 1053 - } 1054 - 1055 - static void ioat_dma_cleanup_tasklet(unsigned long data) 1056 - { 1057 - struct ioat_dma_chan *chan = (void *)data; 1058 - ioat_dma_memcpy_cleanup(chan); 1059 - writew(IOAT_CHANCTRL_INT_DISABLE, 1060 - chan->reg_base + IOAT_CHANCTRL_OFFSET); 1061 - } 1062 - 1063 - static void 1064 - ioat_dma_unmap(struct ioat_dma_chan *ioat_chan, struct ioat_desc_sw *desc) 1065 - { 1066 - if (!(desc->async_tx.flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 1067 - if (desc->async_tx.flags & DMA_COMPL_DEST_UNMAP_SINGLE) 1068 - pci_unmap_single(ioat_chan->device->pdev, 1069 - pci_unmap_addr(desc, dst), 1070 - pci_unmap_len(desc, len), 1071 - PCI_DMA_FROMDEVICE); 1072 - else 1073 - pci_unmap_page(ioat_chan->device->pdev, 1074 - pci_unmap_addr(desc, dst), 1075 - pci_unmap_len(desc, len), 1076 - PCI_DMA_FROMDEVICE); 1077 - } 1078 - 1079 - if (!(desc->async_tx.flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 1080 - if (desc->async_tx.flags & DMA_COMPL_SRC_UNMAP_SINGLE) 1081 - pci_unmap_single(ioat_chan->device->pdev, 1082 - pci_unmap_addr(desc, src), 1083 - pci_unmap_len(desc, len), 1084 - PCI_DMA_TODEVICE); 1085 - else 1086 - pci_unmap_page(ioat_chan->device->pdev, 1087 - pci_unmap_addr(desc, src), 1088 - pci_unmap_len(desc, len), 1089 - PCI_DMA_TODEVICE); 1090 - } 1091 - } 1092 - 1093 - /** 1094 - * ioat_dma_memcpy_cleanup - cleanup up finished descriptors 1095 - * @chan: ioat channel to be cleaned up 1096 - */ 1097 - static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan) 1098 - { 1099 - unsigned long phys_complete; 1100 - struct ioat_desc_sw *desc, *_desc; 1101 - dma_cookie_t cookie = 0; 1102 - unsigned long desc_phys; 1103 - struct ioat_desc_sw *latest_desc; 1104 - 1105 - prefetch(ioat_chan->completion_virt); 1106 - 1107 - if (!spin_trylock_bh(&ioat_chan->cleanup_lock)) 1108 - return; 1109 - 1110 - /* The completion writeback can happen at any time, 1111 - so reads by the driver need to be atomic operations 1112 - The descriptor physical addresses are limited to 32-bits 1113 - when the CPU can only do a 32-bit mov */ 1114 - 1115 - #if (BITS_PER_LONG == 64) 1116 - phys_complete = 1117 - ioat_chan->completion_virt->full 1118 - & IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR; 1119 - #else 1120 - phys_complete = 1121 - ioat_chan->completion_virt->low & IOAT_LOW_COMPLETION_MASK; 1122 - #endif 1123 - 1124 - if ((ioat_chan->completion_virt->full 1125 - & IOAT_CHANSTS_DMA_TRANSFER_STATUS) == 1126 - IOAT_CHANSTS_DMA_TRANSFER_STATUS_HALTED) { 1127 - dev_err(&ioat_chan->device->pdev->dev, 1128 - "Channel halted, chanerr = %x\n", 1129 - readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET)); 1130 - 1131 - /* TODO do something to salvage the situation */ 1132 - } 1133 - 1134 - if (phys_complete == ioat_chan->last_completion) { 1135 - spin_unlock_bh(&ioat_chan->cleanup_lock); 1136 - /* 1137 - * perhaps we're stuck so hard that the watchdog can't go off? 1138 - * try to catch it after 2 seconds 1139 - */ 1140 - if (ioat_chan->device->version != IOAT_VER_3_0) { 1141 - if (time_after(jiffies, 1142 - ioat_chan->last_completion_time + HZ*WATCHDOG_DELAY)) { 1143 - ioat_dma_chan_watchdog(&(ioat_chan->device->work.work)); 1144 - ioat_chan->last_completion_time = jiffies; 1145 - } 1146 - } 1147 - return; 1148 - } 1149 - ioat_chan->last_completion_time = jiffies; 1150 - 1151 - cookie = 0; 1152 - if (!spin_trylock_bh(&ioat_chan->desc_lock)) { 1153 - spin_unlock_bh(&ioat_chan->cleanup_lock); 1154 - return; 1155 - } 1156 - 1157 - switch (ioat_chan->device->version) { 1158 - case IOAT_VER_1_2: 1159 - list_for_each_entry_safe(desc, _desc, 1160 - &ioat_chan->used_desc, node) { 1161 - 1162 - /* 1163 - * Incoming DMA requests may use multiple descriptors, 1164 - * due to exceeding xfercap, perhaps. If so, only the 1165 - * last one will have a cookie, and require unmapping. 1166 - */ 1167 - if (desc->async_tx.cookie) { 1168 - cookie = desc->async_tx.cookie; 1169 - ioat_dma_unmap(ioat_chan, desc); 1170 - if (desc->async_tx.callback) { 1171 - desc->async_tx.callback(desc->async_tx.callback_param); 1172 - desc->async_tx.callback = NULL; 1173 - } 1174 - } 1175 - 1176 - if (desc->async_tx.phys != phys_complete) { 1177 - /* 1178 - * a completed entry, but not the last, so clean 1179 - * up if the client is done with the descriptor 1180 - */ 1181 - if (async_tx_test_ack(&desc->async_tx)) { 1182 - list_move_tail(&desc->node, 1183 - &ioat_chan->free_desc); 1184 - } else 1185 - desc->async_tx.cookie = 0; 1186 - } else { 1187 - /* 1188 - * last used desc. Do not remove, so we can 1189 - * append from it, but don't look at it next 1190 - * time, either 1191 - */ 1192 - desc->async_tx.cookie = 0; 1193 - 1194 - /* TODO check status bits? */ 1195 - break; 1196 - } 1197 - } 1198 - break; 1199 - case IOAT_VER_2_0: 1200 - case IOAT_VER_3_0: 1201 - /* has some other thread has already cleaned up? */ 1202 - if (ioat_chan->used_desc.prev == NULL) 1203 - break; 1204 - 1205 - /* work backwards to find latest finished desc */ 1206 - desc = to_ioat_desc(ioat_chan->used_desc.next); 1207 - latest_desc = NULL; 1208 - do { 1209 - desc = to_ioat_desc(desc->node.prev); 1210 - desc_phys = (unsigned long)desc->async_tx.phys 1211 - & IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR; 1212 - if (desc_phys == phys_complete) { 1213 - latest_desc = desc; 1214 - break; 1215 - } 1216 - } while (&desc->node != ioat_chan->used_desc.prev); 1217 - 1218 - if (latest_desc != NULL) { 1219 - 1220 - /* work forwards to clear finished descriptors */ 1221 - for (desc = to_ioat_desc(ioat_chan->used_desc.prev); 1222 - &desc->node != latest_desc->node.next && 1223 - &desc->node != ioat_chan->used_desc.next; 1224 - desc = to_ioat_desc(desc->node.next)) { 1225 - if (desc->async_tx.cookie) { 1226 - cookie = desc->async_tx.cookie; 1227 - desc->async_tx.cookie = 0; 1228 - ioat_dma_unmap(ioat_chan, desc); 1229 - if (desc->async_tx.callback) { 1230 - desc->async_tx.callback(desc->async_tx.callback_param); 1231 - desc->async_tx.callback = NULL; 1232 - } 1233 - } 1234 - } 1235 - 1236 - /* move used.prev up beyond those that are finished */ 1237 - if (&desc->node == ioat_chan->used_desc.next) 1238 - ioat_chan->used_desc.prev = NULL; 1239 - else 1240 - ioat_chan->used_desc.prev = &desc->node; 1241 - } 1242 - break; 1243 - } 1244 - 1245 - spin_unlock_bh(&ioat_chan->desc_lock); 1246 - 1247 - ioat_chan->last_completion = phys_complete; 1248 - if (cookie != 0) 1249 - ioat_chan->completed_cookie = cookie; 1250 - 1251 - spin_unlock_bh(&ioat_chan->cleanup_lock); 1252 - } 1253 - 1254 - /** 1255 - * ioat_dma_is_complete - poll the status of a IOAT DMA transaction 1256 - * @chan: IOAT DMA channel handle 1257 - * @cookie: DMA transaction identifier 1258 - * @done: if not %NULL, updated with last completed transaction 1259 - * @used: if not %NULL, updated with last used transaction 1260 - */ 1261 - static enum dma_status ioat_dma_is_complete(struct dma_chan *chan, 1262 - dma_cookie_t cookie, 1263 - dma_cookie_t *done, 1264 - dma_cookie_t *used) 1265 - { 1266 - struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 1267 - dma_cookie_t last_used; 1268 - dma_cookie_t last_complete; 1269 - enum dma_status ret; 1270 - 1271 - last_used = chan->cookie; 1272 - last_complete = ioat_chan->completed_cookie; 1273 - ioat_chan->watchdog_tcp_cookie = cookie; 1274 - 1275 - if (done) 1276 - *done = last_complete; 1277 - if (used) 1278 - *used = last_used; 1279 - 1280 - ret = dma_async_is_complete(cookie, last_complete, last_used); 1281 - if (ret == DMA_SUCCESS) 1282 - return ret; 1283 - 1284 - ioat_dma_memcpy_cleanup(ioat_chan); 1285 - 1286 - last_used = chan->cookie; 1287 - last_complete = ioat_chan->completed_cookie; 1288 - 1289 - if (done) 1290 - *done = last_complete; 1291 - if (used) 1292 - *used = last_used; 1293 - 1294 - return dma_async_is_complete(cookie, last_complete, last_used); 1295 - } 1296 - 1297 - static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan) 1298 - { 1299 - struct ioat_desc_sw *desc; 1300 - 1301 - spin_lock_bh(&ioat_chan->desc_lock); 1302 - 1303 - desc = ioat_dma_get_next_descriptor(ioat_chan); 1304 - 1305 - if (!desc) { 1306 - dev_err(&ioat_chan->device->pdev->dev, 1307 - "Unable to start null desc - get next desc failed\n"); 1308 - spin_unlock_bh(&ioat_chan->desc_lock); 1309 - return; 1310 - } 1311 - 1312 - desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL 1313 - | IOAT_DMA_DESCRIPTOR_CTL_INT_GN 1314 - | IOAT_DMA_DESCRIPTOR_CTL_CP_STS; 1315 - /* set size to non-zero value (channel returns error when size is 0) */ 1316 - desc->hw->size = NULL_DESC_BUFFER_SIZE; 1317 - desc->hw->src_addr = 0; 1318 - desc->hw->dst_addr = 0; 1319 - async_tx_ack(&desc->async_tx); 1320 - switch (ioat_chan->device->version) { 1321 - case IOAT_VER_1_2: 1322 - desc->hw->next = 0; 1323 - list_add_tail(&desc->node, &ioat_chan->used_desc); 1324 - 1325 - writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF, 1326 - ioat_chan->reg_base + IOAT1_CHAINADDR_OFFSET_LOW); 1327 - writel(((u64) desc->async_tx.phys) >> 32, 1328 - ioat_chan->reg_base + IOAT1_CHAINADDR_OFFSET_HIGH); 1329 - 1330 - writeb(IOAT_CHANCMD_START, ioat_chan->reg_base 1331 - + IOAT_CHANCMD_OFFSET(ioat_chan->device->version)); 1332 - break; 1333 - case IOAT_VER_2_0: 1334 - case IOAT_VER_3_0: 1335 - writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF, 1336 - ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_LOW); 1337 - writel(((u64) desc->async_tx.phys) >> 32, 1338 - ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_HIGH); 1339 - 1340 - ioat_chan->dmacount++; 1341 - __ioat2_dma_memcpy_issue_pending(ioat_chan); 1342 - break; 1343 - } 1344 - spin_unlock_bh(&ioat_chan->desc_lock); 1345 - } 1346 - 1347 - /* 1348 - * Perform a IOAT transaction to verify the HW works. 1349 - */ 1350 - #define IOAT_TEST_SIZE 2000 1351 - 1352 - static void ioat_dma_test_callback(void *dma_async_param) 1353 - { 1354 - struct completion *cmp = dma_async_param; 1355 - 1356 - complete(cmp); 1357 - } 1358 - 1359 - /** 1360 - * ioat_dma_self_test - Perform a IOAT transaction to verify the HW works. 1361 - * @device: device to be tested 1362 - */ 1363 - static int ioat_dma_self_test(struct ioatdma_device *device) 1364 - { 1365 - int i; 1366 - u8 *src; 1367 - u8 *dest; 1368 - struct dma_chan *dma_chan; 1369 - struct dma_async_tx_descriptor *tx; 1370 - dma_addr_t dma_dest, dma_src; 1371 - dma_cookie_t cookie; 1372 - int err = 0; 1373 - struct completion cmp; 1374 - unsigned long tmo; 1375 - unsigned long flags; 1376 - 1377 - src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL); 1378 - if (!src) 1379 - return -ENOMEM; 1380 - dest = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL); 1381 - if (!dest) { 1382 - kfree(src); 1383 - return -ENOMEM; 1384 - } 1385 - 1386 - /* Fill in src buffer */ 1387 - for (i = 0; i < IOAT_TEST_SIZE; i++) 1388 - src[i] = (u8)i; 1389 - 1390 - /* Start copy, using first DMA channel */ 1391 - dma_chan = container_of(device->common.channels.next, 1392 - struct dma_chan, 1393 - device_node); 1394 - if (device->common.device_alloc_chan_resources(dma_chan) < 1) { 1395 - dev_err(&device->pdev->dev, 1396 - "selftest cannot allocate chan resource\n"); 1397 - err = -ENODEV; 1398 - goto out; 1399 - } 1400 - 1401 - dma_src = dma_map_single(dma_chan->device->dev, src, IOAT_TEST_SIZE, 1402 - DMA_TO_DEVICE); 1403 - dma_dest = dma_map_single(dma_chan->device->dev, dest, IOAT_TEST_SIZE, 1404 - DMA_FROM_DEVICE); 1405 - flags = DMA_COMPL_SRC_UNMAP_SINGLE | DMA_COMPL_DEST_UNMAP_SINGLE; 1406 - tx = device->common.device_prep_dma_memcpy(dma_chan, dma_dest, dma_src, 1407 - IOAT_TEST_SIZE, flags); 1408 - if (!tx) { 1409 - dev_err(&device->pdev->dev, 1410 - "Self-test prep failed, disabling\n"); 1411 - err = -ENODEV; 1412 - goto free_resources; 1413 - } 1414 - 1415 - async_tx_ack(tx); 1416 - init_completion(&cmp); 1417 - tx->callback = ioat_dma_test_callback; 1418 - tx->callback_param = &cmp; 1419 - cookie = tx->tx_submit(tx); 1420 - if (cookie < 0) { 1421 - dev_err(&device->pdev->dev, 1422 - "Self-test setup failed, disabling\n"); 1423 - err = -ENODEV; 1424 - goto free_resources; 1425 - } 1426 - device->common.device_issue_pending(dma_chan); 1427 - 1428 - tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); 1429 - 1430 - if (tmo == 0 || 1431 - device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL) 1432 - != DMA_SUCCESS) { 1433 - dev_err(&device->pdev->dev, 1434 - "Self-test copy timed out, disabling\n"); 1435 - err = -ENODEV; 1436 - goto free_resources; 1437 - } 1438 - if (memcmp(src, dest, IOAT_TEST_SIZE)) { 1439 - dev_err(&device->pdev->dev, 1440 - "Self-test copy failed compare, disabling\n"); 1441 - err = -ENODEV; 1442 - goto free_resources; 1443 - } 1444 - 1445 - free_resources: 1446 - device->common.device_free_chan_resources(dma_chan); 1447 - out: 1448 - kfree(src); 1449 - kfree(dest); 1450 - return err; 1451 - } 1452 - 1453 - static char ioat_interrupt_style[32] = "msix"; 1454 - module_param_string(ioat_interrupt_style, ioat_interrupt_style, 1455 - sizeof(ioat_interrupt_style), 0644); 1456 - MODULE_PARM_DESC(ioat_interrupt_style, 1457 - "set ioat interrupt style: msix (default), " 1458 - "msix-single-vector, msi, intx)"); 1459 - 1460 - /** 1461 - * ioat_dma_setup_interrupts - setup interrupt handler 1462 - * @device: ioat device 1463 - */ 1464 - static int ioat_dma_setup_interrupts(struct ioatdma_device *device) 1465 - { 1466 - struct ioat_dma_chan *ioat_chan; 1467 - int err, i, j, msixcnt; 1468 - u8 intrctrl = 0; 1469 - 1470 - if (!strcmp(ioat_interrupt_style, "msix")) 1471 - goto msix; 1472 - if (!strcmp(ioat_interrupt_style, "msix-single-vector")) 1473 - goto msix_single_vector; 1474 - if (!strcmp(ioat_interrupt_style, "msi")) 1475 - goto msi; 1476 - if (!strcmp(ioat_interrupt_style, "intx")) 1477 - goto intx; 1478 - dev_err(&device->pdev->dev, "invalid ioat_interrupt_style %s\n", 1479 - ioat_interrupt_style); 1480 - goto err_no_irq; 1481 - 1482 - msix: 1483 - /* The number of MSI-X vectors should equal the number of channels */ 1484 - msixcnt = device->common.chancnt; 1485 - for (i = 0; i < msixcnt; i++) 1486 - device->msix_entries[i].entry = i; 1487 - 1488 - err = pci_enable_msix(device->pdev, device->msix_entries, msixcnt); 1489 - if (err < 0) 1490 - goto msi; 1491 - if (err > 0) 1492 - goto msix_single_vector; 1493 - 1494 - for (i = 0; i < msixcnt; i++) { 1495 - ioat_chan = ioat_lookup_chan_by_index(device, i); 1496 - err = request_irq(device->msix_entries[i].vector, 1497 - ioat_dma_do_interrupt_msix, 1498 - 0, "ioat-msix", ioat_chan); 1499 - if (err) { 1500 - for (j = 0; j < i; j++) { 1501 - ioat_chan = 1502 - ioat_lookup_chan_by_index(device, j); 1503 - free_irq(device->msix_entries[j].vector, 1504 - ioat_chan); 1505 - } 1506 - goto msix_single_vector; 1507 - } 1508 - } 1509 - intrctrl |= IOAT_INTRCTRL_MSIX_VECTOR_CONTROL; 1510 - device->irq_mode = msix_multi_vector; 1511 - goto done; 1512 - 1513 - msix_single_vector: 1514 - device->msix_entries[0].entry = 0; 1515 - err = pci_enable_msix(device->pdev, device->msix_entries, 1); 1516 - if (err) 1517 - goto msi; 1518 - 1519 - err = request_irq(device->msix_entries[0].vector, ioat_dma_do_interrupt, 1520 - 0, "ioat-msix", device); 1521 - if (err) { 1522 - pci_disable_msix(device->pdev); 1523 - goto msi; 1524 - } 1525 - device->irq_mode = msix_single_vector; 1526 - goto done; 1527 - 1528 - msi: 1529 - err = pci_enable_msi(device->pdev); 1530 - if (err) 1531 - goto intx; 1532 - 1533 - err = request_irq(device->pdev->irq, ioat_dma_do_interrupt, 1534 - 0, "ioat-msi", device); 1535 - if (err) { 1536 - pci_disable_msi(device->pdev); 1537 - goto intx; 1538 - } 1539 - /* 1540 - * CB 1.2 devices need a bit set in configuration space to enable MSI 1541 - */ 1542 - if (device->version == IOAT_VER_1_2) { 1543 - u32 dmactrl; 1544 - pci_read_config_dword(device->pdev, 1545 - IOAT_PCI_DMACTRL_OFFSET, &dmactrl); 1546 - dmactrl |= IOAT_PCI_DMACTRL_MSI_EN; 1547 - pci_write_config_dword(device->pdev, 1548 - IOAT_PCI_DMACTRL_OFFSET, dmactrl); 1549 - } 1550 - device->irq_mode = msi; 1551 - goto done; 1552 - 1553 - intx: 1554 - err = request_irq(device->pdev->irq, ioat_dma_do_interrupt, 1555 - IRQF_SHARED, "ioat-intx", device); 1556 - if (err) 1557 - goto err_no_irq; 1558 - device->irq_mode = intx; 1559 - 1560 - done: 1561 - intrctrl |= IOAT_INTRCTRL_MASTER_INT_EN; 1562 - writeb(intrctrl, device->reg_base + IOAT_INTRCTRL_OFFSET); 1563 - return 0; 1564 - 1565 - err_no_irq: 1566 - /* Disable all interrupt generation */ 1567 - writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET); 1568 - dev_err(&device->pdev->dev, "no usable interrupts\n"); 1569 - device->irq_mode = none; 1570 - return -1; 1571 - } 1572 - 1573 - /** 1574 - * ioat_dma_remove_interrupts - remove whatever interrupts were set 1575 - * @device: ioat device 1576 - */ 1577 - static void ioat_dma_remove_interrupts(struct ioatdma_device *device) 1578 - { 1579 - struct ioat_dma_chan *ioat_chan; 1580 - int i; 1581 - 1582 - /* Disable all interrupt generation */ 1583 - writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET); 1584 - 1585 - switch (device->irq_mode) { 1586 - case msix_multi_vector: 1587 - for (i = 0; i < device->common.chancnt; i++) { 1588 - ioat_chan = ioat_lookup_chan_by_index(device, i); 1589 - free_irq(device->msix_entries[i].vector, ioat_chan); 1590 - } 1591 - pci_disable_msix(device->pdev); 1592 - break; 1593 - case msix_single_vector: 1594 - free_irq(device->msix_entries[0].vector, device); 1595 - pci_disable_msix(device->pdev); 1596 - break; 1597 - case msi: 1598 - free_irq(device->pdev->irq, device); 1599 - pci_disable_msi(device->pdev); 1600 - break; 1601 - case intx: 1602 - free_irq(device->pdev->irq, device); 1603 - break; 1604 - case none: 1605 - dev_warn(&device->pdev->dev, 1606 - "call to %s without interrupts setup\n", __func__); 1607 - } 1608 - device->irq_mode = none; 1609 - } 1610 - 1611 - struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev, 1612 - void __iomem *iobase) 1613 - { 1614 - int err; 1615 - struct ioatdma_device *device; 1616 - 1617 - device = kzalloc(sizeof(*device), GFP_KERNEL); 1618 - if (!device) { 1619 - err = -ENOMEM; 1620 - goto err_kzalloc; 1621 - } 1622 - device->pdev = pdev; 1623 - device->reg_base = iobase; 1624 - device->version = readb(device->reg_base + IOAT_VER_OFFSET); 1625 - 1626 - /* DMA coherent memory pool for DMA descriptor allocations */ 1627 - device->dma_pool = pci_pool_create("dma_desc_pool", pdev, 1628 - sizeof(struct ioat_dma_descriptor), 1629 - 64, 0); 1630 - if (!device->dma_pool) { 1631 - err = -ENOMEM; 1632 - goto err_dma_pool; 1633 - } 1634 - 1635 - device->completion_pool = pci_pool_create("completion_pool", pdev, 1636 - sizeof(u64), SMP_CACHE_BYTES, 1637 - SMP_CACHE_BYTES); 1638 - if (!device->completion_pool) { 1639 - err = -ENOMEM; 1640 - goto err_completion_pool; 1641 - } 1642 - 1643 - INIT_LIST_HEAD(&device->common.channels); 1644 - ioat_dma_enumerate_channels(device); 1645 - 1646 - device->common.device_alloc_chan_resources = 1647 - ioat_dma_alloc_chan_resources; 1648 - device->common.device_free_chan_resources = 1649 - ioat_dma_free_chan_resources; 1650 - device->common.dev = &pdev->dev; 1651 - 1652 - dma_cap_set(DMA_MEMCPY, device->common.cap_mask); 1653 - device->common.device_is_tx_complete = ioat_dma_is_complete; 1654 - switch (device->version) { 1655 - case IOAT_VER_1_2: 1656 - device->common.device_prep_dma_memcpy = ioat1_dma_prep_memcpy; 1657 - device->common.device_issue_pending = 1658 - ioat1_dma_memcpy_issue_pending; 1659 - break; 1660 - case IOAT_VER_2_0: 1661 - case IOAT_VER_3_0: 1662 - device->common.device_prep_dma_memcpy = ioat2_dma_prep_memcpy; 1663 - device->common.device_issue_pending = 1664 - ioat2_dma_memcpy_issue_pending; 1665 - break; 1666 - } 1667 - 1668 - dev_err(&device->pdev->dev, 1669 - "Intel(R) I/OAT DMA Engine found," 1670 - " %d channels, device version 0x%02x, driver version %s\n", 1671 - device->common.chancnt, device->version, IOAT_DMA_VERSION); 1672 - 1673 - if (!device->common.chancnt) { 1674 - dev_err(&device->pdev->dev, 1675 - "Intel(R) I/OAT DMA Engine problem found: " 1676 - "zero channels detected\n"); 1677 - goto err_setup_interrupts; 1678 - } 1679 - 1680 - err = ioat_dma_setup_interrupts(device); 1681 - if (err) 1682 - goto err_setup_interrupts; 1683 - 1684 - err = ioat_dma_self_test(device); 1685 - if (err) 1686 - goto err_self_test; 1687 - 1688 - ioat_set_tcp_copy_break(device); 1689 - 1690 - dma_async_device_register(&device->common); 1691 - 1692 - if (device->version != IOAT_VER_3_0) { 1693 - INIT_DELAYED_WORK(&device->work, ioat_dma_chan_watchdog); 1694 - schedule_delayed_work(&device->work, 1695 - WATCHDOG_DELAY); 1696 - } 1697 - 1698 - return device; 1699 - 1700 - err_self_test: 1701 - ioat_dma_remove_interrupts(device); 1702 - err_setup_interrupts: 1703 - pci_pool_destroy(device->completion_pool); 1704 - err_completion_pool: 1705 - pci_pool_destroy(device->dma_pool); 1706 - err_dma_pool: 1707 - kfree(device); 1708 - err_kzalloc: 1709 - dev_err(&pdev->dev, 1710 - "Intel(R) I/OAT DMA Engine initialization failed\n"); 1711 - return NULL; 1712 - } 1713 - 1714 - void ioat_dma_remove(struct ioatdma_device *device) 1715 - { 1716 - struct dma_chan *chan, *_chan; 1717 - struct ioat_dma_chan *ioat_chan; 1718 - 1719 - if (device->version != IOAT_VER_3_0) 1720 - cancel_delayed_work(&device->work); 1721 - 1722 - ioat_dma_remove_interrupts(device); 1723 - 1724 - dma_async_device_unregister(&device->common); 1725 - 1726 - pci_pool_destroy(device->dma_pool); 1727 - pci_pool_destroy(device->completion_pool); 1728 - 1729 - iounmap(device->reg_base); 1730 - pci_release_regions(device->pdev); 1731 - pci_disable_device(device->pdev); 1732 - 1733 - list_for_each_entry_safe(chan, _chan, 1734 - &device->common.channels, device_node) { 1735 - ioat_chan = to_ioat_chan(chan); 1736 - list_del(&chan->device_node); 1737 - kfree(ioat_chan); 1738 - } 1739 - kfree(device); 1740 - } 1741 -
-165
drivers/dma/ioatdma.h
··· 1 - /* 2 - * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 3 - * 4 - * This program is free software; you can redistribute it and/or modify it 5 - * under the terms of the GNU General Public License as published by the Free 6 - * Software Foundation; either version 2 of the License, or (at your option) 7 - * any later version. 8 - * 9 - * This program is distributed in the hope that it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program; if not, write to the Free Software Foundation, Inc., 59 16 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 - * 18 - * The full GNU General Public License is included in this distribution in the 19 - * file called COPYING. 20 - */ 21 - #ifndef IOATDMA_H 22 - #define IOATDMA_H 23 - 24 - #include <linux/dmaengine.h> 25 - #include "ioatdma_hw.h" 26 - #include <linux/init.h> 27 - #include <linux/dmapool.h> 28 - #include <linux/cache.h> 29 - #include <linux/pci_ids.h> 30 - #include <net/tcp.h> 31 - 32 - #define IOAT_DMA_VERSION "3.64" 33 - 34 - enum ioat_interrupt { 35 - none = 0, 36 - msix_multi_vector = 1, 37 - msix_single_vector = 2, 38 - msi = 3, 39 - intx = 4, 40 - }; 41 - 42 - #define IOAT_LOW_COMPLETION_MASK 0xffffffc0 43 - #define IOAT_DMA_DCA_ANY_CPU ~0 44 - #define IOAT_WATCHDOG_PERIOD (2 * HZ) 45 - 46 - 47 - /** 48 - * struct ioatdma_device - internal representation of a IOAT device 49 - * @pdev: PCI-Express device 50 - * @reg_base: MMIO register space base address 51 - * @dma_pool: for allocating DMA descriptors 52 - * @common: embedded struct dma_device 53 - * @version: version of ioatdma device 54 - * @irq_mode: which style irq to use 55 - * @msix_entries: irq handlers 56 - * @idx: per channel data 57 - */ 58 - 59 - struct ioatdma_device { 60 - struct pci_dev *pdev; 61 - void __iomem *reg_base; 62 - struct pci_pool *dma_pool; 63 - struct pci_pool *completion_pool; 64 - struct dma_device common; 65 - u8 version; 66 - enum ioat_interrupt irq_mode; 67 - struct delayed_work work; 68 - struct msix_entry msix_entries[4]; 69 - struct ioat_dma_chan *idx[4]; 70 - }; 71 - 72 - /** 73 - * struct ioat_dma_chan - internal representation of a DMA channel 74 - */ 75 - struct ioat_dma_chan { 76 - 77 - void __iomem *reg_base; 78 - 79 - dma_cookie_t completed_cookie; 80 - unsigned long last_completion; 81 - unsigned long last_completion_time; 82 - 83 - size_t xfercap; /* XFERCAP register value expanded out */ 84 - 85 - spinlock_t cleanup_lock; 86 - spinlock_t desc_lock; 87 - struct list_head free_desc; 88 - struct list_head used_desc; 89 - unsigned long watchdog_completion; 90 - int watchdog_tcp_cookie; 91 - u32 watchdog_last_tcp_cookie; 92 - struct delayed_work work; 93 - 94 - int pending; 95 - int dmacount; 96 - int desccount; 97 - 98 - struct ioatdma_device *device; 99 - struct dma_chan common; 100 - 101 - dma_addr_t completion_addr; 102 - union { 103 - u64 full; /* HW completion writeback */ 104 - struct { 105 - u32 low; 106 - u32 high; 107 - }; 108 - } *completion_virt; 109 - unsigned long last_compl_desc_addr_hw; 110 - struct tasklet_struct cleanup_task; 111 - }; 112 - 113 - /* wrapper around hardware descriptor format + additional software fields */ 114 - 115 - /** 116 - * struct ioat_desc_sw - wrapper around hardware descriptor 117 - * @hw: hardware DMA descriptor 118 - * @node: this descriptor will either be on the free list, 119 - * or attached to a transaction list (async_tx.tx_list) 120 - * @tx_cnt: number of descriptors required to complete the transaction 121 - * @async_tx: the generic software descriptor for all engines 122 - */ 123 - struct ioat_desc_sw { 124 - struct ioat_dma_descriptor *hw; 125 - struct list_head node; 126 - int tx_cnt; 127 - size_t len; 128 - dma_addr_t src; 129 - dma_addr_t dst; 130 - struct dma_async_tx_descriptor async_tx; 131 - }; 132 - 133 - static inline void ioat_set_tcp_copy_break(struct ioatdma_device *dev) 134 - { 135 - #ifdef CONFIG_NET_DMA 136 - switch (dev->version) { 137 - case IOAT_VER_1_2: 138 - sysctl_tcp_dma_copybreak = 4096; 139 - break; 140 - case IOAT_VER_2_0: 141 - sysctl_tcp_dma_copybreak = 2048; 142 - break; 143 - case IOAT_VER_3_0: 144 - sysctl_tcp_dma_copybreak = 262144; 145 - break; 146 - } 147 - #endif 148 - } 149 - 150 - #if defined(CONFIG_INTEL_IOATDMA) || defined(CONFIG_INTEL_IOATDMA_MODULE) 151 - struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev, 152 - void __iomem *iobase); 153 - void ioat_dma_remove(struct ioatdma_device *device); 154 - struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase); 155 - struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase); 156 - struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase); 157 - #else 158 - #define ioat_dma_probe(pdev, iobase) NULL 159 - #define ioat_dma_remove(device) do { } while (0) 160 - #define ioat_dca_init(pdev, iobase) NULL 161 - #define ioat2_dca_init(pdev, iobase) NULL 162 - #define ioat3_dca_init(pdev, iobase) NULL 163 - #endif 164 - 165 - #endif /* IOATDMA_H */
-70
drivers/dma/ioatdma_hw.h
··· 1 - /* 2 - * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved. 3 - * 4 - * This program is free software; you can redistribute it and/or modify it 5 - * under the terms of the GNU General Public License as published by the Free 6 - * Software Foundation; either version 2 of the License, or (at your option) 7 - * any later version. 8 - * 9 - * This program is distributed in the hope that it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program; if not, write to the Free Software Foundation, Inc., 59 16 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 - * 18 - * The full GNU General Public License is included in this distribution in the 19 - * file called COPYING. 20 - */ 21 - #ifndef _IOAT_HW_H_ 22 - #define _IOAT_HW_H_ 23 - 24 - /* PCI Configuration Space Values */ 25 - #define IOAT_PCI_VID 0x8086 26 - 27 - /* CB device ID's */ 28 - #define IOAT_PCI_DID_5000 0x1A38 29 - #define IOAT_PCI_DID_CNB 0x360B 30 - #define IOAT_PCI_DID_SCNB 0x65FF 31 - #define IOAT_PCI_DID_SNB 0x402F 32 - 33 - #define IOAT_PCI_RID 0x00 34 - #define IOAT_PCI_SVID 0x8086 35 - #define IOAT_PCI_SID 0x8086 36 - #define IOAT_VER_1_2 0x12 /* Version 1.2 */ 37 - #define IOAT_VER_2_0 0x20 /* Version 2.0 */ 38 - #define IOAT_VER_3_0 0x30 /* Version 3.0 */ 39 - 40 - struct ioat_dma_descriptor { 41 - uint32_t size; 42 - uint32_t ctl; 43 - uint64_t src_addr; 44 - uint64_t dst_addr; 45 - uint64_t next; 46 - uint64_t rsv1; 47 - uint64_t rsv2; 48 - uint64_t user1; 49 - uint64_t user2; 50 - }; 51 - 52 - #define IOAT_DMA_DESCRIPTOR_CTL_INT_GN 0x00000001 53 - #define IOAT_DMA_DESCRIPTOR_CTL_SRC_SN 0x00000002 54 - #define IOAT_DMA_DESCRIPTOR_CTL_DST_SN 0x00000004 55 - #define IOAT_DMA_DESCRIPTOR_CTL_CP_STS 0x00000008 56 - #define IOAT_DMA_DESCRIPTOR_CTL_FRAME 0x00000010 57 - #define IOAT_DMA_DESCRIPTOR_NUL 0x00000020 58 - #define IOAT_DMA_DESCRIPTOR_CTL_SP_BRK 0x00000040 59 - #define IOAT_DMA_DESCRIPTOR_CTL_DP_BRK 0x00000080 60 - #define IOAT_DMA_DESCRIPTOR_CTL_BNDL 0x00000100 61 - #define IOAT_DMA_DESCRIPTOR_CTL_DCA 0x00000200 62 - #define IOAT_DMA_DESCRIPTOR_CTL_BUFHINT 0x00000400 63 - 64 - #define IOAT_DMA_DESCRIPTOR_CTL_OPCODE_CONTEXT 0xFF000000 65 - #define IOAT_DMA_DESCRIPTOR_CTL_OPCODE_DMA 0x00000000 66 - 67 - #define IOAT_DMA_DESCRIPTOR_CTL_CONTEXT_DCA 0x00000001 68 - #define IOAT_DMA_DESCRIPTOR_CTL_OPCODE_MASK 0xFF000000 69 - 70 - #endif
+39 -15
drivers/dma/ioatdma_registers.h drivers/dma/ioat/registers.h
··· 64 64 65 65 #define IOAT_DEVICE_STATUS_OFFSET 0x0E /* 16-bit */ 66 66 #define IOAT_DEVICE_STATUS_DEGRADED_MODE 0x0001 67 + #define IOAT_DEVICE_MMIO_RESTRICTED 0x0002 68 + #define IOAT_DEVICE_MEMORY_BYPASS 0x0004 69 + #define IOAT_DEVICE_ADDRESS_REMAPPING 0x0008 70 + 71 + #define IOAT_DMA_CAP_OFFSET 0x10 /* 32-bit */ 72 + #define IOAT_CAP_PAGE_BREAK 0x00000001 73 + #define IOAT_CAP_CRC 0x00000002 74 + #define IOAT_CAP_SKIP_MARKER 0x00000004 75 + #define IOAT_CAP_DCA 0x00000010 76 + #define IOAT_CAP_CRC_MOVE 0x00000020 77 + #define IOAT_CAP_FILL_BLOCK 0x00000040 78 + #define IOAT_CAP_APIC 0x00000080 79 + #define IOAT_CAP_XOR 0x00000100 80 + #define IOAT_CAP_PQ 0x00000200 67 81 68 82 #define IOAT_CHANNEL_MMIO_SIZE 0x80 /* Each Channel MMIO space is this size */ 69 83 70 84 /* DMA Channel Registers */ 71 85 #define IOAT_CHANCTRL_OFFSET 0x00 /* 16-bit Channel Control Register */ 72 86 #define IOAT_CHANCTRL_CHANNEL_PRIORITY_MASK 0xF000 87 + #define IOAT3_CHANCTRL_COMPL_DCA_EN 0x0200 73 88 #define IOAT_CHANCTRL_CHANNEL_IN_USE 0x0100 74 89 #define IOAT_CHANCTRL_DESCRIPTOR_ADDR_SNOOP_CONTROL 0x0020 75 90 #define IOAT_CHANCTRL_ERR_INT_EN 0x0010 76 91 #define IOAT_CHANCTRL_ANY_ERR_ABORT_EN 0x0008 77 92 #define IOAT_CHANCTRL_ERR_COMPLETION_EN 0x0004 78 - #define IOAT_CHANCTRL_INT_DISABLE 0x0001 93 + #define IOAT_CHANCTRL_INT_REARM 0x0001 94 + #define IOAT_CHANCTRL_RUN (IOAT_CHANCTRL_INT_REARM |\ 95 + IOAT_CHANCTRL_ERR_COMPLETION_EN |\ 96 + IOAT_CHANCTRL_ANY_ERR_ABORT_EN |\ 97 + IOAT_CHANCTRL_ERR_INT_EN) 79 98 80 99 #define IOAT_DMA_COMP_OFFSET 0x02 /* 16-bit DMA channel compatibility */ 81 100 #define IOAT_DMA_COMP_V1 0x0001 /* Compatibility with DMA version 1 */ ··· 113 94 #define IOAT2_CHANSTS_OFFSET_HIGH 0x0C 114 95 #define IOAT_CHANSTS_OFFSET_HIGH(ver) ((ver) < IOAT_VER_2_0 \ 115 96 ? IOAT1_CHANSTS_OFFSET_HIGH : IOAT2_CHANSTS_OFFSET_HIGH) 116 - #define IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR ~0x3F 117 - #define IOAT_CHANSTS_SOFT_ERR 0x0000000000000010 118 - #define IOAT_CHANSTS_UNAFFILIATED_ERR 0x0000000000000008 119 - #define IOAT_CHANSTS_DMA_TRANSFER_STATUS 0x0000000000000007 120 - #define IOAT_CHANSTS_DMA_TRANSFER_STATUS_ACTIVE 0x0 121 - #define IOAT_CHANSTS_DMA_TRANSFER_STATUS_DONE 0x1 122 - #define IOAT_CHANSTS_DMA_TRANSFER_STATUS_SUSPENDED 0x2 123 - #define IOAT_CHANSTS_DMA_TRANSFER_STATUS_HALTED 0x3 97 + #define IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR (~0x3fULL) 98 + #define IOAT_CHANSTS_SOFT_ERR 0x10ULL 99 + #define IOAT_CHANSTS_UNAFFILIATED_ERR 0x8ULL 100 + #define IOAT_CHANSTS_STATUS 0x7ULL 101 + #define IOAT_CHANSTS_ACTIVE 0x0 102 + #define IOAT_CHANSTS_DONE 0x1 103 + #define IOAT_CHANSTS_SUSPENDED 0x2 104 + #define IOAT_CHANSTS_HALTED 0x3 124 105 125 106 126 107 ··· 223 204 #define IOAT_CDAR_OFFSET_HIGH 0x24 224 205 225 206 #define IOAT_CHANERR_OFFSET 0x28 /* 32-bit Channel Error Register */ 226 - #define IOAT_CHANERR_DMA_TRANSFER_SRC_ADDR_ERR 0x0001 227 - #define IOAT_CHANERR_DMA_TRANSFER_DEST_ADDR_ERR 0x0002 228 - #define IOAT_CHANERR_NEXT_DESCRIPTOR_ADDR_ERR 0x0004 229 - #define IOAT_CHANERR_NEXT_DESCRIPTOR_ALIGNMENT_ERR 0x0008 207 + #define IOAT_CHANERR_SRC_ADDR_ERR 0x0001 208 + #define IOAT_CHANERR_DEST_ADDR_ERR 0x0002 209 + #define IOAT_CHANERR_NEXT_ADDR_ERR 0x0004 210 + #define IOAT_CHANERR_NEXT_DESC_ALIGN_ERR 0x0008 230 211 #define IOAT_CHANERR_CHAIN_ADDR_VALUE_ERR 0x0010 231 212 #define IOAT_CHANERR_CHANCMD_ERR 0x0020 232 213 #define IOAT_CHANERR_CHIPSET_UNCORRECTABLE_DATA_INTEGRITY_ERR 0x0040 233 214 #define IOAT_CHANERR_DMA_UNCORRECTABLE_DATA_INTEGRITY_ERR 0x0080 234 215 #define IOAT_CHANERR_READ_DATA_ERR 0x0100 235 216 #define IOAT_CHANERR_WRITE_DATA_ERR 0x0200 236 - #define IOAT_CHANERR_DESCRIPTOR_CONTROL_ERR 0x0400 237 - #define IOAT_CHANERR_DESCRIPTOR_LENGTH_ERR 0x0800 217 + #define IOAT_CHANERR_CONTROL_ERR 0x0400 218 + #define IOAT_CHANERR_LENGTH_ERR 0x0800 238 219 #define IOAT_CHANERR_COMPLETION_ADDR_ERR 0x1000 239 220 #define IOAT_CHANERR_INT_CONFIGURATION_ERR 0x2000 240 221 #define IOAT_CHANERR_SOFT_ERR 0x4000 241 222 #define IOAT_CHANERR_UNAFFILIATED_ERR 0x8000 223 + #define IOAT_CHANERR_XOR_P_OR_CRC_ERR 0x10000 224 + #define IOAT_CHANERR_XOR_Q_ERR 0x20000 225 + #define IOAT_CHANERR_DESCRIPTOR_COUNT_ERR 0x40000 226 + 227 + #define IOAT_CHANERR_HANDLE_MASK (IOAT_CHANERR_XOR_P_OR_CRC_ERR | IOAT_CHANERR_XOR_Q_ERR) 242 228 243 229 #define IOAT_CHANERR_MASK_OFFSET 0x2C /* 32-bit Channel Error Register */ 244 230
+419 -72
drivers/dma/iop-adma.c
··· 31 31 #include <linux/platform_device.h> 32 32 #include <linux/memory.h> 33 33 #include <linux/ioport.h> 34 + #include <linux/raid/pq.h> 34 35 35 36 #include <mach/adma.h> 36 37 ··· 58 57 } 59 58 } 60 59 60 + static void 61 + iop_desc_unmap(struct iop_adma_chan *iop_chan, struct iop_adma_desc_slot *desc) 62 + { 63 + struct dma_async_tx_descriptor *tx = &desc->async_tx; 64 + struct iop_adma_desc_slot *unmap = desc->group_head; 65 + struct device *dev = &iop_chan->device->pdev->dev; 66 + u32 len = unmap->unmap_len; 67 + enum dma_ctrl_flags flags = tx->flags; 68 + u32 src_cnt; 69 + dma_addr_t addr; 70 + dma_addr_t dest; 71 + 72 + src_cnt = unmap->unmap_src_cnt; 73 + dest = iop_desc_get_dest_addr(unmap, iop_chan); 74 + if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 75 + enum dma_data_direction dir; 76 + 77 + if (src_cnt > 1) /* is xor? */ 78 + dir = DMA_BIDIRECTIONAL; 79 + else 80 + dir = DMA_FROM_DEVICE; 81 + 82 + dma_unmap_page(dev, dest, len, dir); 83 + } 84 + 85 + if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 86 + while (src_cnt--) { 87 + addr = iop_desc_get_src_addr(unmap, iop_chan, src_cnt); 88 + if (addr == dest) 89 + continue; 90 + dma_unmap_page(dev, addr, len, DMA_TO_DEVICE); 91 + } 92 + } 93 + desc->group_head = NULL; 94 + } 95 + 96 + static void 97 + iop_desc_unmap_pq(struct iop_adma_chan *iop_chan, struct iop_adma_desc_slot *desc) 98 + { 99 + struct dma_async_tx_descriptor *tx = &desc->async_tx; 100 + struct iop_adma_desc_slot *unmap = desc->group_head; 101 + struct device *dev = &iop_chan->device->pdev->dev; 102 + u32 len = unmap->unmap_len; 103 + enum dma_ctrl_flags flags = tx->flags; 104 + u32 src_cnt = unmap->unmap_src_cnt; 105 + dma_addr_t pdest = iop_desc_get_dest_addr(unmap, iop_chan); 106 + dma_addr_t qdest = iop_desc_get_qdest_addr(unmap, iop_chan); 107 + int i; 108 + 109 + if (tx->flags & DMA_PREP_CONTINUE) 110 + src_cnt -= 3; 111 + 112 + if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP) && !desc->pq_check_result) { 113 + dma_unmap_page(dev, pdest, len, DMA_BIDIRECTIONAL); 114 + dma_unmap_page(dev, qdest, len, DMA_BIDIRECTIONAL); 115 + } 116 + 117 + if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 118 + dma_addr_t addr; 119 + 120 + for (i = 0; i < src_cnt; i++) { 121 + addr = iop_desc_get_src_addr(unmap, iop_chan, i); 122 + dma_unmap_page(dev, addr, len, DMA_TO_DEVICE); 123 + } 124 + if (desc->pq_check_result) { 125 + dma_unmap_page(dev, pdest, len, DMA_TO_DEVICE); 126 + dma_unmap_page(dev, qdest, len, DMA_TO_DEVICE); 127 + } 128 + } 129 + 130 + desc->group_head = NULL; 131 + } 132 + 133 + 61 134 static dma_cookie_t 62 135 iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc, 63 136 struct iop_adma_chan *iop_chan, dma_cookie_t cookie) 64 137 { 65 - BUG_ON(desc->async_tx.cookie < 0); 66 - if (desc->async_tx.cookie > 0) { 67 - cookie = desc->async_tx.cookie; 68 - desc->async_tx.cookie = 0; 138 + struct dma_async_tx_descriptor *tx = &desc->async_tx; 139 + 140 + BUG_ON(tx->cookie < 0); 141 + if (tx->cookie > 0) { 142 + cookie = tx->cookie; 143 + tx->cookie = 0; 69 144 70 145 /* call the callback (must not sleep or submit new 71 146 * operations to this channel) 72 147 */ 73 - if (desc->async_tx.callback) 74 - desc->async_tx.callback( 75 - desc->async_tx.callback_param); 148 + if (tx->callback) 149 + tx->callback(tx->callback_param); 76 150 77 151 /* unmap dma addresses 78 152 * (unmap_single vs unmap_page?) 79 153 */ 80 154 if (desc->group_head && desc->unmap_len) { 81 - struct iop_adma_desc_slot *unmap = desc->group_head; 82 - struct device *dev = 83 - &iop_chan->device->pdev->dev; 84 - u32 len = unmap->unmap_len; 85 - enum dma_ctrl_flags flags = desc->async_tx.flags; 86 - u32 src_cnt; 87 - dma_addr_t addr; 88 - dma_addr_t dest; 89 - 90 - src_cnt = unmap->unmap_src_cnt; 91 - dest = iop_desc_get_dest_addr(unmap, iop_chan); 92 - if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { 93 - enum dma_data_direction dir; 94 - 95 - if (src_cnt > 1) /* is xor? */ 96 - dir = DMA_BIDIRECTIONAL; 97 - else 98 - dir = DMA_FROM_DEVICE; 99 - 100 - dma_unmap_page(dev, dest, len, dir); 101 - } 102 - 103 - if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { 104 - while (src_cnt--) { 105 - addr = iop_desc_get_src_addr(unmap, 106 - iop_chan, 107 - src_cnt); 108 - if (addr == dest) 109 - continue; 110 - dma_unmap_page(dev, addr, len, 111 - DMA_TO_DEVICE); 112 - } 113 - } 114 - desc->group_head = NULL; 155 + if (iop_desc_is_pq(desc)) 156 + iop_desc_unmap_pq(iop_chan, desc); 157 + else 158 + iop_desc_unmap(iop_chan, desc); 115 159 } 116 160 } 117 161 118 162 /* run dependent operations */ 119 - dma_run_dependencies(&desc->async_tx); 163 + dma_run_dependencies(tx); 120 164 121 165 return cookie; 122 166 } ··· 333 287 { 334 288 struct iop_adma_chan *iop_chan = (struct iop_adma_chan *) data; 335 289 336 - spin_lock(&iop_chan->lock); 290 + /* lockdep will flag depedency submissions as potentially 291 + * recursive locking, this is not the case as a dependency 292 + * submission will never recurse a channels submit routine. 293 + * There are checks in async_tx.c to prevent this. 294 + */ 295 + spin_lock_nested(&iop_chan->lock, SINGLE_DEPTH_NESTING); 337 296 __iop_adma_slot_cleanup(iop_chan); 338 297 spin_unlock(&iop_chan->lock); 339 298 } ··· 421 370 } 422 371 alloc_tail->group_head = alloc_start; 423 372 alloc_tail->async_tx.cookie = -EBUSY; 424 - list_splice(&chain, &alloc_tail->async_tx.tx_list); 373 + list_splice(&chain, &alloc_tail->tx_list); 425 374 iop_chan->last_used = last_used; 426 375 iop_desc_clear_next_desc(alloc_start); 427 376 iop_desc_clear_next_desc(alloc_tail); ··· 480 429 481 430 old_chain_tail = list_entry(iop_chan->chain.prev, 482 431 struct iop_adma_desc_slot, chain_node); 483 - list_splice_init(&sw_desc->async_tx.tx_list, 432 + list_splice_init(&sw_desc->tx_list, 484 433 &old_chain_tail->chain_node); 485 434 486 435 /* fix up the hardware chain */ ··· 547 496 548 497 dma_async_tx_descriptor_init(&slot->async_tx, chan); 549 498 slot->async_tx.tx_submit = iop_adma_tx_submit; 499 + INIT_LIST_HEAD(&slot->tx_list); 550 500 INIT_LIST_HEAD(&slot->chain_node); 551 501 INIT_LIST_HEAD(&slot->slot_node); 552 502 hw_desc = (char *) iop_chan->device->dma_desc_pool; ··· 712 660 } 713 661 714 662 static struct dma_async_tx_descriptor * 715 - iop_adma_prep_dma_zero_sum(struct dma_chan *chan, dma_addr_t *dma_src, 716 - unsigned int src_cnt, size_t len, u32 *result, 717 - unsigned long flags) 663 + iop_adma_prep_dma_xor_val(struct dma_chan *chan, dma_addr_t *dma_src, 664 + unsigned int src_cnt, size_t len, u32 *result, 665 + unsigned long flags) 718 666 { 719 667 struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan); 720 668 struct iop_adma_desc_slot *sw_desc, *grp_start; ··· 742 690 while (src_cnt--) 743 691 iop_desc_set_zero_sum_src_addr(grp_start, src_cnt, 744 692 dma_src[src_cnt]); 693 + } 694 + spin_unlock_bh(&iop_chan->lock); 695 + 696 + return sw_desc ? &sw_desc->async_tx : NULL; 697 + } 698 + 699 + static struct dma_async_tx_descriptor * 700 + iop_adma_prep_dma_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src, 701 + unsigned int src_cnt, const unsigned char *scf, size_t len, 702 + unsigned long flags) 703 + { 704 + struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan); 705 + struct iop_adma_desc_slot *sw_desc, *g; 706 + int slot_cnt, slots_per_op; 707 + int continue_srcs; 708 + 709 + if (unlikely(!len)) 710 + return NULL; 711 + BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT); 712 + 713 + dev_dbg(iop_chan->device->common.dev, 714 + "%s src_cnt: %d len: %u flags: %lx\n", 715 + __func__, src_cnt, len, flags); 716 + 717 + if (dmaf_p_disabled_continue(flags)) 718 + continue_srcs = 1+src_cnt; 719 + else if (dmaf_continue(flags)) 720 + continue_srcs = 3+src_cnt; 721 + else 722 + continue_srcs = 0+src_cnt; 723 + 724 + spin_lock_bh(&iop_chan->lock); 725 + slot_cnt = iop_chan_pq_slot_count(len, continue_srcs, &slots_per_op); 726 + sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op); 727 + if (sw_desc) { 728 + int i; 729 + 730 + g = sw_desc->group_head; 731 + iop_desc_set_byte_count(g, iop_chan, len); 732 + 733 + /* even if P is disabled its destination address (bits 734 + * [3:0]) must match Q. It is ok if P points to an 735 + * invalid address, it won't be written. 736 + */ 737 + if (flags & DMA_PREP_PQ_DISABLE_P) 738 + dst[0] = dst[1] & 0x7; 739 + 740 + iop_desc_set_pq_addr(g, dst); 741 + sw_desc->unmap_src_cnt = src_cnt; 742 + sw_desc->unmap_len = len; 743 + sw_desc->async_tx.flags = flags; 744 + for (i = 0; i < src_cnt; i++) 745 + iop_desc_set_pq_src_addr(g, i, src[i], scf[i]); 746 + 747 + /* if we are continuing a previous operation factor in 748 + * the old p and q values, see the comment for dma_maxpq 749 + * in include/linux/dmaengine.h 750 + */ 751 + if (dmaf_p_disabled_continue(flags)) 752 + iop_desc_set_pq_src_addr(g, i++, dst[1], 1); 753 + else if (dmaf_continue(flags)) { 754 + iop_desc_set_pq_src_addr(g, i++, dst[0], 0); 755 + iop_desc_set_pq_src_addr(g, i++, dst[1], 1); 756 + iop_desc_set_pq_src_addr(g, i++, dst[1], 0); 757 + } 758 + iop_desc_init_pq(g, i, flags); 759 + } 760 + spin_unlock_bh(&iop_chan->lock); 761 + 762 + return sw_desc ? &sw_desc->async_tx : NULL; 763 + } 764 + 765 + static struct dma_async_tx_descriptor * 766 + iop_adma_prep_dma_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src, 767 + unsigned int src_cnt, const unsigned char *scf, 768 + size_t len, enum sum_check_flags *pqres, 769 + unsigned long flags) 770 + { 771 + struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan); 772 + struct iop_adma_desc_slot *sw_desc, *g; 773 + int slot_cnt, slots_per_op; 774 + 775 + if (unlikely(!len)) 776 + return NULL; 777 + BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT); 778 + 779 + dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n", 780 + __func__, src_cnt, len); 781 + 782 + spin_lock_bh(&iop_chan->lock); 783 + slot_cnt = iop_chan_pq_zero_sum_slot_count(len, src_cnt + 2, &slots_per_op); 784 + sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op); 785 + if (sw_desc) { 786 + /* for validate operations p and q are tagged onto the 787 + * end of the source list 788 + */ 789 + int pq_idx = src_cnt; 790 + 791 + g = sw_desc->group_head; 792 + iop_desc_init_pq_zero_sum(g, src_cnt+2, flags); 793 + iop_desc_set_pq_zero_sum_byte_count(g, len); 794 + g->pq_check_result = pqres; 795 + pr_debug("\t%s: g->pq_check_result: %p\n", 796 + __func__, g->pq_check_result); 797 + sw_desc->unmap_src_cnt = src_cnt+2; 798 + sw_desc->unmap_len = len; 799 + sw_desc->async_tx.flags = flags; 800 + while (src_cnt--) 801 + iop_desc_set_pq_zero_sum_src_addr(g, src_cnt, 802 + src[src_cnt], 803 + scf[src_cnt]); 804 + iop_desc_set_pq_zero_sum_addr(g, pq_idx, src); 745 805 } 746 806 spin_unlock_bh(&iop_chan->lock); 747 807 ··· 1070 906 1071 907 #define IOP_ADMA_NUM_SRC_TEST 4 /* must be <= 15 */ 1072 908 static int __devinit 1073 - iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device) 909 + iop_adma_xor_val_self_test(struct iop_adma_device *device) 1074 910 { 1075 911 int i, src_idx; 1076 912 struct page *dest; ··· 1166 1002 PAGE_SIZE, DMA_TO_DEVICE); 1167 1003 1168 1004 /* skip zero sum if the capability is not present */ 1169 - if (!dma_has_cap(DMA_ZERO_SUM, dma_chan->device->cap_mask)) 1005 + if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask)) 1170 1006 goto free_resources; 1171 1007 1172 1008 /* zero sum the sources with the destintation page */ ··· 1180 1016 dma_srcs[i] = dma_map_page(dma_chan->device->dev, 1181 1017 zero_sum_srcs[i], 0, PAGE_SIZE, 1182 1018 DMA_TO_DEVICE); 1183 - tx = iop_adma_prep_dma_zero_sum(dma_chan, dma_srcs, 1184 - IOP_ADMA_NUM_SRC_TEST + 1, PAGE_SIZE, 1185 - &zero_sum_result, 1186 - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 1019 + tx = iop_adma_prep_dma_xor_val(dma_chan, dma_srcs, 1020 + IOP_ADMA_NUM_SRC_TEST + 1, PAGE_SIZE, 1021 + &zero_sum_result, 1022 + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 1187 1023 1188 1024 cookie = iop_adma_tx_submit(tx); 1189 1025 iop_adma_issue_pending(dma_chan); ··· 1236 1072 dma_srcs[i] = dma_map_page(dma_chan->device->dev, 1237 1073 zero_sum_srcs[i], 0, PAGE_SIZE, 1238 1074 DMA_TO_DEVICE); 1239 - tx = iop_adma_prep_dma_zero_sum(dma_chan, dma_srcs, 1240 - IOP_ADMA_NUM_SRC_TEST + 1, PAGE_SIZE, 1241 - &zero_sum_result, 1242 - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 1075 + tx = iop_adma_prep_dma_xor_val(dma_chan, dma_srcs, 1076 + IOP_ADMA_NUM_SRC_TEST + 1, PAGE_SIZE, 1077 + &zero_sum_result, 1078 + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 1243 1079 1244 1080 cookie = iop_adma_tx_submit(tx); 1245 1081 iop_adma_issue_pending(dma_chan); ··· 1268 1104 __free_page(dest); 1269 1105 return err; 1270 1106 } 1107 + 1108 + #ifdef CONFIG_MD_RAID6_PQ 1109 + static int __devinit 1110 + iop_adma_pq_zero_sum_self_test(struct iop_adma_device *device) 1111 + { 1112 + /* combined sources, software pq results, and extra hw pq results */ 1113 + struct page *pq[IOP_ADMA_NUM_SRC_TEST+2+2]; 1114 + /* ptr to the extra hw pq buffers defined above */ 1115 + struct page **pq_hw = &pq[IOP_ADMA_NUM_SRC_TEST+2]; 1116 + /* address conversion buffers (dma_map / page_address) */ 1117 + void *pq_sw[IOP_ADMA_NUM_SRC_TEST+2]; 1118 + dma_addr_t pq_src[IOP_ADMA_NUM_SRC_TEST]; 1119 + dma_addr_t pq_dest[2]; 1120 + 1121 + int i; 1122 + struct dma_async_tx_descriptor *tx; 1123 + struct dma_chan *dma_chan; 1124 + dma_cookie_t cookie; 1125 + u32 zero_sum_result; 1126 + int err = 0; 1127 + struct device *dev; 1128 + 1129 + dev_dbg(device->common.dev, "%s\n", __func__); 1130 + 1131 + for (i = 0; i < ARRAY_SIZE(pq); i++) { 1132 + pq[i] = alloc_page(GFP_KERNEL); 1133 + if (!pq[i]) { 1134 + while (i--) 1135 + __free_page(pq[i]); 1136 + return -ENOMEM; 1137 + } 1138 + } 1139 + 1140 + /* Fill in src buffers */ 1141 + for (i = 0; i < IOP_ADMA_NUM_SRC_TEST; i++) { 1142 + pq_sw[i] = page_address(pq[i]); 1143 + memset(pq_sw[i], 0x11111111 * (1<<i), PAGE_SIZE); 1144 + } 1145 + pq_sw[i] = page_address(pq[i]); 1146 + pq_sw[i+1] = page_address(pq[i+1]); 1147 + 1148 + dma_chan = container_of(device->common.channels.next, 1149 + struct dma_chan, 1150 + device_node); 1151 + if (iop_adma_alloc_chan_resources(dma_chan) < 1) { 1152 + err = -ENODEV; 1153 + goto out; 1154 + } 1155 + 1156 + dev = dma_chan->device->dev; 1157 + 1158 + /* initialize the dests */ 1159 + memset(page_address(pq_hw[0]), 0 , PAGE_SIZE); 1160 + memset(page_address(pq_hw[1]), 0 , PAGE_SIZE); 1161 + 1162 + /* test pq */ 1163 + pq_dest[0] = dma_map_page(dev, pq_hw[0], 0, PAGE_SIZE, DMA_FROM_DEVICE); 1164 + pq_dest[1] = dma_map_page(dev, pq_hw[1], 0, PAGE_SIZE, DMA_FROM_DEVICE); 1165 + for (i = 0; i < IOP_ADMA_NUM_SRC_TEST; i++) 1166 + pq_src[i] = dma_map_page(dev, pq[i], 0, PAGE_SIZE, 1167 + DMA_TO_DEVICE); 1168 + 1169 + tx = iop_adma_prep_dma_pq(dma_chan, pq_dest, pq_src, 1170 + IOP_ADMA_NUM_SRC_TEST, (u8 *)raid6_gfexp, 1171 + PAGE_SIZE, 1172 + DMA_PREP_INTERRUPT | 1173 + DMA_CTRL_ACK); 1174 + 1175 + cookie = iop_adma_tx_submit(tx); 1176 + iop_adma_issue_pending(dma_chan); 1177 + msleep(8); 1178 + 1179 + if (iop_adma_is_complete(dma_chan, cookie, NULL, NULL) != 1180 + DMA_SUCCESS) { 1181 + dev_err(dev, "Self-test pq timed out, disabling\n"); 1182 + err = -ENODEV; 1183 + goto free_resources; 1184 + } 1185 + 1186 + raid6_call.gen_syndrome(IOP_ADMA_NUM_SRC_TEST+2, PAGE_SIZE, pq_sw); 1187 + 1188 + if (memcmp(pq_sw[IOP_ADMA_NUM_SRC_TEST], 1189 + page_address(pq_hw[0]), PAGE_SIZE) != 0) { 1190 + dev_err(dev, "Self-test p failed compare, disabling\n"); 1191 + err = -ENODEV; 1192 + goto free_resources; 1193 + } 1194 + if (memcmp(pq_sw[IOP_ADMA_NUM_SRC_TEST+1], 1195 + page_address(pq_hw[1]), PAGE_SIZE) != 0) { 1196 + dev_err(dev, "Self-test q failed compare, disabling\n"); 1197 + err = -ENODEV; 1198 + goto free_resources; 1199 + } 1200 + 1201 + /* test correct zero sum using the software generated pq values */ 1202 + for (i = 0; i < IOP_ADMA_NUM_SRC_TEST + 2; i++) 1203 + pq_src[i] = dma_map_page(dev, pq[i], 0, PAGE_SIZE, 1204 + DMA_TO_DEVICE); 1205 + 1206 + zero_sum_result = ~0; 1207 + tx = iop_adma_prep_dma_pq_val(dma_chan, &pq_src[IOP_ADMA_NUM_SRC_TEST], 1208 + pq_src, IOP_ADMA_NUM_SRC_TEST, 1209 + raid6_gfexp, PAGE_SIZE, &zero_sum_result, 1210 + DMA_PREP_INTERRUPT|DMA_CTRL_ACK); 1211 + 1212 + cookie = iop_adma_tx_submit(tx); 1213 + iop_adma_issue_pending(dma_chan); 1214 + msleep(8); 1215 + 1216 + if (iop_adma_is_complete(dma_chan, cookie, NULL, NULL) != 1217 + DMA_SUCCESS) { 1218 + dev_err(dev, "Self-test pq-zero-sum timed out, disabling\n"); 1219 + err = -ENODEV; 1220 + goto free_resources; 1221 + } 1222 + 1223 + if (zero_sum_result != 0) { 1224 + dev_err(dev, "Self-test pq-zero-sum failed to validate: %x\n", 1225 + zero_sum_result); 1226 + err = -ENODEV; 1227 + goto free_resources; 1228 + } 1229 + 1230 + /* test incorrect zero sum */ 1231 + i = IOP_ADMA_NUM_SRC_TEST; 1232 + memset(pq_sw[i] + 100, 0, 100); 1233 + memset(pq_sw[i+1] + 200, 0, 200); 1234 + for (i = 0; i < IOP_ADMA_NUM_SRC_TEST + 2; i++) 1235 + pq_src[i] = dma_map_page(dev, pq[i], 0, PAGE_SIZE, 1236 + DMA_TO_DEVICE); 1237 + 1238 + zero_sum_result = 0; 1239 + tx = iop_adma_prep_dma_pq_val(dma_chan, &pq_src[IOP_ADMA_NUM_SRC_TEST], 1240 + pq_src, IOP_ADMA_NUM_SRC_TEST, 1241 + raid6_gfexp, PAGE_SIZE, &zero_sum_result, 1242 + DMA_PREP_INTERRUPT|DMA_CTRL_ACK); 1243 + 1244 + cookie = iop_adma_tx_submit(tx); 1245 + iop_adma_issue_pending(dma_chan); 1246 + msleep(8); 1247 + 1248 + if (iop_adma_is_complete(dma_chan, cookie, NULL, NULL) != 1249 + DMA_SUCCESS) { 1250 + dev_err(dev, "Self-test !pq-zero-sum timed out, disabling\n"); 1251 + err = -ENODEV; 1252 + goto free_resources; 1253 + } 1254 + 1255 + if (zero_sum_result != (SUM_CHECK_P_RESULT | SUM_CHECK_Q_RESULT)) { 1256 + dev_err(dev, "Self-test !pq-zero-sum failed to validate: %x\n", 1257 + zero_sum_result); 1258 + err = -ENODEV; 1259 + goto free_resources; 1260 + } 1261 + 1262 + free_resources: 1263 + iop_adma_free_chan_resources(dma_chan); 1264 + out: 1265 + i = ARRAY_SIZE(pq); 1266 + while (i--) 1267 + __free_page(pq[i]); 1268 + return err; 1269 + } 1270 + #endif 1271 1271 1272 1272 static int __devexit iop_adma_remove(struct platform_device *dev) 1273 1273 { ··· 1520 1192 dma_dev->max_xor = iop_adma_get_max_xor(); 1521 1193 dma_dev->device_prep_dma_xor = iop_adma_prep_dma_xor; 1522 1194 } 1523 - if (dma_has_cap(DMA_ZERO_SUM, dma_dev->cap_mask)) 1524 - dma_dev->device_prep_dma_zero_sum = 1525 - iop_adma_prep_dma_zero_sum; 1195 + if (dma_has_cap(DMA_XOR_VAL, dma_dev->cap_mask)) 1196 + dma_dev->device_prep_dma_xor_val = 1197 + iop_adma_prep_dma_xor_val; 1198 + if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) { 1199 + dma_set_maxpq(dma_dev, iop_adma_get_max_pq(), 0); 1200 + dma_dev->device_prep_dma_pq = iop_adma_prep_dma_pq; 1201 + } 1202 + if (dma_has_cap(DMA_PQ_VAL, dma_dev->cap_mask)) 1203 + dma_dev->device_prep_dma_pq_val = 1204 + iop_adma_prep_dma_pq_val; 1526 1205 if (dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask)) 1527 1206 dma_dev->device_prep_dma_interrupt = 1528 1207 iop_adma_prep_dma_interrupt; ··· 1583 1248 } 1584 1249 1585 1250 if (dma_has_cap(DMA_XOR, dma_dev->cap_mask) || 1586 - dma_has_cap(DMA_MEMSET, dma_dev->cap_mask)) { 1587 - ret = iop_adma_xor_zero_sum_self_test(adev); 1251 + dma_has_cap(DMA_MEMSET, dma_dev->cap_mask)) { 1252 + ret = iop_adma_xor_val_self_test(adev); 1588 1253 dev_dbg(&pdev->dev, "xor self test returned %d\n", ret); 1589 1254 if (ret) 1590 1255 goto err_free_iop_chan; 1591 1256 } 1592 1257 1258 + if (dma_has_cap(DMA_PQ, dma_dev->cap_mask) && 1259 + dma_has_cap(DMA_PQ_VAL, dma_dev->cap_mask)) { 1260 + #ifdef CONFIG_MD_RAID6_PQ 1261 + ret = iop_adma_pq_zero_sum_self_test(adev); 1262 + dev_dbg(&pdev->dev, "pq self test returned %d\n", ret); 1263 + #else 1264 + /* can not test raid6, so do not publish capability */ 1265 + dma_cap_clear(DMA_PQ, dma_dev->cap_mask); 1266 + dma_cap_clear(DMA_PQ_VAL, dma_dev->cap_mask); 1267 + ret = 0; 1268 + #endif 1269 + if (ret) 1270 + goto err_free_iop_chan; 1271 + } 1272 + 1593 1273 dev_printk(KERN_INFO, &pdev->dev, "Intel(R) IOP: " 1594 - "( %s%s%s%s%s%s%s%s%s%s)\n", 1595 - dma_has_cap(DMA_PQ_XOR, dma_dev->cap_mask) ? "pq_xor " : "", 1596 - dma_has_cap(DMA_PQ_UPDATE, dma_dev->cap_mask) ? "pq_update " : "", 1597 - dma_has_cap(DMA_PQ_ZERO_SUM, dma_dev->cap_mask) ? "pq_zero_sum " : "", 1274 + "( %s%s%s%s%s%s%s)\n", 1275 + dma_has_cap(DMA_PQ, dma_dev->cap_mask) ? "pq " : "", 1276 + dma_has_cap(DMA_PQ_VAL, dma_dev->cap_mask) ? "pq_val " : "", 1598 1277 dma_has_cap(DMA_XOR, dma_dev->cap_mask) ? "xor " : "", 1599 - dma_has_cap(DMA_DUAL_XOR, dma_dev->cap_mask) ? "dual_xor " : "", 1600 - dma_has_cap(DMA_ZERO_SUM, dma_dev->cap_mask) ? "xor_zero_sum " : "", 1278 + dma_has_cap(DMA_XOR_VAL, dma_dev->cap_mask) ? "xor_val " : "", 1601 1279 dma_has_cap(DMA_MEMSET, dma_dev->cap_mask) ? "fill " : "", 1602 - dma_has_cap(DMA_MEMCPY_CRC32C, dma_dev->cap_mask) ? "cpy+crc " : "", 1603 1280 dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask) ? "cpy " : "", 1604 1281 dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask) ? "intr " : ""); 1605 1282 ··· 1643 1296 if (sw_desc) { 1644 1297 grp_start = sw_desc->group_head; 1645 1298 1646 - list_splice_init(&sw_desc->async_tx.tx_list, &iop_chan->chain); 1299 + list_splice_init(&sw_desc->tx_list, &iop_chan->chain); 1647 1300 async_tx_ack(&sw_desc->async_tx); 1648 1301 iop_desc_init_memcpy(grp_start, 0); 1649 1302 iop_desc_set_byte_count(grp_start, iop_chan, 0); ··· 1699 1352 sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op); 1700 1353 if (sw_desc) { 1701 1354 grp_start = sw_desc->group_head; 1702 - list_splice_init(&sw_desc->async_tx.tx_list, &iop_chan->chain); 1355 + list_splice_init(&sw_desc->tx_list, &iop_chan->chain); 1703 1356 async_tx_ack(&sw_desc->async_tx); 1704 1357 iop_desc_init_null_xor(grp_start, 2, 0); 1705 1358 iop_desc_set_byte_count(grp_start, iop_chan, 0);
+10
drivers/dma/iovlock.c
··· 183 183 iov_byte_offset, 184 184 kdata, 185 185 copy); 186 + /* poll for a descriptor slot */ 187 + if (unlikely(dma_cookie < 0)) { 188 + dma_async_issue_pending(chan); 189 + continue; 190 + } 186 191 187 192 len -= copy; 188 193 iov[iovec_idx].iov_len -= copy; ··· 253 248 page, 254 249 offset, 255 250 copy); 251 + /* poll for a descriptor slot */ 252 + if (unlikely(dma_cookie < 0)) { 253 + dma_async_issue_pending(chan); 254 + continue; 255 + } 256 256 257 257 len -= copy; 258 258 iov[iovec_idx].iov_len -= copy;
+4 -3
drivers/dma/mv_xor.c
··· 517 517 } 518 518 alloc_tail->group_head = alloc_start; 519 519 alloc_tail->async_tx.cookie = -EBUSY; 520 - list_splice(&chain, &alloc_tail->async_tx.tx_list); 520 + list_splice(&chain, &alloc_tail->tx_list); 521 521 mv_chan->last_used = last_used; 522 522 mv_desc_clear_next_desc(alloc_start); 523 523 mv_desc_clear_next_desc(alloc_tail); ··· 565 565 cookie = mv_desc_assign_cookie(mv_chan, sw_desc); 566 566 567 567 if (list_empty(&mv_chan->chain)) 568 - list_splice_init(&sw_desc->async_tx.tx_list, &mv_chan->chain); 568 + list_splice_init(&sw_desc->tx_list, &mv_chan->chain); 569 569 else { 570 570 new_hw_chain = 0; 571 571 572 572 old_chain_tail = list_entry(mv_chan->chain.prev, 573 573 struct mv_xor_desc_slot, 574 574 chain_node); 575 - list_splice_init(&grp_start->async_tx.tx_list, 575 + list_splice_init(&grp_start->tx_list, 576 576 &old_chain_tail->chain_node); 577 577 578 578 if (!mv_can_chain(grp_start)) ··· 632 632 slot->async_tx.tx_submit = mv_xor_tx_submit; 633 633 INIT_LIST_HEAD(&slot->chain_node); 634 634 INIT_LIST_HEAD(&slot->slot_node); 635 + INIT_LIST_HEAD(&slot->tx_list); 635 636 hw_desc = (char *) mv_chan->device->dma_desc_pool; 636 637 slot->async_tx.phys = 637 638 (dma_addr_t) &hw_desc[idx * MV_XOR_SLOT_SIZE];
+2 -2
drivers/dma/mv_xor.h
··· 126 126 * @idx: pool index 127 127 * @unmap_src_cnt: number of xor sources 128 128 * @unmap_len: transaction bytecount 129 + * @tx_list: list of slots that make up a multi-descriptor transaction 129 130 * @async_tx: support for the async_tx api 130 - * @group_list: list of slots that make up a multi-descriptor transaction 131 - * for example transfer lengths larger than the supported hw max 132 131 * @xor_check_result: result of zero sum 133 132 * @crc32_result: result crc calculation 134 133 */ ··· 144 145 u16 unmap_src_cnt; 145 146 u32 value; 146 147 size_t unmap_len; 148 + struct list_head tx_list; 147 149 struct dma_async_tx_descriptor async_tx; 148 150 union { 149 151 u32 *xor_check_result;
+786
drivers/dma/shdma.c
··· 1 + /* 2 + * Renesas SuperH DMA Engine support 3 + * 4 + * base is drivers/dma/flsdma.c 5 + * 6 + * Copyright (C) 2009 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> 7 + * Copyright (C) 2009 Renesas Solutions, Inc. All rights reserved. 8 + * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. 9 + * 10 + * This is free software; you can redistribute it and/or modify 11 + * it under the terms of the GNU General Public License as published by 12 + * the Free Software Foundation; either version 2 of the License, or 13 + * (at your option) any later version. 14 + * 15 + * - DMA of SuperH does not have Hardware DMA chain mode. 16 + * - MAX DMA size is 16MB. 17 + * 18 + */ 19 + 20 + #include <linux/init.h> 21 + #include <linux/module.h> 22 + #include <linux/interrupt.h> 23 + #include <linux/dmaengine.h> 24 + #include <linux/delay.h> 25 + #include <linux/dma-mapping.h> 26 + #include <linux/dmapool.h> 27 + #include <linux/platform_device.h> 28 + #include <cpu/dma.h> 29 + #include <asm/dma-sh.h> 30 + #include "shdma.h" 31 + 32 + /* DMA descriptor control */ 33 + #define DESC_LAST (-1) 34 + #define DESC_COMP (1) 35 + #define DESC_NCOMP (0) 36 + 37 + #define NR_DESCS_PER_CHANNEL 32 38 + /* 39 + * Define the default configuration for dual address memory-memory transfer. 40 + * The 0x400 value represents auto-request, external->external. 41 + * 42 + * And this driver set 4byte burst mode. 43 + * If you want to change mode, you need to change RS_DEFAULT of value. 44 + * (ex 1byte burst mode -> (RS_DUAL & ~TS_32) 45 + */ 46 + #define RS_DEFAULT (RS_DUAL) 47 + 48 + #define SH_DMAC_CHAN_BASE(id) (dma_base_addr[id]) 49 + static void sh_dmae_writel(struct sh_dmae_chan *sh_dc, u32 data, u32 reg) 50 + { 51 + ctrl_outl(data, (SH_DMAC_CHAN_BASE(sh_dc->id) + reg)); 52 + } 53 + 54 + static u32 sh_dmae_readl(struct sh_dmae_chan *sh_dc, u32 reg) 55 + { 56 + return ctrl_inl((SH_DMAC_CHAN_BASE(sh_dc->id) + reg)); 57 + } 58 + 59 + static void dmae_init(struct sh_dmae_chan *sh_chan) 60 + { 61 + u32 chcr = RS_DEFAULT; /* default is DUAL mode */ 62 + sh_dmae_writel(sh_chan, chcr, CHCR); 63 + } 64 + 65 + /* 66 + * Reset DMA controller 67 + * 68 + * SH7780 has two DMAOR register 69 + */ 70 + static void sh_dmae_ctl_stop(int id) 71 + { 72 + unsigned short dmaor = dmaor_read_reg(id); 73 + 74 + dmaor &= ~(DMAOR_NMIF | DMAOR_AE); 75 + dmaor_write_reg(id, dmaor); 76 + } 77 + 78 + static int sh_dmae_rst(int id) 79 + { 80 + unsigned short dmaor; 81 + 82 + sh_dmae_ctl_stop(id); 83 + dmaor = (dmaor_read_reg(id)|DMAOR_INIT); 84 + 85 + dmaor_write_reg(id, dmaor); 86 + if ((dmaor_read_reg(id) & (DMAOR_AE | DMAOR_NMIF))) { 87 + pr_warning(KERN_ERR "dma-sh: Can't initialize DMAOR.\n"); 88 + return -EINVAL; 89 + } 90 + return 0; 91 + } 92 + 93 + static int dmae_is_idle(struct sh_dmae_chan *sh_chan) 94 + { 95 + u32 chcr = sh_dmae_readl(sh_chan, CHCR); 96 + if (chcr & CHCR_DE) { 97 + if (!(chcr & CHCR_TE)) 98 + return -EBUSY; /* working */ 99 + } 100 + return 0; /* waiting */ 101 + } 102 + 103 + static inline unsigned int calc_xmit_shift(struct sh_dmae_chan *sh_chan) 104 + { 105 + u32 chcr = sh_dmae_readl(sh_chan, CHCR); 106 + return ts_shift[(chcr & CHCR_TS_MASK) >> CHCR_TS_SHIFT]; 107 + } 108 + 109 + static void dmae_set_reg(struct sh_dmae_chan *sh_chan, struct sh_dmae_regs hw) 110 + { 111 + sh_dmae_writel(sh_chan, hw.sar, SAR); 112 + sh_dmae_writel(sh_chan, hw.dar, DAR); 113 + sh_dmae_writel(sh_chan, 114 + (hw.tcr >> calc_xmit_shift(sh_chan)), TCR); 115 + } 116 + 117 + static void dmae_start(struct sh_dmae_chan *sh_chan) 118 + { 119 + u32 chcr = sh_dmae_readl(sh_chan, CHCR); 120 + 121 + chcr |= (CHCR_DE|CHCR_IE); 122 + sh_dmae_writel(sh_chan, chcr, CHCR); 123 + } 124 + 125 + static void dmae_halt(struct sh_dmae_chan *sh_chan) 126 + { 127 + u32 chcr = sh_dmae_readl(sh_chan, CHCR); 128 + 129 + chcr &= ~(CHCR_DE | CHCR_TE | CHCR_IE); 130 + sh_dmae_writel(sh_chan, chcr, CHCR); 131 + } 132 + 133 + static int dmae_set_chcr(struct sh_dmae_chan *sh_chan, u32 val) 134 + { 135 + int ret = dmae_is_idle(sh_chan); 136 + /* When DMA was working, can not set data to CHCR */ 137 + if (ret) 138 + return ret; 139 + 140 + sh_dmae_writel(sh_chan, val, CHCR); 141 + return 0; 142 + } 143 + 144 + #define DMARS1_ADDR 0x04 145 + #define DMARS2_ADDR 0x08 146 + #define DMARS_SHIFT 8 147 + #define DMARS_CHAN_MSK 0x01 148 + static int dmae_set_dmars(struct sh_dmae_chan *sh_chan, u16 val) 149 + { 150 + u32 addr; 151 + int shift = 0; 152 + int ret = dmae_is_idle(sh_chan); 153 + if (ret) 154 + return ret; 155 + 156 + if (sh_chan->id & DMARS_CHAN_MSK) 157 + shift = DMARS_SHIFT; 158 + 159 + switch (sh_chan->id) { 160 + /* DMARS0 */ 161 + case 0: 162 + case 1: 163 + addr = SH_DMARS_BASE; 164 + break; 165 + /* DMARS1 */ 166 + case 2: 167 + case 3: 168 + addr = (SH_DMARS_BASE + DMARS1_ADDR); 169 + break; 170 + /* DMARS2 */ 171 + case 4: 172 + case 5: 173 + addr = (SH_DMARS_BASE + DMARS2_ADDR); 174 + break; 175 + default: 176 + return -EINVAL; 177 + } 178 + 179 + ctrl_outw((val << shift) | 180 + (ctrl_inw(addr) & (shift ? 0xFF00 : 0x00FF)), 181 + addr); 182 + 183 + return 0; 184 + } 185 + 186 + static dma_cookie_t sh_dmae_tx_submit(struct dma_async_tx_descriptor *tx) 187 + { 188 + struct sh_desc *desc = tx_to_sh_desc(tx); 189 + struct sh_dmae_chan *sh_chan = to_sh_chan(tx->chan); 190 + dma_cookie_t cookie; 191 + 192 + spin_lock_bh(&sh_chan->desc_lock); 193 + 194 + cookie = sh_chan->common.cookie; 195 + cookie++; 196 + if (cookie < 0) 197 + cookie = 1; 198 + 199 + /* If desc only in the case of 1 */ 200 + if (desc->async_tx.cookie != -EBUSY) 201 + desc->async_tx.cookie = cookie; 202 + sh_chan->common.cookie = desc->async_tx.cookie; 203 + 204 + list_splice_init(&desc->tx_list, sh_chan->ld_queue.prev); 205 + 206 + spin_unlock_bh(&sh_chan->desc_lock); 207 + 208 + return cookie; 209 + } 210 + 211 + static struct sh_desc *sh_dmae_get_desc(struct sh_dmae_chan *sh_chan) 212 + { 213 + struct sh_desc *desc, *_desc, *ret = NULL; 214 + 215 + spin_lock_bh(&sh_chan->desc_lock); 216 + list_for_each_entry_safe(desc, _desc, &sh_chan->ld_free, node) { 217 + if (async_tx_test_ack(&desc->async_tx)) { 218 + list_del(&desc->node); 219 + ret = desc; 220 + break; 221 + } 222 + } 223 + spin_unlock_bh(&sh_chan->desc_lock); 224 + 225 + return ret; 226 + } 227 + 228 + static void sh_dmae_put_desc(struct sh_dmae_chan *sh_chan, struct sh_desc *desc) 229 + { 230 + if (desc) { 231 + spin_lock_bh(&sh_chan->desc_lock); 232 + 233 + list_splice_init(&desc->tx_list, &sh_chan->ld_free); 234 + list_add(&desc->node, &sh_chan->ld_free); 235 + 236 + spin_unlock_bh(&sh_chan->desc_lock); 237 + } 238 + } 239 + 240 + static int sh_dmae_alloc_chan_resources(struct dma_chan *chan) 241 + { 242 + struct sh_dmae_chan *sh_chan = to_sh_chan(chan); 243 + struct sh_desc *desc; 244 + 245 + spin_lock_bh(&sh_chan->desc_lock); 246 + while (sh_chan->descs_allocated < NR_DESCS_PER_CHANNEL) { 247 + spin_unlock_bh(&sh_chan->desc_lock); 248 + desc = kzalloc(sizeof(struct sh_desc), GFP_KERNEL); 249 + if (!desc) { 250 + spin_lock_bh(&sh_chan->desc_lock); 251 + break; 252 + } 253 + dma_async_tx_descriptor_init(&desc->async_tx, 254 + &sh_chan->common); 255 + desc->async_tx.tx_submit = sh_dmae_tx_submit; 256 + desc->async_tx.flags = DMA_CTRL_ACK; 257 + INIT_LIST_HEAD(&desc->tx_list); 258 + sh_dmae_put_desc(sh_chan, desc); 259 + 260 + spin_lock_bh(&sh_chan->desc_lock); 261 + sh_chan->descs_allocated++; 262 + } 263 + spin_unlock_bh(&sh_chan->desc_lock); 264 + 265 + return sh_chan->descs_allocated; 266 + } 267 + 268 + /* 269 + * sh_dma_free_chan_resources - Free all resources of the channel. 270 + */ 271 + static void sh_dmae_free_chan_resources(struct dma_chan *chan) 272 + { 273 + struct sh_dmae_chan *sh_chan = to_sh_chan(chan); 274 + struct sh_desc *desc, *_desc; 275 + LIST_HEAD(list); 276 + 277 + BUG_ON(!list_empty(&sh_chan->ld_queue)); 278 + spin_lock_bh(&sh_chan->desc_lock); 279 + 280 + list_splice_init(&sh_chan->ld_free, &list); 281 + sh_chan->descs_allocated = 0; 282 + 283 + spin_unlock_bh(&sh_chan->desc_lock); 284 + 285 + list_for_each_entry_safe(desc, _desc, &list, node) 286 + kfree(desc); 287 + } 288 + 289 + static struct dma_async_tx_descriptor *sh_dmae_prep_memcpy( 290 + struct dma_chan *chan, dma_addr_t dma_dest, dma_addr_t dma_src, 291 + size_t len, unsigned long flags) 292 + { 293 + struct sh_dmae_chan *sh_chan; 294 + struct sh_desc *first = NULL, *prev = NULL, *new; 295 + size_t copy_size; 296 + 297 + if (!chan) 298 + return NULL; 299 + 300 + if (!len) 301 + return NULL; 302 + 303 + sh_chan = to_sh_chan(chan); 304 + 305 + do { 306 + /* Allocate the link descriptor from DMA pool */ 307 + new = sh_dmae_get_desc(sh_chan); 308 + if (!new) { 309 + dev_err(sh_chan->dev, 310 + "No free memory for link descriptor\n"); 311 + goto err_get_desc; 312 + } 313 + 314 + copy_size = min(len, (size_t)SH_DMA_TCR_MAX); 315 + 316 + new->hw.sar = dma_src; 317 + new->hw.dar = dma_dest; 318 + new->hw.tcr = copy_size; 319 + if (!first) 320 + first = new; 321 + 322 + new->mark = DESC_NCOMP; 323 + async_tx_ack(&new->async_tx); 324 + 325 + prev = new; 326 + len -= copy_size; 327 + dma_src += copy_size; 328 + dma_dest += copy_size; 329 + /* Insert the link descriptor to the LD ring */ 330 + list_add_tail(&new->node, &first->tx_list); 331 + } while (len); 332 + 333 + new->async_tx.flags = flags; /* client is in control of this ack */ 334 + new->async_tx.cookie = -EBUSY; /* Last desc */ 335 + 336 + return &first->async_tx; 337 + 338 + err_get_desc: 339 + sh_dmae_put_desc(sh_chan, first); 340 + return NULL; 341 + 342 + } 343 + 344 + /* 345 + * sh_chan_ld_cleanup - Clean up link descriptors 346 + * 347 + * This function clean up the ld_queue of DMA channel. 348 + */ 349 + static void sh_dmae_chan_ld_cleanup(struct sh_dmae_chan *sh_chan) 350 + { 351 + struct sh_desc *desc, *_desc; 352 + 353 + spin_lock_bh(&sh_chan->desc_lock); 354 + list_for_each_entry_safe(desc, _desc, &sh_chan->ld_queue, node) { 355 + dma_async_tx_callback callback; 356 + void *callback_param; 357 + 358 + /* non send data */ 359 + if (desc->mark == DESC_NCOMP) 360 + break; 361 + 362 + /* send data sesc */ 363 + callback = desc->async_tx.callback; 364 + callback_param = desc->async_tx.callback_param; 365 + 366 + /* Remove from ld_queue list */ 367 + list_splice_init(&desc->tx_list, &sh_chan->ld_free); 368 + 369 + dev_dbg(sh_chan->dev, "link descriptor %p will be recycle.\n", 370 + desc); 371 + 372 + list_move(&desc->node, &sh_chan->ld_free); 373 + /* Run the link descriptor callback function */ 374 + if (callback) { 375 + spin_unlock_bh(&sh_chan->desc_lock); 376 + dev_dbg(sh_chan->dev, "link descriptor %p callback\n", 377 + desc); 378 + callback(callback_param); 379 + spin_lock_bh(&sh_chan->desc_lock); 380 + } 381 + } 382 + spin_unlock_bh(&sh_chan->desc_lock); 383 + } 384 + 385 + static void sh_chan_xfer_ld_queue(struct sh_dmae_chan *sh_chan) 386 + { 387 + struct list_head *ld_node; 388 + struct sh_dmae_regs hw; 389 + 390 + /* DMA work check */ 391 + if (dmae_is_idle(sh_chan)) 392 + return; 393 + 394 + /* Find the first un-transfer desciptor */ 395 + for (ld_node = sh_chan->ld_queue.next; 396 + (ld_node != &sh_chan->ld_queue) 397 + && (to_sh_desc(ld_node)->mark == DESC_COMP); 398 + ld_node = ld_node->next) 399 + cpu_relax(); 400 + 401 + if (ld_node != &sh_chan->ld_queue) { 402 + /* Get the ld start address from ld_queue */ 403 + hw = to_sh_desc(ld_node)->hw; 404 + dmae_set_reg(sh_chan, hw); 405 + dmae_start(sh_chan); 406 + } 407 + } 408 + 409 + static void sh_dmae_memcpy_issue_pending(struct dma_chan *chan) 410 + { 411 + struct sh_dmae_chan *sh_chan = to_sh_chan(chan); 412 + sh_chan_xfer_ld_queue(sh_chan); 413 + } 414 + 415 + static enum dma_status sh_dmae_is_complete(struct dma_chan *chan, 416 + dma_cookie_t cookie, 417 + dma_cookie_t *done, 418 + dma_cookie_t *used) 419 + { 420 + struct sh_dmae_chan *sh_chan = to_sh_chan(chan); 421 + dma_cookie_t last_used; 422 + dma_cookie_t last_complete; 423 + 424 + sh_dmae_chan_ld_cleanup(sh_chan); 425 + 426 + last_used = chan->cookie; 427 + last_complete = sh_chan->completed_cookie; 428 + if (last_complete == -EBUSY) 429 + last_complete = last_used; 430 + 431 + if (done) 432 + *done = last_complete; 433 + 434 + if (used) 435 + *used = last_used; 436 + 437 + return dma_async_is_complete(cookie, last_complete, last_used); 438 + } 439 + 440 + static irqreturn_t sh_dmae_interrupt(int irq, void *data) 441 + { 442 + irqreturn_t ret = IRQ_NONE; 443 + struct sh_dmae_chan *sh_chan = (struct sh_dmae_chan *)data; 444 + u32 chcr = sh_dmae_readl(sh_chan, CHCR); 445 + 446 + if (chcr & CHCR_TE) { 447 + /* DMA stop */ 448 + dmae_halt(sh_chan); 449 + 450 + ret = IRQ_HANDLED; 451 + tasklet_schedule(&sh_chan->tasklet); 452 + } 453 + 454 + return ret; 455 + } 456 + 457 + #if defined(CONFIG_CPU_SH4) 458 + static irqreturn_t sh_dmae_err(int irq, void *data) 459 + { 460 + int err = 0; 461 + struct sh_dmae_device *shdev = (struct sh_dmae_device *)data; 462 + 463 + /* IRQ Multi */ 464 + if (shdev->pdata.mode & SHDMA_MIX_IRQ) { 465 + int cnt = 0; 466 + switch (irq) { 467 + #if defined(DMTE6_IRQ) && defined(DMAE1_IRQ) 468 + case DMTE6_IRQ: 469 + cnt++; 470 + #endif 471 + case DMTE0_IRQ: 472 + if (dmaor_read_reg(cnt) & (DMAOR_NMIF | DMAOR_AE)) { 473 + disable_irq(irq); 474 + return IRQ_HANDLED; 475 + } 476 + default: 477 + return IRQ_NONE; 478 + } 479 + } else { 480 + /* reset dma controller */ 481 + err = sh_dmae_rst(0); 482 + if (err) 483 + return err; 484 + if (shdev->pdata.mode & SHDMA_DMAOR1) { 485 + err = sh_dmae_rst(1); 486 + if (err) 487 + return err; 488 + } 489 + disable_irq(irq); 490 + return IRQ_HANDLED; 491 + } 492 + } 493 + #endif 494 + 495 + static void dmae_do_tasklet(unsigned long data) 496 + { 497 + struct sh_dmae_chan *sh_chan = (struct sh_dmae_chan *)data; 498 + struct sh_desc *desc, *_desc, *cur_desc = NULL; 499 + u32 sar_buf = sh_dmae_readl(sh_chan, SAR); 500 + list_for_each_entry_safe(desc, _desc, 501 + &sh_chan->ld_queue, node) { 502 + if ((desc->hw.sar + desc->hw.tcr) == sar_buf) { 503 + cur_desc = desc; 504 + break; 505 + } 506 + } 507 + 508 + if (cur_desc) { 509 + switch (cur_desc->async_tx.cookie) { 510 + case 0: /* other desc data */ 511 + break; 512 + case -EBUSY: /* last desc */ 513 + sh_chan->completed_cookie = 514 + cur_desc->async_tx.cookie; 515 + break; 516 + default: /* first desc ( 0 < )*/ 517 + sh_chan->completed_cookie = 518 + cur_desc->async_tx.cookie - 1; 519 + break; 520 + } 521 + cur_desc->mark = DESC_COMP; 522 + } 523 + /* Next desc */ 524 + sh_chan_xfer_ld_queue(sh_chan); 525 + sh_dmae_chan_ld_cleanup(sh_chan); 526 + } 527 + 528 + static unsigned int get_dmae_irq(unsigned int id) 529 + { 530 + unsigned int irq = 0; 531 + if (id < ARRAY_SIZE(dmte_irq_map)) 532 + irq = dmte_irq_map[id]; 533 + return irq; 534 + } 535 + 536 + static int __devinit sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id) 537 + { 538 + int err; 539 + unsigned int irq = get_dmae_irq(id); 540 + unsigned long irqflags = IRQF_DISABLED; 541 + struct sh_dmae_chan *new_sh_chan; 542 + 543 + /* alloc channel */ 544 + new_sh_chan = kzalloc(sizeof(struct sh_dmae_chan), GFP_KERNEL); 545 + if (!new_sh_chan) { 546 + dev_err(shdev->common.dev, "No free memory for allocating " 547 + "dma channels!\n"); 548 + return -ENOMEM; 549 + } 550 + 551 + new_sh_chan->dev = shdev->common.dev; 552 + new_sh_chan->id = id; 553 + 554 + /* Init DMA tasklet */ 555 + tasklet_init(&new_sh_chan->tasklet, dmae_do_tasklet, 556 + (unsigned long)new_sh_chan); 557 + 558 + /* Init the channel */ 559 + dmae_init(new_sh_chan); 560 + 561 + spin_lock_init(&new_sh_chan->desc_lock); 562 + 563 + /* Init descripter manage list */ 564 + INIT_LIST_HEAD(&new_sh_chan->ld_queue); 565 + INIT_LIST_HEAD(&new_sh_chan->ld_free); 566 + 567 + /* copy struct dma_device */ 568 + new_sh_chan->common.device = &shdev->common; 569 + 570 + /* Add the channel to DMA device channel list */ 571 + list_add_tail(&new_sh_chan->common.device_node, 572 + &shdev->common.channels); 573 + shdev->common.chancnt++; 574 + 575 + if (shdev->pdata.mode & SHDMA_MIX_IRQ) { 576 + irqflags = IRQF_SHARED; 577 + #if defined(DMTE6_IRQ) 578 + if (irq >= DMTE6_IRQ) 579 + irq = DMTE6_IRQ; 580 + else 581 + #endif 582 + irq = DMTE0_IRQ; 583 + } 584 + 585 + snprintf(new_sh_chan->dev_id, sizeof(new_sh_chan->dev_id), 586 + "sh-dmae%d", new_sh_chan->id); 587 + 588 + /* set up channel irq */ 589 + err = request_irq(irq, &sh_dmae_interrupt, 590 + irqflags, new_sh_chan->dev_id, new_sh_chan); 591 + if (err) { 592 + dev_err(shdev->common.dev, "DMA channel %d request_irq error " 593 + "with return %d\n", id, err); 594 + goto err_no_irq; 595 + } 596 + 597 + /* CHCR register control function */ 598 + new_sh_chan->set_chcr = dmae_set_chcr; 599 + /* DMARS register control function */ 600 + new_sh_chan->set_dmars = dmae_set_dmars; 601 + 602 + shdev->chan[id] = new_sh_chan; 603 + return 0; 604 + 605 + err_no_irq: 606 + /* remove from dmaengine device node */ 607 + list_del(&new_sh_chan->common.device_node); 608 + kfree(new_sh_chan); 609 + return err; 610 + } 611 + 612 + static void sh_dmae_chan_remove(struct sh_dmae_device *shdev) 613 + { 614 + int i; 615 + 616 + for (i = shdev->common.chancnt - 1 ; i >= 0 ; i--) { 617 + if (shdev->chan[i]) { 618 + struct sh_dmae_chan *shchan = shdev->chan[i]; 619 + if (!(shdev->pdata.mode & SHDMA_MIX_IRQ)) 620 + free_irq(dmte_irq_map[i], shchan); 621 + 622 + list_del(&shchan->common.device_node); 623 + kfree(shchan); 624 + shdev->chan[i] = NULL; 625 + } 626 + } 627 + shdev->common.chancnt = 0; 628 + } 629 + 630 + static int __init sh_dmae_probe(struct platform_device *pdev) 631 + { 632 + int err = 0, cnt, ecnt; 633 + unsigned long irqflags = IRQF_DISABLED; 634 + #if defined(CONFIG_CPU_SH4) 635 + int eirq[] = { DMAE0_IRQ, 636 + #if defined(DMAE1_IRQ) 637 + DMAE1_IRQ 638 + #endif 639 + }; 640 + #endif 641 + struct sh_dmae_device *shdev; 642 + 643 + shdev = kzalloc(sizeof(struct sh_dmae_device), GFP_KERNEL); 644 + if (!shdev) { 645 + dev_err(&pdev->dev, "No enough memory\n"); 646 + err = -ENOMEM; 647 + goto shdev_err; 648 + } 649 + 650 + /* get platform data */ 651 + if (!pdev->dev.platform_data) 652 + goto shdev_err; 653 + 654 + /* platform data */ 655 + memcpy(&shdev->pdata, pdev->dev.platform_data, 656 + sizeof(struct sh_dmae_pdata)); 657 + 658 + /* reset dma controller */ 659 + err = sh_dmae_rst(0); 660 + if (err) 661 + goto rst_err; 662 + 663 + /* SH7780/85/23 has DMAOR1 */ 664 + if (shdev->pdata.mode & SHDMA_DMAOR1) { 665 + err = sh_dmae_rst(1); 666 + if (err) 667 + goto rst_err; 668 + } 669 + 670 + INIT_LIST_HEAD(&shdev->common.channels); 671 + 672 + dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask); 673 + shdev->common.device_alloc_chan_resources 674 + = sh_dmae_alloc_chan_resources; 675 + shdev->common.device_free_chan_resources = sh_dmae_free_chan_resources; 676 + shdev->common.device_prep_dma_memcpy = sh_dmae_prep_memcpy; 677 + shdev->common.device_is_tx_complete = sh_dmae_is_complete; 678 + shdev->common.device_issue_pending = sh_dmae_memcpy_issue_pending; 679 + shdev->common.dev = &pdev->dev; 680 + 681 + #if defined(CONFIG_CPU_SH4) 682 + /* Non Mix IRQ mode SH7722/SH7730 etc... */ 683 + if (shdev->pdata.mode & SHDMA_MIX_IRQ) { 684 + irqflags = IRQF_SHARED; 685 + eirq[0] = DMTE0_IRQ; 686 + #if defined(DMTE6_IRQ) && defined(DMAE1_IRQ) 687 + eirq[1] = DMTE6_IRQ; 688 + #endif 689 + } 690 + 691 + for (ecnt = 0 ; ecnt < ARRAY_SIZE(eirq); ecnt++) { 692 + err = request_irq(eirq[ecnt], sh_dmae_err, 693 + irqflags, "DMAC Address Error", shdev); 694 + if (err) { 695 + dev_err(&pdev->dev, "DMA device request_irq" 696 + "error (irq %d) with return %d\n", 697 + eirq[ecnt], err); 698 + goto eirq_err; 699 + } 700 + } 701 + #endif /* CONFIG_CPU_SH4 */ 702 + 703 + /* Create DMA Channel */ 704 + for (cnt = 0 ; cnt < MAX_DMA_CHANNELS ; cnt++) { 705 + err = sh_dmae_chan_probe(shdev, cnt); 706 + if (err) 707 + goto chan_probe_err; 708 + } 709 + 710 + platform_set_drvdata(pdev, shdev); 711 + dma_async_device_register(&shdev->common); 712 + 713 + return err; 714 + 715 + chan_probe_err: 716 + sh_dmae_chan_remove(shdev); 717 + 718 + eirq_err: 719 + for (ecnt-- ; ecnt >= 0; ecnt--) 720 + free_irq(eirq[ecnt], shdev); 721 + 722 + rst_err: 723 + kfree(shdev); 724 + 725 + shdev_err: 726 + return err; 727 + } 728 + 729 + static int __exit sh_dmae_remove(struct platform_device *pdev) 730 + { 731 + struct sh_dmae_device *shdev = platform_get_drvdata(pdev); 732 + 733 + dma_async_device_unregister(&shdev->common); 734 + 735 + if (shdev->pdata.mode & SHDMA_MIX_IRQ) { 736 + free_irq(DMTE0_IRQ, shdev); 737 + #if defined(DMTE6_IRQ) 738 + free_irq(DMTE6_IRQ, shdev); 739 + #endif 740 + } 741 + 742 + /* channel data remove */ 743 + sh_dmae_chan_remove(shdev); 744 + 745 + if (!(shdev->pdata.mode & SHDMA_MIX_IRQ)) { 746 + free_irq(DMAE0_IRQ, shdev); 747 + #if defined(DMAE1_IRQ) 748 + free_irq(DMAE1_IRQ, shdev); 749 + #endif 750 + } 751 + kfree(shdev); 752 + 753 + return 0; 754 + } 755 + 756 + static void sh_dmae_shutdown(struct platform_device *pdev) 757 + { 758 + struct sh_dmae_device *shdev = platform_get_drvdata(pdev); 759 + sh_dmae_ctl_stop(0); 760 + if (shdev->pdata.mode & SHDMA_DMAOR1) 761 + sh_dmae_ctl_stop(1); 762 + } 763 + 764 + static struct platform_driver sh_dmae_driver = { 765 + .remove = __exit_p(sh_dmae_remove), 766 + .shutdown = sh_dmae_shutdown, 767 + .driver = { 768 + .name = "sh-dma-engine", 769 + }, 770 + }; 771 + 772 + static int __init sh_dmae_init(void) 773 + { 774 + return platform_driver_probe(&sh_dmae_driver, sh_dmae_probe); 775 + } 776 + module_init(sh_dmae_init); 777 + 778 + static void __exit sh_dmae_exit(void) 779 + { 780 + platform_driver_unregister(&sh_dmae_driver); 781 + } 782 + module_exit(sh_dmae_exit); 783 + 784 + MODULE_AUTHOR("Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>"); 785 + MODULE_DESCRIPTION("Renesas SH DMA Engine driver"); 786 + MODULE_LICENSE("GPL");
+64
drivers/dma/shdma.h
··· 1 + /* 2 + * Renesas SuperH DMA Engine support 3 + * 4 + * Copyright (C) 2009 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> 5 + * Copyright (C) 2009 Renesas Solutions, Inc. All rights reserved. 6 + * 7 + * This is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + * 12 + */ 13 + #ifndef __DMA_SHDMA_H 14 + #define __DMA_SHDMA_H 15 + 16 + #include <linux/device.h> 17 + #include <linux/dmapool.h> 18 + #include <linux/dmaengine.h> 19 + 20 + #define SH_DMA_TCR_MAX 0x00FFFFFF /* 16MB */ 21 + 22 + struct sh_dmae_regs { 23 + u32 sar; /* SAR / source address */ 24 + u32 dar; /* DAR / destination address */ 25 + u32 tcr; /* TCR / transfer count */ 26 + }; 27 + 28 + struct sh_desc { 29 + struct list_head tx_list; 30 + struct sh_dmae_regs hw; 31 + struct list_head node; 32 + struct dma_async_tx_descriptor async_tx; 33 + int mark; 34 + }; 35 + 36 + struct sh_dmae_chan { 37 + dma_cookie_t completed_cookie; /* The maximum cookie completed */ 38 + spinlock_t desc_lock; /* Descriptor operation lock */ 39 + struct list_head ld_queue; /* Link descriptors queue */ 40 + struct list_head ld_free; /* Link descriptors free */ 41 + struct dma_chan common; /* DMA common channel */ 42 + struct device *dev; /* Channel device */ 43 + struct tasklet_struct tasklet; /* Tasklet */ 44 + int descs_allocated; /* desc count */ 45 + int id; /* Raw id of this channel */ 46 + char dev_id[16]; /* unique name per DMAC of channel */ 47 + 48 + /* Set chcr */ 49 + int (*set_chcr)(struct sh_dmae_chan *sh_chan, u32 regs); 50 + /* Set DMA resource */ 51 + int (*set_dmars)(struct sh_dmae_chan *sh_chan, u16 res); 52 + }; 53 + 54 + struct sh_dmae_device { 55 + struct dma_device common; 56 + struct sh_dmae_chan *chan[MAX_DMA_CHANNELS]; 57 + struct sh_dmae_pdata pdata; 58 + }; 59 + 60 + #define to_sh_chan(chan) container_of(chan, struct sh_dmae_chan, common) 61 + #define to_sh_desc(lh) container_of(lh, struct sh_desc, node) 62 + #define tx_to_sh_desc(tx) container_of(tx, struct sh_desc, async_tx) 63 + 64 + #endif /* __DMA_SHDMA_H */
+11 -13
drivers/dma/txx9dmac.c
··· 180 180 181 181 static struct txx9dmac_desc *txx9dmac_last_child(struct txx9dmac_desc *desc) 182 182 { 183 - if (!list_empty(&desc->txd.tx_list)) 184 - desc = list_entry(desc->txd.tx_list.prev, 185 - struct txx9dmac_desc, desc_node); 183 + if (!list_empty(&desc->tx_list)) 184 + desc = list_entry(desc->tx_list.prev, typeof(*desc), desc_node); 186 185 return desc; 187 186 } 188 187 ··· 196 197 desc = kzalloc(sizeof(*desc), flags); 197 198 if (!desc) 198 199 return NULL; 200 + INIT_LIST_HEAD(&desc->tx_list); 199 201 dma_async_tx_descriptor_init(&desc->txd, &dc->chan); 200 202 desc->txd.tx_submit = txx9dmac_tx_submit; 201 203 /* txd.flags will be overwritten in prep funcs */ ··· 245 245 struct txx9dmac_dev *ddev = dc->ddev; 246 246 struct txx9dmac_desc *child; 247 247 248 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 248 + list_for_each_entry(child, &desc->tx_list, desc_node) 249 249 dma_sync_single_for_cpu(chan2parent(&dc->chan), 250 250 child->txd.phys, ddev->descsize, 251 251 DMA_TO_DEVICE); ··· 267 267 txx9dmac_sync_desc_for_cpu(dc, desc); 268 268 269 269 spin_lock_bh(&dc->lock); 270 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 270 + list_for_each_entry(child, &desc->tx_list, desc_node) 271 271 dev_vdbg(chan2dev(&dc->chan), 272 272 "moving child desc %p to freelist\n", 273 273 child); 274 - list_splice_init(&desc->txd.tx_list, &dc->free_list); 274 + list_splice_init(&desc->tx_list, &dc->free_list); 275 275 dev_vdbg(chan2dev(&dc->chan), "moving desc %p to freelist\n", 276 276 desc); 277 277 list_add(&desc->desc_node, &dc->free_list); ··· 429 429 param = txd->callback_param; 430 430 431 431 txx9dmac_sync_desc_for_cpu(dc, desc); 432 - list_splice_init(&txd->tx_list, &dc->free_list); 432 + list_splice_init(&desc->tx_list, &dc->free_list); 433 433 list_move(&desc->desc_node, &dc->free_list); 434 434 435 435 if (!ds) { ··· 571 571 "Bad descriptor submitted for DMA! (cookie: %d)\n", 572 572 bad_desc->txd.cookie); 573 573 txx9dmac_dump_desc(dc, &bad_desc->hwdesc); 574 - list_for_each_entry(child, &bad_desc->txd.tx_list, desc_node) 574 + list_for_each_entry(child, &bad_desc->tx_list, desc_node) 575 575 txx9dmac_dump_desc(dc, &child->hwdesc); 576 576 /* Pretend the descriptor completed successfully */ 577 577 txx9dmac_descriptor_complete(dc, bad_desc); ··· 613 613 return; 614 614 } 615 615 616 - list_for_each_entry(child, &desc->txd.tx_list, desc_node) 616 + list_for_each_entry(child, &desc->tx_list, desc_node) 617 617 if (desc_read_CHAR(dc, child) == chain) { 618 618 /* Currently in progress */ 619 619 if (csr & TXX9_DMA_CSR_ABCHC) ··· 823 823 dma_sync_single_for_device(chan2parent(&dc->chan), 824 824 prev->txd.phys, ddev->descsize, 825 825 DMA_TO_DEVICE); 826 - list_add_tail(&desc->desc_node, 827 - &first->txd.tx_list); 826 + list_add_tail(&desc->desc_node, &first->tx_list); 828 827 } 829 828 prev = desc; 830 829 } ··· 918 919 prev->txd.phys, 919 920 ddev->descsize, 920 921 DMA_TO_DEVICE); 921 - list_add_tail(&desc->desc_node, 922 - &first->txd.tx_list); 922 + list_add_tail(&desc->desc_node, &first->tx_list); 923 923 } 924 924 prev = desc; 925 925 }
+1
drivers/dma/txx9dmac.h
··· 231 231 232 232 /* THEN values for driver housekeeping */ 233 233 struct list_head desc_node ____cacheline_aligned; 234 + struct list_head tx_list; 234 235 struct dma_async_tx_descriptor txd; 235 236 size_t len; 236 237 };
+10 -10
drivers/idle/i7300_idle.c
··· 29 29 30 30 #include <asm/idle.h> 31 31 32 - #include "../dma/ioatdma_hw.h" 33 - #include "../dma/ioatdma_registers.h" 32 + #include "../dma/ioat/hw.h" 33 + #include "../dma/ioat/registers.h" 34 34 35 35 #define I7300_IDLE_DRIVER_VERSION "1.55" 36 36 #define I7300_PRINT "i7300_idle:" ··· 126 126 udelay(10); 127 127 128 128 sts = readq(ioat_chanbase + IOAT1_CHANSTS_OFFSET) & 129 - IOAT_CHANSTS_DMA_TRANSFER_STATUS; 129 + IOAT_CHANSTS_STATUS; 130 130 131 - if (sts != IOAT_CHANSTS_DMA_TRANSFER_STATUS_ACTIVE) 131 + if (sts != IOAT_CHANSTS_ACTIVE) 132 132 break; 133 133 134 134 } ··· 160 160 udelay(1000); 161 161 162 162 chan_sts = readq(ioat_chanbase + IOAT1_CHANSTS_OFFSET) & 163 - IOAT_CHANSTS_DMA_TRANSFER_STATUS; 163 + IOAT_CHANSTS_STATUS; 164 164 165 - if (chan_sts != IOAT_CHANSTS_DMA_TRANSFER_STATUS_DONE) { 165 + if (chan_sts != IOAT_CHANSTS_DONE) { 166 166 /* Not complete, reset the channel */ 167 167 writeb(IOAT_CHANCMD_RESET, 168 168 ioat_chanbase + IOAT1_CHANCMD_OFFSET); ··· 288 288 ioat_chanbase + IOAT1_CHANCMD_OFFSET); 289 289 290 290 chan_sts = readq(ioat_chanbase + IOAT1_CHANSTS_OFFSET) & 291 - IOAT_CHANSTS_DMA_TRANSFER_STATUS; 291 + IOAT_CHANSTS_STATUS; 292 292 293 - if (chan_sts != IOAT_CHANSTS_DMA_TRANSFER_STATUS_ACTIVE) { 293 + if (chan_sts != IOAT_CHANSTS_ACTIVE) { 294 294 writew(0, ioat_chanbase + IOAT_CHANCTRL_OFFSET); 295 295 break; 296 296 } ··· 298 298 } 299 299 300 300 chan_sts = readq(ioat_chanbase + IOAT1_CHANSTS_OFFSET) & 301 - IOAT_CHANSTS_DMA_TRANSFER_STATUS; 301 + IOAT_CHANSTS_STATUS; 302 302 303 303 /* 304 304 * We tried to reset multiple times. If IO A/T channel is still active 305 305 * flag an error and return without cleanup. Memory leak is better 306 306 * than random corruption in that extreme error situation. 307 307 */ 308 - if (chan_sts == IOAT_CHANSTS_DMA_TRANSFER_STATUS_ACTIVE) { 308 + if (chan_sts == IOAT_CHANSTS_ACTIVE) { 309 309 printk(KERN_ERR I7300_PRINT "Unable to stop IO A/T channels." 310 310 " Not freeing resources\n"); 311 311 return;
+26
drivers/md/Kconfig
··· 124 124 select MD_RAID6_PQ 125 125 select ASYNC_MEMCPY 126 126 select ASYNC_XOR 127 + select ASYNC_PQ 128 + select ASYNC_RAID6_RECOV 127 129 ---help--- 128 130 A RAID-5 set of N drives with a capacity of C MB per drive provides 129 131 the capacity of C * (N - 1) MB, and protects against a failure ··· 154 152 155 153 If unsure, say Y. 156 154 155 + config MULTICORE_RAID456 156 + bool "RAID-4/RAID-5/RAID-6 Multicore processing (EXPERIMENTAL)" 157 + depends on MD_RAID456 158 + depends on SMP 159 + depends on EXPERIMENTAL 160 + ---help--- 161 + Enable the raid456 module to dispatch per-stripe raid operations to a 162 + thread pool. 163 + 164 + If unsure, say N. 165 + 157 166 config MD_RAID6_PQ 158 167 tristate 168 + 169 + config ASYNC_RAID6_TEST 170 + tristate "Self test for hardware accelerated raid6 recovery" 171 + depends on MD_RAID6_PQ 172 + select ASYNC_RAID6_RECOV 173 + ---help--- 174 + This is a one-shot self test that permutes through the 175 + recovery of all the possible two disk failure scenarios for a 176 + N-disk array. Recovery is performed with the asynchronous 177 + raid6 recovery routines, and will optionally use an offload 178 + engine if one is available. 179 + 180 + If unsure, say N. 159 181 160 182 config MD_MULTIPATH 161 183 tristate "Multipath I/O support"
+913 -562
drivers/md/raid5.c
··· 47 47 #include <linux/kthread.h> 48 48 #include <linux/raid/pq.h> 49 49 #include <linux/async_tx.h> 50 + #include <linux/async.h> 50 51 #include <linux/seq_file.h> 52 + #include <linux/cpu.h> 51 53 #include "md.h" 52 54 #include "raid5.h" 53 55 #include "bitmap.h" ··· 501 499 struct page *bio_page; 502 500 int i; 503 501 int page_offset; 502 + struct async_submit_ctl submit; 503 + enum async_tx_flags flags = 0; 504 504 505 505 if (bio->bi_sector >= sector) 506 506 page_offset = (signed)(bio->bi_sector - sector) * 512; 507 507 else 508 508 page_offset = (signed)(sector - bio->bi_sector) * -512; 509 + 510 + if (frombio) 511 + flags |= ASYNC_TX_FENCE; 512 + init_async_submit(&submit, flags, tx, NULL, NULL, NULL); 513 + 509 514 bio_for_each_segment(bvl, bio, i) { 510 515 int len = bio_iovec_idx(bio, i)->bv_len; 511 516 int clen; ··· 534 525 bio_page = bio_iovec_idx(bio, i)->bv_page; 535 526 if (frombio) 536 527 tx = async_memcpy(page, bio_page, page_offset, 537 - b_offset, clen, 538 - ASYNC_TX_DEP_ACK, 539 - tx, NULL, NULL); 528 + b_offset, clen, &submit); 540 529 else 541 530 tx = async_memcpy(bio_page, page, b_offset, 542 - page_offset, clen, 543 - ASYNC_TX_DEP_ACK, 544 - tx, NULL, NULL); 531 + page_offset, clen, &submit); 545 532 } 533 + /* chain the operations */ 534 + submit.depend_tx = tx; 535 + 546 536 if (clen < len) /* hit end of page */ 547 537 break; 548 538 page_offset += len; ··· 600 592 { 601 593 struct dma_async_tx_descriptor *tx = NULL; 602 594 raid5_conf_t *conf = sh->raid_conf; 595 + struct async_submit_ctl submit; 603 596 int i; 604 597 605 598 pr_debug("%s: stripe %llu\n", __func__, ··· 624 615 } 625 616 626 617 atomic_inc(&sh->count); 627 - async_trigger_callback(ASYNC_TX_DEP_ACK | ASYNC_TX_ACK, tx, 628 - ops_complete_biofill, sh); 618 + init_async_submit(&submit, ASYNC_TX_ACK, tx, ops_complete_biofill, sh, NULL); 619 + async_trigger_callback(&submit); 629 620 } 630 621 631 - static void ops_complete_compute5(void *stripe_head_ref) 622 + static void mark_target_uptodate(struct stripe_head *sh, int target) 623 + { 624 + struct r5dev *tgt; 625 + 626 + if (target < 0) 627 + return; 628 + 629 + tgt = &sh->dev[target]; 630 + set_bit(R5_UPTODATE, &tgt->flags); 631 + BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); 632 + clear_bit(R5_Wantcompute, &tgt->flags); 633 + } 634 + 635 + static void ops_complete_compute(void *stripe_head_ref) 632 636 { 633 637 struct stripe_head *sh = stripe_head_ref; 634 - int target = sh->ops.target; 635 - struct r5dev *tgt = &sh->dev[target]; 636 638 637 639 pr_debug("%s: stripe %llu\n", __func__, 638 640 (unsigned long long)sh->sector); 639 641 640 - set_bit(R5_UPTODATE, &tgt->flags); 641 - BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); 642 - clear_bit(R5_Wantcompute, &tgt->flags); 642 + /* mark the computed target(s) as uptodate */ 643 + mark_target_uptodate(sh, sh->ops.target); 644 + mark_target_uptodate(sh, sh->ops.target2); 645 + 643 646 clear_bit(STRIPE_COMPUTE_RUN, &sh->state); 644 647 if (sh->check_state == check_state_compute_run) 645 648 sh->check_state = check_state_compute_result; ··· 659 638 release_stripe(sh); 660 639 } 661 640 662 - static struct dma_async_tx_descriptor *ops_run_compute5(struct stripe_head *sh) 641 + /* return a pointer to the address conversion region of the scribble buffer */ 642 + static addr_conv_t *to_addr_conv(struct stripe_head *sh, 643 + struct raid5_percpu *percpu) 663 644 { 664 - /* kernel stack size limits the total number of disks */ 645 + return percpu->scribble + sizeof(struct page *) * (sh->disks + 2); 646 + } 647 + 648 + static struct dma_async_tx_descriptor * 649 + ops_run_compute5(struct stripe_head *sh, struct raid5_percpu *percpu) 650 + { 665 651 int disks = sh->disks; 666 - struct page *xor_srcs[disks]; 652 + struct page **xor_srcs = percpu->scribble; 667 653 int target = sh->ops.target; 668 654 struct r5dev *tgt = &sh->dev[target]; 669 655 struct page *xor_dest = tgt->page; 670 656 int count = 0; 671 657 struct dma_async_tx_descriptor *tx; 658 + struct async_submit_ctl submit; 672 659 int i; 673 660 674 661 pr_debug("%s: stripe %llu block: %d\n", ··· 689 660 690 661 atomic_inc(&sh->count); 691 662 663 + init_async_submit(&submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_ZERO_DST, NULL, 664 + ops_complete_compute, sh, to_addr_conv(sh, percpu)); 692 665 if (unlikely(count == 1)) 693 - tx = async_memcpy(xor_dest, xor_srcs[0], 0, 0, STRIPE_SIZE, 694 - 0, NULL, ops_complete_compute5, sh); 666 + tx = async_memcpy(xor_dest, xor_srcs[0], 0, 0, STRIPE_SIZE, &submit); 695 667 else 696 - tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 697 - ASYNC_TX_XOR_ZERO_DST, NULL, 698 - ops_complete_compute5, sh); 668 + tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, &submit); 699 669 700 670 return tx; 701 671 } 672 + 673 + /* set_syndrome_sources - populate source buffers for gen_syndrome 674 + * @srcs - (struct page *) array of size sh->disks 675 + * @sh - stripe_head to parse 676 + * 677 + * Populates srcs in proper layout order for the stripe and returns the 678 + * 'count' of sources to be used in a call to async_gen_syndrome. The P 679 + * destination buffer is recorded in srcs[count] and the Q destination 680 + * is recorded in srcs[count+1]]. 681 + */ 682 + static int set_syndrome_sources(struct page **srcs, struct stripe_head *sh) 683 + { 684 + int disks = sh->disks; 685 + int syndrome_disks = sh->ddf_layout ? disks : (disks - 2); 686 + int d0_idx = raid6_d0(sh); 687 + int count; 688 + int i; 689 + 690 + for (i = 0; i < disks; i++) 691 + srcs[i] = (void *)raid6_empty_zero_page; 692 + 693 + count = 0; 694 + i = d0_idx; 695 + do { 696 + int slot = raid6_idx_to_slot(i, sh, &count, syndrome_disks); 697 + 698 + srcs[slot] = sh->dev[i].page; 699 + i = raid6_next_disk(i, disks); 700 + } while (i != d0_idx); 701 + BUG_ON(count != syndrome_disks); 702 + 703 + return count; 704 + } 705 + 706 + static struct dma_async_tx_descriptor * 707 + ops_run_compute6_1(struct stripe_head *sh, struct raid5_percpu *percpu) 708 + { 709 + int disks = sh->disks; 710 + struct page **blocks = percpu->scribble; 711 + int target; 712 + int qd_idx = sh->qd_idx; 713 + struct dma_async_tx_descriptor *tx; 714 + struct async_submit_ctl submit; 715 + struct r5dev *tgt; 716 + struct page *dest; 717 + int i; 718 + int count; 719 + 720 + if (sh->ops.target < 0) 721 + target = sh->ops.target2; 722 + else if (sh->ops.target2 < 0) 723 + target = sh->ops.target; 724 + else 725 + /* we should only have one valid target */ 726 + BUG(); 727 + BUG_ON(target < 0); 728 + pr_debug("%s: stripe %llu block: %d\n", 729 + __func__, (unsigned long long)sh->sector, target); 730 + 731 + tgt = &sh->dev[target]; 732 + BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); 733 + dest = tgt->page; 734 + 735 + atomic_inc(&sh->count); 736 + 737 + if (target == qd_idx) { 738 + count = set_syndrome_sources(blocks, sh); 739 + blocks[count] = NULL; /* regenerating p is not necessary */ 740 + BUG_ON(blocks[count+1] != dest); /* q should already be set */ 741 + init_async_submit(&submit, ASYNC_TX_FENCE, NULL, 742 + ops_complete_compute, sh, 743 + to_addr_conv(sh, percpu)); 744 + tx = async_gen_syndrome(blocks, 0, count+2, STRIPE_SIZE, &submit); 745 + } else { 746 + /* Compute any data- or p-drive using XOR */ 747 + count = 0; 748 + for (i = disks; i-- ; ) { 749 + if (i == target || i == qd_idx) 750 + continue; 751 + blocks[count++] = sh->dev[i].page; 752 + } 753 + 754 + init_async_submit(&submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_ZERO_DST, 755 + NULL, ops_complete_compute, sh, 756 + to_addr_conv(sh, percpu)); 757 + tx = async_xor(dest, blocks, 0, count, STRIPE_SIZE, &submit); 758 + } 759 + 760 + return tx; 761 + } 762 + 763 + static struct dma_async_tx_descriptor * 764 + ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) 765 + { 766 + int i, count, disks = sh->disks; 767 + int syndrome_disks = sh->ddf_layout ? disks : disks-2; 768 + int d0_idx = raid6_d0(sh); 769 + int faila = -1, failb = -1; 770 + int target = sh->ops.target; 771 + int target2 = sh->ops.target2; 772 + struct r5dev *tgt = &sh->dev[target]; 773 + struct r5dev *tgt2 = &sh->dev[target2]; 774 + struct dma_async_tx_descriptor *tx; 775 + struct page **blocks = percpu->scribble; 776 + struct async_submit_ctl submit; 777 + 778 + pr_debug("%s: stripe %llu block1: %d block2: %d\n", 779 + __func__, (unsigned long long)sh->sector, target, target2); 780 + BUG_ON(target < 0 || target2 < 0); 781 + BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); 782 + BUG_ON(!test_bit(R5_Wantcompute, &tgt2->flags)); 783 + 784 + /* we need to open-code set_syndrome_sources to handle the 785 + * slot number conversion for 'faila' and 'failb' 786 + */ 787 + for (i = 0; i < disks ; i++) 788 + blocks[i] = (void *)raid6_empty_zero_page; 789 + count = 0; 790 + i = d0_idx; 791 + do { 792 + int slot = raid6_idx_to_slot(i, sh, &count, syndrome_disks); 793 + 794 + blocks[slot] = sh->dev[i].page; 795 + 796 + if (i == target) 797 + faila = slot; 798 + if (i == target2) 799 + failb = slot; 800 + i = raid6_next_disk(i, disks); 801 + } while (i != d0_idx); 802 + BUG_ON(count != syndrome_disks); 803 + 804 + BUG_ON(faila == failb); 805 + if (failb < faila) 806 + swap(faila, failb); 807 + pr_debug("%s: stripe: %llu faila: %d failb: %d\n", 808 + __func__, (unsigned long long)sh->sector, faila, failb); 809 + 810 + atomic_inc(&sh->count); 811 + 812 + if (failb == syndrome_disks+1) { 813 + /* Q disk is one of the missing disks */ 814 + if (faila == syndrome_disks) { 815 + /* Missing P+Q, just recompute */ 816 + init_async_submit(&submit, ASYNC_TX_FENCE, NULL, 817 + ops_complete_compute, sh, 818 + to_addr_conv(sh, percpu)); 819 + return async_gen_syndrome(blocks, 0, count+2, 820 + STRIPE_SIZE, &submit); 821 + } else { 822 + struct page *dest; 823 + int data_target; 824 + int qd_idx = sh->qd_idx; 825 + 826 + /* Missing D+Q: recompute D from P, then recompute Q */ 827 + if (target == qd_idx) 828 + data_target = target2; 829 + else 830 + data_target = target; 831 + 832 + count = 0; 833 + for (i = disks; i-- ; ) { 834 + if (i == data_target || i == qd_idx) 835 + continue; 836 + blocks[count++] = sh->dev[i].page; 837 + } 838 + dest = sh->dev[data_target].page; 839 + init_async_submit(&submit, 840 + ASYNC_TX_FENCE|ASYNC_TX_XOR_ZERO_DST, 841 + NULL, NULL, NULL, 842 + to_addr_conv(sh, percpu)); 843 + tx = async_xor(dest, blocks, 0, count, STRIPE_SIZE, 844 + &submit); 845 + 846 + count = set_syndrome_sources(blocks, sh); 847 + init_async_submit(&submit, ASYNC_TX_FENCE, tx, 848 + ops_complete_compute, sh, 849 + to_addr_conv(sh, percpu)); 850 + return async_gen_syndrome(blocks, 0, count+2, 851 + STRIPE_SIZE, &submit); 852 + } 853 + } else { 854 + init_async_submit(&submit, ASYNC_TX_FENCE, NULL, 855 + ops_complete_compute, sh, 856 + to_addr_conv(sh, percpu)); 857 + if (failb == syndrome_disks) { 858 + /* We're missing D+P. */ 859 + return async_raid6_datap_recov(syndrome_disks+2, 860 + STRIPE_SIZE, faila, 861 + blocks, &submit); 862 + } else { 863 + /* We're missing D+D. */ 864 + return async_raid6_2data_recov(syndrome_disks+2, 865 + STRIPE_SIZE, faila, failb, 866 + blocks, &submit); 867 + } 868 + } 869 + } 870 + 702 871 703 872 static void ops_complete_prexor(void *stripe_head_ref) 704 873 { ··· 907 680 } 908 681 909 682 static struct dma_async_tx_descriptor * 910 - ops_run_prexor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx) 683 + ops_run_prexor(struct stripe_head *sh, struct raid5_percpu *percpu, 684 + struct dma_async_tx_descriptor *tx) 911 685 { 912 - /* kernel stack size limits the total number of disks */ 913 686 int disks = sh->disks; 914 - struct page *xor_srcs[disks]; 687 + struct page **xor_srcs = percpu->scribble; 915 688 int count = 0, pd_idx = sh->pd_idx, i; 689 + struct async_submit_ctl submit; 916 690 917 691 /* existing parity data subtracted */ 918 692 struct page *xor_dest = xor_srcs[count++] = sh->dev[pd_idx].page; ··· 928 700 xor_srcs[count++] = dev->page; 929 701 } 930 702 931 - tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 932 - ASYNC_TX_DEP_ACK | ASYNC_TX_XOR_DROP_DST, tx, 933 - ops_complete_prexor, sh); 703 + init_async_submit(&submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx, 704 + ops_complete_prexor, sh, to_addr_conv(sh, percpu)); 705 + tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, &submit); 934 706 935 707 return tx; 936 708 } ··· 970 742 return tx; 971 743 } 972 744 973 - static void ops_complete_postxor(void *stripe_head_ref) 745 + static void ops_complete_reconstruct(void *stripe_head_ref) 974 746 { 975 747 struct stripe_head *sh = stripe_head_ref; 976 - int disks = sh->disks, i, pd_idx = sh->pd_idx; 748 + int disks = sh->disks; 749 + int pd_idx = sh->pd_idx; 750 + int qd_idx = sh->qd_idx; 751 + int i; 977 752 978 753 pr_debug("%s: stripe %llu\n", __func__, 979 754 (unsigned long long)sh->sector); 980 755 981 756 for (i = disks; i--; ) { 982 757 struct r5dev *dev = &sh->dev[i]; 983 - if (dev->written || i == pd_idx) 758 + 759 + if (dev->written || i == pd_idx || i == qd_idx) 984 760 set_bit(R5_UPTODATE, &dev->flags); 985 761 } 986 762 ··· 1002 770 } 1003 771 1004 772 static void 1005 - ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx) 773 + ops_run_reconstruct5(struct stripe_head *sh, struct raid5_percpu *percpu, 774 + struct dma_async_tx_descriptor *tx) 1006 775 { 1007 - /* kernel stack size limits the total number of disks */ 1008 776 int disks = sh->disks; 1009 - struct page *xor_srcs[disks]; 1010 - 777 + struct page **xor_srcs = percpu->scribble; 778 + struct async_submit_ctl submit; 1011 779 int count = 0, pd_idx = sh->pd_idx, i; 1012 780 struct page *xor_dest; 1013 781 int prexor = 0; ··· 1041 809 * set ASYNC_TX_XOR_DROP_DST and ASYNC_TX_XOR_ZERO_DST 1042 810 * for the synchronous xor case 1043 811 */ 1044 - flags = ASYNC_TX_DEP_ACK | ASYNC_TX_ACK | 812 + flags = ASYNC_TX_ACK | 1045 813 (prexor ? ASYNC_TX_XOR_DROP_DST : ASYNC_TX_XOR_ZERO_DST); 1046 814 1047 815 atomic_inc(&sh->count); 1048 816 1049 - if (unlikely(count == 1)) { 1050 - flags &= ~(ASYNC_TX_XOR_DROP_DST | ASYNC_TX_XOR_ZERO_DST); 1051 - tx = async_memcpy(xor_dest, xor_srcs[0], 0, 0, STRIPE_SIZE, 1052 - flags, tx, ops_complete_postxor, sh); 1053 - } else 1054 - tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 1055 - flags, tx, ops_complete_postxor, sh); 817 + init_async_submit(&submit, flags, tx, ops_complete_reconstruct, sh, 818 + to_addr_conv(sh, percpu)); 819 + if (unlikely(count == 1)) 820 + tx = async_memcpy(xor_dest, xor_srcs[0], 0, 0, STRIPE_SIZE, &submit); 821 + else 822 + tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, &submit); 823 + } 824 + 825 + static void 826 + ops_run_reconstruct6(struct stripe_head *sh, struct raid5_percpu *percpu, 827 + struct dma_async_tx_descriptor *tx) 828 + { 829 + struct async_submit_ctl submit; 830 + struct page **blocks = percpu->scribble; 831 + int count; 832 + 833 + pr_debug("%s: stripe %llu\n", __func__, (unsigned long long)sh->sector); 834 + 835 + count = set_syndrome_sources(blocks, sh); 836 + 837 + atomic_inc(&sh->count); 838 + 839 + init_async_submit(&submit, ASYNC_TX_ACK, tx, ops_complete_reconstruct, 840 + sh, to_addr_conv(sh, percpu)); 841 + async_gen_syndrome(blocks, 0, count+2, STRIPE_SIZE, &submit); 1056 842 } 1057 843 1058 844 static void ops_complete_check(void *stripe_head_ref) ··· 1085 835 release_stripe(sh); 1086 836 } 1087 837 1088 - static void ops_run_check(struct stripe_head *sh) 838 + static void ops_run_check_p(struct stripe_head *sh, struct raid5_percpu *percpu) 1089 839 { 1090 - /* kernel stack size limits the total number of disks */ 1091 840 int disks = sh->disks; 1092 - struct page *xor_srcs[disks]; 841 + int pd_idx = sh->pd_idx; 842 + int qd_idx = sh->qd_idx; 843 + struct page *xor_dest; 844 + struct page **xor_srcs = percpu->scribble; 1093 845 struct dma_async_tx_descriptor *tx; 1094 - 1095 - int count = 0, pd_idx = sh->pd_idx, i; 1096 - struct page *xor_dest = xor_srcs[count++] = sh->dev[pd_idx].page; 846 + struct async_submit_ctl submit; 847 + int count; 848 + int i; 1097 849 1098 850 pr_debug("%s: stripe %llu\n", __func__, 1099 851 (unsigned long long)sh->sector); 1100 852 853 + count = 0; 854 + xor_dest = sh->dev[pd_idx].page; 855 + xor_srcs[count++] = xor_dest; 1101 856 for (i = disks; i--; ) { 1102 - struct r5dev *dev = &sh->dev[i]; 1103 - if (i != pd_idx) 1104 - xor_srcs[count++] = dev->page; 857 + if (i == pd_idx || i == qd_idx) 858 + continue; 859 + xor_srcs[count++] = sh->dev[i].page; 1105 860 } 1106 861 1107 - tx = async_xor_zero_sum(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 1108 - &sh->ops.zero_sum_result, 0, NULL, NULL, NULL); 862 + init_async_submit(&submit, 0, NULL, NULL, NULL, 863 + to_addr_conv(sh, percpu)); 864 + tx = async_xor_val(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 865 + &sh->ops.zero_sum_result, &submit); 1109 866 1110 867 atomic_inc(&sh->count); 1111 - tx = async_trigger_callback(ASYNC_TX_DEP_ACK | ASYNC_TX_ACK, tx, 1112 - ops_complete_check, sh); 868 + init_async_submit(&submit, ASYNC_TX_ACK, tx, ops_complete_check, sh, NULL); 869 + tx = async_trigger_callback(&submit); 1113 870 } 1114 871 1115 - static void raid5_run_ops(struct stripe_head *sh, unsigned long ops_request) 872 + static void ops_run_check_pq(struct stripe_head *sh, struct raid5_percpu *percpu, int checkp) 873 + { 874 + struct page **srcs = percpu->scribble; 875 + struct async_submit_ctl submit; 876 + int count; 877 + 878 + pr_debug("%s: stripe %llu checkp: %d\n", __func__, 879 + (unsigned long long)sh->sector, checkp); 880 + 881 + count = set_syndrome_sources(srcs, sh); 882 + if (!checkp) 883 + srcs[count] = NULL; 884 + 885 + atomic_inc(&sh->count); 886 + init_async_submit(&submit, ASYNC_TX_ACK, NULL, ops_complete_check, 887 + sh, to_addr_conv(sh, percpu)); 888 + async_syndrome_val(srcs, 0, count+2, STRIPE_SIZE, 889 + &sh->ops.zero_sum_result, percpu->spare_page, &submit); 890 + } 891 + 892 + static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) 1116 893 { 1117 894 int overlap_clear = 0, i, disks = sh->disks; 1118 895 struct dma_async_tx_descriptor *tx = NULL; 896 + raid5_conf_t *conf = sh->raid_conf; 897 + int level = conf->level; 898 + struct raid5_percpu *percpu; 899 + unsigned long cpu; 1119 900 901 + cpu = get_cpu(); 902 + percpu = per_cpu_ptr(conf->percpu, cpu); 1120 903 if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { 1121 904 ops_run_biofill(sh); 1122 905 overlap_clear++; 1123 906 } 1124 907 1125 908 if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request)) { 1126 - tx = ops_run_compute5(sh); 1127 - /* terminate the chain if postxor is not set to be run */ 1128 - if (tx && !test_bit(STRIPE_OP_POSTXOR, &ops_request)) 909 + if (level < 6) 910 + tx = ops_run_compute5(sh, percpu); 911 + else { 912 + if (sh->ops.target2 < 0 || sh->ops.target < 0) 913 + tx = ops_run_compute6_1(sh, percpu); 914 + else 915 + tx = ops_run_compute6_2(sh, percpu); 916 + } 917 + /* terminate the chain if reconstruct is not set to be run */ 918 + if (tx && !test_bit(STRIPE_OP_RECONSTRUCT, &ops_request)) 1129 919 async_tx_ack(tx); 1130 920 } 1131 921 1132 922 if (test_bit(STRIPE_OP_PREXOR, &ops_request)) 1133 - tx = ops_run_prexor(sh, tx); 923 + tx = ops_run_prexor(sh, percpu, tx); 1134 924 1135 925 if (test_bit(STRIPE_OP_BIODRAIN, &ops_request)) { 1136 926 tx = ops_run_biodrain(sh, tx); 1137 927 overlap_clear++; 1138 928 } 1139 929 1140 - if (test_bit(STRIPE_OP_POSTXOR, &ops_request)) 1141 - ops_run_postxor(sh, tx); 930 + if (test_bit(STRIPE_OP_RECONSTRUCT, &ops_request)) { 931 + if (level < 6) 932 + ops_run_reconstruct5(sh, percpu, tx); 933 + else 934 + ops_run_reconstruct6(sh, percpu, tx); 935 + } 1142 936 1143 - if (test_bit(STRIPE_OP_CHECK, &ops_request)) 1144 - ops_run_check(sh); 937 + if (test_bit(STRIPE_OP_CHECK, &ops_request)) { 938 + if (sh->check_state == check_state_run) 939 + ops_run_check_p(sh, percpu); 940 + else if (sh->check_state == check_state_run_q) 941 + ops_run_check_pq(sh, percpu, 0); 942 + else if (sh->check_state == check_state_run_pq) 943 + ops_run_check_pq(sh, percpu, 1); 944 + else 945 + BUG(); 946 + } 1145 947 1146 948 if (overlap_clear) 1147 949 for (i = disks; i--; ) { ··· 1201 899 if (test_and_clear_bit(R5_Overlap, &dev->flags)) 1202 900 wake_up(&sh->raid_conf->wait_for_overlap); 1203 901 } 902 + put_cpu(); 1204 903 } 1205 904 1206 905 static int grow_one_stripe(raid5_conf_t *conf) ··· 1251 948 return 0; 1252 949 } 1253 950 951 + /** 952 + * scribble_len - return the required size of the scribble region 953 + * @num - total number of disks in the array 954 + * 955 + * The size must be enough to contain: 956 + * 1/ a struct page pointer for each device in the array +2 957 + * 2/ room to convert each entry in (1) to its corresponding dma 958 + * (dma_map_page()) or page (page_address()) address. 959 + * 960 + * Note: the +2 is for the destination buffers of the ddf/raid6 case where we 961 + * calculate over all devices (not just the data blocks), using zeros in place 962 + * of the P and Q blocks. 963 + */ 964 + static size_t scribble_len(int num) 965 + { 966 + size_t len; 967 + 968 + len = sizeof(struct page *) * (num+2) + sizeof(addr_conv_t) * (num+2); 969 + 970 + return len; 971 + } 972 + 1254 973 static int resize_stripes(raid5_conf_t *conf, int newsize) 1255 974 { 1256 975 /* Make all the stripes able to hold 'newsize' devices. ··· 1301 976 struct stripe_head *osh, *nsh; 1302 977 LIST_HEAD(newstripes); 1303 978 struct disk_info *ndisks; 979 + unsigned long cpu; 1304 980 int err; 1305 981 struct kmem_cache *sc; 1306 982 int i; ··· 1367 1041 /* Step 3. 1368 1042 * At this point, we are holding all the stripes so the array 1369 1043 * is completely stalled, so now is a good time to resize 1370 - * conf->disks. 1044 + * conf->disks and the scribble region 1371 1045 */ 1372 1046 ndisks = kzalloc(newsize * sizeof(struct disk_info), GFP_NOIO); 1373 1047 if (ndisks) { ··· 1378 1052 } else 1379 1053 err = -ENOMEM; 1380 1054 1055 + get_online_cpus(); 1056 + conf->scribble_len = scribble_len(newsize); 1057 + for_each_present_cpu(cpu) { 1058 + struct raid5_percpu *percpu; 1059 + void *scribble; 1060 + 1061 + percpu = per_cpu_ptr(conf->percpu, cpu); 1062 + scribble = kmalloc(conf->scribble_len, GFP_NOIO); 1063 + 1064 + if (scribble) { 1065 + kfree(percpu->scribble); 1066 + percpu->scribble = scribble; 1067 + } else { 1068 + err = -ENOMEM; 1069 + break; 1070 + } 1071 + } 1072 + put_online_cpus(); 1073 + 1381 1074 /* Step 4, return new stripes to service */ 1382 1075 while(!list_empty(&newstripes)) { 1383 1076 nsh = list_entry(newstripes.next, struct stripe_head, lru); 1384 1077 list_del_init(&nsh->lru); 1078 + 1385 1079 for (i=conf->raid_disks; i < newsize; i++) 1386 1080 if (nsh->dev[i].page == NULL) { 1387 1081 struct page *p = alloc_page(GFP_NOIO); ··· 1940 1594 } 1941 1595 1942 1596 1943 - 1944 - /* 1945 - * Copy data between a page in the stripe cache, and one or more bion 1946 - * The page could align with the middle of the bio, or there could be 1947 - * several bion, each with several bio_vecs, which cover part of the page 1948 - * Multiple bion are linked together on bi_next. There may be extras 1949 - * at the end of this list. We ignore them. 1950 - */ 1951 - static void copy_data(int frombio, struct bio *bio, 1952 - struct page *page, 1953 - sector_t sector) 1954 - { 1955 - char *pa = page_address(page); 1956 - struct bio_vec *bvl; 1957 - int i; 1958 - int page_offset; 1959 - 1960 - if (bio->bi_sector >= sector) 1961 - page_offset = (signed)(bio->bi_sector - sector) * 512; 1962 - else 1963 - page_offset = (signed)(sector - bio->bi_sector) * -512; 1964 - bio_for_each_segment(bvl, bio, i) { 1965 - int len = bio_iovec_idx(bio,i)->bv_len; 1966 - int clen; 1967 - int b_offset = 0; 1968 - 1969 - if (page_offset < 0) { 1970 - b_offset = -page_offset; 1971 - page_offset += b_offset; 1972 - len -= b_offset; 1973 - } 1974 - 1975 - if (len > 0 && page_offset + len > STRIPE_SIZE) 1976 - clen = STRIPE_SIZE - page_offset; 1977 - else clen = len; 1978 - 1979 - if (clen > 0) { 1980 - char *ba = __bio_kmap_atomic(bio, i, KM_USER0); 1981 - if (frombio) 1982 - memcpy(pa+page_offset, ba+b_offset, clen); 1983 - else 1984 - memcpy(ba+b_offset, pa+page_offset, clen); 1985 - __bio_kunmap_atomic(ba, KM_USER0); 1986 - } 1987 - if (clen < len) /* hit end of page */ 1988 - break; 1989 - page_offset += len; 1990 - } 1991 - } 1992 - 1993 - #define check_xor() do { \ 1994 - if (count == MAX_XOR_BLOCKS) { \ 1995 - xor_blocks(count, STRIPE_SIZE, dest, ptr);\ 1996 - count = 0; \ 1997 - } \ 1998 - } while(0) 1999 - 2000 - static void compute_parity6(struct stripe_head *sh, int method) 2001 - { 2002 - raid5_conf_t *conf = sh->raid_conf; 2003 - int i, pd_idx, qd_idx, d0_idx, disks = sh->disks, count; 2004 - int syndrome_disks = sh->ddf_layout ? disks : (disks - 2); 2005 - struct bio *chosen; 2006 - /**** FIX THIS: This could be very bad if disks is close to 256 ****/ 2007 - void *ptrs[syndrome_disks+2]; 2008 - 2009 - pd_idx = sh->pd_idx; 2010 - qd_idx = sh->qd_idx; 2011 - d0_idx = raid6_d0(sh); 2012 - 2013 - pr_debug("compute_parity, stripe %llu, method %d\n", 2014 - (unsigned long long)sh->sector, method); 2015 - 2016 - switch(method) { 2017 - case READ_MODIFY_WRITE: 2018 - BUG(); /* READ_MODIFY_WRITE N/A for RAID-6 */ 2019 - case RECONSTRUCT_WRITE: 2020 - for (i= disks; i-- ;) 2021 - if ( i != pd_idx && i != qd_idx && sh->dev[i].towrite ) { 2022 - chosen = sh->dev[i].towrite; 2023 - sh->dev[i].towrite = NULL; 2024 - 2025 - if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) 2026 - wake_up(&conf->wait_for_overlap); 2027 - 2028 - BUG_ON(sh->dev[i].written); 2029 - sh->dev[i].written = chosen; 2030 - } 2031 - break; 2032 - case CHECK_PARITY: 2033 - BUG(); /* Not implemented yet */ 2034 - } 2035 - 2036 - for (i = disks; i--;) 2037 - if (sh->dev[i].written) { 2038 - sector_t sector = sh->dev[i].sector; 2039 - struct bio *wbi = sh->dev[i].written; 2040 - while (wbi && wbi->bi_sector < sector + STRIPE_SECTORS) { 2041 - copy_data(1, wbi, sh->dev[i].page, sector); 2042 - wbi = r5_next_bio(wbi, sector); 2043 - } 2044 - 2045 - set_bit(R5_LOCKED, &sh->dev[i].flags); 2046 - set_bit(R5_UPTODATE, &sh->dev[i].flags); 2047 - } 2048 - 2049 - /* Note that unlike RAID-5, the ordering of the disks matters greatly.*/ 2050 - 2051 - for (i = 0; i < disks; i++) 2052 - ptrs[i] = (void *)raid6_empty_zero_page; 2053 - 2054 - count = 0; 2055 - i = d0_idx; 2056 - do { 2057 - int slot = raid6_idx_to_slot(i, sh, &count, syndrome_disks); 2058 - 2059 - ptrs[slot] = page_address(sh->dev[i].page); 2060 - if (slot < syndrome_disks && 2061 - !test_bit(R5_UPTODATE, &sh->dev[i].flags)) { 2062 - printk(KERN_ERR "block %d/%d not uptodate " 2063 - "on parity calc\n", i, count); 2064 - BUG(); 2065 - } 2066 - 2067 - i = raid6_next_disk(i, disks); 2068 - } while (i != d0_idx); 2069 - BUG_ON(count != syndrome_disks); 2070 - 2071 - raid6_call.gen_syndrome(syndrome_disks+2, STRIPE_SIZE, ptrs); 2072 - 2073 - switch(method) { 2074 - case RECONSTRUCT_WRITE: 2075 - set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); 2076 - set_bit(R5_UPTODATE, &sh->dev[qd_idx].flags); 2077 - set_bit(R5_LOCKED, &sh->dev[pd_idx].flags); 2078 - set_bit(R5_LOCKED, &sh->dev[qd_idx].flags); 2079 - break; 2080 - case UPDATE_PARITY: 2081 - set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); 2082 - set_bit(R5_UPTODATE, &sh->dev[qd_idx].flags); 2083 - break; 2084 - } 2085 - } 2086 - 2087 - 2088 - /* Compute one missing block */ 2089 - static void compute_block_1(struct stripe_head *sh, int dd_idx, int nozero) 2090 - { 2091 - int i, count, disks = sh->disks; 2092 - void *ptr[MAX_XOR_BLOCKS], *dest, *p; 2093 - int qd_idx = sh->qd_idx; 2094 - 2095 - pr_debug("compute_block_1, stripe %llu, idx %d\n", 2096 - (unsigned long long)sh->sector, dd_idx); 2097 - 2098 - if ( dd_idx == qd_idx ) { 2099 - /* We're actually computing the Q drive */ 2100 - compute_parity6(sh, UPDATE_PARITY); 2101 - } else { 2102 - dest = page_address(sh->dev[dd_idx].page); 2103 - if (!nozero) memset(dest, 0, STRIPE_SIZE); 2104 - count = 0; 2105 - for (i = disks ; i--; ) { 2106 - if (i == dd_idx || i == qd_idx) 2107 - continue; 2108 - p = page_address(sh->dev[i].page); 2109 - if (test_bit(R5_UPTODATE, &sh->dev[i].flags)) 2110 - ptr[count++] = p; 2111 - else 2112 - printk("compute_block() %d, stripe %llu, %d" 2113 - " not present\n", dd_idx, 2114 - (unsigned long long)sh->sector, i); 2115 - 2116 - check_xor(); 2117 - } 2118 - if (count) 2119 - xor_blocks(count, STRIPE_SIZE, dest, ptr); 2120 - if (!nozero) set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); 2121 - else clear_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); 2122 - } 2123 - } 2124 - 2125 - /* Compute two missing blocks */ 2126 - static void compute_block_2(struct stripe_head *sh, int dd_idx1, int dd_idx2) 2127 - { 2128 - int i, count, disks = sh->disks; 2129 - int syndrome_disks = sh->ddf_layout ? disks : disks-2; 2130 - int d0_idx = raid6_d0(sh); 2131 - int faila = -1, failb = -1; 2132 - /**** FIX THIS: This could be very bad if disks is close to 256 ****/ 2133 - void *ptrs[syndrome_disks+2]; 2134 - 2135 - for (i = 0; i < disks ; i++) 2136 - ptrs[i] = (void *)raid6_empty_zero_page; 2137 - count = 0; 2138 - i = d0_idx; 2139 - do { 2140 - int slot = raid6_idx_to_slot(i, sh, &count, syndrome_disks); 2141 - 2142 - ptrs[slot] = page_address(sh->dev[i].page); 2143 - 2144 - if (i == dd_idx1) 2145 - faila = slot; 2146 - if (i == dd_idx2) 2147 - failb = slot; 2148 - i = raid6_next_disk(i, disks); 2149 - } while (i != d0_idx); 2150 - BUG_ON(count != syndrome_disks); 2151 - 2152 - BUG_ON(faila == failb); 2153 - if ( failb < faila ) { int tmp = faila; faila = failb; failb = tmp; } 2154 - 2155 - pr_debug("compute_block_2, stripe %llu, idx %d,%d (%d,%d)\n", 2156 - (unsigned long long)sh->sector, dd_idx1, dd_idx2, 2157 - faila, failb); 2158 - 2159 - if (failb == syndrome_disks+1) { 2160 - /* Q disk is one of the missing disks */ 2161 - if (faila == syndrome_disks) { 2162 - /* Missing P+Q, just recompute */ 2163 - compute_parity6(sh, UPDATE_PARITY); 2164 - return; 2165 - } else { 2166 - /* We're missing D+Q; recompute D from P */ 2167 - compute_block_1(sh, ((dd_idx1 == sh->qd_idx) ? 2168 - dd_idx2 : dd_idx1), 2169 - 0); 2170 - compute_parity6(sh, UPDATE_PARITY); /* Is this necessary? */ 2171 - return; 2172 - } 2173 - } 2174 - 2175 - /* We're missing D+P or D+D; */ 2176 - if (failb == syndrome_disks) { 2177 - /* We're missing D+P. */ 2178 - raid6_datap_recov(syndrome_disks+2, STRIPE_SIZE, faila, ptrs); 2179 - } else { 2180 - /* We're missing D+D. */ 2181 - raid6_2data_recov(syndrome_disks+2, STRIPE_SIZE, faila, failb, 2182 - ptrs); 2183 - } 2184 - 2185 - /* Both the above update both missing blocks */ 2186 - set_bit(R5_UPTODATE, &sh->dev[dd_idx1].flags); 2187 - set_bit(R5_UPTODATE, &sh->dev[dd_idx2].flags); 2188 - } 2189 - 2190 1597 static void 2191 - schedule_reconstruction5(struct stripe_head *sh, struct stripe_head_state *s, 1598 + schedule_reconstruction(struct stripe_head *sh, struct stripe_head_state *s, 2192 1599 int rcw, int expand) 2193 1600 { 2194 1601 int i, pd_idx = sh->pd_idx, disks = sh->disks; 1602 + raid5_conf_t *conf = sh->raid_conf; 1603 + int level = conf->level; 2195 1604 2196 1605 if (rcw) { 2197 1606 /* if we are not expanding this is a proper write request, and ··· 1959 1858 } else 1960 1859 sh->reconstruct_state = reconstruct_state_run; 1961 1860 1962 - set_bit(STRIPE_OP_POSTXOR, &s->ops_request); 1861 + set_bit(STRIPE_OP_RECONSTRUCT, &s->ops_request); 1963 1862 1964 1863 for (i = disks; i--; ) { 1965 1864 struct r5dev *dev = &sh->dev[i]; ··· 1972 1871 s->locked++; 1973 1872 } 1974 1873 } 1975 - if (s->locked + 1 == disks) 1874 + if (s->locked + conf->max_degraded == disks) 1976 1875 if (!test_and_set_bit(STRIPE_FULL_WRITE, &sh->state)) 1977 - atomic_inc(&sh->raid_conf->pending_full_writes); 1876 + atomic_inc(&conf->pending_full_writes); 1978 1877 } else { 1878 + BUG_ON(level == 6); 1979 1879 BUG_ON(!(test_bit(R5_UPTODATE, &sh->dev[pd_idx].flags) || 1980 1880 test_bit(R5_Wantcompute, &sh->dev[pd_idx].flags))); 1981 1881 1982 1882 sh->reconstruct_state = reconstruct_state_prexor_drain_run; 1983 1883 set_bit(STRIPE_OP_PREXOR, &s->ops_request); 1984 1884 set_bit(STRIPE_OP_BIODRAIN, &s->ops_request); 1985 - set_bit(STRIPE_OP_POSTXOR, &s->ops_request); 1885 + set_bit(STRIPE_OP_RECONSTRUCT, &s->ops_request); 1986 1886 1987 1887 for (i = disks; i--; ) { 1988 1888 struct r5dev *dev = &sh->dev[i]; ··· 2001 1899 } 2002 1900 } 2003 1901 2004 - /* keep the parity disk locked while asynchronous operations 1902 + /* keep the parity disk(s) locked while asynchronous operations 2005 1903 * are in flight 2006 1904 */ 2007 1905 set_bit(R5_LOCKED, &sh->dev[pd_idx].flags); 2008 1906 clear_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); 2009 1907 s->locked++; 1908 + 1909 + if (level == 6) { 1910 + int qd_idx = sh->qd_idx; 1911 + struct r5dev *dev = &sh->dev[qd_idx]; 1912 + 1913 + set_bit(R5_LOCKED, &dev->flags); 1914 + clear_bit(R5_UPTODATE, &dev->flags); 1915 + s->locked++; 1916 + } 2010 1917 2011 1918 pr_debug("%s: stripe %llu locked: %d ops_request: %lx\n", 2012 1919 __func__, (unsigned long long)sh->sector, ··· 2096 1985 } 2097 1986 2098 1987 static void end_reshape(raid5_conf_t *conf); 2099 - 2100 - static int page_is_zero(struct page *p) 2101 - { 2102 - char *a = page_address(p); 2103 - return ((*(u32*)a) == 0 && 2104 - memcmp(a, a+4, STRIPE_SIZE-4)==0); 2105 - } 2106 1988 2107 1989 static void stripe_set_idx(sector_t stripe, raid5_conf_t *conf, int previous, 2108 1990 struct stripe_head *sh) ··· 2236 2132 set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request); 2237 2133 set_bit(R5_Wantcompute, &dev->flags); 2238 2134 sh->ops.target = disk_idx; 2135 + sh->ops.target2 = -1; 2239 2136 s->req_compute = 1; 2240 2137 /* Careful: from this point on 'uptodate' is in the eye 2241 - * of raid5_run_ops which services 'compute' operations 2138 + * of raid_run_ops which services 'compute' operations 2242 2139 * before writes. R5_Wantcompute flags a block that will 2243 2140 * be R5_UPTODATE by the time it is needed for a 2244 2141 * subsequent operation. ··· 2278 2173 set_bit(STRIPE_HANDLE, &sh->state); 2279 2174 } 2280 2175 2176 + /* fetch_block6 - checks the given member device to see if its data needs 2177 + * to be read or computed to satisfy a request. 2178 + * 2179 + * Returns 1 when no more member devices need to be checked, otherwise returns 2180 + * 0 to tell the loop in handle_stripe_fill6 to continue 2181 + */ 2182 + static int fetch_block6(struct stripe_head *sh, struct stripe_head_state *s, 2183 + struct r6_state *r6s, int disk_idx, int disks) 2184 + { 2185 + struct r5dev *dev = &sh->dev[disk_idx]; 2186 + struct r5dev *fdev[2] = { &sh->dev[r6s->failed_num[0]], 2187 + &sh->dev[r6s->failed_num[1]] }; 2188 + 2189 + if (!test_bit(R5_LOCKED, &dev->flags) && 2190 + !test_bit(R5_UPTODATE, &dev->flags) && 2191 + (dev->toread || 2192 + (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) || 2193 + s->syncing || s->expanding || 2194 + (s->failed >= 1 && 2195 + (fdev[0]->toread || s->to_write)) || 2196 + (s->failed >= 2 && 2197 + (fdev[1]->toread || s->to_write)))) { 2198 + /* we would like to get this block, possibly by computing it, 2199 + * otherwise read it if the backing disk is insync 2200 + */ 2201 + BUG_ON(test_bit(R5_Wantcompute, &dev->flags)); 2202 + BUG_ON(test_bit(R5_Wantread, &dev->flags)); 2203 + if ((s->uptodate == disks - 1) && 2204 + (s->failed && (disk_idx == r6s->failed_num[0] || 2205 + disk_idx == r6s->failed_num[1]))) { 2206 + /* have disk failed, and we're requested to fetch it; 2207 + * do compute it 2208 + */ 2209 + pr_debug("Computing stripe %llu block %d\n", 2210 + (unsigned long long)sh->sector, disk_idx); 2211 + set_bit(STRIPE_COMPUTE_RUN, &sh->state); 2212 + set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request); 2213 + set_bit(R5_Wantcompute, &dev->flags); 2214 + sh->ops.target = disk_idx; 2215 + sh->ops.target2 = -1; /* no 2nd target */ 2216 + s->req_compute = 1; 2217 + s->uptodate++; 2218 + return 1; 2219 + } else if (s->uptodate == disks-2 && s->failed >= 2) { 2220 + /* Computing 2-failure is *very* expensive; only 2221 + * do it if failed >= 2 2222 + */ 2223 + int other; 2224 + for (other = disks; other--; ) { 2225 + if (other == disk_idx) 2226 + continue; 2227 + if (!test_bit(R5_UPTODATE, 2228 + &sh->dev[other].flags)) 2229 + break; 2230 + } 2231 + BUG_ON(other < 0); 2232 + pr_debug("Computing stripe %llu blocks %d,%d\n", 2233 + (unsigned long long)sh->sector, 2234 + disk_idx, other); 2235 + set_bit(STRIPE_COMPUTE_RUN, &sh->state); 2236 + set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request); 2237 + set_bit(R5_Wantcompute, &sh->dev[disk_idx].flags); 2238 + set_bit(R5_Wantcompute, &sh->dev[other].flags); 2239 + sh->ops.target = disk_idx; 2240 + sh->ops.target2 = other; 2241 + s->uptodate += 2; 2242 + s->req_compute = 1; 2243 + return 1; 2244 + } else if (test_bit(R5_Insync, &dev->flags)) { 2245 + set_bit(R5_LOCKED, &dev->flags); 2246 + set_bit(R5_Wantread, &dev->flags); 2247 + s->locked++; 2248 + pr_debug("Reading block %d (sync=%d)\n", 2249 + disk_idx, s->syncing); 2250 + } 2251 + } 2252 + 2253 + return 0; 2254 + } 2255 + 2256 + /** 2257 + * handle_stripe_fill6 - read or compute data to satisfy pending requests. 2258 + */ 2281 2259 static void handle_stripe_fill6(struct stripe_head *sh, 2282 2260 struct stripe_head_state *s, struct r6_state *r6s, 2283 2261 int disks) 2284 2262 { 2285 2263 int i; 2286 - for (i = disks; i--; ) { 2287 - struct r5dev *dev = &sh->dev[i]; 2288 - if (!test_bit(R5_LOCKED, &dev->flags) && 2289 - !test_bit(R5_UPTODATE, &dev->flags) && 2290 - (dev->toread || (dev->towrite && 2291 - !test_bit(R5_OVERWRITE, &dev->flags)) || 2292 - s->syncing || s->expanding || 2293 - (s->failed >= 1 && 2294 - (sh->dev[r6s->failed_num[0]].toread || 2295 - s->to_write)) || 2296 - (s->failed >= 2 && 2297 - (sh->dev[r6s->failed_num[1]].toread || 2298 - s->to_write)))) { 2299 - /* we would like to get this block, possibly 2300 - * by computing it, but we might not be able to 2301 - */ 2302 - if ((s->uptodate == disks - 1) && 2303 - (s->failed && (i == r6s->failed_num[0] || 2304 - i == r6s->failed_num[1]))) { 2305 - pr_debug("Computing stripe %llu block %d\n", 2306 - (unsigned long long)sh->sector, i); 2307 - compute_block_1(sh, i, 0); 2308 - s->uptodate++; 2309 - } else if ( s->uptodate == disks-2 && s->failed >= 2 ) { 2310 - /* Computing 2-failure is *very* expensive; only 2311 - * do it if failed >= 2 2312 - */ 2313 - int other; 2314 - for (other = disks; other--; ) { 2315 - if (other == i) 2316 - continue; 2317 - if (!test_bit(R5_UPTODATE, 2318 - &sh->dev[other].flags)) 2319 - break; 2320 - } 2321 - BUG_ON(other < 0); 2322 - pr_debug("Computing stripe %llu blocks %d,%d\n", 2323 - (unsigned long long)sh->sector, 2324 - i, other); 2325 - compute_block_2(sh, i, other); 2326 - s->uptodate += 2; 2327 - } else if (test_bit(R5_Insync, &dev->flags)) { 2328 - set_bit(R5_LOCKED, &dev->flags); 2329 - set_bit(R5_Wantread, &dev->flags); 2330 - s->locked++; 2331 - pr_debug("Reading block %d (sync=%d)\n", 2332 - i, s->syncing); 2333 - } 2334 - } 2335 - } 2264 + 2265 + /* look for blocks to read/compute, skip this if a compute 2266 + * is already in flight, or if the stripe contents are in the 2267 + * midst of changing due to a write 2268 + */ 2269 + if (!test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !sh->check_state && 2270 + !sh->reconstruct_state) 2271 + for (i = disks; i--; ) 2272 + if (fetch_block6(sh, s, r6s, i, disks)) 2273 + break; 2336 2274 set_bit(STRIPE_HANDLE, &sh->state); 2337 2275 } 2338 2276 ··· 2509 2361 */ 2510 2362 /* since handle_stripe can be called at any time we need to handle the 2511 2363 * case where a compute block operation has been submitted and then a 2512 - * subsequent call wants to start a write request. raid5_run_ops only 2513 - * handles the case where compute block and postxor are requested 2364 + * subsequent call wants to start a write request. raid_run_ops only 2365 + * handles the case where compute block and reconstruct are requested 2514 2366 * simultaneously. If this is not the case then new writes need to be 2515 2367 * held off until the compute completes. 2516 2368 */ 2517 2369 if ((s->req_compute || !test_bit(STRIPE_COMPUTE_RUN, &sh->state)) && 2518 2370 (s->locked == 0 && (rcw == 0 || rmw == 0) && 2519 2371 !test_bit(STRIPE_BIT_DELAY, &sh->state))) 2520 - schedule_reconstruction5(sh, s, rcw == 0, 0); 2372 + schedule_reconstruction(sh, s, rcw == 0, 0); 2521 2373 } 2522 2374 2523 2375 static void handle_stripe_dirtying6(raid5_conf_t *conf, 2524 2376 struct stripe_head *sh, struct stripe_head_state *s, 2525 2377 struct r6_state *r6s, int disks) 2526 2378 { 2527 - int rcw = 0, must_compute = 0, pd_idx = sh->pd_idx, i; 2379 + int rcw = 0, pd_idx = sh->pd_idx, i; 2528 2380 int qd_idx = sh->qd_idx; 2381 + 2382 + set_bit(STRIPE_HANDLE, &sh->state); 2529 2383 for (i = disks; i--; ) { 2530 2384 struct r5dev *dev = &sh->dev[i]; 2531 - /* Would I have to read this buffer for reconstruct_write */ 2532 - if (!test_bit(R5_OVERWRITE, &dev->flags) 2533 - && i != pd_idx && i != qd_idx 2534 - && (!test_bit(R5_LOCKED, &dev->flags) 2535 - ) && 2536 - !test_bit(R5_UPTODATE, &dev->flags)) { 2537 - if (test_bit(R5_Insync, &dev->flags)) rcw++; 2538 - else { 2539 - pr_debug("raid6: must_compute: " 2540 - "disk %d flags=%#lx\n", i, dev->flags); 2541 - must_compute++; 2385 + /* check if we haven't enough data */ 2386 + if (!test_bit(R5_OVERWRITE, &dev->flags) && 2387 + i != pd_idx && i != qd_idx && 2388 + !test_bit(R5_LOCKED, &dev->flags) && 2389 + !(test_bit(R5_UPTODATE, &dev->flags) || 2390 + test_bit(R5_Wantcompute, &dev->flags))) { 2391 + rcw++; 2392 + if (!test_bit(R5_Insync, &dev->flags)) 2393 + continue; /* it's a failed drive */ 2394 + 2395 + if ( 2396 + test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) { 2397 + pr_debug("Read_old stripe %llu " 2398 + "block %d for Reconstruct\n", 2399 + (unsigned long long)sh->sector, i); 2400 + set_bit(R5_LOCKED, &dev->flags); 2401 + set_bit(R5_Wantread, &dev->flags); 2402 + s->locked++; 2403 + } else { 2404 + pr_debug("Request delayed stripe %llu " 2405 + "block %d for Reconstruct\n", 2406 + (unsigned long long)sh->sector, i); 2407 + set_bit(STRIPE_DELAYED, &sh->state); 2408 + set_bit(STRIPE_HANDLE, &sh->state); 2542 2409 } 2543 2410 } 2544 2411 } 2545 - pr_debug("for sector %llu, rcw=%d, must_compute=%d\n", 2546 - (unsigned long long)sh->sector, rcw, must_compute); 2547 - set_bit(STRIPE_HANDLE, &sh->state); 2548 - 2549 - if (rcw > 0) 2550 - /* want reconstruct write, but need to get some data */ 2551 - for (i = disks; i--; ) { 2552 - struct r5dev *dev = &sh->dev[i]; 2553 - if (!test_bit(R5_OVERWRITE, &dev->flags) 2554 - && !(s->failed == 0 && (i == pd_idx || i == qd_idx)) 2555 - && !test_bit(R5_LOCKED, &dev->flags) && 2556 - !test_bit(R5_UPTODATE, &dev->flags) && 2557 - test_bit(R5_Insync, &dev->flags)) { 2558 - if ( 2559 - test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) { 2560 - pr_debug("Read_old stripe %llu " 2561 - "block %d for Reconstruct\n", 2562 - (unsigned long long)sh->sector, i); 2563 - set_bit(R5_LOCKED, &dev->flags); 2564 - set_bit(R5_Wantread, &dev->flags); 2565 - s->locked++; 2566 - } else { 2567 - pr_debug("Request delayed stripe %llu " 2568 - "block %d for Reconstruct\n", 2569 - (unsigned long long)sh->sector, i); 2570 - set_bit(STRIPE_DELAYED, &sh->state); 2571 - set_bit(STRIPE_HANDLE, &sh->state); 2572 - } 2573 - } 2574 - } 2575 2412 /* now if nothing is locked, and if we have enough data, we can start a 2576 2413 * write request 2577 2414 */ 2578 - if (s->locked == 0 && rcw == 0 && 2415 + if ((s->req_compute || !test_bit(STRIPE_COMPUTE_RUN, &sh->state)) && 2416 + s->locked == 0 && rcw == 0 && 2579 2417 !test_bit(STRIPE_BIT_DELAY, &sh->state)) { 2580 - if (must_compute > 0) { 2581 - /* We have failed blocks and need to compute them */ 2582 - switch (s->failed) { 2583 - case 0: 2584 - BUG(); 2585 - case 1: 2586 - compute_block_1(sh, r6s->failed_num[0], 0); 2587 - break; 2588 - case 2: 2589 - compute_block_2(sh, r6s->failed_num[0], 2590 - r6s->failed_num[1]); 2591 - break; 2592 - default: /* This request should have been failed? */ 2593 - BUG(); 2594 - } 2595 - } 2596 - 2597 - pr_debug("Computing parity for stripe %llu\n", 2598 - (unsigned long long)sh->sector); 2599 - compute_parity6(sh, RECONSTRUCT_WRITE); 2600 - /* now every locked buffer is ready to be written */ 2601 - for (i = disks; i--; ) 2602 - if (test_bit(R5_LOCKED, &sh->dev[i].flags)) { 2603 - pr_debug("Writing stripe %llu block %d\n", 2604 - (unsigned long long)sh->sector, i); 2605 - s->locked++; 2606 - set_bit(R5_Wantwrite, &sh->dev[i].flags); 2607 - } 2608 - if (s->locked == disks) 2609 - if (!test_and_set_bit(STRIPE_FULL_WRITE, &sh->state)) 2610 - atomic_inc(&conf->pending_full_writes); 2611 - /* after a RECONSTRUCT_WRITE, the stripe MUST be in-sync */ 2612 - set_bit(STRIPE_INSYNC, &sh->state); 2613 - 2614 - if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) { 2615 - atomic_dec(&conf->preread_active_stripes); 2616 - if (atomic_read(&conf->preread_active_stripes) < 2617 - IO_THRESHOLD) 2618 - md_wakeup_thread(conf->mddev->thread); 2619 - } 2418 + schedule_reconstruction(sh, s, 1, 0); 2620 2419 } 2621 2420 } 2622 2421 ··· 2622 2527 * we are done. Otherwise update the mismatch count and repair 2623 2528 * parity if !MD_RECOVERY_CHECK 2624 2529 */ 2625 - if (sh->ops.zero_sum_result == 0) 2530 + if ((sh->ops.zero_sum_result & SUM_CHECK_P_RESULT) == 0) 2626 2531 /* parity is correct (on disc, 2627 2532 * not in buffer any more) 2628 2533 */ ··· 2639 2544 set_bit(R5_Wantcompute, 2640 2545 &sh->dev[sh->pd_idx].flags); 2641 2546 sh->ops.target = sh->pd_idx; 2547 + sh->ops.target2 = -1; 2642 2548 s->uptodate++; 2643 2549 } 2644 2550 } ··· 2656 2560 2657 2561 2658 2562 static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh, 2659 - struct stripe_head_state *s, 2660 - struct r6_state *r6s, struct page *tmp_page, 2661 - int disks) 2563 + struct stripe_head_state *s, 2564 + struct r6_state *r6s, int disks) 2662 2565 { 2663 - int update_p = 0, update_q = 0; 2664 - struct r5dev *dev; 2665 2566 int pd_idx = sh->pd_idx; 2666 2567 int qd_idx = sh->qd_idx; 2568 + struct r5dev *dev; 2667 2569 2668 2570 set_bit(STRIPE_HANDLE, &sh->state); 2669 2571 2670 2572 BUG_ON(s->failed > 2); 2671 - BUG_ON(s->uptodate < disks); 2573 + 2672 2574 /* Want to check and possibly repair P and Q. 2673 2575 * However there could be one 'failed' device, in which 2674 2576 * case we can only check one of them, possibly using the 2675 2577 * other to generate missing data 2676 2578 */ 2677 2579 2678 - /* If !tmp_page, we cannot do the calculations, 2679 - * but as we have set STRIPE_HANDLE, we will soon be called 2680 - * by stripe_handle with a tmp_page - just wait until then. 2681 - */ 2682 - if (tmp_page) { 2580 + switch (sh->check_state) { 2581 + case check_state_idle: 2582 + /* start a new check operation if there are < 2 failures */ 2683 2583 if (s->failed == r6s->q_failed) { 2684 - /* The only possible failed device holds 'Q', so it 2584 + /* The only possible failed device holds Q, so it 2685 2585 * makes sense to check P (If anything else were failed, 2686 2586 * we would have used P to recreate it). 2687 2587 */ 2688 - compute_block_1(sh, pd_idx, 1); 2689 - if (!page_is_zero(sh->dev[pd_idx].page)) { 2690 - compute_block_1(sh, pd_idx, 0); 2691 - update_p = 1; 2692 - } 2588 + sh->check_state = check_state_run; 2693 2589 } 2694 2590 if (!r6s->q_failed && s->failed < 2) { 2695 - /* q is not failed, and we didn't use it to generate 2591 + /* Q is not failed, and we didn't use it to generate 2696 2592 * anything, so it makes sense to check it 2697 2593 */ 2698 - memcpy(page_address(tmp_page), 2699 - page_address(sh->dev[qd_idx].page), 2700 - STRIPE_SIZE); 2701 - compute_parity6(sh, UPDATE_PARITY); 2702 - if (memcmp(page_address(tmp_page), 2703 - page_address(sh->dev[qd_idx].page), 2704 - STRIPE_SIZE) != 0) { 2705 - clear_bit(STRIPE_INSYNC, &sh->state); 2706 - update_q = 1; 2707 - } 2594 + if (sh->check_state == check_state_run) 2595 + sh->check_state = check_state_run_pq; 2596 + else 2597 + sh->check_state = check_state_run_q; 2708 2598 } 2709 - if (update_p || update_q) { 2710 - conf->mddev->resync_mismatches += STRIPE_SECTORS; 2711 - if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) 2712 - /* don't try to repair!! */ 2713 - update_p = update_q = 0; 2599 + 2600 + /* discard potentially stale zero_sum_result */ 2601 + sh->ops.zero_sum_result = 0; 2602 + 2603 + if (sh->check_state == check_state_run) { 2604 + /* async_xor_zero_sum destroys the contents of P */ 2605 + clear_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); 2606 + s->uptodate--; 2714 2607 } 2608 + if (sh->check_state >= check_state_run && 2609 + sh->check_state <= check_state_run_pq) { 2610 + /* async_syndrome_zero_sum preserves P and Q, so 2611 + * no need to mark them !uptodate here 2612 + */ 2613 + set_bit(STRIPE_OP_CHECK, &s->ops_request); 2614 + break; 2615 + } 2616 + 2617 + /* we have 2-disk failure */ 2618 + BUG_ON(s->failed != 2); 2619 + /* fall through */ 2620 + case check_state_compute_result: 2621 + sh->check_state = check_state_idle; 2622 + 2623 + /* check that a write has not made the stripe insync */ 2624 + if (test_bit(STRIPE_INSYNC, &sh->state)) 2625 + break; 2715 2626 2716 2627 /* now write out any block on a failed drive, 2717 - * or P or Q if they need it 2628 + * or P or Q if they were recomputed 2718 2629 */ 2719 - 2630 + BUG_ON(s->uptodate < disks - 1); /* We don't need Q to recover */ 2720 2631 if (s->failed == 2) { 2721 2632 dev = &sh->dev[r6s->failed_num[1]]; 2722 2633 s->locked++; ··· 2736 2633 set_bit(R5_LOCKED, &dev->flags); 2737 2634 set_bit(R5_Wantwrite, &dev->flags); 2738 2635 } 2739 - 2740 - if (update_p) { 2636 + if (sh->ops.zero_sum_result & SUM_CHECK_P_RESULT) { 2741 2637 dev = &sh->dev[pd_idx]; 2742 2638 s->locked++; 2743 2639 set_bit(R5_LOCKED, &dev->flags); 2744 2640 set_bit(R5_Wantwrite, &dev->flags); 2745 2641 } 2746 - if (update_q) { 2642 + if (sh->ops.zero_sum_result & SUM_CHECK_Q_RESULT) { 2747 2643 dev = &sh->dev[qd_idx]; 2748 2644 s->locked++; 2749 2645 set_bit(R5_LOCKED, &dev->flags); ··· 2751 2649 clear_bit(STRIPE_DEGRADED, &sh->state); 2752 2650 2753 2651 set_bit(STRIPE_INSYNC, &sh->state); 2652 + break; 2653 + case check_state_run: 2654 + case check_state_run_q: 2655 + case check_state_run_pq: 2656 + break; /* we will be called again upon completion */ 2657 + case check_state_check_result: 2658 + sh->check_state = check_state_idle; 2659 + 2660 + /* handle a successful check operation, if parity is correct 2661 + * we are done. Otherwise update the mismatch count and repair 2662 + * parity if !MD_RECOVERY_CHECK 2663 + */ 2664 + if (sh->ops.zero_sum_result == 0) { 2665 + /* both parities are correct */ 2666 + if (!s->failed) 2667 + set_bit(STRIPE_INSYNC, &sh->state); 2668 + else { 2669 + /* in contrast to the raid5 case we can validate 2670 + * parity, but still have a failure to write 2671 + * back 2672 + */ 2673 + sh->check_state = check_state_compute_result; 2674 + /* Returning at this point means that we may go 2675 + * off and bring p and/or q uptodate again so 2676 + * we make sure to check zero_sum_result again 2677 + * to verify if p or q need writeback 2678 + */ 2679 + } 2680 + } else { 2681 + conf->mddev->resync_mismatches += STRIPE_SECTORS; 2682 + if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) 2683 + /* don't try to repair!! */ 2684 + set_bit(STRIPE_INSYNC, &sh->state); 2685 + else { 2686 + int *target = &sh->ops.target; 2687 + 2688 + sh->ops.target = -1; 2689 + sh->ops.target2 = -1; 2690 + sh->check_state = check_state_compute_run; 2691 + set_bit(STRIPE_COMPUTE_RUN, &sh->state); 2692 + set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request); 2693 + if (sh->ops.zero_sum_result & SUM_CHECK_P_RESULT) { 2694 + set_bit(R5_Wantcompute, 2695 + &sh->dev[pd_idx].flags); 2696 + *target = pd_idx; 2697 + target = &sh->ops.target2; 2698 + s->uptodate++; 2699 + } 2700 + if (sh->ops.zero_sum_result & SUM_CHECK_Q_RESULT) { 2701 + set_bit(R5_Wantcompute, 2702 + &sh->dev[qd_idx].flags); 2703 + *target = qd_idx; 2704 + s->uptodate++; 2705 + } 2706 + } 2707 + } 2708 + break; 2709 + case check_state_compute_run: 2710 + break; 2711 + default: 2712 + printk(KERN_ERR "%s: unknown check_state: %d sector: %llu\n", 2713 + __func__, sh->check_state, 2714 + (unsigned long long) sh->sector); 2715 + BUG(); 2754 2716 } 2755 2717 } 2756 2718 ··· 2832 2666 if (i != sh->pd_idx && i != sh->qd_idx) { 2833 2667 int dd_idx, j; 2834 2668 struct stripe_head *sh2; 2669 + struct async_submit_ctl submit; 2835 2670 2836 2671 sector_t bn = compute_blocknr(sh, i, 1); 2837 2672 sector_t s = raid5_compute_sector(conf, bn, 0, ··· 2852 2685 } 2853 2686 2854 2687 /* place all the copies on one channel */ 2688 + init_async_submit(&submit, 0, tx, NULL, NULL, NULL); 2855 2689 tx = async_memcpy(sh2->dev[dd_idx].page, 2856 - sh->dev[i].page, 0, 0, STRIPE_SIZE, 2857 - ASYNC_TX_DEP_ACK, tx, NULL, NULL); 2690 + sh->dev[i].page, 0, 0, STRIPE_SIZE, 2691 + &submit); 2858 2692 2859 2693 set_bit(R5_Expanded, &sh2->dev[dd_idx].flags); 2860 2694 set_bit(R5_UPTODATE, &sh2->dev[dd_idx].flags); ··· 3142 2974 /* Need to write out all blocks after computing parity */ 3143 2975 sh->disks = conf->raid_disks; 3144 2976 stripe_set_idx(sh->sector, conf, 0, sh); 3145 - schedule_reconstruction5(sh, &s, 1, 1); 2977 + schedule_reconstruction(sh, &s, 1, 1); 3146 2978 } else if (s.expanded && !sh->reconstruct_state && s.locked == 0) { 3147 2979 clear_bit(STRIPE_EXPAND_READY, &sh->state); 3148 2980 atomic_dec(&conf->reshape_stripes); ··· 3162 2994 md_wait_for_blocked_rdev(blocked_rdev, conf->mddev); 3163 2995 3164 2996 if (s.ops_request) 3165 - raid5_run_ops(sh, s.ops_request); 2997 + raid_run_ops(sh, s.ops_request); 3166 2998 3167 2999 ops_run_io(sh, &s); 3168 3000 ··· 3171 3003 return blocked_rdev == NULL; 3172 3004 } 3173 3005 3174 - static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page) 3006 + static bool handle_stripe6(struct stripe_head *sh) 3175 3007 { 3176 3008 raid5_conf_t *conf = sh->raid_conf; 3177 3009 int disks = sh->disks; ··· 3183 3015 mdk_rdev_t *blocked_rdev = NULL; 3184 3016 3185 3017 pr_debug("handling stripe %llu, state=%#lx cnt=%d, " 3186 - "pd_idx=%d, qd_idx=%d\n", 3018 + "pd_idx=%d, qd_idx=%d\n, check:%d, reconstruct:%d\n", 3187 3019 (unsigned long long)sh->sector, sh->state, 3188 - atomic_read(&sh->count), pd_idx, qd_idx); 3020 + atomic_read(&sh->count), pd_idx, qd_idx, 3021 + sh->check_state, sh->reconstruct_state); 3189 3022 memset(&s, 0, sizeof(s)); 3190 3023 3191 3024 spin_lock(&sh->lock); ··· 3206 3037 3207 3038 pr_debug("check %d: state 0x%lx read %p write %p written %p\n", 3208 3039 i, dev->flags, dev->toread, dev->towrite, dev->written); 3209 - /* maybe we can reply to a read */ 3210 - if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread) { 3211 - struct bio *rbi, *rbi2; 3212 - pr_debug("Return read for disc %d\n", i); 3213 - spin_lock_irq(&conf->device_lock); 3214 - rbi = dev->toread; 3215 - dev->toread = NULL; 3216 - if (test_and_clear_bit(R5_Overlap, &dev->flags)) 3217 - wake_up(&conf->wait_for_overlap); 3218 - spin_unlock_irq(&conf->device_lock); 3219 - while (rbi && rbi->bi_sector < dev->sector + STRIPE_SECTORS) { 3220 - copy_data(0, rbi, dev->page, dev->sector); 3221 - rbi2 = r5_next_bio(rbi, dev->sector); 3222 - spin_lock_irq(&conf->device_lock); 3223 - if (!raid5_dec_bi_phys_segments(rbi)) { 3224 - rbi->bi_next = return_bi; 3225 - return_bi = rbi; 3226 - } 3227 - spin_unlock_irq(&conf->device_lock); 3228 - rbi = rbi2; 3229 - } 3230 - } 3040 + /* maybe we can reply to a read 3041 + * 3042 + * new wantfill requests are only permitted while 3043 + * ops_complete_biofill is guaranteed to be inactive 3044 + */ 3045 + if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread && 3046 + !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) 3047 + set_bit(R5_Wantfill, &dev->flags); 3231 3048 3232 3049 /* now count some things */ 3233 3050 if (test_bit(R5_LOCKED, &dev->flags)) s.locked++; 3234 3051 if (test_bit(R5_UPTODATE, &dev->flags)) s.uptodate++; 3052 + if (test_bit(R5_Wantcompute, &dev->flags)) { 3053 + s.compute++; 3054 + BUG_ON(s.compute > 2); 3055 + } 3235 3056 3236 - 3237 - if (dev->toread) 3057 + if (test_bit(R5_Wantfill, &dev->flags)) { 3058 + s.to_fill++; 3059 + } else if (dev->toread) 3238 3060 s.to_read++; 3239 3061 if (dev->towrite) { 3240 3062 s.to_write++; ··· 3264 3104 /* There is nothing for the blocked_rdev to block */ 3265 3105 rdev_dec_pending(blocked_rdev, conf->mddev); 3266 3106 blocked_rdev = NULL; 3107 + } 3108 + 3109 + if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) { 3110 + set_bit(STRIPE_OP_BIOFILL, &s.ops_request); 3111 + set_bit(STRIPE_BIOFILL_RUN, &sh->state); 3267 3112 } 3268 3113 3269 3114 pr_debug("locked=%d uptodate=%d to_read=%d" ··· 3311 3146 * or to load a block that is being partially written. 3312 3147 */ 3313 3148 if (s.to_read || s.non_overwrite || (s.to_write && s.failed) || 3314 - (s.syncing && (s.uptodate < disks)) || s.expanding) 3149 + (s.syncing && (s.uptodate + s.compute < disks)) || s.expanding) 3315 3150 handle_stripe_fill6(sh, &s, &r6s, disks); 3316 3151 3317 - /* now to consider writing and what else, if anything should be read */ 3318 - if (s.to_write) 3152 + /* Now we check to see if any write operations have recently 3153 + * completed 3154 + */ 3155 + if (sh->reconstruct_state == reconstruct_state_drain_result) { 3156 + int qd_idx = sh->qd_idx; 3157 + 3158 + sh->reconstruct_state = reconstruct_state_idle; 3159 + /* All the 'written' buffers and the parity blocks are ready to 3160 + * be written back to disk 3161 + */ 3162 + BUG_ON(!test_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags)); 3163 + BUG_ON(!test_bit(R5_UPTODATE, &sh->dev[qd_idx].flags)); 3164 + for (i = disks; i--; ) { 3165 + dev = &sh->dev[i]; 3166 + if (test_bit(R5_LOCKED, &dev->flags) && 3167 + (i == sh->pd_idx || i == qd_idx || 3168 + dev->written)) { 3169 + pr_debug("Writing block %d\n", i); 3170 + BUG_ON(!test_bit(R5_UPTODATE, &dev->flags)); 3171 + set_bit(R5_Wantwrite, &dev->flags); 3172 + if (!test_bit(R5_Insync, &dev->flags) || 3173 + ((i == sh->pd_idx || i == qd_idx) && 3174 + s.failed == 0)) 3175 + set_bit(STRIPE_INSYNC, &sh->state); 3176 + } 3177 + } 3178 + if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) { 3179 + atomic_dec(&conf->preread_active_stripes); 3180 + if (atomic_read(&conf->preread_active_stripes) < 3181 + IO_THRESHOLD) 3182 + md_wakeup_thread(conf->mddev->thread); 3183 + } 3184 + } 3185 + 3186 + /* Now to consider new write requests and what else, if anything 3187 + * should be read. We do not handle new writes when: 3188 + * 1/ A 'write' operation (copy+gen_syndrome) is already in flight. 3189 + * 2/ A 'check' operation is in flight, as it may clobber the parity 3190 + * block. 3191 + */ 3192 + if (s.to_write && !sh->reconstruct_state && !sh->check_state) 3319 3193 handle_stripe_dirtying6(conf, sh, &s, &r6s, disks); 3320 3194 3321 3195 /* maybe we need to check and possibly fix the parity for this stripe 3322 3196 * Any reads will already have been scheduled, so we just see if enough 3323 - * data is available 3197 + * data is available. The parity check is held off while parity 3198 + * dependent operations are in flight. 3324 3199 */ 3325 - if (s.syncing && s.locked == 0 && !test_bit(STRIPE_INSYNC, &sh->state)) 3326 - handle_parity_checks6(conf, sh, &s, &r6s, tmp_page, disks); 3200 + if (sh->check_state || 3201 + (s.syncing && s.locked == 0 && 3202 + !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && 3203 + !test_bit(STRIPE_INSYNC, &sh->state))) 3204 + handle_parity_checks6(conf, sh, &s, &r6s, disks); 3327 3205 3328 3206 if (s.syncing && s.locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) { 3329 3207 md_done_sync(conf->mddev, STRIPE_SECTORS,1); ··· 3387 3179 set_bit(R5_Wantwrite, &dev->flags); 3388 3180 set_bit(R5_ReWrite, &dev->flags); 3389 3181 set_bit(R5_LOCKED, &dev->flags); 3182 + s.locked++; 3390 3183 } else { 3391 3184 /* let's read it back */ 3392 3185 set_bit(R5_Wantread, &dev->flags); 3393 3186 set_bit(R5_LOCKED, &dev->flags); 3187 + s.locked++; 3394 3188 } 3395 3189 } 3396 3190 } 3397 3191 3398 - if (s.expanded && test_bit(STRIPE_EXPANDING, &sh->state)) { 3192 + /* Finish reconstruct operations initiated by the expansion process */ 3193 + if (sh->reconstruct_state == reconstruct_state_result) { 3194 + sh->reconstruct_state = reconstruct_state_idle; 3195 + clear_bit(STRIPE_EXPANDING, &sh->state); 3196 + for (i = conf->raid_disks; i--; ) { 3197 + set_bit(R5_Wantwrite, &sh->dev[i].flags); 3198 + set_bit(R5_LOCKED, &sh->dev[i].flags); 3199 + s.locked++; 3200 + } 3201 + } 3202 + 3203 + if (s.expanded && test_bit(STRIPE_EXPANDING, &sh->state) && 3204 + !sh->reconstruct_state) { 3399 3205 struct stripe_head *sh2 3400 3206 = get_active_stripe(conf, sh->sector, 1, 1, 1); 3401 3207 if (sh2 && test_bit(STRIPE_EXPAND_SOURCE, &sh2->state)) { ··· 3430 3208 /* Need to write out all blocks after computing P&Q */ 3431 3209 sh->disks = conf->raid_disks; 3432 3210 stripe_set_idx(sh->sector, conf, 0, sh); 3433 - compute_parity6(sh, RECONSTRUCT_WRITE); 3434 - for (i = conf->raid_disks ; i-- ; ) { 3435 - set_bit(R5_LOCKED, &sh->dev[i].flags); 3436 - s.locked++; 3437 - set_bit(R5_Wantwrite, &sh->dev[i].flags); 3438 - } 3439 - clear_bit(STRIPE_EXPANDING, &sh->state); 3440 - } else if (s.expanded) { 3211 + schedule_reconstruction(sh, &s, 1, 1); 3212 + } else if (s.expanded && !sh->reconstruct_state && s.locked == 0) { 3441 3213 clear_bit(STRIPE_EXPAND_READY, &sh->state); 3442 3214 atomic_dec(&conf->reshape_stripes); 3443 3215 wake_up(&conf->wait_for_overlap); ··· 3449 3233 if (unlikely(blocked_rdev)) 3450 3234 md_wait_for_blocked_rdev(blocked_rdev, conf->mddev); 3451 3235 3236 + if (s.ops_request) 3237 + raid_run_ops(sh, s.ops_request); 3238 + 3452 3239 ops_run_io(sh, &s); 3453 3240 3454 3241 return_io(return_bi); ··· 3460 3241 } 3461 3242 3462 3243 /* returns true if the stripe was handled */ 3463 - static bool handle_stripe(struct stripe_head *sh, struct page *tmp_page) 3244 + static bool handle_stripe(struct stripe_head *sh) 3464 3245 { 3465 3246 if (sh->raid_conf->level == 6) 3466 - return handle_stripe6(sh, tmp_page); 3247 + return handle_stripe6(sh); 3467 3248 else 3468 3249 return handle_stripe5(sh); 3469 3250 } 3470 - 3471 - 3472 3251 3473 3252 static void raid5_activate_delayed(raid5_conf_t *conf) 3474 3253 { ··· 4278 4061 spin_unlock(&sh->lock); 4279 4062 4280 4063 /* wait for any blocked device to be handled */ 4281 - while(unlikely(!handle_stripe(sh, NULL))) 4064 + while (unlikely(!handle_stripe(sh))) 4282 4065 ; 4283 4066 release_stripe(sh); 4284 4067 ··· 4335 4118 return handled; 4336 4119 } 4337 4120 4338 - handle_stripe(sh, NULL); 4121 + handle_stripe(sh); 4339 4122 release_stripe(sh); 4340 4123 handled++; 4341 4124 } ··· 4349 4132 return handled; 4350 4133 } 4351 4134 4135 + #ifdef CONFIG_MULTICORE_RAID456 4136 + static void __process_stripe(void *param, async_cookie_t cookie) 4137 + { 4138 + struct stripe_head *sh = param; 4139 + 4140 + handle_stripe(sh); 4141 + release_stripe(sh); 4142 + } 4143 + 4144 + static void process_stripe(struct stripe_head *sh, struct list_head *domain) 4145 + { 4146 + async_schedule_domain(__process_stripe, sh, domain); 4147 + } 4148 + 4149 + static void synchronize_stripe_processing(struct list_head *domain) 4150 + { 4151 + async_synchronize_full_domain(domain); 4152 + } 4153 + #else 4154 + static void process_stripe(struct stripe_head *sh, struct list_head *domain) 4155 + { 4156 + handle_stripe(sh); 4157 + release_stripe(sh); 4158 + cond_resched(); 4159 + } 4160 + 4161 + static void synchronize_stripe_processing(struct list_head *domain) 4162 + { 4163 + } 4164 + #endif 4352 4165 4353 4166 4354 4167 /* ··· 4393 4146 struct stripe_head *sh; 4394 4147 raid5_conf_t *conf = mddev->private; 4395 4148 int handled; 4149 + LIST_HEAD(raid_domain); 4396 4150 4397 4151 pr_debug("+++ raid5d active\n"); 4398 4152 ··· 4430 4182 spin_unlock_irq(&conf->device_lock); 4431 4183 4432 4184 handled++; 4433 - handle_stripe(sh, conf->spare_page); 4434 - release_stripe(sh); 4185 + process_stripe(sh, &raid_domain); 4435 4186 4436 4187 spin_lock_irq(&conf->device_lock); 4437 4188 } ··· 4438 4191 4439 4192 spin_unlock_irq(&conf->device_lock); 4440 4193 4194 + synchronize_stripe_processing(&raid_domain); 4441 4195 async_tx_issue_pending_all(); 4442 4196 unplug_slaves(mddev); 4443 4197 ··· 4571 4323 return sectors * (raid_disks - conf->max_degraded); 4572 4324 } 4573 4325 4326 + static void raid5_free_percpu(raid5_conf_t *conf) 4327 + { 4328 + struct raid5_percpu *percpu; 4329 + unsigned long cpu; 4330 + 4331 + if (!conf->percpu) 4332 + return; 4333 + 4334 + get_online_cpus(); 4335 + for_each_possible_cpu(cpu) { 4336 + percpu = per_cpu_ptr(conf->percpu, cpu); 4337 + safe_put_page(percpu->spare_page); 4338 + kfree(percpu->scribble); 4339 + } 4340 + #ifdef CONFIG_HOTPLUG_CPU 4341 + unregister_cpu_notifier(&conf->cpu_notify); 4342 + #endif 4343 + put_online_cpus(); 4344 + 4345 + free_percpu(conf->percpu); 4346 + } 4347 + 4574 4348 static void free_conf(raid5_conf_t *conf) 4575 4349 { 4576 4350 shrink_stripes(conf); 4577 - safe_put_page(conf->spare_page); 4351 + raid5_free_percpu(conf); 4578 4352 kfree(conf->disks); 4579 4353 kfree(conf->stripe_hashtbl); 4580 4354 kfree(conf); 4355 + } 4356 + 4357 + #ifdef CONFIG_HOTPLUG_CPU 4358 + static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action, 4359 + void *hcpu) 4360 + { 4361 + raid5_conf_t *conf = container_of(nfb, raid5_conf_t, cpu_notify); 4362 + long cpu = (long)hcpu; 4363 + struct raid5_percpu *percpu = per_cpu_ptr(conf->percpu, cpu); 4364 + 4365 + switch (action) { 4366 + case CPU_UP_PREPARE: 4367 + case CPU_UP_PREPARE_FROZEN: 4368 + if (conf->level == 6 && !percpu->spare_page) 4369 + percpu->spare_page = alloc_page(GFP_KERNEL); 4370 + if (!percpu->scribble) 4371 + percpu->scribble = kmalloc(conf->scribble_len, GFP_KERNEL); 4372 + 4373 + if (!percpu->scribble || 4374 + (conf->level == 6 && !percpu->spare_page)) { 4375 + safe_put_page(percpu->spare_page); 4376 + kfree(percpu->scribble); 4377 + pr_err("%s: failed memory allocation for cpu%ld\n", 4378 + __func__, cpu); 4379 + return NOTIFY_BAD; 4380 + } 4381 + break; 4382 + case CPU_DEAD: 4383 + case CPU_DEAD_FROZEN: 4384 + safe_put_page(percpu->spare_page); 4385 + kfree(percpu->scribble); 4386 + percpu->spare_page = NULL; 4387 + percpu->scribble = NULL; 4388 + break; 4389 + default: 4390 + break; 4391 + } 4392 + return NOTIFY_OK; 4393 + } 4394 + #endif 4395 + 4396 + static int raid5_alloc_percpu(raid5_conf_t *conf) 4397 + { 4398 + unsigned long cpu; 4399 + struct page *spare_page; 4400 + struct raid5_percpu *allcpus; 4401 + void *scribble; 4402 + int err; 4403 + 4404 + allcpus = alloc_percpu(struct raid5_percpu); 4405 + if (!allcpus) 4406 + return -ENOMEM; 4407 + conf->percpu = allcpus; 4408 + 4409 + get_online_cpus(); 4410 + err = 0; 4411 + for_each_present_cpu(cpu) { 4412 + if (conf->level == 6) { 4413 + spare_page = alloc_page(GFP_KERNEL); 4414 + if (!spare_page) { 4415 + err = -ENOMEM; 4416 + break; 4417 + } 4418 + per_cpu_ptr(conf->percpu, cpu)->spare_page = spare_page; 4419 + } 4420 + scribble = kmalloc(scribble_len(conf->raid_disks), GFP_KERNEL); 4421 + if (!scribble) { 4422 + err = -ENOMEM; 4423 + break; 4424 + } 4425 + per_cpu_ptr(conf->percpu, cpu)->scribble = scribble; 4426 + } 4427 + #ifdef CONFIG_HOTPLUG_CPU 4428 + conf->cpu_notify.notifier_call = raid456_cpu_notify; 4429 + conf->cpu_notify.priority = 0; 4430 + if (err == 0) 4431 + err = register_cpu_notifier(&conf->cpu_notify); 4432 + #endif 4433 + put_online_cpus(); 4434 + 4435 + return err; 4581 4436 } 4582 4437 4583 4438 static raid5_conf_t *setup_conf(mddev_t *mddev) ··· 4724 4373 goto abort; 4725 4374 4726 4375 conf->raid_disks = mddev->raid_disks; 4376 + conf->scribble_len = scribble_len(conf->raid_disks); 4727 4377 if (mddev->reshape_position == MaxSector) 4728 4378 conf->previous_raid_disks = mddev->raid_disks; 4729 4379 else ··· 4740 4388 if ((conf->stripe_hashtbl = kzalloc(PAGE_SIZE, GFP_KERNEL)) == NULL) 4741 4389 goto abort; 4742 4390 4743 - if (mddev->new_level == 6) { 4744 - conf->spare_page = alloc_page(GFP_KERNEL); 4745 - if (!conf->spare_page) 4746 - goto abort; 4747 - } 4391 + conf->level = mddev->new_level; 4392 + if (raid5_alloc_percpu(conf) != 0) 4393 + goto abort; 4394 + 4748 4395 spin_lock_init(&conf->device_lock); 4749 4396 init_waitqueue_head(&conf->wait_for_stripe); 4750 4397 init_waitqueue_head(&conf->wait_for_overlap);
+22 -6
drivers/md/raid5.h
··· 2 2 #define _RAID5_H 3 3 4 4 #include <linux/raid/xor.h> 5 + #include <linux/dmaengine.h> 5 6 6 7 /* 7 8 * ··· 176 175 */ 177 176 enum check_states { 178 177 check_state_idle = 0, 179 - check_state_run, /* parity check */ 178 + check_state_run, /* xor parity check */ 179 + check_state_run_q, /* q-parity check */ 180 + check_state_run_pq, /* pq dual parity check */ 180 181 check_state_check_result, 181 182 check_state_compute_run, /* parity repair */ 182 183 check_state_compute_result, ··· 218 215 * @target - STRIPE_OP_COMPUTE_BLK target 219 216 */ 220 217 struct stripe_operations { 221 - int target; 222 - u32 zero_sum_result; 218 + int target, target2; 219 + enum sum_check_flags zero_sum_result; 223 220 } ops; 224 221 struct r5dev { 225 222 struct bio req; ··· 301 298 #define STRIPE_OP_COMPUTE_BLK 1 302 299 #define STRIPE_OP_PREXOR 2 303 300 #define STRIPE_OP_BIODRAIN 3 304 - #define STRIPE_OP_POSTXOR 4 301 + #define STRIPE_OP_RECONSTRUCT 4 305 302 #define STRIPE_OP_CHECK 5 306 303 307 304 /* ··· 388 385 * (fresh device added). 389 386 * Cleared when a sync completes. 390 387 */ 391 - 392 - struct page *spare_page; /* Used when checking P/Q in raid6 */ 388 + /* per cpu variables */ 389 + struct raid5_percpu { 390 + struct page *spare_page; /* Used when checking P/Q in raid6 */ 391 + void *scribble; /* space for constructing buffer 392 + * lists and performing address 393 + * conversions 394 + */ 395 + } *percpu; 396 + size_t scribble_len; /* size of scribble region must be 397 + * associated with conf to handle 398 + * cpu hotplug while reshaping 399 + */ 400 + #ifdef CONFIG_HOTPLUG_CPU 401 + struct notifier_block cpu_notify; 402 + #endif 393 403 394 404 /* 395 405 * Free stripes pool
+8 -1
drivers/mmc/host/atmel-mci.c
··· 576 576 struct scatterlist *sg; 577 577 unsigned int i; 578 578 enum dma_data_direction direction; 579 + unsigned int sglen; 579 580 580 581 /* 581 582 * We don't do DMA on "complex" transfers, i.e. with ··· 606 605 else 607 606 direction = DMA_TO_DEVICE; 608 607 608 + sglen = dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, direction); 609 + if (sglen != data->sg_len) 610 + goto unmap_exit; 609 611 desc = chan->device->device_prep_slave_sg(chan, 610 612 data->sg, data->sg_len, direction, 611 613 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 612 614 if (!desc) 613 - return -ENOMEM; 615 + goto unmap_exit; 614 616 615 617 host->dma.data_desc = desc; 616 618 desc->callback = atmci_dma_complete; ··· 624 620 chan->device->device_issue_pending(chan); 625 621 626 622 return 0; 623 + unmap_exit: 624 + dma_unmap_sg(&host->pdev->dev, data->sg, sglen, direction); 625 + return -ENOMEM; 627 626 } 628 627 629 628 #else /* CONFIG_MMC_ATMELMCI_DMA */
+97 -32
include/linux/async_tx.h
··· 58 58 * array. 59 59 * @ASYNC_TX_ACK: immediately ack the descriptor, precludes setting up a 60 60 * dependency chain 61 - * @ASYNC_TX_DEP_ACK: ack the dependency descriptor. Useful for chaining. 61 + * @ASYNC_TX_FENCE: specify that the next operation in the dependency 62 + * chain uses this operation's result as an input 62 63 */ 63 64 enum async_tx_flags { 64 65 ASYNC_TX_XOR_ZERO_DST = (1 << 0), 65 66 ASYNC_TX_XOR_DROP_DST = (1 << 1), 66 - ASYNC_TX_ACK = (1 << 3), 67 - ASYNC_TX_DEP_ACK = (1 << 4), 67 + ASYNC_TX_ACK = (1 << 2), 68 + ASYNC_TX_FENCE = (1 << 3), 69 + }; 70 + 71 + /** 72 + * struct async_submit_ctl - async_tx submission/completion modifiers 73 + * @flags: submission modifiers 74 + * @depend_tx: parent dependency of the current operation being submitted 75 + * @cb_fn: callback routine to run at operation completion 76 + * @cb_param: parameter for the callback routine 77 + * @scribble: caller provided space for dma/page address conversions 78 + */ 79 + struct async_submit_ctl { 80 + enum async_tx_flags flags; 81 + struct dma_async_tx_descriptor *depend_tx; 82 + dma_async_tx_callback cb_fn; 83 + void *cb_param; 84 + void *scribble; 68 85 }; 69 86 70 87 #ifdef CONFIG_DMA_ENGINE 71 88 #define async_tx_issue_pending_all dma_issue_pending_all 89 + 90 + /** 91 + * async_tx_issue_pending - send pending descriptor to the hardware channel 92 + * @tx: descriptor handle to retrieve hardware context 93 + * 94 + * Note: any dependent operations will have already been issued by 95 + * async_tx_channel_switch, or (in the case of no channel switch) will 96 + * be already pending on this channel. 97 + */ 98 + static inline void async_tx_issue_pending(struct dma_async_tx_descriptor *tx) 99 + { 100 + if (likely(tx)) { 101 + struct dma_chan *chan = tx->chan; 102 + struct dma_device *dma = chan->device; 103 + 104 + dma->device_issue_pending(chan); 105 + } 106 + } 72 107 #ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL 73 108 #include <asm/async_tx.h> 74 109 #else 75 110 #define async_tx_find_channel(dep, type, dst, dst_count, src, src_count, len) \ 76 111 __async_tx_find_channel(dep, type) 77 112 struct dma_chan * 78 - __async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, 79 - enum dma_transaction_type tx_type); 113 + __async_tx_find_channel(struct async_submit_ctl *submit, 114 + enum dma_transaction_type tx_type); 80 115 #endif /* CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL */ 81 116 #else 82 117 static inline void async_tx_issue_pending_all(void) ··· 119 84 do { } while (0); 120 85 } 121 86 87 + static inline void async_tx_issue_pending(struct dma_async_tx_descriptor *tx) 88 + { 89 + do { } while (0); 90 + } 91 + 122 92 static inline struct dma_chan * 123 - async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, 124 - enum dma_transaction_type tx_type, struct page **dst, int dst_count, 125 - struct page **src, int src_count, size_t len) 93 + async_tx_find_channel(struct async_submit_ctl *submit, 94 + enum dma_transaction_type tx_type, struct page **dst, 95 + int dst_count, struct page **src, int src_count, 96 + size_t len) 126 97 { 127 98 return NULL; 128 99 } ··· 140 99 * @cb_fn_param: parameter to pass to the callback routine 141 100 */ 142 101 static inline void 143 - async_tx_sync_epilog(dma_async_tx_callback cb_fn, void *cb_fn_param) 102 + async_tx_sync_epilog(struct async_submit_ctl *submit) 144 103 { 145 - if (cb_fn) 146 - cb_fn(cb_fn_param); 104 + if (submit->cb_fn) 105 + submit->cb_fn(submit->cb_param); 147 106 } 148 107 149 - void 150 - async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx, 151 - enum async_tx_flags flags, struct dma_async_tx_descriptor *depend_tx, 152 - dma_async_tx_callback cb_fn, void *cb_fn_param); 108 + typedef union { 109 + unsigned long addr; 110 + struct page *page; 111 + dma_addr_t dma; 112 + } addr_conv_t; 113 + 114 + static inline void 115 + init_async_submit(struct async_submit_ctl *args, enum async_tx_flags flags, 116 + struct dma_async_tx_descriptor *tx, 117 + dma_async_tx_callback cb_fn, void *cb_param, 118 + addr_conv_t *scribble) 119 + { 120 + args->flags = flags; 121 + args->depend_tx = tx; 122 + args->cb_fn = cb_fn; 123 + args->cb_param = cb_param; 124 + args->scribble = scribble; 125 + } 126 + 127 + void async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx, 128 + struct async_submit_ctl *submit); 153 129 154 130 struct dma_async_tx_descriptor * 155 131 async_xor(struct page *dest, struct page **src_list, unsigned int offset, 156 - int src_cnt, size_t len, enum async_tx_flags flags, 157 - struct dma_async_tx_descriptor *depend_tx, 158 - dma_async_tx_callback cb_fn, void *cb_fn_param); 132 + int src_cnt, size_t len, struct async_submit_ctl *submit); 159 133 160 134 struct dma_async_tx_descriptor * 161 - async_xor_zero_sum(struct page *dest, struct page **src_list, 162 - unsigned int offset, int src_cnt, size_t len, 163 - u32 *result, enum async_tx_flags flags, 164 - struct dma_async_tx_descriptor *depend_tx, 165 - dma_async_tx_callback cb_fn, void *cb_fn_param); 135 + async_xor_val(struct page *dest, struct page **src_list, unsigned int offset, 136 + int src_cnt, size_t len, enum sum_check_flags *result, 137 + struct async_submit_ctl *submit); 166 138 167 139 struct dma_async_tx_descriptor * 168 140 async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset, 169 - unsigned int src_offset, size_t len, enum async_tx_flags flags, 170 - struct dma_async_tx_descriptor *depend_tx, 171 - dma_async_tx_callback cb_fn, void *cb_fn_param); 141 + unsigned int src_offset, size_t len, 142 + struct async_submit_ctl *submit); 172 143 173 144 struct dma_async_tx_descriptor * 174 145 async_memset(struct page *dest, int val, unsigned int offset, 175 - size_t len, enum async_tx_flags flags, 176 - struct dma_async_tx_descriptor *depend_tx, 177 - dma_async_tx_callback cb_fn, void *cb_fn_param); 146 + size_t len, struct async_submit_ctl *submit); 147 + 148 + struct dma_async_tx_descriptor *async_trigger_callback(struct async_submit_ctl *submit); 178 149 179 150 struct dma_async_tx_descriptor * 180 - async_trigger_callback(enum async_tx_flags flags, 181 - struct dma_async_tx_descriptor *depend_tx, 182 - dma_async_tx_callback cb_fn, void *cb_fn_param); 151 + async_gen_syndrome(struct page **blocks, unsigned int offset, int src_cnt, 152 + size_t len, struct async_submit_ctl *submit); 153 + 154 + struct dma_async_tx_descriptor * 155 + async_syndrome_val(struct page **blocks, unsigned int offset, int src_cnt, 156 + size_t len, enum sum_check_flags *pqres, struct page *spare, 157 + struct async_submit_ctl *submit); 158 + 159 + struct dma_async_tx_descriptor * 160 + async_raid6_2data_recov(int src_num, size_t bytes, int faila, int failb, 161 + struct page **ptrs, struct async_submit_ctl *submit); 162 + 163 + struct dma_async_tx_descriptor * 164 + async_raid6_datap_recov(int src_num, size_t bytes, int faila, 165 + struct page **ptrs, struct async_submit_ctl *submit); 183 166 184 167 void async_tx_quiesce(struct dma_async_tx_descriptor **tx); 185 168 #endif /* _ASYNC_TX_H_ */
+10 -1
include/linux/dca.h
··· 20 20 */ 21 21 #ifndef DCA_H 22 22 #define DCA_H 23 + 24 + #include <linux/pci.h> 25 + 23 26 /* DCA Provider API */ 24 27 25 28 /* DCA Notifier Interface */ ··· 39 36 int id; 40 37 }; 41 38 39 + struct dca_domain { 40 + struct list_head node; 41 + struct list_head dca_providers; 42 + struct pci_bus *pci_rc; 43 + }; 44 + 42 45 struct dca_ops { 43 46 int (*add_requester) (struct dca_provider *, struct device *); 44 47 int (*remove_requester) (struct dca_provider *, struct device *); ··· 56 47 struct dca_provider *alloc_dca_provider(struct dca_ops *ops, int priv_size); 57 48 void free_dca_provider(struct dca_provider *dca); 58 49 int register_dca_provider(struct dca_provider *dca, struct device *dev); 59 - void unregister_dca_provider(struct dca_provider *dca); 50 + void unregister_dca_provider(struct dca_provider *dca, struct device *dev); 60 51 61 52 static inline void *dca_priv(struct dca_provider *dca) 62 53 {
+161 -18
include/linux/dmaengine.h
··· 48 48 49 49 /** 50 50 * enum dma_transaction_type - DMA transaction types/indexes 51 + * 52 + * Note: The DMA_ASYNC_TX capability is not to be set by drivers. It is 53 + * automatically set as dma devices are registered. 51 54 */ 52 55 enum dma_transaction_type { 53 56 DMA_MEMCPY, 54 57 DMA_XOR, 55 - DMA_PQ_XOR, 56 - DMA_DUAL_XOR, 57 - DMA_PQ_UPDATE, 58 - DMA_ZERO_SUM, 59 - DMA_PQ_ZERO_SUM, 58 + DMA_PQ, 59 + DMA_XOR_VAL, 60 + DMA_PQ_VAL, 60 61 DMA_MEMSET, 61 - DMA_MEMCPY_CRC32C, 62 62 DMA_INTERRUPT, 63 63 DMA_PRIVATE, 64 + DMA_ASYNC_TX, 64 65 DMA_SLAVE, 65 66 }; 66 67 ··· 71 70 72 71 /** 73 72 * enum dma_ctrl_flags - DMA flags to augment operation preparation, 74 - * control completion, and communicate status. 73 + * control completion, and communicate status. 75 74 * @DMA_PREP_INTERRUPT - trigger an interrupt (callback) upon completion of 76 - * this transaction 75 + * this transaction 77 76 * @DMA_CTRL_ACK - the descriptor cannot be reused until the client 78 - * acknowledges receipt, i.e. has has a chance to establish any 79 - * dependency chains 77 + * acknowledges receipt, i.e. has has a chance to establish any dependency 78 + * chains 80 79 * @DMA_COMPL_SKIP_SRC_UNMAP - set to disable dma-unmapping the source buffer(s) 81 80 * @DMA_COMPL_SKIP_DEST_UNMAP - set to disable dma-unmapping the destination(s) 82 81 * @DMA_COMPL_SRC_UNMAP_SINGLE - set to do the source dma-unmapping as single 83 82 * (if not set, do the source dma-unmapping as page) 84 83 * @DMA_COMPL_DEST_UNMAP_SINGLE - set to do the destination dma-unmapping as single 85 84 * (if not set, do the destination dma-unmapping as page) 85 + * @DMA_PREP_PQ_DISABLE_P - prevent generation of P while generating Q 86 + * @DMA_PREP_PQ_DISABLE_Q - prevent generation of Q while generating P 87 + * @DMA_PREP_CONTINUE - indicate to a driver that it is reusing buffers as 88 + * sources that were the result of a previous operation, in the case of a PQ 89 + * operation it continues the calculation with new sources 90 + * @DMA_PREP_FENCE - tell the driver that subsequent operations depend 91 + * on the result of this operation 86 92 */ 87 93 enum dma_ctrl_flags { 88 94 DMA_PREP_INTERRUPT = (1 << 0), ··· 98 90 DMA_COMPL_SKIP_DEST_UNMAP = (1 << 3), 99 91 DMA_COMPL_SRC_UNMAP_SINGLE = (1 << 4), 100 92 DMA_COMPL_DEST_UNMAP_SINGLE = (1 << 5), 93 + DMA_PREP_PQ_DISABLE_P = (1 << 6), 94 + DMA_PREP_PQ_DISABLE_Q = (1 << 7), 95 + DMA_PREP_CONTINUE = (1 << 8), 96 + DMA_PREP_FENCE = (1 << 9), 101 97 }; 98 + 99 + /** 100 + * enum sum_check_bits - bit position of pq_check_flags 101 + */ 102 + enum sum_check_bits { 103 + SUM_CHECK_P = 0, 104 + SUM_CHECK_Q = 1, 105 + }; 106 + 107 + /** 108 + * enum pq_check_flags - result of async_{xor,pq}_zero_sum operations 109 + * @SUM_CHECK_P_RESULT - 1 if xor zero sum error, 0 otherwise 110 + * @SUM_CHECK_Q_RESULT - 1 if reed-solomon zero sum error, 0 otherwise 111 + */ 112 + enum sum_check_flags { 113 + SUM_CHECK_P_RESULT = (1 << SUM_CHECK_P), 114 + SUM_CHECK_Q_RESULT = (1 << SUM_CHECK_Q), 115 + }; 116 + 102 117 103 118 /** 104 119 * dma_cap_mask_t - capabilities bitmap modeled after cpumask_t. ··· 211 180 * @flags: flags to augment operation preparation, control completion, and 212 181 * communicate status 213 182 * @phys: physical address of the descriptor 214 - * @tx_list: driver common field for operations that require multiple 215 - * descriptors 216 183 * @chan: target channel for this operation 217 184 * @tx_submit: set the prepared descriptor(s) to be executed by the engine 218 185 * @callback: routine to call after this operation is complete ··· 224 195 dma_cookie_t cookie; 225 196 enum dma_ctrl_flags flags; /* not a 'long' to pack with cookie */ 226 197 dma_addr_t phys; 227 - struct list_head tx_list; 228 198 struct dma_chan *chan; 229 199 dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx); 230 200 dma_async_tx_callback callback; ··· 241 213 * @global_node: list_head for global dma_device_list 242 214 * @cap_mask: one or more dma_capability flags 243 215 * @max_xor: maximum number of xor sources, 0 if no capability 216 + * @max_pq: maximum number of PQ sources and PQ-continue capability 217 + * @copy_align: alignment shift for memcpy operations 218 + * @xor_align: alignment shift for xor operations 219 + * @pq_align: alignment shift for pq operations 220 + * @fill_align: alignment shift for memset operations 244 221 * @dev_id: unique device ID 245 222 * @dev: struct device reference for dma mapping api 246 223 * @device_alloc_chan_resources: allocate resources and return the ··· 253 220 * @device_free_chan_resources: release DMA channel's resources 254 221 * @device_prep_dma_memcpy: prepares a memcpy operation 255 222 * @device_prep_dma_xor: prepares a xor operation 256 - * @device_prep_dma_zero_sum: prepares a zero_sum operation 223 + * @device_prep_dma_xor_val: prepares a xor validation operation 224 + * @device_prep_dma_pq: prepares a pq operation 225 + * @device_prep_dma_pq_val: prepares a pqzero_sum operation 257 226 * @device_prep_dma_memset: prepares a memset operation 258 227 * @device_prep_dma_interrupt: prepares an end of chain interrupt operation 259 228 * @device_prep_slave_sg: prepares a slave dma operation ··· 270 235 struct list_head channels; 271 236 struct list_head global_node; 272 237 dma_cap_mask_t cap_mask; 273 - int max_xor; 238 + unsigned short max_xor; 239 + unsigned short max_pq; 240 + u8 copy_align; 241 + u8 xor_align; 242 + u8 pq_align; 243 + u8 fill_align; 244 + #define DMA_HAS_PQ_CONTINUE (1 << 15) 274 245 275 246 int dev_id; 276 247 struct device *dev; ··· 290 249 struct dma_async_tx_descriptor *(*device_prep_dma_xor)( 291 250 struct dma_chan *chan, dma_addr_t dest, dma_addr_t *src, 292 251 unsigned int src_cnt, size_t len, unsigned long flags); 293 - struct dma_async_tx_descriptor *(*device_prep_dma_zero_sum)( 252 + struct dma_async_tx_descriptor *(*device_prep_dma_xor_val)( 294 253 struct dma_chan *chan, dma_addr_t *src, unsigned int src_cnt, 295 - size_t len, u32 *result, unsigned long flags); 254 + size_t len, enum sum_check_flags *result, unsigned long flags); 255 + struct dma_async_tx_descriptor *(*device_prep_dma_pq)( 256 + struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src, 257 + unsigned int src_cnt, const unsigned char *scf, 258 + size_t len, unsigned long flags); 259 + struct dma_async_tx_descriptor *(*device_prep_dma_pq_val)( 260 + struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src, 261 + unsigned int src_cnt, const unsigned char *scf, size_t len, 262 + enum sum_check_flags *pqres, unsigned long flags); 296 263 struct dma_async_tx_descriptor *(*device_prep_dma_memset)( 297 264 struct dma_chan *chan, dma_addr_t dest, int value, size_t len, 298 265 unsigned long flags); ··· 318 269 dma_cookie_t *used); 319 270 void (*device_issue_pending)(struct dma_chan *chan); 320 271 }; 272 + 273 + static inline bool dmaengine_check_align(u8 align, size_t off1, size_t off2, size_t len) 274 + { 275 + size_t mask; 276 + 277 + if (!align) 278 + return true; 279 + mask = (1 << align) - 1; 280 + if (mask & (off1 | off2 | len)) 281 + return false; 282 + return true; 283 + } 284 + 285 + static inline bool is_dma_copy_aligned(struct dma_device *dev, size_t off1, 286 + size_t off2, size_t len) 287 + { 288 + return dmaengine_check_align(dev->copy_align, off1, off2, len); 289 + } 290 + 291 + static inline bool is_dma_xor_aligned(struct dma_device *dev, size_t off1, 292 + size_t off2, size_t len) 293 + { 294 + return dmaengine_check_align(dev->xor_align, off1, off2, len); 295 + } 296 + 297 + static inline bool is_dma_pq_aligned(struct dma_device *dev, size_t off1, 298 + size_t off2, size_t len) 299 + { 300 + return dmaengine_check_align(dev->pq_align, off1, off2, len); 301 + } 302 + 303 + static inline bool is_dma_fill_aligned(struct dma_device *dev, size_t off1, 304 + size_t off2, size_t len) 305 + { 306 + return dmaengine_check_align(dev->fill_align, off1, off2, len); 307 + } 308 + 309 + static inline void 310 + dma_set_maxpq(struct dma_device *dma, int maxpq, int has_pq_continue) 311 + { 312 + dma->max_pq = maxpq; 313 + if (has_pq_continue) 314 + dma->max_pq |= DMA_HAS_PQ_CONTINUE; 315 + } 316 + 317 + static inline bool dmaf_continue(enum dma_ctrl_flags flags) 318 + { 319 + return (flags & DMA_PREP_CONTINUE) == DMA_PREP_CONTINUE; 320 + } 321 + 322 + static inline bool dmaf_p_disabled_continue(enum dma_ctrl_flags flags) 323 + { 324 + enum dma_ctrl_flags mask = DMA_PREP_CONTINUE | DMA_PREP_PQ_DISABLE_P; 325 + 326 + return (flags & mask) == mask; 327 + } 328 + 329 + static inline bool dma_dev_has_pq_continue(struct dma_device *dma) 330 + { 331 + return (dma->max_pq & DMA_HAS_PQ_CONTINUE) == DMA_HAS_PQ_CONTINUE; 332 + } 333 + 334 + static unsigned short dma_dev_to_maxpq(struct dma_device *dma) 335 + { 336 + return dma->max_pq & ~DMA_HAS_PQ_CONTINUE; 337 + } 338 + 339 + /* dma_maxpq - reduce maxpq in the face of continued operations 340 + * @dma - dma device with PQ capability 341 + * @flags - to check if DMA_PREP_CONTINUE and DMA_PREP_PQ_DISABLE_P are set 342 + * 343 + * When an engine does not support native continuation we need 3 extra 344 + * source slots to reuse P and Q with the following coefficients: 345 + * 1/ {00} * P : remove P from Q', but use it as a source for P' 346 + * 2/ {01} * Q : use Q to continue Q' calculation 347 + * 3/ {00} * Q : subtract Q from P' to cancel (2) 348 + * 349 + * In the case where P is disabled we only need 1 extra source: 350 + * 1/ {01} * Q : use Q to continue Q' calculation 351 + */ 352 + static inline int dma_maxpq(struct dma_device *dma, enum dma_ctrl_flags flags) 353 + { 354 + if (dma_dev_has_pq_continue(dma) || !dmaf_continue(flags)) 355 + return dma_dev_to_maxpq(dma); 356 + else if (dmaf_p_disabled_continue(flags)) 357 + return dma_dev_to_maxpq(dma) - 1; 358 + else if (dmaf_continue(flags)) 359 + return dma_dev_to_maxpq(dma) - 3; 360 + BUG(); 361 + } 321 362 322 363 /* --- public DMA engine API --- */ 323 364 ··· 438 299 #ifdef CONFIG_ASYNC_TX_DMA 439 300 #define async_dmaengine_get() dmaengine_get() 440 301 #define async_dmaengine_put() dmaengine_put() 302 + #ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH 303 + #define async_dma_find_channel(type) dma_find_channel(DMA_ASYNC_TX) 304 + #else 441 305 #define async_dma_find_channel(type) dma_find_channel(type) 306 + #endif /* CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH */ 442 307 #else 443 308 static inline void async_dmaengine_get(void) 444 309 { ··· 455 312 { 456 313 return NULL; 457 314 } 458 - #endif 315 + #endif /* CONFIG_ASYNC_TX_DMA */ 459 316 460 317 dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan, 461 318 void *dest, void *src, size_t len);
+10
include/linux/pci_ids.h
··· 2526 2526 #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e 2527 2527 #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b 2528 2528 #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c 2529 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 2530 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF1 0x3711 2531 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF2 0x3712 2532 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF3 0x3713 2533 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF4 0x3714 2534 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF5 0x3715 2535 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF6 0x3716 2536 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF7 0x3717 2537 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF8 0x3718 2538 + #define PCI_DEVICE_ID_INTEL_IOAT_JSF9 0x3719 2529 2539 #define PCI_DEVICE_ID_INTEL_ICH10_0 0x3a14 2530 2540 #define PCI_DEVICE_ID_INTEL_ICH10_1 0x3a16 2531 2541 #define PCI_DEVICE_ID_INTEL_ICH10_2 0x3a18