1*dbf21777SIcenowy Zheng // SPDX-License-Identifier: GPL-2.0-only 2*dbf21777SIcenowy Zheng /* 3*dbf21777SIcenowy Zheng * Copyright (C) 2025 Icenowy Zheng <uwu@icenowy.me> 4*dbf21777SIcenowy Zheng */ 5*dbf21777SIcenowy Zheng 6*dbf21777SIcenowy Zheng #include <linux/errno.h> 7*dbf21777SIcenowy Zheng #include <linux/printk.h> 8*dbf21777SIcenowy Zheng 9*dbf21777SIcenowy Zheng #include <drm/drm_fb_dma_helper.h> 10*dbf21777SIcenowy Zheng #include <drm/drm_fourcc.h> 11*dbf21777SIcenowy Zheng #include <drm/drm_gem_dma_helper.h> 12*dbf21777SIcenowy Zheng 13*dbf21777SIcenowy Zheng #include "vs_plane.h" 14*dbf21777SIcenowy Zheng 15*dbf21777SIcenowy Zheng void drm_format_to_vs_format(u32 drm_format, struct vs_format *vs_format) 16*dbf21777SIcenowy Zheng { 17*dbf21777SIcenowy Zheng switch (drm_format) { 18*dbf21777SIcenowy Zheng case DRM_FORMAT_XRGB4444: 19*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBX4444: 20*dbf21777SIcenowy Zheng case DRM_FORMAT_XBGR4444: 21*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRX4444: 22*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_X4R4G4B4; 23*dbf21777SIcenowy Zheng break; 24*dbf21777SIcenowy Zheng case DRM_FORMAT_ARGB4444: 25*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA4444: 26*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR4444: 27*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA4444: 28*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_A4R4G4B4; 29*dbf21777SIcenowy Zheng break; 30*dbf21777SIcenowy Zheng case DRM_FORMAT_XRGB1555: 31*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBX5551: 32*dbf21777SIcenowy Zheng case DRM_FORMAT_XBGR1555: 33*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRX5551: 34*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_X1R5G5B5; 35*dbf21777SIcenowy Zheng break; 36*dbf21777SIcenowy Zheng case DRM_FORMAT_ARGB1555: 37*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA5551: 38*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR1555: 39*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA5551: 40*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_A1R5G5B5; 41*dbf21777SIcenowy Zheng break; 42*dbf21777SIcenowy Zheng case DRM_FORMAT_RGB565: 43*dbf21777SIcenowy Zheng case DRM_FORMAT_BGR565: 44*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_R5G6B5; 45*dbf21777SIcenowy Zheng break; 46*dbf21777SIcenowy Zheng case DRM_FORMAT_XRGB8888: 47*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBX8888: 48*dbf21777SIcenowy Zheng case DRM_FORMAT_XBGR8888: 49*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRX8888: 50*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_X8R8G8B8; 51*dbf21777SIcenowy Zheng break; 52*dbf21777SIcenowy Zheng case DRM_FORMAT_ARGB8888: 53*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA8888: 54*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR8888: 55*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA8888: 56*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_A8R8G8B8; 57*dbf21777SIcenowy Zheng break; 58*dbf21777SIcenowy Zheng case DRM_FORMAT_ARGB2101010: 59*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA1010102: 60*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR2101010: 61*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA1010102: 62*dbf21777SIcenowy Zheng vs_format->color = VSDC_COLOR_FORMAT_A2R10G10B10; 63*dbf21777SIcenowy Zheng break; 64*dbf21777SIcenowy Zheng default: 65*dbf21777SIcenowy Zheng pr_warn("Unexpected drm format!\n"); 66*dbf21777SIcenowy Zheng } 67*dbf21777SIcenowy Zheng 68*dbf21777SIcenowy Zheng switch (drm_format) { 69*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBX4444: 70*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA4444: 71*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBX5551: 72*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA5551: 73*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBX8888: 74*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA8888: 75*dbf21777SIcenowy Zheng case DRM_FORMAT_RGBA1010102: 76*dbf21777SIcenowy Zheng vs_format->swizzle = VSDC_SWIZZLE_RGBA; 77*dbf21777SIcenowy Zheng break; 78*dbf21777SIcenowy Zheng case DRM_FORMAT_XBGR4444: 79*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR4444: 80*dbf21777SIcenowy Zheng case DRM_FORMAT_XBGR1555: 81*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR1555: 82*dbf21777SIcenowy Zheng case DRM_FORMAT_BGR565: 83*dbf21777SIcenowy Zheng case DRM_FORMAT_XBGR8888: 84*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR8888: 85*dbf21777SIcenowy Zheng case DRM_FORMAT_ABGR2101010: 86*dbf21777SIcenowy Zheng vs_format->swizzle = VSDC_SWIZZLE_ABGR; 87*dbf21777SIcenowy Zheng break; 88*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRX4444: 89*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA4444: 90*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRX5551: 91*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA5551: 92*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRX8888: 93*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA8888: 94*dbf21777SIcenowy Zheng case DRM_FORMAT_BGRA1010102: 95*dbf21777SIcenowy Zheng vs_format->swizzle = VSDC_SWIZZLE_BGRA; 96*dbf21777SIcenowy Zheng break; 97*dbf21777SIcenowy Zheng default: 98*dbf21777SIcenowy Zheng /* N/A for YUV formats */ 99*dbf21777SIcenowy Zheng vs_format->swizzle = VSDC_SWIZZLE_ARGB; 100*dbf21777SIcenowy Zheng } 101*dbf21777SIcenowy Zheng 102*dbf21777SIcenowy Zheng /* N/A for non-YUV formats */ 103*dbf21777SIcenowy Zheng vs_format->uv_swizzle = false; 104*dbf21777SIcenowy Zheng } 105*dbf21777SIcenowy Zheng 106*dbf21777SIcenowy Zheng dma_addr_t vs_fb_get_dma_addr(struct drm_framebuffer *fb, 107*dbf21777SIcenowy Zheng const struct drm_rect *src_rect) 108*dbf21777SIcenowy Zheng { 109*dbf21777SIcenowy Zheng struct drm_gem_dma_object *gem; 110*dbf21777SIcenowy Zheng dma_addr_t dma_addr; 111*dbf21777SIcenowy Zheng 112*dbf21777SIcenowy Zheng /* Get the physical address of the buffer in memory */ 113*dbf21777SIcenowy Zheng gem = drm_fb_dma_get_gem_obj(fb, 0); 114*dbf21777SIcenowy Zheng 115*dbf21777SIcenowy Zheng /* Compute the start of the displayed memory */ 116*dbf21777SIcenowy Zheng dma_addr = gem->dma_addr + fb->offsets[0]; 117*dbf21777SIcenowy Zheng 118*dbf21777SIcenowy Zheng /* Fixup framebuffer address for src coordinates */ 119*dbf21777SIcenowy Zheng dma_addr += drm_format_info_min_pitch(fb->format, 0, 120*dbf21777SIcenowy Zheng src_rect->x1 >> 16); 121*dbf21777SIcenowy Zheng dma_addr += (src_rect->y1 >> 16) * fb->pitches[0]; 122*dbf21777SIcenowy Zheng 123*dbf21777SIcenowy Zheng return dma_addr; 124*dbf21777SIcenowy Zheng } 125