ioat_dma.c 20.2 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 int ioat_dma_enumerate_channels(struct ioatdma_device *device)
51 52 53 54 55 56
{
	u8 xfercap_scale;
	u32 xfercap;
	int i;
	struct ioat_dma_chan *ioat_chan;

57 58
	device->common.chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET);
	xfercap_scale = readb(device->reg_base + IOAT_XFERCAP_OFFSET);
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
	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,
78
			      &device->common.channels);
79 80 81 82
	}
	return device->common.chancnt;
}

83 84 85
static void ioat_set_src(dma_addr_t addr,
			 struct dma_async_tx_descriptor *tx,
			 int index)
86 87 88 89 90 91 92 93 94 95 96 97 98
{
	struct ioat_desc_sw *iter, *desc = tx_to_ioat_desc(tx);
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan);

	pci_unmap_addr_set(desc, src, addr);

	list_for_each_entry(iter, &desc->async_tx.tx_list, node) {
		iter->hw->src_addr = addr;
		addr += ioat_chan->xfercap;
	}

}

99 100 101
static void ioat_set_dest(dma_addr_t addr,
			  struct dma_async_tx_descriptor *tx,
			  int index)
102 103 104 105 106 107 108 109 110 111 112 113
{
	struct ioat_desc_sw *iter, *desc = tx_to_ioat_desc(tx);
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan);

	pci_unmap_addr_set(desc, dst, addr);

	list_for_each_entry(iter, &desc->async_tx.tx_list, node) {
		iter->hw->dst_addr = addr;
		addr += ioat_chan->xfercap;
	}
}

114
static dma_cookie_t ioat_tx_submit(struct dma_async_tx_descriptor *tx)
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan);
	struct ioat_desc_sw *desc = tx_to_ioat_desc(tx);
	int append = 0;
	dma_cookie_t cookie;
	struct ioat_desc_sw *group_start;

	group_start = list_entry(desc->async_tx.tx_list.next,
				 struct ioat_desc_sw, node);
	spin_lock_bh(&ioat_chan->desc_lock);
	/* cookie incr and addition to used_list must be atomic */
	cookie = ioat_chan->common.cookie;
	cookie++;
	if (cookie < 0)
		cookie = 1;
	ioat_chan->common.cookie = desc->async_tx.cookie = cookie;

	/* write address into NextDescriptor field of last desc in chain */
	to_ioat_desc(ioat_chan->used_desc.prev)->hw->next =
						group_start->async_tx.phys;
	list_splice_init(&desc->async_tx.tx_list, ioat_chan->used_desc.prev);

	ioat_chan->pending += desc->tx_cnt;
	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 已提交
147

148 149 150
	return cookie;
}

151
static struct ioat_desc_sw *ioat_dma_alloc_descriptor(
152 153
					struct ioat_dma_chan *ioat_chan,
					gfp_t flags)
154 155 156
{
	struct ioat_dma_descriptor *desc;
	struct ioat_desc_sw *desc_sw;
157
	struct ioatdma_device *ioatdma_device;
158 159
	dma_addr_t phys;

160 161
	ioatdma_device = to_ioatdma_device(ioat_chan->common.device);
	desc = pci_pool_alloc(ioatdma_device->dma_pool, flags, &phys);
162 163 164 165 166
	if (unlikely(!desc))
		return NULL;

	desc_sw = kzalloc(sizeof(*desc_sw), flags);
	if (unlikely(!desc_sw)) {
167
		pci_pool_free(ioatdma_device->dma_pool, desc, phys);
168 169 170 171
		return NULL;
	}

	memset(desc, 0, sizeof(*desc));
172 173 174 175 176
	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);
177
	desc_sw->hw = desc;
178
	desc_sw->async_tx.phys = phys;
179 180 181 182 183 184 185 186 187 188 189 190 191 192

	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);

193 194 195
	/* have we already been set up? */
	if (!list_empty(&ioat_chan->free_desc))
		return INITIAL_IOAT_DESC_COUNT;
