pci.c 21.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Support PCI/PCIe on PowerNV platforms
 *
 * Copyright 2011 Benjamin Herrenschmidt, IBM Corp.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/io.h>
19
#include <linux/msi.h>
20
#include <linux/iommu.h>
21 22 23 24 25 26

#include <asm/sections.h>
#include <asm/io.h>
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#include <asm/machdep.h>
27
#include <asm/msi_bitmap.h>
28 29 30 31
#include <asm/ppc-pci.h>
#include <asm/opal.h>
#include <asm/iommu.h>
#include <asm/tce.h>
32
#include <asm/firmware.h>
33 34
#include <asm/eeh_event.h>
#include <asm/eeh.h>
35 36 37 38

#include "powernv.h"
#include "pci.h"

39 40
/* Delay in usec */
#define PCI_RESET_DELAY_US	3000000
41 42 43 44

#define cfg_dbg(fmt...)	do { } while(0)
//#define cfg_dbg(fmt...)	printk(fmt)

45
#ifdef CONFIG_PCI_MSI
46
int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
47 48 49 50 51
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
	struct msi_desc *entry;
	struct msi_msg msg;
52 53
	int hwirq;
	unsigned int virq;
54 55
	int rc;

56 57 58
	if (WARN_ON(!phb) || !phb->msi_bmp.bitmap)
		return -ENODEV;

59
	if (pdev->no_64bit_msi && !phb->msi32_support)
60 61
		return -ENODEV;

62
	for_each_pci_msi_entry(entry, pdev) {
63 64 65 66 67
		if (!entry->msi_attrib.is_64 && !phb->msi32_support) {
			pr_warn("%s: Supports only 64-bit MSIs\n",
				pci_name(pdev));
			return -ENXIO;
		}
68 69
		hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, 1);
		if (hwirq < 0) {
70 71 72 73
			pr_warn("%s: Failed to find a free MSI\n",
				pci_name(pdev));
			return -ENOSPC;
		}
74
		virq = irq_create_mapping(NULL, phb->msi_base + hwirq);
75 76 77
		if (virq == NO_IRQ) {
			pr_warn("%s: Failed to map MSI to linux irq\n",
				pci_name(pdev));
78
			msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, 1);
79 80
			return -ENOMEM;
		}
81
		rc = phb->msi_setup(phb, pdev, phb->msi_base + hwirq,
82
				    virq, entry->msi_attrib.is_64, &msg);
83 84 85
		if (rc) {
			pr_warn("%s: Failed to setup MSI\n", pci_name(pdev));
			irq_dispose_mapping(virq);
86
			msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, 1);
87 88 89
			return rc;
		}
		irq_set_msi_desc(virq, entry);
90
		pci_write_msi_msg(virq, &msg);
91 92 93 94
	}
	return 0;
}

95
void pnv_teardown_msi_irqs(struct pci_dev *pdev)
96 97 98 99
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
	struct msi_desc *entry;
100
	irq_hw_number_t hwirq;
101 102 103 104

	if (WARN_ON(!phb))
		return;

105
	for_each_pci_msi_entry(entry, pdev) {
106 107
		if (entry->irq == NO_IRQ)
			continue;
108
		hwirq = virq_to_hw(entry->irq);
109 110
		irq_set_msi_desc(entry->irq, NULL);
		irq_dispose_mapping(entry->irq);
111
		msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq - phb->msi_base, 1);
112 113 114
	}
}
#endif /* CONFIG_PCI_MSI */
115

116 117
static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose,
					 struct OpalIoPhbErrorCommon *common)
118
{
119
	struct OpalIoP7IOCPhbErrorData *data;
120 121
	int i;

122
	data = (struct OpalIoP7IOCPhbErrorData *)common;
123
	pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n",
124
		hose->global_number, be32_to_cpu(common->version));
125

126
	if (data->brdgCtl)
127
		pr_info("brdgCtl:     %08x\n",
128
			be32_to_cpu(data->brdgCtl));
