Linux Audio

Check our new training course

Loading...
v4.6
   1/*
   2 * Copyright (c) 2006, Intel Corporation.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  15 * Place - Suite 330, Boston, MA 02111-1307 USA.
  16 *
  17 * Copyright (C) 2006-2008 Intel Corporation
  18 * Author: Ashok Raj <ashok.raj@intel.com>
  19 * Author: Shaohua Li <shaohua.li@intel.com>
  20 * Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  21 *
  22 * This file implements early detection/parsing of Remapping Devices
  23 * reported to OS through BIOS via DMA remapping reporting (DMAR) ACPI
  24 * tables.
  25 *
  26 * These routines are used by both DMA-remapping and Interrupt-remapping
  27 */
  28
  29#define pr_fmt(fmt)     "DMAR: " fmt
  30
  31#include <linux/pci.h>
  32#include <linux/dmar.h>
  33#include <linux/iova.h>
  34#include <linux/intel-iommu.h>
  35#include <linux/timer.h>
  36#include <linux/irq.h>
  37#include <linux/interrupt.h>
  38#include <linux/tboot.h>
  39#include <linux/dmi.h>
  40#include <linux/slab.h>
  41#include <linux/iommu.h>
  42#include <asm/irq_remapping.h>
  43#include <asm/iommu_table.h>
  44
  45#include "irq_remapping.h"
  46
  47typedef int (*dmar_res_handler_t)(struct acpi_dmar_header *, void *);
  48struct dmar_res_callback {
  49	dmar_res_handler_t	cb[ACPI_DMAR_TYPE_RESERVED];
  50	void			*arg[ACPI_DMAR_TYPE_RESERVED];
  51	bool			ignore_unhandled;
  52	bool			print_entry;
  53};
  54
  55/*
  56 * Assumptions:
  57 * 1) The hotplug framework guarentees that DMAR unit will be hot-added
  58 *    before IO devices managed by that unit.
  59 * 2) The hotplug framework guarantees that DMAR unit will be hot-removed
  60 *    after IO devices managed by that unit.
  61 * 3) Hotplug events are rare.
  62 *
  63 * Locking rules for DMA and interrupt remapping related global data structures:
  64 * 1) Use dmar_global_lock in process context
  65 * 2) Use RCU in interrupt context
  66 */
  67DECLARE_RWSEM(dmar_global_lock);
  68LIST_HEAD(dmar_drhd_units);
  69
  70struct acpi_table_header * __initdata dmar_tbl;
  71static acpi_size dmar_tbl_size;
  72static int dmar_dev_scope_status = 1;
  73static unsigned long dmar_seq_ids[BITS_TO_LONGS(DMAR_UNITS_SUPPORTED)];
  74
  75static int alloc_iommu(struct dmar_drhd_unit *drhd);
  76static void free_iommu(struct intel_iommu *iommu);
  77
  78static void dmar_register_drhd_unit(struct dmar_drhd_unit *drhd)
  79{
  80	/*
  81	 * add INCLUDE_ALL at the tail, so scan the list will find it at
  82	 * the very end.
  83	 */
  84	if (drhd->include_all)
  85		list_add_tail_rcu(&drhd->list, &dmar_drhd_units);
  86	else
  87		list_add_rcu(&drhd->list, &dmar_drhd_units);
  88}
  89
  90void *dmar_alloc_dev_scope(void *start, void *end, int *cnt)
  91{
  92	struct acpi_dmar_device_scope *scope;
  93
  94	*cnt = 0;
  95	while (start < end) {
  96		scope = start;
  97		if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_NAMESPACE ||
  98		    scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
  99		    scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE)
 100			(*cnt)++;
 101		else if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_IOAPIC &&
 102			scope->entry_type != ACPI_DMAR_SCOPE_TYPE_HPET) {
 103			pr_warn("Unsupported device scope\n");
 104		}
 105		start += scope->length;
 106	}
 107	if (*cnt == 0)
 108		return NULL;
 109
 110	return kcalloc(*cnt, sizeof(struct dmar_dev_scope), GFP_KERNEL);
 111}
 112
 113void dmar_free_dev_scope(struct dmar_dev_scope **devices, int *cnt)
 
 114{
 115	int i;
 116	struct device *tmp_dev;
 117
 118	if (*devices && *cnt) {
 119		for_each_active_dev_scope(*devices, *cnt, i, tmp_dev)
 120			put_device(tmp_dev);
 121		kfree(*devices);
 122	}
 123
 124	*devices = NULL;
 125	*cnt = 0;
 126}
 127
 128/* Optimize out kzalloc()/kfree() for normal cases */
 129static char dmar_pci_notify_info_buf[64];
 130
 131static struct dmar_pci_notify_info *
 132dmar_alloc_pci_notify_info(struct pci_dev *dev, unsigned long event)
 133{
 134	int level = 0;
 135	size_t size;
 136	struct pci_dev *tmp;
 137	struct dmar_pci_notify_info *info;
 138
 139	BUG_ON(dev->is_virtfn);
 140
 141	/* Only generate path[] for device addition event */
 142	if (event == BUS_NOTIFY_ADD_DEVICE)
 143		for (tmp = dev; tmp; tmp = tmp->bus->self)
 144			level++;
 145
 146	size = sizeof(*info) + level * sizeof(struct acpi_dmar_pci_path);
 147	if (size <= sizeof(dmar_pci_notify_info_buf)) {
 148		info = (struct dmar_pci_notify_info *)dmar_pci_notify_info_buf;
 149	} else {
 150		info = kzalloc(size, GFP_KERNEL);
 151		if (!info) {
 152			pr_warn("Out of memory when allocating notify_info "
 153				"for %s.\n", pci_name(dev));
 154			if (dmar_dev_scope_status == 0)
 155				dmar_dev_scope_status = -ENOMEM;
 156			return NULL;
 157		}
 158	}
 159
 160	info->event = event;
 161	info->dev = dev;
 162	info->seg = pci_domain_nr(dev->bus);
 163	info->level = level;
 164	if (event == BUS_NOTIFY_ADD_DEVICE) {
 165		for (tmp = dev; tmp; tmp = tmp->bus->self) {
 166			level--;
 167			info->path[level].bus = tmp->bus->number;
 168			info->path[level].device = PCI_SLOT(tmp->devfn);
 169			info->path[level].function = PCI_FUNC(tmp->devfn);
 170			if (pci_is_root_bus(tmp->bus))
 171				info->bus = tmp->bus->number;
 172		}
 
 
 
 
 
 
 
 
 
 
 173	}
 174
 175	return info;
 176}
 177
 178static inline void dmar_free_pci_notify_info(struct dmar_pci_notify_info *info)
 179{
 180	if ((void *)info != dmar_pci_notify_info_buf)
 181		kfree(info);
 182}
 183
 184static bool dmar_match_pci_path(struct dmar_pci_notify_info *info, int bus,
 185				struct acpi_dmar_pci_path *path, int count)
 186{
 187	int i;
 188
 189	if (info->bus != bus)
 190		goto fallback;
 191	if (info->level != count)
 192		goto fallback;
 193
 194	for (i = 0; i < count; i++) {
 195		if (path[i].device != info->path[i].device ||
 196		    path[i].function != info->path[i].function)
 197			goto fallback;
 198	}
 199
 200	return true;
 201
 202fallback:
 203
 204	if (count != 1)
 205		return false;
 206
 207	i = info->level - 1;
 208	if (bus              == info->path[i].bus &&
 209	    path[0].device   == info->path[i].device &&
 210	    path[0].function == info->path[i].function) {
 211		pr_info(FW_BUG "RMRR entry for device %02x:%02x.%x is broken - applying workaround\n",
 212			bus, path[0].device, path[0].function);
 213		return true;
 214	}
 215
 216	return false;
 217}
 218
 219/* Return: > 0 if match found, 0 if no match found, < 0 if error happens */
 220int dmar_insert_dev_scope(struct dmar_pci_notify_info *info,
 221			  void *start, void*end, u16 segment,
 222			  struct dmar_dev_scope *devices,
 223			  int devices_cnt)
 224{
 225	int i, level;
 226	struct device *tmp, *dev = &info->dev->dev;
 227	struct acpi_dmar_device_scope *scope;
 228	struct acpi_dmar_pci_path *path;
 229
 230	if (segment != info->seg)
 231		return 0;
 232
 233	for (; start < end; start += scope->length) {
 
 234		scope = start;
 235		if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_ENDPOINT &&
 236		    scope->entry_type != ACPI_DMAR_SCOPE_TYPE_BRIDGE)
 237			continue;
 238
 239		path = (struct acpi_dmar_pci_path *)(scope + 1);
 240		level = (scope->length - sizeof(*scope)) / sizeof(*path);
 241		if (!dmar_match_pci_path(info, scope->bus, path, level))
 242			continue;
 243
 244		if ((scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT) ^
 245		    (info->dev->hdr_type == PCI_HEADER_TYPE_NORMAL)) {
 246			pr_warn("Device scope type does not match for %s\n",
 247				pci_name(info->dev));
 248			return -EINVAL;
 249		}
 250
 251		for_each_dev_scope(devices, devices_cnt, i, tmp)
 252			if (tmp == NULL) {
 253				devices[i].bus = info->dev->bus->number;
 254				devices[i].devfn = info->dev->devfn;
 255				rcu_assign_pointer(devices[i].dev,
 256						   get_device(dev));
 257				return 1;
 258			}
 259		BUG_ON(i >= devices_cnt);
 260	}
 261
 262	return 0;
 263}
 264
 265int dmar_remove_dev_scope(struct dmar_pci_notify_info *info, u16 segment,
 266			  struct dmar_dev_scope *devices, int count)
 267{
 268	int index;
 269	struct device *tmp;
 270
 271	if (info->seg != segment)
 272		return 0;
 273
 274	for_each_active_dev_scope(devices, count, index, tmp)
 275		if (tmp == &info->dev->dev) {
 276			RCU_INIT_POINTER(devices[index].dev, NULL);
 277			synchronize_rcu();
 278			put_device(tmp);
 279			return 1;
 280		}
 281
 282	return 0;
 283}
 284
 285static int dmar_pci_bus_add_dev(struct dmar_pci_notify_info *info)
 286{
 287	int ret = 0;
 288	struct dmar_drhd_unit *dmaru;
 289	struct acpi_dmar_hardware_unit *drhd;
 290
 291	for_each_drhd_unit(dmaru) {
 292		if (dmaru->include_all)
 293			continue;
 294
 295		drhd = container_of(dmaru->hdr,
 296				    struct acpi_dmar_hardware_unit, header);
 297		ret = dmar_insert_dev_scope(info, (void *)(drhd + 1),
 298				((void *)drhd) + drhd->header.length,
 299				dmaru->segment,
 300				dmaru->devices, dmaru->devices_cnt);
 301		if (ret != 0)
 302			break;
 
 
 
 
 
 
 
 303	}
 304	if (ret >= 0)
 305		ret = dmar_iommu_notify_scope_dev(info);
 306	if (ret < 0 && dmar_dev_scope_status == 0)
 307		dmar_dev_scope_status = ret;
 308
 309	return ret;
 310}
 311
 312static void  dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
 313{
 314	struct dmar_drhd_unit *dmaru;
 315
 316	for_each_drhd_unit(dmaru)
 317		if (dmar_remove_dev_scope(info, dmaru->segment,
 318			dmaru->devices, dmaru->devices_cnt))
 319			break;
 320	dmar_iommu_notify_scope_dev(info);
 321}
 322
 323static int dmar_pci_bus_notifier(struct notifier_block *nb,
 324				 unsigned long action, void *data)
 325{
 326	struct pci_dev *pdev = to_pci_dev(data);
 327	struct dmar_pci_notify_info *info;
 328
 329	/* Only care about add/remove events for physical functions */
 330	if (pdev->is_virtfn)
 331		return NOTIFY_DONE;
 332	if (action != BUS_NOTIFY_ADD_DEVICE &&
 333	    action != BUS_NOTIFY_REMOVED_DEVICE)
 334		return NOTIFY_DONE;
 335
 336	info = dmar_alloc_pci_notify_info(pdev, action);
 337	if (!info)
 338		return NOTIFY_DONE;
 339
 340	down_write(&dmar_global_lock);
 341	if (action == BUS_NOTIFY_ADD_DEVICE)
 342		dmar_pci_bus_add_dev(info);
 343	else if (action == BUS_NOTIFY_REMOVED_DEVICE)
 344		dmar_pci_bus_del_dev(info);
 345	up_write(&dmar_global_lock);
 346
 347	dmar_free_pci_notify_info(info);
 348
 349	return NOTIFY_OK;
 350}
 351
 352static struct notifier_block dmar_pci_bus_nb = {
 353	.notifier_call = dmar_pci_bus_notifier,
 354	.priority = INT_MIN,
 355};
 356
 357static struct dmar_drhd_unit *
 358dmar_find_dmaru(struct acpi_dmar_hardware_unit *drhd)
 359{
 360	struct dmar_drhd_unit *dmaru;
 361
 362	list_for_each_entry_rcu(dmaru, &dmar_drhd_units, list)
 363		if (dmaru->segment == drhd->segment &&
 364		    dmaru->reg_base_addr == drhd->address)
 365			return dmaru;
 366
 367	return NULL;
 368}
 369
 370/**
 371 * dmar_parse_one_drhd - parses exactly one DMA remapping hardware definition
 372 * structure which uniquely represent one DMA remapping hardware unit
 373 * present in the platform
 374 */
 375static int dmar_parse_one_drhd(struct acpi_dmar_header *header, void *arg)
 
 376{
 377	struct acpi_dmar_hardware_unit *drhd;
 378	struct dmar_drhd_unit *dmaru;
 379	int ret = 0;
 380
 381	drhd = (struct acpi_dmar_hardware_unit *)header;
 382	dmaru = dmar_find_dmaru(drhd);
 383	if (dmaru)
 384		goto out;
 385
 386	dmaru = kzalloc(sizeof(*dmaru) + header->length, GFP_KERNEL);
 387	if (!dmaru)
 388		return -ENOMEM;
 389
 390	/*
 391	 * If header is allocated from slab by ACPI _DSM method, we need to
 392	 * copy the content because the memory buffer will be freed on return.
 393	 */
 394	dmaru->hdr = (void *)(dmaru + 1);
 395	memcpy(dmaru->hdr, header, header->length);
 396	dmaru->reg_base_addr = drhd->address;
 397	dmaru->segment = drhd->segment;
 398	dmaru->include_all = drhd->flags & 0x1; /* BIT0: INCLUDE_ALL */
 399	dmaru->devices = dmar_alloc_dev_scope((void *)(drhd + 1),
 400					      ((void *)drhd) + drhd->header.length,
 401					      &dmaru->devices_cnt);
 402	if (dmaru->devices_cnt && dmaru->devices == NULL) {
 403		kfree(dmaru);
 404		return -ENOMEM;
 405	}
 406
 407	ret = alloc_iommu(dmaru);
 408	if (ret) {
 409		dmar_free_dev_scope(&dmaru->devices,
 410				    &dmaru->devices_cnt);
 411		kfree(dmaru);
 412		return ret;
 413	}
 414	dmar_register_drhd_unit(dmaru);
 415
 416out:
 417	if (arg)
 418		(*(int *)arg)++;
 419
 420	return 0;
 421}
 422
 423static void dmar_free_drhd(struct dmar_drhd_unit *dmaru)
 424{
 425	if (dmaru->devices && dmaru->devices_cnt)
 426		dmar_free_dev_scope(&dmaru->devices, &dmaru->devices_cnt);
 427	if (dmaru->iommu)
 428		free_iommu(dmaru->iommu);
 429	kfree(dmaru);
 430}
 431
 432static int __init dmar_parse_one_andd(struct acpi_dmar_header *header,
 433				      void *arg)
 434{
 435	struct acpi_dmar_andd *andd = (void *)header;
 436
 437	/* Check for NUL termination within the designated length */
 438	if (strnlen(andd->device_name, header->length - 8) == header->length - 8) {
 439		WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
 440			   "Your BIOS is broken; ANDD object name is not NUL-terminated\n"
 441			   "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
 442			   dmi_get_system_info(DMI_BIOS_VENDOR),
 443			   dmi_get_system_info(DMI_BIOS_VERSION),
 444			   dmi_get_system_info(DMI_PRODUCT_VERSION));
 445		return -EINVAL;
 446	}
 447	pr_info("ANDD device: %x name: %s\n", andd->device_number,
 448		andd->device_name);
 449
 450	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 451}
 452
 453#ifdef CONFIG_ACPI_NUMA
 454static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
 
 455{
 456	struct acpi_dmar_rhsa *rhsa;
 457	struct dmar_drhd_unit *drhd;
 458
 459	rhsa = (struct acpi_dmar_rhsa *)header;
 460	for_each_drhd_unit(drhd) {
 461		if (drhd->reg_base_addr == rhsa->base_address) {
 462			int node = acpi_map_pxm_to_node(rhsa->proximity_domain);
 463
 464			if (!node_online(node))
 465				node = -1;
 466			drhd->iommu->node = node;
 467			return 0;
 468		}
 469	}
 470	WARN_TAINT(
 471		1, TAINT_FIRMWARE_WORKAROUND,
 472		"Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n"
 473		"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
 474		drhd->reg_base_addr,
 475		dmi_get_system_info(DMI_BIOS_VENDOR),
 476		dmi_get_system_info(DMI_BIOS_VERSION),
 477		dmi_get_system_info(DMI_PRODUCT_VERSION));
 478
 479	return 0;
 480}
 481#else
 482#define	dmar_parse_one_rhsa		dmar_res_noop
 483#endif
 484
 485static void __init
 486dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
 487{
 488	struct acpi_dmar_hardware_unit *drhd;
 489	struct acpi_dmar_reserved_memory *rmrr;
 490	struct acpi_dmar_atsr *atsr;
 491	struct acpi_dmar_rhsa *rhsa;
 492
 493	switch (header->type) {
 494	case ACPI_DMAR_TYPE_HARDWARE_UNIT:
 495		drhd = container_of(header, struct acpi_dmar_hardware_unit,
 496				    header);
 497		pr_info("DRHD base: %#016Lx flags: %#x\n",
 
 498			(unsigned long long)drhd->address, drhd->flags);
 499		break;
 500	case ACPI_DMAR_TYPE_RESERVED_MEMORY:
 501		rmrr = container_of(header, struct acpi_dmar_reserved_memory,
 502				    header);
 503		pr_info("RMRR base: %#016Lx end: %#016Lx\n",
 
 504			(unsigned long long)rmrr->base_address,
 505			(unsigned long long)rmrr->end_address);
 506		break;
 507	case ACPI_DMAR_TYPE_ROOT_ATS:
 508		atsr = container_of(header, struct acpi_dmar_atsr, header);
 509		pr_info("ATSR flags: %#x\n", atsr->flags);
 510		break;
 511	case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
 512		rhsa = container_of(header, struct acpi_dmar_rhsa, header);
 513		pr_info("RHSA base: %#016Lx proximity domain: %#x\n",
 514		       (unsigned long long)rhsa->base_address,
 515		       rhsa->proximity_domain);
 516		break;
 517	case ACPI_DMAR_TYPE_NAMESPACE:
 518		/* We don't print this here because we need to sanity-check
 519		   it first. So print it in dmar_parse_one_andd() instead. */
 520		break;
 521	}
 522}
 523
 524/**
 525 * dmar_table_detect - checks to see if the platform supports DMAR devices
 526 */
 527static int __init dmar_table_detect(void)
 528{
 529	acpi_status status = AE_OK;
 530
 531	/* if we could find DMAR table, then there are DMAR devices */
 532	status = acpi_get_table_with_size(ACPI_SIG_DMAR, 0,
 533				(struct acpi_table_header **)&dmar_tbl,
 534				&dmar_tbl_size);
 535
 536	if (ACPI_SUCCESS(status) && !dmar_tbl) {
 537		pr_warn("Unable to map DMAR\n");
 538		status = AE_NOT_FOUND;
 539	}
 540
 541	return (ACPI_SUCCESS(status) ? 1 : 0);
 542}
 543
 544static int dmar_walk_remapping_entries(struct acpi_dmar_header *start,
 545				       size_t len, struct dmar_res_callback *cb)
 546{
 547	int ret = 0;
 548	struct acpi_dmar_header *iter, *next;
 549	struct acpi_dmar_header *end = ((void *)start) + len;
 550
 551	for (iter = start; iter < end && ret == 0; iter = next) {
 552		next = (void *)iter + iter->length;
 553		if (iter->length == 0) {
 554			/* Avoid looping forever on bad ACPI tables */
 555			pr_debug(FW_BUG "Invalid 0-length structure\n");
 556			break;
 557		} else if (next > end) {
 558			/* Avoid passing table end */
 559			pr_warn(FW_BUG "Record passes table end\n");
 560			ret = -EINVAL;
 561			break;
 562		}
 563
 564		if (cb->print_entry)
 565			dmar_table_print_dmar_entry(iter);
 566
 567		if (iter->type >= ACPI_DMAR_TYPE_RESERVED) {
 568			/* continue for forward compatibility */
 569			pr_debug("Unknown DMAR structure type %d\n",
 570				 iter->type);
 571		} else if (cb->cb[iter->type]) {
 572			ret = cb->cb[iter->type](iter, cb->arg[iter->type]);
 573		} else if (!cb->ignore_unhandled) {
 574			pr_warn("No handler for DMAR structure type %d\n",
 575				iter->type);
 576			ret = -EINVAL;
 577		}
 578	}
 579
 580	return ret;
 581}
 582
 583static inline int dmar_walk_dmar_table(struct acpi_table_dmar *dmar,
 584				       struct dmar_res_callback *cb)
 585{
 586	return dmar_walk_remapping_entries((void *)(dmar + 1),
 587			dmar->header.length - sizeof(*dmar), cb);
 588}
 589
 590/**
 591 * parse_dmar_table - parses the DMA reporting table
 592 */
 593static int __init
 594parse_dmar_table(void)
 595{
 596	struct acpi_table_dmar *dmar;
 
 597	int ret = 0;
 598	int drhd_count = 0;
 599	struct dmar_res_callback cb = {
 600		.print_entry = true,
 601		.ignore_unhandled = true,
 602		.arg[ACPI_DMAR_TYPE_HARDWARE_UNIT] = &drhd_count,
 603		.cb[ACPI_DMAR_TYPE_HARDWARE_UNIT] = &dmar_parse_one_drhd,
 604		.cb[ACPI_DMAR_TYPE_RESERVED_MEMORY] = &dmar_parse_one_rmrr,
 605		.cb[ACPI_DMAR_TYPE_ROOT_ATS] = &dmar_parse_one_atsr,
 606		.cb[ACPI_DMAR_TYPE_HARDWARE_AFFINITY] = &dmar_parse_one_rhsa,
 607		.cb[ACPI_DMAR_TYPE_NAMESPACE] = &dmar_parse_one_andd,
 608	};
 609
 610	/*
 611	 * Do it again, earlier dmar_tbl mapping could be mapped with
 612	 * fixed map.
 613	 */
 614	dmar_table_detect();
 615
 616	/*
 617	 * ACPI tables may not be DMA protected by tboot, so use DMAR copy
 618	 * SINIT saved in SinitMleData in TXT heap (which is DMA protected)
 619	 */
 620	dmar_tbl = tboot_get_dmar_table(dmar_tbl);
 621
 622	dmar = (struct acpi_table_dmar *)dmar_tbl;
 623	if (!dmar)
 624		return -ENODEV;
 625
 626	if (dmar->width < PAGE_SHIFT - 1) {
 627		pr_warn("Invalid DMAR haw\n");
 628		return -EINVAL;
 629	}
 630
 631	pr_info("Host address width %d\n", dmar->width + 1);
 632	ret = dmar_walk_dmar_table(dmar, &cb);
 633	if (ret == 0 && drhd_count == 0)
 634		pr_warn(FW_BUG "No DRHD structure found in DMAR table\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 635
 
 
 636	return ret;
 637}
 638
 639static int dmar_pci_device_match(struct dmar_dev_scope devices[],
 640				 int cnt, struct pci_dev *dev)
 641{
 642	int index;
 643	struct device *tmp;
 644
 645	while (dev) {
 646		for_each_active_dev_scope(devices, cnt, index, tmp)
 647			if (dev_is_pci(tmp) && dev == to_pci_dev(tmp))
 648				return 1;
 649
 650		/* Check our parent */
 651		dev = dev->bus->self;
 652	}
 653
 654	return 0;
 655}
 656
 657struct dmar_drhd_unit *
 658dmar_find_matched_drhd_unit(struct pci_dev *dev)
 659{
 660	struct dmar_drhd_unit *dmaru;
 661	struct acpi_dmar_hardware_unit *drhd;
 662
 663	dev = pci_physfn(dev);
 664
 665	rcu_read_lock();
 666	for_each_drhd_unit(dmaru) {
 667		drhd = container_of(dmaru->hdr,
 668				    struct acpi_dmar_hardware_unit,
 669				    header);
 670
 671		if (dmaru->include_all &&
 672		    drhd->segment == pci_domain_nr(dev->bus))
 673			goto out;
 674
 675		if (dmar_pci_device_match(dmaru->devices,
 676					  dmaru->devices_cnt, dev))
 677			goto out;
 678	}
 679	dmaru = NULL;
 680out:
 681	rcu_read_unlock();
 682
 683	return dmaru;
 684}
 685
 686static void __init dmar_acpi_insert_dev_scope(u8 device_number,
 687					      struct acpi_device *adev)
 688{
 689	struct dmar_drhd_unit *dmaru;
 690	struct acpi_dmar_hardware_unit *drhd;
 691	struct acpi_dmar_device_scope *scope;
 692	struct device *tmp;
 693	int i;
 694	struct acpi_dmar_pci_path *path;
 695
 696	for_each_drhd_unit(dmaru) {
 697		drhd = container_of(dmaru->hdr,
 698				    struct acpi_dmar_hardware_unit,
 699				    header);
 700
 701		for (scope = (void *)(drhd + 1);
 702		     (unsigned long)scope < ((unsigned long)drhd) + drhd->header.length;
 703		     scope = ((void *)scope) + scope->length) {
 704			if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_NAMESPACE)
 705				continue;
 706			if (scope->enumeration_id != device_number)
 707				continue;
 708
 709			path = (void *)(scope + 1);
 710			pr_info("ACPI device \"%s\" under DMAR at %llx as %02x:%02x.%d\n",
 711				dev_name(&adev->dev), dmaru->reg_base_addr,
 712				scope->bus, path->device, path->function);
 713			for_each_dev_scope(dmaru->devices, dmaru->devices_cnt, i, tmp)
 714				if (tmp == NULL) {
 715					dmaru->devices[i].bus = scope->bus;
 716					dmaru->devices[i].devfn = PCI_DEVFN(path->device,
 717									    path->function);
 718					rcu_assign_pointer(dmaru->devices[i].dev,
 719							   get_device(&adev->dev));
 720					return;
 721				}
 722			BUG_ON(i >= dmaru->devices_cnt);
 723		}
 724	}
 725	pr_warn("No IOMMU scope found for ANDD enumeration ID %d (%s)\n",
 726		device_number, dev_name(&adev->dev));
 727}
 728
 729static int __init dmar_acpi_dev_scope_init(void)
 730{
 731	struct acpi_dmar_andd *andd;
 732
 733	if (dmar_tbl == NULL)
 734		return -ENODEV;
 735
 736	for (andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
 737	     ((unsigned long)andd) < ((unsigned long)dmar_tbl) + dmar_tbl->length;
 738	     andd = ((void *)andd) + andd->header.length) {
 739		if (andd->header.type == ACPI_DMAR_TYPE_NAMESPACE) {
 740			acpi_handle h;
 741			struct acpi_device *adev;
 742
 743			if (!ACPI_SUCCESS(acpi_get_handle(ACPI_ROOT_OBJECT,
 744							  andd->device_name,
 745							  &h))) {
 746				pr_err("Failed to find handle for ACPI object %s\n",
 747				       andd->device_name);
 748				continue;
 749			}
 750			if (acpi_bus_get_device(h, &adev)) {
 751				pr_err("Failed to get device for ACPI object %s\n",
 752				       andd->device_name);
 753				continue;
 754			}
 755			dmar_acpi_insert_dev_scope(andd->device_number, adev);
 756		}
 757	}
 758	return 0;
 759}
 760
 761int __init dmar_dev_scope_init(void)
 762{
 763	struct pci_dev *dev = NULL;
 764	struct dmar_pci_notify_info *info;
 
 765
 766	if (dmar_dev_scope_status != 1)
 767		return dmar_dev_scope_status;
 768
 769	if (list_empty(&dmar_drhd_units)) {
 770		dmar_dev_scope_status = -ENODEV;
 771	} else {
 772		dmar_dev_scope_status = 0;
 773
 774		dmar_acpi_dev_scope_init();
 
 
 
 
 775
 776		for_each_pci_dev(dev) {
 777			if (dev->is_virtfn)
 778				continue;
 779
 780			info = dmar_alloc_pci_notify_info(dev,
 781					BUS_NOTIFY_ADD_DEVICE);
 782			if (!info) {
 783				return dmar_dev_scope_status;
 784			} else {
 785				dmar_pci_bus_add_dev(info);
 786				dmar_free_pci_notify_info(info);
 787			}
 788		}
 789
 790		bus_register_notifier(&pci_bus_type, &dmar_pci_bus_nb);
 791	}
 792
 793	return dmar_dev_scope_status;
 
 
 794}
 795
 796
 797int __init dmar_table_init(void)
 798{
 799	static int dmar_table_initialized;
 800	int ret;
 801
 802	if (dmar_table_initialized == 0) {
 803		ret = parse_dmar_table();
 804		if (ret < 0) {
 805			if (ret != -ENODEV)
 806				pr_info("Parse DMAR table failure.\n");
 807		} else  if (list_empty(&dmar_drhd_units)) {
 808			pr_info("No DMAR devices found\n");
 809			ret = -ENODEV;
 810		}
 
 
 811
 812		if (ret < 0)
 813			dmar_table_initialized = ret;
 814		else
 815			dmar_table_initialized = 1;
 816	}
 817
 818	return dmar_table_initialized < 0 ? dmar_table_initialized : 0;
 819}
 820
 821static void warn_invalid_dmar(u64 addr, const char *message)
 822{
 823	WARN_TAINT_ONCE(
 824		1, TAINT_FIRMWARE_WORKAROUND,
 825		"Your BIOS is broken; DMAR reported at address %llx%s!\n"
 826		"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
 827		addr, message,
 828		dmi_get_system_info(DMI_BIOS_VENDOR),
 829		dmi_get_system_info(DMI_BIOS_VERSION),
 830		dmi_get_system_info(DMI_PRODUCT_VERSION));
 831}
 832
 833static int __ref
 834dmar_validate_one_drhd(struct acpi_dmar_header *entry, void *arg)
 835{
 
 
 836	struct acpi_dmar_hardware_unit *drhd;
 837	void __iomem *addr;
 838	u64 cap, ecap;
 839
 840	drhd = (void *)entry;
 841	if (!drhd->address) {
 842		warn_invalid_dmar(0, "");
 843		return -EINVAL;
 844	}
 845
 846	if (arg)
 847		addr = ioremap(drhd->address, VTD_PAGE_SIZE);
 848	else
 849		addr = early_ioremap(drhd->address, VTD_PAGE_SIZE);
 850	if (!addr) {
 851		pr_warn("Can't validate DRHD address: %llx\n", drhd->address);
 852		return -EINVAL;
 853	}
 854
 855	cap = dmar_readq(addr + DMAR_CAP_REG);
 856	ecap = dmar_readq(addr + DMAR_ECAP_REG);
 
 
 
 
 
 
 
 857
 858	if (arg)
 859		iounmap(addr);
 860	else
 861		early_iounmap(addr, VTD_PAGE_SIZE);
 
 
 
 
 
 
 
 
 
 
 862
 863	if (cap == (uint64_t)-1 && ecap == (uint64_t)-1) {
 864		warn_invalid_dmar(drhd->address, " returns all ones");
 865		return -EINVAL;
 866	}
 
 867
 
 868	return 0;
 869}
 870
 871int __init detect_intel_iommu(void)
 872{
 873	int ret;
 874	struct dmar_res_callback validate_drhd_cb = {
 875		.cb[ACPI_DMAR_TYPE_HARDWARE_UNIT] = &dmar_validate_one_drhd,
 876		.ignore_unhandled = true,
 877	};
 878
 879	down_write(&dmar_global_lock);
 880	ret = dmar_table_detect();
 881	if (ret)
 882		ret = !dmar_walk_dmar_table((struct acpi_table_dmar *)dmar_tbl,
 883					    &validate_drhd_cb);
 884	if (ret && !no_iommu && !iommu_detected && !dmar_disabled) {
 885		iommu_detected = 1;
 886		/* Make sure ACS will be enabled */
 887		pci_request_acs();
 888	}
 
 
 
 
 
 
 
 
 
 889
 890#ifdef CONFIG_X86
 891	if (ret)
 892		x86_init.iommu.iommu_init = intel_iommu_init;
 893#endif
 894
 895	early_acpi_os_unmap_memory((void __iomem *)dmar_tbl, dmar_tbl_size);
 896	dmar_tbl = NULL;
 897	up_write(&dmar_global_lock);
 898
 899	return ret ? 1 : -ENODEV;
 900}
 901
 902
 903static void unmap_iommu(struct intel_iommu *iommu)
 904{
 905	iounmap(iommu->reg);
 906	release_mem_region(iommu->reg_phys, iommu->reg_size);
 907}
 908
 909/**
 910 * map_iommu: map the iommu's registers
 911 * @iommu: the iommu to map
 912 * @phys_addr: the physical address of the base resgister
 913 *
 914 * Memory map the iommu's registers.  Start w/ a single page, and
 915 * possibly expand if that turns out to be insufficent.
 916 */
 917static int map_iommu(struct intel_iommu *iommu, u64 phys_addr)
 918{
 919	int map_size, err=0;
 920
 921	iommu->reg_phys = phys_addr;
 922	iommu->reg_size = VTD_PAGE_SIZE;
 923
 924	if (!request_mem_region(iommu->reg_phys, iommu->reg_size, iommu->name)) {
 925		pr_err("Can't reserve memory\n");
 926		err = -EBUSY;
 927		goto out;
 928	}
 929
 930	iommu->reg = ioremap(iommu->reg_phys, iommu->reg_size);
 931	if (!iommu->reg) {
 932		pr_err("Can't map the region\n");
 933		err = -ENOMEM;
 934		goto release;
 935	}
 936
 937	iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG);
 938	iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);
 939
 940	if (iommu->cap == (uint64_t)-1 && iommu->ecap == (uint64_t)-1) {
 941		err = -EINVAL;
 942		warn_invalid_dmar(phys_addr, " returns all ones");
 943		goto unmap;
 944	}
 945
 946	/* the registers might be more than one page */
 947	map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),
 948			 cap_max_fault_reg_offset(iommu->cap));
 949	map_size = VTD_PAGE_ALIGN(map_size);
 950	if (map_size > iommu->reg_size) {
 951		iounmap(iommu->reg);
 952		release_mem_region(iommu->reg_phys, iommu->reg_size);
 953		iommu->reg_size = map_size;
 954		if (!request_mem_region(iommu->reg_phys, iommu->reg_size,
 955					iommu->name)) {
 956			pr_err("Can't reserve memory\n");
 957			err = -EBUSY;
 958			goto out;
 959		}
 960		iommu->reg = ioremap(iommu->reg_phys, iommu->reg_size);
 961		if (!iommu->reg) {
 962			pr_err("Can't map the region\n");
 963			err = -ENOMEM;
 964			goto release;
 965		}
 966	}
 967	err = 0;
 968	goto out;
 969
 970unmap:
 971	iounmap(iommu->reg);
 972release:
 973	release_mem_region(iommu->reg_phys, iommu->reg_size);
 974out:
 975	return err;
 976}
 977
 978static int dmar_alloc_seq_id(struct intel_iommu *iommu)
 979{
 980	iommu->seq_id = find_first_zero_bit(dmar_seq_ids,
 981					    DMAR_UNITS_SUPPORTED);
 982	if (iommu->seq_id >= DMAR_UNITS_SUPPORTED) {
 983		iommu->seq_id = -1;
 984	} else {
 985		set_bit(iommu->seq_id, dmar_seq_ids);
 986		sprintf(iommu->name, "dmar%d", iommu->seq_id);
 987	}
 988
 989	return iommu->seq_id;
 990}
 991
 992static void dmar_free_seq_id(struct intel_iommu *iommu)
 993{
 994	if (iommu->seq_id >= 0) {
 995		clear_bit(iommu->seq_id, dmar_seq_ids);
 996		iommu->seq_id = -1;
 997	}
 998}
 999
