linux/drivers/dma/iop-adma.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * offload engine driver for the Intel Xscale series of i/o processors
   4 * Copyright © 2006, Intel Corporation.
   5 */
   6
   7/*
   8 * This driver supports the asynchrounous DMA copy and RAID engines available
   9 * on the Intel Xscale(R) family of I/O Processors (IOP 32x, 33x, 134x)
  10 */
  11
  12#include <linux/init.h>
  13#include <linux/module.h>
  14#include <linux/delay.h>
  15#include <linux/dma-mapping.h>
  16#include <linux/spinlock.h>
  17#include <linux/interrupt.h>
  18#include <linux/platform_device.h>
  19#include <linux/prefetch.h>
  20#include <linux/memory.h>
  21#include <linux/ioport.h>
  22#include <linux/raid/pq.h>
  23#include <linux/slab.h>
  24
  25#include "iop-adma.h"
  26#include "dmaengine.h"
  27
  28#define to_iop_adma_chan(chan) container_of(chan, struct iop_adma_chan, common)
  29#define to_iop_adma_device(dev) \
  30        container_of(dev, struct iop_adma_device, common)
  31#define tx_to_iop_adma_slot(tx) \
  32        container_of(tx, struct iop_adma_desc_slot, async_tx)
  33
  34/**
  35 * iop_adma_free_slots - flags descriptor slots for reuse
  36 * @slot: Slot to free
  37 * Caller must hold &iop_chan->lock while calling this function
  38 */
  39static void iop_adma_free_slots(struct iop_adma_desc_slot *slot)
  40{
  41        int stride = slot->slots_per_op;
  42
  43        while (stride--) {
  44                slot->slots_per_op = 0;
  45                slot = list_entry(slot->slot_node.next,
  46                                struct iop_adma_desc_slot,
  47                                slot_node);
  48        }
  49}
  50
  51static dma_cookie_t
  52iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc,
  53        struct iop_adma_chan *iop_chan, dma_cookie_t cookie)
  54{
  55        struct dma_async_tx_descriptor *tx = &desc->async_tx;
  56
  57        BUG_ON(tx->cookie < 0);
  58        if (tx->cookie > 0) {
  59                cookie = tx->cookie;
  60                tx->cookie = 0;
  61
  62                /* call the callback (must not sleep or submit new
  63                 * operations to this channel)
  64                 */
  65                dmaengine_desc_get_callback_invoke(tx, NULL);
  66
  67                dma_descriptor_unmap(tx);
  68                if (desc->group_head)
  69                        desc->group_head = NULL;
  70        }
  71
  72        /* run dependent operations */
  73        dma_run_dependencies(tx);
  74
  75        return cookie;
  76}
  77
  78static int
  79iop_adma_clean_slot(struct iop_adma_desc_slot *desc,
  80        struct iop_adma_chan *iop_chan)
  81{
  82        /* the client is allowed to attach dependent operations
  83         * until 'ack' is set
  84         */
  85        if (!async_tx_test_ack(&desc->async_tx))
  86                return 0;
  87
  88        /* leave the last descriptor in the chain
  89         * so we can append to it
  90         */
  91        if (desc->chain_node.next == &iop_chan->chain)
  92                return 1;
  93
  94        dev_dbg(iop_chan->device->common.dev,
  95                "\tfree slot: %d slots_per_op: %d\n",
  96                desc->idx, desc->slots_per_op);
  97
  98        list_del(&desc->chain_node);
  99        iop_adma_free_slots(desc);
 100
 101        return 0;
 102}
 103
 104static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan)
 105{
 106        struct iop_adma_desc_slot *iter, *_iter, *grp_start = NULL;
 107        dma_cookie_t cookie = 0;
 108        u32 current_desc = iop_chan_get_current_descriptor(iop_chan);
 109        int busy = iop_chan_is_busy(iop_chan);
 110        int seen_current = 0, slot_cnt = 0, slots_per_op = 0;
 111
 112        dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
 113        /* free completed slots from the chain starting with
 114         * the oldest descriptor
 115         */
 116        list_for_each_entry_safe(iter, _iter, &iop_chan->chain,
 117                                        chain_node) {
 118                pr_debug("\tcookie: %d slot: %d busy: %d "
 119                        "this_desc: %pad next_desc: %#llx ack: %d\n",
 120                        iter->async_tx.cookie, iter->idx, busy,
 121                        &iter->async_tx.phys, (u64)iop_desc_get_next_desc(iter),
 122                        async_tx_test_ack(&iter->async_tx));
 123                prefetch(_iter);
 124                prefetch(&_iter->async_tx);
 125
 126                /* do not advance past the current descriptor loaded into the
 127                 * hardware channel, subsequent descriptors are either in
 128                 * process or have not been submitted
 129                 */
 130                if (seen_current)
 131                        break;
 132
 133                /* stop the search if we reach the current descriptor and the
 134                 * channel is busy, or if it appears that the current descriptor
 135                 * needs to be re-read (i.e. has been appended to)
 136                 */
 137                if (iter->async_tx.phys == current_desc) {
 138                        BUG_ON(seen_current++);
 139                        if (busy || iop_desc_get_next_desc(iter))
 140                                break;
 141                }
 142
 143                /* detect the start of a group transaction */
 144                if (!slot_cnt && !slots_per_op) {
 145                        slot_cnt = iter->slot_cnt;
 146                        slots_per_op = iter->slots_per_op;
 147                        if (slot_cnt <= slots_per_op) {
 148                                slot_cnt = 0;
 149                                slots_per_op = 0;
 150                        }
 151                }
 152
 153                if (slot_cnt) {
 154                        pr_debug("\tgroup++\n");
 155                        if (!grp_start)
 156                                grp_start = iter;
 157                        slot_cnt -= slots_per_op;
 158                }
 159
 160                /* all the members of a group are complete */
 161                if (slots_per_op != 0 && slot_cnt == 0) {
 162                        struct iop_adma_desc_slot *grp_iter, *_grp_iter;
 163                        int end_of_chain = 0;
 164                        pr_debug("\tgroup end\n");
 165
 166                        /* collect the total results */
 167                        if (grp_start->xor_check_result) {
 168                                u32 zero_sum_result = 0;
 169                                slot_cnt = grp_start->slot_cnt;
 170                                grp_iter = grp_start;
 171
 172                                list_for_each_entry_from(grp_iter,
 173                                        &iop_chan->chain, chain_node) {
 174                                        zero_sum_result |=
 175                                            iop_desc_get_zero_result(grp_iter);
 176                                        pr_debug("\titer%d result: %d\n",
 177                                            grp_iter->idx, zero_sum_result);
 178                                        slot_cnt -= slots_per_op;
 179                                        if (slot_cnt == 0)
 180                                                break;
 181                                }
 182                                pr_debug("\tgrp_start->xor_check_result: %p\n",
 183                                        grp_start->xor_check_result);
 184                                *grp_start->xor_check_result = zero_sum_result;
 185                        }
 186
 187                        /* clean up the group */
 188                        slot_cnt = grp_start->slot_cnt;
 189                        grp_iter = grp_start;
 190                        list_for_each_entry_safe_from(grp_iter, _grp_iter,
 191                                &iop_chan->chain, chain_node) {
 192                                cookie = iop_adma_run_tx_complete_actions(
 193                                        grp_iter, iop_chan, cookie);
 194
 195                                slot_cnt -= slots_per_op;
 196                                end_of_chain = iop_adma_clean_slot(grp_iter,
 197                                        iop_chan);
 198
 199                                if (slot_cnt == 0 || end_of_chain)
 200                                        break;
 201                        }
 202
 203                        /* the group should be complete at this point */
 204                        BUG_ON(slot_cnt);
 205
 206                        slots_per_op = 0;
 207                        grp_start = NULL;
 208                        if (end_of_chain)
 209                                break;
 210                        else
 211                                continue;
 212                } else if (slots_per_op) /* wait for group completion */
 213                        continue;
 214
 215                /* write back zero sum results (single descriptor case) */
 216                if (iter->xor_check_result && iter->async_tx.cookie)
 217                        *iter->xor_check_result =
 218                                iop_desc_get_zero_result(iter);
 219
 220                cookie = iop_adma_run_tx_complete_actions(
 221                                        iter, iop_chan, cookie);
 222
 223                if (iop_adma_clean_slot(iter, iop_chan))
 224                        break;
 225        }
 226
 227        if (cookie > 0) {
 228                iop_chan->common.completed_cookie = cookie;
 229                pr_debug("\tcompleted cookie %d\n", cookie);
 230        }
 231}
 232
 233static void
 234iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan)
 235{
 236        spin_lock_bh(&iop_chan->lock);
 237        __iop_adma_slot_cleanup(iop_chan);
 238        spin_unlock_bh(&iop_chan->lock);
 239}
 240
 241static void iop_adma_tasklet(struct tasklet_struct *t)
 242{
 243        struct iop_adma_chan *iop_chan = from_tasklet(iop_chan, t,
 244                                                      irq_tasklet);
 245
 246        /* lockdep will flag depedency submissions as potentially
 247         * recursive locking, this is not the case as a dependency
 248         * submission will never recurse a channels submit routine.
 249         * There are checks in async_tx.c to prevent this.
 250         */
 251        spin_lock_nested(&iop_chan->lock, SINGLE_DEPTH_NESTING);
 252        __iop_adma_slot_cleanup(iop_chan);
 253        spin_unlock(&iop_chan->lock);
 254}
 255
 256static struct iop_adma_desc_slot *
 257iop_adma_alloc_slots(struct iop_adma_chan *iop_chan, int num_slots,
 258                        int slots_per_op)
 259{
 260        struct iop_adma_desc_slot *iter, *_iter, *alloc_start = NULL;
 261        LIST_HEAD(chain);
 262        int slots_found, retry = 0;
 263
 264        /* start search from the last allocated descrtiptor
 265         * if a contiguous allocation can not be found start searching
 266         * from the beginning of the list
 267         */
 268retry:
 269        slots_found = 0;
 270        if (retry == 0)
 271                iter = iop_chan->last_used;
 272        else
 273                iter = list_entry(&iop_chan->all_slots,
 274                        struct iop_adma_desc_slot,
 275                        slot_node);
 276
 277        list_for_each_entry_safe_continue(
 278                iter, _iter, &iop_chan->all_slots, slot_node) {
 279                prefetch(_iter);
 280                prefetch(&_iter->async_tx);
 281                if (iter->slots_per_op) {
 282                        /* give up after finding the first busy slot
 283                         * on the second pass through the list
 284                         */
 285                        if (retry)
 286                                break;
 287
 288                        slots_found = 0;
 289                        continue;
 290                }
 291
 292                /* start the allocation if the slot is correctly aligned */
 293                if (!slots_found++) {
 294                        if (iop_desc_is_aligned(iter, slots_per_op))
 295                                alloc_start = iter;
 296                        else {
 297                                slots_found = 0;
 298                                continue;
 299                        }
 300                }
 301
 302                if (slots_found == num_slots) {
 303                        struct iop_adma_desc_slot *alloc_tail = NULL;
 304                        struct iop_adma_desc_slot *last_used = NULL;
 305                        iter = alloc_start;
 306                        while (num_slots) {
 307                                int i;
 308                                dev_dbg(iop_chan->device->common.dev,
 309                                        "allocated slot: %d "
 310                                        "(desc %p phys: %#llx) slots_per_op %d\n",
 311                                        iter->idx, iter->hw_desc,
 312                                        (u64)iter->async_tx.phys, slots_per_op);
 313
 314                                /* pre-ack all but the last descriptor */
 315                                if (num_slots != slots_per_op)
 316                                        async_tx_ack(&iter->async_tx);
 317
 318                                list_add_tail(&iter->chain_node, &chain);
 319                                alloc_tail = iter;
 320                                iter->async_tx.cookie = 0;
 321                                iter->slot_cnt = num_slots;
 322                                iter->xor_check_result = NULL;
 323                                for (i = 0; i < slots_per_op; i++) {
 324                                        iter->slots_per_op = slots_per_op - i;
 325                                        last_used = iter;
 326                                        iter = list_entry(iter->slot_node.next,
 327                                                struct iop_adma_desc_slot,
 328                                                slot_node);
 329                                }
 330                                num_slots -= slots_per_op;
 331                        }
 332                        alloc_tail->group_head = alloc_start;
 333                        alloc_tail->async_tx.cookie = -EBUSY;
 334                        list_splice(&chain, &alloc_tail->tx_list);
 335                        iop_chan->last_used = last_used;
 336                        iop_desc_clear_next_desc(alloc_start);
 337                        iop_desc_clear_next_desc(alloc_tail);
 338                        return alloc_tail;
 339                }
 340        }
 341        if (!retry++)
 342                goto retry;
 343
 344        /* perform direct reclaim if the allocation fails */
 345        __iop_adma_slot_cleanup(iop_chan);
 346
 347        return NULL;
 348}
 349
 350static void iop_adma_check_threshold(struct iop_adma_chan *iop_chan)
 351{
 352        dev_dbg(iop_chan->device->common.dev, "pending: %d\n",
 353                iop_chan->pending);
 354
 355        if (iop_chan->pending >= IOP_ADMA_THRESHOLD) {
 356                iop_chan->pending = 0;
 357                iop_chan_append(iop_chan);
 358        }
 359}
 360
 361static dma_cookie_t
 362iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
 363{
 364        struct iop_adma_desc_slot *sw_desc = tx_to_iop_adma_slot(tx);
 365        struct iop_adma_chan *iop_chan = to_iop_adma_chan(tx->chan);
 366        struct iop_adma_desc_slot *grp_start, *old_chain_tail;
 367        int slot_cnt;
 368        dma_cookie_t cookie;
 369        dma_addr_t next_dma;
 370
 371        grp_start = sw_desc->group_head;
 372        slot_cnt = grp_start->slot_cnt;
 373
 374        spin_lock_bh(&iop_chan->lock);
 375        cookie = dma_cookie_assign(tx);
 376
 377        old_chain_tail = list_entry(iop_chan->chain.prev,
 378                struct iop_adma_desc_slot, chain_node);
 379        list_splice_init(&sw_desc->tx_list,
 380                         &old_chain_tail->chain_node);
 381
 382        /* fix up the hardware chain */
 383        next_dma = grp_start->async_tx.phys;
 384        iop_desc_set_next_desc(old_chain_tail, next_dma);
 385        BUG_ON(iop_desc_get_next_desc(old_chain_tail) != next_dma); /* flush */
 386
 387        /* check for pre-chained descriptors */
 388        iop_paranoia(iop_desc_get_next_desc(sw_desc));
 389
 390        /* increment the pending count by the number of slots
 391         * memcpy operations have a 1:1 (slot:operation) relation
 392         * other operations are heavier and will pop the threshold
 393         * more often.
 394         */
 395        iop_chan->pending += slot_cnt;
 396        iop_adma_check_threshold(iop_chan);
 397        spin_unlock_bh(&iop_chan->lock);
 398
 399        dev_dbg(iop_chan->device->common.dev, "%s cookie: %d slot: %d\n",
 400                __func__, sw_desc->async_tx.cookie, sw_desc->idx);
 401
 402        return cookie;
 403}
 404
 405static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan);
 406static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan);
 407
 408/**
 409 * iop_adma_alloc_chan_resources -  returns the number of allocated descriptors
 410 * @chan: allocate descriptor resources for this channel
 411 *
 412 * Note: We keep the slots for 1 operation on iop_chan->chain at all times.  To
 413 * avoid deadlock, via async_xor, num_descs_in_pool must at a minimum be
 414 * greater than 2x the number slots needed to satisfy a device->max_xor
 415 * request.
 416 * */
 417static int iop_adma_alloc_chan_resources(struct dma_chan *chan)
 418{
 419        char *hw_desc;
 420        dma_addr_t dma_desc;
 421        int idx;
 422        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 423        struct iop_adma_desc_slot *slot = NULL;
 424        int init = iop_chan->slots_allocated ? 0 : 1;
 425        struct iop_adma_platform_data *plat_data =
 426                dev_get_platdata(&iop_chan->device->pdev->dev);
 427        int num_descs_in_pool = plat_data->pool_size/IOP_ADMA_SLOT_SIZE;
 428
 429        /* Allocate descriptor slots */
 430        do {
 431                idx = iop_chan->slots_allocated;
 432                if (idx == num_descs_in_pool)
 433                        break;
 434
 435                slot = kzalloc(sizeof(*slot), GFP_KERNEL);
 436                if (!slot) {
 437                        printk(KERN_INFO "IOP ADMA Channel only initialized"
 438                                " %d descriptor slots", idx);
 439                        break;
 440                }
 441                hw_desc = (char *) iop_chan->device->dma_desc_pool_virt;
 442                slot->hw_desc = (void *) &hw_desc[idx * IOP_ADMA_SLOT_SIZE];
 443
 444                dma_async_tx_descriptor_init(&slot->async_tx, chan);
 445                slot->async_tx.tx_submit = iop_adma_tx_submit;
 446                INIT_LIST_HEAD(&slot->tx_list);
 447                INIT_LIST_HEAD(&slot->chain_node);
 448                INIT_LIST_HEAD(&slot->slot_node);
 449                dma_desc = iop_chan->device->dma_desc_pool;
 450                slot->async_tx.phys = dma_desc + idx * IOP_ADMA_SLOT_SIZE;
 451                slot->idx = idx;
 452
 453                spin_lock_bh(&iop_chan->lock);
 454                iop_chan->slots_allocated++;
 455                list_add_tail(&slot->slot_node, &iop_chan->all_slots);
 456                spin_unlock_bh(&iop_chan->lock);
 457        } while (iop_chan->slots_allocated < num_descs_in_pool);
 458
 459        if (idx && !iop_chan->last_used)
 460                iop_chan->last_used = list_entry(iop_chan->all_slots.next,
 461                                        struct iop_adma_desc_slot,
 462                                        slot_node);
 463
 464        dev_dbg(iop_chan->device->common.dev,
 465                "allocated %d descriptor slots last_used: %p\n",
 466                iop_chan->slots_allocated, iop_chan->last_used);
 467
 468        /* initialize the channel and the chain with a null operation */
 469        if (init) {
 470                if (dma_has_cap(DMA_MEMCPY,
 471                        iop_chan->device->common.cap_mask))
 472                        iop_chan_start_null_memcpy(iop_chan);
 473                else if (dma_has_cap(DMA_XOR,
 474                        iop_chan->device->common.cap_mask))
 475                        iop_chan_start_null_xor(iop_chan);
 476                else
 477                        BUG();
 478        }
 479
 480        return (idx > 0) ? idx : -ENOMEM;
 481}
 482
 483static struct dma_async_tx_descriptor *
 484iop_adma_prep_dma_interrupt(struct dma_chan *chan, unsigned long flags)
 485{
 486        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 487        struct iop_adma_desc_slot *sw_desc, *grp_start;
 488        int slot_cnt, slots_per_op;
 489
 490        dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
 491
 492        spin_lock_bh(&iop_chan->lock);
 493        slot_cnt = iop_chan_interrupt_slot_count(&slots_per_op, iop_chan);
 494        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
 495        if (sw_desc) {
 496                grp_start = sw_desc->group_head;
 497                iop_desc_init_interrupt(grp_start, iop_chan);
 498                sw_desc->async_tx.flags = flags;
 499        }
 500        spin_unlock_bh(&iop_chan->lock);
 501
 502        return sw_desc ? &sw_desc->async_tx : NULL;
 503}
 504
 505static struct dma_async_tx_descriptor *
 506iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest,
 507                         dma_addr_t dma_src, size_t len, unsigned long flags)
 508{
 509        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 510        struct iop_adma_desc_slot *sw_desc, *grp_start;
 511        int slot_cnt, slots_per_op;
 512
 513        if (unlikely(!len))
 514                return NULL;
 515        BUG_ON(len > IOP_ADMA_MAX_BYTE_COUNT);
 516
 517        dev_dbg(iop_chan->device->common.dev, "%s len: %zu\n",
 518                __func__, len);
 519
 520        spin_lock_bh(&iop_chan->lock);
 521        slot_cnt = iop_chan_memcpy_slot_count(len, &slots_per_op);
 522        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
 523        if (sw_desc) {
 524                grp_start = sw_desc->group_head;
 525                iop_desc_init_memcpy(grp_start, flags);
 526                iop_desc_set_byte_count(grp_start, iop_chan, len);
 527                iop_desc_set_dest_addr(grp_start, iop_chan, dma_dest);
 528                iop_desc_set_memcpy_src_addr(grp_start, dma_src);
 529                sw_desc->async_tx.flags = flags;
 530        }
 531        spin_unlock_bh(&iop_chan->lock);
 532
 533        return sw_desc ? &sw_desc->async_tx : NULL;
 534}
 535
 536static struct dma_async_tx_descriptor *
 537iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest,
 538                      dma_addr_t *dma_src, unsigned int src_cnt, size_t len,
 539                      unsigned long flags)
 540{
 541        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 542        struct iop_adma_desc_slot *sw_desc, *grp_start;
 543        int slot_cnt, slots_per_op;
 544
 545        if (unlikely(!len))
 546                return NULL;
 547        BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT);
 548
 549        dev_dbg(iop_chan->device->common.dev,
 550                "%s src_cnt: %d len: %zu flags: %lx\n",
 551                __func__, src_cnt, len, flags);
 552
 553        spin_lock_bh(&iop_chan->lock);
 554        slot_cnt = iop_chan_xor_slot_count(len, src_cnt, &slots_per_op);
 555        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
 556        if (sw_desc) {
 557                grp_start = sw_desc->group_head;
 558                iop_desc_init_xor(grp_start, src_cnt, flags);
 559                iop_desc_set_byte_count(grp_start, iop_chan, len);
 560                iop_desc_set_dest_addr(grp_start, iop_chan, dma_dest);
 561                sw_desc->async_tx.flags = flags;
 562                while (src_cnt--)
 563                        iop_desc_set_xor_src_addr(grp_start, src_cnt,
 564                                                  dma_src[src_cnt]);
 565        }
 566        spin_unlock_bh(&iop_chan->lock);
 567
 568        return sw_desc ? &sw_desc->async_tx : NULL;
 569}
 570
 571static struct dma_async_tx_descriptor *
 572iop_adma_prep_dma_xor_val(struct dma_chan *chan, dma_addr_t *dma_src,
 573                          unsigned int src_cnt, size_t len, u32 *result,
 574                          unsigned long flags)
 575{
 576        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 577        struct iop_adma_desc_slot *sw_desc, *grp_start;
 578        int slot_cnt, slots_per_op;
 579
 580        if (unlikely(!len))
 581                return NULL;
 582
 583        dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %zu\n",
 584                __func__, src_cnt, len);
 585
 586        spin_lock_bh(&iop_chan->lock);
 587        slot_cnt = iop_chan_zero_sum_slot_count(len, src_cnt, &slots_per_op);
 588        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
 589        if (sw_desc) {
 590                grp_start = sw_desc->group_head;
 591                iop_desc_init_zero_sum(grp_start, src_cnt, flags);
 592                iop_desc_set_zero_sum_byte_count(grp_start, len);
 593                grp_start->xor_check_result = result;
 594                pr_debug("\t%s: grp_start->xor_check_result: %p\n",
 595                        __func__, grp_start->xor_check_result);
 596                sw_desc->async_tx.flags = flags;
 597                while (src_cnt--)
 598                        iop_desc_set_zero_sum_src_addr(grp_start, src_cnt,
 599                                                       dma_src[src_cnt]);
 600        }
 601        spin_unlock_bh(&iop_chan->lock);
 602
 603        return sw_desc ? &sw_desc->async_tx : NULL;
 604}
 605
 606static struct dma_async_tx_descriptor *
 607iop_adma_prep_dma_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src,
 608                     unsigned int src_cnt, const unsigned char *scf, size_t len,
 609                     unsigned long flags)
 610{
 611        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 612        struct iop_adma_desc_slot *sw_desc, *g;
 613        int slot_cnt, slots_per_op;
 614        int continue_srcs;
 615
 616        if (unlikely(!len))
 617                return NULL;
 618        BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT);
 619
 620        dev_dbg(iop_chan->device->common.dev,
 621                "%s src_cnt: %d len: %zu flags: %lx\n",
 622                __func__, src_cnt, len, flags);
 623
 624        if (dmaf_p_disabled_continue(flags))
 625                continue_srcs = 1+src_cnt;
 626        else if (dmaf_continue(flags))
 627                continue_srcs = 3+src_cnt;
 628        else
 629                continue_srcs = 0+src_cnt;
 630
 631        spin_lock_bh(&iop_chan->lock);
 632        slot_cnt = iop_chan_pq_slot_count(len, continue_srcs, &slots_per_op);
 633        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
 634        if (sw_desc) {
 635                int i;
 636
 637                g = sw_desc->group_head;
 638                iop_desc_set_byte_count(g, iop_chan, len);
 639
 640                /* even if P is disabled its destination address (bits
 641                 * [3:0]) must match Q.  It is ok if P points to an
 642                 * invalid address, it won't be written.
 643                 */
 644                if (flags & DMA_PREP_PQ_DISABLE_P)
 645                        dst[0] = dst[1] & 0x7;
 646
 647                iop_desc_set_pq_addr(g, dst);
 648                sw_desc->async_tx.flags = flags;
 649                for (i = 0; i < src_cnt; i++)
 650                        iop_desc_set_pq_src_addr(g, i, src[i], scf[i]);
 651
 652                /* if we are continuing a previous operation factor in
 653                 * the old p and q values, see the comment for dma_maxpq
 654                 * in include/linux/dmaengine.h
 655                 */
 656                if (dmaf_p_disabled_continue(flags))
 657                        iop_desc_set_pq_src_addr(g, i++, dst[1], 1);
 658                else if (dmaf_continue(flags)) {
 659                        iop_desc_set_pq_src_addr(g, i++, dst[0], 0);
 660                        iop_desc_set_pq_src_addr(g, i++, dst[1], 1);
 661                        iop_desc_set_pq_src_addr(g, i++, dst[1], 0);
 662                }
 663                iop_desc_init_pq(g, i, flags);
 664        }
 665        spin_unlock_bh(&iop_chan->lock);
 666
 667        return sw_desc ? &sw_desc->async_tx : NULL;
 668}
 669
 670static struct dma_async_tx_descriptor *
 671iop_adma_prep_dma_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src,
 672                         unsigned int src_cnt, const unsigned char *scf,
 673                         size_t len, enum sum_check_flags *pqres,
 674                         unsigned long flags)
 675{
 676        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 677        struct iop_adma_desc_slot *sw_desc, *g;
 678        int slot_cnt, slots_per_op;
 679
 680        if (unlikely(!len))
 681                return NULL;
 682        BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT);
 683
 684        dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %zu\n",
 685                __func__, src_cnt, len);
 686
 687        spin_lock_bh(&iop_chan->lock);
 688        slot_cnt = iop_chan_pq_zero_sum_slot_count(len, src_cnt + 2, &slots_per_op);
 689        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
 690        if (sw_desc) {
 691                /* for validate operations p and q are tagged onto the
 692                 * end of the source list
 693                 */
 694                int pq_idx = src_cnt;
 695
 696                g = sw_desc->group_head;
 697                iop_desc_init_pq_zero_sum(g, src_cnt+2, flags);
 698                iop_desc_set_pq_zero_sum_byte_count(g, len);
 699                g->pq_check_result = pqres;
 700                pr_debug("\t%s: g->pq_check_result: %p\n",
 701                        __func__, g->pq_check_result);
 702                sw_desc->async_tx.flags = flags;
 703                while (src_cnt--)
 704                        iop_desc_set_pq_zero_sum_src_addr(g, src_cnt,
 705                                                          src[src_cnt],
 706                                                          scf[src_cnt]);
 707                iop_desc_set_pq_zero_sum_addr(g, pq_idx, src);
 708        }
 709        spin_unlock_bh(&iop_chan->lock);
 710
 711        return sw_desc ? &sw_desc->async_tx : NULL;
 712}
 713
 714static void iop_adma_free_chan_resources(struct dma_chan *chan)
 715{
 716        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 717        struct iop_adma_desc_slot *iter, *_iter;
 718        int in_use_descs = 0;
 719
 720        iop_adma_slot_cleanup(iop_chan);
 721
 722        spin_lock_bh(&iop_chan->lock);
 723        list_for_each_entry_safe(iter, _iter, &iop_chan->chain,
 724                                        chain_node) {
 725                in_use_descs++;
 726                list_del(&iter->chain_node);
 727        }
 728        list_for_each_entry_safe_reverse(
 729                iter, _iter, &iop_chan->all_slots, slot_node) {
 730                list_del(&iter->slot_node);
 731                kfree(iter);
 732                iop_chan->slots_allocated--;
 733        }
 734        iop_chan->last_used = NULL;
 735
 736        dev_dbg(iop_chan->device->common.dev, "%s slots_allocated %d\n",
 737                __func__, iop_chan->slots_allocated);
 738        spin_unlock_bh(&iop_chan->lock);
 739
 740        /* one is ok since we left it on there on purpose */
 741        if (in_use_descs > 1)
 742                printk(KERN_ERR "IOP: Freeing %d in use descriptors!\n",
 743                        in_use_descs - 1);
 744}
 745
 746/**
 747 * iop_adma_status - poll the status of an ADMA transaction
 748 * @chan: ADMA channel handle
 749 * @cookie: ADMA transaction identifier
 750 * @txstate: a holder for the current state of the channel or NULL
 751 */
 752static enum dma_status iop_adma_status(struct dma_chan *chan,
 753                                        dma_cookie_t cookie,
 754                                        struct dma_tx_state *txstate)
 755{
 756        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 757        int ret;
 758
 759        ret = dma_cookie_status(chan, cookie, txstate);
 760        if (ret == DMA_COMPLETE)
 761                return ret;
 762
 763        iop_adma_slot_cleanup(iop_chan);
 764
 765        return dma_cookie_status(chan, cookie, txstate);
 766}
 767
 768static irqreturn_t iop_adma_eot_handler(int irq, void *data)
 769{
 770        struct iop_adma_chan *chan = data;
 771
 772        dev_dbg(chan->device->common.dev, "%s\n", __func__);
 773
 774        tasklet_schedule(&chan->irq_tasklet);
 775
 776        iop_adma_device_clear_eot_status(chan);
 777
 778        return IRQ_HANDLED;
 779}
 780
 781static irqreturn_t iop_adma_eoc_handler(int irq, void *data)
 782{
 783        struct iop_adma_chan *chan = data;
 784
 785        dev_dbg(chan->device->common.dev, "%s\n", __func__);
 786
 787        tasklet_schedule(&chan->irq_tasklet);
 788
 789        iop_adma_device_clear_eoc_status(chan);
 790
 791        return IRQ_HANDLED;
 792}
 793
 794static irqreturn_t iop_adma_err_handler(int irq, void *data)
 795{
 796        struct iop_adma_chan *chan = data;
 797        unsigned long status = iop_chan_get_status(chan);
 798
 799        dev_err(chan->device->common.dev,
 800                "error ( %s%s%s%s%s%s%s)\n",
 801                iop_is_err_int_parity(status, chan) ? "int_parity " : "",
 802                iop_is_err_mcu_abort(status, chan) ? "mcu_abort " : "",
 803                iop_is_err_int_tabort(status, chan) ? "int_tabort " : "",
 804                iop_is_err_int_mabort(status, chan) ? "int_mabort " : "",
 805                iop_is_err_pci_tabort(status, chan) ? "pci_tabort " : "",
 806                iop_is_err_pci_mabort(status, chan) ? "pci_mabort " : "",
 807                iop_is_err_split_tx(status, chan) ? "split_tx " : "");
 808
 809        iop_adma_device_clear_err_status(chan);
 810
 811        BUG();
 812
 813        return IRQ_HANDLED;
 814}
 815
 816static void iop_adma_issue_pending(struct dma_chan *chan)
 817{
 818        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
 819
 820        if (iop_chan->pending) {
 821                iop_chan->pending = 0;
 822                iop_chan_append(iop_chan);
 823        }
 824}
 825
 826/*
 827 * Perform a transaction to verify the HW works.
 828 */
 829#define IOP_ADMA_TEST_SIZE 2000
 830
 831static int iop_adma_memcpy_self_test(struct iop_adma_device *device)
 832{
 833        int i;
 834        void *src, *dest;
 835        dma_addr_t src_dma, dest_dma;
 836        struct dma_chan *dma_chan;
 837        dma_cookie_t cookie;
 838        struct dma_async_tx_descriptor *tx;
 839        int err = 0;
 840        struct iop_adma_chan *iop_chan;
 841
 842        dev_dbg(device->common.dev, "%s\n", __func__);
 843
 844        src = kmalloc(IOP_ADMA_TEST_SIZE, GFP_KERNEL);
 845        if (!src)
 846                return -ENOMEM;
 847        dest = kzalloc(IOP_ADMA_TEST_SIZE, GFP_KERNEL);
 848        if (!dest) {
 849                kfree(src);
 850                return -ENOMEM;
 851        }
 852
 853        /* Fill in src buffer */
 854        for (i = 0; i < IOP_ADMA_TEST_SIZE; i++)
 855                ((u8 *) src)[i] = (u8)i;
 856
 857        /* Start copy, using first DMA channel */
 858        dma_chan = container_of(device->common.channels.next,
 859                                struct dma_chan,
 860                                device_node);
 861        if (iop_adma_alloc_chan_resources(dma_chan) < 1) {
 862                err = -ENODEV;
 863                goto out;
 864        }
 865
 866        dest_dma = dma_map_single(dma_chan->device->dev, dest,
 867                                IOP_ADMA_TEST_SIZE, DMA_FROM_DEVICE);
 868        src_dma = dma_map_single(dma_chan->device->dev, src,
 869                                IOP_ADMA_TEST_SIZE, DMA_TO_DEVICE);
 870        tx = iop_adma_prep_dma_memcpy(dma_chan, dest_dma, src_dma,
 871                                      IOP_ADMA_TEST_SIZE,
 872                                      DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 873
 874        cookie = iop_adma_tx_submit(tx);
 875        iop_adma_issue_pending(dma_chan);
 876        msleep(1);
 877
 878        if (iop_adma_status(dma_chan, cookie, NULL) !=
 879                        DMA_COMPLETE) {
 880                dev_err(dma_chan->device->dev,
 881                        "Self-test copy timed out, disabling\n");
 882                err = -ENODEV;
 883                goto free_resources;
 884        }
 885
 886        iop_chan = to_iop_adma_chan(dma_chan);
 887        dma_sync_single_for_cpu(&iop_chan->device->pdev->dev, dest_dma,
 888                IOP_ADMA_TEST_SIZE, DMA_FROM_DEVICE);
 889        if (memcmp(src, dest, IOP_ADMA_TEST_SIZE)) {
 890                dev_err(dma_chan->device->dev,
 891                        "Self-test copy failed compare, disabling\n");
 892                err = -ENODEV;
 893                goto free_resources;
 894        }
 895
 896free_resources:
 897        iop_adma_free_chan_resources(dma_chan);
 898out:
 899        kfree(src);
 900        kfree(dest);
 901        return err;
 902}
 903
 904#define IOP_ADMA_NUM_SRC_TEST 4 /* must be <= 15 */
 905static int
 906iop_adma_xor_val_self_test(struct iop_adma_device *device)
 907{
 908        int i, src_idx;
 909        struct page *dest;
 910        struct page *xor_srcs[IOP_ADMA_NUM_SRC_TEST];
 911        struct page *zero_sum_srcs[IOP_ADMA_NUM_SRC_TEST + 1];
 912        dma_addr_t dma_srcs[IOP_ADMA_NUM_SRC_TEST + 1];
 913        dma_addr_t dest_dma;
 914        struct dma_async_tx_descriptor *tx;
 915        struct dma_chan *dma_chan;
 916        dma_cookie_t cookie;
 917        u8 cmp_byte = 0;
 918        u32 cmp_word;
 919        u32 zero_sum_result;
 920        int err = 0;
 921        struct iop_adma_chan *iop_chan;
 922
 923        dev_dbg(device->common.dev, "%s\n", __func__);
 924
 925        for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
 926                xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
 927                if (!xor_srcs[src_idx]) {
 928                        while (src_idx--)
 929                                __free_page(xor_srcs[src_idx]);
 930                        return -ENOMEM;
 931                }
 932        }
 933
 934        dest = alloc_page(GFP_KERNEL);
 935        if (!dest) {
 936                while (src_idx--)
 937                        __free_page(xor_srcs[src_idx]);
 938                return -ENOMEM;
 939        }
 940
 941        /* Fill in src buffers */
 942        for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
 943                u8 *ptr = page_address(xor_srcs[src_idx]);
 944                for (i = 0; i < PAGE_SIZE; i++)
 945                        ptr[i] = (1 << src_idx);
 946        }
 947
 948        for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++)
 949                cmp_byte ^= (u8) (1 << src_idx);
 950
 951        cmp_word = (cmp_byte << 24) | (cmp_byte << 16) |
 952                        (cmp_byte << 8) | cmp_byte;
 953
 954        memset(page_address(dest), 0, PAGE_SIZE);
 955
 956        dma_chan = container_of(device->common.channels.next,
 957                                struct dma_chan,
 958                                device_node);
 959        if (iop_adma_alloc_chan_resources(dma_chan) < 1) {
 960                err = -ENODEV;
 961                goto out;
 962        }
 963
 964        /* test xor */
 965        dest_dma = dma_map_page(dma_chan->device->dev, dest, 0,
 966                                PAGE_SIZE, DMA_FROM_DEVICE);
 967        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST; i++)
 968                dma_srcs[i] = dma_map_page(dma_chan->device->dev, xor_srcs[i],
 969                                           0, PAGE_SIZE, DMA_TO_DEVICE);
 970        tx = iop_adma_prep_dma_xor(dma_chan, dest_dma, dma_srcs,
 971                                   IOP_ADMA_NUM_SRC_TEST, PAGE_SIZE,
 972                                   DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 973
 974        cookie = iop_adma_tx_submit(tx);
 975        iop_adma_issue_pending(dma_chan);
 976        msleep(8);
 977
 978        if (iop_adma_status(dma_chan, cookie, NULL) !=
 979                DMA_COMPLETE) {
 980                dev_err(dma_chan->device->dev,
 981                        "Self-test xor timed out, disabling\n");
 982                err = -ENODEV;
 983                goto free_resources;
 984        }
 985
 986        iop_chan = to_iop_adma_chan(dma_chan);
 987        dma_sync_single_for_cpu(&iop_chan->device->pdev->dev, dest_dma,
 988                PAGE_SIZE, DMA_FROM_DEVICE);
 989        for (i = 0; i < (PAGE_SIZE / sizeof(u32)); i++) {
 990                u32 *ptr = page_address(dest);
 991                if (ptr[i] != cmp_word) {
 992                        dev_err(dma_chan->device->dev,
 993                                "Self-test xor failed compare, disabling\n");
 994                        err = -ENODEV;
 995                        goto free_resources;
 996                }
 997        }
 998        dma_sync_single_for_device(&iop_chan->device->pdev->dev, dest_dma,
 999                PAGE_SIZE, DMA_TO_DEVICE);
1000
1001        /* skip zero sum if the capability is not present */
1002        if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask))
1003                goto free_resources;
1004
1005        /* zero sum the sources with the destintation page */
1006        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST; i++)
1007                zero_sum_srcs[i] = xor_srcs[i];
1008        zero_sum_srcs[i] = dest;
1009
1010        zero_sum_result = 1;
1011
1012        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST + 1; i++)
1013                dma_srcs[i] = dma_map_page(dma_chan->device->dev,
1014                                           zero_sum_srcs[i], 0, PAGE_SIZE,
1015                                           DMA_TO_DEVICE);
1016        tx = iop_adma_prep_dma_xor_val(dma_chan, dma_srcs,
1017                                       IOP_ADMA_NUM_SRC_TEST + 1, PAGE_SIZE,
1018                                       &zero_sum_result,
1019                                       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
1020
1021        cookie = iop_adma_tx_submit(tx);
1022        iop_adma_issue_pending(dma_chan);
1023        msleep(8);
1024
1025        if (iop_adma_status(dma_chan, cookie, NULL) != DMA_COMPLETE) {
1026                dev_err(dma_chan->device->dev,
1027                        "Self-test zero sum timed out, disabling\n");
1028                err = -ENODEV;
1029                goto free_resources;
1030        }
1031
1032        if (zero_sum_result != 0) {
1033                dev_err(dma_chan->device->dev,
1034                        "Self-test zero sum failed compare, disabling\n");
1035                err = -ENODEV;
1036                goto free_resources;
1037        }
1038
1039        /* test for non-zero parity sum */
1040        zero_sum_result = 0;
1041        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST + 1; i++)
1042                dma_srcs[i] = dma_map_page(dma_chan->device->dev,
1043                                           zero_sum_srcs[i], 0, PAGE_SIZE,
1044                                           DMA_TO_DEVICE);
1045        tx = iop_adma_prep_dma_xor_val(dma_chan, dma_srcs,
1046                                       IOP_ADMA_NUM_SRC_TEST + 1, PAGE_SIZE,
1047                                       &zero_sum_result,
1048                                       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
1049
1050        cookie = iop_adma_tx_submit(tx);
1051        iop_adma_issue_pending(dma_chan);
1052        msleep(8);
1053
1054        if (iop_adma_status(dma_chan, cookie, NULL) != DMA_COMPLETE) {
1055                dev_err(dma_chan->device->dev,
1056                        "Self-test non-zero sum timed out, disabling\n");
1057                err = -ENODEV;
1058                goto free_resources;
1059        }
1060
1061        if (zero_sum_result != 1) {
1062                dev_err(dma_chan->device->dev,
1063                        "Self-test non-zero sum failed compare, disabling\n");
1064                err = -ENODEV;
1065                goto free_resources;
1066        }
1067
1068free_resources:
1069        iop_adma_free_chan_resources(dma_chan);
1070out:
1071        src_idx = IOP_ADMA_NUM_SRC_TEST;
1072        while (src_idx--)
1073                __free_page(xor_srcs[src_idx]);
1074        __free_page(dest);
1075        return err;
1076}
1077
1078#ifdef CONFIG_RAID6_PQ
1079static int
1080iop_adma_pq_zero_sum_self_test(struct iop_adma_device *device)
1081{
1082        /* combined sources, software pq results, and extra hw pq results */
1083        struct page *pq[IOP_ADMA_NUM_SRC_TEST+2+2];
1084        /* ptr to the extra hw pq buffers defined above */
1085        struct page **pq_hw = &pq[IOP_ADMA_NUM_SRC_TEST+2];
1086        /* address conversion buffers (dma_map / page_address) */
1087        void *pq_sw[IOP_ADMA_NUM_SRC_TEST+2];
1088        dma_addr_t pq_src[IOP_ADMA_NUM_SRC_TEST+2];
1089        dma_addr_t *pq_dest = &pq_src[IOP_ADMA_NUM_SRC_TEST];
1090
1091        int i;
1092        struct dma_async_tx_descriptor *tx;
1093        struct dma_chan *dma_chan;
1094        dma_cookie_t cookie;
1095        u32 zero_sum_result;
1096        int err = 0;
1097        struct device *dev;
1098
1099        dev_dbg(device->common.dev, "%s\n", __func__);
1100
1101        for (i = 0; i < ARRAY_SIZE(pq); i++) {
1102                pq[i] = alloc_page(GFP_KERNEL);
1103                if (!pq[i]) {
1104                        while (i--)
1105                                __free_page(pq[i]);
1106                        return -ENOMEM;
1107                }
1108        }
1109
1110        /* Fill in src buffers */
1111        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST; i++) {
1112                pq_sw[i] = page_address(pq[i]);
1113                memset(pq_sw[i], 0x11111111 * (1<<i), PAGE_SIZE);
1114        }
1115        pq_sw[i] = page_address(pq[i]);
1116        pq_sw[i+1] = page_address(pq[i+1]);
1117
1118        dma_chan = container_of(device->common.channels.next,
1119                                struct dma_chan,
1120                                device_node);
1121        if (iop_adma_alloc_chan_resources(dma_chan) < 1) {
1122                err = -ENODEV;
1123                goto out;
1124        }
1125
1126        dev = dma_chan->device->dev;
1127
1128        /* initialize the dests */
1129        memset(page_address(pq_hw[0]), 0 , PAGE_SIZE);
1130        memset(page_address(pq_hw[1]), 0 , PAGE_SIZE);
1131
1132        /* test pq */
1133        pq_dest[0] = dma_map_page(dev, pq_hw[0], 0, PAGE_SIZE, DMA_FROM_DEVICE);
1134        pq_dest[1] = dma_map_page(dev, pq_hw[1], 0, PAGE_SIZE, DMA_FROM_DEVICE);
1135        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST; i++)
1136                pq_src[i] = dma_map_page(dev, pq[i], 0, PAGE_SIZE,
1137                                         DMA_TO_DEVICE);
1138
1139        tx = iop_adma_prep_dma_pq(dma_chan, pq_dest, pq_src,
1140                                  IOP_ADMA_NUM_SRC_TEST, (u8 *)raid6_gfexp,
1141                                  PAGE_SIZE,
1142                                  DMA_PREP_INTERRUPT |
1143                                  DMA_CTRL_ACK);
1144
1145        cookie = iop_adma_tx_submit(tx);
1146        iop_adma_issue_pending(dma_chan);
1147        msleep(8);
1148
1149        if (iop_adma_status(dma_chan, cookie, NULL) !=
1150                DMA_COMPLETE) {
1151                dev_err(dev, "Self-test pq timed out, disabling\n");
1152                err = -ENODEV;
1153                goto free_resources;
1154        }
1155
1156        raid6_call.gen_syndrome(IOP_ADMA_NUM_SRC_TEST+2, PAGE_SIZE, pq_sw);
1157
1158        if (memcmp(pq_sw[IOP_ADMA_NUM_SRC_TEST],
1159                   page_address(pq_hw[0]), PAGE_SIZE) != 0) {
1160                dev_err(dev, "Self-test p failed compare, disabling\n");
1161                err = -ENODEV;
1162                goto free_resources;
1163        }
1164        if (memcmp(pq_sw[IOP_ADMA_NUM_SRC_TEST+1],
1165                   page_address(pq_hw[1]), PAGE_SIZE) != 0) {
1166                dev_err(dev, "Self-test q failed compare, disabling\n");
1167                err = -ENODEV;
1168                goto free_resources;
1169        }
1170
1171        /* test correct zero sum using the software generated pq values */
1172        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST + 2; i++)
1173                pq_src[i] = dma_map_page(dev, pq[i], 0, PAGE_SIZE,
1174                                         DMA_TO_DEVICE);
1175
1176        zero_sum_result = ~0;
1177        tx = iop_adma_prep_dma_pq_val(dma_chan, &pq_src[IOP_ADMA_NUM_SRC_TEST],
1178                                      pq_src, IOP_ADMA_NUM_SRC_TEST,
1179                                      raid6_gfexp, PAGE_SIZE, &zero_sum_result,
1180                                      DMA_PREP_INTERRUPT|DMA_CTRL_ACK);
1181
1182        cookie = iop_adma_tx_submit(tx);
1183        iop_adma_issue_pending(dma_chan);
1184        msleep(8);
1185
1186        if (iop_adma_status(dma_chan, cookie, NULL) !=
1187                DMA_COMPLETE) {
1188                dev_err(dev, "Self-test pq-zero-sum timed out, disabling\n");
1189                err = -ENODEV;
1190                goto free_resources;
1191        }
1192
1193        if (zero_sum_result != 0) {
1194                dev_err(dev, "Self-test pq-zero-sum failed to validate: %x\n",
1195                        zero_sum_result);
1196                err = -ENODEV;
1197                goto free_resources;
1198        }
1199
1200        /* test incorrect zero sum */
1201        i = IOP_ADMA_NUM_SRC_TEST;
1202        memset(pq_sw[i] + 100, 0, 100);
1203        memset(pq_sw[i+1] + 200, 0, 200);
1204        for (i = 0; i < IOP_ADMA_NUM_SRC_TEST + 2; i++)
1205                pq_src[i] = dma_map_page(dev, pq[i], 0, PAGE_SIZE,
1206                                         DMA_TO_DEVICE);
1207
1208        zero_sum_result = 0;
1209        tx = iop_adma_prep_dma_pq_val(dma_chan, &pq_src[IOP_ADMA_NUM_SRC_TEST],
1210                                      pq_src, IOP_ADMA_NUM_SRC_TEST,
1211                                      raid6_gfexp, PAGE_SIZE, &zero_sum_result,
1212                                      DMA_PREP_INTERRUPT|DMA_CTRL_ACK);
1213
1214        cookie = iop_adma_tx_submit(tx);
1215        iop_adma_issue_pending(dma_chan);
1216        msleep(8);
1217
1218        if (iop_adma_status(dma_chan, cookie, NULL) !=
1219                DMA_COMPLETE) {
1220                dev_err(dev, "Self-test !pq-zero-sum timed out, disabling\n");
1221                err = -ENODEV;
1222                goto free_resources;
1223        }
1224
1225        if (zero_sum_result != (SUM_CHECK_P_RESULT | SUM_CHECK_Q_RESULT)) {
1226                dev_err(dev, "Self-test !pq-zero-sum failed to validate: %x\n",
1227                        zero_sum_result);
1228                err = -ENODEV;
1229                goto free_resources;
1230        }
1231
1232free_resources:
1233        iop_adma_free_chan_resources(dma_chan);
1234out:
1235        i = ARRAY_SIZE(pq);
1236        while (i--)
1237                __free_page(pq[i]);
1238        return err;
1239}
1240#endif
1241
1242static int iop_adma_remove(struct platform_device *dev)
1243{
1244        struct iop_adma_device *device = platform_get_drvdata(dev);
1245        struct dma_chan *chan, *_chan;
1246        struct iop_adma_chan *iop_chan;
1247        struct iop_adma_platform_data *plat_data = dev_get_platdata(&dev->dev);
1248
1249        dma_async_device_unregister(&device->common);
1250
1251        dma_free_coherent(&dev->dev, plat_data->pool_size,
1252                        device->dma_desc_pool_virt, device->dma_desc_pool);
1253
1254        list_for_each_entry_safe(chan, _chan, &device->common.channels,
1255                                device_node) {
1256                iop_chan = to_iop_adma_chan(chan);
1257                list_del(&chan->device_node);
1258                kfree(iop_chan);
1259        }
1260        kfree(device);
1261
1262        return 0;
1263}
1264
1265static int iop_adma_probe(struct platform_device *pdev)
1266{
1267        struct resource *res;
1268        int ret = 0, i;
1269        struct iop_adma_device *adev;
1270        struct iop_adma_chan *iop_chan;
1271        struct dma_device *dma_dev;
1272        struct iop_adma_platform_data *plat_data = dev_get_platdata(&pdev->dev);
1273
1274        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1275        if (!res)
1276                return -ENODEV;
1277
1278        if (!devm_request_mem_region(&pdev->dev, res->start,
1279                                resource_size(res), pdev->name))
1280                return -EBUSY;
1281
1282        adev = kzalloc(sizeof(*adev), GFP_KERNEL);
1283        if (!adev)
1284                return -ENOMEM;
1285        dma_dev = &adev->common;
1286
1287        /* allocate coherent memory for hardware descriptors
1288         * note: writecombine gives slightly better performance, but
1289         * requires that we explicitly flush the writes
1290         */
1291        adev->dma_desc_pool_virt = dma_alloc_wc(&pdev->dev,
1292                                                plat_data->pool_size,
1293                                                &adev->dma_desc_pool,
1294                                                GFP_KERNEL);
1295        if (!adev->dma_desc_pool_virt) {
1296                ret = -ENOMEM;
1297                goto err_free_adev;
1298        }
1299
1300        dev_dbg(&pdev->dev, "%s: allocated descriptor pool virt %p phys %pad\n",
1301                __func__, adev->dma_desc_pool_virt, &adev->dma_desc_pool);
1302
1303        adev->id = plat_data->hw_id;
1304
1305        /* discover transaction capabilites from the platform data */
1306        dma_dev->cap_mask = plat_data->cap_mask;
1307
1308        adev->pdev = pdev;
1309        platform_set_drvdata(pdev, adev);
1310
1311        INIT_LIST_HEAD(&dma_dev->channels);
1312
1313        /* set base routines */
1314        dma_dev->device_alloc_chan_resources = iop_adma_alloc_chan_resources;
1315        dma_dev->device_free_chan_resources = iop_adma_free_chan_resources;
1316        dma_dev->device_tx_status = iop_adma_status;
1317        dma_dev->device_issue_pending = iop_adma_issue_pending;
1318        dma_dev->dev = &pdev->dev;
1319
1320        /* set prep routines based on capability */
1321        if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask))
1322                dma_dev->device_prep_dma_memcpy = iop_adma_prep_dma_memcpy;
1323        if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) {
1324                dma_dev->max_xor = iop_adma_get_max_xor();
1325                dma_dev->device_prep_dma_xor = iop_adma_prep_dma_xor;
1326        }
1327        if (dma_has_cap(DMA_XOR_VAL, dma_dev->cap_mask))
1328                dma_dev->device_prep_dma_xor_val =
1329                        iop_adma_prep_dma_xor_val;
1330        if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) {
1331                dma_set_maxpq(dma_dev, iop_adma_get_max_pq(), 0);
1332                dma_dev->device_prep_dma_pq = iop_adma_prep_dma_pq;
1333        }
1334        if (dma_has_cap(DMA_PQ_VAL, dma_dev->cap_mask))
1335                dma_dev->device_prep_dma_pq_val =
1336                        iop_adma_prep_dma_pq_val;
1337        if (dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask))
1338                dma_dev->device_prep_dma_interrupt =
1339                        iop_adma_prep_dma_interrupt;
1340
1341        iop_chan = kzalloc(sizeof(*iop_chan), GFP_KERNEL);
1342        if (!iop_chan) {
1343                ret = -ENOMEM;
1344                goto err_free_dma;
1345        }
1346        iop_chan->device = adev;
1347
1348        iop_chan->mmr_base = devm_ioremap(&pdev->dev, res->start,
1349                                        resource_size(res));
1350        if (!iop_chan->mmr_base) {
1351                ret = -ENOMEM;
1352                goto err_free_iop_chan;
1353        }
1354        tasklet_setup(&iop_chan->irq_tasklet, iop_adma_tasklet);
1355
1356        /* clear errors before enabling interrupts */
1357        iop_adma_device_clear_err_status(iop_chan);
1358
1359        for (i = 0; i < 3; i++) {
1360                static const irq_handler_t handler[] = {
1361                        iop_adma_eot_handler,
1362                        iop_adma_eoc_handler,
1363                        iop_adma_err_handler
1364                };
1365                int irq = platform_get_irq(pdev, i);
1366                if (irq < 0) {
1367                        ret = -ENXIO;
1368                        goto err_free_iop_chan;
1369                } else {
1370                        ret = devm_request_irq(&pdev->dev, irq,
1371                                        handler[i], 0, pdev->name, iop_chan);
1372                        if (ret)
1373                                goto err_free_iop_chan;
1374                }
1375        }
1376
1377        spin_lock_init(&iop_chan->lock);
1378        INIT_LIST_HEAD(&iop_chan->chain);
1379        INIT_LIST_HEAD(&iop_chan->all_slots);
1380        iop_chan->common.device = dma_dev;
1381        dma_cookie_init(&iop_chan->common);
1382        list_add_tail(&iop_chan->common.device_node, &dma_dev->channels);
1383
1384        if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
1385                ret = iop_adma_memcpy_self_test(adev);
1386                dev_dbg(&pdev->dev, "memcpy self test returned %d\n", ret);
1387                if (ret)
1388                        goto err_free_iop_chan;
1389        }
1390
1391        if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) {
1392                ret = iop_adma_xor_val_self_test(adev);
1393                dev_dbg(&pdev->dev, "xor self test returned %d\n", ret);
1394                if (ret)
1395                        goto err_free_iop_chan;
1396        }
1397
1398        if (dma_has_cap(DMA_PQ, dma_dev->cap_mask) &&
1399            dma_has_cap(DMA_PQ_VAL, dma_dev->cap_mask)) {
1400                #ifdef CONFIG_RAID6_PQ
1401                ret = iop_adma_pq_zero_sum_self_test(adev);
1402                dev_dbg(&pdev->dev, "pq self test returned %d\n", ret);
1403                #else
1404                /* can not test raid6, so do not publish capability */
1405                dma_cap_clear(DMA_PQ, dma_dev->cap_mask);
1406                dma_cap_clear(DMA_PQ_VAL, dma_dev->cap_mask);
1407                ret = 0;
1408                #endif
1409                if (ret)
1410                        goto err_free_iop_chan;
1411        }
1412
1413        dev_info(&pdev->dev, "Intel(R) IOP: ( %s%s%s%s%s%s)\n",
1414                 dma_has_cap(DMA_PQ, dma_dev->cap_mask) ? "pq " : "",
1415                 dma_has_cap(DMA_PQ_VAL, dma_dev->cap_mask) ? "pq_val " : "",
1416                 dma_has_cap(DMA_XOR, dma_dev->cap_mask) ? "xor " : "",
1417                 dma_has_cap(DMA_XOR_VAL, dma_dev->cap_mask) ? "xor_val " : "",
1418                 dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask) ? "cpy " : "",
1419                 dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask) ? "intr " : "");
1420
1421        dma_async_device_register(dma_dev);
1422        goto out;
1423
1424 err_free_iop_chan:
1425        kfree(iop_chan);
1426 err_free_dma:
1427        dma_free_coherent(&adev->pdev->dev, plat_data->pool_size,
1428                        adev->dma_desc_pool_virt, adev->dma_desc_pool);
1429 err_free_adev:
1430        kfree(adev);
1431 out:
1432        return ret;
1433}
1434
1435static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan)
1436{
1437        struct iop_adma_desc_slot *sw_desc, *grp_start;
1438        dma_cookie_t cookie;
1439        int slot_cnt, slots_per_op;
1440
1441        dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
1442
1443        spin_lock_bh(&iop_chan->lock);
1444        slot_cnt = iop_chan_memcpy_slot_count(0, &slots_per_op);
1445        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
1446        if (sw_desc) {
1447                grp_start = sw_desc->group_head;
1448
1449                list_splice_init(&sw_desc->tx_list, &iop_chan->chain);
1450                async_tx_ack(&sw_desc->async_tx);
1451                iop_desc_init_memcpy(grp_start, 0);
1452                iop_desc_set_byte_count(grp_start, iop_chan, 0);
1453                iop_desc_set_dest_addr(grp_start, iop_chan, 0);
1454                iop_desc_set_memcpy_src_addr(grp_start, 0);
1455
1456                cookie = dma_cookie_assign(&sw_desc->async_tx);
1457
1458                /* initialize the completed cookie to be less than
1459                 * the most recently used cookie
1460                 */
1461                iop_chan->common.completed_cookie = cookie - 1;
1462
1463                /* channel should not be busy */
1464                BUG_ON(iop_chan_is_busy(iop_chan));
1465
1466                /* clear any prior error-status bits */
1467                iop_adma_device_clear_err_status(iop_chan);
1468
1469                /* disable operation */
1470                iop_chan_disable(iop_chan);
1471
1472                /* set the descriptor address */
1473                iop_chan_set_next_descriptor(iop_chan, sw_desc->async_tx.phys);
1474
1475                /* 1/ don't add pre-chained descriptors
1476                 * 2/ dummy read to flush next_desc write
1477                 */
1478                BUG_ON(iop_desc_get_next_desc(sw_desc));
1479
1480                /* run the descriptor */
1481                iop_chan_enable(iop_chan);
1482        } else
1483                dev_err(iop_chan->device->common.dev,
1484                        "failed to allocate null descriptor\n");
1485        spin_unlock_bh(&iop_chan->lock);
1486}
1487
1488static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
1489{
1490        struct iop_adma_desc_slot *sw_desc, *grp_start;
1491        dma_cookie_t cookie;
1492        int slot_cnt, slots_per_op;
1493
1494        dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
1495
1496        spin_lock_bh(&iop_chan->lock);
1497        slot_cnt = iop_chan_xor_slot_count(0, 2, &slots_per_op);
1498        sw_desc = iop_adma_alloc_slots(iop_chan, slot_cnt, slots_per_op);
1499        if (sw_desc) {
1500                grp_start = sw_desc->group_head;
1501                list_splice_init(&sw_desc->tx_list, &iop_chan->chain);
1502                async_tx_ack(&sw_desc->async_tx);
1503                iop_desc_init_null_xor(grp_start, 2, 0);
1504                iop_desc_set_byte_count(grp_start, iop_chan, 0);
1505                iop_desc_set_dest_addr(grp_start, iop_chan, 0);
1506                iop_desc_set_xor_src_addr(grp_start, 0, 0);
1507                iop_desc_set_xor_src_addr(grp_start, 1, 0);
1508
1509                cookie = dma_cookie_assign(&sw_desc->async_tx);
1510
1511                /* initialize the completed cookie to be less than
1512                 * the most recently used cookie
1513                 */
1514                iop_chan->common.completed_cookie = cookie - 1;
1515
1516                /* channel should not be busy */
1517                BUG_ON(iop_chan_is_busy(iop_chan));
1518
1519                /* clear any prior error-status bits */
1520                iop_adma_device_clear_err_status(iop_chan);
1521
1522                /* disable operation */
1523                iop_chan_disable(iop_chan);
1524
1525                /* set the descriptor address */
1526                iop_chan_set_next_descriptor(iop_chan, sw_desc->async_tx.phys);
1527
1528                /* 1/ don't add pre-chained descriptors
1529                 * 2/ dummy read to flush next_desc write
1530                 */
1531                BUG_ON(iop_desc_get_next_desc(sw_desc));
1532
1533                /* run the descriptor */
1534                iop_chan_enable(iop_chan);
1535        } else
1536                dev_err(iop_chan->device->common.dev,
1537                        "failed to allocate null descriptor\n");
1538        spin_unlock_bh(&iop_chan->lock);
1539}
1540
1541static struct platform_driver iop_adma_driver = {
1542        .probe          = iop_adma_probe,
1543        .remove         = iop_adma_remove,
1544        .driver         = {
1545                .name   = "iop-adma",
1546        },
1547};
1548
1549module_platform_driver(iop_adma_driver);
1550
1551MODULE_AUTHOR("Intel Corporation");
1552MODULE_DESCRIPTION("IOP ADMA Engine Driver");
1553MODULE_LICENSE("GPL");
1554MODULE_ALIAS("platform:iop-adma");
1555