diff options
| author | Joerg Roedel <joerg.roedel@amd.com> | 2008-07-14 14:11:18 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-07-18 12:43:32 -0400 |
| commit | 5ff4789d045cdaec7629e027e4f8ff8e34308b81 (patch) | |
| tree | 8e8bee55ca532243b65829836a26752202a0059a | |
| parent | f1b0c8d3d3b5ff9c0b14bb2383a4bc38d8922bd1 (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>
| -rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 27 |
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 */ | ||
| 430 | static 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 | */ |
| 433 | static void __init set_dev_entry_from_acpi(u16 devid, u32 flags, u32 ext_flags) | 439 | static 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); |
| 452 | static 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 | } |
