@@ -182,7 +182,7 @@ static int xe_add_combinations(struct driver *drv)
182182 BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_HW_VIDEO_DECODER |
183183 BO_USE_HW_VIDEO_ENCODER | BO_USE_GPU_DATA_BUFFER |
184184 BO_USE_SENSOR_DIRECT_DATA );
185- drv_modify_combination (drv , DRM_FORMAT_ABGR8888 , & metadata_linear , BO_USE_CURSOR | BO_USE_SCANOUT );
185+ drv_modify_combination (drv , DRM_FORMAT_ABGR8888 , & metadata_linear , BO_USE_CURSOR | BO_USE_SCANOUT | BO_USE_HW_VIDEO_ENCODER );
186186 drv_modify_combination (drv , DRM_FORMAT_NV12 , & metadata_linear ,
187187 BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_CAMERA_MASK );
188188 drv_modify_combination (drv , DRM_FORMAT_YUYV , & metadata_linear ,
@@ -241,8 +241,8 @@ static int xe_add_combinations(struct driver *drv)
241241 drv_add_combinations (drv , scanout_render_formats ,
242242 ARRAY_SIZE (scanout_render_formats ), & metadata_4_tiled ,
243243 scanout_and_render_not_linear );
244- drv_add_combinations (drv , source_formats , ARRAY_SIZE (source_formats ), & metadata_4_tiled ,
245- texture_flags | BO_USE_NON_GPU_HW );
244+ drv_add_combinations (drv , source_formats , ARRAY_SIZE (source_formats ), & metadata_4_tiled ,
245+ texture_flags | BO_USE_NON_GPU_HW );
246246
247247 } else {
248248 struct format_metadata metadata_y_tiled = { .tiling = XE_TILING_Y ,
@@ -671,16 +671,23 @@ static int xe_bo_create_from_metadata(struct bo *bo)
671671 .size = ALIGN (bo -> meta .total_size , PAGE_SIZE ),
672672 .flags = 0 ,
673673 };
674-
675674 /* FIXME: let's assume iGPU with SYSMEM is only supported */
676675 gem_create .placement |= BITFIELD_BIT (DRM_XE_MEM_REGION_CLASS_SYSMEM );
677- if (bo -> meta .use_flags & BO_USE_SCANOUT ) {
678- gem_create .flags |= DRM_XE_GEM_CREATE_FLAG_SCANOUT ;
676+ if ((bo -> meta .use_flags & BO_USE_SCANOUT ) &&
677+ !(bo -> meta .use_flags & (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ
678+ | BO_USE_CAMERA_WRITE | BO_USE_SW_READ_OFTEN ))) {
679+ gem_create .flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT ;
679680 gem_create .cpu_caching = DRM_XE_GEM_CPU_CACHING_WC ;
680- } else {
681+ } else if (((bo -> meta .use_flags & BO_USE_SW_WRITE_OFTEN ) ||
682+ (bo -> meta .use_flags & BO_USE_SW_READ_OFTEN )) &&
683+ !(bo -> meta .use_flags & BO_USE_HW_VIDEO_ENCODER )) {
681684 gem_create .cpu_caching = DRM_XE_GEM_CPU_CACHING_WB ;
685+ } else {
686+ gem_create .flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT ;
687+ gem_create .cpu_caching = DRM_XE_GEM_CPU_CACHING_WC ;
682688 }
683689
690+
684691 ret = drmIoctl (bo -> drv -> fd , DRM_IOCTL_XE_GEM_CREATE , & gem_create );
685692 if (ret ) {
686693 drv_loge ("DRM_IOCTL_XE_GEM_CREATE failed (size=%llu)\n" , gem_create .size );
@@ -723,20 +730,17 @@ static void *xe_bo_map(struct bo *bo, struct vma *vma, uint32_t map_flags)
723730 struct xe_device * xe = bo -> drv -> priv ;
724731
725732 if ((bo -> meta .format_modifier == I915_FORMAT_MOD_Y_TILED_CCS ) ||
726- (bo -> meta .format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ) ||
727- (bo -> meta .format_modifier == I915_FORMAT_MOD_4_TILED ))
733+ (bo -> meta .format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ))
728734 return MAP_FAILED ;
729735
730- if ((bo -> meta .tiling == XE_TILING_NONE ) || (addr == MAP_FAILED )) {
731- struct drm_xe_gem_mmap_offset gem_map = { 0 };
732- gem_map .handle = bo -> handles [0 ].u32 ;
736+ struct drm_xe_gem_mmap_offset gem_map = { 0 };
737+ gem_map .handle = bo -> handles [0 ].u32 ;
733738
734- /* Get the fake offset back */
735- ret = drmIoctl (bo -> drv -> fd , DRM_IOCTL_XE_GEM_MMAP_OFFSET , & gem_map );
736- if (ret == 0 )
737- addr = mmap (0 , bo -> meta .total_size , drv_get_prot (map_flags ),
738- MAP_SHARED , bo -> drv -> fd , gem_map .offset );
739- }
739+ /* Get the fake offset back */
740+ ret = drmIoctl (bo -> drv -> fd , DRM_IOCTL_XE_GEM_MMAP_OFFSET , & gem_map );
741+ if (ret == 0 )
742+ addr = mmap (0 , bo -> meta .total_size , drv_get_prot (map_flags ),
743+ MAP_SHARED , bo -> drv -> fd , gem_map .offset );
740744
741745 if (addr == MAP_FAILED ) {
742746 drv_loge ("xe GEM mmap failed\n" );
0 commit comments