129 130
	if (data->portStatusReg || data->rootCmplxStatus ||
	    data->busAgentStatus)
131
		pr_info("UtlSts:      %08x %08x %08x\n",
132 133 134
			be32_to_cpu(data->portStatusReg),
			be32_to_cpu(data->rootCmplxStatus),
			be32_to_cpu(data->busAgentStatus));
135 136 137
	if (data->deviceStatus || data->slotStatus   ||
	    data->linkStatus   || data->devCmdStatus ||
	    data->devSecStatus)
138
		pr_info("RootSts:     %08x %08x %08x %08x %08x\n",
139 140 141 142 143
			be32_to_cpu(data->deviceStatus),
			be32_to_cpu(data->slotStatus),
			be32_to_cpu(data->linkStatus),
			be32_to_cpu(data->devCmdStatus),
			be32_to_cpu(data->devSecStatus));
144 145
	if (data->rootErrorStatus   || data->uncorrErrorStatus ||
	    data->corrErrorStatus)
146
		pr_info("RootErrSts:  %08x %08x %08x\n",
147 148 149
			be32_to_cpu(data->rootErrorStatus),
			be32_to_cpu(data->uncorrErrorStatus),
			be32_to_cpu(data->corrErrorStatus));
150 151
	if (data->tlpHdr1 || data->tlpHdr2 ||
	    data->tlpHdr3 || data->tlpHdr4)
152
		pr_info("RootErrLog:  %08x %08x %08x %08x\n",
153 154 155 156
			be32_to_cpu(data->tlpHdr1),
			be32_to_cpu(data->tlpHdr2),
			be32_to_cpu(data->tlpHdr3),
			be32_to_cpu(data->tlpHdr4));
157 158
	if (data->sourceId || data->errorClass ||
	    data->correlator)
159
		pr_info("RootErrLog1: %08x %016llx %016llx\n",
160 161 162
			be32_to_cpu(data->sourceId),
			be64_to_cpu(data->errorClass),
			be64_to_cpu(data->correlator));
163
	if (data->p7iocPlssr || data->p7iocCsr)
164
		pr_info("PhbSts:      %016llx %016llx\n",
165 166
			be64_to_cpu(data->p7iocPlssr),
			be64_to_cpu(data->p7iocCsr));
167 168
	if (data->lemFir)
		pr_info("Lem:         %016llx %016llx %016llx\n",
169 170 171
			be64_to_cpu(data->lemFir),
			be64_to_cpu(data->lemErrorMask),
			be64_to_cpu(data->lemWOF));
172 173
	if (data->phbErrorStatus)
		pr_info("PhbErr:      %016llx %016llx %016llx %016llx\n",
174 175 176 177
			be64_to_cpu(data->phbErrorStatus),
			be64_to_cpu(data->phbFirstErrorStatus),
			be64_to_cpu(data->phbErrorLog0),
			be64_to_cpu(data->phbErrorLog1));
178 179
	if (data->mmioErrorStatus)
		pr_info("OutErr:      %016llx %016llx %016llx %016llx\n",
180 181 182 183
			be64_to_cpu(data->mmioErrorStatus),
			be64_to_cpu(data->mmioFirstErrorStatus),
			be64_to_cpu(data->mmioErrorLog0),
			be64_to_cpu(data->mmioErrorLog1));
184 185
	if (data->dma0ErrorStatus)
		pr_info("InAErr:      %016llx %016llx %016llx %016llx\n",
186 187 188 189
			be64_to_cpu(data->dma0ErrorStatus),
			be64_to_cpu(data->dma0FirstErrorStatus),
			be64_to_cpu(data->dma0ErrorLog0),
			be64_to_cpu(data->dma0ErrorLog1));
190 191
	if (data->dma1ErrorStatus)
		pr_info("InBErr:      %016llx %016llx %016llx %016llx\n",
192 193 194 195
			be64_to_cpu(data->dma1ErrorStatus),
			be64_to_cpu(data->dma1FirstErrorStatus),
			be64_to_cpu(data->dma1ErrorLog0),
			be64_to_cpu(data->dma1ErrorLog1));
