pci_sun4v.c 23.6 KB
Newer Older
1 2
/* pci_sun4v.c: SUN4V specific PCI controller support.
 *
3
 * Copyright (C) 2006, 2007, 2008 David S. Miller (davem@davemloft.net)
4 5 6 7 8 9 10 11
 */

#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
12
#include <linux/percpu.h>
13 14
#include <linux/irq.h>
#include <linux/msi.h>
15
#include <linux/log2.h>
16 17 18 19 20 21 22

#include <asm/iommu.h>
#include <asm/irq.h>
#include <asm/upa.h>
#include <asm/pstate.h>
#include <asm/oplib.h>
#include <asm/hypervisor.h>
23
#include <asm/prom.h>
24 25 26 27

#include "pci_impl.h"
#include "iommu_common.h"

28 29
#include "pci_sun4v.h"

30 31 32
static unsigned long vpci_major = 1;
static unsigned long vpci_minor = 1;

33
#define PGLIST_NENTS	(PAGE_SIZE / sizeof(u64))
34

35
struct iommu_batch {
36
	struct device	*dev;		/* Device mapping is for.	*/
37 38 39 40
	unsigned long	prot;		/* IOMMU page protections	*/
	unsigned long	entry;		/* Index into IOTSB.		*/
	u64		*pglist;	/* List of physical pages	*/
	unsigned long	npages;		/* Number of pages in list.	*/
41 42
};

43
static DEFINE_PER_CPU(struct iommu_batch, iommu_batch);
44 45

/* Interrupts must be disabled.  */
46
static inline void iommu_batch_start(struct device *dev, unsigned long prot, unsigned long entry)
47
{
48
	struct iommu_batch *p = &__get_cpu_var(iommu_batch);
49

50
	p->dev		= dev;
51 52 53 54 55 56
	p->prot		= prot;
	p->entry	= entry;
	p->npages	= 0;
}

/* Interrupts must be disabled.  */
57
static long iommu_batch_flush(struct iommu_batch *p)
58
{
59
	struct pci_pbm_info *pbm = p->dev->archdata.host_controller;
60
	unsigned long devhandle = pbm->devhandle;
61 62 63 64 65
	unsigned long prot = p->prot;
	unsigned long entry = p->entry;
	u64 *pglist = p->pglist;
	unsigned long npages = p->npages;

66
	while (npages != 0) {
67 68 69 70 71 72
		long num;

		num = pci_sun4v_iommu_map(devhandle, HV_PCI_TSBID(0, entry),
					  npages, prot, __pa(pglist));
		if (unlikely(num < 0)) {
			if (printk_ratelimit())
73
				printk("iommu_batch_flush: IOMMU map of "
74 75 76 77 78 79 80 81 82 83
				       "[%08lx:%08lx:%lx:%lx:%lx] failed with "
				       "status %ld\n",
				       devhandle, HV_PCI_TSBID(0, entry),
				       npages, prot, __pa(pglist), num);
			return -1;
		}

		entry += num;
		npages -= num;
		pglist += num;
84
	}
85 86 87 88 89 90 91

	p->entry = entry;
	p->npages = 0;

	return 0;
}

92 93 94 95 96 97 98 99 100 101 102
static inline void iommu_batch_new_entry(unsigned long entry)
{
	struct iommu_batch *p = &__get_cpu_var(iommu_batch);

	if (p->entry + p->npages == entry)
		return;
	if (p->entry != ~0UL)
		iommu_batch_flush(p);
	p->entry = entry;
}

103
/* Interrupts must be disabled.  */
104
static inline long iommu_batch_add(u64 phys_page)
105
{
106
	struct iommu_batch *p = &__get_cpu_var(iommu_batch);
107 108 109 110 111

	BUG_ON(p->npages >= PGLIST_NENTS);

	p->pglist[p->npages++] = phys_page;
	if (p->npages == PGLIST_NENTS)
112
		return iommu_batch_flush(p);
113 114 115 116 117

	return 0;
}

/* Interrupts must be disabled.  */
118
static inline long iommu_batch_end(void)
119
{
120
	struct iommu_batch *p = &__get_cpu_var(iommu_batch);
121 122 123

	BUG_ON(p->npages >= PGLIST_NENTS);

124
	return iommu_batch_flush(p);
125
}
126

127 128
static void *dma_4v_alloc_coherent(struct device *dev, size_t size,
				   dma_addr_t *dma_addrp, gfp_t gfp)
