ioat_dma.c 26.9 KB
Newer Older
1
/*
2 3
 * Intel I/OAT DMA Linux driver
 * Copyright(c) 2004 - 2007 Intel Corporation.
4 5
 *
 * This program is free software; you can redistribute it and/or modify it
6 7
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
8 9 10 11 12 13 14
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
15 16 17 18 19
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * The full GNU General Public License is included in this distribution in
 * the file called "COPYING".
20 21 22 23 24 25 26 27 28 29 30 31 32 33
 *
 */

/*
 * This driver supports an Intel I/OAT DMA engine, which does asynchronous
 * copy operations.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/dmaengine.h>
#include <linux/delay.h>
34
#include <linux/dma-mapping.h>
35 36 37 38
#include "ioatdma.h"
#include "ioatdma_registers.h"
#include "ioatdma_hw.h"

39 40
#define INITIAL_IOAT_DESC_COUNT 128

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

/* internal functions */
47 48
static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan);
static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan);
49 50
static struct ioat_desc_sw *
ioat_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan);
51

52 53 54
static inline struct ioat_dma_chan *ioat_lookup_chan_by_index(
						struct ioatdma_device *device,
						int index)
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
{
	return device->idx[index];
}

/**
 * ioat_dma_do_interrupt - handler used for single vector interrupt mode
 * @irq: interrupt id
 * @data: interrupt data
 */
static irqreturn_t ioat_dma_do_interrupt(int irq, void *data)
{
	struct ioatdma_device *instance = data;
	struct ioat_dma_chan *ioat_chan;
	unsigned long attnstatus;
	int bit;
	u8 intrctrl;

	intrctrl = readb(instance->reg_base + IOAT_INTRCTRL_OFFSET);

	if (!(intrctrl & IOAT_INTRCTRL_MASTER_INT_EN))
		return IRQ_NONE;

	if (!(intrctrl & IOAT_INTRCTRL_INT_STATUS)) {
		writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET);
		return IRQ_NONE;
	}

	attnstatus = readl(instance->reg_base + IOAT_ATTNSTATUS_OFFSET);
	for_each_bit(bit, &attnstatus, BITS_PER_LONG) {
		ioat_chan = ioat_lookup_chan_by_index(instance, bit);
		tasklet_schedule(&ioat_chan->cleanup_task);
	}

	writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET);
	return IRQ_HANDLED;
}

/**
 * ioat_dma_do_interrupt_msix - handler used for vector-per-channel interrupt mode
 * @irq: interrupt id
 * @data: interrupt data
 */
static irqreturn_t ioat_dma_do_interrupt_msix(int irq, void *data)
{
	struct ioat_dma_chan *ioat_chan = data;

	tasklet_schedule(&ioat_chan->cleanup_task);

	return IRQ_HANDLED;
}

static void ioat_dma_cleanup_tasklet(unsigned long data);

/**
 * ioat_dma_enumerate_channels - find and initialize the device's channels
 * @device: the device to be enumerated
 */
112
static int ioat_dma_enumerate_channels(struct ioatdma_device *device)
113 114 115 116 117 118
{
	u8 xfercap_scale;
	u32 xfercap;
	int i;
	struct ioat_dma_chan *ioat_chan;

119 120
	device->common.chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET);
	xfercap_scale = readb(device->reg_base + IOAT_XFERCAP_OFFSET);
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
	xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale));

	for (i = 0; i < device->common.chancnt; i++) {
		ioat_chan = kzalloc(sizeof(*ioat_chan), GFP_KERNEL);
		if (!ioat_chan) {
			device->common.chancnt = i;
			break;
		}

		ioat_chan->device = device;
		ioat_chan->reg_base = device->reg_base + (0x80 * (i + 1));
		ioat_chan->xfercap = xfercap;
		spin_lock_init(&ioat_chan->cleanup_lock);
		spin_lock_init(&ioat_chan->desc_lock);
		INIT_LIST_HEAD(&ioat_chan->free_desc);
		INIT_LIST_HEAD(&ioat_chan->used_desc);
		/* This should be made common somewhere in dmaengine.c */
		ioat_chan->common.device = &device->common;
		list_add_tail(&ioat_chan->common.device_node,
140
			      &device->common.channels);
141 142 143 144 145
		device->idx[i] = ioat_chan;
		tasklet_init(&ioat_chan->cleanup_task,
			     ioat_dma_cleanup_tasklet,
			     (unsigned long) ioat_chan);
		tasklet_disable(&ioat_chan->cleanup_task);
146 147 148 149
	}
	return device->common.chancnt;
}

150 151 152
static void ioat_set_src(dma_addr_t addr,
			 struct dma_async_tx_descriptor *tx,
			 int index)
153
{
154
	tx_to_ioat_desc(tx)->src = addr;
155 156
}

157 158 159
static void ioat_set_dest(dma_addr_t addr,
			  struct dma_async_tx_descriptor *tx,
			  int index)
160
{
161
	tx_to_ioat_desc(tx)->dst = addr;
162 163
}

164
static dma_cookie_t ioat_tx_submit(struct dma_async_tx_descriptor *tx)
165 166
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan);
167 168 169
	struct ioat_desc_sw *first = tx_to_ioat_desc(tx);
	struct ioat_desc_sw *prev, *new;
	struct ioat_dma_descriptor *hw;
170 171
	int append = 0;
	dma_cookie_t cookie;
172 173 174 175 176 177 178 179 180 181 182 183 184
	LIST_HEAD(new_chain);
	u32 copy;
	size_t len;
	dma_addr_t src, dst;
	int orig_ack;
	unsigned int desc_count = 0;

	/* src and dest and len are stored in the initial descriptor */
	len = first->len;
	src = first->src;
	dst = first->dst;
	orig_ack = first->async_tx.ack;
	new = first;
185 186

	spin_lock_bh(&ioat_chan->desc_lock);
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
	prev = to_ioat_desc(ioat_chan->used_desc.prev);
	prefetch(prev->hw);
	do {
		copy = min((u32) len, ioat_chan->xfercap);

		new->async_tx.ack = 1;

		hw = new->hw;
		hw->size = copy;
		hw->ctl = 0;
		hw->src_addr = src;
		hw->dst_addr = dst;
		hw->next = 0;

		/* chain together the physical address list for the HW */
		wmb();
		prev->hw->next = (u64) new->async_tx.phys;

		len -= copy;
		dst += copy;
		src += copy;

		list_add_tail(&new->node, &new_chain);
		desc_count++;
		prev = new;
	} while (len && (new = ioat_dma_get_next_descriptor(ioat_chan)));

	hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
215 216 217 218 219 220 221 222 223 224 225 226
	if (new->async_tx.callback) {
		hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;
		if (first != new) {
			/* move callback into to last desc */
			new->async_tx.callback = first->async_tx.callback;
			new->async_tx.callback_param
					= first->async_tx.callback_param;
			first->async_tx.callback = NULL;
			first->async_tx.callback_param = NULL;
		}
	}

227 228 229 230 231 232 233 234 235 236
	new->tx_cnt = desc_count;
	new->async_tx.ack = orig_ack; /* client is in control of this ack */

	/* store the original values for use in later cleanup */
	if (new != first) {
		new->src = first->src;
		new->dst = first->dst;
		new->len = first->len;
	}

237 238 239 240 241
	/* cookie incr and addition to used_list must be atomic */
	cookie = ioat_chan->common.cookie;
	cookie++;
	if (cookie < 0)
		cookie = 1;
242
	ioat_chan->common.cookie = new->async_tx.cookie = cookie;
243 244 245

	/* write address into NextDescriptor field of last desc in chain */
	to_ioat_desc(ioat_chan->used_desc.prev)->hw->next =
246 247
							first->async_tx.phys;
	__list_splice(&new_chain, ioat_chan->used_desc.prev);
248

249
	ioat_chan->pending += desc_count;
250 251 252 253 254 255 256 257 258
	if (ioat_chan->pending >= 4) {
		append = 1;
		ioat_chan->pending = 0;
	}
	spin_unlock_bh(&ioat_chan->desc_lock);

	if (append)
		writeb(IOAT_CHANCMD_APPEND,
			ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
S
Shannon Nelson 已提交
259

260 261 262
	return cookie;
}

263
static struct ioat_desc_sw *ioat_dma_alloc_descriptor(
264 265
					struct ioat_dma_chan *ioat_chan,
					gfp_t flags)
266 267 268
{
	struct ioat_dma_descriptor *desc;
	struct ioat_desc_sw *desc_sw;
269
	struct ioatdma_device *ioatdma_device;
270 271
	dma_addr_t phys;

272 273
	ioatdma_device = to_ioatdma_device(ioat_chan->common.device);
	desc = pci_pool_alloc(ioatdma_device->dma_pool, flags, &phys);
274 275 276 277 278
	if (unlikely(!desc))
		return NULL;

	desc_sw = kzalloc(sizeof(*desc_sw), flags);
	if (unlikely(!desc_sw)) {
279
		pci_pool_free(ioatdma_device->dma_pool, desc, phys);
280 281 282 283
		return NULL;
	}

	memset(desc, 0, sizeof(*desc));
284 285 286 287 288
	dma_async_tx_descriptor_init(&desc_sw->async_tx, &ioat_chan->common);
	desc_sw->async_tx.tx_set_src = ioat_set_src;
	desc_sw->async_tx.tx_set_dest = ioat_set_dest;
	desc_sw->async_tx.tx_submit = ioat_tx_submit;
	INIT_LIST_HEAD(&desc_sw->async_tx.tx_list);
289
	desc_sw->hw = desc;
290
	desc_sw->async_tx.phys = phys;
291 292 293 294 295 296 297 298 299 300 301 302 303 304

	return desc_sw;
}

/* returns the actual number of allocated descriptors */
static int ioat_dma_alloc_chan_resources(struct dma_chan *chan)
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
	struct ioat_desc_sw *desc = NULL;
	u16 chanctrl;
	u32 chanerr;
	int i;
	LIST_HEAD(tmp_list);

305 306 307
	/* have we already been set up? */
	if (!list_empty(&ioat_chan->free_desc))
		return INITIAL_IOAT_DESC_COUNT;
308

309
	/* Setup register to interrupt and write completion status on error */
310
	chanctrl = IOAT_CHANCTRL_ERR_INT_EN |
311 312
		IOAT_CHANCTRL_ANY_ERR_ABORT_EN |
		IOAT_CHANCTRL_ERR_COMPLETION_EN;
313
	writew(chanctrl, ioat_chan->reg_base + IOAT_CHANCTRL_OFFSET);
314

315
	chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
316
	if (chanerr) {
317
		dev_err(&ioat_chan->device->pdev->dev,
318
			"CHANERR = %x, clearing\n", chanerr);
319
		writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
320 321 322 323 324 325
	}

	/* Allocate descriptors */
	for (i = 0; i < INITIAL_IOAT_DESC_COUNT; i++) {
		desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_KERNEL);
		if (!desc) {
326
			dev_err(&ioat_chan->device->pdev->dev,
327
				"Only %d initial descriptors\n", i);
328 329 330 331 332 333 334 335 336 337 338 339
			break;
		}
		list_add_tail(&desc->node, &tmp_list);
	}
	spin_lock_bh(&ioat_chan->desc_lock);
	list_splice(&tmp_list, &ioat_chan->free_desc);
	spin_unlock_bh(&ioat_chan->desc_lock);

	/* allocate a completion writeback area */
	/* doing 2 32bit writes to mmio since 1 64b write doesn't work */
	ioat_chan->completion_virt =
		pci_pool_alloc(ioat_chan->device->completion_pool,
340 341
			       GFP_KERNEL,
			       &ioat_chan->completion_addr);
342 343
	memset(ioat_chan->completion_virt, 0,
	       sizeof(*ioat_chan->completion_virt));
344 345 346 347
	writel(((u64) ioat_chan->completion_addr) & 0x00000000FFFFFFFF,
	       ioat_chan->reg_base + IOAT_CHANCMP_OFFSET_LOW);
	writel(((u64) ioat_chan->completion_addr) >> 32,
	       ioat_chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH);
348

349
	tasklet_enable(&ioat_chan->cleanup_task);
350
	ioat_dma_start_null_desc(ioat_chan);
351 352 353 354 355 356
	return i;
}

static void ioat_dma_free_chan_resources(struct dma_chan *chan)
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
357
	struct ioatdma_device *ioatdma_device = to_ioatdma_device(chan->device);
358 359 360
	struct ioat_desc_sw *desc, *_desc;
	int in_use_descs = 0;

361
	tasklet_disable(&ioat_chan->cleanup_task);
362 363
	ioat_dma_memcpy_cleanup(ioat_chan);

364 365 366
	/* Delay 100ms after reset to allow internal DMA logic to quiesce
	 * before removing DMA descriptor resources.
	 */
367
	writeb(IOAT_CHANCMD_RESET, ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
368
	mdelay(100);
369 370 371 372 373

	spin_lock_bh(&ioat_chan->desc_lock);
	list_for_each_entry_safe(desc, _desc, &ioat_chan->used_desc, node) {
		in_use_descs++;
		list_del(&desc->node);
374
		pci_pool_free(ioatdma_device->dma_pool, desc->hw,
375
			      desc->async_tx.phys);
376 377 378 379
		kfree(desc);
	}
	list_for_each_entry_safe(desc, _desc, &ioat_chan->free_desc, node) {
		list_del(&desc->node);
380
		pci_pool_free(ioatdma_device->dma_pool, desc->hw,
381
			      desc->async_tx.phys);
382 383 384 385
		kfree(desc);
	}
	spin_unlock_bh(&ioat_chan->desc_lock);

386
	pci_pool_free(ioatdma_device->completion_pool,
387 388
		      ioat_chan->completion_virt,
		      ioat_chan->completion_addr);
389 390 391

	/* one is ok since we left it on there on purpose */
	if (in_use_descs > 1)
392
		dev_err(&ioat_chan->device->pdev->dev,
393
			"Freeing %d in use descriptors!\n",
394 395 396
			in_use_descs - 1);

	ioat_chan->last_completion = ioat_chan->completion_addr = 0;
397 398
	ioat_chan->pending = 0;
}
399

400 401 402 403 404 405 406 407
/**
 * ioat_dma_get_next_descriptor - return the next available descriptor
 * @ioat_chan: IOAT DMA channel handle
 *
 * Gets the next descriptor from the chain, and must be called with the
 * channel's desc_lock held.  Allocates more descriptors if the channel
 * has run out.
 */
408 409
static struct ioat_desc_sw *
ioat_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan)
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
{
	struct ioat_desc_sw *new = NULL;

	if (!list_empty(&ioat_chan->free_desc)) {
		new = to_ioat_desc(ioat_chan->free_desc.next);
		list_del(&new->node);
	} else {
		/* try to get another desc */
		new = ioat_dma_alloc_descriptor(ioat_chan, GFP_ATOMIC);
		/* will this ever happen? */
		/* TODO add upper limit on these */
		BUG_ON(!new);
	}

	prefetch(new->hw);
	return new;
426 427
}

428 429 430 431
static struct dma_async_tx_descriptor *ioat_dma_prep_memcpy(
						struct dma_chan *chan,
						size_t len,
						int int_en)
432
{
433
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
434
	struct ioat_desc_sw *new;
435 436

	spin_lock_bh(&ioat_chan->desc_lock);
437 438
	new = ioat_dma_get_next_descriptor(ioat_chan);
	new->len = len;
439 440
	spin_unlock_bh(&ioat_chan->desc_lock);

441
	return new ? &new->async_tx : NULL;
442 443 444
}

/**
445 446
 * ioat_dma_memcpy_issue_pending - push potentially unrecognized appended
 *                                 descriptors to hw
447 448 449 450 451 452 453 454
 * @chan: DMA channel handle
 */
static void ioat_dma_memcpy_issue_pending(struct dma_chan *chan)
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);

	if (ioat_chan->pending != 0) {
		ioat_chan->pending = 0;
455 456
		writeb(IOAT_CHANCMD_APPEND,
		       ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
457 458 459
	}
}

460 461 462 463 464 465 466 467
static void ioat_dma_cleanup_tasklet(unsigned long data)
{
	struct ioat_dma_chan *chan = (void *)data;
	ioat_dma_memcpy_cleanup(chan);
	writew(IOAT_CHANCTRL_INT_DISABLE,
	       chan->reg_base + IOAT_CHANCTRL_OFFSET);
}

468
static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
469 470 471 472 473
{
	unsigned long phys_complete;
	struct ioat_desc_sw *desc, *_desc;
	dma_cookie_t cookie = 0;

474
	prefetch(ioat_chan->completion_virt);
475

476
	if (!spin_trylock_bh(&ioat_chan->cleanup_lock))
477 478 479 480 481 482 483 484 485
		return;

	/* The completion writeback can happen at any time,
	   so reads by the driver need to be atomic operations
	   The descriptor physical addresses are limited to 32-bits
	   when the CPU can only do a 32-bit mov */

#if (BITS_PER_LONG == 64)
	phys_complete =
486 487
		ioat_chan->completion_virt->full
		& IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR;
488
#else
489 490
	phys_complete =
		ioat_chan->completion_virt->low & IOAT_LOW_COMPLETION_MASK;
491 492
#endif

493 494
	if ((ioat_chan->completion_virt->full
		& IOAT_CHANSTS_DMA_TRANSFER_STATUS) ==
495 496
				IOAT_CHANSTS_DMA_TRANSFER_STATUS_HALTED) {
		dev_err(&ioat_chan->device->pdev->dev,
497
			"Channel halted, chanerr = %x\n",
498
			readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET));
499 500 501 502

		/* TODO do something to salvage the situation */
	}