196 197 198 199 200

	for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) {
		if ((data->pestA[i] >> 63) == 0 &&
		    (data->pestB[i] >> 63) == 0)
			continue;
201

202
		pr_info("PE[%3d] A/B: %016llx %016llx\n",
203 204
			i, be64_to_cpu(data->pestA[i]),
			be64_to_cpu(data->pestB[i]));
205 206 207
	}
}

208 209
static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose,
					struct OpalIoPhbErrorCommon *common)
210
{
211 212 213 214
	struct OpalIoPhb3ErrorData *data;
	int i;

	data = (struct OpalIoPhb3ErrorData*)common;
215
	pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n",
216
		hose->global_number, be32_to_cpu(common->version));
217
	if (data->brdgCtl)
218
		pr_info("brdgCtl:     %08x\n",
219
			be32_to_cpu(data->brdgCtl));
220 221
	if (data->portStatusReg || data->rootCmplxStatus ||
	    data->busAgentStatus)
222
		pr_info("UtlSts:      %08x %08x %08x\n",
223 224 225
			be32_to_cpu(data->portStatusReg),
			be32_to_cpu(data->rootCmplxStatus),
			be32_to_cpu(data->busAgentStatus));
226 227 228
	if (data->deviceStatus || data->slotStatus   ||
	    data->linkStatus   || data->devCmdStatus ||
	    data->devSecStatus)
229
		pr_info("RootSts:     %08x %08x %08x %08x %08x\n",
230 231 232 233 234
			be32_to_cpu(data->deviceStatus),
			be32_to_cpu(data->slotStatus),
			be32_to_cpu(data->linkStatus),
			be32_to_cpu(data->devCmdStatus),
			be32_to_cpu(data->devSecStatus));
235 236
	if (data->rootErrorStatus || data->uncorrErrorStatus ||
	    data->corrErrorStatus)
237
		pr_info("RootErrSts:  %08x %08x %08x\n",
238 239 240
			be32_to_cpu(data->rootErrorStatus),
			be32_to_cpu(data->uncorrErrorStatus),
			be32_to_cpu(data->corrErrorStatus));
241 242
	if (data->tlpHdr1 || data->tlpHdr2 ||
	    data->tlpHdr3 || data->tlpHdr4)
243
		pr_info("RootErrLog:  %08x %08x %08x %08x\n",
244 245 246 247
			be32_to_cpu(data->tlpHdr1),
			be32_to_cpu(data->tlpHdr2),
			be32_to_cpu(data->tlpHdr3),
			be32_to_cpu(data->tlpHdr4));
248 249
	if (data->sourceId || data->errorClass ||
	    data->correlator)
250
		pr_info("RootErrLog1: %08x %016llx %016llx\n",
251 252 253
			be32_to_cpu(data->sourceId),
			be64_to_cpu(data->errorClass),
			be64_to_cpu(data->correlator));
254 255
	if (data->nFir)
		pr_info("nFir:        %016llx %016llx %016llx\n",
256 257 258
			be64_to_cpu(data->nFir),
			be64_to_cpu(data->nFirMask),
			be64_to_cpu(data->nFirWOF));
259
	if (data->phbPlssr || data->phbCsr)
260
		pr_info("PhbSts:      %016llx %016llx\n",
261 262
			be64_to_cpu(data->phbPlssr),
			be64_to_cpu(data->phbCsr));
263 264
	if (data->lemFir)
		pr_info("Lem:         %016llx %016llx %016llx\n",
265 266 267
			be64_to_cpu(data->lemFir),
			be64_to_cpu(data->lemErrorMask),
			be64_to_cpu(data->lemWOF));
268 269
	if (data->phbErrorStatus)
		pr_info("PhbErr:      %016llx %016llx %016llx %016llx\n",
270 271 272 273
			be64_to_cpu(data->phbErrorStatus),
			be64_to_cpu(data->phbFirstErrorStatus),
			be64_to_cpu(data->phbErrorLog0),
			be64_to_cpu(data->phbErrorLog1));