129
{
130
	unsigned long flags, order, first_page, npages, n;
131 132
	struct iommu *iommu;
	struct page *page;
133 134
	void *ret;
	long entry;
135
	int nid;
136 137 138

	size = IO_PAGE_ALIGN(size);
	order = get_order(size);
139
	if (unlikely(order >= MAX_ORDER))
140 141 142 143
		return NULL;

	npages = size >> IO_PAGE_SHIFT;

144 145 146
	nid = dev->archdata.numa_node;
	page = alloc_pages_node(nid, gfp, order);
	if (unlikely(!page))
147
		return NULL;
148

149
	first_page = (unsigned long) page_address(page);
150 151
	memset((char *)first_page, 0, PAGE_SIZE << order);

152
	iommu = dev->archdata.iommu;
153 154

	spin_lock_irqsave(&iommu->lock, flags);
155
	entry = iommu_range_alloc(dev, iommu, npages, NULL);
156 157
	spin_unlock_irqrestore(&iommu->lock, flags);

158 159
	if (unlikely(entry == DMA_ERROR_CODE))
		goto range_alloc_fail;
160 161 162 163 164 165

	*dma_addrp = (iommu->page_table_map_base +
		      (entry << IO_PAGE_SHIFT));
	ret = (void *) first_page;
	first_page = __pa(first_page);

166
	local_irq_save(flags);
167

168 169 170 171
	iommu_batch_start(dev,
			  (HV_PCI_MAP_ATTR_READ |
			   HV_PCI_MAP_ATTR_WRITE),
			  entry);
172

173
	for (n = 0; n < npages; n++) {
174
		long err = iommu_batch_add(first_page + (n * PAGE_SIZE));
175 176 177
		if (unlikely(err < 0L))
			goto iommu_map_fail;
	}
178

179
	if (unlikely(iommu_batch_end() < 0L))
180
		goto iommu_map_fail;
181

182
	local_irq_restore(flags);
183 184

	return ret;
185 186 187 188

iommu_map_fail:
	/* Interrupts are disabled.  */
	spin_lock(&iommu->lock);
189
	iommu_range_free(iommu, *dma_addrp, npages);
190 191
	spin_unlock_irqrestore(&iommu->lock, flags);

192
range_alloc_fail:
193 194
	free_pages(first_page, order);
	return NULL;
195 196
}

197 198
static void dma_4v_free_coherent(struct device *dev, size_t size, void *cpu,
				 dma_addr_t dvma)
199
{
200
	struct pci_pbm_info *pbm;
201
	struct iommu *iommu;
202 203
	unsigned long flags, order, npages, entry;
	u32 devhandle;
204 205

	npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT;
206 207
	iommu = dev->archdata.iommu;
	pbm = dev->archdata.host_controller;
208
	devhandle = pbm->devhandle;
209 210 211 212
	entry = ((dvma - iommu->page_table_map_base) >> IO_PAGE_SHIFT);

	spin_lock_irqsave(&iommu->lock, flags);

213
	iommu_range_free(iommu, dvma, npages);
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228

	do {
		unsigned long num;

		num = pci_sun4v_iommu_demap(devhandle, HV_PCI_TSBID(0, entry),
					    npages);
		entry += num;
		npages -= num;
	} while (npages != 0);

	spin_unlock_irqrestore(&iommu->lock, flags);

	order = get_order(size);
	if (order < 10)
		free_pages((unsigned long)cpu, order);
229 230
}

231 232
static dma_addr_t dma_4v_map_single(struct device *dev, void *ptr, size_t sz,
				    enum dma_data_direction direction)
233
{
234
	struct iommu *iommu;
235
	unsigned long flags, npages, oaddr;
236
	unsigned long i, base_paddr;
237
	u32 bus_addr, ret;
238 239 240
	unsigned long prot;
	long entry;

241
	iommu = dev->archdata.iommu;
242

243
	if (unlikely(direction == DMA_NONE))
244 245 246 247 248 249 250
		goto bad;

	oaddr = (unsigned long)ptr;
	npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK);
	npages >>= IO_PAGE_SHIFT;

	spin_lock_irqsave(&iommu->lock, flags);
251
	entry = iommu_range_alloc(dev, iommu, npages, NULL);
252 253
	spin_unlock_irqrestore(&iommu->lock, flags);

254
	if (unlikely(entry == DMA_ERROR_CODE))
255 256 257 258 259 260 261
		goto bad;

	bus_addr = (iommu->page_table_map_base +
		    (entry << IO_PAGE_SHIFT));
	ret = bus_addr | (oaddr & ~IO_PAGE_MASK);
	base_paddr = __pa(oaddr & IO_PAGE_MASK);
	prot = HV_PCI_MAP_ATTR_READ;
262
	if (direction != DMA_TO_DEVICE)
263 264
		prot |= HV_PCI_MAP_ATTR_WRITE;

265
	local_irq_save(flags);
266

267
	iommu_batch_start(dev, prot, entry);
268

269
	for (i = 0; i < npages; i++, base_paddr += IO_PAGE_SIZE) {
270
		long err = iommu_batch_add(base_paddr);
271 272 273
		if (unlikely(err < 0L))
			goto iommu_map_fail;
	}
274
	if (unlikely(iommu_batch_end() < 0L))
275
		goto iommu_map_fail;
276

277
	local_irq_restore(flags);
278 279 280 281 282 283

	return ret;

bad:
	if (printk_ratelimit())
		WARN_ON(1);
284
	return DMA_ERROR_CODE;
285 286 287 288

iommu_map_fail:
	/* Interrupts are disabled.  */
	spin_lock(&iommu->lock);
289
	iommu_range_free(iommu, bus_addr, npages);
290 291
	spin_unlock_irqrestore(&iommu->lock, flags);

292
	return DMA_ERROR_CODE;
293 294
}

295 296
static void dma_4v_unmap_single(struct device *dev, dma_addr_t bus_addr,
				size_t sz, enum dma_data_direction direction)
297
{
298
	struct pci_pbm_info *pbm;
299
	struct iommu *iommu;
300
	unsigned long flags, npages;
301
	long entry;
302
	u32 devhandle;
303

304
	if (unlikely(direction == DMA_NONE)) {
305 306 307 308 309
		if (printk_ratelimit())
			WARN_ON(1);
		return;
	}

310 311
	iommu = dev->archdata.iommu;
	pbm = dev->archdata.host_controller;
312
	devhandle = pbm->devhandle;
313 314 315 316 317 318 319

	npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK);
	npages >>= IO_PAGE_SHIFT;
	bus_addr &= IO_PAGE_MASK;

	spin_lock_irqsave(&iommu->lock, flags);

320
	iommu_range_free(iommu, bus_addr, npages);
321

322
	entry = (bus_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT;
323 324 325 326 327 328 329 330 331 332 333 334
	do {
		unsigned long num;

		num = pci_sun4v_iommu_demap(devhandle, HV_PCI_TSBID(0, entry),
					    npages);
		entry += num;
		npages -= num;
	} while (npages != 0);

	spin_unlock_irqrestore(&iommu->lock, flags);
}

335 336
static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
			 int nelems, enum dma_data_direction direction)
337
{
338 339 340 341
	struct scatterlist *s, *outs, *segstart;
	unsigned long flags, handle, prot;
	dma_addr_t dma_next = 0, dma_addr;
	unsigned int max_seg_size;
342
	unsigned long seg_boundary_size;
343
	int outcount, incount, i;
344
	struct iommu *iommu;
345
	unsigned long base_shift;
346 347 348
	long err;

	BUG_ON(direction == DMA_NONE);
349

350
	iommu = dev->archdata.iommu;
351 352
	if (nelems == 0 || !iommu)
		return 0;
353
	
354 355 356
	prot = HV_PCI_MAP_ATTR_READ;
	if (direction != DMA_TO_DEVICE)
		prot |= HV_PCI_MAP_ATTR_WRITE;
357

358 359 360 361
	outs = s = segstart = &sglist[0];
	outcount = 1;
	incount = nelems;
	handle = 0;
362

363 364
	/* Init first segment length for backout at failure */
	outs->dma_length = 0;
365

366
	spin_lock_irqsave(&iommu->lock, flags);
367

368
	iommu_batch_start(dev, prot, ~0UL);
369

370
	max_seg_size = dma_get_max_seg_size(dev);
371 372 373
	seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1,
				  IO_PAGE_SIZE) >> IO_PAGE_SHIFT;
	base_shift = iommu->page_table_map_base >> IO_PAGE_SHIFT;
374
	for_each_sg(sglist, s, nelems, i) {
375
		unsigned long paddr, npages, entry, out_entry = 0, slen;
376

377 378 379 380 381 382 383 384 385 386
		slen = s->length;
		/* Sanity check */
		if (slen == 0) {
			dma_next = 0;
			continue;
		}
		/* Allocate iommu entries for that segment */
		paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s);
		npages = iommu_num_pages(paddr, slen);
		entry = iommu_range_alloc(dev, iommu, npages, &handle);
387

