From: robdclark@gmail.com (Rob Clark) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 2/5] DRM: Armada: Add Armada DRM driver Date: Thu, 10 Oct 2013 18:23:26 -0400 [thread overview] Message-ID: <CAF6AEGvNyD8-_t2y69a5Gjey7Jg_LXVYNgpYW1rsFFyTkABg=Q@mail.gmail.com> (raw) In-Reply-To: <20131010215951.GS25034@n2100.arm.linux.org.uk> On Thu, Oct 10, 2013 at 5:59 PM, Russell King - ARM Linux <linux@arm.linux.org.uk> wrote: > On Thu, Oct 10, 2013 at 05:25:15PM -0400, Rob Clark wrote: >> On Sun, Oct 6, 2013 at 6:08 PM, Russell King >> <rmk+kernel@arm.linux.org.uk> wrote: >> > + /* >> > + * If we have an overlay plane associated with this CRTC, disable >> > + * it before the modeset to avoid its coordinates being outside >> > + * the new mode parameters. DRM doesn't provide help with this. >> > + */ >> >> Getting a bit off topic, but yeah.. I'd be in favor of "clarifying" >> things by having crtc helpers disable planes on setcrtc (rather than >> only doing this on fbdev/lastclose restore). I >> don't know of any userspace that this would cause problems for. But >> not really sure if it would be considered an interface break or just >> "fixing a bug".. since we have different behavior on different >> drivers, I'd lean towards the latter. > > The reasoning here is if the overlay plane is larger than the mode being > set, we will end up having the hardware programmed in an inconsistent > state - the overlay plane position/width/height can be outside of the > active region, which is invalid for the hardware. So, it's safer to > disable the plane and wait for the next plane to be sent and have that > validated against the new mode. right. I think disabling the planes is the correct behavior. So nothing to do here for armada. I mostly just wanted to get some opinions about making the crtc helpers do this automatically for us. > It's not like you would be able to see the plane immediately, because > most monitors blank while they retrain to the new mode settings. > >> > +static int armada_gem_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) >> > +{ >> > + struct armada_gem_object *obj = drm_to_armada_gem(vma->vm_private_data); >> > + unsigned long addr = (unsigned long)vmf->virtual_address; >> > + unsigned long pfn = obj->phys_addr >> PAGE_SHIFT; >> > + int ret; >> > + >> > + pfn += (addr - vma->vm_start) >> PAGE_SHIFT; >> > + ret = vm_insert_pfn(vma, addr, pfn); >> > + >> > + switch (ret) { >> > + case -EIO: >> > + case -EAGAIN: >> > + set_need_resched(); >> >> probably this thread is applicable here too? >> >> https://lkml.org/lkml/2013/9/12/417 >> >> (although.. we have at least a few slightly differet variants on the >> same errno -> VM_FAULT_x switch in different drivers.. maybe we should >> do something better) > > Hmm. It seems today's vm_insert_pfn() has the following error return > values: > > -EFAULT - virtual address outside vma > -EINVAL - track_pfn_insert() failure > -ENOMEM - failed to get locked pte > -EBUSY - entry already exists in pte > > So it seems my handling -EIO, -EAGAIN, -ERESTARTSYS and -EINTR are all > redundant and can be removed. I'm not sure if it makes sense for this > to be generic - it looks like it's only Intel, gma500 and me who use > this, and Intel handles more error codes (due to it calling other > functions.) I just noticed msm and omapdrm are missing the -EBUSY case (have some patches I need to send), which was why I mentioned this. They do have other error cases from other fxns, so maybe something generic/common doesn't make sense.. but I realized i915 fixed the same issue a while back, so somewhere common has the advantage of somehow not forgetting to fix other drivers ;-) > I'll respin dropping those four unnecessary error codes, and post the > delta for this. > >> > +/* Prime support */ >> > +struct sg_table * >> > +armada_gem_prime_map_dma_buf(struct dma_buf_attachment *attach, >> > + enum dma_data_direction dir) >> > +{ >> > + struct drm_gem_object *obj = attach->dmabuf->priv; >> > + struct armada_gem_object *dobj = drm_to_armada_gem(obj); >> > + struct scatterlist *sg; >> > + struct sg_table *sgt; >> > + int i, num; >> > + >> > + sgt = kmalloc(sizeof(*sgt), GFP_KERNEL); >> > + if (!sgt) >> > + return NULL; >> > + >> > + if (dobj->obj.filp) { >> > + struct address_space *mapping; >> > + gfp_t gfp; >> > + int count; >> > + >> > + count = dobj->obj.size / PAGE_SIZE; >> > + if (sg_alloc_table(sgt, count, GFP_KERNEL)) >> > + goto free_sgt; >> > + >> > + mapping = file_inode(dobj->obj.filp)->i_mapping; >> > + gfp = mapping_gfp_mask(mapping); >> > + >> > + for_each_sg(sgt->sgl, sg, count, i) { >> > + struct page *page; >> > + >> > + page = shmem_read_mapping_page_gfp(mapping, i, gfp); >> >> you could almost use drm_gem_get_pages().. although I guess you >> otherwise have no need for the page[] array? > > Correct. The page[] array would just be an additional unnecessary > allocation, and therefore would be an additional unnecessary point of > failure. > >> > +#define DRM_ARMADA_GEM_CREATE 0x00 >> > +#define DRM_ARMADA_GEM_MMAP 0x02 >> > +#define DRM_ARMADA_GEM_PWRITE 0x03 >> > + >> > +#define ARMADA_IOCTL(dir, name, str) \ >> > + DRM_##dir(DRM_COMMAND_BASE + DRM_ARMADA_##name, struct drm_armada_##str) >> > + >> > +struct drm_armada_gem_create { >> >> Any reason not to throw in a 'uint32_t flags' field? At least then >> you could indicate what sort of backing memory you want, and do things >> like allocate linear scanout buffer w/ your gem_create rather than >> having to use dumb_create. Maybe not something you need now, but >> seems like eventually you'll come up with some reason or another to >> want to pass some flags into gem_create. > > I thought one of the points of the dumb_create stuff was so that there > is a standard API for dumb scanout buffers across all DRM drivers. It > has that advantage, and as I understand it, a generic KMS driver for X > is on the cards. Yeah, xf86-video-modesetting currently uses dumb allocation. So you definitely want to continue to support the dumb buffer path. I can't really think of any immediate need for 'flags'.. but seems like sooner or later someone will come up with some need for it, so it seemed like a convenient placeholder to have. Well, technically you can get away w/ adding new fields to the end of the ioctl struct, and drm_ioctl() will take care of zero'ing that out for you with an old userspace. So I guess you could just rely on that if you ever need to add 'flags' or some other fields. > Thanks for the review. no prob BR, -R
WARNING: multiple messages have this Message-ID (diff)
From: Rob Clark <robdclark@gmail.com> To: Russell King - ARM Linux <linux@arm.linux.org.uk> Cc: Jason Cooper <jason@lakedaemon.net>, "dri-devel@lists.freedesktop.org" <dri-devel@lists.freedesktop.org>, "linux-arm-kernel@lists.infradead.org" <linux-arm-kernel@lists.infradead.org>, Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Subject: Re: [PATCH 2/5] DRM: Armada: Add Armada DRM driver Date: Thu, 10 Oct 2013 18:23:26 -0400 [thread overview] Message-ID: <CAF6AEGvNyD8-_t2y69a5Gjey7Jg_LXVYNgpYW1rsFFyTkABg=Q@mail.gmail.com> (raw) In-Reply-To: <20131010215951.GS25034@n2100.arm.linux.org.uk> On Thu, Oct 10, 2013 at 5:59 PM, Russell King - ARM Linux <linux@arm.linux.org.uk> wrote: > On Thu, Oct 10, 2013 at 05:25:15PM -0400, Rob Clark wrote: >> On Sun, Oct 6, 2013 at 6:08 PM, Russell King >> <rmk+kernel@arm.linux.org.uk> wrote: >> > + /* >> > + * If we have an overlay plane associated with this CRTC, disable >> > + * it before the modeset to avoid its coordinates being outside >> > + * the new mode parameters. DRM doesn't provide help with this. >> > + */ >> >> Getting a bit off topic, but yeah.. I'd be in favor of "clarifying" >> things by having crtc helpers disable planes on setcrtc (rather than >> only doing this on fbdev/lastclose restore). I >> don't know of any userspace that this would cause problems for. But >> not really sure if it would be considered an interface break or just >> "fixing a bug".. since we have different behavior on different >> drivers, I'd lean towards the latter. > > The reasoning here is if the overlay plane is larger than the mode being > set, we will end up having the hardware programmed in an inconsistent > state - the overlay plane position/width/height can be outside of the > active region, which is invalid for the hardware. So, it's safer to > disable the plane and wait for the next plane to be sent and have that > validated against the new mode. right. I think disabling the planes is the correct behavior. So nothing to do here for armada. I mostly just wanted to get some opinions about making the crtc helpers do this automatically for us. > It's not like you would be able to see the plane immediately, because > most monitors blank while they retrain to the new mode settings. > >> > +static int armada_gem_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) >> > +{ >> > + struct armada_gem_object *obj = drm_to_armada_gem(vma->vm_private_data); >> > + unsigned long addr = (unsigned long)vmf->virtual_address; >> > + unsigned long pfn = obj->phys_addr >> PAGE_SHIFT; >> > + int ret; >> > + >> > + pfn += (addr - vma->vm_start) >> PAGE_SHIFT; >> > + ret = vm_insert_pfn(vma, addr, pfn); >> > + >> > + switch (ret) { >> > + case -EIO: >> > + case -EAGAIN: >> > + set_need_resched(); >> >> probably this thread is applicable here too? >> >> https://lkml.org/lkml/2013/9/12/417 >> >> (although.. we have at least a few slightly differet variants on the >> same errno -> VM_FAULT_x switch in different drivers.. maybe we should >> do something better) > > Hmm. It seems today's vm_insert_pfn() has the following error return > values: > > -EFAULT - virtual address outside vma > -EINVAL - track_pfn_insert() failure > -ENOMEM - failed to get locked pte > -EBUSY - entry already exists in pte > > So it seems my handling -EIO, -EAGAIN, -ERESTARTSYS and -EINTR are all > redundant and can be removed. I'm not sure if it makes sense for this > to be generic - it looks like it's only Intel, gma500 and me who use > this, and Intel handles more error codes (due to it calling other > functions.) I just noticed msm and omapdrm are missing the -EBUSY case (have some patches I need to send), which was why I mentioned this. They do have other error cases from other fxns, so maybe something generic/common doesn't make sense.. but I realized i915 fixed the same issue a while back, so somewhere common has the advantage of somehow not forgetting to fix other drivers ;-) > I'll respin dropping those four unnecessary error codes, and post the > delta for this. > >> > +/* Prime support */ >> > +struct sg_table * >> > +armada_gem_prime_map_dma_buf(struct dma_buf_attachment *attach, >> > + enum dma_data_direction dir) >> > +{ >> > + struct drm_gem_object *obj = attach->dmabuf->priv; >> > + struct armada_gem_object *dobj = drm_to_armada_gem(obj); >> > + struct scatterlist *sg; >> > + struct sg_table *sgt; >> > + int i, num; >> > + >> > + sgt = kmalloc(sizeof(*sgt), GFP_KERNEL); >> > + if (!sgt) >> > + return NULL; >> > + >> > + if (dobj->obj.filp) { >> > + struct address_space *mapping; >> > + gfp_t gfp; >> > + int count; >> > + >> > + count = dobj->obj.size / PAGE_SIZE; >> > + if (sg_alloc_table(sgt, count, GFP_KERNEL)) >> > + goto free_sgt; >> > + >> > + mapping = file_inode(dobj->obj.filp)->i_mapping; >> > + gfp = mapping_gfp_mask(mapping); >> > + >> > + for_each_sg(sgt->sgl, sg, count, i) { >> > + struct page *page; >> > + >> > + page = shmem_read_mapping_page_gfp(mapping, i, gfp); >> >> you could almost use drm_gem_get_pages().. although I guess you >> otherwise have no need for the page[] array? > > Correct. The page[] array would just be an additional unnecessary > allocation, and therefore would be an additional unnecessary point of > failure. > >> > +#define DRM_ARMADA_GEM_CREATE 0x00 >> > +#define DRM_ARMADA_GEM_MMAP 0x02 >> > +#define DRM_ARMADA_GEM_PWRITE 0x03 >> > + >> > +#define ARMADA_IOCTL(dir, name, str) \ >> > + DRM_##dir(DRM_COMMAND_BASE + DRM_ARMADA_##name, struct drm_armada_##str) >> > + >> > +struct drm_armada_gem_create { >> >> Any reason not to throw in a 'uint32_t flags' field? At least then >> you could indicate what sort of backing memory you want, and do things >> like allocate linear scanout buffer w/ your gem_create rather than >> having to use dumb_create. Maybe not something you need now, but >> seems like eventually you'll come up with some reason or another to >> want to pass some flags into gem_create. > > I thought one of the points of the dumb_create stuff was so that there > is a standard API for dumb scanout buffers across all DRM drivers. It > has that advantage, and as I understand it, a generic KMS driver for X > is on the cards. Yeah, xf86-video-modesetting currently uses dumb allocation. So you definitely want to continue to support the dumb buffer path. I can't really think of any immediate need for 'flags'.. but seems like sooner or later someone will come up with some need for it, so it seemed like a convenient placeholder to have. Well, technically you can get away w/ adding new fields to the end of the ioctl struct, and drm_ioctl() will take care of zero'ing that out for you with an old userspace. So I guess you could just rely on that if you ever need to add 'flags' or some other fields. > Thanks for the review. no prob BR, -R
next prev parent reply other threads:[~2013-10-10 22:23 UTC|newest] Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-10-06 22:07 [PATCH 0/5] Armada DRM stuff Russell King - ARM Linux 2013-10-06 22:07 ` Russell King - ARM Linux 2013-10-06 22:07 ` [PATCH 1/5] drm/i2c: tda998x: set VIF for full range, underscanned display Russell King 2013-10-06 22:07 ` Russell King 2013-10-07 8:59 ` Jean-Francois Moine 2013-10-07 8:59 ` Jean-Francois Moine 2013-10-18 15:00 ` Rob Clark 2013-10-18 15:00 ` Rob Clark 2013-10-06 22:08 ` [PATCH 2/5] DRM: Armada: Add Armada DRM driver Russell King 2013-10-06 22:08 ` Russell King 2013-10-10 21:25 ` Rob Clark 2013-10-10 21:25 ` Rob Clark 2013-10-10 21:59 ` Russell King - ARM Linux 2013-10-10 21:59 ` Russell King - ARM Linux 2013-10-10 22:23 ` Rob Clark [this message] 2013-10-10 22:23 ` Rob Clark 2013-10-10 22:53 ` Russell King - ARM Linux 2013-10-10 22:53 ` Russell King - ARM Linux 2013-10-11 0:10 ` Rob Clark 2013-10-11 0:10 ` Rob Clark 2013-10-06 22:09 ` [PATCH 3/5] DRM: Armada: Add support for ARGB 32x64 or 64x32 hardware cursors Russell King 2013-10-06 22:09 ` Russell King 2013-10-07 9:01 ` Jean-Francois Moine 2013-10-07 9:01 ` Jean-Francois Moine 2013-10-07 9:40 ` Russell King - ARM Linux 2013-10-07 9:40 ` Russell King - ARM Linux 2013-10-07 10:09 ` Jean-Francois Moine 2013-10-07 10:09 ` Jean-Francois Moine 2013-10-07 10:32 ` Russell King - ARM Linux 2013-10-07 10:32 ` Russell King - ARM Linux 2013-10-07 12:29 ` Siarhei Siamashka 2013-10-07 12:29 ` Siarhei Siamashka 2013-10-07 12:50 ` Russell King - ARM Linux 2013-10-07 12:50 ` Russell King - ARM Linux 2013-10-17 23:58 ` Rob Clark 2013-10-17 23:58 ` Rob Clark 2013-10-18 14:31 ` Alex Deucher 2013-10-18 14:31 ` Alex Deucher 2013-10-06 22:10 ` [PATCH 4/5] DRM: Armada: start of MMP2/MMP3 support Russell King 2013-10-06 22:10 ` Russell King 2013-10-18 0:11 ` Rob Clark 2013-10-18 0:11 ` Rob Clark 2013-10-06 22:11 ` [PATCH 5/5] DRM: Armada: add support for drm tda19988 driver Russell King 2013-10-06 22:11 ` Russell King 2013-10-07 9:18 ` Jean-Francois Moine 2013-10-07 9:18 ` Jean-Francois Moine 2013-10-07 9:44 ` Russell King - ARM Linux 2013-10-07 9:44 ` Russell King - ARM Linux 2013-10-07 10:48 ` Jean-Francois Moine 2013-10-07 10:48 ` Jean-Francois Moine 2013-10-07 11:09 ` Russell King - ARM Linux 2013-10-07 11:09 ` Russell King - ARM Linux 2013-10-07 11:29 ` Sebastian Hesselbarth 2013-10-07 11:29 ` Sebastian Hesselbarth 2013-10-07 15:53 ` Mark Brown 2013-10-07 15:53 ` Mark Brown 2013-10-07 16:08 ` Sebastian Hesselbarth 2013-10-07 16:08 ` Sebastian Hesselbarth 2013-10-07 17:05 ` Mark Brown 2013-10-07 17:05 ` Mark Brown 2013-10-07 12:03 ` Jean-Francois Moine 2013-10-07 12:03 ` Jean-Francois Moine 2013-10-07 12:36 ` Russell King - ARM Linux 2013-10-07 12:36 ` Russell King - ARM Linux 2013-10-07 14:59 ` Rob Clark 2013-10-07 14:59 ` Rob Clark 2013-10-08 9:19 ` Jean-Francois Moine 2013-10-08 9:19 ` Jean-Francois Moine 2013-10-08 9:49 ` Russell King - ARM Linux 2013-10-08 9:49 ` Russell King - ARM Linux 2013-10-08 15:34 ` Jean-Francois Moine 2013-10-08 15:34 ` Jean-Francois Moine 2013-10-18 0:20 ` Rob Clark 2013-10-18 0:20 ` Rob Clark 2013-10-08 12:07 ` Rob Clark 2013-10-08 12:07 ` Rob Clark 2013-10-07 21:47 ` [PATCH 0/5] Armada DRM stuff Sebastian Hesselbarth 2013-10-07 21:47 ` Sebastian Hesselbarth 2013-10-09 14:31 ` Russell King - ARM Linux 2013-10-09 14:31 ` Russell King - ARM Linux 2013-10-09 14:48 ` Rob Clark 2013-10-09 14:48 ` Rob Clark 2013-10-18 15:15 ` [GIT PULL] Armada DRM support Russell King - ARM Linux 2013-10-18 15:15 ` Russell King - ARM Linux 2013-10-22 13:36 ` Russell King - ARM Linux 2013-10-22 13:36 ` Russell King - ARM Linux
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='CAF6AEGvNyD8-_t2y69a5Gjey7Jg_LXVYNgpYW1rsFFyTkABg=Q@mail.gmail.com' \ --to=robdclark@gmail.com \ --cc=linux-arm-kernel@lists.infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.