196

197
	/* Setup register to interrupt and write completion status on error */
198
	chanctrl = IOAT_CHANCTRL_ERR_INT_EN |
199 200
		IOAT_CHANCTRL_ANY_ERR_ABORT_EN |
		IOAT_CHANCTRL_ERR_COMPLETION_EN;
201
	writew(chanctrl, ioat_chan->reg_base + IOAT_CHANCTRL_OFFSET);
202

203
	chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
204
	if (chanerr) {
205 206
		dev_err(&ioat_chan->device->pdev->dev,
			"ioatdma: CHANERR = %x, clearing\n", chanerr);
207
		writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
208 209 210 211 212 213
	}

	/* Allocate descriptors */
	for (i = 0; i < INITIAL_IOAT_DESC_COUNT; i++) {
		desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_KERNEL);
		if (!desc) {
214 215
			dev_err(&ioat_chan->device->pdev->dev,
				"ioatdma: Only %d initial descriptors\n", i);
216 217 218 219 220 221 222 223 224 225 226 227
			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,
228 229
			       GFP_KERNEL,
			       &ioat_chan->completion_addr);
230 231
	memset(ioat_chan->completion_virt, 0,
	       sizeof(*ioat_chan->completion_virt));
232 233 234 235
	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);
236

237
	ioat_dma_start_null_desc(ioat_chan);
238 239 240 241 242 243
	return i;
}

static void ioat_dma_free_chan_resources(struct dma_chan *chan)
{
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
244
	struct ioatdma_device *ioatdma_device = to_ioatdma_device(chan->device);
245 246 247 248 249
	struct ioat_desc_sw *desc, *_desc;
	int in_use_descs = 0;

	ioat_dma_memcpy_cleanup(ioat_chan);

250
	writeb(IOAT_CHANCMD_RESET, ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
251 252 253 254 255

	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);
256
		pci_pool_free(ioatdma_device->dma_pool, desc->hw,
257
			      desc->async_tx.phys);
258 259 260 261
		kfree(desc);
	}
	list_for_each_entry_safe(desc, _desc, &ioat_chan->free_desc, node) {
		list_del(&desc->node);
262
		pci_pool_free(ioatdma_device->dma_pool, desc->hw,
263
			      desc->async_tx.phys);
264 265 266 267
		kfree(desc);
	}
	spin_unlock_bh(&ioat_chan->desc_lock);

268
	pci_pool_free(ioatdma_device->completion_pool,
269 270
		      ioat_chan->completion_virt,
		      ioat_chan->completion_addr);
271 272 273

	/* one is ok since we left it on there on purpose */
	if (in_use_descs > 1)
274 275
		dev_err(&ioat_chan->device->pdev->dev,
			"ioatdma: Freeing %d in use descriptors!\n",
276 277 278 279 280
			in_use_descs - 1);

	ioat_chan->last_completion = ioat_chan->completion_addr = 0;
}

281 282 283 284
static struct dma_async_tx_descriptor *ioat_dma_prep_memcpy(
						struct dma_chan *chan,
						size_t len,
						int int_en)
285
{
286 287
	struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
	struct ioat_desc_sw *first, *prev, *new;
288 289 290
	LIST_HEAD(new_chain);
	u32 copy;
	size_t orig_len;
291
	int desc_count = 0;
292 293

	if (!len)
294
		return NULL;
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317

	orig_len = len;

	first = NULL;
	prev = NULL;

	spin_lock_bh(&ioat_chan->desc_lock);
	while (len) {
		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);
		}

		copy = min((u32) len, ioat_chan->xfercap);

		new->hw->size = copy;
		new->hw->ctl = 0;
318 319
		new->async_tx.cookie = 0;
		new->async_tx.ack = 1;
320 321 322 323 324

		/* chain together the physical address list for the HW */
		if (!first)
			first = new;
		else
325
			prev->hw->next = (u64) new->async_tx.phys;
326 327 328 329 330 331 332

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

