|
@@ -470,14 +470,16 @@ fail:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-void *msm_gem_get_vaddr(struct drm_gem_object *obj)
|
|
|
+static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
|
|
|
{
|
|
|
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
|
|
int ret = 0;
|
|
|
|
|
|
mutex_lock(&msm_obj->lock);
|
|
|
|
|
|
- if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
|
|
|
+ if (WARN_ON(msm_obj->madv > madv)) {
|
|
|
+ dev_err(obj->dev->dev, "Invalid madv state: %u vs %u\n",
|
|
|
+ msm_obj->madv, madv);
|
|
|
mutex_unlock(&msm_obj->lock);
|
|
|
return ERR_PTR(-EBUSY);
|
|
|
}
|
|
@@ -513,6 +515,22 @@ fail:
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
+void *msm_gem_get_vaddr(struct drm_gem_object *obj)
|
|
|
+{
|
|
|
+ return get_vaddr(obj, MSM_MADV_WILLNEED);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Don't use this! It is for the very special case of dumping
|
|
|
+ * submits from GPU hangs or faults, were the bo may already
|
|
|
+ * be MSM_MADV_DONTNEED, but we know the buffer is still on the
|
|
|
+ * active list.
|
|
|
+ */
|
|
|
+void *msm_gem_get_vaddr_active(struct drm_gem_object *obj)
|
|
|
+{
|
|
|
+ return get_vaddr(obj, __MSM_MADV_PURGED);
|
|
|
+}
|
|
|
+
|
|
|
void msm_gem_put_vaddr(struct drm_gem_object *obj)
|
|
|
{
|
|
|
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|