274 275
	if (data->mmioErrorStatus)
		pr_info("OutErr:      %016llx %016llx %016llx %016llx\n",
276 277 278 279
			be64_to_cpu(data->mmioErrorStatus),
			be64_to_cpu(data->mmioFirstErrorStatus),
			be64_to_cpu(data->mmioErrorLog0),
			be64_to_cpu(data->mmioErrorLog1));
280 281
	if (data->dma0ErrorStatus)
		pr_info("InAErr:      %016llx %016llx %016llx %016llx\n",
282 283 284 285
			be64_to_cpu(data->dma0ErrorStatus),
			be64_to_cpu(data->dma0FirstErrorStatus),
			be64_to_cpu(data->dma0ErrorLog0),
			be64_to_cpu(data->dma0ErrorLog1));
286 287
	if (data->dma1ErrorStatus)
		pr_info("InBErr:      %016llx %016llx %016llx %016llx\n",
288 289 290 291
			be64_to_cpu(data->dma1ErrorStatus),
			be64_to_cpu(data->dma1FirstErrorStatus),
			be64_to_cpu(data->dma1ErrorLog0),
			be64_to_cpu(data->dma1ErrorLog1));
292 293

	for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) {
294 295
		if ((be64_to_cpu(data->pestA[i]) >> 63) == 0 &&
		    (be64_to_cpu(data->pestB[i]) >> 63) == 0)
296 297
			continue;

298
		pr_info("PE[%3d] A/B: %016llx %016llx\n",
299 300
				i, be64_to_cpu(data->pestA[i]),
				be64_to_cpu(data->pestB[i]));
301 302 303 304 305 306 307 308 309 310 311 312
	}
}

void pnv_pci_dump_phb_diag_data(struct pci_controller *hose,
				unsigned char *log_buff)
{
	struct OpalIoPhbErrorCommon *common;

	if (!hose || !log_buff)
		return;

	common = (struct OpalIoPhbErrorCommon *)log_buff;
313
	switch (be32_to_cpu(common->ioType)) {
314 315 316 317 318
	case OPAL_PHB_ERROR_DATA_TYPE_P7IOC:
		pnv_pci_dump_p7ioc_diag_data(hose, common);
		break;
	case OPAL_PHB_ERROR_DATA_TYPE_PHB3:
		pnv_pci_dump_phb3_diag_data(hose, common);
319 320
		break;
	default:
321
		pr_warn("%s: Unrecognized ioType %d\n",
322
			__func__, be32_to_cpu(common->ioType));
323 324 325 326 327 328
	}
}

static void pnv_pci_handle_eeh_config(struct pnv_phb *phb, u32 pe_no)
{
	unsigned long flags, rc;
329
	int has_diag, ret = 0;
330 331 332

	spin_lock_irqsave(&phb->lock, flags);

333
	/* Fetch PHB diag-data */
334 335
	rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob,
					 PNV_PCI_DIAG_BUF_SIZE);
336 337
	has_diag = (rc == OPAL_SUCCESS);

