if (IS_CACHABLE_BUFFER(flags))
mem_flags = ION_FLAG_CACHED;
- buf->ion_handle = ion_alloc(private->sprd_drm_ion_client, buf->size,
- SZ_4K, heap_id_mask, mem_flags);
+ buf->ion_handle = ion_alloc_with_gem(private->sprd_drm_ion_client,
+ buf->size, SZ_4K, heap_id_mask, mem_flags, buf->obj);
if (IS_ERR((void *)buf->ion_handle)) {
DRM_ERROR("%s Could not allocate\n", __func__);
/* set memory type and cache attribute from user side. */
sprd_gem_obj->flags = args->flags;
+ buf->obj = &sprd_gem_obj->base;
+
ret = sprd_drm_alloc_buf(dev, buf, args->flags);
if (ret < 0)
goto err_gem_fini;
bool pfnmap;
unsigned int bufcount;
dma_addr_t idx_addr[SPRD_DRM_GEM_MAX_INDEX_ADDR];
+
+ struct drm_gem_object *obj;
};
struct drm_sprd_gem_object_wait_list_entry {
#include <linux/dma-buf.h>
#include <linux/idr.h>
#include <linux/time.h>
+#ifdef CONFIG_DRM_SPRD
+#include <drm/drmP.h>
+#endif
#include "ion.h"
#include "ion_priv.h"
}
EXPORT_SYMBOL(ion_alloc);
+#ifdef CONFIG_DRM_SPRD
+struct ion_handle *ion_alloc_with_gem(struct ion_client *client, size_t len,
+ size_t align, unsigned int heap_id_mask,
+ unsigned int flags,
+ struct drm_gem_object *obj)
+{
+ struct ion_handle *handle;
+
+ handle = ion_alloc(client, len, align, heap_id_mask, flags);
+ if (!IS_ERR(handle))
+ handle->buffer->obj = obj;
+
+ return handle;
+}
+EXPORT_SYMBOL(ion_alloc_with_gem);
+#endif
+
void ion_free(struct ion_client *client, struct ion_handle *handle)
{
bool valid_handle;
{
struct ion_buffer *buffer = dmabuf->priv;
ion_buffer_put(buffer);
+
+#ifdef CONFIG_DRM_SPRD
+ if (buffer->obj)
+ drm_gem_object_unreference_unlocked(buffer->obj);
+#endif
}
static void *ion_dma_buf_kmap(struct dma_buf *dmabuf, unsigned long offset)
size_t align, unsigned int heap_id_mask,
unsigned int flags);
+#ifdef CONFIG_DRM_SPRD
+struct ion_handle *ion_alloc_with_gem(struct ion_client *client, size_t len,
+ size_t align, unsigned int heap_id_mask,
+ unsigned int flags,
+ struct drm_gem_object *obj);
+#endif
/**
* ion_free - free a handle
* @client: the client
int ion_handle_get_size(struct ion_client *client, struct ion_handle *handle,
unsigned long *size, unsigned int *heap_id);
-
#endif /* _LINUX_ION_H */
pid_t pid;
pid_t tid;
struct timeval alloc_time;
+#ifdef CONFIG_DRM_SPRD
+ struct drm_gem_object *obj;
+#endif
};
void ion_buffer_destroy(struct ion_buffer *buffer);