333
	list_splice(&new_chain, &new->async_tx.tx_list);
334

335 336 337 338 339
	new->hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
	new->hw->next = 0;
	new->tx_cnt = desc_count;
	new->async_tx.ack = 0; /* client is in control of this ack */
	new->async_tx.cookie = -EBUSY;
340

341
	pci_unmap_len_set(new, len, orig_len);
342 343
	spin_unlock_bh(&ioat_chan->desc_lock);

344
	return new ? &new->async_tx : NULL;
345 346 347
}

/**
348 349
 * ioat_dma_memcpy_issue_pending - push potentially unrecognized appended
 *                                 descriptors to hw
350 351 352 353 354 355 356 357
 * @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;
358 359
		writeb(IOAT_CHANCMD_APPEND,
		       ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
360 361 362
	}
}

363
static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
364 365 366 367 368
{
	unsigned long phys_complete;
	struct ioat_desc_sw *desc, *_desc;
	dma_cookie_t cookie = 0;

369
	prefetch(ioat_chan->completion_virt);
370

371
	if (!spin_trylock(&ioat_chan->cleanup_lock))
372 373 374 375 376 377 378 379 380
		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 =
381
	ioat_chan->completion_virt->full & IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR;
382
#else
383
	phys_complete = ioat_chan->completion_virt->low & IOAT_LOW_COMPLETION_MASK;
384 385
#endif

386 387 388 389 390
	if ((ioat_chan->completion_virt->full & IOAT_CHANSTS_DMA_TRANSFER_STATUS) ==
				IOAT_CHANSTS_DMA_TRANSFER_STATUS_HALTED) {
		dev_err(&ioat_chan->device->pdev->dev,
			"ioatdma: Channel halted, chanerr = %x\n",
			readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET));
391 392 393 394

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

395 396
	if (phys_complete == ioat_chan->last_completion) {
		spin_unlock(&ioat_chan->cleanup_lock);
397 398 399
		return;
	}

400 401
	spin_lock_bh(&ioat_chan->desc_lock);
	list_for_each_entry_safe(desc, _desc, &ioat_chan->used_desc, node) {
402 403 404 405 406 407

		/*
		 * 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.
		 */
408 409
		if (desc->async_tx.cookie) {
			cookie = desc->async_tx.cookie;
410

411 412 413 414 415
			/*
			 * 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,
416
					pci_unmap_addr(desc, dst),
417
					pci_unmap_len(desc, len),
418
					PCI_DMA_FROMDEVICE);
419
			pci_unmap_page(ioat_chan->device->pdev,
420
					pci_unmap_addr(desc, src),
421
					pci_unmap_len(desc, len),
422 423 424
					PCI_DMA_TODEVICE);
		}

425
		if (desc->async_tx.phys != phys_complete) {
426 427
			/*
			 * a completed entry, but not the last, so cleanup
428 429 430 431
			 * if the client is done with the descriptor
			 */
			if (desc->async_tx.ack) {
				list_del(&desc->node);
432 433
				list_add_tail(&desc->node,
					      &ioat_chan->free_desc);
434 435
			} else
				desc->async_tx.cookie = 0;
436
		} else {
437 438 439 440
			/*
			 * last used desc. Do not remove, so we can append from
			 * it, but don't look at it next time, either
			 */
441
			desc->async_tx.cookie = 0;
442 443 444 445 446 447

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

448
	spin_unlock_bh(&ioat_chan->desc_lock);
449

450
	ioat_chan->last_completion = phys_complete;
451
	if (cookie != 0)
452
		ioat_chan->completed_cookie = cookie;
453

454
	spin_unlock(&ioat_chan->cleanup_lock);
455 456
}

457 458 459 460 461 462 463 464 465 466 467
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);
}

468 469 470 471
/**
 * ioat_dma_is_complete - poll the status of a IOAT DMA transaction
 * @chan: IOAT DMA channel handle
 * @cookie: DMA transaction identifier
472 473
 * @done: if not %NULL, updated with last completed transaction
 * @used: if not %NULL, updated with last used transaction
474 475
 */
