drm/sun4i: Expand DE2 scaler lib with YUV support

Basic principle of operation when using YUV framebuffer is that chroma
planes have to be upscaled to same size as luma.

Because of that, expand DE2 scaler library to support that.

BSP driver uses another set of FIR filter coefficients for YUV planes.

Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171201060550.10392-26-jernej.skrabec@siol.net
This commit is contained in:
Jernej Skrabec 2017-12-01 07:05:48 +01:00 committed by Maxime Ripard
parent 60a3dcf96a
commit 1343bd6c23
3 changed files with 453 additions and 13 deletions

View File

@ -51,6 +51,7 @@ static int sun8i_vi_layer_update_coord(struct sun8i_mixer *mixer, int channel,
int overlay, struct drm_plane *plane) int overlay, struct drm_plane *plane)
{ {
struct drm_plane_state *state = plane->state; struct drm_plane_state *state = plane->state;
const struct drm_format_info *format = state->fb->format;
u32 src_w, src_h, dst_w, dst_h; u32 src_w, src_h, dst_w, dst_h;
u32 outsize, insize; u32 outsize, insize;
u32 hphase, vphase; u32 hphase, vphase;
@ -89,7 +90,8 @@ static int sun8i_vi_layer_update_coord(struct sun8i_mixer *mixer, int channel,
vscale = state->src_h / state->crtc_h; vscale = state->src_h / state->crtc_h;
sun8i_vi_scaler_setup(mixer, channel, src_w, src_h, dst_w, sun8i_vi_scaler_setup(mixer, channel, src_w, src_h, dst_w,
dst_h, hscale, vscale, hphase, vphase); dst_h, hscale, vscale, hphase, vphase,
format);
sun8i_vi_scaler_enable(mixer, channel, true); sun8i_vi_scaler_enable(mixer, channel, true);
} else { } else {
DRM_DEBUG_DRIVER("HW scaling is not needed\n"); DRM_DEBUG_DRIVER("HW scaling is not needed\n");

View File

@ -422,6 +422,417 @@ static const u32 lan2coefftab32[480] = {
0x0e1d1401, 0x0f1d1301, 0x0f1d1301, 0x101e1200, 0x0e1d1401, 0x0f1d1301, 0x0f1d1301, 0x101e1200,
}; };
static const u32 bicubic8coefftab32_left[480] = {
0x40000000, 0x40ff0000, 0x3ffe0000, 0x3efe0000,
0x3dfd0000, 0x3cfc0000, 0x3bfc0000, 0x39fc0000,
0x36fc0000, 0x35fb0000, 0x33fb0000, 0x31fb0000,
0x2ffb0000, 0x2cfb0000, 0x29fc0000, 0x27fc0000,
0x24fc0000, 0x21fc0000, 0x1efd0000, 0x1cfd0000,
0x19fd0000, 0x16fe0000, 0x14fe0000, 0x11fe0000,
0x0dff0000, 0x0cff0000, 0x0aff0000, 0x08ff0000,
0x05000000, 0x03000000, 0x02000000, 0x01000000,
0x3904ff00, 0x3903ff00, 0x3902ff00, 0x38010000,
0x37000000, 0x36ff0000, 0x35ff0000, 0x34fe0000,
0x32fe0000, 0x31fd0000, 0x30fd0000, 0x2efc0000,
0x2cfc0000, 0x2afc0000, 0x28fc0000, 0x26fc0000,
0x24fc0000, 0x22fc0000, 0x20fc0000, 0x1efc0000,
0x1cfc0000, 0x19fc0000, 0x17fc0000, 0x15fd0000,
0x12fd0000, 0x11fd0000, 0x0ffd0000, 0x0dfe0000,
0x0bfe0000, 0x09fe0000, 0x08fe0000, 0x06ff0000,
0x3209fe00, 0x3407fe00, 0x3306fe00, 0x3305fe00,
0x3204fe00, 0x3102ff00, 0x3102ff00, 0x3001ff00,
0x2f00ff00, 0x2effff00, 0x2cff0000, 0x2bfe0000,
0x29fe0000, 0x28fe0000, 0x26fd0000, 0x24fd0000,
0x23fd0000, 0x21fd0000, 0x20fc0000, 0x1efc0000,
0x1dfc0000, 0x1bfc0000, 0x19fc0000, 0x17fc0000,
0x16fc0000, 0x14fc0000, 0x12fc0000, 0x10fd0000,
0x0ffd0000, 0x0dfd0000, 0x0cfd0000, 0x0afd0000,
0x2e0cfd00, 0x2e0bfd00, 0x2e09fd00, 0x2e08fd00,
0x2e07fd00, 0x2c06fe00, 0x2c05fe00, 0x2b04fe00,
0x2b03fe00, 0x2a02fe00, 0x2901fe00, 0x2701ff00,
0x2700ff00, 0x26ffff00, 0x24ffff00, 0x23ffff00,
0x22feff00, 0x20fe0000, 0x1ffe0000, 0x1efd0000,
0x1dfd0000, 0x1bfd0000, 0x1afd0000, 0x19fd0000,
0x17fd0000, 0x15fd0000, 0x13fd0000, 0x12fd0000,
0x11fd0000, 0x10fd0000, 0x0ffd0000, 0x0cfd0000,
0x2a0efd00, 0x2a0dfd00, 0x2a0cfd00, 0x290bfd00,
0x290afd00, 0x2909fd00, 0x2908fd00, 0x2807fd00,
0x2706fd00, 0x2705fd00, 0x2604fe00, 0x2603fe00,
0x2502fe00, 0x2402fe00, 0x2401fe00, 0x2200fe00,
0x2200fe00, 0x2000ff00, 0x1fffff00, 0x1effff00,
0x1dfeff00, 0x1cfeff00, 0x1afeff00, 0x19feff00,
0x17fe0000, 0x16fd0000, 0x15fd0000, 0x14fd0000,
0x12fd0000, 0x11fd0000, 0x10fd0000, 0x0ffd0000,
0x2610fd00, 0x260ffd00, 0x260efd00, 0x260dfd00,
0x260cfd00, 0x260bfd00, 0x260afd00, 0x2609fd00,
0x2508fd00, 0x2507fd00, 0x2406fd00, 0x2406fd00,
0x2305fd00, 0x2304fd00, 0x2203fe00, 0x2103fe00,
0x2002fe00, 0x1f01fe00, 0x1e01fe00, 0x1e00fe00,
0x1c00fe00, 0x1b00fe00, 0x1afffe00, 0x19ffff00,
0x18ffff00, 0x17feff00, 0x16feff00, 0x15feff00,
0x14feff00, 0x13feff00, 0x11feff00, 0x10fd0000,
0x2411feff, 0x2410feff, 0x240ffeff, 0x230efeff,
0x240dfeff, 0x240cfeff, 0x230cfd00, 0x230bfd00,
0x230afd00, 0x2309fd00, 0x2208fd00, 0x2108fd00,
0x2007fd00, 0x2106fd00, 0x2005fd00, 0x1f05fd00,
0x1f04fd00, 0x1e03fd00, 0x1d03fe00, 0x1c02fe00,
0x1b02fe00, 0x1a01fe00, 0x1a01fe00, 0x1900fe00,
0x1800fe00, 0x1700fe00, 0x16fffe00, 0x15fffe00,
0x13ffff00, 0x12ffff00, 0x12feff00, 0x11feff00,
0x2212fffe, 0x2211fffe, 0x2210ffff, 0x220ffeff,
0x220efeff, 0x210efeff, 0x210dfeff, 0x210cfeff,
0x210bfeff, 0x200bfeff, 0x200afeff, 0x1f09feff,
0x1f08feff, 0x1d08fe00, 0x1e07fd00, 0x1e06fd00,
0x1d06fd00, 0x1c05fd00, 0x1b04fe00, 0x1a04fe00,
0x1a03fe00, 0x1903fe00, 0x1802fe00, 0x1802fe00,
0x1701fe00, 0x1601fe00, 0x1501fe00, 0x1500fe00,
0x1400fe00, 0x1400fe00, 0x13fffe00, 0x12fffe00,
0x201200fe, 0x201100fe, 0x1f1100fe, 0x2010fffe,
0x200ffffe, 0x1f0ffffe, 0x1f0efffe, 0x1e0dffff,
0x1f0cfeff, 0x1e0cfeff, 0x1e0bfeff, 0x1e0afeff,
0x1d0afeff, 0x1d09feff, 0x1c08feff, 0x1b08feff,
0x1b07feff, 0x1a07feff, 0x1a06feff, 0x1a05feff,
0x1805fe00, 0x1904fe00, 0x1704fe00, 0x1703fe00,
0x1603fe00, 0x1602fe00, 0x1402fe00, 0x1402fe00,
0x1401fe00, 0x1301fe00, 0x1201fe00, 0x1200fe00,
0x1c1202fe, 0x1c1102fe, 0x1b1102fe, 0x1c1001fe,
0x1b1001fe, 0x1c0f01fe, 0x1b0f00fe, 0x1b0e00fe,
0x1b0e00fe, 0x1b0d00fe, 0x1b0c00fe, 0x1a0cfffe,
0x1a0bfffe, 0x1a0bfffe, 0x190afffe, 0x190afffe,
0x1909fffe, 0x1709ffff, 0x1808ffff, 0x1708feff,
0x1707feff, 0x1707feff, 0x1606feff, 0x1506feff,
0x1505feff, 0x1505feff, 0x1404feff, 0x1404feff,
0x1404feff, 0x1303feff, 0x1203feff, 0x1202feff,
0x191104fe, 0x191104fe, 0x191003fe, 0x191003fe,
0x171003fe, 0x180f03fe, 0x180f02fe, 0x180e02fe,
0x180e02fe, 0x180d01fe, 0x180d01fe, 0x180d01fe,
0x170c01fe, 0x160c01fe, 0x170b00fe, 0x170b00fe,
0x160a00fe, 0x160a00fe, 0x160a00fe, 0x150900fe,
0x1509fffe, 0x1508fffe, 0x1508fffe, 0x1408fffe,
0x1407fffe, 0x1307ffff, 0x1306ffff, 0x1206ffff,
0x1206ffff, 0x1205ffff, 0x1205ffff, 0x1104feff,
0x161006ff, 0x161005ff, 0x161005ff, 0x160f05ff,
0x160f04ff, 0x150f04ff, 0x150e04ff, 0x150e04ff,
0x150e03ff, 0x150d03ff, 0x150d03ff, 0x150d02ff,
0x140c02ff, 0x150c02fe, 0x150c02fe, 0x150b02fe,
0x140b01fe, 0x140b01fe, 0x140a01fe, 0x140a01fe,
0x140a01fe, 0x130900fe, 0x130900fe, 0x130900fe,
0x130800fe, 0x120800fe, 0x120800fe, 0x120700fe,
0x120700fe, 0x1107fffe, 0x1106fffe, 0x1106fffe,
0x140f0700, 0x140f0600, 0x140f0600, 0x140f0600,
0x140e0600, 0x130e0500, 0x140e05ff, 0x130e05ff,
0x140d05ff, 0x130d04ff, 0x130d04ff, 0x120d04ff,
0x130c04ff, 0x130c03ff, 0x130c03ff, 0x120c03ff,
0x120b03ff, 0x120b02ff, 0x120b02ff, 0x120a02ff,
0x120a02ff, 0x110a02ff, 0x110a01ff, 0x120901ff,
0x100901ff, 0x100901ff, 0x110801ff, 0x110801ff,
0x100800ff, 0x100800ff, 0x100700ff, 0x100700fe,
0x120f0701, 0x120e0701, 0x120e0701, 0x120e0701,
0x120e0600, 0x110e0600, 0x120d0600, 0x120d0600,
0x120d0500, 0x120d0500, 0x110d0500, 0x110c0500,
0x110c0500, 0x110c0400, 0x110c0400, 0x110b04ff,
0x110b04ff, 0x110b04ff, 0x110b03ff, 0x110b03ff,
0x110a03ff, 0x110a03ff, 0x100a03ff, 0x110a02ff,
0x100902ff, 0x100902ff, 0x100902ff, 0x0f0902ff,
0x0e0902ff, 0x100801ff, 0x0f0801ff, 0x0f0801ff,
0x100e0802, 0x100e0802, 0x110e0702, 0x110d0701,
0x110d0701, 0x100d0701, 0x100d0701, 0x110d0601,
0x110d0601, 0x110c0601, 0x110c0601, 0x100c0600,
0x100c0500, 0x100c0500, 0x100c0500, 0x100b0500,
0x100b0500, 0x100b0400, 0x100b0400, 0x0f0b0400,
0x100a0400, 0x0f0a0400, 0x0f0a0400, 0x0f0a0300,
0x0f0a03ff, 0x0f0903ff, 0x0f0903ff, 0x0f0903ff,
0x0f0903ff, 0x0f0902ff, 0x0f0902ff, 0x0f0802ff
};
static const u32 bicubic8coefftab32_right[480] = {
0x00000000, 0x00000001, 0x00000003, 0x00000004,
0x00000006, 0x0000ff09, 0x0000ff0a, 0x0000ff0c,
0x0000ff0f, 0x0000fe12, 0x0000fe14, 0x0000fe16,
0x0000fd19, 0x0000fd1c, 0x0000fd1e, 0x0000fc21,
0x0000fc24, 0x0000fc27, 0x0000fc29, 0x0000fb2c,
0x0000fb2f, 0x0000fb31, 0x0000fb33, 0x0000fb36,
0x0000fc38, 0x0000fc39, 0x0000fc3b, 0x0000fc3d,
0x0000fd3e, 0x0000fe3f, 0x0000fe40, 0x0000ff40,
0x0000ff05, 0x0000ff06, 0x0000fe08, 0x0000fe09,
0x0000fe0b, 0x0000fe0d, 0x0000fd0f, 0x0000fd11,
0x0000fd13, 0x0000fd15, 0x0000fc17, 0x0000fc1a,
0x0000fc1c, 0x0000fc1e, 0x0000fc20, 0x0000fc22,
0x0000fc24, 0x0000fc26, 0x0000fc28, 0x0000fc2a,
0x0000fc2c, 0x0000fc2f, 0x0000fd30, 0x0000fd31,
0x0000fe33, 0x0000fe34, 0x0000ff35, 0x0000ff36,
0x00000037, 0x00000138, 0x00ff0239, 0x00ff0339,
0x0000fe09, 0x0000fd0a, 0x0000fd0c, 0x0000fd0d,
0x0000fd0f, 0x0000fd11, 0x0000fc12, 0x0000fc14,
0x0000fc16, 0x0000fc18, 0x0000fc19, 0x0000fc1b,
0x0000fc1d, 0x0000fc1e, 0x0000fc21, 0x0000fd22,
0x0000fd23, 0x0000fd25, 0x0000fd27, 0x0000fe28,
0x0000fe29, 0x0000fe2b, 0x0000ff2c, 0x00ffff2f,
0x00ff002f, 0x00ff0130, 0x00ff0231, 0x00ff0232,
0x00fe0432, 0x00fe0533, 0x00fe0633, 0x00fe0734,
0x0000fd0c, 0x0000fd0d, 0x0000fd0f, 0x0000fd10,
0x0000fd11, 0x0000fd13, 0x0000fd14, 0x0000fd16,
0x0000fd17, 0x0000fd19, 0x0000fd1b, 0x0000fd1c,
0x0000fd1d, 0x0000fd1f, 0x0000fe20, 0x0000fe21,
0x00fffe24, 0x00ffff24, 0x00ffff25, 0x00ffff27,
0x00ff0027, 0x00ff0128, 0x00fe012a, 0x00fe022a,
0x00fe032b, 0x00fe042c, 0x00fe052d, 0x00fe062d,
0x00fd072e, 0x00fd082e, 0x00fd092e, 0x00fd0b2f,
0x0000fd0e, 0x0000fd0f, 0x0000fd10, 0x0000fd12,
0x0000fd13, 0x0000fd14, 0x0000fd15, 0x0000fd17,
0x0000fe18, 0x00fffe1a, 0x00fffe1b, 0x00fffe1c,
0x00fffe1e, 0x00ffff1e, 0x00ffff1f, 0x00ff0021,
0x00fe0022, 0x00fe0023, 0x00fe0124, 0x00fe0224,
0x00fe0226, 0x00fe0326, 0x00fe0427, 0x00fd0528,
0x00fd0628, 0x00fd0729, 0x00fd0829, 0x00fd0929,
0x00fd0a2a, 0x00fd0b2a, 0x00fd0c2a, 0x00fd0d2a,
0x0000fd10, 0x0000fd11, 0x00fffe12, 0x00fffe13,
0x00fffe14, 0x00fffe15, 0x00fffe16, 0x00fffe17,
0x00ffff18, 0x00ffff19, 0x00feff1c, 0x00fe001b,
0x00fe001d, 0x00fe001e, 0x00fe011e, 0x00fe011f,
0x00fe0220, 0x00fe0321, 0x00fe0322, 0x00fd0423,
0x00fd0524, 0x00fd0624, 0x00fd0626, 0x00fd0725,
0x00fd0825, 0x00fd0926, 0x00fd0a26, 0x00fd0b26,
0x00fd0c26, 0x00fd0d26, 0x00fd0e27, 0x00fd0f27,
0x00fffe11, 0x00fffe12, 0x00fffe13, 0x00ffff14,
0x00ffff14, 0x00feff16, 0x00feff17, 0x00fe0017,
0x00fe0018, 0x00fe0019, 0x00fe011a, 0x00fe011b,
0x00fe021c, 0x00fe021c, 0x00fe031d, 0x00fd031f,
0x00fd041f, 0x00fd0520, 0x00fd0520, 0x00fd0621,
0x00fd0721, 0x00fd0822, 0x00fd0822, 0x00fd0923,
0x00fd0a23, 0x00fd0b23, 0x00fd0b25, 0x00fe0c24,
0x00fe0d24, 0x00fe0e24, 0x00fe0f24, 0x00fe1024,
0x00feff12, 0x00feff13, 0x00feff13, 0x00fe0014,
0x00fe0015, 0x00fe0016, 0x00fe0116, 0x00fe0117,
0x00fe0118, 0x00fe0218, 0x00fe0219, 0x00fe031a,
0x00fe031b, 0x00fe041b, 0x00fd041d, 0x00fd051d,
0x00fd061d, 0x00fd061f, 0x00fe071e, 0x00fe081e,
0x00fe081f, 0x00fe091f, 0x00fe0a20, 0x00fe0a20,
0x00fe0b21, 0x00fe0c21, 0x00fe0d21, 0x00fe0d22,
0x00fe0e22, 0x00fe0f21, 0x00ff1021, 0x00ff1022,
0x00fe0012, 0x00fe0013, 0x00fe0113, 0x00fe0114,
0x00fe0115, 0x00fe0215, 0x00fe0216, 0x00fe0217,
0x00fe0317, 0x00fe0318, 0x00fe0418, 0x00fe0419,
0x00fe0519, 0x00fe051a, 0x00fe061b, 0x00fe071b,
0x00fe071c, 0x00fe081c, 0x00fe081d, 0x00fe091d,
0x00fe0a1d, 0x00fe0a1d, 0x00fe0b1e, 0x00fe0c1e,
0x00ff0c1e, 0x00ff0d1e, 0x00ff0e1f, 0x00ff0e1f,
0x00ff0f1f, 0x00ff0f20, 0x0000101f, 0x0000111f,
0x00fe0212, 0x00fe0312, 0x00fe0313, 0x00fe0314,
0x00fe0414, 0x00fe0414, 0x00fe0515, 0x00fe0516,
0x00fe0516, 0x00fe0616, 0x00fe0617, 0x00fe0718,
0x00fe0719, 0x00fe0818, 0x00ff0819, 0x00ff0918,
0x00ff0919, 0x00ff0a19, 0x00ff0a19, 0x00ff0b1a,
0x00ff0b1b, 0x00ff0c1a, 0x00000c1b, 0x00000d1b,
0x00000d1c, 0x00000e1b, 0x00000e1d, 0x00010f1b,
0x00010f1b, 0x0001101c, 0x0001101d, 0x0002111c,
0x00fe0412, 0x00fe0412, 0x00ff0512, 0x00ff0512,
0x00ff0613, 0x00ff0613, 0x00ff0614, 0x00ff0714,
0x00ff0714, 0x00ff0815, 0x00ff0815, 0x00ff0815,
0x00ff0916, 0x00000916, 0x00000a16, 0x00000a16,
0x00000a18, 0x00000b17, 0x00000b17, 0x00010c17,
0x00010c18, 0x00010d18, 0x00010d18, 0x00010d19,
0x00020e18, 0x00020e18, 0x00020f18, 0x00030f18,
0x00030f18, 0x00031018, 0x00031018, 0x00041119,
0x00ff0610, 0x00ff0611, 0x00ff0611, 0x00ff0711,
0x00000711, 0x00000712, 0x00000812, 0x00000812,
0x00000813, 0x00000913, 0x00000913, 0x00000914,
0x00010a14, 0x00010a14, 0x00010a14, 0x00010b14,
0x00010b16, 0x00020b15, 0x00020c15, 0x00020c15,
0x00020c15, 0x00020d17, 0x00030d16, 0x00030d16,
0x00030e16, 0x00040e16, 0x00040e16, 0x00040f16,
0x00040f16, 0x00050f17, 0x00051017, 0x00051017,
0x0000070f, 0x00000710, 0x00000710, 0x00000710,
0x00000810, 0x00010811, 0x00010811, 0x00010911,
0x00010911, 0x00010913, 0x00010913, 0x00020a12,
0x00020a12, 0x00020a13, 0x00020b12, 0x00020b13,
0x00030b13, 0x00030c13, 0x00030c13, 0x00030c14,
0x00040c13, 0x00040d13, 0x00040d14, 0x00040d14,
0x00050e14, 0x00050e14, 0x00050e14, 0x00050e14,
0x00060f14, 0x00060f14, 0x00060f15, 0x00061015,
0x0001070f, 0x0001080f, 0x0001080f, 0x0001080f,
0x00010811, 0x00020910, 0x00020910, 0x00020910,
0x00020911, 0x00020a10, 0x00030a10, 0x00030a11,
0x00030a11, 0x00030b11, 0x00030b11, 0x00040b12,
0x00040b12, 0x00040c11, 0x00040c12, 0x00040c12,
0x00050c12, 0x00050c12, 0x00050d12, 0x00050d12,
0x00060d13, 0x00060d13, 0x00060e12, 0x00060e13,
0x00070e13, 0x00070e13, 0x00070f13, 0x00070f13,
0x0002080e, 0x0002080e, 0x0002080e, 0x00020810,
0x0002090f, 0x0003090f, 0x0003090f, 0x0003090f,
0x0003090f, 0x00030a0f, 0x00030a0f, 0x00040a10,
0x00040a11, 0x00040b10, 0x00040b10, 0x00040b11,
0x00050b10, 0x00050b11, 0x00050c10, 0x00050c11,
0x00050c11, 0x00060c11, 0x00060c11, 0x00060d11,
0x00060d12, 0x00070d12, 0x00070d12, 0x00070e11,
0x00070e11, 0x00070e12, 0x00080e11, 0x00080e12
};
static const u32 bicubic4coefftab32[480] = {
0x00004000, 0x000140ff, 0x00033ffe, 0x00043ffd,
0x00063dfd, 0xff083dfc, 0xff0a3bfc, 0xff0c39fc,
0xff0e37fc, 0xfe1136fb, 0xfe1433fb, 0xfe1631fb,
0xfd192ffb, 0xfd1c2cfb, 0xfd1e29fc, 0xfc2127fc,
0xfc2424fc, 0xfc2721fc, 0xfc291efd, 0xfb2c1cfd,
0xfb2f19fd, 0xfb3116fe, 0xfb3314fe, 0xfb3611fe,
0xfc370eff, 0xfc390cff, 0xfc3b0aff, 0xfc3d08ff,
0xfd3d0600, 0xfd3f0400, 0xfe3f0300, 0xff400100,
0xfe053904, 0xfe063903, 0xfe083901, 0xfe0a3800,
0xfd0b3800, 0xfe0d36ff, 0xfd0f35ff, 0xfd1134fe,
0xfd1332fe, 0xfd1531fd, 0xfc1730fd, 0xfc1a2efc,
0xfc1c2cfc, 0xfc1e2afc, 0xfc2028fc, 0xfc2226fc,
0xfc2424fc, 0xfc2622fc, 0xfc2820fc, 0xfc2a1efc,
0xfc2c1cfc, 0xfc2e1afc, 0xfd3017fc, 0xfd3115fd,
0xfe3213fd, 0xfe3411fd, 0xff350ffd, 0xff360dfe,
0x00370bfe, 0x013809fe, 0x023808fe, 0x033806ff,
0xfd093208, 0xfd0a3207, 0xfd0c3205, 0xfd0d3204,
0xfc0f3203, 0xfc113102, 0xfc123002, 0xfc143000,
0xfc152f00, 0xfc172d00, 0xfc192cff, 0xfc1b2bfe,
0xfc1d29fe, 0xfc1e28fe, 0xfc2027fd, 0xfd2125fd,
0xfd2323fd, 0xfd2521fd, 0xfd2720fc, 0xfe281efc,
0xfe291dfc, 0xfe2b1bfc, 0xff2c19fc, 0x002d17fc,
0x002e16fc, 0x012f14fc, 0x022f12fd, 0x023110fd,
0x03310ffd, 0x05310dfd, 0x06320bfd, 0x07320afd,
0xfc0c2d0b, 0xfc0d2d0a, 0xfc0e2d09, 0xfc102d07,
0xfc112c07, 0xfc132c05, 0xfc142c04, 0xfc162b03,
0xfc172a03, 0xfc192a01, 0xfc1a2901, 0xfd1b2800,
0xfd1c2700, 0xfd1e2500, 0xfe1f24ff, 0xfe2023ff,
0xfe2222fe, 0xff2320fe, 0xff241ffe, 0x00251efd,
0x00271cfd, 0x01271bfd, 0x01281afd, 0x022918fd,
0x032a16fd, 0x032b15fd, 0x042b14fd, 0x052c12fd,
0x072c10fd, 0x082c0ffd, 0x092c0efd, 0x0a2c0dfd,
0xfd0d290d, 0xfd0e290c, 0xfd0f290b, 0xfd11280a,
0xfd122809, 0xfd132808, 0xfd142807, 0xfd162706,
0xfd172705, 0xfd192604, 0xfe1a2503, 0xfe1b2502,
0xfe1c2402, 0xfe1d2302, 0xff1e2201, 0xff1f2101,
0x00202000, 0x00211f00, 0x01221eff, 0x02221dff,
0x02241cfe, 0x03241bfe, 0x042519fe, 0x042618fe,
0x052617fe, 0x062716fd, 0x072714fe, 0x082713fe,
0x092812fd, 0x0a2811fd, 0x0b2810fd, 0x0c280ffd,
0xfd0f250f, 0xfd10250e, 0xfd11250d, 0xfd12250c,
0xfd13250b, 0xfe13250a, 0xfe152409, 0xfe162408,
0xfe172308, 0xff182306, 0xff192305, 0xff1a2205,
0x001b2104, 0x001c2103, 0x001d2003, 0x011e1f02,
0x011f1f01, 0x021f1e01, 0x03201d00, 0x03211c00,
0x04211b00, 0x05221aff, 0x062219ff, 0x062318ff,
0x082316ff, 0x082316ff, 0x092415fe, 0x0a2414fe,
0x0b2413fe, 0x0c2412fe, 0x0d2411fe, 0x0e2410fe,
0xfe10230f, 0xfe11230e, 0xfe12220e, 0xfe13220d,
0xfe14220c, 0xff14220b, 0xff15220a, 0xff16210a,
0x00162109, 0x00172108, 0x00182008, 0x01192006,
0x011a1f06, 0x021a1f05, 0x021b1e05, 0x031c1d04,
0x031d1d03, 0x041d1c03, 0x041e1b03, 0x051e1b02,
0x061f1a01, 0x06201901, 0x07201801, 0x08201800,
0x09201700, 0x0a211500, 0x0b2115ff, 0x0c2114ff,
0x0c2213ff, 0x0d2212ff, 0x0e2211ff, 0x0f2211fe,
0xff112010, 0xff12200f, 0xff12200f, 0xff13200e,
0x0013200d, 0x0014200c, 0x00151f0c, 0x00161f0b,
0x01161f0a, 0x01171e0a, 0x02171e09, 0x02181e08,
0x03191d07, 0x03191d07, 0x041a1c06, 0x041b1c05,
0x051b1b05, 0x051c1b04, 0x061c1a04, 0x071c1a03,
0x071d1903, 0x081e1802, 0x091d1802, 0x091e1702,
0x0a1f1601, 0x0b1f1600, 0x0b1f1501, 0x0c201400,
0x0d1f1400, 0x0e2013ff, 0x0f1f1200, 0x102011ff,
0x00111f10, 0x00121e10, 0x00131e0f, 0x00131e0f,
0x01131e0e, 0x01141e0d, 0x01151d0d, 0x02151d0c,
0x02161d0b, 0x03161d0a, 0x03171c0a, 0x04171c09,
0x04181c08, 0x05181b08, 0x05191b07, 0x06191a07,
0x061a1a06, 0x071a1906, 0x071b1905, 0x081b1805,
0x081c1804, 0x091c1704, 0x0a1c1703, 0x0a1d1603,
0x0b1d1602, 0x0c1d1502, 0x0c1d1502, 0x0d1e1401,
0x0e1d1401, 0x0e1e1301, 0x0f1e1300, 0x101e1200,
0x02111c11, 0x02121c10, 0x02131b10, 0x03131b0f,
0x03131b0f, 0x03141b0e, 0x04141b0d, 0x04151a0d,
0x05151a0c, 0x05151a0c, 0x05161a0b, 0x0616190b,
0x0616190b, 0x0716190a, 0x0717180a, 0x08171809,
0x08181808, 0x09181708, 0x09181708, 0x0a181707,
0x0a191607, 0x0b191606, 0x0b1a1605, 0x0c1a1505,
0x0c1a1505, 0x0d1a1504, 0x0d1b1404, 0x0e1b1403,
0x0f1b1303, 0x0f1b1303, 0x101b1302, 0x101c1202,
0x04111a11, 0x04121911, 0x04131910, 0x0513190f,
0x0513190f, 0x0513190f, 0x0613190e, 0x0614180e,
0x0714180d, 0x0714180d, 0x0715180c, 0x0814180c,
0x0815170c, 0x0816170b, 0x0916170a, 0x0916170a,
0x0a16160a, 0x0a171609, 0x0a171609, 0x0b171608,
0x0b171509, 0x0c171508, 0x0c181507, 0x0d171507,
0x0d181407, 0x0e181406, 0x0e181406, 0x0e191306,
0x0f191305, 0x0f191305, 0x10191304, 0x10191205,
0x05121811, 0x06121810, 0x06121810, 0x06131710,
0x0713170f, 0x0713170f, 0x0713170f, 0x0813170e,
0x0813170e, 0x0814170d, 0x0914160d, 0x0914160d,
0x0914160d, 0x0a14160c, 0x0a15160b, 0x0a15150c,
0x0b15150b, 0x0b15150b, 0x0b16150a, 0x0c15150a,
0x0c16140a, 0x0d161409, 0x0d161409, 0x0d171408,
0x0e161408, 0x0e171308, 0x0e171308, 0x0f171307,
0x0f171307, 0x10171306, 0x10181206, 0x10181206,
0x07111711, 0x07121710, 0x07121611, 0x08121610,
0x08121610, 0x0813160f, 0x0912160f, 0x0913160e,
0x0913160e, 0x0913160e, 0x0a14150d, 0x0a14150d,
0x0a14150d, 0x0b14150c, 0x0b14150c, 0x0b14150c,
0x0c14140c, 0x0c15140b, 0x0c15140b, 0x0c15140b,
0x0d15140a, 0x0d15140a, 0x0d15140a, 0x0e161309,
0x0e161309, 0x0e161309, 0x0f151309, 0x0f161308,
0x0f161209, 0x10161208, 0x10161208, 0x10171207,
0x0a111411, 0x0b111410, 0x0b111410, 0x0b111410,
0x0b111410, 0x0b12140f, 0x0b12140f, 0x0c12130f,
0x0c12130f, 0x0c12130f, 0x0c12130f, 0x0c12130f,
0x0d12130e, 0x0d12130e, 0x0d12130e, 0x0d13130d,
0x0d13130d, 0x0d13130d, 0x0e12130d, 0x0e13120d,
0x0e13120d, 0x0e13120d, 0x0e13120d, 0x0f13120c,
0x0f13120c, 0x0f13120c, 0x0f14120b, 0x0f14120b,
0x1013120b, 0x1013120b, 0x1013120b, 0x1014110b,
0x0c111310, 0x0c111310, 0x0c111310, 0x0d101310,
0x0d101310, 0x0d111210, 0x0d111210, 0x0d111210,
0x0d12120f, 0x0d12120f, 0x0d12120f, 0x0d12120f,
0x0e11120f, 0x0e12120e, 0x0e12120e, 0x0e12120e,
0x0e12120e, 0x0e12120e, 0x0e12120e, 0x0e12120e,
0x0f11120e, 0x0f12120d, 0x0f12120d, 0x0f12120d,
0x0f12120d, 0x0f12110e, 0x0f12110e, 0x0f12110e,
0x1012110d, 0x1012110d, 0x1013110c, 0x1013110c,
};
static int sun8i_vi_scaler_coef_index(unsigned int step) static int sun8i_vi_scaler_coef_index(unsigned int step)
{ {
unsigned int scale, int_part, float_part; unsigned int scale, int_part, float_part;
@ -447,10 +858,22 @@ static int sun8i_vi_scaler_coef_index(unsigned int step)
} }
static void sun8i_vi_scaler_set_coeff(struct regmap *map, int layer, static void sun8i_vi_scaler_set_coeff(struct regmap *map, int layer,
u32 hstep, u32 vstep) u32 hstep, u32 vstep,
const struct drm_format_info *format)
{ {
const u32 *ch_left, *ch_right, *cy;
int offset, i; int offset, i;
if (format->hsub == 1 && format->vsub == 1) {
ch_left = lan3coefftab32_left;
ch_right = lan3coefftab32_right;
cy = lan2coefftab32;
} else {
ch_left = bicubic8coefftab32_left;
ch_right = bicubic8coefftab32_right;
cy = bicubic4coefftab32;
}
offset = sun8i_vi_scaler_coef_index(hstep) * offset = sun8i_vi_scaler_coef_index(hstep) *
SUN8I_VI_SCALER_COEFF_COUNT; SUN8I_VI_SCALER_COEFF_COUNT;
for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) { for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
@ -459,9 +882,9 @@ static void sun8i_vi_scaler_set_coeff(struct regmap *map, int layer,
regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF1(layer, i), regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF1(layer, i),
lan3coefftab32_right[offset + i]); lan3coefftab32_right[offset + i]);
regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF0(layer, i), regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF0(layer, i),
lan3coefftab32_left[offset + i]); ch_left[offset + i]);
regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF1(layer, i), regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF1(layer, i),
lan3coefftab32_right[offset + i]); ch_right[offset + i]);
} }
offset = sun8i_vi_scaler_coef_index(hstep) * offset = sun8i_vi_scaler_coef_index(hstep) *
@ -470,7 +893,7 @@ static void sun8i_vi_scaler_set_coeff(struct regmap *map, int layer,
regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(layer, i), regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(layer, i),
lan2coefftab32[offset + i]); lan2coefftab32[offset + i]);
regmap_write(map, SUN8I_SCALER_VSU_CVCOEFF(layer, i), regmap_write(map, SUN8I_SCALER_VSU_CVCOEFF(layer, i),
lan2coefftab32[offset + i]); cy[offset + i]);
} }
} }
@ -489,7 +912,8 @@ void sun8i_vi_scaler_enable(struct sun8i_mixer *mixer, int layer, bool enable)
void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer, void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
u32 src_w, u32 src_h, u32 dst_w, u32 dst_h, u32 src_w, u32 src_h, u32 dst_w, u32 dst_h,
u32 hscale, u32 vscale, u32 hphase, u32 vphase) u32 hscale, u32 vscale, u32 hphase, u32 vphase,
const struct drm_format_info *format)
{ {
u32 chphase, cvphase; u32 chphase, cvphase;
u32 insize, outsize; u32 insize, outsize;
@ -502,8 +926,19 @@ void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
insize = SUN8I_VI_SCALER_SIZE(src_w, src_h); insize = SUN8I_VI_SCALER_SIZE(src_w, src_h);
outsize = SUN8I_VI_SCALER_SIZE(dst_w, dst_h); outsize = SUN8I_VI_SCALER_SIZE(dst_w, dst_h);
chphase = hphase; /*
cvphase = vphase; * This is chroma V/H phase calculation as it appears in
* BSP driver. There is no detailed explanation. YUV 420
* chroma is threated specialy for some reason.
*/
if (format->hsub == 2 && format->vsub == 2) {
chphase = hphase >> 1;
cvphase = (vphase >> 1) -
(1UL << (SUN8I_VI_SCALER_SCALE_FRAC - 2));
} else {
chphase = hphase;
cvphase = vphase;
}
regmap_write(mixer->engine.regs, regmap_write(mixer->engine.regs,
SUN8I_SCALER_VSU_OUTSIZE(layer), outsize); SUN8I_SCALER_VSU_OUTSIZE(layer), outsize);
@ -519,17 +954,18 @@ void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
SUN8I_SCALER_VSU_YVPHASE(layer), vphase); SUN8I_SCALER_VSU_YVPHASE(layer), vphase);
regmap_write(mixer->engine.regs, regmap_write(mixer->engine.regs,
SUN8I_SCALER_VSU_CINSIZE(layer), SUN8I_SCALER_VSU_CINSIZE(layer),
SUN8I_VI_SCALER_SIZE(src_w, src_h)); SUN8I_VI_SCALER_SIZE(src_w / format->hsub,
src_h / format->vsub));
regmap_write(mixer->engine.regs, regmap_write(mixer->engine.regs,
SUN8I_SCALER_VSU_CHSTEP(layer), SUN8I_SCALER_VSU_CHSTEP(layer),
hscale); hscale / format->hsub);
regmap_write(mixer->engine.regs, regmap_write(mixer->engine.regs,
SUN8I_SCALER_VSU_CVSTEP(layer), SUN8I_SCALER_VSU_CVSTEP(layer),
vscale); vscale / format->vsub);
regmap_write(mixer->engine.regs, regmap_write(mixer->engine.regs,
SUN8I_SCALER_VSU_CHPHASE(layer), chphase); SUN8I_SCALER_VSU_CHPHASE(layer), chphase);
regmap_write(mixer->engine.regs, regmap_write(mixer->engine.regs,
SUN8I_SCALER_VSU_CVPHASE(layer), cvphase); SUN8I_SCALER_VSU_CVPHASE(layer), cvphase);
sun8i_vi_scaler_set_coeff(mixer->engine.regs, layer, sun8i_vi_scaler_set_coeff(mixer->engine.regs, layer,
hscale, vscale); hscale, vscale, format);
} }

View File

@ -9,6 +9,7 @@
#ifndef _SUN8I_VI_SCALER_H_ #ifndef _SUN8I_VI_SCALER_H_
#define _SUN8I_VI_SCALER_H_ #define _SUN8I_VI_SCALER_H_
#include <drm/drm_fourcc.h>
#include "sun8i_mixer.h" #include "sun8i_mixer.h"
/* this two macros assumes 16 fractional bits which is standard in DRM */ /* this two macros assumes 16 fractional bits which is standard in DRM */
@ -51,6 +52,7 @@
void sun8i_vi_scaler_enable(struct sun8i_mixer *mixer, int layer, bool enable); void sun8i_vi_scaler_enable(struct sun8i_mixer *mixer, int layer, bool enable);
void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer, void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
u32 src_w, u32 src_h, u32 dst_w, u32 dst_h, u32 src_w, u32 src_h, u32 dst_w, u32 dst_h,
u32 hscale, u32 vscale, u32 hphase, u32 vphase); u32 hscale, u32 vscale, u32 hphase, u32 vphase,
const struct drm_format_info *format);
#endif #endif