minigbm: move camera work-around

Move mt8183_camera_quirk_ into struct cross_domain_private.
Add a helper `drv_get_os_option` in `drv_helper` to query os option.
Advertise DRM_FORMAT_MTISP_SXYZW10 as supported format in virtgpu_cross_domain.c.
Implement cross domain's own resolve_format_and_use_flags entry point.

BUG=b:269982880

TEST=tested on a kukui machine after applying the change. Camera and
screen recording works fine.

Change-Id: Ia0d6e2cc701477aa6b9542de84e24f8aeb5a29e0
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/4304961
Commit-Queue: Dawn Han <dawnhan@google.com>
Reviewed-by: Dominik Behr <dbehr@chromium.org>
Tested-by: Dawn Han <dawnhan@google.com>
This commit is contained in:
Dawn Han 2023-02-28 00:41:46 +00:00 committed by Chromeos LUCI
parent b56c26b51c
commit 3940cbd883
6 changed files with 63 additions and 15 deletions

View file

@ -37,6 +37,7 @@ struct cross_domain_private {
void *ring_addr;
struct drv_array *metadata_cache;
pthread_mutex_t metadata_cache_lock;
bool mt8183_camera_quirk_;
};
static void cross_domain_release_private(struct driver *drv)
@ -344,6 +345,10 @@ static int cross_domain_init(struct driver *drv)
if (ret < 0)
goto free_private;
const char *name;
name = drv_get_os_option("RO_PRODUCT_DEVICE");
priv->mt8183_camera_quirk_ = name && !strcmp(name, "kukui");
// minigbm bookkeeping
add_combinations(drv);
return 0;
@ -426,6 +431,42 @@ static void *cross_domain_bo_map(struct bo *bo, struct vma *vma, uint32_t map_fl
gem_map.offset);
}
static void cross_domain_resolve_format_and_use_flags(struct driver *drv, uint32_t format,
uint64_t use_flags, uint32_t *out_format,
uint64_t *out_use_flags)
{
struct cross_domain_private *priv = drv->priv;
*out_format = format;
*out_use_flags = use_flags;
switch (format) {
case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
if (priv->mt8183_camera_quirk_ && (use_flags & BO_USE_CAMERA_READ) &&
!(use_flags & BO_USE_SCANOUT)) {
*out_format = DRM_FORMAT_MTISP_SXYZW10;
break;
}
/* Common camera implementation defined format. */
if (use_flags & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE)) {
*out_format = DRM_FORMAT_NV12;
} else {
/* HACK: See b/28671744 */
*out_format = DRM_FORMAT_XBGR8888;
*out_use_flags &= ~BO_USE_HW_VIDEO_ENCODER;
}
break;
case DRM_FORMAT_FLEX_YCbCr_420_888:
/* Common flexible video format. */
*out_format = DRM_FORMAT_NV12;
break;
case DRM_FORMAT_YVU420_ANDROID:
*out_use_flags &= ~BO_USE_SCANOUT;
break;
default:
break;
}
}
const struct backend virtgpu_cross_domain = {
.name = "virtgpu_cross_domain",
.init = cross_domain_init,
@ -435,5 +476,5 @@ const struct backend virtgpu_cross_domain = {
.bo_destroy = drv_gem_bo_destroy,
.bo_map = cross_domain_bo_map,
.bo_unmap = drv_bo_munmap,
.resolve_format_and_use_flags = drv_resolve_format_and_use_flags_helper,
.resolve_format_and_use_flags = cross_domain_resolve_format_and_use_flags,
};