diff options
author | 2017-07-19 22:05:58 +0000 | |
---|---|---|
committer | 2017-07-19 22:05:58 +0000 | |
commit | d5fe3e9411dd901b1cc6a8e27ef180872b3cea88 (patch) | |
tree | e044e3b612066fd6f06c8e22babeda91c2cb73e9 | |
parent | Plug an information leak in ieee80211_node2req(). (diff) | |
download | wireguard-openbsd-d5fe3e9411dd901b1cc6a8e27ef180872b3cea88.tar.xz wireguard-openbsd-d5fe3e9411dd901b1cc6a8e27ef180872b3cea88.zip |
Implement drm_pci_alloc() and drm_pci_free() and use them to reduce the
diffs with Linux.
-rw-r--r-- | sys/dev/pci/drm/drmP.h | 14 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_drv.c | 30 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915/i915_drv.h | 4 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915/i915_gem.c | 25 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915/intel_display.c | 2 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915/intel_overlay.c | 4 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915/intel_ringbuffer.c | 15 |
7 files changed, 53 insertions, 41 deletions
diff --git a/sys/dev/pci/drm/drmP.h b/sys/dev/pci/drm/drmP.h index 2eebfe58e0a..9cb8b7e0fcd 100644 --- a/sys/dev/pci/drm/drmP.h +++ b/sys/dev/pci/drm/drmP.h @@ -1,4 +1,4 @@ -/* $OpenBSD: drmP.h,v 1.213 2017/07/05 20:30:13 kettenis Exp $ */ +/* $OpenBSD: drmP.h,v 1.214 2017/07/19 22:05:58 kettenis Exp $ */ /* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*- * Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com */ @@ -337,7 +337,13 @@ struct drm_dmamem { int nsegs; bus_dma_segment_t segs[1]; }; -typedef struct drm_dmamem drm_dma_handle_t; + +typedef struct drm_dma_handle { + struct drm_dmamem *mem; + dma_addr_t busaddr; + void *vaddr; + size_t size; +} drm_dma_handle_t; struct drm_pending_event { struct drm_event *event; @@ -871,6 +877,10 @@ struct drm_dmamem *drm_dmamem_alloc(bus_dma_tag_t, bus_size_t, bus_size_t, int, bus_size_t, int, int); void drm_dmamem_free(bus_dma_tag_t, struct drm_dmamem *); +extern struct drm_dma_handle *drm_pci_alloc(struct drm_device *dev, size_t size, + size_t align); +extern void drm_pci_free(struct drm_device *dev, struct drm_dma_handle * dmah); + const struct drm_pcidev *drm_find_description(int , int , const struct drm_pcidev *); int drm_order(unsigned long); diff --git a/sys/dev/pci/drm/drm_drv.c b/sys/dev/pci/drm/drm_drv.c index ec99d60cd1d..523ccfe486b 100644 --- a/sys/dev/pci/drm/drm_drv.c +++ b/sys/dev/pci/drm/drm_drv.c @@ -1,4 +1,4 @@ -/* $OpenBSD: drm_drv.c,v 1.153 2017/07/04 22:27:23 kettenis Exp $ */ +/* $OpenBSD: drm_drv.c,v 1.154 2017/07/19 22:05:58 kettenis Exp $ */ /*- * Copyright 2007-2009 Owain G. Ainsworth <oga@openbsd.org> * Copyright © 2008 Intel Corporation @@ -1238,6 +1238,34 @@ drm_dmamem_free(bus_dma_tag_t dmat, struct drm_dmamem *mem) free(mem, M_DRM, 0); } +struct drm_dma_handle * +drm_pci_alloc(struct drm_device *dev, size_t size, size_t align) +{ + struct drm_dma_handle *dmah; + + dmah = malloc(sizeof(*dmah), M_DRM, M_WAITOK); + dmah->mem = drm_dmamem_alloc(dev->dmat, size, align, 1, size, + BUS_DMA_NOCACHE, 0); + if (dmah->mem == NULL) { + free(dmah, M_DRM, sizeof(*dmah)); + return NULL; + } + dmah->busaddr = dmah->mem->segs[0].ds_addr; + dmah->size = dmah->mem->size; + dmah->vaddr = dmah->mem->kva; + return (dmah); +} + +void +drm_pci_free(struct drm_device *dev, struct drm_dma_handle *dmah) +{ + if (dmah == NULL) + return; + + drm_dmamem_free(dev->dmat, dmah->mem); + free(dmah, M_DRM, sizeof(*dmah)); +} + /** * Called by the client, this returns a unique magic number to be authorized * by the master. diff --git a/sys/dev/pci/drm/i915/i915_drv.h b/sys/dev/pci/drm/i915/i915_drv.h index 4b8168028bb..51479660f55 100644 --- a/sys/dev/pci/drm/i915/i915_drv.h +++ b/sys/dev/pci/drm/i915/i915_drv.h @@ -1,4 +1,4 @@ -/* $OpenBSD: i915_drv.h,v 1.76 2017/07/05 20:30:13 kettenis Exp $ */ +/* $OpenBSD: i915_drv.h,v 1.77 2017/07/19 22:05:58 kettenis Exp $ */ /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- */ /* @@ -1849,7 +1849,7 @@ struct inteldrm_softc { struct drm_i915_gem_object *semaphore_obj; uint32_t last_seqno, next_seqno; - struct drm_dmamem *status_page_dmah; + struct drm_dma_handle *status_page_dmah; struct resource mch_res; union flush { struct { diff --git a/sys/dev/pci/drm/i915/i915_gem.c b/sys/dev/pci/drm/i915/i915_gem.c index a47572dc540..910ae8f6c59 100644 --- a/sys/dev/pci/drm/i915/i915_gem.c +++ b/sys/dev/pci/drm/i915/i915_gem.c @@ -159,10 +159,8 @@ i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) { #ifdef __linux__ struct address_space *mapping = file_inode(obj->base.filp)->i_mapping; - char *vaddr = obj->phys_handle->vaddr; -#else - char *vaddr = obj->phys_handle->kva; #endif + char *vaddr = obj->phys_handle->vaddr; struct sg_table *st; struct scatterlist *sg; int i; @@ -214,11 +212,7 @@ i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) sg->offset = 0; sg->length = obj->base.size; -#ifdef __linux__ sg_dma_address(sg) = obj->phys_handle->busaddr; -#else - sg_dma_address(sg) = obj->phys_handle->segs[0].ds_addr; -#endif sg_dma_len(sg) = obj->base.size; obj->pages = st; @@ -247,10 +241,8 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj) if (obj->dirty) { #ifdef __linux__ struct address_space *mapping = file_inode(obj->base.filp)->i_mapping; - char *vaddr = obj->phys_handle->vaddr; -#else - char *vaddr = obj->phys_handle->kva; #endif + char *vaddr = obj->phys_handle->vaddr; int i; for (i = 0; i < obj->base.size / PAGE_SIZE; i++) { @@ -294,11 +286,7 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj) static void i915_gem_object_release_phys(struct drm_i915_gem_object *obj) { -#ifdef __linux__ drm_pci_free(obj->base.dev, obj->phys_handle); -#else - drm_dmamem_free(obj->base.dev->dmat, obj->phys_handle); -#endif } static const struct drm_i915_gem_object_ops i915_gem_phys_ops = { @@ -332,7 +320,7 @@ i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int ret; if (obj->phys_handle) { - if ((unsigned long)obj->phys_handle->kva & (align -1)) + if ((unsigned long)obj->phys_handle->vaddr & (align -1)) return -EBUSY; return 0; @@ -349,12 +337,7 @@ i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, return ret; /* create a new object */ -#ifdef __linux__ phys = drm_pci_alloc(obj->base.dev, obj->base.size, align); -#else - phys = drm_dmamem_alloc(obj->base.dev->dmat, obj->base.size, align, - 1, obj->base.size, BUS_DMA_NOCACHE, 0); -#endif if (!phys) return -ENOMEM; @@ -370,7 +353,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, struct drm_file *file_priv) { struct drm_device *dev = obj->base.dev; - void *vaddr = obj->phys_handle->kva + args->offset; + void *vaddr = obj->phys_handle->vaddr + args->offset; char __user *user_data = to_user_ptr(args->data_ptr); int ret = 0; diff --git a/sys/dev/pci/drm/i915/intel_display.c b/sys/dev/pci/drm/i915/intel_display.c index eaeb9559234..5e3a6f92dbf 100644 --- a/sys/dev/pci/drm/i915/intel_display.c +++ b/sys/dev/pci/drm/i915/intel_display.c @@ -13850,7 +13850,7 @@ intel_commit_cursor_plane(struct drm_plane *plane, else if (!INTEL_INFO(dev)->cursor_needs_physical) addr = i915_gem_obj_ggtt_offset(obj); else - addr = obj->phys_handle->segs[0].ds_addr; + addr = obj->phys_handle->busaddr; intel_crtc->cursor_addr = addr; diff --git a/sys/dev/pci/drm/i915/intel_overlay.c b/sys/dev/pci/drm/i915/intel_overlay.c index bbc9a04c878..1bb8a440e21 100644 --- a/sys/dev/pci/drm/i915/intel_overlay.c +++ b/sys/dev/pci/drm/i915/intel_overlay.c @@ -196,7 +196,7 @@ intel_overlay_map_regs(struct intel_overlay *overlay) struct overlay_registers __iomem *regs; if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) - regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_handle->kva; + regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_handle->vaddr; else { if (overlay->reg_refcount++ == 0 && agp_map_subregion(dev_priv->agph, @@ -1415,7 +1415,7 @@ void intel_setup_overlay(struct drm_device *dev) DRM_ERROR("failed to attach phys overlay regs\n"); goto out_free_bo; } - overlay->flip_addr = reg_bo->phys_handle->segs[0].ds_addr; + overlay->flip_addr = reg_bo->phys_handle->busaddr; } else { ret = i915_gem_obj_ggtt_pin(reg_bo, PAGE_SIZE, PIN_MAPPABLE); if (ret) { diff --git a/sys/dev/pci/drm/i915/intel_ringbuffer.c b/sys/dev/pci/drm/i915/intel_ringbuffer.c index 11ef9ce0abb..07d03469d5d 100644 --- a/sys/dev/pci/drm/i915/intel_ringbuffer.c +++ b/sys/dev/pci/drm/i915/intel_ringbuffer.c @@ -473,9 +473,9 @@ static void ring_setup_phys_status_page(struct intel_engine_cs *ring) struct drm_i915_private *dev_priv = ring->dev->dev_private; u32 addr; - addr = dev_priv->status_page_dmah->map->dm_segs[0].ds_addr; + addr = dev_priv->status_page_dmah->busaddr; if (INTEL_INFO(ring->dev)->gen >= 4) - addr |= (dev_priv->status_page_dmah->map->dm_segs[0].ds_addr >> 28) & 0xf0; + addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0; I915_WRITE(HWS_PGA, addr); } @@ -1929,11 +1929,7 @@ static void cleanup_phys_status_page(struct intel_engine_cs *ring) if (!dev_priv->status_page_dmah) return; -#ifdef __linux__ drm_pci_free(ring->dev, dev_priv->status_page_dmah); -#else - drm_dmamem_free(dev_priv->dmat, dev_priv->status_page_dmah); -#endif ring->status_page.page_addr = NULL; } @@ -2007,18 +2003,13 @@ static int init_phys_status_page(struct intel_engine_cs *ring) struct drm_i915_private *dev_priv = ring->dev->dev_private; if (!dev_priv->status_page_dmah) { -#ifdef __linux__ dev_priv->status_page_dmah = drm_pci_alloc(ring->dev, PAGE_SIZE, PAGE_SIZE); -#else - dev_priv->status_page_dmah = drm_dmamem_alloc(dev_priv->dmat, - PAGE_SIZE, PAGE_SIZE, 1, PAGE_SIZE, 0, BUS_DMA_READ); -#endif if (!dev_priv->status_page_dmah) return -ENOMEM; } - ring->status_page.page_addr = (u32 *)dev_priv->status_page_dmah->kva; + ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr; memset(ring->status_page.page_addr, 0, PAGE_SIZE); return 0; |