388 389 390 391 392 393 394
		/* Handle failure */
		if (unlikely(entry == DMA_ERROR_CODE)) {
			if (printk_ratelimit())
				printk(KERN_INFO "iommu_alloc failed, iommu %p paddr %lx"
				       " npages %lx\n", iommu, paddr, npages);
			goto iommu_map_failed;
		}
395

396
		iommu_batch_new_entry(entry);
397

398 399 400 401
		/* Convert entry to a dma_addr_t */
		dma_addr = iommu->page_table_map_base +
			(entry << IO_PAGE_SHIFT);
		dma_addr |= (s->offset & ~IO_PAGE_MASK);
402

403
		/* Insert into HW table */
404
		paddr &= IO_PAGE_MASK;
405
		while (npages--) {
406
			err = iommu_batch_add(paddr);
407
			if (unlikely(err < 0L))
408
				goto iommu_map_failed;
409 410 411 412 413 414 415 416 417
			paddr += IO_PAGE_SIZE;
		}

		/* If we are in an open segment, try merging */
		if (segstart != s) {
			/* We cannot merge if:
			 * - allocated dma_addr isn't contiguous to previous allocation
			 */
			if ((dma_addr != dma_next) ||
418 419 420
			    (outs->dma_length + s->length > max_seg_size) ||
			    (is_span_boundary(out_entry, base_shift,
					      seg_boundary_size, outs, s))) {
421 422 423 424 425 426
				/* Can't merge: create a new segment */
				segstart = s;
				outcount++;
				outs = sg_next(outs);
			} else {
				outs->dma_length += s->length;
427
			}
428
		}
429

430 431 432 433
		if (segstart == s) {
			/* This is a new segment, fill entries */
			outs->dma_address = dma_addr;
			outs->dma_length = slen;
434
			out_entry = entry;
435
		}
436 437 438

		/* Calculate next page pointer for contiguous check */
		dma_next = dma_addr + slen;
439 440 441 442
	}

	err = iommu_batch_end();

443 444
	if (unlikely(err < 0L))
		goto iommu_map_failed;
445

446
	spin_unlock_irqrestore(&iommu->lock, flags);
447

448 449 450 451 452 453 454
	if (outcount < incount) {
		outs = sg_next(outs);
		outs->dma_address = DMA_ERROR_CODE;
		outs->dma_length = 0;
	}

	return outcount;
455 456

iommu_map_failed:
457 458 459 460 461 462 463 464 465 466 467 468 469 470
	for_each_sg(sglist, s, nelems, i) {
		if (s->dma_length != 0) {
			unsigned long vaddr, npages;

			vaddr = s->dma_address & IO_PAGE_MASK;
			npages = iommu_num_pages(s->dma_address, s->dma_length);
			iommu_range_free(iommu, vaddr, npages);
			/* XXX demap? XXX */
			s->dma_address = DMA_ERROR_CODE;
			s->dma_length = 0;
		}
		if (s == outs)
			break;
	}
471 472 473
	spin_unlock_irqrestore(&iommu->lock, flags);

	return 0;
474 475
}

476 477
static void dma_4v_unmap_sg(struct device *dev, struct scatterlist *sglist,
			    int nelems, enum dma_data_direction direction)
