mmap fails for DRM_IOCTL_MODE_MAP_DUMB for Radeon, Nouveau, and VMWGFX
Rian Quinn
rianquinn at gmail.com
Mon Nov 10 13:33:56 PST 2014
I would be surprised if the size argument was the issue. That comes right
out out of the create IOCTL unmodified. Here is the full source that I am
using.
// Clear the arg buffers.
memset(&create_arg, 0, sizeof(create_arg));
memset(&map_arg, 0, sizeof(map_arg));
//
------------------------------------------------------------------------
// Allocate
// Fill in the arguments for the IOCTL. Note that we only support 32bpp
// dumb buffers so that is hard coded here.
create_arg.width = width;
create_arg.height = height;
create_arg.bpp = 32;
// Allocate the dumb buffer
if (drmIoctl(gpu->fd(), DRM_IOCTL_MODE_CREATE_DUMB, &create_arg))
{
svWarning(0) << "Failed: DRM_IOCTL_MODE_CREATE_DUMB - " <<
strerror(errno);
return;
}
// Store the dumb buffer properties.
mSize = create_arg.size;
mStride = create_arg.pitch;
mHandle = create_arg.handle;
//
------------------------------------------------------------------------
// Map
// Fill in the arguments for the IOCTL.
map_arg.handle = mHandle;
// Allocate the dumb buffer
if (drmIoctl(gpu->fd(), DRM_IOCTL_MODE_MAP_DUMB, &map_arg))
{
svWarning(0) << "Failed: DRM_IOCTL_MODE_MAP_DUMB - " <<
strerror(errno);
return;
}
// Store the mapped memory
if ((mVaddr = (svuint32 *)mmap(0, mSize, PROT_READ | PROT_WRITE,
MAP_SHARED, gpu->fd(), map_arg.offset)) == MAP_FAILED)
{
// Need to clear out the address so that we don't try to use it.
mVaddr = NULL;
// Error out.
svWarning(0) << "Failed: Dumb Buffer mmap - " << strerror(errno);
return;
}
When this code runs, I get the "Invalid Argument" on the mmap.
On Mon, Nov 10, 2014 at 4:14 PM, Dave Airlie <airlied at gmail.com> wrote:
> On 11 November 2014 06:33, Rian Quinn <rianquinn at gmail.com> wrote:
> > I did another test using the following that David put up on github:
> >
> > https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset.c
> >
> > This test also fails on everything except Intel. What's really strange is
> > this test actually does a test to verify that dumb buffers are supported,
> > and the test passes in all cases. David's code is returning with the same
> > error of "Invalid Argument" on the mmap call. Why would the other
> driver's
> > claim to support dumb buffers, but have no means to map the memory?
>
> Just a guess, the size argument is wrong.
>
> But you know you have the kernel source, stick some printks in the
> EINVAL return paths already.
>
> Dave.
> > - Rian
> >
> > On Mon, Nov 10, 2014 at 2:48 PM, Rian Quinn <rianquinn at gmail.com> wrote:
> >>
> >> When working with dumb buffers, DRM_IOCTL_MODE_MAP_DUMB and mmap works
> >> fine on Intel, but the mmap call fails on Radeon, Nouveau, and VMWGFX.
> I you
> >> look at the source for the xorg moderating driver, it only uses the dumb
> >> buffer IOCTL (i.e. it’s not using LibKMS), and if you look at the kernel
> >> source code for the dumb buffer IOCTLs for each of the Radeon, Nouveau,
> and
> >> VMWGFX drivers, they all implement the functions. Furthermore all of the
> >> IOCTLs succeed without error. Its only when you attempt to map the
> memory,
> >> that you get an error of “Invalid Argument”. Here is my map call:
> >>
> >> mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, map_arg.offset)
> >>
> >> Is this a bug, or is there a different way to map the dumb buffers for
> >> these drivers other than LibKMS.
> >>
> >> Thanks,
> >> - Rian
> >
> >
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20141110/7cacc3bb/attachment.html>
More information about the dri-devel
mailing list