503
	if (phys_complete == ioat_chan->last_completion) {
504
		spin_unlock_bh(&ioat_chan->cleanup_lock);
505 506 507
		return;
	}

508
	cookie = 0;
509 510
	spin_lock_bh(&ioat_chan->desc_lock);
	list_for_each_entry_safe(desc, _desc, &ioat_chan->used_desc, node) {
511 512 513 514 515 516

		/*
		 * Incoming DMA requests may use multiple descriptors, due to
		 * exceeding xfercap, perhaps. If so, only the last one will
		 * have a cookie, and require unmapping.
		 */
517 518
		if (desc->async_tx.cookie) {
			cookie = desc->async_tx.cookie;
519

520 521 522 523 524
			/*
			 * yes we are unmapping both _page and _single alloc'd
			 * regions with unmap_page. Is this *really* that bad?
			 */
			pci_unmap_page(ioat_chan->device->pdev,
525
					pci_unmap_addr(desc, dst),
526
					pci_unmap_len(desc, len),
527
					PCI_DMA_FROMDEVICE);
528
			pci_unmap_page(ioat_chan->device->pdev,
529
					pci_unmap_addr(desc, src),
530
					pci_unmap_len(desc, len),
531
					PCI_DMA_TODEVICE);
532 533 534 535 536
			if (desc->async_tx.callback) {
				desc->async_tx.callback(
						desc->async_tx.callback_param);
				desc->async_tx.callback = NULL;
			}
537 538
		}

539
		if (desc->async_tx.phys != phys_complete) {
540 541
			/*
			 * a completed entry, but not the last, so cleanup
542 543 544 545
			 * if the client is done with the descriptor
			 */
			if (desc->async_tx.ack) {
				list_del(&desc->node);
546 547
				list_add_tail(&desc->node,
					      &ioat_chan->free_desc);
548 549
			} else
				desc->async_tx.cookie = 0;
550
		} else {
551 552 553 554
			/*
			 * last used desc. Do not remove, so we can append from
			 * it, but don't look at it next time, either
			 */
555
			desc->async_tx.cookie = 0;
556 557 558 559 560 561

			/* TODO check status bits? */
			break;
		}
	}

562
	spin_unlock_bh(&ioat_chan->desc_lock);
563

564
	ioat_chan->last_completion = phys_complete;
565
	if (cookie != 0)
566
		ioat_chan->completed_cookie = cookie;
567

568
	spin_unlock_bh(&ioat_chan->cleanup_lock);
569 570
}

571 572 573 574 575 576 577 578 579 580 581
static void ioat_dma_dependency_added(struct dma_chan *chan)
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
	spin_lock_bh(&ioat_chan->desc_lock);
	if (ioat_chan->pending == 0) {
		spin_unlock_bh(&ioat_chan->desc_lock);
		ioat_dma_memcpy_cleanup(ioat_chan);
	} else
		spin_unlock_bh(&ioat_chan->desc_lock);
}

582 583 584 585
/**
 * ioat_dma_is_complete - poll the status of a IOAT DMA transaction
 * @chan: IOAT DMA channel handle
 * @cookie: DMA transaction identifier
586 587
 * @done: if not %NULL, updated with last completed transaction
 * @used: if not %NULL, updated with last used transaction
588 589
 */
static enum dma_status ioat_dma_is_complete(struct dma_chan *chan,
590 591 592
					    dma_cookie_t cookie,
					    dma_cookie_t *done,
					    dma_cookie_t *used)
593 594 595 596 597 598 599 600 601 602
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
	dma_cookie_t last_used;
	dma_cookie_t last_complete;
	enum dma_status ret;

	last_used = chan->cookie;
	last_complete = ioat_chan->completed_cookie;

	if (done)
603
		*done = last_complete;
604 605 606 607 608 609 610 611 612 613 614 615 616
	if (used)
		*used = last_used;

	ret = dma_async_is_complete(cookie, last_complete, last_used);
	if (ret == DMA_SUCCESS)
		return ret;

	ioat_dma_memcpy_cleanup(ioat_chan);

	last_used = chan->cookie;
	last_complete = ioat_chan->completed_cookie;

	if (done)
617
		*done = last_complete;
618 619 620 621 622 623 624 625
	if (used)
		*used = last_used;

	return dma_async_is_complete(cookie, last_complete, last_used);
}

/* PCI API */

