Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b9556e0f authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'exynos-drm-fixes' of...

Merge branch 'exynos-drm-fixes' of git://git.infradead.org/users/kmpark/linux-2.6-samsung into drm-fixes

From Inki Dae:

this patch set fixes gem allocation and mapping issue between user space and
physical memory region.

* 'exynos-drm-fixes' of git://git.infradead.org/users/kmpark/linux-2.6-samsung:
  drm/exynos: added missed vm area region mapping type.
  drm/exynos: fixed exynos_drm_gem_map_pages bug.
  drm/exynos: fixed duplicatd memory allocation bug.
parents af3a3ab2 818c4ea7
Loading
Loading
Loading
Loading
+5 −25
Original line number Diff line number Diff line
@@ -149,21 +149,11 @@ static int exynos_drm_gem_map_pages(struct drm_gem_object *obj,
	unsigned long pfn;

	if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) {
		unsigned long usize = buf->size;

		if (!buf->pages)
			return -EINTR;

		while (usize > 0) {
		pfn = page_to_pfn(buf->pages[page_offset++]);
			vm_insert_mixed(vma, f_vaddr, pfn);
			f_vaddr += PAGE_SIZE;
			usize -= PAGE_SIZE;
		}

		return 0;
	}

	} else
		pfn = (buf->dma_addr >> PAGE_SHIFT) + page_offset;

	return vm_insert_mixed(vma, f_vaddr, pfn);
@@ -524,6 +514,8 @@ static int exynos_drm_gem_mmap_buffer(struct file *filp,
		if (!buffer->pages)
			return -EINVAL;

		vma->vm_flags |= VM_MIXEDMAP;

		do {
			ret = vm_insert_page(vma, uaddr, buffer->pages[i++]);
			if (ret) {
@@ -710,7 +702,6 @@ int exynos_drm_gem_dumb_destroy(struct drm_file *file_priv,
int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
	struct drm_gem_object *obj = vma->vm_private_data;
	struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
	struct drm_device *dev = obj->dev;
	unsigned long f_vaddr;
	pgoff_t page_offset;
@@ -722,21 +713,10 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)

	mutex_lock(&dev->struct_mutex);

	/*
	 * allocate all pages as desired size if user wants to allocate
	 * physically non-continuous memory.
	 */
	if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) {
		ret = exynos_drm_gem_get_pages(obj);
		if (ret < 0)
			goto err;
	}

	ret = exynos_drm_gem_map_pages(obj, vma, f_vaddr, page_offset);
	if (ret < 0)
		DRM_ERROR("failed to map pages.\n");

err:
	mutex_unlock(&dev->struct_mutex);

	return convert_to_vm_err_msg(ret);