xref: /linux/drivers/gpu/drm/verisilicon/vs_plane.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
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