626
static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
627 628 629 630 631
{
	struct ioat_desc_sw *desc;

	spin_lock_bh(&ioat_chan->desc_lock);

632
	desc = ioat_dma_get_next_descriptor(ioat_chan);
633 634 635
	desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL
				| IOAT_DMA_DESCRIPTOR_CTL_INT_GN
				| IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
636
	desc->hw->next = 0;
637 638 639
	desc->hw->size = 0;
	desc->hw->src_addr = 0;
	desc->hw->dst_addr = 0;
640
	desc->async_tx.ack = 1;
641 642 643 644

	list_add_tail(&desc->node, &ioat_chan->used_desc);
	spin_unlock_bh(&ioat_chan->desc_lock);

645
	writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF,
646
	       ioat_chan->reg_base + IOAT_CHAINADDR_OFFSET_LOW);
647
	writel(((u64) desc->async_tx.phys) >> 32,
648 649
	       ioat_chan->reg_base + IOAT_CHAINADDR_OFFSET_HIGH);

650
	writeb(IOAT_CHANCMD_START, ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
651 652 653 654 655 656 657
}

/*
 * Perform a IOAT transaction to verify the HW works.
 */
#define IOAT_TEST_SIZE 2000

658 659 660 661 662 663
static void ioat_dma_test_callback(void *dma_async_param)
{
	printk(KERN_ERR "ioatdma: ioat_dma_test_callback(%p)\n",
			dma_async_param);
}

664 665 666 667 668
/**
 * ioat_dma_self_test - Perform a IOAT transaction to verify the HW works.
 * @device: device to be tested
 */
static int ioat_dma_self_test(struct ioatdma_device *device)
669 670 671 672 673
{
	int i;
	u8 *src;
	u8 *dest;
	struct dma_chan *dma_chan;
674
	struct dma_async_tx_descriptor *tx = NULL;
675
	dma_addr_t addr;
676 677 678
	dma_cookie_t cookie;
	int err = 0;

679
	src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
680 681
	if (!src)
		return -ENOMEM;
682
	dest = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
683 684 685 686 687 688 689 690 691 692 693
	if (!dest) {
		kfree(src);
		return -ENOMEM;
	}

	/* Fill in src buffer */
	for (i = 0; i < IOAT_TEST_SIZE; i++)
		src[i] = (u8)i;

	/* Start copy, using first DMA channel */
	dma_chan = container_of(device->common.channels.next,
694 695
				struct dma_chan,
				device_node);
696
	if (ioat_dma_alloc_chan_resources(dma_chan) < 1) {
697 698
		dev_err(&device->pdev->dev,
			"selftest cannot allocate chan resource\n");
699 700 701 702
		err = -ENODEV;
		goto out;
	}

703
	tx = ioat_dma_prep_memcpy(dma_chan, IOAT_TEST_SIZE, 0);
704 705 706 707 708 709 710
	if (!tx) {
		dev_err(&device->pdev->dev,
			"Self-test prep failed, disabling\n");
		err = -ENODEV;
		goto free_resources;
	}

711 712 713 714 715 716 717
	async_tx_ack(tx);
	addr = dma_map_single(dma_chan->device->dev, src, IOAT_TEST_SIZE,
			DMA_TO_DEVICE);
	ioat_set_src(addr, tx, 0);
	addr = dma_map_single(dma_chan->device->dev, dest, IOAT_TEST_SIZE,
			DMA_FROM_DEVICE);
	ioat_set_dest(addr, tx, 0);
718 719
	tx->callback = ioat_dma_test_callback;
	tx->callback_param = (void *)0x8086;
720
	cookie = ioat_tx_submit(tx);
721 722 723 724 725 726
	if (cookie < 0) {
		dev_err(&device->pdev->dev,
			"Self-test setup failed, disabling\n");
		err = -ENODEV;
		goto free_resources;
	}
727 728 729 730
	ioat_dma_memcpy_issue_pending(dma_chan);
	msleep(1);

	if (ioat_dma_is_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) {
731
		dev_err(&device->pdev->dev,
732
			"Self-test copy timed out, disabling\n");
733 734 735 736
		err = -ENODEV;
		goto free_resources;
	}
	if (memcmp(src, dest, IOAT_TEST_SIZE)) {
737
		dev_err(&device->pdev->dev,
738
			"Self-test copy failed compare, disabling\n");
739 740 741 742 743 744 745 746 747 748 749 750
		err = -ENODEV;
		goto free_resources;
	}

free_resources:
	ioat_dma_free_chan_resources(dma_chan);
out:
	kfree(src);
	kfree(dest);
	return err;
}

751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775
static char ioat_interrupt_style[32] = "msix";
module_param_string(ioat_interrupt_style, ioat_interrupt_style,
		    sizeof(ioat_interrupt_style), 0644);