1000static int alloc_iommu(struct dmar_drhd_unit *drhd)
1001{
1002	struct intel_iommu *iommu;
1003	u32 ver, sts;
 
 
1004	int agaw = 0;
1005	int msagaw = 0;
1006	int err;
1007
1008	if (!drhd->reg_base_addr) {
1009		warn_invalid_dmar(0, "");
1010		return -EINVAL;
1011	}
1012
1013	iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
1014	if (!iommu)
1015		return -ENOMEM;
1016
1017	if (dmar_alloc_seq_id(iommu) < 0) {
1018		pr_err("Failed to allocate seq_id\n");
1019		err = -ENOSPC;
 
 
 
1020		goto error;
1021	}
 
 
1022
1023	err = map_iommu(iommu, drhd->reg_base_addr);
1024	if (err) {
1025		pr_err("Failed to map %s\n", iommu->name);
1026		goto error_free_seq_id;
1027	}
1028
1029	err = -EINVAL;
1030	agaw = iommu_calculate_agaw(iommu);
1031	if (agaw < 0) {
1032		pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
1033			iommu->seq_id);
 
1034		goto err_unmap;
1035	}
1036	msagaw = iommu_calculate_max_sagaw(iommu);
1037	if (msagaw < 0) {
1038		pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
 
1039			iommu->seq_id);
1040		goto err_unmap;
1041	}
1042	iommu->agaw = agaw;
1043	iommu->msagaw = msagaw;
1044	iommu->segment = drhd->segment;
1045
1046	iommu->node = -1;
1047
 
 
 
 
 
 
 
 
 
 
 
 
 
1048	ver = readl(iommu->reg + DMAR_VER_REG);
1049	pr_info("%s: reg_base_addr %llx ver %d:%d cap %llx ecap %llx\n",
1050		iommu->name,
1051		(unsigned long long)drhd->reg_base_addr,
1052		DMAR_VER_MAJOR(ver), DMAR_VER_MINOR(ver),
1053		(unsigned long long)iommu->cap,
1054		(unsigned long long)iommu->ecap);
1055
1056	/* Reflect status in gcmd */
1057	sts = readl(iommu->reg + DMAR_GSTS_REG);
1058	if (sts & DMA_GSTS_IRES)
1059		iommu->gcmd |= DMA_GCMD_IRE;
1060	if (sts & DMA_GSTS_TES)
1061		iommu->gcmd |= DMA_GCMD_TE;
1062	if (sts & DMA_GSTS_QIES)
1063		iommu->gcmd |= DMA_GCMD_QIE;
1064
1065	raw_spin_lock_init(&iommu->register_lock);
1066
1067	if (intel_iommu_enabled) {
1068		iommu->iommu_dev = iommu_device_create(NULL, iommu,
1069						       intel_iommu_groups,
1070						       "%s", iommu->name);
1071
1072		if (IS_ERR(iommu->iommu_dev)) {
1073			err = PTR_ERR(iommu->iommu_dev);
1074			goto err_unmap;
1075		}
1076	}
1077
1078	drhd->iommu = iommu;
1079
1080	return 0;
1081
1082err_unmap:
1083	unmap_iommu(iommu);
1084error_free_seq_id:
1085	dmar_free_seq_id(iommu);
1086error:
1087	kfree(iommu);
1088	return err;
1089}
1090
1091static void free_iommu(struct intel_iommu *iommu)
1092{
1093	iommu_device_destroy(iommu->iommu_dev);
1094
1095	if (iommu->irq) {
1096		if (iommu->pr_irq) {
1097			free_irq(iommu->pr_irq, iommu);
1098			dmar_free_hwirq(iommu->pr_irq);
1099			iommu->pr_irq = 0;
1100		}
1101		free_irq(iommu->irq, iommu);
1102		dmar_free_hwirq(iommu->irq);
1103		iommu->irq = 0;
1104	}
1105
1106	if (iommu->qi) {
1107		free_page((unsigned long)iommu->qi->desc);
1108		kfree(iommu->qi->desc_status);
1109		kfree(iommu->qi);
1110	}
1111
1112	if (iommu->reg)
1113		unmap_iommu(iommu);
1114
1115	dmar_free_seq_id(iommu);
1116	kfree(iommu);
1117}
1118
1119/*
1120 * Reclaim all the submitted descriptors which have completed its work.
1121 */
1122static inline void reclaim_free_desc(struct q_inval *qi)
1123{
1124	while (qi->desc_status[qi->free_tail] == QI_DONE ||
1125	       qi->desc_status[qi->free_tail] == QI_ABORT) {
1126		qi->desc_status[qi->free_tail] = QI_FREE;
1127		qi->free_tail = (qi->free_tail + 1) % QI_LENGTH;
1128		qi->free_cnt++;
1129	}
1130}
1131
1132static int qi_check_fault(struct intel_iommu *iommu, int index)
1133{
1134	u32 fault;
1135	int head, tail;
1136	struct q_inval *qi = iommu->qi;
1137	int wait_index = (index + 1) % QI_LENGTH;
1138
1139	if (qi->desc_status[wait_index] == QI_ABORT)
1140		return -EAGAIN;
1141
1142	fault = readl(iommu->reg + DMAR_FSTS_REG);
1143
1144	/*
1145	 * If IQE happens, the head points to the descriptor associated
1146	 * with the error. No new descriptors are fetched until the IQE
1147	 * is cleared.
1148	 */
1149	if (fault & DMA_FSTS_IQE) {
1150		head = readl(iommu->reg + DMAR_IQH_REG);
1151		if ((head >> DMAR_IQ_SHIFT) == index) {
1152			pr_err("VT-d detected invalid descriptor: "
1153				"low=%llx, high=%llx\n",
1154				(unsigned long long)qi->desc[index].low,
1155				(unsigned long long)qi->desc[index].high);
1156			memcpy(&qi->desc[index], &qi->desc[wait_index],
1157					sizeof(struct qi_desc));
1158			__iommu_flush_cache(iommu, &qi->desc[index],
1159					sizeof(struct qi_desc));
1160			writel(DMA_FSTS_IQE, iommu->reg + DMAR_FSTS_REG);
1161			return -EINVAL;
1162		}
1163	}
1164
1165	/*
1166	 * If ITE happens, all pending wait_desc commands are aborted.
1167	 * No new descriptors are fetched until the ITE is cleared.
1168	 */
1169	if (fault & DMA_FSTS_ITE) {
1170		head = readl(iommu->reg + DMAR_IQH_REG);
1171		head = ((head >> DMAR_IQ_SHIFT) - 1 + QI_LENGTH) % QI_LENGTH;
1172		head |= 1;
1173		tail = readl(iommu->reg + DMAR_IQT_REG);
1174		tail = ((tail >> DMAR_IQ_SHIFT) - 1 + QI_LENGTH) % QI_LENGTH;
1175
1176		writel(DMA_FSTS_ITE, iommu->reg + DMAR_FSTS_REG);
1177
1178		do {
1179			if (qi->desc_status[head] == QI_IN_USE)
1180				qi->desc_status[head] = QI_ABORT;
1181			head = (head - 2 + QI_LENGTH) % QI_LENGTH;
1182		} while (head != tail);
1183
1184		if (qi->desc_status[wait_index] == QI_ABORT)
1185			return -EAGAIN;
1186	}
1187
1188	if (fault & DMA_FSTS_ICE)
1189		writel(DMA_FSTS_ICE, iommu->reg + DMAR_FSTS_REG);
1190
1191	return 0;
1192}
1193
1194/*
1195 * Submit the queued invalidation descriptor to the remapping
1196 * hardware unit and wait for its completion.
1197 */
1198int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
1199{
1200	int rc;
1201	struct q_inval *qi = iommu->qi;
1202	struct qi_desc *hw, wait_desc;
1203	int wait_index, index;
1204	unsigned long flags;
1205
1206	if (!qi)
1207		return 0;
1208
1209	hw = qi->desc;
1210
1211restart:
1212	rc = 0;
1213
1214	raw_spin_lock_irqsave(&qi->q_lock, flags);
1215	while (qi->free_cnt < 3) {
1216		raw_spin_unlock_irqrestore(&qi->q_lock, flags);
1217		cpu_relax();
1218		raw_spin_lock_irqsave(&qi->q_lock, flags);
1219	}
1220
1221	index = qi->free_head;
1222	wait_index = (index + 1) % QI_LENGTH;
1223
1224	qi->desc_status[index] = qi->desc_status[wait_index] = QI_IN_USE;
1225
1226	hw[index] = *desc;
1227
1228	wait_desc.low = QI_IWD_STATUS_DATA(QI_DONE) |
1229			QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
1230	wait_desc.high = virt_to_phys(&qi->desc_status[wait_index]);
1231
1232	hw[wait_index] = wait_desc;
1233
1234	__iommu_flush_cache(iommu, &hw[index], sizeof(struct qi_desc));
1235	__iommu_flush_cache(iommu, &hw[wait_index], sizeof(struct qi_desc));
1236
1237	qi->free_head = (qi->free_head + 2) % QI_LENGTH;
1238	qi->free_cnt -= 2;
1239
1240	/*
1241	 * update the HW tail register indicating the presence of
1242	 * new descriptors.
1243	 */
1244	writel(qi->free_head << DMAR_IQ_SHIFT, iommu->reg + DMAR_IQT_REG);
1245
1246	while (qi->desc_status[wait_index] != QI_DONE) {
1247		/*
1248		 * We will leave the interrupts disabled, to prevent interrupt
1249		 * context to queue another cmd while a cmd is already submitted
1250		 * and waiting for completion on this cpu. This is to avoid
1251		 * a deadlock where the interrupt context can wait indefinitely
1252		 * for free slots in the queue.
1253		 */
1254		rc = qi_check_fault(iommu, index);
1255		if (rc)
1256			break;
1257
1258		raw_spin_unlock(&qi->q_lock);
1259		cpu_relax();
1260		raw_spin_lock(&qi->q_lock);
1261	}
1262
1263	qi->desc_status[index] = QI_DONE;
1264
1265	reclaim_free_desc(qi);
1266	raw_spin_unlock_irqrestore(&qi->q_lock, flags);
1267
1268	if (rc == -EAGAIN)
1269		goto restart;
1270
1271	return rc;
1272}
1273
1274/*
1275 * Flush the global interrupt entry cache.
1276 */
1277void qi_global_iec(struct intel_iommu *iommu)
1278{
1279	struct qi_desc desc;
1280
1281	desc.low = QI_IEC_TYPE;
1282	desc.high = 0;
1283
1284	/* should never fail */
1285	qi_submit_sync(&desc, iommu);
1286}
1287
1288void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
1289		      u64 type)
1290{
1291	struct qi_desc desc;
1292
1293	desc.low = QI_CC_FM(fm) | QI_CC_SID(sid) | QI_CC_DID(did)
1294			| QI_CC_GRAN(type) | QI_CC_TYPE;
1295	desc.high = 0;
1296
1297	qi_submit_sync(&desc, iommu);
1298}
1299
1300void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
1301		    unsigned int size_order, u64 type)
1302{
1303	u8 dw = 0, dr = 0;
1304
1305	struct qi_desc desc;
1306	int ih = 0;
1307
1308	if (cap_write_drain(iommu->cap))
1309		dw = 1;
1310
1311	if (cap_read_drain(iommu->cap))
1312		dr = 1;
1313
1314	desc.low = QI_IOTLB_DID(did) | QI_IOTLB_DR(dr) | QI_IOTLB_DW(dw)
1315		| QI_IOTLB_GRAN(type) | QI_IOTLB_TYPE;
1316	desc.high = QI_IOTLB_ADDR(addr) | QI_IOTLB_IH(ih)
1317		| QI_IOTLB_AM(size_order);
1318
1319	qi_submit_sync(&desc, iommu);
1320}
1321
1322void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 qdep,
1323			u64 addr, unsigned mask)
1324{
1325	struct qi_desc desc;
1326
1327	if (mask) {
1328		BUG_ON(addr & ((1 << (VTD_PAGE_SHIFT + mask)) - 1));
1329		addr |= (1 << (VTD_PAGE_SHIFT + mask - 1)) - 1;
1330		desc.high = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE;
1331	} else
1332		desc.high = QI_DEV_IOTLB_ADDR(addr);
1333
1334	if (qdep >= QI_DEV_IOTLB_MAX_INVS)
1335		qdep = 0;
1336
1337	desc.low = QI_DEV_IOTLB_SID(sid) | QI_DEV_IOTLB_QDEP(qdep) |
1338		   QI_DIOTLB_TYPE;
1339
1340	qi_submit_sync(&desc, iommu);
1341}
1342
1343/*
1344 * Disable Queued Invalidation interface.
1345 */
1346void dmar_disable_qi(struct intel_iommu *iommu)
1347{
1348	unsigned long flags;
1349	u32 sts;
1350	cycles_t start_time = get_cycles();
1351
1352	if (!ecap_qis(iommu->ecap))
1353		return;
1354
1355	raw_spin_lock_irqsave(&iommu->register_lock, flags);
1356
1357	sts =  readl(iommu->reg + DMAR_GSTS_REG);
1358	if (!(sts & DMA_GSTS_QIES))
1359		goto end;
1360
1361	/*
1362	 * Give a chance to HW to complete the pending invalidation requests.
1363	 */
1364	while ((readl(iommu->reg + DMAR_IQT_REG) !=
1365		readl(iommu->reg + DMAR_IQH_REG)) &&
1366		(DMAR_OPERATION_TIMEOUT > (get_cycles() - start_time)))
1367		cpu_relax();
1368
1369	iommu->gcmd &= ~DMA_GCMD_QIE;
1370	writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
1371
1372	IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl,
1373		      !(sts & DMA_GSTS_QIES), sts);
1374end:
1375	raw_spin_unlock_irqrestore(&iommu->register_lock, flags);
1376}
1377
1378/*
1379 * Enable queued invalidation.
1380 */
1381static void __dmar_enable_qi(struct intel_iommu *iommu)
1382{
1383	u32 sts;
1384	unsigned long flags;
1385	struct q_inval *qi = iommu->qi;
1386
1387	qi->free_head = qi->free_tail = 0;
1388	qi->free_cnt = QI_LENGTH;
1389
1390	raw_spin_lock_irqsave(&iommu->register_lock, flags);
1391
1392	/* write zero to the tail reg */
1393	writel(0, iommu->reg + DMAR_IQT_REG);
1394
1395	dmar_writeq(iommu->reg + DMAR_IQA_REG, virt_to_phys(qi->desc));
1396
1397	iommu->gcmd |= DMA_GCMD_QIE;
1398	writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
1399
1400	/* Make sure hardware complete it */
1401	IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts);
1402
1403	raw_spin_unlock_irqrestore(&iommu->register_lock, flags);
1404}
1405
1406/*
1407 * Enable Queued Invalidation interface. This is a must to support
1408 * interrupt-remapping. Also used by DMA-remapping, which replaces
1409 * register based IOTLB invalidation.
1410 */
1411int dmar_enable_qi(struct intel_iommu *iommu)
1412{
1413	struct q_inval *qi;
1414	struct page *desc_page;
1415
1416	if (!ecap_qis(iommu->ecap))
1417		return -ENOENT;
1418
1419	/*
1420	 * queued invalidation is already setup and enabled.
1421	 */
1422	if (iommu->qi)
1423		return 0;
1424
1425	iommu->qi = kmalloc(sizeof(*qi), GFP_ATOMIC);
1426	if (!iommu->qi)
1427		return -ENOMEM;
1428
1429	qi = iommu->qi;
1430
1431
1432	desc_page = alloc_pages_node(iommu->node, GFP_ATOMIC | __GFP_ZERO, 0);
1433	if (!desc_page) {
1434		kfree(qi);
1435		iommu->qi = NULL;
1436		return -ENOMEM;
1437	}
1438
1439	qi->desc = page_address(desc_page);
1440
1441	qi->desc_status = kzalloc(QI_LENGTH * sizeof(int), GFP_ATOMIC);
1442	if (!qi->desc_status) {
1443		free_page((unsigned long) qi->desc);
1444		kfree(qi);
1445		iommu->qi = NULL;
1446		return -ENOMEM;
1447	}
1448
 
 
 
1449	raw_spin_lock_init(&qi->q_lock);
1450
1451	__dmar_enable_qi(iommu);
1452
1453	return 0;
1454}
1455
1456/* iommu interrupt handling. Most stuff are MSI-like. */
1457
1458enum faulttype {
1459	DMA_REMAP,
1460	INTR_REMAP,
1461	UNKNOWN,
1462};
1463
1464static const char *dma_remap_fault_reasons[] =
1465{
1466	"Software",
1467	"Present bit in root entry is clear",
1468	"Present bit in context entry is clear",
1469	"Invalid context entry",
1470	"Access beyond MGAW",
1471	"PTE Write access is not set",
1472	"PTE Read access is not set",
1473	"Next page table ptr is invalid",
1474	"Root table address invalid",
1475	"Context table ptr is invalid",
1476	"non-zero reserved fields in RTP",
1477	"non-zero reserved fields in CTP",
1478	"non-zero reserved fields in PTE",
1479	"PCE for translation request specifies blocking",
1480};
1481
1482static const char *irq_remap_fault_reasons[] =
1483{
1484	"Detected reserved fields in the decoded interrupt-remapped request",
1485	"Interrupt index exceeded the interrupt-remapping table size",
1486	"Present field in the IRTE entry is clear",
1487	"Error accessing interrupt-remapping table pointed by IRTA_REG",
1488	"Detected reserved fields in the IRTE entry",
1489	"Blocked a compatibility format interrupt request",
1490	"Blocked an interrupt request due to source-id verification failure",
1491};
1492
1493static const char *dmar_get_fault_reason(u8 fault_reason, int *fault_type)
 
 
1494{
1495	if (fault_reason >= 0x20 && (fault_reason - 0x20 <
1496					ARRAY_SIZE(irq_remap_fault_reasons))) {
1497		*fault_type = INTR_REMAP;
1498		return irq_remap_fault_reasons[fault_reason - 0x20];
1499	} else if (fault_reason < ARRAY_SIZE(dma_remap_fault_reasons)) {
1500		*fault_type = DMA_REMAP;
1501		return dma_remap_fault_reasons[fault_reason];
1502	} else {
1503		*fault_type = UNKNOWN;
1504		return "Unknown";
1505	}
1506}
1507
1508
1509static inline int dmar_msi_reg(struct intel_iommu *iommu, int irq)
1510{
1511	if (iommu->irq == irq)
1512		return DMAR_FECTL_REG;
1513	else if (iommu->pr_irq == irq)
1514		return DMAR_PECTL_REG;
1515	else
1516		BUG();
1517}
1518
1519void dmar_msi_unmask(struct irq_data *data)
1520{
1521	struct intel_iommu *iommu = irq_data_get_irq_handler_data(data);
1522	int reg = dmar_msi_reg(iommu, data->irq);
1523	unsigned long flag;
1524
1525	/* unmask it */
1526	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1527	writel(0, iommu->reg + reg);
1528	/* Read a reg to force flush the post write */
1529	readl(iommu->reg + reg);
1530	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1531}
1532
1533void dmar_msi_mask(struct irq_data *data)
1534{
1535	struct intel_iommu *iommu = irq_data_get_irq_handler_data(data);
1536	int reg = dmar_msi_reg(iommu, data->irq);
1537	unsigned long flag;
 
1538
1539	/* mask it */
1540	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1541	writel(DMA_FECTL_IM, iommu->reg + reg);
1542	/* Read a reg to force flush the post write */
1543	readl(iommu->reg + reg);
1544	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1545}
1546
1547void dmar_msi_write(int irq, struct msi_msg *msg)
1548{
1549	struct intel_iommu *iommu = irq_get_handler_data(irq);
1550	int reg = dmar_msi_reg(iommu, irq);
1551	unsigned long flag;
1552
1553	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1554	writel(msg->data, iommu->reg + reg + 4);
1555	writel(msg->address_lo, iommu->reg + reg + 8);
1556	writel(msg->address_hi, iommu->reg + reg + 12);
1557	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1558}
1559
1560void dmar_msi_read(int irq, struct msi_msg *msg)
1561{
1562	struct intel_iommu *iommu = irq_get_handler_data(irq);
1563	int reg = dmar_msi_reg(iommu, irq);
1564	unsigned long flag;
1565
1566	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1567	msg->data = readl(iommu->reg + reg + 4);
1568	msg->address_lo = readl(iommu->reg + reg + 8);
1569	msg->address_hi = readl(iommu->reg + reg + 12);
1570	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1571}
1572
1573static int dmar_fault_do_one(struct intel_iommu *iommu, int type,
1574		u8 fault_reason, u16 source_id, unsigned long long addr)
1575{
1576	const char *reason;
1577	int fault_type;
1578
1579	reason = dmar_get_fault_reason(fault_reason, &fault_type);
1580
1581	if (fault_type == INTR_REMAP)
1582		pr_err("INTR-REMAP: Request device [[%02x:%02x.%d] "
1583		       "fault index %llx\n"
1584			"INTR-REMAP:[fault reason %02d] %s\n",
1585			(source_id >> 8), PCI_SLOT(source_id & 0xFF),
1586			PCI_FUNC(source_id & 0xFF), addr >> 48,
1587			fault_reason, reason);
1588	else
1589		pr_err("DMAR:[%s] Request device [%02x:%02x.%d] "
 
1590		       "fault addr %llx \n"
1591		       "DMAR:[fault reason %02d] %s\n",
1592		       (type ? "DMA Read" : "DMA Write"),
1593		       (source_id >> 8), PCI_SLOT(source_id & 0xFF),
1594		       PCI_FUNC(source_id & 0xFF), addr, fault_reason, reason);
1595	return 0;
1596}
1597
1598#define PRIMARY_FAULT_REG_LEN (16)
1599irqreturn_t dmar_fault(int irq, void *dev_id)
1600{
1601	struct intel_iommu *iommu = dev_id;
1602	int reg, fault_index;
1603	u32 fault_status;
1604	unsigned long flag;
1605
1606	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1607	fault_status = readl(iommu->reg + DMAR_FSTS_REG);
1608	if (fault_status)
1609		pr_err("DRHD: handling fault status reg %x\n", fault_status);
 
1610
1611	/* TBD: ignore advanced fault log currently */
1612	if (!(fault_status & DMA_FSTS_PPF))
1613		goto unlock_exit;
1614
1615	fault_index = dma_fsts_fault_record_index(fault_status);
1616	reg = cap_fault_reg_offset(iommu->cap);
1617	while (1) {
1618		u8 fault_reason;
1619		u16 source_id;
1620		u64 guest_addr;
1621		int type;
1622		u32 data;
1623
1624		/* highest 32 bits */
1625		data = readl(iommu->reg + reg +
1626				fault_index * PRIMARY_FAULT_REG_LEN + 12);
1627		if (!(data & DMA_FRCD_F))
1628			break;
1629
1630		fault_reason = dma_frcd_fault_reason(data);
1631		type = dma_frcd_type(data);
1632
1633		data = readl(iommu->reg + reg +
1634				fault_index * PRIMARY_FAULT_REG_LEN + 8);
1635		source_id = dma_frcd_source_id(data);
1636
1637		guest_addr = dmar_readq(iommu->reg + reg +
1638				fault_index * PRIMARY_FAULT_REG_LEN);
1639		guest_addr = dma_frcd_page_addr(guest_addr);
1640		/* clear the fault */
1641		writel(DMA_FRCD_F, iommu->reg + reg +
1642			fault_index * PRIMARY_FAULT_REG_LEN + 12);
1643
1644		raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1645
1646		dmar_fault_do_one(iommu, type, fault_reason,
1647				source_id, guest_addr);
1648
1649		fault_index++;
1650		if (fault_index >= cap_num_fault_regs(iommu->cap))
1651			fault_index = 0;
1652		raw_spin_lock_irqsave(&iommu->register_lock, flag);
1653	}
 
 
 
 
1654
1655	writel(DMA_FSTS_PFO | DMA_FSTS_PPF, iommu->reg + DMAR_FSTS_REG);
1656
1657unlock_exit:
1658	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1659	return IRQ_HANDLED;
1660}
1661
1662int dmar_set_interrupt(struct intel_iommu *iommu)
1663{
1664	int irq, ret;
1665
1666	/*
1667	 * Check if the fault interrupt is already initialized.
1668	 */
1669	if (iommu->irq)
1670		return 0;
1671
1672	irq = dmar_alloc_hwirq(iommu->seq_id, iommu->node, iommu);
1673	if (irq > 0) {
1674		iommu->irq = irq;
1675	} else {
1676		pr_err("No free IRQ vectors\n");
1677		return -EINVAL;
1678	}
1679
 
 
 
 
 
 
 
 
 
 
 
1680	ret = request_irq(irq, dmar_fault, IRQF_NO_THREAD, iommu->name, iommu);
1681	if (ret)
1682		pr_err("Can't request irq\n");
1683	return ret;
1684}
1685
1686int __init enable_drhd_fault_handling(void)
1687{
1688	struct dmar_drhd_unit *drhd;
1689	struct intel_iommu *iommu;
1690
1691	/*
1692	 * Enable fault control interrupt.
1693	 */
1694	for_each_iommu(iommu, drhd) {
1695		u32 fault_status;
1696		int ret = dmar_set_interrupt(iommu);
 
1697
1698		if (ret) {
1699			pr_err("DRHD %Lx: failed to enable fault, interrupt, ret %d\n",
 
1700			       (unsigned long long)drhd->reg_base_addr, ret);
1701			return -1;
1702		}
1703
1704		/*
1705		 * Clear any previous faults.
1706		 */
1707		dmar_fault(iommu->irq, iommu);
1708		fault_status = readl(iommu->reg + DMAR_FSTS_REG);
1709		writel(fault_status, iommu->reg + DMAR_FSTS_REG);
1710	}
1711
1712	return 0;
1713}
1714
1715/*
1716 * Re-enable Queued Invalidation interface.
1717 */
1718int dmar_reenable_qi(struct intel_iommu *iommu)
1719{
1720	if (!ecap_qis(iommu->ecap))
1721		return -ENOENT;
1722
1723	if (!iommu->qi)
1724		return -ENOENT;
1725
1726	/*
1727	 * First disable queued invalidation.
1728	 */
1729	dmar_disable_qi(iommu);
1730	/*
1731	 * Then enable queued invalidation again. Since there is no pending
1732	 * invalidation requests now, it's safe to re-enable queued
1733	 * invalidation.
1734	 */
1735	__dmar_enable_qi(iommu);
1736
1737	return 0;
1738}
1739
1740/*
1741 * Check interrupt remapping support in DMAR table description.
1742 */
1743int __init dmar_ir_support(void)
1744{
1745	struct acpi_table_dmar *dmar;
1746	dmar = (struct acpi_table_dmar *)dmar_tbl;
1747	if (!dmar)
1748		return 0;
1749	return dmar->flags & 0x1;
1750}
1751
1752/* Check whether DMAR units are in use */
1753static inline bool dmar_in_use(void)
1754{
1755	return irq_remapping_enabled || intel_iommu_enabled;
1756}
1757
1758static int __init dmar_free_unused_resources(void)
1759{
1760	struct dmar_drhd_unit *dmaru, *dmaru_n;
1761
1762	if (dmar_in_use())
1763		return 0;
1764
1765	if (dmar_dev_scope_status != 1 && !list_empty(&dmar_drhd_units))
1766		bus_unregister_notifier(&pci_bus_type, &dmar_pci_bus_nb);
1767
1768	down_write(&dmar_global_lock);
1769	list_for_each_entry_safe(dmaru, dmaru_n, &dmar_drhd_units, list) {
1770		list_del(&dmaru->list);
1771		dmar_free_drhd(dmaru);
1772	}
1773	up_write(&dmar_global_lock);
1774
1775	return 0;
1776}
1777
1778late_initcall(dmar_free_unused_resources);
1779IOMMU_INIT_POST(detect_intel_iommu);
1780
1781/*
1782 * DMAR Hotplug Support
1783 * For more details, please refer to Intel(R) Virtualization Technology
1784 * for Directed-IO Architecture Specifiction, Rev 2.2, Section 8.8
1785 * "Remapping Hardware Unit Hot Plug".
1786 */
1787static u8 dmar_hp_uuid[] = {
1788	/* 0000 */    0xA6, 0xA3, 0xC1, 0xD8, 0x9B, 0xBE, 0x9B, 0x4C,
1789	/* 0008 */    0x91, 0xBF, 0xC3, 0xCB, 0x81, 0xFC, 0x5D, 0xAF
1790};
1791
1792/*
1793 * Currently there's only one revision and BIOS will not check the revision id,
1794 * so use 0 for safety.
1795 */
1796#define	DMAR_DSM_REV_ID			0
1797#define	DMAR_DSM_FUNC_DRHD		1
1798#define	DMAR_DSM_FUNC_ATSR		2
1799#define	DMAR_DSM_FUNC_RHSA		3
1800
1801static inline bool dmar_detect_dsm(acpi_handle handle, int func)
1802{
1803	return acpi_check_dsm(handle, dmar_hp_uuid, DMAR_DSM_REV_ID, 1 << func);
1804}
1805
1806static int dmar_walk_dsm_resource(acpi_handle handle, int func,
1807				  dmar_res_handler_t handler, void *arg)
1808{
1809	int ret = -ENODEV;
1810	union acpi_object *obj;
1811	struct acpi_dmar_header *start;
1812	struct dmar_res_callback callback;
1813	static int res_type[] = {
1814		[DMAR_DSM_FUNC_DRHD] = ACPI_DMAR_TYPE_HARDWARE_UNIT,
1815		[DMAR_DSM_FUNC_ATSR] = ACPI_DMAR_TYPE_ROOT_ATS,
1816		[DMAR_DSM_FUNC_RHSA] = ACPI_DMAR_TYPE_HARDWARE_AFFINITY,
1817	};
1818
1819	if (!dmar_detect_dsm(handle, func))
1820		return 0;
1821
1822	obj = acpi_evaluate_dsm_typed(handle, dmar_hp_uuid, DMAR_DSM_REV_ID,
1823				      func, NULL, ACPI_TYPE_BUFFER);
1824	if (!obj)
1825		return -ENODEV;
1826
1827	memset(&callback, 0, sizeof(callback));
1828	callback.cb[res_type[func]] = handler;
1829	callback.arg[res_type[func]] = arg;
1830	start = (struct acpi_dmar_header *)obj->buffer.pointer;
1831	ret = dmar_walk_remapping_entries(start, obj->buffer.length, &callback);
1832
1833	ACPI_FREE(obj);
1834
1835	return ret;
1836}
1837
1838static int dmar_hp_add_drhd(struct acpi_dmar_header *header, void *arg)
1839{
1840	int ret;
1841	struct dmar_drhd_unit *dmaru;
1842
1843	dmaru = dmar_find_dmaru((struct acpi_dmar_hardware_unit *)header);
1844	if (!dmaru)
1845		return -ENODEV;
1846
1847	ret = dmar_ir_hotplug(dmaru, true);
1848	if (ret == 0)
1849		ret = dmar_iommu_hotplug(dmaru, true);
1850
1851	return ret;
1852}
1853
1854static int dmar_hp_remove_drhd(struct acpi_dmar_header *header, void *arg)
1855{
1856	int i, ret;
1857	struct device *dev;
1858	struct dmar_drhd_unit *dmaru;
1859
1860	dmaru = dmar_find_dmaru((struct acpi_dmar_hardware_unit *)header);
1861	if (!dmaru)
1862		return 0;
1863
1864	/*
1865	 * All PCI devices managed by this unit should have been destroyed.
1866	 */
1867	if (!dmaru->include_all && dmaru->devices && dmaru->devices_cnt)
1868		for_each_active_dev_scope(dmaru->devices,
1869					  dmaru->devices_cnt, i, dev)
1870			return -EBUSY;
1871
1872	ret = dmar_ir_hotplug(dmaru, false);
1873	if (ret == 0)
1874		ret = dmar_iommu_hotplug(dmaru, false);
1875
1876	return ret;
1877}
1878
1879static int dmar_hp_release_drhd(struct acpi_dmar_header *header, void *arg)
1880{
1881	struct dmar_drhd_unit *dmaru;
1882
1883	dmaru = dmar_find_dmaru((struct acpi_dmar_hardware_unit *)header);
1884	if (dmaru) {
1885		list_del_rcu(&dmaru->list);
1886		synchronize_rcu();
1887		dmar_free_drhd(dmaru);
1888	}
1889
1890	return 0;
1891}
1892
1893static int dmar_hotplug_insert(acpi_handle handle)
1894{
1895	int ret;
1896	int drhd_count = 0;
1897
1898	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1899				     &dmar_validate_one_drhd, (void *)1);
1900	if (ret)
1901		goto out;
1902
1903	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1904				     &dmar_parse_one_drhd, (void *)&drhd_count);
1905	if (ret == 0 && drhd_count == 0) {
1906		pr_warn(FW_BUG "No DRHD structures in buffer returned by _DSM method\n");
1907		goto out;
1908	} else if (ret) {
1909		goto release_drhd;
1910	}
1911
1912	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_RHSA,
1913				     &dmar_parse_one_rhsa, NULL);
1914	if (ret)
1915		goto release_drhd;
1916
1917	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
1918				     &dmar_parse_one_atsr, NULL);
1919	if (ret)
1920		goto release_atsr;
1921
1922	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1923				     &dmar_hp_add_drhd, NULL);
1924	if (!ret)
1925		return 0;
1926
1927	dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1928			       &dmar_hp_remove_drhd, NULL);
1929release_atsr:
1930	dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
1931			       &dmar_release_one_atsr, NULL);
1932release_drhd:
1933	dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1934			       &dmar_hp_release_drhd, NULL);
1935out:
1936	return ret;
1937}
1938
1939static int dmar_hotplug_remove(acpi_handle handle)
1940{
1941	int ret;
1942
1943	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
1944				     &dmar_check_one_atsr, NULL);
1945	if (ret)
1946		return ret;
1947
1948	ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1949				     &dmar_hp_remove_drhd, NULL);
1950	if (ret == 0) {
1951		WARN_ON(dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
1952					       &dmar_release_one_atsr, NULL));
1953		WARN_ON(dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1954					       &dmar_hp_release_drhd, NULL));
1955	} else {
1956		dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
1957				       &dmar_hp_add_drhd, NULL);
1958	}
1959
1960	return ret;
1961}
1962
1963static acpi_status dmar_get_dsm_handle(acpi_handle handle, u32 lvl,
1964				       void *context, void **retval)
1965{
1966	acpi_handle *phdl = retval;
1967
1968	if (dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) {
1969		*phdl = handle;
1970		return AE_CTRL_TERMINATE;
1971	}
1972
1973	return AE_OK;
1974}
1975
1976static int dmar_device_hotplug(acpi_handle handle, bool insert)
1977{
1978	int ret;
1979	acpi_handle tmp = NULL;
1980	acpi_status status;
1981
1982	if (!dmar_in_use())
1983		return 0;
1984
1985	if (dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) {
1986		tmp = handle;
1987	} else {
1988		status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
1989					     ACPI_UINT32_MAX,
1990					     dmar_get_dsm_handle,
1991					     NULL, NULL, &tmp);
1992		if (ACPI_FAILURE(status)) {
1993			pr_warn("Failed to locate _DSM method.\n");
1994			return -ENXIO;
1995		}
1996	}
1997	if (tmp == NULL)
1998		return 0;
1999
2000	down_write(&dmar_global_lock);
2001	if (insert)
2002		ret = dmar_hotplug_insert(tmp);
2003	else
2004		ret = dmar_hotplug_remove(tmp);
2005	up_write(&dmar_global_lock);
2006
2007	return ret;
2008}
2009
2010int dmar_device_add(acpi_handle handle)
2011{
2012	return dmar_device_hotplug(handle, true);
2013}
2014
2015int dmar_device_remove(acpi_handle handle)
2016{
2017	return dmar_device_hotplug(handle, false);
2018}
v3.5.6
   1/*
   2 * Copyright (c) 2006, Intel Corporation.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  15 * Place - Suite 330, Boston, MA 02111-1307 USA.
  16 *
  17 * Copyright (C) 2006-2008 Intel Corporation
  18 * Author: Ashok Raj <ashok.raj@intel.com>
  19 * Author: Shaohua Li <shaohua.li@intel.com>
  20 * Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  21 *
  22 * This file implements early detection/parsing of Remapping Devices
  23 * reported to OS through BIOS via DMA remapping reporting (DMAR) ACPI
  24 * tables.
  25 *
  26 * These routines are used by both DMA-remapping and Interrupt-remapping
  27 */
  28
 
 
  29#include <linux/pci.h>
  30#include <linux/dmar.h>
  31#include <linux/iova.h>
  32#include <linux/intel-iommu.h>
  33#include <linux/timer.h>
  34#include <linux/irq.h>
  35#include <linux/interrupt.h>
  36#include <linux/tboot.h>
  37#include <linux/dmi.h>
  38#include <linux/slab.h>
 
  39#include <asm/irq_remapping.h>
  40#include <asm/iommu_table.h>
  41
  42#define PREFIX "DMAR: "
 
 
 
 
 
 
 
 
  43
  44/* No locks are needed as DMA remapping hardware unit
  45 * list is constructed at boot time and hotplug of
  46 * these units are not supported by the architecture.
 
 
 
 
 
 
 
 
  47 */
 
  48LIST_HEAD(dmar_drhd_units);
  49
  50struct acpi_table_header * __initdata dmar_tbl;
  51static acpi_size dmar_tbl_size;
 
 
  52
  53static void __init dmar_register_drhd_unit(struct dmar_drhd_unit *drhd)
 
 
 
  54{
  55	/*
  56	 * add INCLUDE_ALL at the tail, so scan the list will find it at
  57	 * the very end.
  58	 */
  59	if (drhd->include_all)
  60		list_add_tail(&drhd->list, &dmar_drhd_units);
  61	else
  62		list_add(&drhd->list, &dmar_drhd_units);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  63}
  64
  65static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope,
  66					   struct pci_dev **dev, u16 segment)
  67{
  68	struct pci_bus *bus;
  69	struct pci_dev *pdev = NULL;
  70	struct acpi_dmar_pci_path *path;
  71	int count;
 
 
 
 
 
 
 
 
 
 
 
  72
  73	bus = pci_find_bus(segment, scope->bus);
  74	path = (struct acpi_dmar_pci_path *)(scope + 1);
  75	count = (scope->length - sizeof(struct acpi_dmar_device_scope))
  76		/ sizeof(struct acpi_dmar_pci_path);
  77
  78	while (count) {
  79		if (pdev)
  80			pci_dev_put(pdev);
  81		/*
  82		 * Some BIOSes list non-exist devices in DMAR table, just
  83		 * ignore it
  84		 */
  85		if (!bus) {
  86			printk(KERN_WARNING
  87			PREFIX "Device scope bus [%d] not found\n",
  88			scope->bus);
  89			break;
 
 
 
 
 
 
 
 
 
  90		}
  91		pdev = pci_get_slot(bus, PCI_DEVFN(path->dev, path->fn));
  92		if (!pdev) {
  93			printk(KERN_WARNING PREFIX
  94			"Device scope device [%04x:%02x:%02x.%02x] not found\n",
  95				segment, bus->number, path->dev, path->fn);
  96			break;
 
 
 
 
 
 
 
 
  97		}
  98		path ++;
  99		count --;
 100		bus = pdev->subordinate;
 101	}
 102	if (!pdev) {
 103		printk(KERN_WARNING PREFIX
 104		"Device scope device [%04x:%02x:%02x.%02x] not found\n",
 105		segment, scope->bus, path->dev, path->fn);
 106		*dev = NULL;
 107		return 0;
 108	}
 109	if ((scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT && \
 110			pdev->subordinate) || (scope->entry_type == \
 111			ACPI_DMAR_SCOPE_TYPE_BRIDGE && !pdev->subordinate)) {
 112		pci_dev_put(pdev);
 113		printk(KERN_WARNING PREFIX
 114			"Device scope type does not match for %s\n",
 115			 pci_name(pdev));
 116		return -EINVAL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 117	}
 118	*dev = pdev;
 119	return 0;
 120}
 121
 122int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
 123				struct pci_dev ***devices, u16 segment)
 
 
 
 124{
 
 
 125	struct acpi_dmar_device_scope *scope;
 126	void * tmp = start;
 127	int index;
 128	int ret;
 
 129
 130	*cnt = 0;
 131	while (start < end) {
 132		scope = start;
 133		if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
 134		    scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE)
 135			(*cnt)++;
 136		else if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_IOAPIC) {
 137			printk(KERN_WARNING PREFIX
 138			       "Unsupported device scope\n");
 
 
 
 
 
 
 
 
 139		}
 140		start += scope->length;
 
 
 
 
 
 
 
 
 
 141	}
 142	if (*cnt == 0)
 
 
 
 
 
 
 
 
 
 
 143		return 0;
 144
 145	*devices = kcalloc(*cnt, sizeof(struct pci_dev *), GFP_KERNEL);
 146	if (!*devices)
 147		return -ENOMEM;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 148
 149	start = tmp;
 150	index = 0;
 151	while (start < end) {
 152		scope = start;
 153		if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
 154		    scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE) {
 155			ret = dmar_parse_one_dev_scope(scope,
 156				&(*devices)[index], segment);
 157			if (ret) {
 158				kfree(*devices);
 159				return ret;
 160			}
 161			index ++;
 162		}
 163		start += scope->length;
 164	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 165
 166	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 167}
 168
 169/**
 170 * dmar_parse_one_drhd - parses exactly one DMA remapping hardware definition
 171 * structure which uniquely represent one DMA remapping hardware unit
 172 * present in the platform
 173 */
 174static int __init
 175dmar_parse_one_drhd(struct acpi_dmar_header *header)
 176{
 177	struct acpi_dmar_hardware_unit *drhd;
 178	struct dmar_drhd_unit *dmaru;
 179	int ret = 0;
 180
 181	drhd = (struct acpi_dmar_hardware_unit *)header;
 182	dmaru = kzalloc(sizeof(*dmaru), GFP_KERNEL);
 
 
 
 
 183	if (!dmaru)
 184		return -ENOMEM;
 185
 186	dmaru->hdr = header;
 
 
 
 
 
 187	dmaru->reg_base_addr = drhd->address;
 188	dmaru->segment = drhd->segment;
 189	dmaru->include_all = drhd->flags & 0x1; /* BIT0: INCLUDE_ALL */
 
 
 
 
 
 
 
 190
 191	ret = alloc_iommu(dmaru);
 192	if (ret) {
 
 
 193		kfree(dmaru);
 194		return ret;
 195	}
 196	dmar_register_drhd_unit(dmaru);
 
 
 
 
 
 197	return 0;
 198}
 199
 200static int __init dmar_parse_dev(struct dmar_drhd_unit *dmaru)
 201{
 202	struct acpi_dmar_hardware_unit *drhd;
 203	int ret = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 204
 205	drhd = (struct acpi_dmar_hardware_unit *) dmaru->hdr;
 206
 207	if (dmaru->include_all)
 208		return 0;
 209
 210	ret = dmar_parse_dev_scope((void *)(drhd + 1),
 211				((void *)drhd) + drhd->header.length,
 212				&dmaru->devices_cnt, &dmaru->devices,
 213				drhd->segment);
 214	if (ret) {
 215		list_del(&dmaru->list);
 216		kfree(dmaru);
 217	}
 218	return ret;
 219}
 220
 221#ifdef CONFIG_ACPI_NUMA
 222static int __init
 223dmar_parse_one_rhsa(struct acpi_dmar_header *header)
 224{
 225	struct acpi_dmar_rhsa *rhsa;
 226	struct dmar_drhd_unit *drhd;
 227
 228	rhsa = (struct acpi_dmar_rhsa *)header;
 229	for_each_drhd_unit(drhd) {
 230		if (drhd->reg_base_addr == rhsa->base_address) {
 231			int node = acpi_map_pxm_to_node(rhsa->proximity_domain);
 232
 233			if (!node_online(node))
 234				node = -1;
 235			drhd->iommu->node = node;
 236			return 0;
 237		}
 238	}
 239	WARN_TAINT(
 240		1, TAINT_FIRMWARE_WORKAROUND,
 241		"Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n"
 242		"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
 243		drhd->reg_base_addr,
 244		dmi_get_system_info(DMI_BIOS_VENDOR),
 245		dmi_get_system_info(DMI_BIOS_VERSION),
 246		dmi_get_system_info(DMI_PRODUCT_VERSION));
 247
 248	return 0;
 249}
 
 
 250#endif
 251
 252static void __init
 253dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
 254{
 255	struct acpi_dmar_hardware_unit *drhd;
 256	struct acpi_dmar_reserved_memory *rmrr;
 257	struct acpi_dmar_atsr *atsr;
 258	struct acpi_dmar_rhsa *rhsa;
 259
 260	switch (header->type) {
 261	case ACPI_DMAR_TYPE_HARDWARE_UNIT:
 262		drhd = container_of(header, struct acpi_dmar_hardware_unit,
 263				    header);
 264		printk (KERN_INFO PREFIX
 265			"DRHD base: %#016Lx flags: %#x\n",
 266			(unsigned long long)drhd->address, drhd->flags);
 267		break;
 268	case ACPI_DMAR_TYPE_RESERVED_MEMORY:
 269		rmrr = container_of(header, struct acpi_dmar_reserved_memory,
 270				    header);
 271		printk (KERN_INFO PREFIX
 272			"RMRR base: %#016Lx end: %#016Lx\n",
 273			(unsigned long long)rmrr->base_address,
 274			(unsigned long long)rmrr->end_address);
 275		break;
 276	case ACPI_DMAR_TYPE_ATSR:
 277		atsr = container_of(header, struct acpi_dmar_atsr, header);
 278		printk(KERN_INFO PREFIX "ATSR flags: %#x\n", atsr->flags);
 279		break;
 280	case ACPI_DMAR_HARDWARE_AFFINITY:
 281		rhsa = container_of(header, struct acpi_dmar_rhsa, header);
 282		printk(KERN_INFO PREFIX "RHSA base: %#016Lx proximity domain: %#x\n",
 283		       (unsigned long long)rhsa->base_address,
 284		       rhsa->proximity_domain);
 285		break;
 
 
 
 
 286	}
 287}
 288
 289/**
 290 * dmar_table_detect - checks to see if the platform supports DMAR devices
 291 */
 292static int __init dmar_table_detect(void)
 293{
 294	acpi_status status = AE_OK;
 295
 296	/* if we could find DMAR table, then there are DMAR devices */
 297	status = acpi_get_table_with_size(ACPI_SIG_DMAR, 0,
 298				(struct acpi_table_header **)&dmar_tbl,
 299				&dmar_tbl_size);
 300
 301	if (ACPI_SUCCESS(status) && !dmar_tbl) {
 302		printk (KERN_WARNING PREFIX "Unable to map DMAR\n");
 303		status = AE_NOT_FOUND;
 304	}
 305
 306	return (ACPI_SUCCESS(status) ? 1 : 0);
 307}
 308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 309/**
 310 * parse_dmar_table - parses the DMA reporting table
 311 */
 312static int __init
 313parse_dmar_table(void)
 314{
 315	struct acpi_table_dmar *dmar;
 316	struct acpi_dmar_header *entry_header;
 317	int ret = 0;
 
 
 
 
 
 
 
 
 
 
 
 318
 319	/*
 320	 * Do it again, earlier dmar_tbl mapping could be mapped with
 321	 * fixed map.
 322	 */
 323	dmar_table_detect();
 324
 325	/*
 326	 * ACPI tables may not be DMA protected by tboot, so use DMAR copy
 327	 * SINIT saved in SinitMleData in TXT heap (which is DMA protected)
 328	 */
 329	dmar_tbl = tboot_get_dmar_table(dmar_tbl);
 330
 331	dmar = (struct acpi_table_dmar *)dmar_tbl;
 332	if (!dmar)
 333		return -ENODEV;
 334
 335	if (dmar->width < PAGE_SHIFT - 1) {
 336		printk(KERN_WARNING PREFIX "Invalid DMAR haw\n");
 337		return -EINVAL;
 338	}
 339
 340	printk (KERN_INFO PREFIX "Host address width %d\n",
 341		dmar->width + 1);
 342
 343	entry_header = (struct acpi_dmar_header *)(dmar + 1);
 344	while (((unsigned long)entry_header) <
 345			(((unsigned long)dmar) + dmar_tbl->length)) {
 346		/* Avoid looping forever on bad ACPI tables */
 347		if (entry_header->length == 0) {
 348			printk(KERN_WARNING PREFIX
 349				"Invalid 0-length structure\n");
 350			ret = -EINVAL;
 351			break;
 352		}
 353
 354		dmar_table_print_dmar_entry(entry_header);
 355
 356		switch (entry_header->type) {
 357		case ACPI_DMAR_TYPE_HARDWARE_UNIT:
 358			ret = dmar_parse_one_drhd(entry_header);
 359			break;
 360		case ACPI_DMAR_TYPE_RESERVED_MEMORY:
 361			ret = dmar_parse_one_rmrr(entry_header);
 362			break;
 363		case ACPI_DMAR_TYPE_ATSR:
 364			ret = dmar_parse_one_atsr(entry_header);
 365			break;
 366		case ACPI_DMAR_HARDWARE_AFFINITY:
 367#ifdef CONFIG_ACPI_NUMA
 368			ret = dmar_parse_one_rhsa(entry_header);
 369#endif
 370			break;
 371		default:
 372			printk(KERN_WARNING PREFIX
 373				"Unknown DMAR structure type %d\n",
 374				entry_header->type);
 375			ret = 0; /* for forward compatibility */
 376			break;
 377		}
 378		if (ret)
 379			break;
 380
 381		entry_header = ((void *)entry_header + entry_header->length);
 382	}
 383	return ret;
 384}
 385
 386static int dmar_pci_device_match(struct pci_dev *devices[], int cnt,
 387			  struct pci_dev *dev)
 388{
 389	int index;
 
 390
 391	while (dev) {
 392		for (index = 0; index < cnt; index++)
 393			if (dev == devices[index])
 394				return 1;
 395
 396		/* Check our parent */
 397		dev = dev->bus->self;
 398	}
 399
 400	return 0;
 401}
 402
 403struct dmar_drhd_unit *
 404dmar_find_matched_drhd_unit(struct pci_dev *dev)
 405{
 406	struct dmar_drhd_unit *dmaru = NULL;
 407	struct acpi_dmar_hardware_unit *drhd;
 408
 409	dev = pci_physfn(dev);
 410
 411	list_for_each_entry(dmaru, &dmar_drhd_units, list) {
 
 412		drhd = container_of(dmaru->hdr,
 413				    struct acpi_dmar_hardware_unit,
 414				    header);
 415
 416		if (dmaru->include_all &&
 417		    drhd->segment == pci_domain_nr(dev->bus))
 418			return dmaru;
 419
 420		if (dmar_pci_device_match(dmaru->devices,
 421					  dmaru->devices_cnt, dev))
 422			return dmaru;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 423	}
 
 
 
 
 
 
 
 424
 425	return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 426}
 427
 428int __init dmar_dev_scope_init(void)
 429{
 430	static int dmar_dev_scope_initialized;
 431	struct dmar_drhd_unit *drhd, *drhd_n;
 432	int ret = -ENODEV;
 433
 434	if (dmar_dev_scope_initialized)
 435		return dmar_dev_scope_initialized;
 436
 437	if (list_empty(&dmar_drhd_units))
 438		goto fail;
 
 
 439
 440	list_for_each_entry_safe(drhd, drhd_n, &dmar_drhd_units, list) {
 441		ret = dmar_parse_dev(drhd);
 442		if (ret)
 443			goto fail;
 444	}
 445
 446	ret = dmar_parse_rmrr_atsr_dev();
 447	if (ret)
 448		goto fail;
 
 
 
 
 
 
 
 
 
 
 449
 450	dmar_dev_scope_initialized = 1;
 451	return 0;
 452
 453fail:
 454	dmar_dev_scope_initialized = ret;
 455	return ret;
 456}
 457
 458
 459int __init dmar_table_init(void)
 460{
 461	static int dmar_table_initialized;
 462	int ret;
 463
 464	if (dmar_table_initialized)
 465		return 0;
 466
 467	dmar_table_initialized = 1;
 468
 469	ret = parse_dmar_table();
 470	if (ret) {
 471		if (ret != -ENODEV)
 472			printk(KERN_INFO PREFIX "parse DMAR table failure.\n");
 473		return ret;
 474	}
 475
 476	if (list_empty(&dmar_drhd_units)) {
 477		printk(KERN_INFO PREFIX "No DMAR devices found\n");
 478		return -ENODEV;
 
 479	}
 480
 481	return 0;
 482}
 483
 484static void warn_invalid_dmar(u64 addr, const char *message)
 485{
 486	WARN_TAINT_ONCE(
 487		1, TAINT_FIRMWARE_WORKAROUND,
 488		"Your BIOS is broken; DMAR reported at address %llx%s!\n"
 489		"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
 490		addr, message,
 491		dmi_get_system_info(DMI_BIOS_VENDOR),
 492		dmi_get_system_info(DMI_BIOS_VERSION),
 493		dmi_get_system_info(DMI_PRODUCT_VERSION));
 494}
 495
 496int __init check_zero_address(void)
 
 497{
 498	struct acpi_table_dmar *dmar;
 499	struct acpi_dmar_header *entry_header;
 500	struct acpi_dmar_hardware_unit *drhd;
 
 
 501
 502	dmar = (struct acpi_table_dmar *)dmar_tbl;
 503	entry_header = (struct acpi_dmar_header *)(dmar + 1);
 
 
 
 504
 505	while (((unsigned long)entry_header) <
 506			(((unsigned long)dmar) + dmar_tbl->length)) {
 507		/* Avoid looping forever on bad ACPI tables */
 508		if (entry_header->length == 0) {
 509			printk(KERN_WARNING PREFIX
 510				"Invalid 0-length structure\n");
 511			return 0;
 512		}
 513
 514		if (entry_header->type == ACPI_DMAR_TYPE_HARDWARE_UNIT) {
 515			void __iomem *addr;
 516			u64 cap, ecap;
 517
 518			drhd = (void *)entry_header;
 519			if (!drhd->address) {
 520				warn_invalid_dmar(0, "");
 521				goto failed;
 522			}
 523
 524			addr = early_ioremap(drhd->address, VTD_PAGE_SIZE);
 525			if (!addr ) {
 526				printk("IOMMU: can't validate: %llx\n", drhd->address);
 527				goto failed;
 528			}
 529			cap = dmar_readq(addr + DMAR_CAP_REG);
 530			ecap = dmar_readq(addr + DMAR_ECAP_REG);
 531			early_iounmap(addr, VTD_PAGE_SIZE);
 532			if (cap == (uint64_t)-1 && ecap == (uint64_t)-1) {
 533				warn_invalid_dmar(drhd->address,
 534						  " returns all ones");
 535				goto failed;
 536			}
 537		}
 538
 539		entry_header = ((void *)entry_header + entry_header->length);
 
 
 540	}
 541	return 1;
 542
 543failed:
 544	return 0;
 545}
 546
 547int __init detect_intel_iommu(void)
 548{
 549	int ret;
 
 
 
 
 550
 
 551	ret = dmar_table_detect();
 552	if (ret)
 553		ret = check_zero_address();
 554	{
 555		struct acpi_table_dmar *dmar;
 556
 557		dmar = (struct acpi_table_dmar *) dmar_tbl;
 558
 559		if (ret && irq_remapping_enabled && cpu_has_x2apic &&
 560		    dmar->flags & 0x1)
 561			printk(KERN_INFO
 562			       "Queued invalidation will be enabled to support x2apic and Intr-remapping.\n");
 563
 564		if (ret && !no_iommu && !iommu_detected && !dmar_disabled) {
 565			iommu_detected = 1;
 566			/* Make sure ACS will be enabled */
 567			pci_request_acs();
 568		}
 569
 570#ifdef CONFIG_X86
 571		if (ret)
 572			x86_init.iommu.iommu_init = intel_iommu_init;
 573#endif
 574	}
 575	early_acpi_os_unmap_memory(dmar_tbl, dmar_tbl_size);
 576	dmar_tbl = NULL;
 
 577
 578	return ret ? 1 : -ENODEV;
 579}
 580
 581
 582int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 583{
 584	struct intel_iommu *iommu;
 585	int map_size;
 586	u32 ver;
 587	static int iommu_allocated = 0;
 588	int agaw = 0;
 589	int msagaw = 0;
 
 590
 591	if (!drhd->reg_base_addr) {
 592		warn_invalid_dmar(0, "");
 593		return -EINVAL;
 594	}
 595
 596	iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
 597	if (!iommu)
 598		return -ENOMEM;
 599
 600	iommu->seq_id = iommu_allocated++;
 601	sprintf (iommu->name, "dmar%d", iommu->seq_id);
 602
 603	iommu->reg = ioremap(drhd->reg_base_addr, VTD_PAGE_SIZE);
 604	if (!iommu->reg) {
 605		printk(KERN_ERR "IOMMU: can't map the region\n");
 606		goto error;
 607	}
 608	iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG);
 609	iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);
 610
 611	if (iommu->cap == (uint64_t)-1 && iommu->ecap == (uint64_t)-1) {
 612		warn_invalid_dmar(drhd->reg_base_addr, " returns all ones");
 613		goto err_unmap;
 
 614	}
 615
 
 616	agaw = iommu_calculate_agaw(iommu);
 617	if (agaw < 0) {
 618		printk(KERN_ERR
 619		       "Cannot get a valid agaw for iommu (seq_id = %d)\n",
 620		       iommu->seq_id);
 621		goto err_unmap;
 622	}
 623	msagaw = iommu_calculate_max_sagaw(iommu);
 624	if (msagaw < 0) {
 625		printk(KERN_ERR
 626			"Cannot get a valid max agaw for iommu (seq_id = %d)\n",
 627			iommu->seq_id);
 628		goto err_unmap;
 629	}
 630	iommu->agaw = agaw;
 631	iommu->msagaw = msagaw;
 
 632
 633	iommu->node = -1;
 634
 635	/* the registers might be more than one page */
 636	map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),
 637		cap_max_fault_reg_offset(iommu->cap));
 638	map_size = VTD_PAGE_ALIGN(map_size);
 639	if (map_size > VTD_PAGE_SIZE) {
 640		iounmap(iommu->reg);
 641		iommu->reg = ioremap(drhd->reg_base_addr, map_size);
 642		if (!iommu->reg) {
 643			printk(KERN_ERR "IOMMU: can't map the region\n");
 644			goto error;
 645		}
 646	}
 647
 648	ver = readl(iommu->reg + DMAR_VER_REG);
 649	pr_info("IOMMU %d: reg_base_addr %llx ver %d:%d cap %llx ecap %llx\n",
 650		iommu->seq_id,
 651		(unsigned long long)drhd->reg_base_addr,
 652		DMAR_VER_MAJOR(ver), DMAR_VER_MINOR(ver),
 653		(unsigned long long)iommu->cap,
 654		(unsigned long long)iommu->ecap);
 655
 
 
 
 
 
 
 
 
 
 656	raw_spin_lock_init(&iommu->register_lock);
 657
 
 
 
 
 
 
 
 
 
 
 
 658	drhd->iommu = iommu;
 
 659	return 0;
 660
 661 err_unmap:
 662	iounmap(iommu->reg);
 663 error:
 
 
 664	kfree(iommu);
 665	return -1;
 666}
 667
 668void free_iommu(struct intel_iommu *iommu)
 669{
 670	if (!iommu)
 671		return;
 
 
 
 
 
 
 
 
 
 
 672
 673	free_dmar_iommu(iommu);
 
 
 
 
 674
 675	if (iommu->reg)
 676		iounmap(iommu->reg);
 
 
 677	kfree(iommu);
 678}
 679
 680/*
 681 * Reclaim all the submitted descriptors which have completed its work.
 682 */
 683static inline void reclaim_free_desc(struct q_inval *qi)
 684{
 685	while (qi->desc_status[qi->free_tail] == QI_DONE ||
 686	       qi->desc_status[qi->free_tail] == QI_ABORT) {
 687		qi->desc_status[qi->free_tail] = QI_FREE;
 688		qi->free_tail = (qi->free_tail + 1) % QI_LENGTH;
 689		qi->free_cnt++;
 690	}
 691}
 692
 693static int qi_check_fault(struct intel_iommu *iommu, int index)
 694{
 695	u32 fault;
 696	int head, tail;
 697	struct q_inval *qi = iommu->qi;
 698	int wait_index = (index + 1) % QI_LENGTH;
 699
 700	if (qi->desc_status[wait_index] == QI_ABORT)
 701		return -EAGAIN;
 702
 703	fault = readl(iommu->reg + DMAR_FSTS_REG);
 704
 705	/*
 706	 * If IQE happens, the head points to the descriptor associated
 707	 * with the error. No new descriptors are fetched until the IQE
 708	 * is cleared.
 709	 */
 710	if (fault & DMA_FSTS_IQE) {
 711		head = readl(iommu->reg + DMAR_IQH_REG);
 712		if ((head >> DMAR_IQ_SHIFT) == index) {
 713			printk(KERN_ERR "VT-d detected invalid descriptor: "
 714				"low=%llx, high=%llx\n",
 715				(unsigned long long)qi->desc[index].low,
 716				(unsigned long long)qi->desc[index].high);
 717			memcpy(&qi->desc[index], &qi->desc[wait_index],
 718					sizeof(struct qi_desc));
 719			__iommu_flush_cache(iommu, &qi->desc[index],
 720					sizeof(struct qi_desc));
 721			writel(DMA_FSTS_IQE, iommu->reg + DMAR_FSTS_REG);
 722			return -EINVAL;
 723		}
 724	}
 725
 726	/*
 727	 * If ITE happens, all pending wait_desc commands are aborted.
 728	 * No new descriptors are fetched until the ITE is cleared.
 729	 */
 730	if (fault & DMA_FSTS_ITE) {
 731		head = readl(iommu->reg + DMAR_IQH_REG);
 732		head = ((head >> DMAR_IQ_SHIFT) - 1 + QI_LENGTH) % QI_LENGTH;
 733		head |= 1;
 734		tail = readl(iommu->reg + DMAR_IQT_REG);
 735		tail = ((tail >> DMAR_IQ_SHIFT) - 1 + QI_LENGTH) % QI_LENGTH;
 736
 737		writel(DMA_FSTS_ITE, iommu->reg + DMAR_FSTS_REG);
 738
 739		do {
 740			if (qi->desc_status[head] == QI_IN_USE)
 741				qi->desc_status[head] = QI_ABORT;
 742			head = (head - 2 + QI_LENGTH) % QI_LENGTH;
 743		} while (head != tail);
 744
 745		if (qi->desc_status[wait_index] == QI_ABORT)
 746			return -EAGAIN;
 747	}
 748
 749	if (fault & DMA_FSTS_ICE)
 750		writel(DMA_FSTS_ICE, iommu->reg + DMAR_FSTS_REG);
 751
 752	return 0;
 753}
 754
 755/*
 756 * Submit the queued invalidation descriptor to the remapping
 757 * hardware unit and wait for its completion.
 758 */
 759int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
 760{
 761	int rc;
 762	struct q_inval *qi = iommu->qi;
 763	struct qi_desc *hw, wait_desc;
 764	int wait_index, index;
 765	unsigned long flags;
 766
 767	if (!qi)
 768		return 0;
 769
 770	hw = qi->desc;
 771
 772restart:
 773	rc = 0;
 774
 775	raw_spin_lock_irqsave(&qi->q_lock, flags);
 776	while (qi->free_cnt < 3) {
 777		raw_spin_unlock_irqrestore(&qi->q_lock, flags);
 778		cpu_relax();
 779		raw_spin_lock_irqsave(&qi->q_lock, flags);
 780	}
 781
 782	index = qi->free_head;
 783	wait_index = (index + 1) % QI_LENGTH;
 784
 785	qi->desc_status[index] = qi->desc_status[wait_index] = QI_IN_USE;
 786
 787	hw[index] = *desc;
 788
 789	wait_desc.low = QI_IWD_STATUS_DATA(QI_DONE) |
 790			QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
 791	wait_desc.high = virt_to_phys(&qi->desc_status[wait_index]);
 792
 793	hw[wait_index] = wait_desc;
 794
 795	__iommu_flush_cache(iommu, &hw[index], sizeof(struct qi_desc));
 796	__iommu_flush_cache(iommu, &hw[wait_index], sizeof(struct qi_desc));
 797
 798	qi->free_head = (qi->free_head + 2) % QI_LENGTH;
 799	qi->free_cnt -= 2;
 800
 801	/*
 802	 * update the HW tail register indicating the presence of
 803	 * new descriptors.
 804	 */
 805	writel(qi->free_head << DMAR_IQ_SHIFT, iommu->reg + DMAR_IQT_REG);
 806
 807	while (qi->desc_status[wait_index] != QI_DONE) {
 808		/*
 809		 * We will leave the interrupts disabled, to prevent interrupt
 810		 * context to queue another cmd while a cmd is already submitted
 811		 * and waiting for completion on this cpu. This is to avoid
 812		 * a deadlock where the interrupt context can wait indefinitely
 813		 * for free slots in the queue.
 814		 */
 815		rc = qi_check_fault(iommu, index);
 816		if (rc)
 817			break;
 818
 819		raw_spin_unlock(&qi->q_lock);
 820		cpu_relax();
 821		raw_spin_lock(&qi->q_lock);
 822	}
 823
 824	qi->desc_status[index] = QI_DONE;
 825
 826	reclaim_free_desc(qi);
 827	raw_spin_unlock_irqrestore(&qi->q_lock, flags);
 828
 829	if (rc == -EAGAIN)
 830		goto restart;
 831
 832	return rc;
 833}
 834
 835/*
 836 * Flush the global interrupt entry cache.
 837 */
 838void qi_global_iec(struct intel_iommu *iommu)
 839{
 840	struct qi_desc desc;
 841
 842	desc.low = QI_IEC_TYPE;
 843	desc.high = 0;
 844
 845	/* should never fail */
 846	qi_submit_sync(&desc, iommu);
 847}
 848
 849void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
 850		      u64 type)
 851{
 852	struct qi_desc desc;
 853
 854	desc.low = QI_CC_FM(fm) | QI_CC_SID(sid) | QI_CC_DID(did)
 855			| QI_CC_GRAN(type) | QI_CC_TYPE;
 856	desc.high = 0;
 857
 858	qi_submit_sync(&desc, iommu);
 859}
 860
 861void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
 862		    unsigned int size_order, u64 type)
 863{
 864	u8 dw = 0, dr = 0;
 865
 866	struct qi_desc desc;
 867	int ih = 0;
 868
 869	if (cap_write_drain(iommu->cap))
 870		dw = 1;
 871
 872	if (cap_read_drain(iommu->cap))
 873		dr = 1;
 874
 875	desc.low = QI_IOTLB_DID(did) | QI_IOTLB_DR(dr) | QI_IOTLB_DW(dw)
 876		| QI_IOTLB_GRAN(type) | QI_IOTLB_TYPE;
 877	desc.high = QI_IOTLB_ADDR(addr) | QI_IOTLB_IH(ih)
 878		| QI_IOTLB_AM(size_order);
 879
 880	qi_submit_sync(&desc, iommu);
 881}
 882
 883void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 qdep,
 884			u64 addr, unsigned mask)
 885{
 886	struct qi_desc desc;
 887
 888	if (mask) {
 889		BUG_ON(addr & ((1 << (VTD_PAGE_SHIFT + mask)) - 1));
 890		addr |= (1 << (VTD_PAGE_SHIFT + mask - 1)) - 1;
 891		desc.high = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE;
 892	} else
 893		desc.high = QI_DEV_IOTLB_ADDR(addr);
 894
 895	if (qdep >= QI_DEV_IOTLB_MAX_INVS)
 896		qdep = 0;
 897
 898	desc.low = QI_DEV_IOTLB_SID(sid) | QI_DEV_IOTLB_QDEP(qdep) |
 899		   QI_DIOTLB_TYPE;
 900
 901	qi_submit_sync(&desc, iommu);
 902}
 903
 904/*
 905 * Disable Queued Invalidation interface.
 906 */
 907void dmar_disable_qi(struct intel_iommu *iommu)
 908{
 909	unsigned long flags;
 910	u32 sts;
 911	cycles_t start_time = get_cycles();
 912
 913	if (!ecap_qis(iommu->ecap))
 914		return;
 915
 916	raw_spin_lock_irqsave(&iommu->register_lock, flags);
 917
 918	sts =  dmar_readq(iommu->reg + DMAR_GSTS_REG);
 919	if (!(sts & DMA_GSTS_QIES))
 920		goto end;
 921
 922	/*
 923	 * Give a chance to HW to complete the pending invalidation requests.
 924	 */
 925	while ((readl(iommu->reg + DMAR_IQT_REG) !=
 926		readl(iommu->reg + DMAR_IQH_REG)) &&
 927		(DMAR_OPERATION_TIMEOUT > (get_cycles() - start_time)))
 928		cpu_relax();
 929
 930	iommu->gcmd &= ~DMA_GCMD_QIE;
 931	writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
 932
 933	IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl,
 934		      !(sts & DMA_GSTS_QIES), sts);
 935end:
 936	raw_spin_unlock_irqrestore(&iommu->register_lock, flags);
 937}
 938
 939/*
 940 * Enable queued invalidation.
 941 */
 942static void __dmar_enable_qi(struct intel_iommu *iommu)
 943{
 944	u32 sts;
 945	unsigned long flags;
 946	struct q_inval *qi = iommu->qi;
 947
 948	qi->free_head = qi->free_tail = 0;
 949	qi->free_cnt = QI_LENGTH;
 950
 951	raw_spin_lock_irqsave(&iommu->register_lock, flags);
 952
 953	/* write zero to the tail reg */
 954	writel(0, iommu->reg + DMAR_IQT_REG);
 955
 956	dmar_writeq(iommu->reg + DMAR_IQA_REG, virt_to_phys(qi->desc));
 957
 958	iommu->gcmd |= DMA_GCMD_QIE;
 959	writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
 960
 961	/* Make sure hardware complete it */
 962	IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts);
 963
 964	raw_spin_unlock_irqrestore(&iommu->register_lock, flags);
 965}
 966
 967/*
 968 * Enable Queued Invalidation interface. This is a must to support
 969 * interrupt-remapping. Also used by DMA-remapping, which replaces
 970 * register based IOTLB invalidation.
 971 */
 972int dmar_enable_qi(struct intel_iommu *iommu)
 973{
 974	struct q_inval *qi;
 975	struct page *desc_page;
 976
 977	if (!ecap_qis(iommu->ecap))
 978		return -ENOENT;
 979
 980	/*
 981	 * queued invalidation is already setup and enabled.
 982	 */
 983	if (iommu->qi)
 984		return 0;
 985
 986	iommu->qi = kmalloc(sizeof(*qi), GFP_ATOMIC);
 987	if (!iommu->qi)
 988		return -ENOMEM;
 989
 990	qi = iommu->qi;
 991
 992
 993	desc_page = alloc_pages_node(iommu->node, GFP_ATOMIC | __GFP_ZERO, 0);
 994	if (!desc_page) {
 995		kfree(qi);
 996		iommu->qi = 0;
 997		return -ENOMEM;
 998	}
 999
1000	qi->desc = page_address(desc_page);
1001
1002	qi->desc_status = kmalloc(QI_LENGTH * sizeof(int), GFP_ATOMIC);
1003	if (!qi->desc_status) {
1004		free_page((unsigned long) qi->desc);
1005		kfree(qi);
1006		iommu->qi = 0;
1007		return -ENOMEM;
1008	}
1009
1010	qi->free_head = qi->free_tail = 0;
1011	qi->free_cnt = QI_LENGTH;
1012
1013	raw_spin_lock_init(&qi->q_lock);
1014
1015	__dmar_enable_qi(iommu);
1016
1017	return 0;
1018}
1019
1020/* iommu interrupt handling. Most stuff are MSI-like. */
1021
1022enum faulttype {
1023	DMA_REMAP,
1024	INTR_REMAP,
1025	UNKNOWN,
1026};
1027
1028static const char *dma_remap_fault_reasons[] =
1029{
1030	"Software",
1031	"Present bit in root entry is clear",
1032	"Present bit in context entry is clear",
1033	"Invalid context entry",
1034	"Access beyond MGAW",
1035	"PTE Write access is not set",
1036	"PTE Read access is not set",
1037	"Next page table ptr is invalid",
1038	"Root table address invalid",
1039	"Context table ptr is invalid",
1040	"non-zero reserved fields in RTP",
1041	"non-zero reserved fields in CTP",
1042	"non-zero reserved fields in PTE",
 
1043};
1044
1045static const char *irq_remap_fault_reasons[] =
1046{
1047	"Detected reserved fields in the decoded interrupt-remapped request",
1048	"Interrupt index exceeded the interrupt-remapping table size",
1049	"Present field in the IRTE entry is clear",
1050	"Error accessing interrupt-remapping table pointed by IRTA_REG",
1051	"Detected reserved fields in the IRTE entry",
1052	"Blocked a compatibility format interrupt request",
1053	"Blocked an interrupt request due to source-id verification failure",
1054};
1055
1056#define MAX_FAULT_REASON_IDX 	(ARRAY_SIZE(fault_reason_strings) - 1)
1057
1058const char *dmar_get_fault_reason(u8 fault_reason, int *fault_type)
1059{
1060	if (fault_reason >= 0x20 && (fault_reason - 0x20 <
1061					ARRAY_SIZE(irq_remap_fault_reasons))) {
1062		*fault_type = INTR_REMAP;
1063		return irq_remap_fault_reasons[fault_reason - 0x20];
1064	} else if (fault_reason < ARRAY_SIZE(dma_remap_fault_reasons)) {
1065		*fault_type = DMA_REMAP;
1066		return dma_remap_fault_reasons[fault_reason];
1067	} else {
1068		*fault_type = UNKNOWN;
1069		return "Unknown";
1070	}
1071}
1072
 
 
 
 
 
 
 
 
 
 
 
