Message ID | 20210824224932.564352-3-robdclark@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Initial igt tests for drm/msm ioctls | expand |
On Tue, Aug 24, 2021 at 03:49:31PM -0700, Rob Clark wrote: > From: Rob Clark <robdclark@chromium.org> > > Handle some of the boilerplate for tests. > > Signed-off-by: Rob Clark <robdclark@chromium.org> > --- > lib/igt_msm.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ > lib/igt_msm.h | 128 +++++++++++++++++++++++++++++++++++++ > lib/meson.build | 1 + > 3 files changed, 292 insertions(+) > create mode 100644 lib/igt_msm.c > create mode 100644 lib/igt_msm.h > > diff --git a/lib/igt_msm.c b/lib/igt_msm.c > new file mode 100644 > index 00000000..1bcb08d9 > --- /dev/null > +++ b/lib/igt_msm.c > @@ -0,0 +1,163 @@ > +/* > + * Copyright © 2021 Google, Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > + * IN THE SOFTWARE. > + */ > + > +#include <assert.h> > +#include <string.h> > +#include <signal.h> > +#include <errno.h> > +#include <sys/mman.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <sys/ioctl.h> > +#include <fcntl.h> > + > +#include "drmtest.h" > +#include "igt_aux.h" > +#include "igt_core.h" > +#include "igt_msm.h" > +#include "ioctl_wrappers.h" > + > +/** > + * SECTION:igt_msm > + * @short_description: msm support library > + * @title: msm > + * @include: igt_msm.h > + * > + * This library provides various auxiliary helper functions for writing msm > + * tests. > + */ > + > +struct msm_device * > +igt_msm_dev_open(void) > +{ > + struct msm_device *dev = calloc(1, sizeof(*dev)); > + > + dev->fd = drm_open_driver_render(DRIVER_MSM); > + if (dev->fd < 0) { > + free(dev); > + return NULL; > + } > + > + return dev; > +} > + > +void > +igt_msm_dev_close(struct msm_device *dev) > +{ > + close(dev->fd); > + free(dev); > +} > + > +struct msm_bo * > +igt_msm_bo_new(struct msm_device *dev, size_t size, uint32_t flags) > +{ > + struct msm_bo *bo = calloc(1, sizeof(*bo)); > + > + struct drm_msm_gem_new req = { > + .size = size, > + .flags = flags, > + }; > + > + bo->dev = dev; > + bo->size = size; > + > + do_ioctl(dev->fd, DRM_IOCTL_MSM_GEM_NEW, &req); > + > + bo->handle = req.handle; > + > + return bo; > +} > + > +void > +igt_msm_bo_free(struct msm_bo *bo) > +{ > + if (bo->map) > + munmap(bo->map, bo->size); > + gem_close(bo->dev->fd, bo->handle); > + free(bo); > +} > + > +void * > +igt_msm_bo_map(struct msm_bo *bo) > +{ > + if (!bo->map) { > + struct drm_msm_gem_info req = { > + .handle = bo->handle, > + .info = MSM_INFO_GET_OFFSET, > + }; > + void *ptr; > + > + do_ioctl(bo->dev->fd, DRM_IOCTL_MSM_GEM_INFO, &req); > + > + ptr = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, > + bo->dev->fd, req.value); > + if (ptr == MAP_FAILED) > + return NULL; > + > + bo->map = ptr; > + } > + return bo->map; > +} > + > +struct msm_pipe * > +igt_msm_pipe_open(struct msm_device *dev, uint32_t prio) > +{ > + struct msm_pipe *pipe = calloc(1, sizeof(*pipe)); > + struct drm_msm_submitqueue req = { > + .flags = 0, > + .prio = prio, > + }; > + > + pipe->dev = dev; > + pipe->pipe = MSM_PIPE_3D0; > + > + /* Note that kerenels prior to v4.15 did not support submitqueues. > + * Mesa maintains support for older kernels, but I do not think > + * that IGT needs to. > + */ > + do_ioctl(dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_NEW, &req); > + > + pipe->submitqueue_id = req.id; > + > + return pipe; > +} > + > +void > +igt_msm_pipe_close(struct msm_pipe *pipe) > +{ > + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &pipe->submitqueue_id); > + free(pipe); > +} > + > +uint64_t > +igt_msm_pipe_get_param(struct msm_pipe *pipe, uint32_t param) > +{ > + struct drm_msm_param req = { > + .pipe = pipe->pipe, > + .param = param, > + }; > + > + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_GET_PARAM, &req); > + > + return req.value; > +} > diff --git a/lib/igt_msm.h b/lib/igt_msm.h > new file mode 100644 > index 00000000..0d302e18 > --- /dev/null > +++ b/lib/igt_msm.h > @@ -0,0 +1,128 @@ > +/* > + * Copyright © 2021 Google, Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > + * IN THE SOFTWARE. > + */ > + > +#ifndef IGT_MSM_H > +#define IGT_MSM_H > + > +#include "msm_drm.h" > + > +struct msm_device { > + int fd; > +}; Why do you need this wrapper struct?
On Wed, Aug 25, 2021 at 1:44 AM Petri Latvala <petri.latvala@intel.com> wrote: > > On Tue, Aug 24, 2021 at 03:49:31PM -0700, Rob Clark wrote: > > From: Rob Clark <robdclark@chromium.org> > > > > Handle some of the boilerplate for tests. > > > > Signed-off-by: Rob Clark <robdclark@chromium.org> > > --- > > lib/igt_msm.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ > > lib/igt_msm.h | 128 +++++++++++++++++++++++++++++++++++++ > > lib/meson.build | 1 + > > 3 files changed, 292 insertions(+) > > create mode 100644 lib/igt_msm.c > > create mode 100644 lib/igt_msm.h > > > > diff --git a/lib/igt_msm.c b/lib/igt_msm.c > > new file mode 100644 > > index 00000000..1bcb08d9 > > --- /dev/null > > +++ b/lib/igt_msm.c > > @@ -0,0 +1,163 @@ > > +/* > > + * Copyright © 2021 Google, Inc. > > + * > > + * Permission is hereby granted, free of charge, to any person obtaining a > > + * copy of this software and associated documentation files (the "Software"), > > + * to deal in the Software without restriction, including without limitation > > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > > + * and/or sell copies of the Software, and to permit persons to whom the > > + * Software is furnished to do so, subject to the following conditions: > > + * > > + * The above copyright notice and this permission notice (including the next > > + * paragraph) shall be included in all copies or substantial portions of the > > + * Software. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > > + * IN THE SOFTWARE. > > + */ > > + > > +#include <assert.h> > > +#include <string.h> > > +#include <signal.h> > > +#include <errno.h> > > +#include <sys/mman.h> > > +#include <sys/types.h> > > +#include <sys/stat.h> > > +#include <sys/ioctl.h> > > +#include <fcntl.h> > > + > > +#include "drmtest.h" > > +#include "igt_aux.h" > > +#include "igt_core.h" > > +#include "igt_msm.h" > > +#include "ioctl_wrappers.h" > > + > > +/** > > + * SECTION:igt_msm > > + * @short_description: msm support library > > + * @title: msm > > + * @include: igt_msm.h > > + * > > + * This library provides various auxiliary helper functions for writing msm > > + * tests. > > + */ > > + > > +struct msm_device * > > +igt_msm_dev_open(void) > > +{ > > + struct msm_device *dev = calloc(1, sizeof(*dev)); > > + > > + dev->fd = drm_open_driver_render(DRIVER_MSM); > > + if (dev->fd < 0) { > > + free(dev); > > + return NULL; > > + } > > + > > + return dev; > > +} > > + > > +void > > +igt_msm_dev_close(struct msm_device *dev) > > +{ > > + close(dev->fd); > > + free(dev); > > +} > > + > > +struct msm_bo * > > +igt_msm_bo_new(struct msm_device *dev, size_t size, uint32_t flags) > > +{ > > + struct msm_bo *bo = calloc(1, sizeof(*bo)); > > + > > + struct drm_msm_gem_new req = { > > + .size = size, > > + .flags = flags, > > + }; > > + > > + bo->dev = dev; > > + bo->size = size; > > + > > + do_ioctl(dev->fd, DRM_IOCTL_MSM_GEM_NEW, &req); > > + > > + bo->handle = req.handle; > > + > > + return bo; > > +} > > + > > +void > > +igt_msm_bo_free(struct msm_bo *bo) > > +{ > > + if (bo->map) > > + munmap(bo->map, bo->size); > > + gem_close(bo->dev->fd, bo->handle); > > + free(bo); > > +} > > + > > +void * > > +igt_msm_bo_map(struct msm_bo *bo) > > +{ > > + if (!bo->map) { > > + struct drm_msm_gem_info req = { > > + .handle = bo->handle, > > + .info = MSM_INFO_GET_OFFSET, > > + }; > > + void *ptr; > > + > > + do_ioctl(bo->dev->fd, DRM_IOCTL_MSM_GEM_INFO, &req); > > + > > + ptr = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, > > + bo->dev->fd, req.value); > > + if (ptr == MAP_FAILED) > > + return NULL; > > + > > + bo->map = ptr; > > + } > > + return bo->map; > > +} > > + > > +struct msm_pipe * > > +igt_msm_pipe_open(struct msm_device *dev, uint32_t prio) > > +{ > > + struct msm_pipe *pipe = calloc(1, sizeof(*pipe)); > > + struct drm_msm_submitqueue req = { > > + .flags = 0, > > + .prio = prio, > > + }; > > + > > + pipe->dev = dev; > > + pipe->pipe = MSM_PIPE_3D0; > > + > > + /* Note that kerenels prior to v4.15 did not support submitqueues. > > + * Mesa maintains support for older kernels, but I do not think > > + * that IGT needs to. > > + */ > > + do_ioctl(dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_NEW, &req); > > + > > + pipe->submitqueue_id = req.id; > > + > > + return pipe; > > +} > > + > > +void > > +igt_msm_pipe_close(struct msm_pipe *pipe) > > +{ > > + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &pipe->submitqueue_id); > > + free(pipe); > > +} > > + > > +uint64_t > > +igt_msm_pipe_get_param(struct msm_pipe *pipe, uint32_t param) > > +{ > > + struct drm_msm_param req = { > > + .pipe = pipe->pipe, > > + .param = param, > > + }; > > + > > + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_GET_PARAM, &req); > > + > > + return req.value; > > +} > > diff --git a/lib/igt_msm.h b/lib/igt_msm.h > > new file mode 100644 > > index 00000000..0d302e18 > > --- /dev/null > > +++ b/lib/igt_msm.h > > @@ -0,0 +1,128 @@ > > +/* > > + * Copyright © 2021 Google, Inc. > > + * > > + * Permission is hereby granted, free of charge, to any person obtaining a > > + * copy of this software and associated documentation files (the "Software"), > > + * to deal in the Software without restriction, including without limitation > > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > > + * and/or sell copies of the Software, and to permit persons to whom the > > + * Software is furnished to do so, subject to the following conditions: > > + * > > + * The above copyright notice and this permission notice (including the next > > + * paragraph) shall be included in all copies or substantial portions of the > > + * Software. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > > + * IN THE SOFTWARE. > > + */ > > + > > +#ifndef IGT_MSM_H > > +#define IGT_MSM_H > > + > > +#include "msm_drm.h" > > + > > +struct msm_device { > > + int fd; > > +}; > > Why do you need this wrapper struct? It isn't adding a lot of value yet, and I was a bit on the fence about whether to include it.. but based on my experience on the mesa side of things, I could see ways that it becomes useful. For example if we needed to add refcnt'ing so the drm fd is closed when the last user is done (multi-threaded tests?). Or if we want to centralize collection of GPU info/configuration, rather than duplicating in individual tests. In the end, it doesn't add/remove any lines of code from the tests, but it would be churn to retrofit it later. So I kept it. BR, -R
On Wed, Aug 25, 2021 at 08:37:39AM -0700, Rob Clark wrote: > On Wed, Aug 25, 2021 at 1:44 AM Petri Latvala <petri.latvala@intel.com> wrote: > > > > On Tue, Aug 24, 2021 at 03:49:31PM -0700, Rob Clark wrote: > > > From: Rob Clark <robdclark@chromium.org> > > > > > > Handle some of the boilerplate for tests. > > > > > > Signed-off-by: Rob Clark <robdclark@chromium.org> > > > --- > > > lib/igt_msm.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ > > > lib/igt_msm.h | 128 +++++++++++++++++++++++++++++++++++++ > > > lib/meson.build | 1 + > > > 3 files changed, 292 insertions(+) > > > create mode 100644 lib/igt_msm.c > > > create mode 100644 lib/igt_msm.h > > > > > > diff --git a/lib/igt_msm.c b/lib/igt_msm.c > > > new file mode 100644 > > > index 00000000..1bcb08d9 > > > --- /dev/null > > > +++ b/lib/igt_msm.c > > > @@ -0,0 +1,163 @@ > > > +/* > > > + * Copyright © 2021 Google, Inc. > > > + * > > > + * Permission is hereby granted, free of charge, to any person obtaining a > > > + * copy of this software and associated documentation files (the "Software"), > > > + * to deal in the Software without restriction, including without limitation > > > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > > > + * and/or sell copies of the Software, and to permit persons to whom the > > > + * Software is furnished to do so, subject to the following conditions: > > > + * > > > + * The above copyright notice and this permission notice (including the next > > > + * paragraph) shall be included in all copies or substantial portions of the > > > + * Software. > > > + * > > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > > > + * IN THE SOFTWARE. > > > + */ > > > + > > > +#include <assert.h> > > > +#include <string.h> > > > +#include <signal.h> > > > +#include <errno.h> > > > +#include <sys/mman.h> > > > +#include <sys/types.h> > > > +#include <sys/stat.h> > > > +#include <sys/ioctl.h> > > > +#include <fcntl.h> > > > + > > > +#include "drmtest.h" > > > +#include "igt_aux.h" > > > +#include "igt_core.h" > > > +#include "igt_msm.h" > > > +#include "ioctl_wrappers.h" > > > + > > > +/** > > > + * SECTION:igt_msm > > > + * @short_description: msm support library > > > + * @title: msm > > > + * @include: igt_msm.h > > > + * > > > + * This library provides various auxiliary helper functions for writing msm > > > + * tests. > > > + */ > > > + > > > +struct msm_device * > > > +igt_msm_dev_open(void) > > > +{ > > > + struct msm_device *dev = calloc(1, sizeof(*dev)); > > > + > > > + dev->fd = drm_open_driver_render(DRIVER_MSM); > > > + if (dev->fd < 0) { > > > + free(dev); > > > + return NULL; > > > + } > > > + > > > + return dev; > > > +} > > > + > > > +void > > > +igt_msm_dev_close(struct msm_device *dev) > > > +{ > > > + close(dev->fd); > > > + free(dev); > > > +} > > > + > > > +struct msm_bo * > > > +igt_msm_bo_new(struct msm_device *dev, size_t size, uint32_t flags) > > > +{ > > > + struct msm_bo *bo = calloc(1, sizeof(*bo)); > > > + > > > + struct drm_msm_gem_new req = { > > > + .size = size, > > > + .flags = flags, > > > + }; > > > + > > > + bo->dev = dev; > > > + bo->size = size; > > > + > > > + do_ioctl(dev->fd, DRM_IOCTL_MSM_GEM_NEW, &req); > > > + > > > + bo->handle = req.handle; > > > + > > > + return bo; > > > +} > > > + > > > +void > > > +igt_msm_bo_free(struct msm_bo *bo) > > > +{ > > > + if (bo->map) > > > + munmap(bo->map, bo->size); > > > + gem_close(bo->dev->fd, bo->handle); > > > + free(bo); > > > +} > > > + > > > +void * > > > +igt_msm_bo_map(struct msm_bo *bo) > > > +{ > > > + if (!bo->map) { > > > + struct drm_msm_gem_info req = { > > > + .handle = bo->handle, > > > + .info = MSM_INFO_GET_OFFSET, > > > + }; > > > + void *ptr; > > > + > > > + do_ioctl(bo->dev->fd, DRM_IOCTL_MSM_GEM_INFO, &req); > > > + > > > + ptr = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, > > > + bo->dev->fd, req.value); > > > + if (ptr == MAP_FAILED) > > > + return NULL; > > > + > > > + bo->map = ptr; > > > + } > > > + return bo->map; > > > +} > > > + > > > +struct msm_pipe * > > > +igt_msm_pipe_open(struct msm_device *dev, uint32_t prio) > > > +{ > > > + struct msm_pipe *pipe = calloc(1, sizeof(*pipe)); > > > + struct drm_msm_submitqueue req = { > > > + .flags = 0, > > > + .prio = prio, > > > + }; > > > + > > > + pipe->dev = dev; > > > + pipe->pipe = MSM_PIPE_3D0; > > > + > > > + /* Note that kerenels prior to v4.15 did not support submitqueues. > > > + * Mesa maintains support for older kernels, but I do not think > > > + * that IGT needs to. > > > + */ > > > + do_ioctl(dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_NEW, &req); > > > + > > > + pipe->submitqueue_id = req.id; > > > + > > > + return pipe; > > > +} > > > + > > > +void > > > +igt_msm_pipe_close(struct msm_pipe *pipe) > > > +{ > > > + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &pipe->submitqueue_id); > > > + free(pipe); > > > +} > > > + > > > +uint64_t > > > +igt_msm_pipe_get_param(struct msm_pipe *pipe, uint32_t param) > > > +{ > > > + struct drm_msm_param req = { > > > + .pipe = pipe->pipe, > > > + .param = param, > > > + }; > > > + > > > + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_GET_PARAM, &req); > > > + > > > + return req.value; > > > +} > > > diff --git a/lib/igt_msm.h b/lib/igt_msm.h > > > new file mode 100644 > > > index 00000000..0d302e18 > > > --- /dev/null > > > +++ b/lib/igt_msm.h > > > @@ -0,0 +1,128 @@ > > > +/* > > > + * Copyright © 2021 Google, Inc. > > > + * > > > + * Permission is hereby granted, free of charge, to any person obtaining a > > > + * copy of this software and associated documentation files (the "Software"), > > > + * to deal in the Software without restriction, including without limitation > > > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > > > + * and/or sell copies of the Software, and to permit persons to whom the > > > + * Software is furnished to do so, subject to the following conditions: > > > + * > > > + * The above copyright notice and this permission notice (including the next > > > + * paragraph) shall be included in all copies or substantial portions of the > > > + * Software. > > > + * > > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > > > + * IN THE SOFTWARE. > > > + */ > > > + > > > +#ifndef IGT_MSM_H > > > +#define IGT_MSM_H > > > + > > > +#include "msm_drm.h" > > > + > > > +struct msm_device { > > > + int fd; > > > +}; > > > > Why do you need this wrapper struct? > > It isn't adding a lot of value yet, and I was a bit on the fence about > whether to include it.. but based on my experience on the mesa side of > things, I could see ways that it becomes useful. For example if we > needed to add refcnt'ing so the drm fd is closed when the last user is > done (multi-threaded tests?). Or if we want to centralize collection > of GPU info/configuration, rather than duplicating in individual > tests. > > In the end, it doesn't add/remove any lines of code from the tests, > but it would be churn to retrofit it later. So I kept it. It does add the extra device opening wrapper that is just for msm. If you need to box together some extra data, I suggest having a helper that gets the fd passed to it, rather than wrapping drm_open_driver_render(). One step further, if such boxing would be useful, it would be useful for all drivers perhaps? But it's a moot point before such use arises.
diff --git a/lib/igt_msm.c b/lib/igt_msm.c new file mode 100644 index 00000000..1bcb08d9 --- /dev/null +++ b/lib/igt_msm.c @@ -0,0 +1,163 @@ +/* + * Copyright © 2021 Google, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include <assert.h> +#include <string.h> +#include <signal.h> +#include <errno.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <fcntl.h> + +#include "drmtest.h" +#include "igt_aux.h" +#include "igt_core.h" +#include "igt_msm.h" +#include "ioctl_wrappers.h" + +/** + * SECTION:igt_msm + * @short_description: msm support library + * @title: msm + * @include: igt_msm.h + * + * This library provides various auxiliary helper functions for writing msm + * tests. + */ + +struct msm_device * +igt_msm_dev_open(void) +{ + struct msm_device *dev = calloc(1, sizeof(*dev)); + + dev->fd = drm_open_driver_render(DRIVER_MSM); + if (dev->fd < 0) { + free(dev); + return NULL; + } + + return dev; +} + +void +igt_msm_dev_close(struct msm_device *dev) +{ + close(dev->fd); + free(dev); +} + +struct msm_bo * +igt_msm_bo_new(struct msm_device *dev, size_t size, uint32_t flags) +{ + struct msm_bo *bo = calloc(1, sizeof(*bo)); + + struct drm_msm_gem_new req = { + .size = size, + .flags = flags, + }; + + bo->dev = dev; + bo->size = size; + + do_ioctl(dev->fd, DRM_IOCTL_MSM_GEM_NEW, &req); + + bo->handle = req.handle; + + return bo; +} + +void +igt_msm_bo_free(struct msm_bo *bo) +{ + if (bo->map) + munmap(bo->map, bo->size); + gem_close(bo->dev->fd, bo->handle); + free(bo); +} + +void * +igt_msm_bo_map(struct msm_bo *bo) +{ + if (!bo->map) { + struct drm_msm_gem_info req = { + .handle = bo->handle, + .info = MSM_INFO_GET_OFFSET, + }; + void *ptr; + + do_ioctl(bo->dev->fd, DRM_IOCTL_MSM_GEM_INFO, &req); + + ptr = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, + bo->dev->fd, req.value); + if (ptr == MAP_FAILED) + return NULL; + + bo->map = ptr; + } + return bo->map; +} + +struct msm_pipe * +igt_msm_pipe_open(struct msm_device *dev, uint32_t prio) +{ + struct msm_pipe *pipe = calloc(1, sizeof(*pipe)); + struct drm_msm_submitqueue req = { + .flags = 0, + .prio = prio, + }; + + pipe->dev = dev; + pipe->pipe = MSM_PIPE_3D0; + + /* Note that kerenels prior to v4.15 did not support submitqueues. + * Mesa maintains support for older kernels, but I do not think + * that IGT needs to. + */ + do_ioctl(dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_NEW, &req); + + pipe->submitqueue_id = req.id; + + return pipe; +} + +void +igt_msm_pipe_close(struct msm_pipe *pipe) +{ + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &pipe->submitqueue_id); + free(pipe); +} + +uint64_t +igt_msm_pipe_get_param(struct msm_pipe *pipe, uint32_t param) +{ + struct drm_msm_param req = { + .pipe = pipe->pipe, + .param = param, + }; + + do_ioctl(pipe->dev->fd, DRM_IOCTL_MSM_GET_PARAM, &req); + + return req.value; +} diff --git a/lib/igt_msm.h b/lib/igt_msm.h new file mode 100644 index 00000000..0d302e18 --- /dev/null +++ b/lib/igt_msm.h @@ -0,0 +1,128 @@ +/* + * Copyright © 2021 Google, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef IGT_MSM_H +#define IGT_MSM_H + +#include "msm_drm.h" + +struct msm_device { + int fd; +}; + +struct msm_device *igt_msm_dev_open(void); +void igt_msm_dev_close(struct msm_device *dev); + +struct msm_bo { + struct msm_device *dev; + int handle; + uint32_t size; + void *map; +}; + +struct msm_bo *igt_msm_bo_new(struct msm_device *dev, size_t size, uint32_t flags); +void igt_msm_bo_free(struct msm_bo *bo); +void *igt_msm_bo_map(struct msm_bo *bo); + +struct msm_pipe { + struct msm_device *dev; + uint32_t pipe; + uint32_t submitqueue_id; +}; + +struct msm_pipe *igt_msm_pipe_open(struct msm_device *dev, uint32_t prio); +void igt_msm_pipe_close(struct msm_pipe *pipe); +uint64_t igt_msm_pipe_get_param(struct msm_pipe *pipe, uint32_t param); + +/* Helper to get GPU gen.. we don't need too much actual cmdstream generation, + * but even CP_NOP is different between generations + */ +static inline unsigned +igt_msm_pipe_gen(struct msm_pipe *pipe) +{ + uint64_t chip_id = igt_msm_pipe_get_param(pipe, MSM_PARAM_CHIP_ID); + return (chip_id >> 24) & 0xff; +} + +/* + * Helpers for cmdstream building: + */ + +enum adreno_pm4_packet_type { + CP_TYPE0_PKT = 0, + CP_TYPE1_PKT = 0x40000000, + CP_TYPE2_PKT = 0x80000000, + CP_TYPE3_PKT = 0xc0000000, + CP_TYPE4_PKT = 0x40000000, + CP_TYPE7_PKT = 0x70000000, +}; + +enum adreno_pm4_type3_packets { + CP_NOP = 16, +}; + +static inline unsigned +pm4_odd_parity_bit(unsigned val) +{ + /* See: http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel + * note that we want odd parity so 0x6996 is inverted. + */ + val ^= val >> 16; + val ^= val >> 8; + val ^= val >> 4; + val &= 0xf; + return (~0x6996 >> val) & 1; +} + +static inline uint32_t +pm4_pkt0_hdr(uint16_t regindx, uint16_t cnt) +{ + return CP_TYPE0_PKT | ((cnt - 1) << 16) | (regindx & 0x7fff); +} + +static inline uint32_t +pm4_pkt3_hdr(uint8_t opcode, uint16_t cnt) +{ + return CP_TYPE3_PKT | ((cnt - 1) << 16) | ((opcode & 0xff) << 8); +} + +static inline uint32_t +pm4_pkt4_hdr(uint16_t regindx, uint16_t cnt) +{ + return CP_TYPE4_PKT | cnt | (pm4_odd_parity_bit(cnt) << 7) | + ((regindx & 0x3ffff) << 8) | + ((pm4_odd_parity_bit(regindx) << 27)); +} + +static inline uint32_t +pm4_pkt7_hdr(uint8_t opcode, uint16_t cnt) +{ + return CP_TYPE7_PKT | cnt | (pm4_odd_parity_bit(cnt) << 15) | + ((opcode & 0x7f) << 16) | + ((pm4_odd_parity_bit(opcode) << 23)); +} + +#define U642VOID(x) ((void *)(uintptr_t)(x)) +#define VOID2U64(x) ((uint64_t)(uintptr_t)(x)) + +#endif /* IGT_MSM_H */ diff --git a/lib/meson.build b/lib/meson.build index 67d40512..c3080fc8 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -82,6 +82,7 @@ lib_sources = [ 'igt_eld.c', 'igt_infoframe.c', 'veboxcopy_gen12.c', + 'igt_msm.c', ] lib_deps = [