From: "ext Kanigeri, Hari" <[email protected]>
Subject: RE: [PATCH 2/6] omap iommu: omap2 architecture specific functions
Date: Wed, 6 May 2009 16:31:37 +0200

> Hi,
> 
> > +static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra)
> > +{
> > +   int i;
> > +   u32 stat, da;
> > +   const char *err_msg[] = {
> > +           "tlb miss",
> > +           "translation fault",
> > +           "emulation miss",
> > +           "table walk fault",
> > +           "multi hit fault",
> > +   };
> > +
> > +   stat = iommu_read_reg(obj, MMU_IRQSTATUS);
> > +   stat &= MMU_IRQ_MASK;
> > +   if (!stat)
> > +           return 0;
> > +
> > +   da = iommu_read_reg(obj, MMU_FAULT_AD);
> > +   *ra = da;
> > +
> > +   dev_err(obj->dev, "%s:\tda:%08x ", __func__, da);
> > +
> > +   for (i = 0; i < ARRAY_SIZE(err_msg); i++) {
> > +           if (stat & (1 << i))
> > +                   printk("%s ", err_msg[i]);
> > +   }
> > +   printk("\n");
> > +
> > +   iommu_write_reg(obj, stat, MMU_IRQSTATUS);
> > +   return stat;
> > +}
> > +
> 
> -- I see you are acking the MMU fault in the ISR, but I don't think
> this will be enough to stop the further generation of MMU faults as
> the device will again try to access the same fault address. 

My idea is that, an iommu fault should be handled by a client
specific/provided callback function enough flexibly that it can handle
more complecated use cases like implementing on-demand dynamic memory
mapping at getting an iommu fault.

linux/arch/arm/plat-omap/iommu.c:

+static irqreturn_t iommu_fault_handler(int irq, void *data)
+{
+       u32 stat, da;
+       u32 *iopgd, *iopte;
+       int err = -EIO;
+       struct iommu *obj = data;
+
+       if (!obj->refcount)
+               return IRQ_NONE;
+
+       /* Dynamic loading TLB or PTE */
+       if (obj->isr)
+               err = obj->isr(obj);
                      ^^^^^^^^^^^^^^

If the above "isr" function sets a new "tlb" or "pte" entry, then
further iommu fault won't happen anymore.

> 
> In the mean time before the callback mechanism is implemented, we
> should consider disabling the MMU for the device that caused the MMU
> fault to stop further generation of MMU faults.
> 
> +     printk("\n");
> +
> +     iommu_write_reg(obj, stat, MMU_IRQSTATUS);
> +     omap2_iommu_disable(obj) -----------------------> [HK]
> +     return stat;
> +}

It's not bad idea at all to disable iommu temporary as a default
behavior, but maybe it should be done in the latter half of
"iommu_fault_handler()".

> 
> Thank you,
> Best regards,
> Hari
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to