1073void dmar_msi_unmask(struct irq_data *data)
1074{
1075	struct intel_iommu *iommu = irq_data_get_irq_handler_data(data);
 
1076	unsigned long flag;
1077
1078	/* unmask it */
1079	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1080	writel(0, iommu->reg + DMAR_FECTL_REG);
1081	/* Read a reg to force flush the post write */
1082	readl(iommu->reg + DMAR_FECTL_REG);
1083	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1084}
1085
1086void dmar_msi_mask(struct irq_data *data)
1087{
 
 
1088	unsigned long flag;
1089	struct intel_iommu *iommu = irq_data_get_irq_handler_data(data);
1090
1091	/* mask it */
1092	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1093	writel(DMA_FECTL_IM, iommu->reg + DMAR_FECTL_REG);
1094	/* Read a reg to force flush the post write */
1095	readl(iommu->reg + DMAR_FECTL_REG);
1096	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1097}
1098
1099void dmar_msi_write(int irq, struct msi_msg *msg)
1100{
1101	struct intel_iommu *iommu = irq_get_handler_data(irq);
 
1102	unsigned long flag;
1103
1104	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1105	writel(msg->data, iommu->reg + DMAR_FEDATA_REG);
1106	writel(msg->address_lo, iommu->reg + DMAR_FEADDR_REG);
1107	writel(msg->address_hi, iommu->reg + DMAR_FEUADDR_REG);
1108	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1109}
1110
1111void dmar_msi_read(int irq, struct msi_msg *msg)
1112{
1113	struct intel_iommu *iommu = irq_get_handler_data(irq);
 
1114	unsigned long flag;
1115
1116	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1117	msg->data = readl(iommu->reg + DMAR_FEDATA_REG);
1118	msg->address_lo = readl(iommu->reg + DMAR_FEADDR_REG);
1119	msg->address_hi = readl(iommu->reg + DMAR_FEUADDR_REG);
1120	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1121}
1122
1123static int dmar_fault_do_one(struct intel_iommu *iommu, int type,
1124		u8 fault_reason, u16 source_id, unsigned long long addr)
1125{
1126	const char *reason;
1127	int fault_type;
1128
1129	reason = dmar_get_fault_reason(fault_reason, &fault_type);
1130
1131	if (fault_type == INTR_REMAP)
1132		printk(KERN_ERR "INTR-REMAP: Request device [[%02x:%02x.%d] "
1133		       "fault index %llx\n"
1134			"INTR-REMAP:[fault reason %02d] %s\n",
1135			(source_id >> 8), PCI_SLOT(source_id & 0xFF),
1136			PCI_FUNC(source_id & 0xFF), addr >> 48,
1137			fault_reason, reason);
1138	else
1139		printk(KERN_ERR
1140		       "DMAR:[%s] Request device [%02x:%02x.%d] "
1141		       "fault addr %llx \n"
1142		       "DMAR:[fault reason %02d] %s\n",
1143		       (type ? "DMA Read" : "DMA Write"),
1144		       (source_id >> 8), PCI_SLOT(source_id & 0xFF),
1145		       PCI_FUNC(source_id & 0xFF), addr, fault_reason, reason);
1146	return 0;
1147}
1148
1149#define PRIMARY_FAULT_REG_LEN (16)
1150irqreturn_t dmar_fault(int irq, void *dev_id)
1151{
1152	struct intel_iommu *iommu = dev_id;
1153	int reg, fault_index;
1154	u32 fault_status;
1155	unsigned long flag;
1156
1157	raw_spin_lock_irqsave(&iommu->register_lock, flag);
1158	fault_status = readl(iommu->reg + DMAR_FSTS_REG);
1159	if (fault_status)
1160		printk(KERN_ERR "DRHD: handling fault status reg %x\n",
1161		       fault_status);
1162
1163	/* TBD: ignore advanced fault log currently */
1164	if (!(fault_status & DMA_FSTS_PPF))
1165		goto clear_rest;
1166
1167	fault_index = dma_fsts_fault_record_index(fault_status);
1168	reg = cap_fault_reg_offset(iommu->cap);
1169	while (1) {
1170		u8 fault_reason;
1171		u16 source_id;
1172		u64 guest_addr;
1173		int type;
1174		u32 data;
1175
1176		/* highest 32 bits */
1177		data = readl(iommu->reg + reg +
1178				fault_index * PRIMARY_FAULT_REG_LEN + 12);
1179		if (!(data & DMA_FRCD_F))
1180			break;
1181
1182		fault_reason = dma_frcd_fault_reason(data);
1183		type = dma_frcd_type(data);
1184
1185		data = readl(iommu->reg + reg +
1186				fault_index * PRIMARY_FAULT_REG_LEN + 8);
1187		source_id = dma_frcd_source_id(data);
1188
1189		guest_addr = dmar_readq(iommu->reg + reg +
1190				fault_index * PRIMARY_FAULT_REG_LEN);
1191		guest_addr = dma_frcd_page_addr(guest_addr);
1192		/* clear the fault */
1193		writel(DMA_FRCD_F, iommu->reg + reg +
1194			fault_index * PRIMARY_FAULT_REG_LEN + 12);
1195
1196		raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1197
1198		dmar_fault_do_one(iommu, type, fault_reason,
1199				source_id, guest_addr);
1200
1201		fault_index++;
1202		if (fault_index >= cap_num_fault_regs(iommu->cap))
1203			fault_index = 0;
1204		raw_spin_lock_irqsave(&iommu->register_lock, flag);
1205	}
1206clear_rest:
1207	/* clear all the other faults */
1208	fault_status = readl(iommu->reg + DMAR_FSTS_REG);
1209	writel(fault_status, iommu->reg + DMAR_FSTS_REG);
1210
 
 
 
1211	raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1212	return IRQ_HANDLED;
1213}
1214
1215int dmar_set_interrupt(struct intel_iommu *iommu)
1216{
1217	int irq, ret;
1218
1219	/*
1220	 * Check if the fault interrupt is already initialized.
1221	 */
1222	if (iommu->irq)
1223		return 0;
1224
1225	irq = create_irq();
1226	if (!irq) {
1227		printk(KERN_ERR "IOMMU: no free vectors\n");
 
 
1228		return -EINVAL;
1229	}
1230
1231	irq_set_handler_data(irq, iommu);
1232	iommu->irq = irq;
1233
1234	ret = arch_setup_dmar_msi(irq);
1235	if (ret) {
1236		irq_set_handler_data(irq, NULL);
1237		iommu->irq = 0;
1238		destroy_irq(irq);
1239		return ret;
1240	}
1241
1242	ret = request_irq(irq, dmar_fault, IRQF_NO_THREAD, iommu->name, iommu);
1243	if (ret)
1244		printk(KERN_ERR "IOMMU: can't request irq\n");
1245	return ret;
1246}
1247
1248int __init enable_drhd_fault_handling(void)
1249{
1250	struct dmar_drhd_unit *drhd;
 
1251
1252	/*
1253	 * Enable fault control interrupt.
1254	 */
1255	for_each_drhd_unit(drhd) {
1256		int ret;
1257		struct intel_iommu *iommu = drhd->iommu;
1258		ret = dmar_set_interrupt(iommu);
1259
1260		if (ret) {
1261			printk(KERN_ERR "DRHD %Lx: failed to enable fault, "
1262			       " interrupt, ret %d\n",
1263			       (unsigned long long)drhd->reg_base_addr, ret);
1264			return -1;
1265		}
1266
1267		/*
1268		 * Clear any previous faults.
1269		 */
1270		dmar_fault(iommu->irq, iommu);
 
 
1271	}
1272
1273	return 0;
1274}
1275
1276/*
1277 * Re-enable Queued Invalidation interface.
1278 */
1279int dmar_reenable_qi(struct intel_iommu *iommu)
1280{
1281	if (!ecap_qis(iommu->ecap))
1282		return -ENOENT;
1283
1284	if (!iommu->qi)
1285		return -ENOENT;
1286
1287	/*
1288	 * First disable queued invalidation.
1289	 */
1290	dmar_disable_qi(iommu);
1291	/*
1292	 * Then enable queued invalidation again. Since there is no pending
1293	 * invalidation requests now, it's safe to re-enable queued
1294	 * invalidation.
1295	 */
1296	__dmar_enable_qi(iommu);
1297
1298	return 0;
1299}
1300
1301/*
1302 * Check interrupt remapping support in DMAR table description.
1303 */
1304int __init dmar_ir_support(void)
1305{
1306	struct acpi_table_dmar *dmar;
1307	dmar = (struct acpi_table_dmar *)dmar_tbl;
1308	if (!dmar)
1309		return 0;
1310	return dmar->flags & 0x1;
1311}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1312IOMMU_INIT_POST(detect_intel_iommu);