Message ID | 1375355972-25276-1-git-send-email-vikas.sajjan@linaro.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
Hi Vikas, On Thursday 01 of August 2013 16:49:32 Vikas Sajjan wrote: > While trying to get boot-logo up on exynos5420 SMDK which has eDP panel > connected with resolution 2560x1600, following error occured even with > IOMMU enabled: > [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate > buffer. [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor 0 > > This patch fixes the issue by adding a check for IOMMU. > > Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> > Signed-off-by: Arun Kumar <arun.kk@samsung.com> > --- > drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd6..2a86666 > 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > @@ -16,6 +16,7 @@ > #include <drm/drm_crtc.h> > #include <drm/drm_fb_helper.h> > #include <drm/drm_crtc_helper.h> > +#include <drm/exynos_drm.h> > > #include "exynos_drm_drv.h" > #include "exynos_drm_fb.h" > @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct > drm_fb_helper *helper, struct platform_device *pdev = dev->platformdev; > unsigned long size; > int ret; > + unsigned int flag; > > DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", > sizes->surface_width, sizes->surface_height, > @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct > drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; > > /* 0 means to allocate physically continuous memory */ > - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); > + if (!is_drm_iommu_supported(dev)) > + flag = 0; > + else > + flag = EXYNOS_BO_NONCONTIG; While noncontig memory might be used for devices that support IOMMU, there should be no problem with using contig memory for them, so this seems more like masking the original problem rather than tracking it down. Could you check why the allocation fails when requesting contiguous memory? Best regards, Tomasz -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Aug 1, 2013 at 7:20 PM, Tomasz Figa <tomasz.figa@gmail.com> wrote: > Hi Vikas, > > On Thursday 01 of August 2013 16:49:32 Vikas Sajjan wrote: >> While trying to get boot-logo up on exynos5420 SMDK which has eDP panel >> connected with resolution 2560x1600, following error occured even with >> IOMMU enabled: >> [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate >> buffer. [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor 0 >> >> This patch fixes the issue by adding a check for IOMMU. >> >> Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> >> Signed-off-by: Arun Kumar <arun.kk@samsung.com> >> --- >> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- >> 1 file changed, 8 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd6..2a86666 >> 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> @@ -16,6 +16,7 @@ >> #include <drm/drm_crtc.h> >> #include <drm/drm_fb_helper.h> >> #include <drm/drm_crtc_helper.h> >> +#include <drm/exynos_drm.h> >> >> #include "exynos_drm_drv.h" >> #include "exynos_drm_fb.h" >> @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct >> drm_fb_helper *helper, struct platform_device *pdev = dev->platformdev; >> unsigned long size; >> int ret; >> + unsigned int flag; >> >> DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", >> sizes->surface_width, sizes->surface_height, >> @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct >> drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; >> >> /* 0 means to allocate physically continuous memory */ >> - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); >> + if (!is_drm_iommu_supported(dev)) >> + flag = 0; >> + else >> + flag = EXYNOS_BO_NONCONTIG; > > While noncontig memory might be used for devices that support IOMMU, there > should be no problem with using contig memory for them, so this seems more > like masking the original problem rather than tracking it down. it is probably a good idea to not require contig memory when it is not needed for performance or functionality (and if it is only performance, then fallback gracefully to non-contig).. but yeah, would be good to know if this is masking another issue all the same BR, -R > Could you check why the allocation fails when requesting contiguous > memory? > > Best regards, > Tomasz > > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Tomasz, On 2 August 2013 04:50, Tomasz Figa <tomasz.figa@gmail.com> wrote: > > Hi Vikas, > > On Thursday 01 of August 2013 16:49:32 Vikas Sajjan wrote: > > While trying to get boot-logo up on exynos5420 SMDK which has eDP panel > > connected with resolution 2560x1600, following error occured even with > > IOMMU enabled: > > [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate > > buffer. [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor 0 > > > > This patch fixes the issue by adding a check for IOMMU. > > > > Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> > > Signed-off-by: Arun Kumar <arun.kk@samsung.com> > > --- > > drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- > > 1 file changed, 8 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > > b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd6..2a86666 > > 100644 > > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > > @@ -16,6 +16,7 @@ > > #include <drm/drm_crtc.h> > > #include <drm/drm_fb_helper.h> > > #include <drm/drm_crtc_helper.h> > > +#include <drm/exynos_drm.h> > > > > #include "exynos_drm_drv.h" > > #include "exynos_drm_fb.h" > > @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct > > drm_fb_helper *helper, struct platform_device *pdev = dev->platformdev; > > unsigned long size; > > int ret; > > + unsigned int flag; > > > > DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", > > sizes->surface_width, sizes->surface_height, > > @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct > > drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; > > > > /* 0 means to allocate physically continuous memory */ > > - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); > > + if (!is_drm_iommu_supported(dev)) > > + flag = 0; > > + else > > + flag = EXYNOS_BO_NONCONTIG; > > While noncontig memory might be used for devices that support IOMMU, there > should be no problem with using contig memory for them, so this seems more > like masking the original problem rather than tracking it down. > > Could you check why the allocation fails when requesting contiguous > memory? > It is failing if i am giving bigger resolution like 2560x1600, but if i try for 1280x780 resolution, it works fine. Looks like arm_dma_alloc() is NOT able to allocate bigger buffer of size 2560 * 1600 * 4. Hence i used flag = EXYNOS_BO_NONCONTIG; > > Best regards, > Tomasz >
Hi Vikas, On 2 August 2013 09:23, Vikas Sajjan <vikas.sajjan@linaro.org> wrote: > Hi Tomasz, > > > On 2 August 2013 04:50, Tomasz Figa <tomasz.figa@gmail.com> wrote: >> >> Hi Vikas, >> >> On Thursday 01 of August 2013 16:49:32 Vikas Sajjan wrote: >> > While trying to get boot-logo up on exynos5420 SMDK which has eDP panel >> > connected with resolution 2560x1600, following error occured even with >> > IOMMU enabled: >> > [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate >> > buffer. [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor 0 >> > >> > This patch fixes the issue by adding a check for IOMMU. >> > >> > Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> >> > Signed-off-by: Arun Kumar <arun.kk@samsung.com> >> > --- >> > drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- >> > 1 file changed, 8 insertions(+), 1 deletion(-) >> > >> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> > b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd6..2a86666 >> > 100644 >> > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >> > @@ -16,6 +16,7 @@ >> > #include <drm/drm_crtc.h> >> > #include <drm/drm_fb_helper.h> >> > #include <drm/drm_crtc_helper.h> >> > +#include <drm/exynos_drm.h> >> > >> > #include "exynos_drm_drv.h" >> > #include "exynos_drm_fb.h" >> > @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct >> > drm_fb_helper *helper, struct platform_device *pdev = dev->platformdev; >> > unsigned long size; >> > int ret; >> > + unsigned int flag; >> > >> > DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", >> > sizes->surface_width, sizes->surface_height, >> > @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct >> > drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; >> > >> > /* 0 means to allocate physically continuous memory */ >> > - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); >> > + if (!is_drm_iommu_supported(dev)) >> > + flag = 0; >> > + else >> > + flag = EXYNOS_BO_NONCONTIG; >> >> While noncontig memory might be used for devices that support IOMMU, there >> should be no problem with using contig memory for them, so this seems more >> like masking the original problem rather than tracking it down. >> >> Could you check why the allocation fails when requesting contiguous >> memory? >> > > It is failing if i am giving bigger resolution like 2560x1600, but if > i try for 1280x780 resolution, it works fine. > Looks like arm_dma_alloc() is NOT able to allocate bigger buffer of > size 2560 * 1600 * 4. You may need to increase the zoneorder (from current default 11 to say 13) if you need large physically contiguous pages. However I am not sure if it is recommended.
Hi Vikas, On 1 August 2013 16:49, Vikas Sajjan <vikas.sajjan@linaro.org> wrote: > While trying to get boot-logo up on exynos5420 SMDK which has eDP panel > connected with resolution 2560x1600, following error occured even with > IOMMU enabled: > [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate buffer. > [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor 0 > > This patch fixes the issue by adding a check for IOMMU. > > Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> > Signed-off-by: Arun Kumar <arun.kk@samsung.com> > --- > drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > index 8e60bd6..2a86666 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c > @@ -16,6 +16,7 @@ > #include <drm/drm_crtc.h> > #include <drm/drm_fb_helper.h> > #include <drm/drm_crtc_helper.h> > +#include <drm/exynos_drm.h> > > #include "exynos_drm_drv.h" > #include "exynos_drm_fb.h" > @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper, > struct platform_device *pdev = dev->platformdev; > unsigned long size; > int ret; > + unsigned int flag; > > DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", > sizes->surface_width, sizes->surface_height, > @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper, > size = mode_cmd.pitches[0] * mode_cmd.height; > > /* 0 means to allocate physically continuous memory */ This comment is now wrongly placed. Please use EXYNOS_BO_CONTIG instead of 0 and get rid of this comment altogether. > - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); > + if (!is_drm_iommu_supported(dev)) > + flag = 0; > + else > + flag = EXYNOS_BO_NONCONTIG; > + > + exynos_gem_obj = exynos_drm_gem_create(dev, flag, size); > if (IS_ERR(exynos_gem_obj)) { > ret = PTR_ERR(exynos_gem_obj); > goto err_release_framebuffer;
Hi Rob, On 2 August 2013 06:03, Rob Clark <robdclark@gmail.com> wrote: > On Thu, Aug 1, 2013 at 7:20 PM, Tomasz Figa <tomasz.figa@gmail.com> wrote: >> Hi Vikas, >> >> On Thursday 01 of August 2013 16:49:32 Vikas Sajjan wrote: >>> While trying to get boot-logo up on exynos5420 SMDK which has eDP panel >>> connected with resolution 2560x1600, following error occured even with >>> IOMMU enabled: >>> [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate >>> buffer. [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor 0 >>> >>> This patch fixes the issue by adding a check for IOMMU. >>> >>> Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> >>> Signed-off-by: Arun Kumar <arun.kk@samsung.com> >>> --- >>> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- >>> 1 file changed, 8 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >>> b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd6..2a86666 >>> 100644 >>> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c >>> @@ -16,6 +16,7 @@ >>> #include <drm/drm_crtc.h> >>> #include <drm/drm_fb_helper.h> >>> #include <drm/drm_crtc_helper.h> >>> +#include <drm/exynos_drm.h> >>> >>> #include "exynos_drm_drv.h" >>> #include "exynos_drm_fb.h" >>> @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct >>> drm_fb_helper *helper, struct platform_device *pdev = dev->platformdev; >>> unsigned long size; >>> int ret; >>> + unsigned int flag; >>> >>> DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", >>> sizes->surface_width, sizes->surface_height, >>> @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct >>> drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; >>> >>> /* 0 means to allocate physically continuous memory */ >>> - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); >>> + if (!is_drm_iommu_supported(dev)) >>> + flag = 0; >>> + else >>> + flag = EXYNOS_BO_NONCONTIG; >> >> While noncontig memory might be used for devices that support IOMMU, there >> should be no problem with using contig memory for them, so this seems more >> like masking the original problem rather than tracking it down. > > it is probably a good idea to not require contig memory when it is not > needed for performance or functionality (and if it is only > performance, then fallback gracefully to non-contig).. but yeah, would > be good to know if this is masking another issue all the same > Whats happening with CONTIG flag and with IOMMU, is __iommu_alloc_buffer() ---> dma_alloc_from_contiguous() and in this function it fails at this condition check if (pageno >= cma->count) So I tried increasing the CONFIG_CMA_SIZE_MBYTES to 24, this check succeeds and it works well without my patch. But what about the case where CONFIG_CMA is disabled , yet i want bigger memory for a device. I think using IOMMU we can achieve this. correct me, if i am wrong. > BR, > -R > >> Could you check why the allocation fails when requesting contiguous >> memory? >> >> Best regards, >> Tomasz >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-media" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Vikas, On Friday 02 of August 2013 12:08:52 Vikas Sajjan wrote: > Hi Rob, > > On 2 August 2013 06:03, Rob Clark <robdclark@gmail.com> wrote: > > On Thu, Aug 1, 2013 at 7:20 PM, Tomasz Figa <tomasz.figa@gmail.com> wrote: > >> Hi Vikas, > >> > >> On Thursday 01 of August 2013 16:49:32 Vikas Sajjan wrote: > >>> While trying to get boot-logo up on exynos5420 SMDK which has eDP > >>> panel > >>> connected with resolution 2560x1600, following error occured even > >>> with > >>> IOMMU enabled: > >>> [0.880000] [drm:lowlevel_buffer_allocate] *ERROR* failed to allocate > >>> buffer. [0.890000] [drm] Initialized exynos 1.0.0 20110530 on minor > >>> 0 > >>> > >>> This patch fixes the issue by adding a check for IOMMU. > >>> > >>> Signed-off-by: Vikas Sajjan <vikas.sajjan@linaro.org> > >>> Signed-off-by: Arun Kumar <arun.kk@samsung.com> > >>> --- > >>> > >>> drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 9 ++++++++- > >>> 1 file changed, 8 insertions(+), 1 deletion(-) [snip] > >>> @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct > >>> drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; > >>> > >>> /* 0 means to allocate physically continuous memory */ > >>> > >>> - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); > >>> + if (!is_drm_iommu_supported(dev)) > >>> + flag = 0; > >>> + else > >>> + flag = EXYNOS_BO_NONCONTIG; > >> > >> While noncontig memory might be used for devices that support IOMMU, > >> there should be no problem with using contig memory for them, so > >> this seems more like masking the original problem rather than > >> tracking it down.> > > it is probably a good idea to not require contig memory when it is not > > needed for performance or functionality (and if it is only > > performance, then fallback gracefully to non-contig).. but yeah, would > > be good to know if this is masking another issue all the same > > Whats happening with CONTIG flag and with IOMMU, is > > __iommu_alloc_buffer() ---> dma_alloc_from_contiguous() and in this > function it fails at > this condition check if (pageno >= cma->count) > > So I tried increasing the CONFIG_CMA_SIZE_MBYTES to 24, this check > succeeds and it works well without my patch. > > But what about the case where CONFIG_CMA is disabled , yet i want > bigger memory for a device. > I think using IOMMU we can achieve this. > > correct me, if i am wrong. This is probably fine. I'm not sure about performance aspects of using noncontig memory as framebuffer, though. This needs to be checked and if there is some performance penalty, I would make noncontig allocation a fallback case, if contig fails, as Rob has suggested. Also I think you should adjust the commit message to say that non- contiguous memory can be used when IOMMU is supported, so there is no need to force contiguous allocations, since this is not a bug fix, but rather a feature this patch is adding. Best regards, Tomasz > > BR, > > -R > > > >> Could you check why the allocation fails when requesting contiguous > >> memory? > >> > >> Best regards, > >> Tomasz > >> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe > >> linux-media" in the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd6..2a86666 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c @@ -16,6 +16,7 @@ #include <drm/drm_crtc.h> #include <drm/drm_fb_helper.h> #include <drm/drm_crtc_helper.h> +#include <drm/exynos_drm.h> #include "exynos_drm_drv.h" #include "exynos_drm_fb.h" @@ -143,6 +144,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper, struct platform_device *pdev = dev->platformdev; unsigned long size; int ret; + unsigned int flag; DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d\n", sizes->surface_width, sizes->surface_height, @@ -166,7 +168,12 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper, size = mode_cmd.pitches[0] * mode_cmd.height; /* 0 means to allocate physically continuous memory */ - exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); + if (!is_drm_iommu_supported(dev)) + flag = 0; + else + flag = EXYNOS_BO_NONCONTIG; + + exynos_gem_obj = exynos_drm_gem_create(dev, flag, size); if (IS_ERR(exynos_gem_obj)) { ret = PTR_ERR(exynos_gem_obj); goto err_release_framebuffer;