static enum dma_status ioat_dma_is_complete(struct dma_chan *chan,
476 477 478
					    dma_cookie_t cookie,
					    dma_cookie_t *done,
					    dma_cookie_t *used)
479 480 481 482 483 484 485 486 487 488
{
	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)
489
		*done = last_complete;
490 491 492 493 494 495 496 497 498 499 500 501 502
	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)
503
		*done = last_complete;
504 505 506 507 508 509 510 511
	if (used)
		*used = last_used;

	return dma_async_is_complete(cookie, last_complete, last_used);
}

/* PCI API */

512
static irqreturn_t ioat_do_interrupt(int irq, void *data)
513
{
514
	struct ioatdma_device *instance = data;
515 516 517
	unsigned long attnstatus;
	u8 intrctrl;

518
	intrctrl = readb(instance->reg_base + IOAT_INTRCTRL_OFFSET);
519 520 521 522 523

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

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

528
	attnstatus = readl(instance->reg_base + IOAT_ATTNSTATUS_OFFSET);
529

530
	printk(KERN_ERR "ioatdma: interrupt! status %lx\n", attnstatus);
531

532
	writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET);
533 534 535
	return IRQ_HANDLED;
}

536
static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
{
	struct ioat_desc_sw *desc;

	spin_lock_bh(&ioat_chan->desc_lock);

	if (!list_empty(&ioat_chan->free_desc)) {
		desc = to_ioat_desc(ioat_chan->free_desc.next);
		list_del(&desc->node);
	} else {
		/* try to get another desc */
		spin_unlock_bh(&ioat_chan->desc_lock);
		desc = ioat_dma_alloc_descriptor(ioat_chan, GFP_KERNEL);
		spin_lock_bh(&ioat_chan->desc_lock);
		/* will this ever happen? */
		BUG_ON(!desc);
	}

	desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL;
	desc->hw->next = 0;
556
	desc->async_tx.ack = 1;
557 558 559 560

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

561
	writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF,
562
	       ioat_chan->reg_base + IOAT_CHAINADDR_OFFSET_LOW);
563
	writel(((u64) desc->async_tx.phys) >> 32,
564 565
	       ioat_chan->reg_base + IOAT_CHAINADDR_OFFSET_HIGH);

566
	writeb(IOAT_CHANCMD_START, ioat_chan->reg_base + IOAT_CHANCMD_OFFSET);
567 568 569 570 571 572 573
}

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

574
static int ioat_self_test(struct ioatdma_device *device)
575 576 577 578 579
{
	int i;
	u8 *src;
	u8 *dest;
	struct dma_chan *dma_chan;
580 581
	struct dma_async_tx_descriptor *tx;
	dma_addr_t addr;
582 583 584
	dma_cookie_t cookie;
	int err = 0;

585
	src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
586 587
	if (!src)
		return -ENOMEM;
588
	dest = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
589 590 591 592 593 594 595 596 597 598 599
	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,
600 601
				struct dma_chan,
				device_node);
602
	if (ioat_dma_alloc_chan_resources(dma_chan) < 1) {
603 604
		dev_err(&device->pdev->dev,
			"selftest cannot allocate chan resource\n");
605 606 607 608
		err = -ENODEV;
		goto out;
	}

609 610 611 612 613 614 615 616 617
	tx = ioat_dma_prep_memcpy(dma_chan, IOAT_TEST_SIZE, 0);
	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);
	cookie = ioat_tx_submit(tx);
618 619 620 621
	ioat_dma_memcpy_issue_pending(dma_chan);
	msleep(1);

	if (ioat_dma_is_complete(dma_chan, cookie, NULL, NULL) != DMA_SUCCESS) {
622 623
		dev_err(&device->pdev->dev,
			"ioatdma: Self-test copy timed out, disabling\n");
624 625 626 627
		err = -ENODEV;
		goto free_resources;
	}
	if (memcmp(src, dest, IOAT_TEST_SIZE)) {
628 629
		dev_err(&device->pdev->dev,
			"ioatdma: Self-test copy failed compare, disabling\n");
630 631 632 633 634 635 636 637 638 639 640 641
		err = -ENODEV;
		goto free_resources;
	}

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