MODULE_PARM_DESC(ioat_interrupt_style,
		 "set ioat interrupt style: msix (default), "
		 "msix-single-vector, msi, intx)");

/**
 * ioat_dma_setup_interrupts - setup interrupt handler
 * @device: ioat device
 */
static int ioat_dma_setup_interrupts(struct ioatdma_device *device)
{
	struct ioat_dma_chan *ioat_chan;
	int err, i, j, msixcnt;
	u8 intrctrl = 0;

	if (!strcmp(ioat_interrupt_style, "msix"))
		goto msix;
	if (!strcmp(ioat_interrupt_style, "msix-single-vector"))
		goto msix_single_vector;
	if (!strcmp(ioat_interrupt_style, "msi"))
		goto msi;
	if (!strcmp(ioat_interrupt_style, "intx"))
		goto intx;
776 777 778
	dev_err(&device->pdev->dev, "invalid ioat_interrupt_style %s\n",
		ioat_interrupt_style);
	goto err_no_irq;
779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908

msix:
	/* The number of MSI-X vectors should equal the number of channels */
	msixcnt = device->common.chancnt;
	for (i = 0; i < msixcnt; i++)
		device->msix_entries[i].entry = i;

	err = pci_enable_msix(device->pdev, device->msix_entries, msixcnt);
	if (err < 0)
		goto msi;
	if (err > 0)
		goto msix_single_vector;

	for (i = 0; i < msixcnt; i++) {
		ioat_chan = ioat_lookup_chan_by_index(device, i);
		err = request_irq(device->msix_entries[i].vector,
				  ioat_dma_do_interrupt_msix,
				  0, "ioat-msix", ioat_chan);
		if (err) {
			for (j = 0; j < i; j++) {
				ioat_chan =
					ioat_lookup_chan_by_index(device, j);
				free_irq(device->msix_entries[j].vector,
					 ioat_chan);
			}
			goto msix_single_vector;
		}
	}
	intrctrl |= IOAT_INTRCTRL_MSIX_VECTOR_CONTROL;
	device->irq_mode = msix_multi_vector;
	goto done;

msix_single_vector:
	device->msix_entries[0].entry = 0;
	err = pci_enable_msix(device->pdev, device->msix_entries, 1);
	if (err)
		goto msi;

	err = request_irq(device->msix_entries[0].vector, ioat_dma_do_interrupt,
			  0, "ioat-msix", device);
	if (err) {
		pci_disable_msix(device->pdev);
		goto msi;
	}
	device->irq_mode = msix_single_vector;
	goto done;

msi:
	err = pci_enable_msi(device->pdev);
	if (err)
		goto intx;

	err = request_irq(device->pdev->irq, ioat_dma_do_interrupt,
			  0, "ioat-msi", device);
	if (err) {
		pci_disable_msi(device->pdev);
		goto intx;
	}
	/*
	 * CB 1.2 devices need a bit set in configuration space to enable MSI
	 */
	if (device->version == IOAT_VER_1_2) {
		u32 dmactrl;
		pci_read_config_dword(device->pdev,
				      IOAT_PCI_DMACTRL_OFFSET, &dmactrl);
		dmactrl |= IOAT_PCI_DMACTRL_MSI_EN;
		pci_write_config_dword(device->pdev,
				       IOAT_PCI_DMACTRL_OFFSET, dmactrl);
	}
	device->irq_mode = msi;
	goto done;

intx:
	err = request_irq(device->pdev->irq, ioat_dma_do_interrupt,
			  IRQF_SHARED, "ioat-intx", device);
	if (err)
		goto err_no_irq;
	device->irq_mode = intx;

done:
	intrctrl |= IOAT_INTRCTRL_MASTER_INT_EN;
	writeb(intrctrl, device->reg_base + IOAT_INTRCTRL_OFFSET);
	return 0;

err_no_irq:
	/* Disable all interrupt generation */
	writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET);
	dev_err(&device->pdev->dev, "no usable interrupts\n");
	device->irq_mode = none;
	return -1;
}

/**
 * ioat_dma_remove_interrupts - remove whatever interrupts were set
 * @device: ioat device
 */