478
{
479
	struct pci_pbm_info *pbm;
480
	struct scatterlist *sg;
481
	struct iommu *iommu;
482 483
	unsigned long flags;
	u32 devhandle;
484

485
	BUG_ON(direction == DMA_NONE);
486

487 488
	iommu = dev->archdata.iommu;
	pbm = dev->archdata.host_controller;
489
	devhandle = pbm->devhandle;
490 491 492
	
	spin_lock_irqsave(&iommu->lock, flags);

493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
	sg = sglist;
	while (nelems--) {
		dma_addr_t dma_handle = sg->dma_address;
		unsigned int len = sg->dma_length;
		unsigned long npages, entry;

		if (!len)
			break;
		npages = iommu_num_pages(dma_handle, len);
		iommu_range_free(iommu, dma_handle, npages);

		entry = ((dma_handle - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
		while (npages) {
			unsigned long num;

			num = pci_sun4v_iommu_demap(devhandle, HV_PCI_TSBID(0, entry),
						    npages);
			entry += num;
			npages -= num;
		}
513

514 515
		sg = sg_next(sg);
	}
516 517

	spin_unlock_irqrestore(&iommu->lock, flags);
518 519
}

520 521 522
static void dma_4v_sync_single_for_cpu(struct device *dev,
				       dma_addr_t bus_addr, size_t sz,
				       enum dma_data_direction direction)
523
{
524
	/* Nothing to do... */
525 526
}

527 528 529
static void dma_4v_sync_sg_for_cpu(struct device *dev,
				   struct scatterlist *sglist, int nelems,
				   enum dma_data_direction direction)
530
{
531
	/* Nothing to do... */
532 533
}

534 535 536 537 538 539 540 541 542
const struct dma_ops sun4v_dma_ops = {
	.alloc_coherent			= dma_4v_alloc_coherent,
	.free_coherent			= dma_4v_free_coherent,
	.map_single			= dma_4v_map_single,
	.unmap_single			= dma_4v_unmap_single,
	.map_sg				= dma_4v_map_sg,
	.unmap_sg			= dma_4v_unmap_sg,
	.sync_single_for_cpu		= dma_4v_sync_single_for_cpu,
	.sync_sg_for_cpu		= dma_4v_sync_sg_for_cpu,
543 544
};

545
static void __init pci_sun4v_scan_bus(struct pci_pbm_info *pbm)
546
{
547 548 549
	struct property *prop;
	struct device_node *dp;

550 551 552 553
	dp = pbm->prom_node;
	prop = of_find_property(dp, "66mhz-capable", NULL);
	pbm->is_66mhz_capable = (prop != NULL);
	pbm->pci_bus = pci_scan_one_pbm(pbm);
554 555

	/* XXX register error interrupt handlers XXX */
556 557
}

558 559
static unsigned long __init probe_existing_entries(struct pci_pbm_info *pbm,
						   struct iommu *iommu)
560
{
561
	struct iommu_arena *arena = &iommu->arena;
562
	unsigned long i, cnt = 0;
563
	u32 devhandle;
564 565 566 567 568 569 570 571

	devhandle = pbm->devhandle;
	for (i = 0; i < arena->limit; i++) {
		unsigned long ret, io_attrs, ra;

		ret = pci_sun4v_iommu_getmap(devhandle,
					     HV_PCI_TSBID(0, i),
					     &io_attrs, &ra);
572
		if (ret == HV_EOK) {
573 574 575 576 577 578 579
			if (page_in_phys_avail(ra)) {
				pci_sun4v_iommu_demap(devhandle,
						      HV_PCI_TSBID(0, i), 1);
			} else {
				cnt++;
				__set_bit(i, arena->map);
			}
580
		}
581
	}
582 583

	return cnt;
584 585
}

586
static void __init pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
587
{
588
	struct iommu *iommu = pbm->iommu;
589
	struct property *prop;
590
	unsigned long num_tsb_entries, sz, tsbsize;
591
	u32 vdma[2], dma_mask, dma_offset;
592 593 594 595

	prop = of_find_property(pbm->prom_node, "virtual-dma", NULL);
	if (prop) {
		u32 *val = prop->value;
596

597 598 599
		vdma[0] = val[0];
		vdma[1] = val[1];
	} else {
600 601 602 603 604
		/* No property, use default values. */
		vdma[0] = 0x80000000;
		vdma[1] = 0x80000000;
	}

605 606 607 608
	if ((vdma[0] | vdma[1]) & ~IO_PAGE_MASK) {
		prom_printf("PCI-SUN4V: strange virtual-dma[%08x:%08x].\n",
			    vdma[0], vdma[1]);
		prom_halt();
609 610
	};

611 612 613
	dma_mask = (roundup_pow_of_two(vdma[1]) - 1UL);
	num_tsb_entries = vdma[1] / IO_PAGE_SIZE;
	tsbsize = num_tsb_entries * sizeof(iopte_t);
614 615 616 617 618 619 620 621 622 623

	dma_offset = vdma[0];

	/* Setup initial software IOMMU state. */
	spin_lock_init(&iommu->lock);
	iommu->ctx_lowest_free = 1;
	iommu->page_table_map_base = dma_offset;
	iommu->dma_addr_mask = dma_mask;

	/* Allocate and initialize the free area map.  */
624
	sz = (num_tsb_entries + 7) / 8;
625
	sz = (sz + 7UL) & ~7UL;
626
	iommu->arena.map = kzalloc(sz, GFP_KERNEL);
627 628 629 630 631 632
	if (!iommu->arena.map) {
		prom_printf("PCI_IOMMU: Error, kmalloc(arena.map) failed.\n");
		prom_halt();
	}
	iommu->arena.limit = num_tsb_entries;

633
	sz = probe_existing_entries(pbm, iommu);
634 635 636
	if (sz)
		printk("%s: Imported %lu TSB entries from OBP\n",
		       pbm->name, sz);
637 638
}

639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
#ifdef CONFIG_PCI_MSI
struct pci_sun4v_msiq_entry {
	u64		version_type;
#define MSIQ_VERSION_MASK		0xffffffff00000000UL
#define MSIQ_VERSION_SHIFT		32
#define MSIQ_TYPE_MASK			0x00000000000000ffUL
#define MSIQ_TYPE_SHIFT			0
#define MSIQ_TYPE_NONE			0x00
#define MSIQ_TYPE_MSG			0x01
#define MSIQ_TYPE_MSI32			0x02
#define MSIQ_TYPE_MSI64			0x03
#define MSIQ_TYPE_INTX			0x08
#define MSIQ_TYPE_NONE2			0xff

	u64		intx_sysino;
	u64		reserved1;
	u64		stick;
	u64		req_id;  /* bus/device/func */
#define MSIQ_REQID_BUS_MASK		0xff00UL
#define MSIQ_REQID_BUS_SHIFT		8
#define MSIQ_REQID_DEVICE_MASK		0x00f8UL
#define MSIQ_REQID_DEVICE_SHIFT		3
#define MSIQ_REQID_FUNC_MASK		0x0007UL
#define MSIQ_REQID_FUNC_SHIFT		0

	u64		msi_address;

S
Simon Arlott 已提交
666
	/* The format of this value is message type dependent.
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
	 * For MSI bits 15:0 are the data from the MSI packet.
	 * For MSI-X bits 31:0 are the data from the MSI packet.
	 * For MSG, the message code and message routing code where:
	 * 	bits 39:32 is the bus/device/fn of the msg target-id
	 *	bits 18:16 is the message routing code
	 *	bits 7:0 is the message code
	 * For INTx the low order 2-bits are:
	 *	00 - INTA
	 *	01 - INTB
	 *	10 - INTC
	 *	11 - INTD
	 */
	u64		msi_data;

	u64		reserved2;
};

684 685
static int pci_sun4v_get_head(struct pci_pbm_info *pbm, unsigned long msiqid,
			      unsigned long *head)
686
{
687
	unsigned long err, limit;
688

689
	err = pci_sun4v_msiq_gethead(pbm->devhandle, msiqid, head);
690
	if (unlikely(err))
691
		return -ENXIO;
692

693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
	limit = pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry);
	if (unlikely(*head >= limit))
		return -EFBIG;

	return 0;
}

static int pci_sun4v_dequeue_msi(struct pci_pbm_info *pbm,
				 unsigned long msiqid, unsigned long *head,
				 unsigned long *msi)
{
	struct pci_sun4v_msiq_entry *ep;
	unsigned long err, type;

	/* Note: void pointer arithmetic, 'head' is a byte offset  */
	ep = (pbm->msi_queues + ((msiqid - pbm->msiq_first) *
				 (pbm->msiq_ent_count *
				  sizeof(struct pci_sun4v_msiq_entry))) +
	      *head);

	if ((ep->version_type & MSIQ_TYPE_MASK) == 0)
		return 0;
715

716 717 718 719
	type = (ep->version_type & MSIQ_TYPE_MASK) >> MSIQ_TYPE_SHIFT;
	if (unlikely(type != MSIQ_TYPE_MSI32 &&
		     type != MSIQ_TYPE_MSI64))
		return -EINVAL;
720

721 722 723 724 725 726 727
	*msi = ep->msi_data;

	err = pci_sun4v_msi_setstate(pbm->devhandle,
				     ep->msi_data /* msi_num */,
				     HV_MSISTATE_IDLE);
	if (unlikely(err))
		return -ENXIO;
728

729 730
	/* Clear the entry.  */
	ep->version_type &= ~MSIQ_TYPE_MASK;
731

732 733 734 735
	(*head) += sizeof(struct pci_sun4v_msiq_entry);
	if (*head >=
	    (pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry)))
		*head = 0;
736

737
	return 1;
738 739
}

