xref: /linux/drivers/gpu/drm/verisilicon/vs_hwdb.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 
8*dbf21777SIcenowy Zheng #include <drm/drm_fourcc.h>
9*dbf21777SIcenowy Zheng 
10*dbf21777SIcenowy Zheng #include "vs_dc_top_regs.h"
11*dbf21777SIcenowy Zheng #include "vs_hwdb.h"
12*dbf21777SIcenowy Zheng 
13*dbf21777SIcenowy Zheng static const u32 vs_formats_array_no_yuv444[] = {
14*dbf21777SIcenowy Zheng 	DRM_FORMAT_XRGB4444,
15*dbf21777SIcenowy Zheng 	DRM_FORMAT_XBGR4444,
16*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBX4444,
17*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRX4444,
18*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB4444,
19*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR4444,
20*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA4444,
21*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA4444,
22*dbf21777SIcenowy Zheng 	DRM_FORMAT_XRGB1555,
23*dbf21777SIcenowy Zheng 	DRM_FORMAT_XBGR1555,
24*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBX5551,
25*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRX5551,
26*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB1555,
27*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR1555,
28*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA5551,
29*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA5551,
30*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGB565,
31*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGR565,
32*dbf21777SIcenowy Zheng 	DRM_FORMAT_XRGB8888,
33*dbf21777SIcenowy Zheng 	DRM_FORMAT_XBGR8888,
34*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBX8888,
35*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRX8888,
36*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB8888,
37*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR8888,
38*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA8888,
39*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA8888,
40*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB2101010,
41*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR2101010,
42*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA1010102,
43*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA1010102,
44*dbf21777SIcenowy Zheng 	/* TODO: non-RGB formats */
45*dbf21777SIcenowy Zheng };
46*dbf21777SIcenowy Zheng 
47*dbf21777SIcenowy Zheng static const u32 vs_formats_array_with_yuv444[] = {
48*dbf21777SIcenowy Zheng 	DRM_FORMAT_XRGB4444,
49*dbf21777SIcenowy Zheng 	DRM_FORMAT_XBGR4444,
50*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBX4444,
51*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRX4444,
52*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB4444,
53*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR4444,
54*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA4444,
55*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA4444,
56*dbf21777SIcenowy Zheng 	DRM_FORMAT_XRGB1555,
57*dbf21777SIcenowy Zheng 	DRM_FORMAT_XBGR1555,
58*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBX5551,
59*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRX5551,
60*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB1555,
61*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR1555,
62*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA5551,
63*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA5551,
64*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGB565,
65*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGR565,
66*dbf21777SIcenowy Zheng 	DRM_FORMAT_XRGB8888,
67*dbf21777SIcenowy Zheng 	DRM_FORMAT_XBGR8888,
68*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBX8888,
69*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRX8888,
70*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB8888,
71*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR8888,
72*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA8888,
73*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA8888,
74*dbf21777SIcenowy Zheng 	DRM_FORMAT_ARGB2101010,
75*dbf21777SIcenowy Zheng 	DRM_FORMAT_ABGR2101010,
76*dbf21777SIcenowy Zheng 	DRM_FORMAT_RGBA1010102,
77*dbf21777SIcenowy Zheng 	DRM_FORMAT_BGRA1010102,
78*dbf21777SIcenowy Zheng 	/* TODO: non-RGB formats */
79*dbf21777SIcenowy Zheng };
80*dbf21777SIcenowy Zheng 
81*dbf21777SIcenowy Zheng static const struct vs_formats vs_formats_no_yuv444 = {
82*dbf21777SIcenowy Zheng 	.array = vs_formats_array_no_yuv444,
83*dbf21777SIcenowy Zheng 	.num = ARRAY_SIZE(vs_formats_array_no_yuv444)
84*dbf21777SIcenowy Zheng };
85*dbf21777SIcenowy Zheng 
86*dbf21777SIcenowy Zheng static const struct vs_formats vs_formats_with_yuv444 = {
87*dbf21777SIcenowy Zheng 	.array = vs_formats_array_with_yuv444,
88*dbf21777SIcenowy Zheng 	.num = ARRAY_SIZE(vs_formats_array_with_yuv444)
89*dbf21777SIcenowy Zheng };
90*dbf21777SIcenowy Zheng 
91*dbf21777SIcenowy Zheng static struct vs_chip_identity vs_chip_identities[] = {
92*dbf21777SIcenowy Zheng 	{
93*dbf21777SIcenowy Zheng 		.model = 0x8200,
94*dbf21777SIcenowy Zheng 		.revision = 0x5720,
95*dbf21777SIcenowy Zheng 		.customer_id = ~0U,
96*dbf21777SIcenowy Zheng 
97*dbf21777SIcenowy Zheng 		.display_count = 2,
98*dbf21777SIcenowy Zheng 		.formats = &vs_formats_no_yuv444,
99*dbf21777SIcenowy Zheng 	},
100*dbf21777SIcenowy Zheng 	{
101*dbf21777SIcenowy Zheng 		.model = 0x8200,
102*dbf21777SIcenowy Zheng 		.revision = 0x5721,
103*dbf21777SIcenowy Zheng 		.customer_id = 0x30B,
104*dbf21777SIcenowy Zheng 
105*dbf21777SIcenowy Zheng 		.display_count = 2,
106*dbf21777SIcenowy Zheng 		.formats = &vs_formats_no_yuv444,
107*dbf21777SIcenowy Zheng 	},
108*dbf21777SIcenowy Zheng 	{
109*dbf21777SIcenowy Zheng 		.model = 0x8200,
110*dbf21777SIcenowy Zheng 		.revision = 0x5720,
111*dbf21777SIcenowy Zheng 		.customer_id = 0x310,
112*dbf21777SIcenowy Zheng 
113*dbf21777SIcenowy Zheng 		.display_count = 2,
114*dbf21777SIcenowy Zheng 		.formats = &vs_formats_with_yuv444,
115*dbf21777SIcenowy Zheng 	},
116*dbf21777SIcenowy Zheng 	{
117*dbf21777SIcenowy Zheng 		.model = 0x8200,
118*dbf21777SIcenowy Zheng 		.revision = 0x5720,
119*dbf21777SIcenowy Zheng 		.customer_id = 0x311,
120*dbf21777SIcenowy Zheng 
121*dbf21777SIcenowy Zheng 		.display_count = 2,
122*dbf21777SIcenowy Zheng 		.formats = &vs_formats_no_yuv444,
123*dbf21777SIcenowy Zheng 	},
124*dbf21777SIcenowy Zheng };
125*dbf21777SIcenowy Zheng 
126*dbf21777SIcenowy Zheng int vs_fill_chip_identity(struct regmap *regs,
127*dbf21777SIcenowy Zheng 			  struct vs_chip_identity *ident)
128*dbf21777SIcenowy Zheng {
129*dbf21777SIcenowy Zheng 	u32 model;
130*dbf21777SIcenowy Zheng 	u32 revision;
131*dbf21777SIcenowy Zheng 	u32 customer_id;
132*dbf21777SIcenowy Zheng 	int i;
133*dbf21777SIcenowy Zheng 
134*dbf21777SIcenowy Zheng 	regmap_read(regs, VSDC_TOP_CHIP_MODEL, &model);
135*dbf21777SIcenowy Zheng 	regmap_read(regs, VSDC_TOP_CHIP_REV, &revision);
136*dbf21777SIcenowy Zheng 	regmap_read(regs, VSDC_TOP_CHIP_CUSTOMER_ID, &customer_id);
137*dbf21777SIcenowy Zheng 
138*dbf21777SIcenowy Zheng 	for (i = 0; i < ARRAY_SIZE(vs_chip_identities); i++) {
139*dbf21777SIcenowy Zheng 		if (vs_chip_identities[i].model == model &&
140*dbf21777SIcenowy Zheng 		    vs_chip_identities[i].revision == revision &&
141*dbf21777SIcenowy Zheng 		    (vs_chip_identities[i].customer_id == customer_id ||
142*dbf21777SIcenowy Zheng 		     vs_chip_identities[i].customer_id == ~0U)) {
143*dbf21777SIcenowy Zheng 			memcpy(ident, &vs_chip_identities[i], sizeof(*ident));
144*dbf21777SIcenowy Zheng 			ident->customer_id = customer_id;
145*dbf21777SIcenowy Zheng 			return 0;
146*dbf21777SIcenowy Zheng 		}
147*dbf21777SIcenowy Zheng 	}
148*dbf21777SIcenowy Zheng 
149*dbf21777SIcenowy Zheng 	return -EINVAL;
150*dbf21777SIcenowy Zheng }
151