|
@@ -87,6 +87,42 @@ void msm_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+/* prepare/pin all the fb's bo's for scanout. Note that it is not valid
|
|
|
+ * to prepare an fb more multiple different initiator 'id's. But that
|
|
|
+ * should be fine, since only the scanout (mdpN) side of things needs
|
|
|
+ * this, the gpu doesn't care about fb's.
|
|
|
+ */
|
|
|
+int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id)
|
|
|
+{
|
|
|
+ struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
|
|
|
+ int ret, i, n = drm_format_num_planes(fb->pixel_format);
|
|
|
+ uint32_t iova;
|
|
|
+
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
+ ret = msm_gem_get_iova(msm_fb->planes[i], id, &iova);
|
|
|
+ DBG("FB[%u]: iova[%d]: %08x (%d)", fb->base.id, i, iova, ret);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id)
|
|
|
+{
|
|
|
+ struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
|
|
|
+ int i, n = drm_format_num_planes(fb->pixel_format);
|
|
|
+
|
|
|
+ for (i = 0; i < n; i++)
|
|
|
+ msm_gem_put_iova(msm_fb->planes[i], id);
|
|
|
+}
|
|
|
+
|
|
|
+uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane)
|
|
|
+{
|
|
|
+ struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
|
|
|
+ return msm_gem_iova(msm_fb->planes[plane], id);
|
|
|
+}
|
|
|
+
|
|
|
struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane)
|
|
|
{
|
|
|
struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
|