740 741
static int pci_sun4v_set_head(struct pci_pbm_info *pbm, unsigned long msiqid,
			      unsigned long head)
742
{
743
	unsigned long err;
744

745 746 747
	err = pci_sun4v_msiq_sethead(pbm->devhandle, msiqid, head);
	if (unlikely(err))
		return -EINVAL;
748

749 750
	return 0;
}
751

752 753 754 755 756 757 758 759 760 761 762
static int pci_sun4v_msi_setup(struct pci_pbm_info *pbm, unsigned long msiqid,
			       unsigned long msi, int is_msi64)
{
	if (pci_sun4v_msi_setmsiq(pbm->devhandle, msi, msiqid,
				  (is_msi64 ?
				   HV_MSITYPE_MSI64 : HV_MSITYPE_MSI32)))
		return -ENXIO;
	if (pci_sun4v_msi_setstate(pbm->devhandle, msi, HV_MSISTATE_IDLE))
		return -ENXIO;
	if (pci_sun4v_msi_setvalid(pbm->devhandle, msi, HV_MSIVALID_VALID))
		return -ENXIO;
763 764 765
	return 0;
}

766
static int pci_sun4v_msi_teardown(struct pci_pbm_info *pbm, unsigned long msi)
767
{
768 769 770 771 772 773 774 775 776
	unsigned long err, msiqid;

	err = pci_sun4v_msi_getmsiq(pbm->devhandle, msi, &msiqid);
	if (err)
		return -ENXIO;

	pci_sun4v_msi_setvalid(pbm->devhandle, msi, HV_MSIVALID_INVALID);

	return 0;
777 778
}