338 339 340 341
	/* If PHB supports compound PE, to handle it */
	if (phb->unfreeze_pe) {
		ret = phb->unfreeze_pe(phb,
				       pe_no,
342
				       OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
343 344 345 346 347 348 349 350 351 352 353
	} else {
		rc = opal_pci_eeh_freeze_clear(phb->opal_id,
					     pe_no,
					     OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
		if (rc) {
			pr_warn("%s: Failure %ld clearing frozen "
				"PHB#%x-PE#%x\n",
				__func__, rc, phb->hose->global_number,
				pe_no);
			ret = -EIO;
		}
354 355
	}

356 357 358 359 360 361 362 363 364
	/*
	 * For now, let's only display the diag buffer when we fail to clear
	 * the EEH status. We'll do more sensible things later when we have
	 * proper EEH support. We need to make sure we don't pollute ourselves
	 * with the normal errors generated when probing empty slots
	 */
	if (has_diag && ret)
		pnv_pci_dump_phb_diag_data(phb->hose, phb->diag.blob);

365 366 367
	spin_unlock_irqrestore(&phb->lock, flags);
}

368
static void pnv_pci_config_check_eeh(struct pci_dn *pdn)
369
{
370
	struct pnv_phb *phb = pdn->phb->private_data;
371
	u8	fstate;
372
	__be16	pcierr;
373 374
	int	pe_no;
	s64	rc;
375

376 377 378
	/*
	 * Get the PE#. During the PCI probe stage, we might not
	 * setup that yet. So all ER errors should be mapped to
379
	 * reserved PE.
380
	 */
381
	pe_no = pdn->pe_number;
382
	if (pe_no == IODA_INVALID_PE) {
383
		pe_no = phb->ioda.reserved_pe;
384
	}
385

386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
	/*
	 * Fetch frozen state. If the PHB support compound PE,
	 * we need handle that case.
	 */
	if (phb->get_pe_state) {
		fstate = phb->get_pe_state(phb, pe_no);
	} else {
		rc = opal_pci_eeh_freeze_status(phb->opal_id,
						pe_no,
						&fstate,
						&pcierr,
						NULL);
		if (rc) {
			pr_warn("%s: Failure %lld getting PHB#%x-PE#%x state\n",
				__func__, rc, phb->hose->global_number, pe_no);
			return;
		}
403
	}
404

405
	cfg_dbg(" -> EEH check, bdfn=%04x PE#%d fstate=%x\n",
406
		(pdn->busno << 8) | (pdn->devfn), pe_no, fstate);
407 408 409 410 411 412 413 414 415 416 417 418

	/* Clear the frozen state if applicable */
	if (fstate == OPAL_EEH_STOPPED_MMIO_FREEZE ||
	    fstate == OPAL_EEH_STOPPED_DMA_FREEZE  ||
	    fstate == OPAL_EEH_STOPPED_MMIO_DMA_FREEZE) {
		/*
		 * If PHB supports compound PE, freeze it for
		 * consistency.
		 */
		if (phb->freeze_pe)
			phb->freeze_pe(phb, pe_no);

419
		pnv_pci_handle_eeh_config(phb, pe_no);
420
	}
421 422
}

423
int pnv_pci_cfg_read(struct pci_dn *pdn,
424
		     int where, int size, u32 *val)
425
{
426 427
	struct pnv_phb *phb = pdn->phb->private_data;
	u32 bdfn = (pdn->busno << 8) | pdn->devfn;
428 429 430 431 432 433 434 435 436 437
	s64 rc;

	switch (size) {
	case 1: {
		u8 v8;
		rc = opal_pci_config_read_byte(phb->opal_id, bdfn, where, &v8);
		*val = (rc == OPAL_SUCCESS) ? v8 : 0xff;
		break;
	}
	case 2: {
438
		__be16 v16;
439 440
		rc = opal_pci_config_read_half_word(phb->opal_id, bdfn, where,
						   &v16);
441
		*val = (rc == OPAL_SUCCESS) ? be16_to_cpu(v16) : 0xffff;
442 443 444
		break;
	}
	case 4: {
445
		__be32 v32;
446
		rc = opal_pci_config_read_word(phb->opal_id, bdfn, where, &v32);
447
		*val = (rc == OPAL_SUCCESS) ? be32_to_cpu(v32) : 0xffffffff;
448 449 450 451 452
		break;
	}
	default:
		return PCIBIOS_FUNC_NOT_SUPPORTED;
	}
453

454 455
	cfg_dbg("%s: bus: %x devfn: %x +%x/%x -> %08x\n",
		__func__, pdn->busno, pdn->devfn, where, size, *val);
456 457 458
	return PCIBIOS_SUCCESSFUL;
}

459
int pnv_pci_cfg_write(struct pci_dn *pdn,
460
		      int where, int size, u32 val)
461
{
462 463
	struct pnv_phb *phb = pdn->phb->private_data;
	u32 bdfn = (pdn->busno << 8) | pdn->devfn;
464

465 466
	cfg_dbg("%s: bus: %x devfn: %x +%x/%x -> %08x\n",
		pdn->busno, pdn->devfn, where, size, val);
467 468 469 470 471 472 473 474 475 476 477 478 479
	switch (size) {
	case 1:
		opal_pci_config_write_byte(phb->opal_id, bdfn, where, val);
		break;
	case 2:
		opal_pci_config_write_half_word(phb->opal_id, bdfn, where, val);
		break;
	case 4:
		opal_pci_config_write_word(phb->opal_id, bdfn, where, val);
		break;
	default:
		return PCIBIOS_FUNC_NOT_SUPPORTED;
	}
480

481 482 483 484
	return PCIBIOS_SUCCESSFUL;
}

#if CONFIG_EEH
485
static bool pnv_pci_cfg_check(struct pci_dn *pdn)
486 487
{
	struct eeh_dev *edev = NULL;
488
	struct pnv_phb *phb = pdn->phb->private_data;
489 490

	/* EEH not enabled ? */
491
	if (!(phb->flags & PNV_PHB_FLAG_EEH))
492
		return true;
493

494
	/* PE reset or device removed ? */
495
	edev = pdn->edev;
496 497
	if (edev) {
		if (edev->pe &&
498
		    (edev->pe->state & EEH_PE_CFG_BLOCKED))
499 500 501 502 503
			return false;

		if (edev->mode & EEH_DEV_REMOVED)
			return false;
	}
504 505 506 507

	return true;
}
#else
508
static inline pnv_pci_cfg_check(struct pci_dn *pdn)
509 510
{
	return true;
511
}
512
#endif /* CONFIG_EEH */
513

514 515 516 517 518
static int pnv_pci_read_config(struct pci_bus *bus,
			       unsigned int devfn,
			       int where, int size, u32 *val)
{
	struct pci_dn *pdn;
519 520
	struct pnv_phb *phb;
	int ret;
521

522
	*val = 0xFFFFFFFF;
523 524 525
	pdn = pci_get_pdn_by_devfn(bus, devfn);
	if (!pdn)
		return PCIBIOS_DEVICE_NOT_FOUND;
526

527
	if (!pnv_pci_cfg_check(pdn))
528 529
		return PCIBIOS_DEVICE_NOT_FOUND;

530 531 532
	ret = pnv_pci_cfg_read(pdn, where, size, val);
	phb = pdn->phb->private_data;
	if (phb->flags & PNV_PHB_FLAG_EEH && pdn->edev) {
533
		if (*val == EEH_IO_ERROR_VALUE(size) &&
534
		    eeh_dev_check_failure(pdn->edev))
535 536
                        return PCIBIOS_DEVICE_NOT_FOUND;
	} else {
537
		pnv_pci_config_check_eeh(pdn);
538
	}
539

540
	return ret;
541 542 543 544 545 546 547
}

static int pnv_pci_write_config(struct pci_bus *bus,
				unsigned int devfn,
				int where, int size, u32 val)
{
	struct pci_dn *pdn;
548 549
	struct pnv_phb *phb;
	int ret;
550

551 552 553
	pdn = pci_get_pdn_by_devfn(bus, devfn);
	if (!pdn)
		return PCIBIOS_DEVICE_NOT_FOUND;
554

555
	if (!pnv_pci_cfg_check(pdn))
556 557
		return PCIBIOS_DEVICE_NOT_FOUND;

558 559
	ret = pnv_pci_cfg_write(pdn, where, size, val);
	phb = pdn->phb->private_data;
560
	if (!(phb->flags & PNV_PHB_FLAG_EEH))
561
		pnv_pci_config_check_eeh(pdn);
562 563

	return ret;
564 565
}

566
struct pci_ops pnv_pci_ops = {
567
	.read  = pnv_pci_read_config,
568 569 570
	.write = pnv_pci_write_config,
};

571 572 573
static __be64 *pnv_tce(struct iommu_table *tbl, long idx)
{
	__be64 *tmp = ((__be64 *)tbl->it_base);
574 575 576 577 578 579 580 581 582 583 584 585 586
	int  level = tbl->it_indirect_levels;
	const long shift = ilog2(tbl->it_level_size);
	unsigned long mask = (tbl->it_level_size - 1) << (level * shift);

	while (level) {
		int n = (idx & mask) >> (level * shift);
		unsigned long tce = be64_to_cpu(tmp[n]);

		tmp = __va(tce & ~(TCE_PCI_READ | TCE_PCI_WRITE));
		idx &= ~mask;
		mask >>= shift;
		--level;
	}
587 588 589 590

	return tmp + idx;
}

591 592 593
int pnv_tce_build(struct iommu_table *tbl, long index, long npages,
		unsigned long uaddr, enum dma_data_direction direction,
		struct dma_attrs *attrs)
594
{
595
	u64 proto_tce = iommu_direction_to_tce_perm(direction);
596 597
	u64 rpn = __pa(uaddr) >> tbl->it_page_shift;
	long i;
598

599 600 601 602
	for (i = 0; i < npages; i++) {
		unsigned long newtce = proto_tce |
			((rpn + i) << tbl->it_page_shift);
		unsigned long idx = index - tbl->it_offset + i;
603

604 605
		*(pnv_tce(tbl, idx)) = cpu_to_be64(newtce);
	}
606 607 608 609

	return 0;
}

610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627
#ifdef CONFIG_IOMMU_API
int pnv_tce_xchg(struct iommu_table *tbl, long index,
		unsigned long *hpa, enum dma_data_direction *direction)
{
	u64 proto_tce = iommu_direction_to_tce_perm(*direction);
	unsigned long newtce = *hpa | proto_tce, oldtce;
	unsigned long idx = index - tbl->it_offset;

	BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl));

	oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce));
	*hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ | TCE_PCI_WRITE);
	*direction = iommu_tce_direction(oldtce);

	return 0;
}
#endif

