Re: [PATCH] omap: iommu: disallow mapping NULL address

Guzman Lugo, Fernando
2011-03-07T19:25:57Z

On Mon, Mar 7, 2011 at 1:19 PM, David Cohen <dacohen@gmail.com> wrote:
> On Mon, Mar 7, 2011 at 9:17 PM, Guzman Lugo, Fernando
> <fernando.lugo@ti.com> wrote:
>> On Mon, Mar 7, 2011 at 7:10 AM, Michael Jones
>> <michael.jones@matrix-vision.de> wrote:
>>> From e7dbe4c4b64eb114f9b0804d6af3a3ca0e78acc8 Mon Sep 17 00:00:00 2001
>>> From: Michael Jones <michael.jones@matrix-vision.de>
>>> Date: Mon, 7 Mar 2011 13:36:15 +0100
>>> Subject: [PATCH] omap: iommu: disallow mapping NULL address
>>>
>>> commit c7f4ab26e3bcdaeb3e19ec658e3ad9092f1a6ceb allowed mapping
>>> the NULL address if da_start==0.  Force da_start to exclude the
>>> first page.
>>
>> what about devices that uses page 0? ipu after reset always starts
>> from 0x00000000 how could we map that address??
>
> from 0x0? The driver sees da == 0 as error. May I ask you why do you want it?

unlike DSP that you can load a register with the addres the DSP will
boot, IPU core always starts from address 0x00000000, so if you take
IPU out of reset it will try to access address 0x0 if not map it,
there will be a mmu fault.

Regards,
Fernando.

>
> Br,
>
> David
>
>>
>> Regards,
>> Fernando.
>>
>>>
>>> Signed-off-by: Michael Jones <michael.jones@matrix-vision.de>
>>> ---
>>>  arch/arm/plat-omap/iommu.c |    6 ++++--
>>>  1 files changed, 4 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
>>> index 5990ea6..dcb5513 100644
>>> --- a/arch/arm/plat-omap/iommu.c
>>> +++ b/arch/arm/plat-omap/iommu.c
>>> @@ -850,7 +850,7 @@ int iommu_set_da_range(struct iommu *obj, u32 start, u32 end)
>>>        if (end < start || !PAGE_ALIGN(start | end))
>>>                return -EINVAL;
>>>
>>> -       obj->da_start = start;
>>> +       obj->da_start = max(start, (u32)PAGE_SIZE);
>>>        obj->da_end = end;
>>>
>>>        return 0;
>>> @@ -950,7 +950,9 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)
>>>        obj->name = pdata->name;
>>>        obj->dev = &pdev->dev;
>>>        obj->ctx = (void *)obj + sizeof(*obj);
>>> -       obj->da_start = pdata->da_start;
>>> +
>>> +       /* reserve the first page for NULL */
>>> +       obj->da_start = max(pdata->da_start, (u32)PAGE_SIZE);
>>>        obj->da_end = pdata->da_end;
>>>
>>>        mutex_init(&obj->iommu_lock);
>>> --
>>> 1.7.4.1
>>>
>>>
>>> MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler
>>> Registergericht: Amtsgericht Stuttgart, HRB 271090
>>> Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner
>>>
>>
>