779
static int pci_sun4v_msiq_alloc(struct pci_pbm_info *pbm)
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
{
	unsigned long q_size, alloc_size, pages, order;
	int i;

	q_size = pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry);
	alloc_size = (pbm->msiq_num * q_size);
	order = get_order(alloc_size);
	pages = __get_free_pages(GFP_KERNEL | __GFP_COMP, order);
	if (pages == 0UL) {
		printk(KERN_ERR "MSI: Cannot allocate MSI queues (o=%lu).\n",
		       order);
		return -ENOMEM;
	}
	memset((char *)pages, 0, PAGE_SIZE << order);
	pbm->msi_queues = (void *) pages;

	for (i = 0; i < pbm->msiq_num; i++) {
		unsigned long err, base = __pa(pages + (i * q_size));
		unsigned long ret1, ret2;

		err = pci_sun4v_msiq_conf(pbm->devhandle,
					  pbm->msiq_first + i,
					  base, pbm->msiq_ent_count);
		if (err) {
			printk(KERN_ERR "MSI: msiq register fails (err=%lu)\n",
			       err);
			goto h_error;
		}

		err = pci_sun4v_msiq_info(pbm->devhandle,
					  pbm->msiq_first + i,
					  &ret1, &ret2);
		if (err) {
			printk(KERN_ERR "MSI: Cannot read msiq (err=%lu)\n",
			       err);
			goto h_error;
		}
		if (ret1 != base || ret2 != pbm->msiq_ent_count) {
			printk(KERN_ERR "MSI: Bogus qconf "
			       "expected[%lx:%x] got[%lx:%lx]\n",
			       base, pbm->msiq_ent_count,
			       ret1, ret2);
			goto h_error;
		}
	}

	return 0;

h_error:
	free_pages(pages, order);
	return -EINVAL;
}

833
static void pci_sun4v_msiq_free(struct pci_pbm_info *pbm)
834
{
835
	unsigned long q_size, alloc_size, pages, order;
836 837
	int i;

838 839
	for (i = 0; i < pbm->msiq_num; i++) {
		unsigned long msiqid = pbm->msiq_first + i;
840

841
		(void) pci_sun4v_msiq_conf(pbm->devhandle, msiqid, 0UL, 0);
842
	}
843

844 845 846
	q_size = pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry);
	alloc_size = (pbm->msiq_num * q_size);
	order = get_order(alloc_size);
847

848
	pages = (unsigned long) pbm->msi_queues;
849

850
	free_pages(pages, order);
851

852
	pbm->msi_queues = NULL;
853 854
}

855 856 857
static int pci_sun4v_msiq_build_irq(struct pci_pbm_info *pbm,
				    unsigned long msiqid,
				    unsigned long devino)
858
{
859
	unsigned int virt_irq = sun4v_build_irq(pbm->devhandle, devino);
860

861 862
	if (!virt_irq)
		return -ENOMEM;
863

864 865 866 867
	if (pci_sun4v_msiq_setstate(pbm->devhandle, msiqid, HV_MSIQSTATE_IDLE))
		return -EINVAL;
	if (pci_sun4v_msiq_setvalid(pbm->devhandle, msiqid, HV_MSIQ_VALID))
		return -EINVAL;
868

869
	return virt_irq;
870
}
871

872 873 874 875 876 877 878 879 880 881 882
static const struct sparc64_msiq_ops pci_sun4v_msiq_ops = {
	.get_head	=	pci_sun4v_get_head,
	.dequeue_msi	=	pci_sun4v_dequeue_msi,
	.set_head	=	pci_sun4v_set_head,
	.msi_setup	=	pci_sun4v_msi_setup,
	.msi_teardown	=	pci_sun4v_msi_teardown,
	.msiq_alloc	=	pci_sun4v_msiq_alloc,
	.msiq_free	=	pci_sun4v_msiq_free,
	.msiq_build_irq	=	pci_sun4v_msiq_build_irq,
};

883 884
static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
{
885
	sparc64_pbm_msi_init(pbm, &pci_sun4v_msiq_ops);
886
}
887 888 889 890 891 892
#else /* CONFIG_PCI_MSI */
static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
{
}
#endif /* !(CONFIG_PCI_MSI) */

893 894
static void __init pci_sun4v_pbm_init(struct pci_controller_info *p,
				      struct device_node *dp, u32 devhandle)
895 896 897
{
	struct pci_pbm_info *pbm;

D
David S. Miller 已提交
898 899 900 901
	if (devhandle & 0x40)
		pbm = &p->pbm_B;
	else
		pbm = &p->pbm_A;
902

903 904 905
	pbm->next = pci_pbm_root;
	pci_pbm_root = pbm;

906 907
	pbm->numa_node = of_node_to_nid(dp);

908
	pbm->scan_bus = pci_sun4v_scan_bus;
909 910
	pbm->pci_ops = &sun4v_pci_ops;
	pbm->config_space_reg_bits = 12;
911

912 913
	pbm->index = pci_num_pbms++;

914
	pbm->parent = p;
915
	pbm->prom_node = dp;
916

D
David S. Miller 已提交
917
	pbm->devhandle = devhandle;
918

919
	pbm->name = dp->full_name;
920

921
	printk("%s: SUN4V PCI Bus Module\n", pbm->name);
922
	printk("%s: On NUMA node %d\n", pbm->name, pbm->numa_node);
923

924
	pci_determine_mem_io_space(pbm);
925

926
	pci_get_pbm_props(pbm);
927
	pci_sun4v_iommu_init(pbm);
928
	pci_sun4v_msi_init(pbm);
929 930
}

931
void __init sun4v_pci_init(struct device_node *dp, char *model_name)
932
{
933
	static int hvapi_negotiated = 0;
934
	struct pci_controller_info *p;
935
	struct pci_pbm_info *pbm;
936
	struct iommu *iommu;
937 938
	struct property *prop;
	struct linux_prom64_registers *regs;
939 940
	u32 devhandle;
	int i;
D
David S. Miller 已提交
941

942 943 944 945 946 947 948 949 950 951 952 953
	if (!hvapi_negotiated++) {
		int err = sun4v_hvapi_register(HV_GRP_PCI,
					       vpci_major,
					       &vpci_minor);

		if (err) {
			prom_printf("SUN4V_PCI: Could not register hvapi, "
				    "err=%d\n", err);
			prom_halt();
		}
		printk("SUN4V_PCI: Registered hvapi major[%lu] minor[%lu]\n",
		       vpci_major, vpci_minor);
954 955

		dma_ops = &sun4v_dma_ops;
956 957
	}

958
	prop = of_find_property(dp, "reg", NULL);
959 960 961 962
	if (!prop) {
		prom_printf("SUN4V_PCI: Could not find config registers\n");
		prom_halt();
	}
963 964 965
	regs = prop->value;

	devhandle = (regs->phys_addr >> 32UL) & 0x0fffffff;
D
David S. Miller 已提交
966

967
	for (pbm = pci_pbm_root; pbm; pbm = pbm->next) {
968
		if (pbm->devhandle == (devhandle ^ 0x40)) {
969
			pci_sun4v_pbm_init(pbm->parent, dp, devhandle);
970 971
			return;
		}
D
David S. Miller 已提交
972
	}
973

974
	for_each_possible_cpu(i) {
975 976 977 978 979
		unsigned long page = get_zeroed_page(GFP_ATOMIC);

		if (!page)
			goto fatal_memory_error;

980
		per_cpu(iommu_batch, i).pglist = (u64 *) page;
981
	}
982

983
	p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
984 985 986
	if (!p)
		goto fatal_memory_error;

987
	iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
988 989 990
	if (!iommu)
		goto fatal_memory_error;

991 992
	p->pbm_A.iommu = iommu;

993
	iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
994 995 996
	if (!iommu)
		goto fatal_memory_error;

997 998
	p->pbm_B.iommu = iommu;

999
	pci_sun4v_pbm_init(p, dp, devhandle);
1000 1001 1002 1003 1004
	return;

fatal_memory_error:
	prom_printf("SUN4V_PCI: Fatal memory allocation error.\n");
	prom_halt();
1005
}