diff options
| -rw-r--r-- | configure.ac | 1 | ||||
| -rw-r--r-- | libdrm/Makefile.am | 2 | ||||
| -rw-r--r-- | libdrm/radeon/Makefile.am | 43 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_bo.h | 102 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_bo_gem.c | 186 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_bo_gem.h | 38 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_cs.h | 144 | 
7 files changed, 515 insertions, 1 deletions
| diff --git a/configure.ac b/configure.ac index 92507cb5..a6fbff73 100644 --- a/configure.ac +++ b/configure.ac @@ -117,6 +117,7 @@ AC_OUTPUT([  	Makefile  	libdrm/Makefile  	libdrm/intel/Makefile +	libdrm/radeon/Makefile  	shared-core/Makefile  	tests/Makefile  	libdrm.pc]) diff --git a/libdrm/Makefile.am b/libdrm/Makefile.am index c3619a6d..ded86308 100644 --- a/libdrm/Makefile.am +++ b/libdrm/Makefile.am @@ -18,7 +18,7 @@  #  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. -SUBDIRS = . intel +SUBDIRS = . intel radeon  libdrm_la_LTLIBRARIES = libdrm.la  libdrm_ladir = $(libdir) diff --git a/libdrm/radeon/Makefile.am b/libdrm/radeon/Makefile.am new file mode 100644 index 00000000..6af06a7f --- /dev/null +++ b/libdrm/radeon/Makefile.am @@ -0,0 +1,43 @@ +# Copyright © 2008 Jérôme Glisse +# +# 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. +# +# Authors: +#    Jérôme Glisse <glisse@freedesktop.org> + +AM_CFLAGS = \ +	$(WARN_CFLAGS) \ +	-I$(top_srcdir)/libdrm \ +	-I$(top_srcdir)/libdrm/radeon \ +	$(PTHREADSTUBS_CFLAGS) \ +	-I$(top_srcdir)/shared-core + +libdrm_radeon_la_LTLIBRARIES = libdrm_radeon.la +libdrm_radeon_ladir = $(libdir) +libdrm_radeon_la_LDFLAGS = -version-number 1:0:0 -no-undefined +libdrm_radeon_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ + +libdrm_radeon_la_SOURCES = \ +	radeon_bo_gem.c + +libdrm_radeonincludedir = ${includedir} +libdrm_radeoninclude_HEADERS = \ +	radeon_bo.h \ +	radeon_cs.h diff --git a/libdrm/radeon/radeon_bo.h b/libdrm/radeon/radeon_bo.h new file mode 100644 index 00000000..67c75262 --- /dev/null +++ b/libdrm/radeon/radeon_bo.h @@ -0,0 +1,102 @@ +/*  + * Copyright © 2008 Jérôme Glisse + * All Rights Reserved. + *  + * 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + */ +/* + * Authors: + *      Jérôme Glisse <glisse@freedesktop.org> + */ +#ifndef RADEON_BO_H +#define RADEON_BO_H + +#include <stdint.h> + +/* bo object */ +#define RADEON_BO_FLAGS_MACRO_TILE  1 +#define RADEON_BO_FLAGS_MICRO_TILE  2 + +struct radeon_bo_manager; + +struct radeon_bo { +    uint32_t                    alignment; +    uint32_t                    handle; +    uint32_t                    size; +    uint32_t                    flags; +    void                        *ptr; +    struct radeon_bo_manager    *bom; +}; + +/* bo functions */ +struct radeon_bo_funcs { +    struct radeon_bo *(*bo_open)(struct radeon_bo_manager *bom, +                                 uint32_t handle, +                                 uint32_t size, +                                 uint32_t alignment, +                                 uint32_t flags); +    void (*bo_close)(struct radeon_bo *bo); +    void (*bo_pin)(struct radeon_bo *bo); +    void (*bo_unpin)(struct radeon_bo *bo); +    int (*bo_map)(struct radeon_bo *bo, unsigned int flags); +    int (*bo_unmap)(struct radeon_bo *bo); +}; + +struct radeon_bo_manager { +    struct radeon_bo_funcs  *funcs; +    int                     fd; +}; + +static inline struct radeon_bo *radeon_bo_open(struct radeon_bo_manager *bom, +                                               uint32_t handle, +                                               uint32_t size, +                                               uint32_t alignment, +                                               uint32_t flags) +{ +    return bom->funcs->bo_open(bom, handle, size, alignment, flags); +} + +static inline void radeon_bo_close(struct radeon_bo *bo) +{ +    return bo->bom->funcs->bo_close(bo); +} + +static inline void radeon_bo_pin(struct radeon_bo *bo) +{ +    return bo->bom->funcs->bo_pin(bo); +} + +static inline void radeon_bo_unpin(struct radeon_bo *bo) +{ +    return bo->bom->funcs->bo_unpin(bo); +} + +static inline int radeon_bo_map(struct radeon_bo *bo, unsigned int flags) +{ +    return bo->bom->funcs->bo_map(bo, flags); +} + +static inline int radeon_bo_unmap(struct radeon_bo *bo) +{ +    return bo->bom->funcs->bo_unmap(bo); +} + +#endif diff --git a/libdrm/radeon/radeon_bo_gem.c b/libdrm/radeon/radeon_bo_gem.c new file mode 100644 index 00000000..21fe41f9 --- /dev/null +++ b/libdrm/radeon/radeon_bo_gem.c @@ -0,0 +1,186 @@ +/*  + * Copyright © 2008 Dave Airlie + * Copyright © 2008 Jérôme Glisse + * All Rights Reserved. + *  + * 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + */ +/* + * Authors: + *      Dave Airlie + *      Jérôme Glisse <glisse@freedesktop.org> + */ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include "xf86drm.h" +#include "drm.h" +#include "radeon_drm.h" +#include "radeon_bo.h" +#include "radeon_bo_gem.h" + +struct radeon_bo_gem { +    struct radeon_bo    base; +    int                 ref_count; +    int                 map_count; +}; + +static struct radeon_bo *bo_open(struct radeon_bo_manager *bom, +                                 uint32_t handle, +                                 uint32_t size, +                                 uint32_t alignment, +                                 uint32_t flags) +{ +    struct radeon_bo_gem *bo; +    int r; + +    bo = (struct radeon_bo_gem*)calloc(1, sizeof(struct radeon_bo_gem)); +    if (bo == NULL) { +        return NULL; +    } + +    bo->base.bom = bom; +    bo->base.handle = 0; +    bo->base.size = size; +    bo->base.alignment = alignment; +    bo->base.flags = flags; +    bo->base.ptr = NULL; +    bo->ref_count = 0; +    bo->map_count = 0; + +    if (handle) { +        struct drm_gem_open open_arg; + +        memset(&open_arg, 0, sizeof(open_arg)); +        open_arg.name = handle; +        r = ioctl(bom->fd, DRM_IOCTL_GEM_OPEN, &open_arg); +        if (r != 0) { +            fprintf(stderr, "GEM open failed: %d (%s)\n",r,strerror(r)); +            free(bo); +            return NULL; +        } +        bo->base.handle = handle; +    } else { +        struct drm_radeon_gem_create args; + +        args.size = size; +        args.alignment = alignment; +        args.initial_domain = RADEON_GEM_DOMAIN_CPU; +        args.no_backing_store = 0; +        r = drmCommandWriteRead(bom->fd, DRM_RADEON_GEM_CREATE, +                                &args, sizeof(args)); +        bo->base.handle = args.handle; +        if (r) { +            free(bo); +            return NULL; +        } +    } +    return (struct radeon_bo*)bo; +} + +static void bo_close(struct radeon_bo *bo) +{ +    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; +    struct drm_gem_close args; + +    if (bo == NULL) { +        return; +    } +    if (bo_gem->ref_count) { +        /* FIXME: what to do ? */ +    } + +    if (bo_gem->map_count) { +        munmap(bo->ptr, bo->size); +    } + +    /* close object */ +    args.handle = bo->handle; +    ioctl(bo->bom->fd, DRM_IOCTL_GEM_CLOSE, &args); +    free(bo_gem); +} + +static void bo_pin(struct radeon_bo *bo) +{ +    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; + +    bo_gem->ref_count++; +} + +static void bo_unpin(struct radeon_bo *bo) +{ +    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; + +    bo_gem->ref_count--; +} + +static int bo_map(struct radeon_bo *bo, unsigned int flags) +{ +    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; +    struct drm_radeon_gem_mmap args; +    int r; + +    if (bo_gem->map_count++ != 0) { +        return 0; +    } +    args.handle = bo->handle; +    args.offset = 0; +    args.size = bo->size; + +    r = drmCommandWriteRead(bo->bom->fd, +                            DRM_RADEON_GEM_MMAP, +                            &args, +                            sizeof(args)); +    if (!r) { +        bo->ptr = (void *)(unsigned long)args.addr_ptr; +    } +    return r; +} + +static int bo_unmap(struct radeon_bo *bo) +{ +    struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)bo; + +    if (--bo_gem->map_count > 0) { +        return 0; +    } + +    munmap(bo->ptr, bo->size); +    bo->ptr = NULL; +    return 0; +} + +static struct radeon_bo_funcs bo_gem_funcs = { +    bo_open, +    bo_close, +    bo_pin, +    bo_unpin, +    bo_map, +    bo_unmap +}; + +struct radeon_bo_funcs *radeon_bo_gem_initialize(int fd) +{ +    return &bo_gem_funcs;  +} diff --git a/libdrm/radeon/radeon_bo_gem.h b/libdrm/radeon/radeon_bo_gem.h new file mode 100644 index 00000000..e0ed61fb --- /dev/null +++ b/libdrm/radeon/radeon_bo_gem.h @@ -0,0 +1,38 @@ +/*  + * Copyright © 2008 Dave Airlie + * Copyright © 2008 Jérôme Glisse + * All Rights Reserved. + *  + * 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + */ +/* + * Authors: + *      Dave Airlie + *      Jérôme Glisse <glisse@freedesktop.org> + */ +#ifndef RADEON_BO_GEM_H +#define RADEON_BO_GEM_H + +#include "radeon_bo.h" + +struct radeon_bo_funcs *radeon_bo_gem_initialize(int fd); + +#endif diff --git a/libdrm/radeon/radeon_cs.h b/libdrm/radeon/radeon_cs.h new file mode 100644 index 00000000..71b2839f --- /dev/null +++ b/libdrm/radeon/radeon_cs.h @@ -0,0 +1,144 @@ +/*  + * Copyright © 2008 Nicolai Haehnle + * Copyright © 2008 Jérôme Glisse + * All Rights Reserved. + *  + * 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + */ +/* + * Authors: + *      Aapo Tahkola <aet@rasterburn.org> + *      Nicolai Haehnle <prefect_@gmx.net> + *      Jérôme Glisse <glisse@freedesktop.org> + */ +#ifndef RADEON_CS_H +#define RADEON_CS_H + +#include <stdint.h> +#include "radeon_bo.h" + +struct radeon_cs_reloc { +    struct radeon_bo    *bo; +    uint32_t            soffset; +    uint32_t            eoffset; +    uint32_t            size; +    uint32_t            domains; +}; + +struct radeon_cs_manager; + +struct radeon_cs { +    struct radeon_cs_manager    *csm; +    struct radeon_cs_reloc      *relocs; +    uint32_t                    *packets; +    unsigned                    crelocs; +    unsigned                    cdw; +    unsigned                    ndw; +    int                         section; +    unsigned                    section_ndw; +    unsigned                    section_cdw; +    const char                  *section_file; +    const char                  *section_func; +    int                         section_line; +}; + +/* cs functions */ +struct radeon_cs_funcs { +    struct radeon_cs *(*cs_create)(struct radeon_cs_manager *csm, +                                   uint32_t ndw); +    int (*cs_write_dword)(struct radeon_cs *cs, uint32_t dword); +    int (*cs_write_reloc)(struct radeon_cs *cs, +                          struct radeon_bo *bo, +                          uint32_t soffset, +                          uint32_t eoffset, +                          uint32_t domains); +    int (*cs_begin)(struct radeon_cs *cs, +                    uint32_t ndw, +                    const char *file, +                    const char *func, +                    int line); +    int (*cs_end)(struct radeon_cs *cs, +                  const char *file, +                  const char *func, +                  int line); +    int (*cs_emit)(struct radeon_cs *cs); +    int (*cs_destroy)(struct radeon_cs *cs); +    int (*cs_erase)(struct radeon_cs *cs); +}; + +struct radeon_cs_manager { +    struct radeon_cs_funcs  *funcs; +    int                     fd; +}; + +static inline struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm, +                                                 uint32_t ndw) +{ +    return csm->funcs->cs_create(csm, ndw); +} + +static inline int radeon_cs_write_dword(struct radeon_cs *cs, uint32_t dword) +{ +    return cs->csm->funcs->cs_write_dword(cs, dword); +} + +static inline int radeon_cs_write_reloc(struct radeon_cs *cs, +                                        struct radeon_bo *bo, +                                        uint32_t soffset, +                                        uint32_t eoffset, +                                        uint32_t domains) +{ +    return cs->csm->funcs->cs_write_reloc(cs, bo, soffset, eoffset, domains); +} + +static inline int radeon_cs_begin(struct radeon_cs *cs, +                                  uint32_t ndw, +                                  const char *file, +                                  const char *func, +                                  int line) +{ +    return cs->csm->funcs->cs_begin(cs, ndw, file, func, line); +} + +static inline int radeon_cs_end(struct radeon_cs *cs, +                                const char *file, +                                const char *func, +                                int line) +{ +    return cs->csm->funcs->cs_end(cs, file, func, line); +} + +static inline int radeon_cs_emit(struct radeon_cs *cs) +{ +    return cs->csm->funcs->cs_emit(cs); +} + +static inline int radeon_cs_destroy(struct radeon_cs *cs) +{ +    return cs->csm->funcs->cs_destroy(cs); +} + +static inline int radeon_cs_erase(struct radeon_cs *cs) +{ +    return cs->csm->funcs->cs_erase(cs); +} + +#endif | 
