On 01/27/16 at 07:23pm, Wan Zongshun wrote: > > > -------- Original Message -------- > >If irq table exists in old kernel create a new one and copy the content > >of old irq table to the newly created. > > > >Signed-off-by: Baoquan He <b...@redhat.com> > >--- > >diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c > >index 91659d8..450adad 100644 > >--- a/drivers/iommu/amd_iommu_init.c > >+++ b/drivers/iommu/amd_iommu_init.c > >@@ -660,6 +660,49 @@ static int get_dev_entry_bit(u16 devid, u8 bit) > > return (amd_iommu_dev_table[devid].data[i] & (1UL << _bit)) >> _bit; > > } > > > >+static void copy_irq_table(u16 devid) > >+{ > >+ struct irq_remap_table *table = NULL; > >+ u16 alias; > >+ u64 dte; > >+ u64 *old_intr_virt; > >+ > >+ alias = amd_iommu_alias_table[devid]; > >+ table = irq_lookup_table[alias]; > >+ if (table) { > >+ irq_lookup_table[devid] = table; > >+ set_dte_irq_entry(devid, table); > >+ return; > >+ } > >+ dte = amd_iommu_dev_table[devid].data[2]; > >+ dte &= DTE_IRQ_PHYS_ADDR_MASK; > >+ if( (!dte&DTE_IRQ_REMAP_ENABLE) || ( dte == 0) ) > >+ return; > >+ > > here: dte&DTE_IRQ_REMAP_ENABLE > > style? > dte & DTE_IRQ_REMAP_ENABLE
Yeah, will change to use yours. > > >+ table = kzalloc(sizeof(*table), GFP_ATOMIC); > >+ if (!table){ > >+ pr_warn("AMD-Vi: amd irq table allocation failed\n"); > >+ return; > >+ } > >+ > >+ table->table = kmem_cache_alloc(amd_iommu_irq_cache, GFP_ATOMIC); > >+ if (!table->table) { > >+ kfree(table); > >+ table = NULL; > >+ return; > >+ } > >+ memset(table->table, 0, MAX_IRQS_PER_TABLE * sizeof(u32)); > >+ > >+ old_intr_virt = memremap(dte, MAX_IRQS_PER_TABLE * sizeof(u32), > >MEMREMAP_WB); > > Here if rename the 'dte' to 'irte', better to read? Agree, will change. > > > >+ memcpy(table->table, old_intr_virt, MAX_IRQS_PER_TABLE * sizeof(u32)); > >+ irq_lookup_table[devid] = table; > >+ set_dte_irq_entry(devid, table); > >+ if (devid != alias) { > >+ irq_lookup_table[alias] = table; > >+ set_dte_irq_entry(alias, table); > >+ } > >+ memunmap(old_intr_virt); > >+} > > > > void amd_iommu_apply_erratum_63(u16 devid) > > { > >diff --git a/drivers/iommu/amd_iommu_proto.h > >b/drivers/iommu/amd_iommu_proto.h > >index 743e209..ab562e0 100644 > >--- a/drivers/iommu/amd_iommu_proto.h > >+++ b/drivers/iommu/amd_iommu_proto.h > >@@ -101,5 +101,6 @@ static inline bool iommu_feature(struct amd_iommu > >*iommu, u64 f) > > /* kdump checking */ > > extern bool translation_pre_enabled(void); > > extern void clear_translation_pre_enabled(void); > >+extern void set_dte_irq_entry(u16 devid, struct irq_remap_table *table); > > > > #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ > > _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu