msm: Add P010 support

7180 can produce P010 frames, but they can't be
scanned out.  7280 can produce and scan out.

BUG=b:183020822
TEST=v4l2_stateful_decoder -f vp9_2_test_file.ivf -o P010

Cq-Depend: chromium:3100276
Change-Id: I79cc60f26268cccd683a45609384b62a752ae44c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3100277
Tested-by: Fritz Koenig <frkoenig@chromium.org>
Auto-Submit: Fritz Koenig <frkoenig@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Commit-Queue: Fritz Koenig <frkoenig@chromium.org>
diff --git a/msm.c b/msm.c
index a4c56d9..694fd58 100644
--- a/msm.c
+++ b/msm.c
@@ -41,7 +41,8 @@
 						  DRM_FORMAT_XRGB8888 };
 
 static const uint32_t texture_source_formats[] = { DRM_FORMAT_NV12, DRM_FORMAT_R8,
-						   DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
+						   DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID,
+						   DRM_FORMAT_P010 };
 
 /*
  * Each macrotile consists of m x n (mostly 4 x 4) tiles.
@@ -94,10 +95,15 @@
 	/* NV12 format requires extra padding with platform
 	 * specific alignments for venus driver
 	 */
-	if (bo->meta.format == DRM_FORMAT_NV12) {
+	if (bo->meta.format == DRM_FORMAT_NV12 || bo->meta.format == DRM_FORMAT_P010) {
 		uint32_t y_stride, uv_stride, y_scanline, uv_scanline, y_plane, uv_plane, size,
 		    extra_padding;
 
+		// P010 has the same layout as NV12.  The difference is that each
+		// pixel in P010 takes 2 bytes, while in NV12 each pixel takes 1 byte.
+		if (bo->meta.format == DRM_FORMAT_P010)
+			width *= 2;
+
 		y_stride = ALIGN(width, VENUS_STRIDE_ALIGN);
 		uv_stride = ALIGN(width, VENUS_STRIDE_ALIGN);
 		y_scanline = ALIGN(height, VENUS_SCANLINE_ALIGN * 2);
@@ -264,6 +270,11 @@
 	/* Android CTS tests require this. */
 	drv_add_combination(drv, DRM_FORMAT_BGR888, &LINEAR_METADATA, BO_USE_SW_MASK);
 
+#ifdef SC_7280
+	drv_modify_combination(drv, DRM_FORMAT_P010, &LINEAR_METADATA,
+			       BO_USE_SCANOUT | BO_USE_HW_VIDEO_ENCODER);
+#endif
+
 	drv_modify_linear_combinations(drv);
 
 	if (should_avoid_ubwc() || !drv->compression)