Skip to content

Commit

Permalink
iommu/amd: Add initialization routines for AMD interrupt remapping
Browse files Browse the repository at this point in the history
Add the six routines required to setup interrupt remapping
with the AMD IOMMU. Also put it all together into the AMD
specific irq_remap_ops.

Signed-off-by: Joerg Roedel <[email protected]>
  • Loading branch information
Joerg Roedel committed Sep 28, 2012
1 parent d976195 commit 6b474b8
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/iommu/amd_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

#include "amd_iommu_proto.h"
#include "amd_iommu_types.h"
#include "irq_remapping.h"

#define CMD_SET_TYPE(cmd, t) ((cmd)->data[1] |= ((t) << 28))

Expand Down Expand Up @@ -4226,4 +4227,19 @@ static int setup_hpet_msi(unsigned int irq, unsigned int id)
return 0;
}

struct irq_remap_ops amd_iommu_irq_ops = {
.supported = amd_iommu_supported,
.prepare = amd_iommu_prepare,
.enable = amd_iommu_enable,
.disable = amd_iommu_disable,
.reenable = amd_iommu_reenable,
.enable_faulting = amd_iommu_enable_faulting,
.setup_ioapic_entry = setup_ioapic_entry,
.set_affinity = set_affinity,
.free_irq = free_irq,
.compose_msi_msg = compose_msi_msg,
.msi_alloc_irq = msi_alloc_irq,
.msi_setup_irq = msi_setup_irq,
.setup_hpet_msi = setup_hpet_msi,
};
#endif
42 changes: 42 additions & 0 deletions drivers/iommu/amd_iommu_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <asm/x86_init.h>
#include <asm/iommu_table.h>
#include <asm/io_apic.h>
#include <asm/irq_remapping.h>

#include "amd_iommu_proto.h"
#include "amd_iommu_types.h"
Expand Down Expand Up @@ -1897,7 +1898,48 @@ static int __init iommu_go_to_state(enum iommu_init_state state)
return ret;
}

#ifdef CONFIG_IRQ_REMAP
int __init amd_iommu_prepare(void)
{
return iommu_go_to_state(IOMMU_ACPI_FINISHED);
}

int __init amd_iommu_supported(void)
{
return amd_iommu_irq_remap ? 1 : 0;
}

int __init amd_iommu_enable(void)
{
int ret;

ret = iommu_go_to_state(IOMMU_ENABLED);
if (ret)
return ret;

irq_remapping_enabled = 1;

return 0;
}

void amd_iommu_disable(void)
{
amd_iommu_suspend();
}

int amd_iommu_reenable(int mode)
{
amd_iommu_resume();

return 0;
}

int __init amd_iommu_enable_faulting(void)
{
/* We enable MSI later when PCI is initialized */
return 0;
}
#endif

/*
* This is the core init function for AMD IOMMU hardware in the system.
Expand Down
8 changes: 8 additions & 0 deletions drivers/iommu/amd_iommu_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ extern void amd_iommu_uninit_devices(void);
extern void amd_iommu_init_notifier(void);
extern void amd_iommu_init_api(void);

/* Needed for interrupt remapping */
extern int amd_iommu_supported(void);
extern int amd_iommu_prepare(void);
extern int amd_iommu_enable(void);
extern void amd_iommu_disable(void);
extern int amd_iommu_reenable(int);
extern int amd_iommu_enable_faulting(void);

/* IOMMUv2 specific functions */
struct iommu_domain;

Expand Down
1 change: 1 addition & 0 deletions drivers/iommu/irq_remapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ struct irq_remap_ops {
};

extern struct irq_remap_ops intel_irq_remap_ops;
extern struct irq_remap_ops amd_iommu_irq_ops;

#else /* CONFIG_IRQ_REMAP */

Expand Down

0 comments on commit 6b474b8

Please sign in to comment.