static void ioat_dma_remove_interrupts(struct ioatdma_device *device)
{
	struct ioat_dma_chan *ioat_chan;
	int i;

	/* Disable all interrupt generation */
	writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET);

	switch (device->irq_mode) {
	case msix_multi_vector:
		for (i = 0; i < device->common.chancnt; i++) {
			ioat_chan = ioat_lookup_chan_by_index(device, i);
			free_irq(device->msix_entries[i].vector, ioat_chan);
		}
		pci_disable_msix(device->pdev);
		break;
	case msix_single_vector:
		free_irq(device->msix_entries[0].vector, device);
		pci_disable_msix(device->pdev);
		break;
	case msi:
		free_irq(device->pdev->irq, device);
		pci_disable_msi(device->pdev);
		break;
	case intx:
		free_irq(device->pdev->irq, device);
		break;
	case none:
		dev_warn(&device->pdev->dev,
			 "call to %s without interrupts setup\n", __func__);
	}
	device->irq_mode = none;
}

909 910
struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
				      void __iomem *iobase)
911 912
{
	int err;
913
	struct ioatdma_device *device;
914 915 916 917 918 919

	device = kzalloc(sizeof(*device), GFP_KERNEL);
	if (!device) {
		err = -ENOMEM;
		goto err_kzalloc;
	}
920 921 922
	device->pdev = pdev;
	device->reg_base = iobase;
	device->version = readb(device->reg_base + IOAT_VER_OFFSET);
923 924 925

	/* DMA coherent memory pool for DMA descriptor allocations */
	device->dma_pool = pci_pool_create("dma_desc_pool", pdev,
926 927
					   sizeof(struct ioat_dma_descriptor),
					   64, 0);
928 929 930 931 932
	if (!device->dma_pool) {
		err = -ENOMEM;
		goto err_dma_pool;
	}

933 934 935
	device->completion_pool = pci_pool_create("completion_pool", pdev,
						  sizeof(u64), SMP_CACHE_BYTES,
						  SMP_CACHE_BYTES);
936 937 938 939 940 941
	if (!device->completion_pool) {
		err = -ENOMEM;
		goto err_completion_pool;
	}

	INIT_LIST_HEAD(&device->common.channels);
942
	ioat_dma_enumerate_channels(device);
943

944
	dma_cap_set(DMA_MEMCPY, device->common.cap_mask);
945 946 947 948
	device->common.device_alloc_chan_resources =
						ioat_dma_alloc_chan_resources;
	device->common.device_free_chan_resources =
						ioat_dma_free_chan_resources;
949 950 951 952 953
	device->common.device_prep_dma_memcpy = ioat_dma_prep_memcpy;
	device->common.device_is_tx_complete = ioat_dma_is_complete;
	device->common.device_issue_pending = ioat_dma_memcpy_issue_pending;
	device->common.device_dependency_added = ioat_dma_dependency_added;
	device->common.dev = &pdev->dev;
954
	dev_err(&device->pdev->dev,
955 956 957
		"Intel(R) I/OAT DMA Engine found,"
		" %d channels, device version 0x%02x, driver version %s\n",
		device->common.chancnt, device->version, IOAT_DMA_VERSION);
958

959
	err = ioat_dma_setup_interrupts(device);
960
	if (err)
961
		goto err_setup_interrupts;
962

963
	err = ioat_dma_self_test(device);
964 965 966 967 968
	if (err)
		goto err_self_test;

	dma_async_device_register(&device->common);

969
	return device;
970 971

err_self_test:
972 973
	ioat_dma_remove_interrupts(device);
err_setup_interrupts:
974 975 976 977 978 979
	pci_pool_destroy(device->completion_pool);
err_completion_pool:
	pci_pool_destroy(device->dma_pool);
err_dma_pool:
	kfree(device);
err_kzalloc:
980
	dev_err(&device->pdev->dev,
981
		"Intel(R) I/OAT DMA Engine initialization failed\n");
982
	return NULL;
D
Dan Aloni 已提交
983 984
}

985
void ioat_dma_remove(struct ioatdma_device *device)
986 987 988 989
{
	struct dma_chan *chan, *_chan;
	struct ioat_dma_chan *ioat_chan;

990
	ioat_dma_remove_interrupts(device);
991

992 993
	dma_async_device_unregister(&device->common);

994 995
	pci_pool_destroy(device->dma_pool);
	pci_pool_destroy(device->completion_pool);
996

S
Shannon Nelson 已提交
997 998 999 1000
	iounmap(device->reg_base);
	pci_release_regions(device->pdev);
	pci_disable_device(device->pdev);

1001 1002
	list_for_each_entry_safe(chan, _chan,
				 &device->common.channels, device_node) {
1003 1004 1005 1006 1007 1008 1009
		ioat_chan = to_ioat_chan(chan);
		list_del(&chan->device_node);
		kfree(ioat_chan);
	}
	kfree(device);
}