628
void pnv_tce_free(struct iommu_table *tbl, long index, long npages)
629
{
630
	long i;
631

632 633
	for (i = 0; i < npages; i++) {
		unsigned long idx = index - tbl->it_offset + i;
634

635 636
		*(pnv_tce(tbl, idx)) = cpu_to_be64(0);
	}
637 638
}

639
unsigned long pnv_tce_get(struct iommu_table *tbl, long index)
640
{
641
	return *(pnv_tce(tbl, index - tbl->it_offset));
642 643
}

644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
struct iommu_table *pnv_pci_table_alloc(int nid)
{
	struct iommu_table *tbl;

	tbl = kzalloc_node(sizeof(struct iommu_table), GFP_KERNEL, nid);
	INIT_LIST_HEAD_RCU(&tbl->it_group_list);

	return tbl;
}

long pnv_pci_link_table_and_group(int node, int num,
		struct iommu_table *tbl,
		struct iommu_table_group *table_group)
{
	struct iommu_table_group_link *tgl = NULL;

	if (WARN_ON(!tbl || !table_group))
		return -EINVAL;

	tgl = kzalloc_node(sizeof(struct iommu_table_group_link), GFP_KERNEL,
			node);
	if (!tgl)
		return -ENOMEM;

	tgl->table_group = table_group;
	list_add_rcu(&tgl->next, &tbl->it_group_list);