642 643
struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
				      void __iomem *iobase)
644 645
{
	int err;
646
	struct ioatdma_device *device;
647 648 649 650 651 652

	device = kzalloc(sizeof(*device), GFP_KERNEL);
	if (!device) {
		err = -ENOMEM;
		goto err_kzalloc;
	}
653 654 655
	device->pdev = pdev;
	device->reg_base = iobase;
	device->version = readb(device->reg_base + IOAT_VER_OFFSET);
656 657 658

	/* DMA coherent memory pool for DMA descriptor allocations */
	device->dma_pool = pci_pool_create("dma_desc_pool", pdev,
659 660
					   sizeof(struct ioat_dma_descriptor),
					   64, 0);
661 662 663 664 665
	if (!device->dma_pool) {
		err = -ENOMEM;
		goto err_dma_pool;
	}

666 667 668
	device->completion_pool = pci_pool_create("completion_pool", pdev,
						  sizeof(u64), SMP_CACHE_BYTES,
						  SMP_CACHE_BYTES);
669 670 671 672 673 674
	if (!device->completion_pool) {
		err = -ENOMEM;
		goto err_completion_pool;
	}

	INIT_LIST_HEAD(&device->common.channels);
675
	ioat_dma_enumerate_channels(device);
676

677
	dma_cap_set(DMA_MEMCPY, device->common.cap_mask);
678 679 680 681
	device->common.device_alloc_chan_resources =
						ioat_dma_alloc_chan_resources;
	device->common.device_free_chan_resources =
						ioat_dma_free_chan_resources;
682 683 684 685 686
	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;
687 688 689 690 691 692 693 694 695 696 697 698 699
	printk(KERN_INFO "ioatdma: Intel(R) I/OAT DMA Engine found,"
	       " %d channels, device version 0x%02x\n",
	       device->common.chancnt, device->version);

	pci_set_drvdata(pdev, device);
	err = request_irq(pdev->irq, &ioat_do_interrupt, IRQF_SHARED, "ioat",
		device);
	if (err)
		goto err_irq;

	writeb(IOAT_INTRCTRL_MASTER_INT_EN,
	       device->reg_base + IOAT_INTRCTRL_OFFSET);
	pci_set_master(pdev);
700 701 702 703 704 705 706

	err = ioat_self_test(device);
	if (err)
		goto err_self_test;

	dma_async_device_register(&device->common);

707
	return device;
708 709

err_self_test:
710
	free_irq(device->pdev->irq, device);
711 712 713 714 715 716 717
err_irq:
	pci_pool_destroy(device->completion_pool);
err_completion_pool:
	pci_pool_destroy(device->dma_pool);
err_dma_pool:
	kfree(device);
err_kzalloc:
718 719 720 721
	iounmap(iobase);
	printk(KERN_ERR
	       "ioatdma: Intel(R) I/OAT DMA Engine initialization failed\n");
	return NULL;
D
Dan Aloni 已提交
722 723
}

724
void ioat_dma_remove(struct ioatdma_device *device)
725 726 727 728 729 730 731
{
	struct dma_chan *chan, *_chan;
	struct ioat_dma_chan *ioat_chan;

	dma_async_device_unregister(&device->common);

	free_irq(device->pdev->irq, device);
732

733 734
	pci_pool_destroy(device->dma_pool);
	pci_pool_destroy(device->completion_pool);
735

736 737
	list_for_each_entry_safe(chan, _chan,
				 &device->common.channels, device_node) {
738 739 740 741 742 743 744
		ioat_chan = to_ioat_chan(chan);
		list_del(&chan->device_node);
		kfree(ioat_chan);
	}
	kfree(device);
}