aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/amd_iommu_init.c
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2008-07-14 14:11:18 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-18 12:43:32 -0400
commit5ff4789d045cdaec7629e027e4f8ff8e34308b81 (patch)
tree8e8bee55ca532243b65829836a26752202a0059a /arch/x86/kernel/amd_iommu_init.c
parentf1b0c8d3d3b5ff9c0b14bb2383a4bc38d8922bd1 (diff)
AMD IOMMU: set iommu for device from ACPI code too
The device<->iommu relationship has to be set from the information in the ACPI table too. This patch adds this logic to the driver. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Cc: iommu@lists.linux-foundation.org Cc: bhavna.sarathy@amd.com Cc: robert.richter@amd.com Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/amd_iommu_init.c')
-rw-r--r--arch/x86/kernel/amd_iommu_init.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
index 9bf1b8111b08..7661b02d7208 100644
--- a/arch/x86/kernel/amd_iommu_init.c
+++ b/arch/x86/kernel/amd_iommu_init.c
@@ -426,11 +426,18 @@ static void set_dev_entry_bit(u16 devid, u8 bit)
426 amd_iommu_dev_table[devid].data[i] |= (1 << _bit); 426 amd_iommu_dev_table[devid].data[i] |= (1 << _bit);
427} 427}
428 428
429/* Writes the specific IOMMU for a device into the rlookup table */
430static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
431{
432 amd_iommu_rlookup_table[devid] = iommu;
433}
434
429/* 435/*
430 * This function takes the device specific flags read from the ACPI 436 * This function takes the device specific flags read from the ACPI
431 * table and sets up the device table entry with that information 437 * table and sets up the device table entry with that information
432 */ 438 */
433static void __init set_dev_entry_from_acpi(u16 devid, u32 flags, u32 ext_flags) 439static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
440 u16 devid, u32 flags, u32 ext_flags)
434{ 441{
435 if (flags & ACPI_DEVFLAG_INITPASS) 442 if (flags & ACPI_DEVFLAG_INITPASS)
436 set_dev_entry_bit(devid, DEV_ENTRY_INIT_PASS); 443 set_dev_entry_bit(devid, DEV_ENTRY_INIT_PASS);
@@ -446,12 +453,8 @@ static void __init set_dev_entry_from_acpi(u16 devid, u32 flags, u32 ext_flags)
446 set_dev_entry_bit(devid, DEV_ENTRY_LINT0_PASS); 453 set_dev_entry_bit(devid, DEV_ENTRY_LINT0_PASS);
447 if (flags & ACPI_DEVFLAG_LINT1) 454 if (flags & ACPI_DEVFLAG_LINT1)
448 set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); 455 set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
449}
450 456
451/* Writes the specific IOMMU for a device into the rlookup table */ 457 set_iommu_for_device(iommu, devid);
452static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
453{
454 amd_iommu_rlookup_table[devid] = iommu;
455} 458}
456 459
457/* 460/*
@@ -550,11 +553,12 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
550 case IVHD_DEV_ALL: 553 case IVHD_DEV_ALL:
551 for (dev_i = iommu->first_device; 554 for (dev_i = iommu->first_device;
552 dev_i <= iommu->last_device; ++dev_i) 555 dev_i <= iommu->last_device; ++dev_i)
553 set_dev_entry_from_acpi(dev_i, e->flags, 0); 556 set_dev_entry_from_acpi(iommu, dev_i,
557 e->flags, 0);
554 break; 558 break;
555 case IVHD_DEV_SELECT: 559 case IVHD_DEV_SELECT:
556 devid = e->devid; 560 devid = e->devid;
557 set_dev_entry_from_acpi(devid, e->flags, 0); 561 set_dev_entry_from_acpi(iommu, devid, e->flags, 0);
558 break; 562 break;
559 case IVHD_DEV_SELECT_RANGE_START: 563 case IVHD_DEV_SELECT_RANGE_START:
560 devid_start = e->devid; 564 devid_start = e->devid;
@@ -565,7 +569,7 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
565 case IVHD_DEV_ALIAS: 569 case IVHD_DEV_ALIAS:
566 devid = e->devid; 570 devid = e->devid;
567 devid_to = e->ext >> 8; 571 devid_to = e->ext >> 8;
568 set_dev_entry_from_acpi(devid, e->flags, 0); 572 set_dev_entry_from_acpi(iommu, devid, e->flags, 0);
569 amd_iommu_alias_table[devid] = devid_to; 573 amd_iommu_alias_table[devid] = devid_to;
570 break; 574 break;
571 case IVHD_DEV_ALIAS_RANGE: 575 case IVHD_DEV_ALIAS_RANGE:
@@ -577,7 +581,8 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
577 break; 581 break;
578 case IVHD_DEV_EXT_SELECT: 582 case IVHD_DEV_EXT_SELECT:
579 devid = e->devid; 583 devid = e->devid;
580 set_dev_entry_from_acpi(devid, e->flags, e->ext); 584 set_dev_entry_from_acpi(iommu, devid, e->flags,
585 e->ext);
581 break; 586 break;
582 case IVHD_DEV_EXT_SELECT_RANGE: 587 case IVHD_DEV_EXT_SELECT_RANGE:
583 devid_start = e->devid; 588 devid_start = e->devid;
@@ -590,7 +595,7 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
590 for (dev_i = devid_start; dev_i <= devid; ++dev_i) { 595 for (dev_i = devid_start; dev_i <= devid; ++dev_i) {
591 if (alias) 596 if (alias)
592 amd_iommu_alias_table[dev_i] = devid_to; 597 amd_iommu_alias_table[dev_i] = devid_to;
593 set_dev_entry_from_acpi( 598 set_dev_entry_from_acpi(iommu,
594 amd_iommu_alias_table[dev_i], 599 amd_iommu_alias_table[dev_i],
595 flags, ext_flags); 600 flags, ext_flags);
596 } 601 }