	table_group->tables[num] = tbl;

	return 0;
}

static void pnv_iommu_table_group_link_free(struct rcu_head *head)
{
	struct iommu_table_group_link *tgl = container_of(head,
			struct iommu_table_group_link, rcu);

	kfree(tgl);
}

void pnv_pci_unlink_table_and_group(struct iommu_table *tbl,
		struct iommu_table_group *table_group)
{
	long i;
	bool found;
	struct iommu_table_group_link *tgl;

	if (!tbl || !table_group)
		return;

	/* Remove link to a group from table's list of attached groups */
	found = false;
	list_for_each_entry_rcu(tgl, &tbl->it_group_list, next) {
		if (tgl->table_group == table_group) {
			list_del_rcu(&tgl->next);
			call_rcu(&tgl->rcu, pnv_iommu_table_group_link_free);
			found = true;
			break;
		}
	}
	if (WARN_ON(!found))
		return;

	/* Clean a pointer to iommu_table in iommu_table_group::tables[] */
	found = false;
	for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
		if (table_group->tables[i] == tbl) {
			table_group->tables[i] = NULL;
			found = true;
			break;
		}
	}
	WARN_ON(!found);
}

719 720
void pnv_pci_setup_iommu_table(struct iommu_table *tbl,
			       void *tce_mem, u64 tce_size,
721
			       u64 dma_offset, unsigned page_shift)
