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