Module Name: src Committed By: jmcneill Date: Tue Dec 26 14:54:52 UTC 2017
Modified Files: src/sys/arch/arm/nvidia: files.tegra tegra_drm.c tegra_drm.h tegra_drm_fb.c tegra_drm_mode.c tegra_fb.c Removed Files: src/sys/arch/arm/nvidia: tegra_drm_gem.c Log Message: Use DRM GEM/CMA helper. To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/arch/arm/nvidia/files.tegra cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/nvidia/tegra_drm.c \ src/sys/arch/arm/nvidia/tegra_drm.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/nvidia/tegra_drm_fb.c cvs rdiff -u -r1.3 -r0 src/sys/arch/arm/nvidia/tegra_drm_gem.c cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/nvidia/tegra_drm_mode.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_fb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/nvidia/files.tegra diff -u src/sys/arch/arm/nvidia/files.tegra:1.45 src/sys/arch/arm/nvidia/files.tegra:1.46 --- src/sys/arch/arm/nvidia/files.tegra:1.45 Tue Sep 26 16:12:45 2017 +++ src/sys/arch/arm/nvidia/files.tegra Tue Dec 26 14:54:52 2017 @@ -1,4 +1,4 @@ -# $NetBSD: files.tegra,v 1.45 2017/09/26 16:12:45 jmcneill Exp $ +# $NetBSD: files.tegra,v 1.46 2017/12/26 14:54:52 jmcneill Exp $ # # Configuration info for NVIDIA Tegra ARM Peripherals # @@ -157,7 +157,6 @@ attach tegradrm at fdt with tegra_drm file arch/arm/nvidia/tegra_drm.c tegra_drm file arch/arm/nvidia/tegra_drm_mode.c tegra_drm file arch/arm/nvidia/tegra_drm_fb.c tegra_drm -file arch/arm/nvidia/tegra_drm_gem.c tegra_drm # Framebuffer console device tegrafb: tegrafbbus, drmfb, wsemuldisplaydev Index: src/sys/arch/arm/nvidia/tegra_drm.c diff -u src/sys/arch/arm/nvidia/tegra_drm.c:1.7 src/sys/arch/arm/nvidia/tegra_drm.c:1.8 --- src/sys/arch/arm/nvidia/tegra_drm.c:1.7 Sun Apr 16 12:28:21 2017 +++ src/sys/arch/arm/nvidia/tegra_drm.c Tue Dec 26 14:54:52 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_drm.c,v 1.7 2017/04/16 12:28:21 jmcneill Exp $ */ +/* $NetBSD: tegra_drm.c,v 1.8 2017/12/26 14:54:52 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_drm.c,v 1.7 2017/04/16 12:28:21 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_drm.c,v 1.8 2017/12/26 14:54:52 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -57,29 +57,18 @@ static int tegra_drm_set_busid(struct dr static int tegra_drm_load(struct drm_device *, unsigned long); static int tegra_drm_unload(struct drm_device *); -static int tegra_drm_dumb_create(struct drm_file *, struct drm_device *, - struct drm_mode_create_dumb *); -static int tegra_drm_dumb_map_offset(struct drm_file *, - struct drm_device *, uint32_t, uint64_t *); - -static const struct uvm_pagerops tegra_drm_gem_uvm_ops = { - .pgo_reference = drm_gem_pager_reference, - .pgo_detach = drm_gem_pager_detach, - .pgo_fault = tegra_drm_gem_fault, -}; - static struct drm_driver tegra_drm_driver = { .driver_features = DRIVER_MODESET | DRIVER_GEM, .dev_priv_size = 0, .load = tegra_drm_load, .unload = tegra_drm_unload, - .gem_free_object = tegra_drm_gem_free_object, + .gem_free_object = drm_gem_cma_free_object, .mmap_object = drm_gem_or_legacy_mmap_object, - .gem_uvm_ops = &tegra_drm_gem_uvm_ops, + .gem_uvm_ops = &drm_gem_cma_uvm_ops, - .dumb_create = tegra_drm_dumb_create, - .dumb_map_offset = tegra_drm_dumb_map_offset, + .dumb_create = drm_gem_cma_dumb_create, + .dumb_map_offset = drm_gem_cma_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, .get_vblank_counter = tegra_drm_get_vblank_counter, @@ -283,62 +272,3 @@ tegra_drm_unload(struct drm_device *ddev return 0; } - -static int -tegra_drm_dumb_create(struct drm_file *file_priv, struct drm_device *ddev, - struct drm_mode_create_dumb *args) -{ - struct tegra_gem_object *obj; - uint32_t handle; - int error; - - args->pitch = args->width * ((args->bpp + 7) / 8); - args->size = args->pitch * args->height; - args->size = roundup(args->size, PAGE_SIZE); - args->handle = 0; - - obj = tegra_drm_obj_alloc(ddev, args->size); - if (obj == NULL) - return -ENOMEM; - - error = drm_gem_handle_create(file_priv, &obj->base, &handle); - drm_gem_object_unreference_unlocked(&obj->base); - if (error) { - tegra_drm_obj_free(obj); - return error; - } - - args->handle = handle; - - return 0; -} - -static int -tegra_drm_dumb_map_offset(struct drm_file *file_priv, - struct drm_device *ddev, uint32_t handle, uint64_t *offset) -{ - struct drm_gem_object *gem_obj; - struct tegra_gem_object *obj; - int error; - - gem_obj = drm_gem_object_lookup(ddev, file_priv, handle); - if (gem_obj == NULL) - return -ENOENT; - - obj = to_tegra_gem_obj(gem_obj); - - if (drm_vma_node_has_offset(&obj->base.vma_node) == 0) { - error = drm_gem_create_mmap_offset(&obj->base); - if (error) - goto done; - } else { - error = 0; - } - - *offset = drm_vma_node_offset_addr(&obj->base.vma_node); - -done: - drm_gem_object_unreference_unlocked(&obj->base); - - return error; -} Index: src/sys/arch/arm/nvidia/tegra_drm.h diff -u src/sys/arch/arm/nvidia/tegra_drm.h:1.7 src/sys/arch/arm/nvidia/tegra_drm.h:1.8 --- src/sys/arch/arm/nvidia/tegra_drm.h:1.7 Sat Dec 17 12:11:38 2016 +++ src/sys/arch/arm/nvidia/tegra_drm.h Tue Dec 26 14:54:52 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_drm.h,v 1.7 2016/12/17 12:11:38 maya Exp $ */ +/* $NetBSD: tegra_drm.h,v 1.8 2017/12/26 14:54:52 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -30,6 +30,7 @@ #define _ARM_TEGRA_DRM_H #include <drm/drm_fb_helper.h> +#include <drm/drm_gem_cma_helper.h> #define DRIVER_AUTHOR "Jared McNeill" @@ -43,8 +44,6 @@ struct tegra_framebuffer; -struct tegra_gem_object; - struct tegra_drm_softc { device_t sc_dev; struct drm_device *sc_ddev; @@ -93,7 +92,7 @@ struct tegra_crtc { bool enabled; struct clk *clk_parent; - struct tegra_gem_object *cursor_obj; + struct drm_gem_cma_object *cursor_obj; int cursor_x; int cursor_y; }; @@ -115,18 +114,9 @@ struct tegra_connector { bool has_audio; }; -struct tegra_gem_object { - struct drm_gem_object base; - bus_dma_tag_t dmat; - bus_dma_segment_t dmasegs[1]; - bus_size_t dmasize; - bus_dmamap_t dmamap; - void *dmap; -}; - struct tegra_framebuffer { struct drm_framebuffer base; - struct tegra_gem_object *obj; + struct drm_gem_cma_object *obj; }; struct tegra_fbdev { @@ -155,7 +145,6 @@ struct tegra_fbdev { #define to_tegra_connector(x) container_of(x, struct tegra_connector, base) #define to_tegra_framebuffer(x) container_of(x, struct tegra_framebuffer, base) #define to_tegra_fbdev(x) container_of(x, struct tegra_fbdev, helper) -#define to_tegra_gem_obj(x) container_of(x, struct tegra_gem_object, base) int tegra_drm_mode_init(struct drm_device *); int tegra_drm_fb_init(struct drm_device *); @@ -165,11 +154,4 @@ void tegra_drm_disable_vblank(struct drm int tegra_drm_framebuffer_init(struct drm_device *, struct tegra_framebuffer *); -struct tegra_gem_object *tegra_drm_obj_alloc(struct drm_device *, size_t); -void tegra_drm_obj_free(struct tegra_gem_object *); - -int tegra_drm_gem_fault(struct uvm_faultinfo *, vaddr_t, struct vm_page **, - int, int, vm_prot_t, int); -void tegra_drm_gem_free_object(struct drm_gem_object *); - #endif /* _ARM_TEGRA_DRM_H */ Index: src/sys/arch/arm/nvidia/tegra_drm_fb.c diff -u src/sys/arch/arm/nvidia/tegra_drm_fb.c:1.5 src/sys/arch/arm/nvidia/tegra_drm_fb.c:1.6 --- src/sys/arch/arm/nvidia/tegra_drm_fb.c:1.5 Thu Jun 1 02:45:05 2017 +++ src/sys/arch/arm/nvidia/tegra_drm_fb.c Tue Dec 26 14:54:52 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_drm_fb.c,v 1.5 2017/06/01 02:45:05 chs Exp $ */ +/* $NetBSD: tegra_drm_fb.c,v 1.6 2017/12/26 14:54:52 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_drm_fb.c,v 1.5 2017/06/01 02:45:05 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_drm_fb.c,v 1.6 2017/12/26 14:54:52 jmcneill Exp $"); #include <drm/drmP.h> #include <drm/drm_crtc.h> @@ -125,7 +125,7 @@ tegra_fb_init(struct drm_device *ddev, s const size_t size = roundup(height * pitch, PAGE_SIZE); - tegra_fb->obj = tegra_drm_obj_alloc(ddev, size); + tegra_fb->obj = drm_gem_cma_create(ddev, size); if (tegra_fb->obj == NULL) return -ENOMEM; Index: src/sys/arch/arm/nvidia/tegra_drm_mode.c diff -u src/sys/arch/arm/nvidia/tegra_drm_mode.c:1.15 src/sys/arch/arm/nvidia/tegra_drm_mode.c:1.16 --- src/sys/arch/arm/nvidia/tegra_drm_mode.c:1.15 Thu Jun 1 02:45:05 2017 +++ src/sys/arch/arm/nvidia/tegra_drm_mode.c Tue Dec 26 14:54:52 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_drm_mode.c,v 1.15 2017/06/01 02:45:05 chs Exp $ */ +/* $NetBSD: tegra_drm_mode.c,v 1.16 2017/12/26 14:54:52 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_drm_mode.c,v 1.15 2017/06/01 02:45:05 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_drm_mode.c,v 1.16 2017/12/26 14:54:52 jmcneill Exp $"); #include <drm/drmP.h> #include <drm/drm_crtc.h> @@ -233,7 +233,7 @@ tegra_fb_create(struct drm_device *ddev, return NULL; fb = kmem_zalloc(sizeof(*fb), KM_SLEEP); - fb->obj = to_tegra_gem_obj(gem_obj); + fb->obj = to_drm_gem_cma_obj(gem_obj); fb->base.pitches[0] = cmd->pitches[0]; fb->base.offsets[0] = cmd->offsets[0]; fb->base.width = cmd->width; @@ -323,7 +323,7 @@ tegra_crtc_init(struct drm_device *ddev, DRM_ERROR("failed to establish interrupt for crtc %d\n", index); } const size_t cursor_size = 256 * 256 * 4; - crtc->cursor_obj = tegra_drm_obj_alloc(ddev, cursor_size); + crtc->cursor_obj = drm_gem_cma_create(ddev, cursor_size); if (crtc->cursor_obj == NULL) { kmem_free(crtc, sizeof(*crtc)); return -ENOMEM; @@ -372,7 +372,7 @@ tegra_crtc_cursor_set(struct drm_crtc *c { struct tegra_crtc *tegra_crtc = to_tegra_crtc(crtc); struct drm_gem_object *gem_obj = NULL; - struct tegra_gem_object *obj; + struct drm_gem_cma_object *obj; uint32_t cfg, opt; int error; @@ -410,7 +410,7 @@ tegra_crtc_cursor_set(struct drm_crtc *c error = -ENOENT; goto done; } - obj = to_tegra_gem_obj(gem_obj); + obj = to_drm_gem_cma_obj(gem_obj); if (obj->base.size < width * height * 4) { DRM_ERROR("Cursor buffer is too small\n"); @@ -440,8 +440,8 @@ tegra_crtc_cursor_set(struct drm_crtc *c } /* copy cursor (argb -> rgba) */ - struct tegra_gem_object *cursor_obj = tegra_crtc->cursor_obj; - uint32_t off, *cp = obj->dmap, *crtc_cp = cursor_obj->dmap; + struct drm_gem_cma_object *cursor_obj = tegra_crtc->cursor_obj; + uint32_t off, *cp = obj->vaddr, *crtc_cp = cursor_obj->vaddr; for (off = 0; off < width * height; off++) { crtc_cp[off] = (cp[off] << 8) | (cp[off] >> 24); } @@ -538,7 +538,7 @@ tegra_crtc_destroy(struct drm_crtc *crtc if (tegra_crtc->ih) { intr_disestablish(tegra_crtc->ih); } - tegra_drm_obj_free(tegra_crtc->cursor_obj); + drm_gem_cma_free_object(&tegra_crtc->cursor_obj->base); bus_space_unmap(tegra_crtc->bst, tegra_crtc->bsh, tegra_crtc->size); kmem_free(tegra_crtc, sizeof(*tegra_crtc)); } Index: src/sys/arch/arm/nvidia/tegra_fb.c diff -u src/sys/arch/arm/nvidia/tegra_fb.c:1.3 src/sys/arch/arm/nvidia/tegra_fb.c:1.4 --- src/sys/arch/arm/nvidia/tegra_fb.c:1.3 Sat Dec 17 12:11:38 2016 +++ src/sys/arch/arm/nvidia/tegra_fb.c Tue Dec 26 14:54:52 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_fb.c,v 1.3 2016/12/17 12:11:38 maya Exp $ */ +/* $NetBSD: tegra_fb.c,v 1.4 2017/12/26 14:54:52 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_fb.c,v 1.3 2016/12/17 12:11:38 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_fb.c,v 1.4 2017/12/26 14:54:52 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -92,7 +92,7 @@ tegra_fb_attach(device_t parent, device_ .da_dev = self, .da_fb_helper = tfa->tfa_fb_helper, .da_fb_sizes = &tfa->tfa_fb_sizes, - .da_fb_vaddr = sc->sc_fb->obj->dmap, + .da_fb_vaddr = sc->sc_fb->obj->vaddr, .da_fb_linebytes = tfa->tfa_fb_linebytes, .da_params = &tegrafb_drmfb_params, }; @@ -118,7 +118,7 @@ static paddr_t tegra_fb_mmapfb(struct drmfb_softc *sc, off_t off, int prot) { struct tegra_fb_softc * const tfb_sc = (struct tegra_fb_softc *)sc; - struct tegra_gem_object *obj = tfb_sc->sc_fb->obj; + struct drm_gem_cma_object *obj = tfb_sc->sc_fb->obj; KASSERT(off >= 0); KASSERT(off < obj->dmasize);