summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2017-07-19 22:05:58 +0000
committerkettenis <kettenis@openbsd.org>2017-07-19 22:05:58 +0000
commitd5fe3e9411dd901b1cc6a8e27ef180872b3cea88 (patch)
treee044e3b612066fd6f06c8e22babeda91c2cb73e9
parentPlug an information leak in ieee80211_node2req(). (diff)
downloadwireguard-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.h14
-rw-r--r--sys/dev/pci/drm/drm_drv.c30
-rw-r--r--sys/dev/pci/drm/i915/i915_drv.h4
-rw-r--r--sys/dev/pci/drm/i915/i915_gem.c25
-rw-r--r--sys/dev/pci/drm/i915/intel_display.c2
-rw-r--r--sys/dev/pci/drm/i915/intel_overlay.c4
-rw-r--r--sys/dev/pci/drm/i915/intel_ringbuffer.c15
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;