722 723 724
{
	tbl->it_blocksize = 16;
	tbl->it_base = (unsigned long)tce_mem;
725
	tbl->it_page_shift = page_shift;
726
	tbl->it_offset = dma_offset >> tbl->it_page_shift;
727 728 729 730 731 732
	tbl->it_index = 0;
	tbl->it_size = tce_size >> 3;
	tbl->it_busno = 0;
	tbl->it_type = TCE_PCI;
}

733
void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
734 735 736
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754
#ifdef CONFIG_PCI_IOV
	struct pnv_ioda_pe *pe;
	struct pci_dn *pdn;

	/* Fix the VF pdn PE number */
	if (pdev->is_virtfn) {
		pdn = pci_get_pdn(pdev);
		WARN_ON(pdn->pe_number != IODA_INVALID_PE);
		list_for_each_entry(pe, &phb->ioda.pe_list, list) {
			if (pe->rid == ((pdev->bus->number << 8) |
			    (pdev->devfn & 0xff))) {
				pdn->pe_number = pe->pe_number;
				pe->pdev = pdev;
				break;
			}
		}
	}
#endif /* CONFIG_PCI_IOV */
755 756 757 758 759

	if (phb && phb->dma_dev_setup)
		phb->dma_dev_setup(phb, pdev);
}

760 761 762 763
void pnv_pci_shutdown(void)
{
	struct pci_controller *hose;

764 765 766
	list_for_each_entry(hose, &hose_list, list_node)
		if (hose->controller_ops.shutdown)
			hose->controller_ops.shutdown(hose);
767 768
}

G
Gavin Shan 已提交
769
/* Fixup wrong class code in p7ioc and p8 root complex */
770
static void pnv_p7ioc_rc_quirk(struct pci_dev *dev)
771 772 773 774 775
{
	dev->class = PCI_CLASS_BRIDGE_PCI << 8;
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_IBM, 0x3b9, pnv_p7ioc_rc_quirk);

776 777 778 779
void __init pnv_pci_init(void)
{
	struct device_node *np;

780
	pci_add_flags(PCI_CAN_SKIP_ISA_ALIGN);
781

782 783 784
	/* If we don't have OPAL, eg. in sim, just skip PCI probe */
	if (!firmware_has_feature(FW_FEATURE_OPAL))
		return;
785

786
	/* Look for IODA IO-Hubs. */
787 788 789
	for_each_compatible_node(np, NULL, "ibm,ioda-hub") {
		pnv_pci_init_ioda_hub(np);
	}
790

791 792 793
	/* Look for ioda2 built-in PHB3's */
	for_each_compatible_node(np, NULL, "ibm,ioda2-phb")
		pnv_pci_init_ioda2_phb(np);
794

795 796 797 798
	/* Look for NPU PHBs */
	for_each_compatible_node(np, NULL, "ibm,ioda2-npu-phb")
		pnv_pci_init_npu_phb(np);

799 800 801 802 803 804
	/* Setup the linkage between OF nodes and PHBs */
	pci_devs_phb_init();

	/* Configure IOMMU DMA hooks */
	set_pci_dma_ops(&dma_iommu_ops);
}
805

806
machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init);