1*5639be33Sskrll /* $NetBSD: sunxi_mixer.c,v 1.19 2022/06/28 05:19:03 skrll Exp $ */
2a9d03646Sjmcneill
3a9d03646Sjmcneill /*-
4a9d03646Sjmcneill * Copyright (c) 2019 Jared D. McNeill <jmcneill@invisible.ca>
5a9d03646Sjmcneill * All rights reserved.
6a9d03646Sjmcneill *
7a9d03646Sjmcneill * Redistribution and use in source and binary forms, with or without
8a9d03646Sjmcneill * modification, are permitted provided that the following conditions
9a9d03646Sjmcneill * are met:
10a9d03646Sjmcneill * 1. Redistributions of source code must retain the above copyright
11a9d03646Sjmcneill * notice, this list of conditions and the following disclaimer.
12a9d03646Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright
13a9d03646Sjmcneill * notice, this list of conditions and the following disclaimer in the
14a9d03646Sjmcneill * documentation and/or other materials provided with the distribution.
15a9d03646Sjmcneill *
16a9d03646Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17a9d03646Sjmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18a9d03646Sjmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19a9d03646Sjmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20a9d03646Sjmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21a9d03646Sjmcneill * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22a9d03646Sjmcneill * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23a9d03646Sjmcneill * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24a9d03646Sjmcneill * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25a9d03646Sjmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26a9d03646Sjmcneill * SUCH DAMAGE.
27a9d03646Sjmcneill */
28a9d03646Sjmcneill
29a9d03646Sjmcneill #include <sys/cdefs.h>
30*5639be33Sskrll __KERNEL_RCSID(0, "$NetBSD: sunxi_mixer.c,v 1.19 2022/06/28 05:19:03 skrll Exp $");
31a9d03646Sjmcneill
32a9d03646Sjmcneill #include <sys/param.h>
33a9d03646Sjmcneill #include <sys/bus.h>
34dd47db3eSriastradh #include <sys/conf.h>
35a9d03646Sjmcneill #include <sys/device.h>
36a9d03646Sjmcneill #include <sys/intr.h>
37a9d03646Sjmcneill #include <sys/kernel.h>
38afcdf04fSjmcneill #include <sys/sysctl.h>
39dd47db3eSriastradh #include <sys/systm.h>
40a9d03646Sjmcneill
41dd47db3eSriastradh #include <dev/fdt/fdt_port.h>
42dd47db3eSriastradh #include <dev/fdt/fdtvar.h>
43dd47db3eSriastradh
44dd47db3eSriastradh #include <arm/sunxi/sunxi_drm.h>
45dd47db3eSriastradh
46a9d03646Sjmcneill #include <drm/drm_crtc.h>
47a9d03646Sjmcneill #include <drm/drm_crtc_helper.h>
48dd47db3eSriastradh #include <drm/drm_drv.h>
493973e774Sriastradh #include <drm/drm_fourcc.h>
50a9d03646Sjmcneill #include <drm/drm_plane_helper.h>
513973e774Sriastradh #include <drm/drm_vblank.h>
52a9d03646Sjmcneill
53afcdf04fSjmcneill #define MIXER_CURSOR_MAXWIDTH 256
54afcdf04fSjmcneill #define MIXER_CURSOR_MAXHEIGHT 256
55afcdf04fSjmcneill
56a9d03646Sjmcneill #define SUNXI_MIXER_FREQ 432000000
57a9d03646Sjmcneill
58a9d03646Sjmcneill #define GLB_BASE 0x00000
59a9d03646Sjmcneill #define BLD_BASE 0x01000
60a9d03646Sjmcneill #define OVL_BASE(n) (0x02000 + (n) * 0x1000)
61480d8f6aSjmcneill #define VSU_BASE 0x20000
62480d8f6aSjmcneill #define CSC_BASE(n) ((n) == 0 ? 0xaa050 : 0xa0000)
63a9d03646Sjmcneill
64a9d03646Sjmcneill /* GLB registers */
65a9d03646Sjmcneill #define GLB_CTL 0x000
66a9d03646Sjmcneill #define GLB_CTL_EN __BIT(0)
67a9d03646Sjmcneill #define GLB_STS 0x004
68a9d03646Sjmcneill #define GLB_DBUFFER 0x008
69a9d03646Sjmcneill #define GLB_DBUFFER_DOUBLE_BUFFER_RDY __BIT(0)
70a9d03646Sjmcneill #define GLB_SIZE 0x00c
71a9d03646Sjmcneill
72a9d03646Sjmcneill /* BLD registers */
73a9d03646Sjmcneill #define BLD_FILL_COLOR_CTL 0x000
74afcdf04fSjmcneill #define BLD_FILL_COLOR_CTL_P3_EN __BIT(11)
75afcdf04fSjmcneill #define BLD_FILL_COLOR_CTL_P2_EN __BIT(10)
764f58e2b4Sjmcneill #define BLD_FILL_COLOR_CTL_P1_EN __BIT(9)
77a9d03646Sjmcneill #define BLD_FILL_COLOR_CTL_P0_EN __BIT(8)
78afcdf04fSjmcneill #define BLD_FILL_COLOR_CTL_P3_FCEN __BIT(3)
79afcdf04fSjmcneill #define BLD_FILL_COLOR_CTL_P2_FCEN __BIT(2)
80afcdf04fSjmcneill #define BLD_FILL_COLOR_CTL_P1_FCEN __BIT(1)
81afcdf04fSjmcneill #define BLD_FILL_COLOR_CTL_P0_FCEN __BIT(0)
82afcdf04fSjmcneill #define BLD_FILL_COLOR(n) (0x004 + (n) * 0x10)
83a9d03646Sjmcneill #define BLD_CH_ISIZE(n) (0x008 + (n) * 0x10)
84a9d03646Sjmcneill #define BLD_CH_OFFSET(n) (0x00c + (n) * 0x10)
85a9d03646Sjmcneill #define BLD_CH_RTCTL 0x080
86afcdf04fSjmcneill #define BLD_CH_RTCTL_P3 __BITS(15,12)
87afcdf04fSjmcneill #define BLD_CH_RTCTL_P2 __BITS(11,8)
884f58e2b4Sjmcneill #define BLD_CH_RTCTL_P1 __BITS(7,4)
89a9d03646Sjmcneill #define BLD_CH_RTCTL_P0 __BITS(3,0)
90a9d03646Sjmcneill #define BLD_SIZE 0x08c
91a9d03646Sjmcneill #define BLD_CTL(n) (0x090 + (n) * 0x04)
92a9d03646Sjmcneill
934f58e2b4Sjmcneill /* OVL_V registers */
944f58e2b4Sjmcneill #define OVL_V_ATTCTL(n) (0x000 + (n) * 0x30)
954f58e2b4Sjmcneill #define OVL_V_ATTCTL_VIDEO_UI_SEL __BIT(15)
964f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT __BITS(12,8)
974f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_VYUY 0x00
984f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_YVYU 0x01
994f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_UYVY 0x02
1004f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_YUYV 0x03
1014f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_YUV422 0x06
1024f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_YUV420 0x0a
1034f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_YUV411 0x0e
1040834f123Sjmcneill #if BYTE_ORDER == BIG_ENDIAN
1050834f123Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_ARGB_8888 0x03
1060834f123Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_XRGB_8888 0x07
1070834f123Sjmcneill #else
108afcdf04fSjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_ARGB_8888 0x00
1094f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY_FBFMT_XRGB_8888 0x04
1100834f123Sjmcneill #endif
1114f58e2b4Sjmcneill #define OVL_V_ATTCTL_LAY0_EN __BIT(0)
1124f58e2b4Sjmcneill #define OVL_V_MBSIZE(n) (0x004 + (n) * 0x30)
1134f58e2b4Sjmcneill #define OVL_V_COOR(n) (0x008 + (n) * 0x30)
1144f58e2b4Sjmcneill #define OVL_V_PITCH0(n) (0x00c + (n) * 0x30)
1154f58e2b4Sjmcneill #define OVL_V_PITCH1(n) (0x010 + (n) * 0x30)
1164f58e2b4Sjmcneill #define OVL_V_PITCH2(n) (0x014 + (n) * 0x30)
1174f58e2b4Sjmcneill #define OVL_V_TOP_LADD0(n) (0x018 + (n) * 0x30)
1184f58e2b4Sjmcneill #define OVL_V_TOP_LADD1(n) (0x01c + (n) * 0x30)
1194f58e2b4Sjmcneill #define OVL_V_TOP_LADD2(n) (0x020 + (n) * 0x30)
1204f58e2b4Sjmcneill #define OVL_V_FILL_COLOR(n) (0x0c0 + (n) * 0x4)
1214f58e2b4Sjmcneill #define OVL_V_TOP_HADD0 0x0d0
1224f58e2b4Sjmcneill #define OVL_V_TOP_HADD1 0x0d4
1234f58e2b4Sjmcneill #define OVL_V_TOP_HADD2 0x0d8
1244f58e2b4Sjmcneill #define OVL_V_TOP_HADD_LAYER0 __BITS(7,0)
1254f58e2b4Sjmcneill #define OVL_V_SIZE 0x0e8
1264f58e2b4Sjmcneill #define OVL_V_HDS_CTL0 0x0f0
1274f58e2b4Sjmcneill #define OVL_V_HDS_CTL1 0x0f4
1284f58e2b4Sjmcneill #define OVL_V_VDS_CTL0 0x0f8
1294f58e2b4Sjmcneill #define OVL_V_VDS_CTL1 0x0fc
1304f58e2b4Sjmcneill
131a9d03646Sjmcneill /* OVL_UI registers */
132a9d03646Sjmcneill #define OVL_UI_ATTR_CTL(n) (0x000 + (n) * 0x20)
133a9d03646Sjmcneill #define OVL_UI_ATTR_CTL_LAY_FBFMT __BITS(12,8)
1340834f123Sjmcneill #if BYTE_ORDER == BIG_ENDIAN
1350834f123Sjmcneill #define OVL_UI_ATTR_CTL_LAY_FBFMT_ARGB_8888 0x03
1360834f123Sjmcneill #define OVL_UI_ATTR_CTL_LAY_FBFMT_XRGB_8888 0x07
1370834f123Sjmcneill #else
138afcdf04fSjmcneill #define OVL_UI_ATTR_CTL_LAY_FBFMT_ARGB_8888 0x00
139a9d03646Sjmcneill #define OVL_UI_ATTR_CTL_LAY_FBFMT_XRGB_8888 0x04
1400834f123Sjmcneill #endif
141a9d03646Sjmcneill #define OVL_UI_ATTR_CTL_LAY_EN __BIT(0)
142a9d03646Sjmcneill #define OVL_UI_MBSIZE(n) (0x004 + (n) * 0x20)
143a9d03646Sjmcneill #define OVL_UI_COOR(n) (0x008 + (n) * 0x20)
144a9d03646Sjmcneill #define OVL_UI_PITCH(n) (0x00c + (n) * 0x20)
145a9d03646Sjmcneill #define OVL_UI_TOP_LADD(n) (0x010 + (n) * 0x20)
146afcdf04fSjmcneill #define OVL_UI_FILL_COLOR(n) (0x018 + (n) * 0x20)
147a9d03646Sjmcneill #define OVL_UI_TOP_HADD 0x080
148afcdf04fSjmcneill #define OVL_UI_TOP_HADD_LAYER1 __BITS(15,8)
149a9d03646Sjmcneill #define OVL_UI_TOP_HADD_LAYER0 __BITS(7,0)
150a9d03646Sjmcneill #define OVL_UI_SIZE 0x088
151a9d03646Sjmcneill
152480d8f6aSjmcneill /* VSU registers */
153480d8f6aSjmcneill #define VS_CTRL_REG 0x000
154480d8f6aSjmcneill #define VS_CTRL_COEF_SWITCH_EN __BIT(4)
155480d8f6aSjmcneill #define VS_CTRL_EN __BIT(0)
156480d8f6aSjmcneill #define VS_STATUS_REG 0x008
157480d8f6aSjmcneill #define VS_FIELD_CTRL_REG 0x00c
158480d8f6aSjmcneill #define VS_OUT_SIZE_REG 0x040
159480d8f6aSjmcneill #define VS_Y_SIZE_REG 0x080
160480d8f6aSjmcneill #define VS_Y_HSTEP_REG 0x088
161480d8f6aSjmcneill #define VS_Y_VSTEP_REG 0x08c
162480d8f6aSjmcneill #define VS_Y_HPHASE_REG 0x090
163480d8f6aSjmcneill #define VS_Y_VPHASE0_REG 0x098
164480d8f6aSjmcneill #define VS_Y_VPHASE1_REG 0x09c
165480d8f6aSjmcneill #define VS_C_SIZE_REG 0x0c0
166480d8f6aSjmcneill #define VS_C_HSTEP_REG 0x0c8
167480d8f6aSjmcneill #define VS_C_VSTEP_REG 0x0cc
168480d8f6aSjmcneill #define VS_C_HPHASE_REG 0x0d0
169480d8f6aSjmcneill #define VS_C_VPHASE0_REG 0x0d8
170480d8f6aSjmcneill #define VS_C_VPHASE1_REG 0x0dc
171480d8f6aSjmcneill #define VS_Y_HCOEF0_REG(n) (0x200 + (n) * 0x4)
172480d8f6aSjmcneill #define VS_Y_HCOEF1_REG(n) (0x300 + (n) * 0x4)
173480d8f6aSjmcneill #define VS_Y_VCOEF_REG(n) (0x400 + (n) * 0x4)
174480d8f6aSjmcneill #define VS_C_HCOEF0_REG(n) (0x600 + (n) * 0x4)
175480d8f6aSjmcneill #define VS_C_HCOEF1_REG(n) (0x700 + (n) * 0x4)
176480d8f6aSjmcneill #define VS_C_VCOEF_REG(n) (0x800 + (n) * 0x4)
177480d8f6aSjmcneill
178480d8f6aSjmcneill /* CSC registers */
179480d8f6aSjmcneill #define CSC_BYPASS_REG 0x000
180480d8f6aSjmcneill #define CSC_BYPASS_DISABLE __BIT(0)
181480d8f6aSjmcneill #define CSC_COEFF0_REG(n) (0x10 + 0x10 * (n))
182480d8f6aSjmcneill #define GLB_ALPHA_REG 0x040
183480d8f6aSjmcneill
184a9d03646Sjmcneill enum {
185a9d03646Sjmcneill MIXER_PORT_OUTPUT = 1,
186a9d03646Sjmcneill };
187a9d03646Sjmcneill
188b23f4a3aSjakllsch struct sunxi_mixer_compat_data {
189b23f4a3aSjakllsch uint8_t ovl_ui_count;
190b23f4a3aSjakllsch uint8_t mixer_index;
191b23f4a3aSjakllsch };
192b23f4a3aSjakllsch
193b23f4a3aSjakllsch struct sunxi_mixer_compat_data mixer0_data = {
194b23f4a3aSjakllsch .ovl_ui_count = 3,
195b23f4a3aSjakllsch .mixer_index = 0,
196b23f4a3aSjakllsch };
197b23f4a3aSjakllsch
198b23f4a3aSjakllsch struct sunxi_mixer_compat_data mixer1_data = {
199b23f4a3aSjakllsch .ovl_ui_count = 1,
200b23f4a3aSjakllsch .mixer_index = 1,
201b23f4a3aSjakllsch };
202b23f4a3aSjakllsch
203646c0f59Sthorpej static const struct device_compatible_entry compat_data[] = {
204646c0f59Sthorpej { .compat = "allwinner,sun8i-h3-de2-mixer-0",
205646c0f59Sthorpej .data = &mixer0_data },
206*5639be33Sskrll { .compat = "allwinner,sun8i-v3s-de2-mixer",
207*5639be33Sskrll .data = &mixer0_data },
208646c0f59Sthorpej { .compat = "allwinner,sun50i-a64-de2-mixer-0",
209646c0f59Sthorpej .data = &mixer0_data },
210646c0f59Sthorpej { .compat = "allwinner,sun50i-a64-de2-mixer-1",
211646c0f59Sthorpej .data = &mixer1_data },
212646c0f59Sthorpej
213ec189949Sthorpej DEVICE_COMPAT_EOL
214a9d03646Sjmcneill };
215a9d03646Sjmcneill
216a9d03646Sjmcneill struct sunxi_mixer_softc;
217a9d03646Sjmcneill
218a9d03646Sjmcneill struct sunxi_mixer_crtc {
219a9d03646Sjmcneill struct drm_crtc base;
220a9d03646Sjmcneill struct sunxi_mixer_softc *sc;
221a9d03646Sjmcneill };
222a9d03646Sjmcneill
223afcdf04fSjmcneill struct sunxi_mixer_plane {
2244f58e2b4Sjmcneill struct drm_plane base;
2254f58e2b4Sjmcneill struct sunxi_mixer_softc *sc;
2264f58e2b4Sjmcneill };
2274f58e2b4Sjmcneill
228a9d03646Sjmcneill struct sunxi_mixer_softc {
229a9d03646Sjmcneill device_t sc_dev;
230a9d03646Sjmcneill bus_space_tag_t sc_bst;
231a9d03646Sjmcneill bus_space_handle_t sc_bsh;
232a9d03646Sjmcneill int sc_phandle;
233a9d03646Sjmcneill
234afcdf04fSjmcneill u_int sc_ovl_ui_count;
235afcdf04fSjmcneill
236a9d03646Sjmcneill struct sunxi_mixer_crtc sc_crtc;
237afcdf04fSjmcneill struct sunxi_mixer_plane sc_overlay;
238a9d03646Sjmcneill
239a9d03646Sjmcneill struct fdt_device_ports sc_ports;
240a9d03646Sjmcneill };
241a9d03646Sjmcneill
242a9d03646Sjmcneill #define GLB_READ(sc, reg) \
243a9d03646Sjmcneill bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, GLB_BASE + (reg))
244a9d03646Sjmcneill #define GLB_WRITE(sc, reg, val) \
245a9d03646Sjmcneill bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, GLB_BASE + (reg), (val))
246a9d03646Sjmcneill
247a9d03646Sjmcneill #define BLD_READ(sc, reg) \
248a9d03646Sjmcneill bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, BLD_BASE + (reg))
249a9d03646Sjmcneill #define BLD_WRITE(sc, reg, val) \
250a9d03646Sjmcneill bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, BLD_BASE + (reg), (val))
251a9d03646Sjmcneill
2524f58e2b4Sjmcneill #define OVL_V_READ(sc, reg) \
253afcdf04fSjmcneill bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, OVL_BASE(0) + (reg))
2544f58e2b4Sjmcneill #define OVL_V_WRITE(sc, reg, val) \
255afcdf04fSjmcneill bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, OVL_BASE(0) + (reg), (val))
2564f58e2b4Sjmcneill
257afcdf04fSjmcneill #define OVL_UI_READ(sc, n, reg) \
258afcdf04fSjmcneill bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, OVL_BASE((n) + 1) + (reg))
259afcdf04fSjmcneill #define OVL_UI_WRITE(sc, n, reg, val) \
260afcdf04fSjmcneill bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, OVL_BASE((n) + 1) + (reg), (val))
261a9d03646Sjmcneill
262480d8f6aSjmcneill #define VSU_READ(sc, reg) \
263480d8f6aSjmcneill bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, VSU_BASE + (reg))
264480d8f6aSjmcneill #define VSU_WRITE(sc, reg, val) \
265480d8f6aSjmcneill bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, VSU_BASE + (reg), (val))
266480d8f6aSjmcneill
267480d8f6aSjmcneill #define CSC_READ(sc, n, reg) \
268480d8f6aSjmcneill bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, CSC_BASE(n) + (reg))
269480d8f6aSjmcneill #define CSC_WRITE(sc, n, reg, val) \
270480d8f6aSjmcneill bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, CSC_BASE(n) + (reg), (val))
271480d8f6aSjmcneill
272a9d03646Sjmcneill #define to_sunxi_mixer_crtc(x) container_of(x, struct sunxi_mixer_crtc, base)
273afcdf04fSjmcneill #define to_sunxi_mixer_plane(x) container_of(x, struct sunxi_mixer_plane, base)
274a9d03646Sjmcneill
275a9d03646Sjmcneill static int
sunxi_mixer_mode_do_set_base(struct drm_crtc * crtc,struct drm_framebuffer * fb,int x,int y,int atomic)276a9d03646Sjmcneill sunxi_mixer_mode_do_set_base(struct drm_crtc *crtc, struct drm_framebuffer *fb,
277a9d03646Sjmcneill int x, int y, int atomic)
278a9d03646Sjmcneill {
279a9d03646Sjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
280a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
281a9d03646Sjmcneill struct sunxi_drm_framebuffer *sfb = atomic?
282a9d03646Sjmcneill to_sunxi_drm_framebuffer(fb) :
283a9d03646Sjmcneill to_sunxi_drm_framebuffer(crtc->primary->fb);
284afcdf04fSjmcneill uint32_t val;
285a9d03646Sjmcneill
286a9d03646Sjmcneill uint64_t paddr = (uint64_t)sfb->obj->dmamap->dm_segs[0].ds_addr;
287a9d03646Sjmcneill
288677e8e03Sjmcneill paddr += y * sfb->base.pitches[0];
2893973e774Sriastradh paddr += x * sfb->base.format->cpp[0];
290677e8e03Sjmcneill
291a9d03646Sjmcneill uint32_t haddr = (paddr >> 32) & OVL_UI_TOP_HADD_LAYER0;
292a9d03646Sjmcneill uint32_t laddr = paddr & 0xffffffff;
293a9d03646Sjmcneill
2947de6f600Sjmcneill /* Set UI overlay line size */
2957de6f600Sjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_PITCH(0), sfb->base.pitches[0]);
2967de6f600Sjmcneill
297a9d03646Sjmcneill /* Framebuffer start address */
298afcdf04fSjmcneill val = OVL_UI_READ(sc, 0, OVL_UI_TOP_HADD);
299afcdf04fSjmcneill val &= ~OVL_UI_TOP_HADD_LAYER0;
300afcdf04fSjmcneill val |= __SHIFTIN(haddr, OVL_UI_TOP_HADD_LAYER0);
301afcdf04fSjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_TOP_HADD, val);
302afcdf04fSjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_TOP_LADD(0), laddr);
303a9d03646Sjmcneill
304a9d03646Sjmcneill return 0;
305a9d03646Sjmcneill }
306a9d03646Sjmcneill
3078dda12afSjmcneill static void
sunxi_mixer_destroy(struct drm_crtc * crtc)3088dda12afSjmcneill sunxi_mixer_destroy(struct drm_crtc *crtc)
3098dda12afSjmcneill {
3108dda12afSjmcneill drm_crtc_cleanup(crtc);
3118dda12afSjmcneill }
3128dda12afSjmcneill
3138dda12afSjmcneill static int
sunxi_mixer_page_flip(struct drm_crtc * crtc,struct drm_framebuffer * fb,struct drm_pending_vblank_event * event,uint32_t flags,struct drm_modeset_acquire_ctx * ctx)3148dda12afSjmcneill sunxi_mixer_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
3153973e774Sriastradh struct drm_pending_vblank_event *event, uint32_t flags,
3163973e774Sriastradh struct drm_modeset_acquire_ctx *ctx)
3178dda12afSjmcneill {
3188dda12afSjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
3198dda12afSjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
3208dda12afSjmcneill unsigned long irqflags;
3218dda12afSjmcneill
3228dda12afSjmcneill drm_crtc_wait_one_vblank(crtc);
3238dda12afSjmcneill
3248dda12afSjmcneill sunxi_mixer_mode_do_set_base(crtc, fb, 0, 0, true);
3258dda12afSjmcneill
3268dda12afSjmcneill /* Commit settings */
3278dda12afSjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
3288dda12afSjmcneill
3298dda12afSjmcneill if (event) {
3308dda12afSjmcneill spin_lock_irqsave(&crtc->dev->event_lock, irqflags);
3313973e774Sriastradh drm_crtc_send_vblank_event(crtc, event);
3328dda12afSjmcneill spin_unlock_irqrestore(&crtc->dev->event_lock, irqflags);
3338dda12afSjmcneill }
3348dda12afSjmcneill
3358dda12afSjmcneill return 0;
3368dda12afSjmcneill }
3378dda12afSjmcneill
338afcdf04fSjmcneill static int
sunxi_mixer_cursor_set(struct drm_crtc * crtc,struct drm_file * file_priv,uint32_t handle,uint32_t width,uint32_t height)339afcdf04fSjmcneill sunxi_mixer_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
340afcdf04fSjmcneill uint32_t handle, uint32_t width, uint32_t height)
341afcdf04fSjmcneill {
342afcdf04fSjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
343afcdf04fSjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
344afcdf04fSjmcneill struct drm_gem_object *gem_obj = NULL;
345afcdf04fSjmcneill struct drm_gem_cma_object *obj;
346afcdf04fSjmcneill uint32_t val;
347afcdf04fSjmcneill int error;
348afcdf04fSjmcneill
349afcdf04fSjmcneill /* Only mixers with more than one UI layer can support hardware cursors */
350afcdf04fSjmcneill if (sc->sc_ovl_ui_count <= 1)
351afcdf04fSjmcneill return -EINVAL;
352afcdf04fSjmcneill
353afcdf04fSjmcneill if (handle == 0) {
354afcdf04fSjmcneill val = BLD_READ(sc, BLD_FILL_COLOR_CTL);
355afcdf04fSjmcneill val &= ~BLD_FILL_COLOR_CTL_P2_EN;
356afcdf04fSjmcneill val |= BLD_FILL_COLOR_CTL_P2_FCEN;
357afcdf04fSjmcneill BLD_WRITE(sc, BLD_FILL_COLOR_CTL, val);
358afcdf04fSjmcneill
359afcdf04fSjmcneill error = 0;
360afcdf04fSjmcneill goto done;
361afcdf04fSjmcneill }
362afcdf04fSjmcneill
363afcdf04fSjmcneill /* Arbitrary limits, the hardware layer can do 8192x8192 */
364afcdf04fSjmcneill if (width > MIXER_CURSOR_MAXWIDTH || height > MIXER_CURSOR_MAXHEIGHT) {
365afcdf04fSjmcneill DRM_ERROR("Cursor dimension %ux%u not supported\n", width, height);
366afcdf04fSjmcneill error = -EINVAL;
367afcdf04fSjmcneill goto done;
368afcdf04fSjmcneill }
369afcdf04fSjmcneill
3703973e774Sriastradh gem_obj = drm_gem_object_lookup(file_priv, handle);
371afcdf04fSjmcneill if (gem_obj == NULL) {
372afcdf04fSjmcneill DRM_ERROR("Cannot find cursor object %#x for crtc %d\n",
373afcdf04fSjmcneill handle, drm_crtc_index(crtc));
374afcdf04fSjmcneill error = -ENOENT;
375afcdf04fSjmcneill goto done;
376afcdf04fSjmcneill }
377afcdf04fSjmcneill obj = to_drm_gem_cma_obj(gem_obj);
378afcdf04fSjmcneill
379afcdf04fSjmcneill if (obj->base.size < width * height * 4) {
380afcdf04fSjmcneill DRM_ERROR("Cursor buffer is too small\n");
381afcdf04fSjmcneill error = -ENOMEM;
382afcdf04fSjmcneill goto done;
383afcdf04fSjmcneill }
384afcdf04fSjmcneill
385afcdf04fSjmcneill uint64_t paddr = (uint64_t)obj->dmamap->dm_segs[0].ds_addr;
386afcdf04fSjmcneill uint32_t haddr = (paddr >> 32) & OVL_UI_TOP_HADD_LAYER0;
387afcdf04fSjmcneill uint32_t laddr = paddr & 0xffffffff;
388afcdf04fSjmcneill
389afcdf04fSjmcneill /* Framebuffer start address */
390afcdf04fSjmcneill val = OVL_UI_READ(sc, 1, OVL_UI_TOP_HADD);
391afcdf04fSjmcneill val &= ~OVL_UI_TOP_HADD_LAYER0;
392afcdf04fSjmcneill val |= __SHIFTIN(haddr, OVL_UI_TOP_HADD_LAYER0);
393afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_TOP_HADD, val);
394afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_TOP_LADD(0), laddr);
395afcdf04fSjmcneill
396afcdf04fSjmcneill const uint32_t size = ((height - 1) << 16) | (width - 1);
397afcdf04fSjmcneill const uint32_t offset = (crtc->cursor_y << 16) | crtc->cursor_x;
398afcdf04fSjmcneill const uint32_t crtc_size = ((crtc->primary->fb->height - 1) << 16) |
399afcdf04fSjmcneill (crtc->primary->fb->width - 1);
400afcdf04fSjmcneill
401afcdf04fSjmcneill /* Enable cursor in ARGB8888 mode */
402afcdf04fSjmcneill val = OVL_UI_ATTR_CTL_LAY_EN |
403afcdf04fSjmcneill __SHIFTIN(OVL_UI_ATTR_CTL_LAY_FBFMT_ARGB_8888, OVL_UI_ATTR_CTL_LAY_FBFMT);
404afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_ATTR_CTL(0), val);
405afcdf04fSjmcneill /* Set UI overlay layer size */
406afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_MBSIZE(0), size);
407afcdf04fSjmcneill /* Set UI overlay offset */
408afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_COOR(0), offset);
409afcdf04fSjmcneill /* Set UI overlay line size */
410ee462562Sjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_PITCH(0), width * 4);
411afcdf04fSjmcneill /* Set UI overlay window size */
412afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_SIZE, crtc_size);
413afcdf04fSjmcneill
414afcdf04fSjmcneill /* Set blender 2 input size */
415afcdf04fSjmcneill BLD_WRITE(sc, BLD_CH_ISIZE(2), crtc_size);
416afcdf04fSjmcneill /* Set blender 2 offset */
417afcdf04fSjmcneill BLD_WRITE(sc, BLD_CH_OFFSET(2), 0);
418afcdf04fSjmcneill /* Route channel 2 to pipe 2 */
419afcdf04fSjmcneill val = BLD_READ(sc, BLD_CH_RTCTL);
420afcdf04fSjmcneill val &= ~BLD_CH_RTCTL_P2;
421afcdf04fSjmcneill val |= __SHIFTIN(2, BLD_CH_RTCTL_P2);
422afcdf04fSjmcneill BLD_WRITE(sc, BLD_CH_RTCTL, val);
423afcdf04fSjmcneill
424afcdf04fSjmcneill /* Enable pipe 2 */
425afcdf04fSjmcneill val = BLD_READ(sc, BLD_FILL_COLOR_CTL);
426afcdf04fSjmcneill val |= BLD_FILL_COLOR_CTL_P2_EN;
427afcdf04fSjmcneill val &= ~BLD_FILL_COLOR_CTL_P2_FCEN;
428afcdf04fSjmcneill BLD_WRITE(sc, BLD_FILL_COLOR_CTL, val);
429afcdf04fSjmcneill
430afcdf04fSjmcneill error = 0;
431afcdf04fSjmcneill
432afcdf04fSjmcneill done:
433afcdf04fSjmcneill if (error == 0) {
434afcdf04fSjmcneill /* Commit settings */
435afcdf04fSjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
436afcdf04fSjmcneill }
437afcdf04fSjmcneill
438afcdf04fSjmcneill if (gem_obj != NULL)
4393973e774Sriastradh drm_gem_object_put_unlocked(gem_obj);
440afcdf04fSjmcneill
441afcdf04fSjmcneill return error;
442afcdf04fSjmcneill }
443afcdf04fSjmcneill
444afcdf04fSjmcneill static int
sunxi_mixer_cursor_move(struct drm_crtc * crtc,int x,int y)445afcdf04fSjmcneill sunxi_mixer_cursor_move(struct drm_crtc *crtc, int x, int y)
446afcdf04fSjmcneill {
447afcdf04fSjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
448afcdf04fSjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
449afcdf04fSjmcneill
450afcdf04fSjmcneill crtc->cursor_x = x & 0xffff;
451afcdf04fSjmcneill crtc->cursor_y = y & 0xffff;
452afcdf04fSjmcneill
453afcdf04fSjmcneill const uint32_t offset = (crtc->cursor_y << 16) | crtc->cursor_x;
454afcdf04fSjmcneill
455afcdf04fSjmcneill OVL_UI_WRITE(sc, 1, OVL_UI_COOR(0), offset);
456afcdf04fSjmcneill
457afcdf04fSjmcneill /* Commit settings */
458afcdf04fSjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
459afcdf04fSjmcneill
460afcdf04fSjmcneill return 0;
461afcdf04fSjmcneill }
462afcdf04fSjmcneill
4635d72569bSjmcneill static const struct drm_crtc_funcs sunxi_mixer0_crtc_funcs = {
4648dda12afSjmcneill .set_config = drm_crtc_helper_set_config,
4658dda12afSjmcneill .destroy = sunxi_mixer_destroy,
466afcdf04fSjmcneill .page_flip = sunxi_mixer_page_flip,
467afcdf04fSjmcneill .cursor_set = sunxi_mixer_cursor_set,
468afcdf04fSjmcneill .cursor_move = sunxi_mixer_cursor_move,
4698dda12afSjmcneill };
4708dda12afSjmcneill
4715d72569bSjmcneill static const struct drm_crtc_funcs sunxi_mixer1_crtc_funcs = {
4725d72569bSjmcneill .set_config = drm_crtc_helper_set_config,
4735d72569bSjmcneill .destroy = sunxi_mixer_destroy,
4745d72569bSjmcneill .page_flip = sunxi_mixer_page_flip,
4755d72569bSjmcneill };
4765d72569bSjmcneill
4778dda12afSjmcneill static void
sunxi_mixer_dpms(struct drm_crtc * crtc,int mode)4788dda12afSjmcneill sunxi_mixer_dpms(struct drm_crtc *crtc, int mode)
4798dda12afSjmcneill {
4808dda12afSjmcneill }
4818dda12afSjmcneill
4828dda12afSjmcneill static bool
sunxi_mixer_mode_fixup(struct drm_crtc * crtc,const struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode)4838dda12afSjmcneill sunxi_mixer_mode_fixup(struct drm_crtc *crtc,
4848dda12afSjmcneill const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
4858dda12afSjmcneill {
4868dda12afSjmcneill return true;
4878dda12afSjmcneill }
4888dda12afSjmcneill
489a9d03646Sjmcneill static int
sunxi_mixer_mode_set(struct drm_crtc * crtc,struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode,int x,int y,struct drm_framebuffer * old_fb)490a9d03646Sjmcneill sunxi_mixer_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
491a9d03646Sjmcneill struct drm_display_mode *adjusted_mode, int x, int y,
492a9d03646Sjmcneill struct drm_framebuffer *old_fb)
493a9d03646Sjmcneill {
494a9d03646Sjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
495a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
496a9d03646Sjmcneill uint32_t val;
497afcdf04fSjmcneill u_int fbfmt;
498a9d03646Sjmcneill
499a9d03646Sjmcneill const uint32_t size = ((adjusted_mode->vdisplay - 1) << 16) |
500a9d03646Sjmcneill (adjusted_mode->hdisplay - 1);
501a9d03646Sjmcneill
502a9d03646Sjmcneill /* Set global size */
503a9d03646Sjmcneill GLB_WRITE(sc, GLB_SIZE, size);
504a9d03646Sjmcneill
505a9d03646Sjmcneill /* Enable pipe 0 */
5064f58e2b4Sjmcneill val = BLD_READ(sc, BLD_FILL_COLOR_CTL);
5074f58e2b4Sjmcneill val |= BLD_FILL_COLOR_CTL_P0_EN;
5084f58e2b4Sjmcneill BLD_WRITE(sc, BLD_FILL_COLOR_CTL, val);
509a9d03646Sjmcneill
510a9d03646Sjmcneill /* Set blender 0 input size */
511a9d03646Sjmcneill BLD_WRITE(sc, BLD_CH_ISIZE(0), size);
512a9d03646Sjmcneill /* Set blender 0 offset */
513677e8e03Sjmcneill BLD_WRITE(sc, BLD_CH_OFFSET(0), 0);
514a9d03646Sjmcneill /* Route channel 1 to pipe 0 */
5154f58e2b4Sjmcneill val = BLD_READ(sc, BLD_CH_RTCTL);
5164f58e2b4Sjmcneill val &= ~BLD_CH_RTCTL_P0;
5174f58e2b4Sjmcneill val |= __SHIFTIN(1, BLD_CH_RTCTL_P0);
5184f58e2b4Sjmcneill BLD_WRITE(sc, BLD_CH_RTCTL, val);
519a9d03646Sjmcneill /* Set blender output size */
520a9d03646Sjmcneill BLD_WRITE(sc, BLD_SIZE, size);
521a9d03646Sjmcneill
522afcdf04fSjmcneill /* Enable UI overlay */
5233973e774Sriastradh if (crtc->primary->fb->format->format == DRM_FORMAT_XRGB8888)
524afcdf04fSjmcneill fbfmt = OVL_UI_ATTR_CTL_LAY_FBFMT_XRGB_8888;
525afcdf04fSjmcneill else
526afcdf04fSjmcneill fbfmt = OVL_UI_ATTR_CTL_LAY_FBFMT_ARGB_8888;
527afcdf04fSjmcneill val = OVL_UI_ATTR_CTL_LAY_EN | __SHIFTIN(fbfmt, OVL_UI_ATTR_CTL_LAY_FBFMT);
528afcdf04fSjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_ATTR_CTL(0), val);
529a9d03646Sjmcneill /* Set UI overlay layer size */
530afcdf04fSjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_MBSIZE(0), size);
531a9d03646Sjmcneill /* Set UI overlay offset */
532677e8e03Sjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_COOR(0), 0);
533a9d03646Sjmcneill /* Set UI overlay window size */
534afcdf04fSjmcneill OVL_UI_WRITE(sc, 0, OVL_UI_SIZE, size);
535a9d03646Sjmcneill
536a9d03646Sjmcneill sunxi_mixer_mode_do_set_base(crtc, old_fb, x, y, 0);
537a9d03646Sjmcneill
538a9d03646Sjmcneill return 0;
539a9d03646Sjmcneill }
540a9d03646Sjmcneill
541a9d03646Sjmcneill static int
sunxi_mixer_mode_set_base(struct drm_crtc * crtc,int x,int y,struct drm_framebuffer * old_fb)542a9d03646Sjmcneill sunxi_mixer_mode_set_base(struct drm_crtc *crtc, int x, int y,
543a9d03646Sjmcneill struct drm_framebuffer *old_fb)
544a9d03646Sjmcneill {
545a9d03646Sjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
546a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
547a9d03646Sjmcneill
548a9d03646Sjmcneill sunxi_mixer_mode_do_set_base(crtc, old_fb, x, y, 0);
549a9d03646Sjmcneill
550a9d03646Sjmcneill /* Commit settings */
551a9d03646Sjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
552a9d03646Sjmcneill
553a9d03646Sjmcneill return 0;
554a9d03646Sjmcneill }
555a9d03646Sjmcneill
556a9d03646Sjmcneill static int
sunxi_mixer_mode_set_base_atomic(struct drm_crtc * crtc,struct drm_framebuffer * fb,int x,int y,enum mode_set_atomic state)557a9d03646Sjmcneill sunxi_mixer_mode_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
558a9d03646Sjmcneill int x, int y, enum mode_set_atomic state)
559a9d03646Sjmcneill {
560a9d03646Sjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
561a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
562a9d03646Sjmcneill
563a9d03646Sjmcneill sunxi_mixer_mode_do_set_base(crtc, fb, x, y, 1);
564a9d03646Sjmcneill
565a9d03646Sjmcneill /* Commit settings */
566a9d03646Sjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
567a9d03646Sjmcneill
568a9d03646Sjmcneill return 0;
569a9d03646Sjmcneill }
570a9d03646Sjmcneill
571a9d03646Sjmcneill static void
sunxi_mixer_disable(struct drm_crtc * crtc)572a9d03646Sjmcneill sunxi_mixer_disable(struct drm_crtc *crtc)
573a9d03646Sjmcneill {
574a9d03646Sjmcneill }
575a9d03646Sjmcneill
576a9d03646Sjmcneill static void
sunxi_mixer_prepare(struct drm_crtc * crtc)577a9d03646Sjmcneill sunxi_mixer_prepare(struct drm_crtc *crtc)
578a9d03646Sjmcneill {
579a9d03646Sjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
580a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
581a9d03646Sjmcneill
582a9d03646Sjmcneill /* RT enable */
583a9d03646Sjmcneill GLB_WRITE(sc, GLB_CTL, GLB_CTL_EN);
584a9d03646Sjmcneill }
585a9d03646Sjmcneill
586a9d03646Sjmcneill static void
sunxi_mixer_commit(struct drm_crtc * crtc)587a9d03646Sjmcneill sunxi_mixer_commit(struct drm_crtc *crtc)
588a9d03646Sjmcneill {
589a9d03646Sjmcneill struct sunxi_mixer_crtc *mixer_crtc = to_sunxi_mixer_crtc(crtc);
590a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = mixer_crtc->sc;
591a9d03646Sjmcneill
592a9d03646Sjmcneill /* Commit settings */
593a9d03646Sjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
594a9d03646Sjmcneill }
595a9d03646Sjmcneill
596a9d03646Sjmcneill static const struct drm_crtc_helper_funcs sunxi_mixer_crtc_helper_funcs = {
597a9d03646Sjmcneill .dpms = sunxi_mixer_dpms,
598a9d03646Sjmcneill .mode_fixup = sunxi_mixer_mode_fixup,
599a9d03646Sjmcneill .mode_set = sunxi_mixer_mode_set,
600a9d03646Sjmcneill .mode_set_base = sunxi_mixer_mode_set_base,
601a9d03646Sjmcneill .mode_set_base_atomic = sunxi_mixer_mode_set_base_atomic,
602a9d03646Sjmcneill .disable = sunxi_mixer_disable,
603a9d03646Sjmcneill .prepare = sunxi_mixer_prepare,
604a9d03646Sjmcneill .commit = sunxi_mixer_commit,
605a9d03646Sjmcneill };
606a9d03646Sjmcneill
6074f58e2b4Sjmcneill static void
sunxi_mixer_overlay_destroy(struct drm_plane * plane)6084f58e2b4Sjmcneill sunxi_mixer_overlay_destroy(struct drm_plane *plane)
6094f58e2b4Sjmcneill {
6104f58e2b4Sjmcneill }
6114f58e2b4Sjmcneill
6124f58e2b4Sjmcneill static bool
sunxi_mixer_overlay_rgb(uint32_t drm_format)613480d8f6aSjmcneill sunxi_mixer_overlay_rgb(uint32_t drm_format)
6144f58e2b4Sjmcneill {
6154f58e2b4Sjmcneill switch (drm_format) {
616afcdf04fSjmcneill case DRM_FORMAT_ARGB8888:
6174f58e2b4Sjmcneill case DRM_FORMAT_XRGB8888:
6184f58e2b4Sjmcneill return true;
6194f58e2b4Sjmcneill default:
6204f58e2b4Sjmcneill return false;
6214f58e2b4Sjmcneill }
6224f58e2b4Sjmcneill }
6234f58e2b4Sjmcneill
6244f58e2b4Sjmcneill static u_int
sunxi_mixer_overlay_format(uint32_t drm_format)6254f58e2b4Sjmcneill sunxi_mixer_overlay_format(uint32_t drm_format)
6264f58e2b4Sjmcneill {
6274f58e2b4Sjmcneill switch (drm_format) {
628afcdf04fSjmcneill case DRM_FORMAT_ARGB8888: return OVL_V_ATTCTL_LAY_FBFMT_ARGB_8888;
6294f58e2b4Sjmcneill case DRM_FORMAT_XRGB8888: return OVL_V_ATTCTL_LAY_FBFMT_XRGB_8888;
6304f58e2b4Sjmcneill case DRM_FORMAT_VYUY: return OVL_V_ATTCTL_LAY_FBFMT_VYUY;
6314f58e2b4Sjmcneill case DRM_FORMAT_YVYU: return OVL_V_ATTCTL_LAY_FBFMT_YVYU;
6324f58e2b4Sjmcneill case DRM_FORMAT_UYVY: return OVL_V_ATTCTL_LAY_FBFMT_UYVY;
6334f58e2b4Sjmcneill case DRM_FORMAT_YUYV: return OVL_V_ATTCTL_LAY_FBFMT_YUYV;
6344f58e2b4Sjmcneill case DRM_FORMAT_YUV422: return OVL_V_ATTCTL_LAY_FBFMT_YUV422;
6354f58e2b4Sjmcneill case DRM_FORMAT_YUV420: return OVL_V_ATTCTL_LAY_FBFMT_YUV420;
6364f58e2b4Sjmcneill case DRM_FORMAT_YUV411: return OVL_V_ATTCTL_LAY_FBFMT_YUV411;
6374f58e2b4Sjmcneill default: return 0; /* shouldn't happen */
6384f58e2b4Sjmcneill }
6394f58e2b4Sjmcneill }
6404f58e2b4Sjmcneill
641480d8f6aSjmcneill static const uint32_t lan3coefftab32_left[512] = {
642480d8f6aSjmcneill 0x40000000, 0x40fe0000, 0x3ffd0100, 0x3efc0100,
643480d8f6aSjmcneill 0x3efb0100, 0x3dfa0200, 0x3cf90200, 0x3bf80200,
644480d8f6aSjmcneill 0x39f70200, 0x37f70200, 0x35f70200, 0x33f70200,
645480d8f6aSjmcneill 0x31f70200, 0x2ef70200, 0x2cf70200, 0x2af70200,
646480d8f6aSjmcneill 0x27f70200, 0x24f80100, 0x22f80100, 0x1ef90100,
647480d8f6aSjmcneill 0x1cf90100, 0x19fa0100, 0x17fa0100, 0x14fb0100,
648480d8f6aSjmcneill 0x11fc0000, 0x0ffc0000, 0x0cfd0000, 0x0afd0000,
649480d8f6aSjmcneill 0x08fe0000, 0x05ff0000, 0x03ff0000, 0x02000000,
650480d8f6aSjmcneill
651480d8f6aSjmcneill 0x40000000, 0x40fe0000, 0x3ffd0100, 0x3efc0100,
652480d8f6aSjmcneill 0x3efb0100, 0x3dfa0200, 0x3cf90200, 0x3bf80200,
653480d8f6aSjmcneill 0x39f70200, 0x37f70200, 0x35f70200, 0x33f70200,
654480d8f6aSjmcneill 0x31f70200, 0x2ef70200, 0x2cf70200, 0x2af70200,
655480d8f6aSjmcneill 0x27f70200, 0x24f80100, 0x22f80100, 0x1ef90100,
656480d8f6aSjmcneill 0x1cf90100, 0x19fa0100, 0x17fa0100, 0x14fb0100,
657480d8f6aSjmcneill 0x11fc0000, 0x0ffc0000, 0x0cfd0000, 0x0afd0000,
658480d8f6aSjmcneill 0x08fe0000, 0x05ff0000, 0x03ff0000, 0x02000000,
659480d8f6aSjmcneill
660480d8f6aSjmcneill 0x3806fc02, 0x3805fc02, 0x3803fd01, 0x3801fe01,
661480d8f6aSjmcneill 0x3700fe01, 0x35ffff01, 0x35fdff01, 0x34fc0001,
662480d8f6aSjmcneill 0x34fb0000, 0x33fa0000, 0x31fa0100, 0x2ff90100,
663480d8f6aSjmcneill 0x2df80200, 0x2bf80200, 0x2af70200, 0x28f70200,
664480d8f6aSjmcneill 0x27f70200, 0x24f70300, 0x22f70300, 0x1ff70300,
665480d8f6aSjmcneill 0x1ef70300, 0x1cf70300, 0x1af70300, 0x18f70300,
666480d8f6aSjmcneill 0x16f80300, 0x13f80300, 0x11f90300, 0x0ef90300,
667480d8f6aSjmcneill 0x0efa0200, 0x0cfa0200, 0x0afb0200, 0x08fb0200,
668480d8f6aSjmcneill
669480d8f6aSjmcneill 0x320bfa02, 0x3309fa02, 0x3208fb02, 0x3206fb02,
670480d8f6aSjmcneill 0x3205fb02, 0x3104fc02, 0x3102fc01, 0x3001fd01,
671480d8f6aSjmcneill 0x3000fd01, 0x2ffffd01, 0x2efefe01, 0x2dfdfe01,
672480d8f6aSjmcneill 0x2bfcff01, 0x29fcff01, 0x28fbff01, 0x27fa0001,
673480d8f6aSjmcneill 0x26fa0000, 0x24f90000, 0x22f90100, 0x20f90100,
674480d8f6aSjmcneill 0x1ff80100, 0x1ef80100, 0x1cf80100, 0x1af80200,
675480d8f6aSjmcneill 0x18f80200, 0x17f80200, 0x15f80200, 0x12f80200,
676480d8f6aSjmcneill 0x11f90200, 0x0ff90200, 0x0df90200, 0x0cfa0200,
677480d8f6aSjmcneill
678480d8f6aSjmcneill 0x2e0efa01, 0x2f0dfa01, 0x2f0bfa01, 0x2e0afa01,
679480d8f6aSjmcneill 0x2e09fa01, 0x2e07fb01, 0x2d06fb01, 0x2d05fb01,
680480d8f6aSjmcneill 0x2c04fb01, 0x2b03fc01, 0x2a02fc01, 0x2a01fc01,
681480d8f6aSjmcneill 0x2800fd01, 0x28fffd01, 0x26fefd01, 0x25fefe01,
682480d8f6aSjmcneill 0x24fdfe01, 0x23fcfe01, 0x21fcff01, 0x20fbff01,
683480d8f6aSjmcneill 0x1efbff01, 0x1efbff00, 0x1cfa0000, 0x1bfa0000,
684480d8f6aSjmcneill 0x19fa0000, 0x18fa0000, 0x17f90000, 0x15f90100,
685480d8f6aSjmcneill 0x14f90100, 0x12f90100, 0x11f90100, 0x0ff90100,
686480d8f6aSjmcneill
687480d8f6aSjmcneill 0x2b10fa00, 0x2b0ffa00, 0x2b0efa00, 0x2b0cfa00,
688480d8f6aSjmcneill 0x2b0bfa00, 0x2a0afb01, 0x2a09fb01, 0x2908fb01,
689480d8f6aSjmcneill 0x2807fb01, 0x2806fb01, 0x2805fb01, 0x2604fc01,
690480d8f6aSjmcneill 0x2503fc01, 0x2502fc01, 0x2401fc01, 0x2301fc01,
691480d8f6aSjmcneill 0x2100fd01, 0x21fffd01, 0x21fffd01, 0x20fefd01,
692480d8f6aSjmcneill 0x1dfefe01, 0x1cfdfe01, 0x1cfdfe00, 0x1bfcfe00,
693480d8f6aSjmcneill 0x19fcff00, 0x19fbff00, 0x17fbff00, 0x16fbff00,
694480d8f6aSjmcneill 0x15fbff00, 0x14fb0000, 0x13fa0000, 0x11fa0000,
695480d8f6aSjmcneill
696480d8f6aSjmcneill 0x2811fcff, 0x2810fcff, 0x280ffbff, 0x280efbff,
697480d8f6aSjmcneill 0x270dfb00, 0x270cfb00, 0x270bfb00, 0x260afb00,
698480d8f6aSjmcneill 0x2609fb00, 0x2508fb00, 0x2507fb00, 0x2407fb00,
699480d8f6aSjmcneill 0x2406fc00, 0x2305fc00, 0x2204fc00, 0x2203fc00,
700480d8f6aSjmcneill 0x2103fc00, 0x2002fc00, 0x1f01fd00, 0x1e01fd00,
701480d8f6aSjmcneill 0x1d00fd00, 0x1dfffd00, 0x1cfffd00, 0x1bfefd00,
702480d8f6aSjmcneill 0x1afefe00, 0x19fefe00, 0x18fdfe00, 0x17fdfe00,
703480d8f6aSjmcneill 0x16fdfe00, 0x15fcff00, 0x13fcff00, 0x12fcff00,
704480d8f6aSjmcneill
705480d8f6aSjmcneill 0x2512fdfe, 0x2511fdff, 0x2410fdff, 0x240ffdff,
706480d8f6aSjmcneill 0x240efcff, 0x240dfcff, 0x240dfcff, 0x240cfcff,
707480d8f6aSjmcneill 0x230bfcff, 0x230afc00, 0x2209fc00, 0x2108fc00,
708480d8f6aSjmcneill 0x2108fc00, 0x2007fc00, 0x2006fc00, 0x2005fc00,
709480d8f6aSjmcneill 0x1f05fc00, 0x1e04fc00, 0x1e03fc00, 0x1c03fd00,
710480d8f6aSjmcneill 0x1c02fd00, 0x1b02fd00, 0x1b01fd00, 0x1a00fd00,
711480d8f6aSjmcneill 0x1900fd00, 0x1800fd00, 0x17fffe00, 0x16fffe00,
712480d8f6aSjmcneill 0x16fefe00, 0x14fefe00, 0x13fefe00, 0x13fdfe00,
713480d8f6aSjmcneill
714480d8f6aSjmcneill 0x2212fffe, 0x2211fefe, 0x2211fefe, 0x2110fefe,
715480d8f6aSjmcneill 0x210ffeff, 0x220efdff, 0x210dfdff, 0x210dfdff,
716480d8f6aSjmcneill 0x210cfdff, 0x210bfdff, 0x200afdff, 0x200afdff,
717480d8f6aSjmcneill 0x1f09fdff, 0x1f08fdff, 0x1d08fd00, 0x1c07fd00,
718480d8f6aSjmcneill 0x1d06fd00, 0x1b06fd00, 0x1b05fd00, 0x1c04fd00,
719480d8f6aSjmcneill 0x1b04fd00, 0x1a03fd00, 0x1a03fd00, 0x1902fd00,
720480d8f6aSjmcneill 0x1802fd00, 0x1801fd00, 0x1701fd00, 0x1600fd00,
721480d8f6aSjmcneill 0x1400fe00, 0x1400fe00, 0x14fffe00, 0x13fffe00,
722480d8f6aSjmcneill
723480d8f6aSjmcneill 0x201200fe, 0x201100fe, 0x1f11fffe, 0x2010fffe,
724480d8f6aSjmcneill 0x1f0ffffe, 0x1e0ffffe, 0x1f0efeff, 0x1f0dfeff,
725480d8f6aSjmcneill 0x1f0dfeff, 0x1e0cfeff, 0x1e0bfeff, 0x1d0bfeff,
726480d8f6aSjmcneill 0x1d0afeff, 0x1d09fdff, 0x1d09fdff, 0x1c08fdff,
727480d8f6aSjmcneill 0x1c07fdff, 0x1b07fd00, 0x1b06fd00, 0x1a06fd00,
728480d8f6aSjmcneill 0x1a05fd00, 0x1805fd00, 0x1904fd00, 0x1804fd00,
729480d8f6aSjmcneill 0x1703fd00, 0x1703fd00, 0x1602fe00, 0x1502fe00,
730480d8f6aSjmcneill 0x1501fe00, 0x1401fe00, 0x1301fe00, 0x1300fe00,
731480d8f6aSjmcneill
732480d8f6aSjmcneill 0x1c1202fe, 0x1c1102fe, 0x1b1102fe, 0x1c1001fe,
733480d8f6aSjmcneill 0x1b1001fe, 0x1b0f01ff, 0x1b0e00ff, 0x1b0e00ff,
734480d8f6aSjmcneill 0x1b0d00ff, 0x1a0d00ff, 0x1a0c00ff, 0x1a0cffff,
735480d8f6aSjmcneill 0x1a0bffff, 0x1a0bffff, 0x1a0affff, 0x180affff,
736480d8f6aSjmcneill 0x1909ffff, 0x1809ffff, 0x1808ffff, 0x1808feff,
737480d8f6aSjmcneill 0x1807feff, 0x1707fe00, 0x1606fe00, 0x1506fe00,
738480d8f6aSjmcneill 0x1605fe00, 0x1505fe00, 0x1504fe00, 0x1304fe00,
739480d8f6aSjmcneill 0x1304fe00, 0x1303fe00, 0x1203fe00, 0x1203fe00,
740480d8f6aSjmcneill
741480d8f6aSjmcneill 0x181104ff, 0x191103ff, 0x191003ff, 0x181003ff,
742480d8f6aSjmcneill 0x180f03ff, 0x190f02ff, 0x190e02ff, 0x180e02ff,
743480d8f6aSjmcneill 0x180d02ff, 0x180d01ff, 0x180d01ff, 0x180c01ff,
744480d8f6aSjmcneill 0x180c01ff, 0x180b00ff, 0x170b00ff, 0x170a00ff,
745480d8f6aSjmcneill 0x170a00ff, 0x170900ff, 0x160900ff, 0x160900ff,
746480d8f6aSjmcneill 0x1608ffff, 0x1508ffff, 0x1507ff00, 0x1507ff00,
747480d8f6aSjmcneill 0x1407ff00, 0x1306ff00, 0x1306ff00, 0x1305ff00,
748480d8f6aSjmcneill 0x1205ff00, 0x1105ff00, 0x1204ff00, 0x1104ff00,
749480d8f6aSjmcneill
750480d8f6aSjmcneill 0x171005ff, 0x171005ff, 0x171004ff, 0x170f04ff,
751480d8f6aSjmcneill 0x160f04ff, 0x170f03ff, 0x170e03ff, 0x160e03ff,
752480d8f6aSjmcneill 0x160d03ff, 0x160d02ff, 0x160d02ff, 0x160c02ff,
753480d8f6aSjmcneill 0x160c02ff, 0x160c02ff, 0x160b01ff, 0x150b01ff,
754480d8f6aSjmcneill 0x150a01ff, 0x150a01ff, 0x150a01ff, 0x140901ff,
755480d8f6aSjmcneill 0x14090000, 0x14090000, 0x14080000, 0x13080000,
756480d8f6aSjmcneill 0x13070000, 0x12070000, 0x12070000, 0x12060000,
757480d8f6aSjmcneill 0x11060000, 0x11060000, 0x11050000, 0x1105ff00,
758480d8f6aSjmcneill
759480d8f6aSjmcneill 0x14100600, 0x15100500, 0x150f0500, 0x150f0500,
760480d8f6aSjmcneill 0x140f0500, 0x150e0400, 0x140e0400, 0x130e0400,
761480d8f6aSjmcneill 0x140d0400, 0x150d0300, 0x130d0300, 0x140c0300,
762480d8f6aSjmcneill 0x140c0300, 0x140c0200, 0x140b0200, 0x130b0200,
763480d8f6aSjmcneill 0x120b0200, 0x130a0200, 0x130a0200, 0x130a0100,
764480d8f6aSjmcneill 0x13090100, 0x12090100, 0x11090100, 0x12080100,
765480d8f6aSjmcneill 0x11080100, 0x10080100, 0x11070100, 0x11070000,
766480d8f6aSjmcneill 0x10070000, 0x11060000, 0x10060000, 0x10060000,
767480d8f6aSjmcneill
768480d8f6aSjmcneill 0x140f0600, 0x140f0600, 0x130f0600, 0x140f0500,
769480d8f6aSjmcneill 0x140e0500, 0x130e0500, 0x130e0500, 0x140d0400,
770480d8f6aSjmcneill 0x140d0400, 0x130d0400, 0x120d0400, 0x130c0400,
771480d8f6aSjmcneill 0x130c0300, 0x130c0300, 0x130b0300, 0x130b0300,
772480d8f6aSjmcneill 0x110b0300, 0x130a0200, 0x120a0200, 0x120a0200,
773480d8f6aSjmcneill 0x120a0200, 0x12090200, 0x10090200, 0x11090100,
774480d8f6aSjmcneill 0x11080100, 0x11080100, 0x10080100, 0x10080100,
775480d8f6aSjmcneill 0x10070100, 0x10070100, 0x0f070100, 0x10060100,
776480d8f6aSjmcneill
777480d8f6aSjmcneill 0x120f0701, 0x130f0601, 0x130e0601, 0x130e0601,
778480d8f6aSjmcneill 0x120e0601, 0x130e0501, 0x130e0500, 0x130d0500,
779480d8f6aSjmcneill 0x120d0500, 0x120d0500, 0x130c0400, 0x130c0400,
780480d8f6aSjmcneill 0x120c0400, 0x110c0400, 0x120b0400, 0x120b0300,
781480d8f6aSjmcneill 0x120b0300, 0x120b0300, 0x120a0300, 0x110a0300,
782480d8f6aSjmcneill 0x110a0200, 0x11090200, 0x11090200, 0x10090200,
783480d8f6aSjmcneill 0x10090200, 0x10080200, 0x10080200, 0x10080100,
784480d8f6aSjmcneill 0x0f080100, 0x10070100, 0x0f070100, 0x0f070100
785480d8f6aSjmcneill };
786480d8f6aSjmcneill
787480d8f6aSjmcneill static const uint32_t lan3coefftab32_right[512] = {
788480d8f6aSjmcneill 0x00000000, 0x00000002, 0x0000ff04, 0x0000ff06,
789480d8f6aSjmcneill 0x0000fe08, 0x0000fd0a, 0x0000fd0c, 0x0000fc0f,
790480d8f6aSjmcneill 0x0000fc12, 0x0001fb14, 0x0001fa17, 0x0001fa19,
791480d8f6aSjmcneill 0x0001f91c, 0x0001f91f, 0x0001f822, 0x0001f824,
792480d8f6aSjmcneill 0x0002f727, 0x0002f72a, 0x0002f72c, 0x0002f72f,
793480d8f6aSjmcneill 0x0002f731, 0x0002f733, 0x0002f735, 0x0002f737,
794480d8f6aSjmcneill 0x0002f73a, 0x0002f83b, 0x0002f93c, 0x0002fa3d,
795480d8f6aSjmcneill 0x0001fb3e, 0x0001fc3f, 0x0001fd40, 0x0000fe40,
796480d8f6aSjmcneill
797480d8f6aSjmcneill 0x00000000, 0x00000002, 0x0000ff04, 0x0000ff06,
798480d8f6aSjmcneill 0x0000fe08, 0x0000fd0a, 0x0000fd0c, 0x0000fc0f,
799480d8f6aSjmcneill 0x0000fc12, 0x0001fb14, 0x0001fa17, 0x0001fa19,
800480d8f6aSjmcneill 0x0001f91c, 0x0001f91f, 0x0001f822, 0x0001f824,
801480d8f6aSjmcneill 0x0002f727, 0x0002f72a, 0x0002f72c, 0x0002f72f,
802480d8f6aSjmcneill 0x0002f731, 0x0002f733, 0x0002f735, 0x0002f737,
803480d8f6aSjmcneill 0x0002f73a, 0x0002f83b, 0x0002f93c, 0x0002fa3d,
804480d8f6aSjmcneill 0x0001fb3e, 0x0001fc3f, 0x0001fd40, 0x0000fe40,
805480d8f6aSjmcneill
806480d8f6aSjmcneill 0x0002fc06, 0x0002fb08, 0x0002fb0a, 0x0002fa0c,
807480d8f6aSjmcneill 0x0002fa0e, 0x0003f910, 0x0003f912, 0x0003f814,
808480d8f6aSjmcneill 0x0003f816, 0x0003f719, 0x0003f71a, 0x0003f71d,
809480d8f6aSjmcneill 0x0003f71f, 0x0003f721, 0x0003f723, 0x0003f725,
810480d8f6aSjmcneill 0x0002f727, 0x0002f729, 0x0002f72b, 0x0002f82d,
811480d8f6aSjmcneill 0x0002f82e, 0x0001f930, 0x0001fa31, 0x0000fa34,
812480d8f6aSjmcneill 0x0000fb34, 0x0100fc35, 0x01fffd36, 0x01ffff37,
813480d8f6aSjmcneill 0x01fe0037, 0x01fe0138, 0x01fd0338, 0x02fc0538,
814480d8f6aSjmcneill
815480d8f6aSjmcneill 0x0002fa0b, 0x0002fa0c, 0x0002f90e, 0x0002f910,
816480d8f6aSjmcneill 0x0002f911, 0x0002f813, 0x0002f816, 0x0002f817,
817480d8f6aSjmcneill 0x0002f818, 0x0002f81a, 0x0001f81c, 0x0001f81e,
818480d8f6aSjmcneill 0x0001f820, 0x0001f921, 0x0001f923, 0x0000f925,
819480d8f6aSjmcneill 0x0000fa26, 0x0100fa28, 0x01fffb29, 0x01fffc2a,
820480d8f6aSjmcneill 0x01fffc2c, 0x01fefd2d, 0x01fefe2e, 0x01fdff2f,
821480d8f6aSjmcneill 0x01fd0030, 0x01fd0130, 0x01fc0232, 0x02fc0432,
822480d8f6aSjmcneill 0x02fb0532, 0x02fb0633, 0x02fb0833, 0x02fa0933,
823480d8f6aSjmcneill
824480d8f6aSjmcneill 0x0001fa0e, 0x0001f90f, 0x0001f911, 0x0001f913,
825480d8f6aSjmcneill 0x0001f914, 0x0001f915, 0x0000f918, 0x0000fa18,
826480d8f6aSjmcneill 0x0000fa1a, 0x0000fa1b, 0x0000fa1d, 0x00fffb1e,
827480d8f6aSjmcneill 0x01fffb1f, 0x01fffb20, 0x01fffc22, 0x01fefc23,
828480d8f6aSjmcneill 0x01fefd24, 0x01fefe25, 0x01fdfe27, 0x01fdff28,
829480d8f6aSjmcneill 0x01fd0029, 0x01fc012a, 0x01fc022b, 0x01fc032b,
830480d8f6aSjmcneill 0x01fb042d, 0x01fb052d, 0x01fb062e, 0x01fb072e,
831480d8f6aSjmcneill 0x01fa092e, 0x01fa0a2f, 0x01fa0b2f, 0x01fa0d2f,
832480d8f6aSjmcneill
833480d8f6aSjmcneill 0x0000fa11, 0x0000fa12, 0x0000fa13, 0x0000fb14,
834480d8f6aSjmcneill 0x00fffb16, 0x00fffb16, 0x00fffb17, 0x00fffb19,
835480d8f6aSjmcneill 0x00fffc1a, 0x00fefc1c, 0x00fefd1c, 0x01fefd1d,
836480d8f6aSjmcneill 0x01fefe1e, 0x01fdfe20, 0x01fdff21, 0x01fdff22,
837480d8f6aSjmcneill 0x01fd0023, 0x01fc0124, 0x01fc0124, 0x01fc0225,
838480d8f6aSjmcneill 0x01fc0326, 0x01fc0427, 0x01fb0528, 0x01fb0629,
839480d8f6aSjmcneill 0x01fb0729, 0x01fb0829, 0x01fb092a, 0x01fb0a2a,
840480d8f6aSjmcneill 0x00fa0b2c, 0x00fa0c2b, 0x00fa0e2b, 0x00fa0f2c,
841480d8f6aSjmcneill
842480d8f6aSjmcneill 0x00fffc11, 0x00fffc12, 0x00fffc14, 0x00fffc15,
843480d8f6aSjmcneill 0x00fefd16, 0x00fefd17, 0x00fefd18, 0x00fefe19,
844480d8f6aSjmcneill 0x00fefe1a, 0x00fdfe1d, 0x00fdff1d, 0x00fdff1e,
845480d8f6aSjmcneill 0x00fd001d, 0x00fd011e, 0x00fd0120, 0x00fc0221,
846480d8f6aSjmcneill 0x00fc0321, 0x00fc0323, 0x00fc0423, 0x00fc0523,
847480d8f6aSjmcneill 0x00fc0624, 0x00fb0725, 0x00fb0726, 0x00fb0827,
848480d8f6aSjmcneill 0x00fb0926, 0x00fb0a26, 0x00fb0b27, 0x00fb0c27,
849480d8f6aSjmcneill 0x00fb0d27, 0xfffb0e28, 0xfffb0f29, 0xfffc1028,
850480d8f6aSjmcneill
851480d8f6aSjmcneill 0x00fefd13, 0x00fefd13, 0x00fefe14, 0x00fefe15,
852480d8f6aSjmcneill 0x00fefe17, 0x00feff17, 0x00feff17, 0x00fd0018,
853480d8f6aSjmcneill 0x00fd001a, 0x00fd001a, 0x00fd011b, 0x00fd021c,
854480d8f6aSjmcneill 0x00fd021c, 0x00fd031d, 0x00fc031f, 0x00fc041f,
855480d8f6aSjmcneill 0x00fc051f, 0x00fc0521, 0x00fc0621, 0x00fc0721,
856480d8f6aSjmcneill 0x00fc0821, 0x00fc0822, 0x00fc0922, 0x00fc0a23,
857480d8f6aSjmcneill 0xfffc0b24, 0xfffc0c24, 0xfffc0d24, 0xfffc0d25,
858480d8f6aSjmcneill 0xfffc0e25, 0xfffd0f25, 0xfffd1025, 0xfffd1125,
859480d8f6aSjmcneill
860480d8f6aSjmcneill 0x00feff12, 0x00feff14, 0x00feff14, 0x00fe0015,
861480d8f6aSjmcneill 0x00fe0015, 0x00fd0017, 0x00fd0118, 0x00fd0118,
862480d8f6aSjmcneill 0x00fd0218, 0x00fd0219, 0x00fd031a, 0x00fd031a,
863480d8f6aSjmcneill 0x00fd041b, 0x00fd041c, 0x00fd051c, 0x00fd061d,
864480d8f6aSjmcneill 0x00fd061d, 0x00fd071e, 0x00fd081e, 0xfffd081f,
865480d8f6aSjmcneill 0xfffd091f, 0xfffd0a20, 0xfffd0a20, 0xfffd0b21,
866480d8f6aSjmcneill 0xfffd0c21, 0xfffd0d21, 0xfffd0d22, 0xfffd0e23,
867480d8f6aSjmcneill 0xfffe0f22, 0xfefe1022, 0xfefe1122, 0xfefe1123,
868480d8f6aSjmcneill
869480d8f6aSjmcneill 0x00fe0012, 0x00fe0013, 0x00fe0114, 0x00fe0114,
870480d8f6aSjmcneill 0x00fe0116, 0x00fe0216, 0x00fe0216, 0x00fd0317,
871480d8f6aSjmcneill 0x00fd0317, 0x00fd0418, 0x00fd0419, 0x00fd0519,
872480d8f6aSjmcneill 0x00fd051a, 0x00fd061b, 0x00fd061b, 0x00fd071c,
873480d8f6aSjmcneill 0xfffd071e, 0xfffd081d, 0xfffd091d, 0xfffd091e,
874480d8f6aSjmcneill 0xfffe0a1d, 0xfffe0b1e, 0xfffe0b1e, 0xfffe0c1e,
875480d8f6aSjmcneill 0xfffe0d1f, 0xfffe0d1f, 0xfffe0e1f, 0xfeff0f1f,
876480d8f6aSjmcneill 0xfeff0f20, 0xfeff1020, 0xfeff1120, 0xfe001120,
877480d8f6aSjmcneill
878480d8f6aSjmcneill 0x00fe0212, 0x00fe0312, 0x00fe0313, 0x00fe0314,
879480d8f6aSjmcneill 0x00fe0414, 0x00fe0414, 0x00fe0416, 0x00fe0515,
880480d8f6aSjmcneill 0x00fe0516, 0x00fe0616, 0x00fe0617, 0x00fe0717,
881480d8f6aSjmcneill 0xfffe0719, 0xfffe0818, 0xffff0818, 0xffff0919,
882480d8f6aSjmcneill 0xffff0919, 0xffff0a19, 0xffff0a1a, 0xffff0b1a,
883480d8f6aSjmcneill 0xffff0b1b, 0xffff0c1a, 0xff000c1b, 0xff000d1b,
884480d8f6aSjmcneill 0xff000d1b, 0xff000e1b, 0xff000e1c, 0xff010f1c,
885480d8f6aSjmcneill 0xfe01101c, 0xfe01101d, 0xfe02111c, 0xfe02111c,
886480d8f6aSjmcneill
887480d8f6aSjmcneill 0x00ff0411, 0x00ff0411, 0x00ff0412, 0x00ff0512,
888480d8f6aSjmcneill 0x00ff0513, 0x00ff0513, 0x00ff0613, 0x00ff0614,
889480d8f6aSjmcneill 0x00ff0714, 0x00ff0715, 0x00ff0715, 0xffff0816,
890480d8f6aSjmcneill 0xffff0816, 0xff000916, 0xff000917, 0xff000918,
891480d8f6aSjmcneill 0xff000a17, 0xff000a18, 0xff000b18, 0xff000b18,
892480d8f6aSjmcneill 0xff010c18, 0xff010c19, 0xff010d18, 0xff010d18,
893480d8f6aSjmcneill 0xff020d18, 0xff020e19, 0xff020e19, 0xff020f19,
894480d8f6aSjmcneill 0xff030f19, 0xff031019, 0xff031019, 0xff031119,
895480d8f6aSjmcneill
896480d8f6aSjmcneill 0x00ff0511, 0x00ff0511, 0x00000511, 0x00000611,
897480d8f6aSjmcneill 0x00000612, 0x00000612, 0x00000712, 0x00000713,
898480d8f6aSjmcneill 0x00000714, 0x00000814, 0x00000814, 0x00000914,
899480d8f6aSjmcneill 0x00000914, 0xff010914, 0xff010a15, 0xff010a16,
900480d8f6aSjmcneill 0xff010a17, 0xff010b16, 0xff010b16, 0xff020c16,
901480d8f6aSjmcneill 0xff020c16, 0xff020c16, 0xff020d16, 0xff020d17,
902480d8f6aSjmcneill 0xff030d17, 0xff030e17, 0xff030e17, 0xff030f17,
903480d8f6aSjmcneill 0xff040f17, 0xff040f17, 0xff041017, 0xff051017,
904480d8f6aSjmcneill
905480d8f6aSjmcneill 0x00000610, 0x00000610, 0x00000611, 0x00000611,
906480d8f6aSjmcneill 0x00000711, 0x00000712, 0x00010712, 0x00010812,
907480d8f6aSjmcneill 0x00010812, 0x00010812, 0x00010913, 0x00010913,
908480d8f6aSjmcneill 0x00010913, 0x00010a13, 0x00020a13, 0x00020a14,
909480d8f6aSjmcneill 0x00020b14, 0x00020b14, 0x00020b14, 0x00020c14,
910480d8f6aSjmcneill 0x00030c14, 0x00030c15, 0x00030d15, 0x00030d15,
911480d8f6aSjmcneill 0x00040d15, 0x00040e15, 0x00040e15, 0x00040e16,
912480d8f6aSjmcneill 0x00050f15, 0x00050f15, 0x00050f16, 0x00051015,
913480d8f6aSjmcneill
914480d8f6aSjmcneill 0x00000611, 0x00010610, 0x00010710, 0x00010710,
915480d8f6aSjmcneill 0x00010711, 0x00010811, 0x00010811, 0x00010812,
916480d8f6aSjmcneill 0x00010812, 0x00010912, 0x00020912, 0x00020912,
917480d8f6aSjmcneill 0x00020a12, 0x00020a12, 0x00020a13, 0x00020a13,
918480d8f6aSjmcneill 0x00030b13, 0x00030b13, 0x00030b14, 0x00030c13,
919480d8f6aSjmcneill 0x00030c13, 0x00040c13, 0x00040d14, 0x00040d14,
920480d8f6aSjmcneill 0x00040d15, 0x00040d15, 0x00050e14, 0x00050e14,
921480d8f6aSjmcneill 0x00050e15, 0x00050f14, 0x00060f14, 0x00060f14,
922480d8f6aSjmcneill
923480d8f6aSjmcneill 0x0001070f, 0x0001070f, 0x00010710, 0x00010710,
924480d8f6aSjmcneill 0x00010810, 0x00010810, 0x00020810, 0x00020811,
925480d8f6aSjmcneill 0x00020911, 0x00020911, 0x00020912, 0x00020912,
926480d8f6aSjmcneill 0x00020a12, 0x00030a12, 0x00030a12, 0x00030b12,
927480d8f6aSjmcneill 0x00030b12, 0x00030b12, 0x00040b12, 0x00040c12,
928480d8f6aSjmcneill 0x00040c13, 0x00040c14, 0x00040c14, 0x00050d13,
929480d8f6aSjmcneill 0x00050d13, 0x00050d14, 0x00050e13, 0x01050e13,
930480d8f6aSjmcneill 0x01060e13, 0x01060e13, 0x01060e14, 0x01060f13
931480d8f6aSjmcneill };
932480d8f6aSjmcneill
933480d8f6aSjmcneill static const uint32_t lan2coefftab32[512] = {
934480d8f6aSjmcneill 0x00004000, 0x000140ff, 0x00033ffe, 0x00043ffd, 0x00063efc, 0xff083dfc, 0x000a3bfb, 0xff0d39fb,
935480d8f6aSjmcneill 0xff0f37fb, 0xff1136fa, 0xfe1433fb, 0xfe1631fb, 0xfd192ffb, 0xfd1c2cfb, 0xfd1f29fb, 0xfc2127fc,
936480d8f6aSjmcneill 0xfc2424fc, 0xfc2721fc, 0xfb291ffd, 0xfb2c1cfd, 0xfb2f19fd, 0xfb3116fe, 0xfb3314fe, 0xfa3611ff,
937480d8f6aSjmcneill 0xfb370fff, 0xfb390dff, 0xfb3b0a00, 0xfc3d08ff, 0xfc3e0600, 0xfd3f0400, 0xfe3f0300, 0xff400100,
938480d8f6aSjmcneill
939480d8f6aSjmcneill 0x00004000, 0x000140ff, 0x00033ffe, 0x00043ffd, 0x00063efc, 0xff083dfc, 0x000a3bfb, 0xff0d39fb,
940480d8f6aSjmcneill 0xff0f37fb, 0xff1136fa, 0xfe1433fb, 0xfe1631fb, 0xfd192ffb, 0xfd1c2cfb, 0xfd1f29fb, 0xfc2127fc,
941480d8f6aSjmcneill 0xfc2424fc, 0xfc2721fc, 0xfb291ffd, 0xfb2c1cfd, 0xfb2f19fd, 0xfb3116fe, 0xfb3314fe, 0xfa3611ff,
942480d8f6aSjmcneill 0xfb370fff, 0xfb390dff, 0xfb3b0a00, 0xfc3d08ff, 0xfc3e0600, 0xfd3f0400, 0xfe3f0300, 0xff400100,
943480d8f6aSjmcneill
944480d8f6aSjmcneill 0xff053804, 0xff063803, 0xff083801, 0xff093701, 0xff0a3700, 0xff0c3500, 0xff0e34ff, 0xff1033fe,
945480d8f6aSjmcneill 0xff1232fd, 0xfe1431fd, 0xfe162ffd, 0xfe182dfd, 0xfd1b2cfc, 0xfd1d2afc, 0xfd1f28fc, 0xfd2126fc,
946480d8f6aSjmcneill 0xfd2323fd, 0xfc2621fd, 0xfc281ffd, 0xfc2a1dfd, 0xfc2c1bfd, 0xfd2d18fe, 0xfd2f16fe, 0xfd3114fe,
947480d8f6aSjmcneill 0xfd3212ff, 0xfe3310ff, 0xff340eff, 0x00350cff, 0x00360a00, 0x01360900, 0x02370700, 0x03370600,
948480d8f6aSjmcneill
949480d8f6aSjmcneill 0xff083207, 0xff093206, 0xff0a3205, 0xff0c3203, 0xff0d3103, 0xff0e3102, 0xfe113001, 0xfe132f00,
950480d8f6aSjmcneill 0xfe142e00, 0xfe162dff, 0xfe182bff, 0xfe192aff, 0xfe1b29fe, 0xfe1d27fe, 0xfe1f25fe, 0xfd2124fe,
951480d8f6aSjmcneill 0xfe2222fe, 0xfe2421fd, 0xfe251ffe, 0xfe271dfe, 0xfe291bfe, 0xff2a19fe, 0xff2b18fe, 0xff2d16fe,
952480d8f6aSjmcneill 0x002e14fe, 0x002f12ff, 0x013010ff, 0x02300fff, 0x03310dff, 0x04310cff, 0x05310a00, 0x06310900,
953480d8f6aSjmcneill
954480d8f6aSjmcneill 0xff0a2e09, 0xff0b2e08, 0xff0c2e07, 0xff0e2d06, 0xff0f2d05, 0xff102d04, 0xff122c03, 0xfe142c02,
955480d8f6aSjmcneill 0xfe152b02, 0xfe172a01, 0xfe182901, 0xfe1a2800, 0xfe1b2700, 0xfe1d2500, 0xff1e24ff, 0xfe2023ff,
956480d8f6aSjmcneill 0xff2121ff, 0xff2320fe, 0xff241eff, 0x00251dfe, 0x00261bff, 0x00281afe, 0x012818ff, 0x012a16ff,
957480d8f6aSjmcneill 0x022a15ff, 0x032b13ff, 0x032c12ff, 0x052c10ff, 0x052d0fff, 0x062d0d00, 0x072d0c00, 0x082d0b00,
958480d8f6aSjmcneill
959480d8f6aSjmcneill 0xff0c2a0b, 0xff0d2a0a, 0xff0e2a09, 0xff0f2a08, 0xff102a07, 0xff112a06, 0xff132905, 0xff142904,
960480d8f6aSjmcneill 0xff162803, 0xff172703, 0xff182702, 0xff1a2601, 0xff1b2501, 0xff1c2401, 0xff1e2300, 0xff1f2200,
961480d8f6aSjmcneill 0x00202000, 0x00211f00, 0x01221d00, 0x01231c00, 0x01251bff, 0x02251aff, 0x032618ff, 0x032717ff,
962480d8f6aSjmcneill 0x042815ff, 0x052814ff, 0x052913ff, 0x06291100, 0x072a10ff, 0x082a0e00, 0x092a0d00, 0x0a2a0c00,
963480d8f6aSjmcneill
964480d8f6aSjmcneill 0xff0d280c, 0xff0e280b, 0xff0f280a, 0xff102809, 0xff112808, 0xff122708, 0xff142706, 0xff152705,
965480d8f6aSjmcneill 0xff162605, 0xff172604, 0xff192503, 0xff1a2403, 0x001b2302, 0x001c2202, 0x001d2201, 0x001e2101,
966480d8f6aSjmcneill 0x011f1f01, 0x01211e00, 0x01221d00, 0x02221c00, 0x02231b00, 0x03241900, 0x04241800, 0x04251700,
967480d8f6aSjmcneill 0x052616ff, 0x06261400, 0x072713ff, 0x08271100, 0x08271100, 0x09271000, 0x0a280e00, 0x0b280d00,
968480d8f6aSjmcneill
969480d8f6aSjmcneill 0xff0e260d, 0xff0f260c, 0xff10260b, 0xff11260a, 0xff122609, 0xff132608, 0xff142508, 0xff152507,
970480d8f6aSjmcneill 0x00152506, 0x00172405, 0x00182305, 0x00192304, 0x001b2203, 0x001c2103, 0x011d2002, 0x011d2002,
971480d8f6aSjmcneill 0x011f1f01, 0x021f1e01, 0x02201d01, 0x03211c00, 0x03221b00, 0x04221a00, 0x04231801, 0x05241700,
972480d8f6aSjmcneill 0x06241600, 0x07241500, 0x08251300, 0x09251200, 0x09261100, 0x0a261000, 0x0b260f00, 0x0c260e00,
973480d8f6aSjmcneill
974480d8f6aSjmcneill 0xff0e250e, 0xff0f250d, 0xff10250c, 0xff11250b, 0x0011250a, 0x00132409, 0x00142408, 0x00152407,
975480d8f6aSjmcneill 0x00162307, 0x00172306, 0x00182206, 0x00192205, 0x011a2104, 0x011b2004, 0x011c2003, 0x021c1f03,
976480d8f6aSjmcneill 0x021e1e02, 0x031e1d02, 0x03201c01, 0x04201b01, 0x04211a01, 0x05221900, 0x05221801, 0x06231700,
977480d8f6aSjmcneill 0x07231600, 0x07241500, 0x08241400, 0x09241300, 0x0a241200, 0x0b241100, 0x0c241000, 0x0d240f00,
978480d8f6aSjmcneill
979480d8f6aSjmcneill 0x000e240e, 0x000f240d, 0x0010240c, 0x0011240b, 0x0013230a, 0x0013230a, 0x00142309, 0x00152308,
980480d8f6aSjmcneill 0x00162208, 0x00172207, 0x01182106, 0x01192105, 0x011a2005, 0x021b1f04, 0x021b1f04, 0x021d1e03,
981480d8f6aSjmcneill 0x031d1d03, 0x031e1d02, 0x041e1c02, 0x041f1b02, 0x05201a01, 0x05211901, 0x06211801, 0x07221700,
982480d8f6aSjmcneill 0x07221601, 0x08231500, 0x09231400, 0x0a231300, 0x0a231300, 0x0b231200, 0x0c231100, 0x0d231000,
983480d8f6aSjmcneill
984480d8f6aSjmcneill 0x000f220f, 0x0010220e, 0x0011220d, 0x0012220c, 0x0013220b, 0x0013220b, 0x0015210a, 0x0015210a,
985480d8f6aSjmcneill 0x01162108, 0x01172008, 0x01182007, 0x02191f06, 0x02191f06, 0x021a1e06, 0x031a1e05, 0x031c1d04,
986480d8f6aSjmcneill 0x041c1c04, 0x041d1c03, 0x051d1b03, 0x051e1a03, 0x061f1902, 0x061f1902, 0x07201801, 0x08201701,
987480d8f6aSjmcneill 0x08211601, 0x09211501, 0x0a211500, 0x0b211400, 0x0b221300, 0x0c221200, 0x0d221100, 0x0e221000,
988480d8f6aSjmcneill
989480d8f6aSjmcneill 0x0010210f, 0x0011210e, 0x0011210e, 0x0012210d, 0x0013210c, 0x0014200c, 0x0114200b, 0x0115200a,
990480d8f6aSjmcneill 0x01161f0a, 0x01171f09, 0x02171f08, 0x02181e08, 0x03181e07, 0x031a1d06, 0x031a1d06, 0x041b1c05,
991480d8f6aSjmcneill 0x041c1c04, 0x051c1b04, 0x051d1a04, 0x061d1a03, 0x071d1903, 0x071e1803, 0x081e1802, 0x081f1702,
992480d8f6aSjmcneill 0x091f1602, 0x0a201501, 0x0b1f1501, 0x0b201401, 0x0c211300, 0x0d211200, 0x0e201200, 0x0e211100,
993480d8f6aSjmcneill
994480d8f6aSjmcneill 0x00102010, 0x0011200f, 0x0012200e, 0x0013200d, 0x0013200d, 0x01141f0c, 0x01151f0b, 0x01151f0b,
995480d8f6aSjmcneill 0x01161f0a, 0x02171e09, 0x02171e09, 0x03181d08, 0x03191d07, 0x03191d07, 0x041a1c06, 0x041b1c05,
996480d8f6aSjmcneill 0x051b1b05, 0x051c1b04, 0x061c1a04, 0x071d1903, 0x071d1903, 0x081d1803, 0x081e1703, 0x091e1702,
997480d8f6aSjmcneill 0x0a1f1601, 0x0a1f1502, 0x0b1f1501, 0x0c1f1401, 0x0d201300, 0x0d201300, 0x0e201200, 0x0f201100,
998480d8f6aSjmcneill
999480d8f6aSjmcneill 0x00102010, 0x0011200f, 0x00121f0f, 0x00131f0e, 0x00141f0d, 0x01141f0c, 0x01141f0c, 0x01151e0c,
1000480d8f6aSjmcneill 0x02161e0a, 0x02171e09, 0x03171d09, 0x03181d08, 0x03181d08, 0x04191c07, 0x041a1c06, 0x051a1b06,
1001480d8f6aSjmcneill 0x051b1b05, 0x061b1a05, 0x061c1a04, 0x071c1904, 0x081c1903, 0x081d1803, 0x091d1703, 0x091e1702,
1002480d8f6aSjmcneill 0x0a1e1602, 0x0b1e1502, 0x0c1e1501, 0x0c1f1401, 0x0d1f1400, 0x0e1f1300, 0x0e1f1201, 0x0f1f1200,
1003480d8f6aSjmcneill
1004480d8f6aSjmcneill 0x00111e11, 0x00121e10, 0x00131e0f, 0x00131e0f, 0x01131e0e, 0x01141d0e, 0x02151d0c, 0x02151d0c,
1005480d8f6aSjmcneill 0x02161d0b, 0x03161c0b, 0x03171c0a, 0x04171c09, 0x04181b09, 0x05181b08, 0x05191b07, 0x06191a07,
1006480d8f6aSjmcneill 0x061a1a06, 0x071a1906, 0x071b1905, 0x081b1805, 0x091b1804, 0x091c1704, 0x0a1c1703, 0x0a1c1604,
1007480d8f6aSjmcneill 0x0b1d1602, 0x0c1d1502, 0x0c1d1502, 0x0d1d1402, 0x0e1d1401, 0x0e1e1301, 0x0f1e1300, 0x101e1200,
1008480d8f6aSjmcneill
1009480d8f6aSjmcneill 0x00111e11, 0x00121e10, 0x00131d10, 0x01131d0f, 0x01141d0e, 0x01141d0e, 0x02151c0d, 0x02151c0d,
1010480d8f6aSjmcneill 0x03161c0b, 0x03161c0b, 0x04171b0a, 0x04171b0a, 0x05171b09, 0x05181a09, 0x06181a08, 0x06191a07,
1011480d8f6aSjmcneill 0x07191907, 0x071a1906, 0x081a1806, 0x081a1806, 0x091a1805, 0x0a1b1704, 0x0a1b1704, 0x0b1c1603,
1012480d8f6aSjmcneill 0x0b1c1603, 0x0c1c1503, 0x0d1c1502, 0x0d1d1402, 0x0e1d1401, 0x0f1d1301, 0x0f1d1301, 0x101e1200,
1013480d8f6aSjmcneill };
1014480d8f6aSjmcneill
1015480d8f6aSjmcneill static void
sunxi_mixer_vsu_init(struct sunxi_mixer_softc * sc,u_int src_w,u_int src_h,u_int crtc_w,u_int crtc_h,const struct drm_format_info * format)1016480d8f6aSjmcneill sunxi_mixer_vsu_init(struct sunxi_mixer_softc *sc, u_int src_w, u_int src_h,
10173973e774Sriastradh u_int crtc_w, u_int crtc_h, const struct drm_format_info *format)
1018480d8f6aSjmcneill {
1019480d8f6aSjmcneill const u_int hstep = (src_w << 16) / crtc_w;
1020480d8f6aSjmcneill const u_int vstep = (src_h << 16) / crtc_h;
1021480d8f6aSjmcneill
10223973e774Sriastradh const int hsub = format->hsub;
10233973e774Sriastradh const int vsub = format->vsub;
1024480d8f6aSjmcneill
1025480d8f6aSjmcneill const u_int src_cw = src_w / hsub;
1026480d8f6aSjmcneill const u_int src_ch = src_h / vsub;
1027480d8f6aSjmcneill
1028480d8f6aSjmcneill VSU_WRITE(sc, VS_OUT_SIZE_REG, ((crtc_h - 1) << 16) | (crtc_w - 1));
1029480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_SIZE_REG, ((src_h - 1) << 16) | (src_w - 1));
1030480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_HSTEP_REG, hstep << 4);
1031480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_VSTEP_REG, vstep << 4);
1032480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_HPHASE_REG, 0);
1033480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_VPHASE0_REG, 0);
1034480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_VPHASE1_REG, 0);
1035480d8f6aSjmcneill VSU_WRITE(sc, VS_C_SIZE_REG, ((src_ch - 1) << 16) | (src_cw - 1));
1036480d8f6aSjmcneill VSU_WRITE(sc, VS_C_HSTEP_REG, (hstep / hsub) << 4);
1037480d8f6aSjmcneill VSU_WRITE(sc, VS_C_VSTEP_REG, (vstep / vsub) << 4);
1038480d8f6aSjmcneill VSU_WRITE(sc, VS_C_HPHASE_REG, 0);
1039480d8f6aSjmcneill VSU_WRITE(sc, VS_C_VPHASE0_REG, 0);
1040480d8f6aSjmcneill VSU_WRITE(sc, VS_C_VPHASE1_REG, 0);
1041480d8f6aSjmcneill
1042480d8f6aSjmcneill /* XXX */
1043480d8f6aSjmcneill const u_int coef_base = 0;
1044480d8f6aSjmcneill
1045480d8f6aSjmcneill for (int i = 0; i < 32; i++) {
1046480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_HCOEF0_REG(i), lan3coefftab32_left[coef_base + i]);
1047480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_HCOEF1_REG(i), lan3coefftab32_right[coef_base + i]);
1048480d8f6aSjmcneill VSU_WRITE(sc, VS_Y_VCOEF_REG(i), lan2coefftab32[coef_base + i]);
1049480d8f6aSjmcneill VSU_WRITE(sc, VS_C_HCOEF0_REG(i), lan3coefftab32_left[coef_base + i]);
1050480d8f6aSjmcneill VSU_WRITE(sc, VS_C_HCOEF1_REG(i), lan3coefftab32_right[coef_base + i]);
1051480d8f6aSjmcneill VSU_WRITE(sc, VS_C_VCOEF_REG(i), lan2coefftab32[coef_base + i]);
1052480d8f6aSjmcneill }
1053480d8f6aSjmcneill
1054480d8f6aSjmcneill /* Commit settings and enable scaler */
1055480d8f6aSjmcneill VSU_WRITE(sc, VS_CTRL_REG, VS_CTRL_COEF_SWITCH_EN | VS_CTRL_EN);
1056480d8f6aSjmcneill }
1057480d8f6aSjmcneill
1058480d8f6aSjmcneill static const u32 yuv2rgb[] = {
1059480d8f6aSjmcneill 0x000004A8, 0x00000000, 0x00000662, 0xFFFC865A,
1060480d8f6aSjmcneill 0x000004A8, 0xFFFFFE6F, 0xFFFFFCBF, 0x00021FF4,
1061480d8f6aSjmcneill 0x000004A8, 0x00000813, 0x00000000, 0xFFFBAE4A,
1062480d8f6aSjmcneill };
1063480d8f6aSjmcneill
1064480d8f6aSjmcneill static void
sunxi_mixer_csc_init(struct sunxi_mixer_softc * sc,uint32_t pixel_format)1065480d8f6aSjmcneill sunxi_mixer_csc_init(struct sunxi_mixer_softc *sc, uint32_t pixel_format)
1066480d8f6aSjmcneill {
1067480d8f6aSjmcneill const u_int crtc_index = drm_crtc_index(&sc->sc_crtc.base);
1068480d8f6aSjmcneill
1069480d8f6aSjmcneill for (int i = 0; i < __arraycount(yuv2rgb); i++)
1070480d8f6aSjmcneill CSC_WRITE(sc, crtc_index, CSC_COEFF0_REG(0) + i * 4, yuv2rgb[i]);
1071480d8f6aSjmcneill
1072480d8f6aSjmcneill CSC_WRITE(sc, crtc_index, CSC_BYPASS_REG, CSC_BYPASS_DISABLE);
1073480d8f6aSjmcneill }
1074480d8f6aSjmcneill
1075480d8f6aSjmcneill static void
sunxi_mixer_csc_disable(struct sunxi_mixer_softc * sc)1076480d8f6aSjmcneill sunxi_mixer_csc_disable(struct sunxi_mixer_softc *sc)
1077480d8f6aSjmcneill {
1078480d8f6aSjmcneill const u_int crtc_index = drm_crtc_index(&sc->sc_crtc.base);
1079480d8f6aSjmcneill
1080480d8f6aSjmcneill CSC_WRITE(sc, crtc_index, CSC_BYPASS_REG, 0);
1081480d8f6aSjmcneill }
1082480d8f6aSjmcneill
10834f58e2b4Sjmcneill static int
sunxi_mixer_overlay_update_plane(struct drm_plane * plane,struct drm_crtc * crtc,struct drm_framebuffer * fb,int crtc_x,int crtc_y,u_int crtc_w,u_int crtc_h,uint32_t src_x,uint32_t src_y,uint32_t src_w,uint32_t src_h,struct drm_modeset_acquire_ctx * ctx)10844f58e2b4Sjmcneill sunxi_mixer_overlay_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
10854f58e2b4Sjmcneill struct drm_framebuffer *fb, int crtc_x, int crtc_y, u_int crtc_w, u_int crtc_h,
10863973e774Sriastradh uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h,
10873973e774Sriastradh struct drm_modeset_acquire_ctx *ctx)
10884f58e2b4Sjmcneill {
1089afcdf04fSjmcneill struct sunxi_mixer_plane *overlay = to_sunxi_mixer_plane(plane);
10904f58e2b4Sjmcneill struct sunxi_mixer_softc * const sc = overlay->sc;
10914f58e2b4Sjmcneill struct sunxi_drm_framebuffer *sfb = to_sunxi_drm_framebuffer(fb);
10924f58e2b4Sjmcneill uint32_t val;
10934f58e2b4Sjmcneill
10943973e774Sriastradh const u_int fbfmt = sunxi_mixer_overlay_format(fb->format->format);
10954f58e2b4Sjmcneill const uint64_t paddr = (uint64_t)sfb->obj->dmamap->dm_segs[0].ds_addr;
10964f58e2b4Sjmcneill
10974f58e2b4Sjmcneill const uint32_t input_size = (((src_h >> 16) - 1) << 16) | ((src_w >> 16) - 1);
10984f58e2b4Sjmcneill const uint32_t input_pos = ((src_y >> 16) << 16) | (src_x >> 16);
10994f58e2b4Sjmcneill
11004f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_MBSIZE(0), input_size);
11014f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_COOR(0), input_pos);
11024f58e2b4Sjmcneill
1103480d8f6aSjmcneill /* Note: DRM and hardware's ideas of pitch 1 and 2 are swapped */
1104480d8f6aSjmcneill
11054f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_PITCH0(0), fb->pitches[0]);
1106480d8f6aSjmcneill OVL_V_WRITE(sc, OVL_V_PITCH1(0), fb->pitches[2]);
1107480d8f6aSjmcneill OVL_V_WRITE(sc, OVL_V_PITCH2(0), fb->pitches[1]);
11084f58e2b4Sjmcneill
11094f58e2b4Sjmcneill const uint64_t paddr0 = paddr + fb->offsets[0] +
11103973e774Sriastradh (src_x >> 16) * fb->format->cpp[0] +
11114f58e2b4Sjmcneill (src_y >> 16) * fb->pitches[0];
1112480d8f6aSjmcneill const uint64_t paddr1 = paddr + fb->offsets[2] +
11133973e774Sriastradh (src_x >> 16) * fb->format->cpp[2] +
11144f58e2b4Sjmcneill (src_y >> 16) * fb->pitches[2];
1115480d8f6aSjmcneill const uint64_t paddr2 = paddr + fb->offsets[1] +
11163973e774Sriastradh (src_x >> 16) * fb->format->cpp[1] +
1117480d8f6aSjmcneill (src_y >> 16) * fb->pitches[1];
11184f58e2b4Sjmcneill
11194f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_TOP_HADD0, (paddr0 >> 32) & OVL_V_TOP_HADD_LAYER0);
11204f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_TOP_HADD1, (paddr1 >> 32) & OVL_V_TOP_HADD_LAYER0);
11214f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_TOP_HADD2, (paddr2 >> 32) & OVL_V_TOP_HADD_LAYER0);
11224f58e2b4Sjmcneill
11234f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_TOP_LADD0(0), paddr0 & 0xffffffff);
11244f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_TOP_LADD1(0), paddr1 & 0xffffffff);
11254f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_TOP_LADD2(0), paddr2 & 0xffffffff);
11264f58e2b4Sjmcneill
11274f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_SIZE, input_size);
11284f58e2b4Sjmcneill
11294f58e2b4Sjmcneill val = OVL_V_ATTCTL_LAY0_EN;
11304f58e2b4Sjmcneill val |= __SHIFTIN(fbfmt, OVL_V_ATTCTL_LAY_FBFMT);
11313973e774Sriastradh if (sunxi_mixer_overlay_rgb(fb->format->format) == true)
11324f58e2b4Sjmcneill val |= OVL_V_ATTCTL_VIDEO_UI_SEL;
11334f58e2b4Sjmcneill OVL_V_WRITE(sc, OVL_V_ATTCTL(0), val);
11344f58e2b4Sjmcneill
1135480d8f6aSjmcneill /* Enable video scaler */
11363973e774Sriastradh sunxi_mixer_vsu_init(sc, src_w >> 16, src_h >> 16, crtc_w, crtc_h, fb->format);
1137480d8f6aSjmcneill
1138480d8f6aSjmcneill /* Enable colour space conversion for non-RGB formats */
11393973e774Sriastradh if (sunxi_mixer_overlay_rgb(fb->format->format) == false)
11403973e774Sriastradh sunxi_mixer_csc_init(sc, fb->format->format);
1141480d8f6aSjmcneill else
1142480d8f6aSjmcneill sunxi_mixer_csc_disable(sc);
1143480d8f6aSjmcneill
11444f58e2b4Sjmcneill /* Set blender 1 input size */
1145480d8f6aSjmcneill BLD_WRITE(sc, BLD_CH_ISIZE(1), ((crtc_h - 1) << 16) | (crtc_w - 1));
11464f58e2b4Sjmcneill /* Set blender 1 offset */
11474f58e2b4Sjmcneill BLD_WRITE(sc, BLD_CH_OFFSET(1), (crtc_y << 16) | crtc_x);
11484f58e2b4Sjmcneill /* Route channel 0 to pipe 1 */
11494f58e2b4Sjmcneill val = BLD_READ(sc, BLD_CH_RTCTL);
11504f58e2b4Sjmcneill val &= ~BLD_CH_RTCTL_P1;
11514f58e2b4Sjmcneill val |= __SHIFTIN(0, BLD_CH_RTCTL_P1);
11524f58e2b4Sjmcneill BLD_WRITE(sc, BLD_CH_RTCTL, val);
11534f58e2b4Sjmcneill
11544f58e2b4Sjmcneill /* Enable pipe 1 */
11554f58e2b4Sjmcneill val = BLD_READ(sc, BLD_FILL_COLOR_CTL);
11564f58e2b4Sjmcneill val |= BLD_FILL_COLOR_CTL_P1_EN;
11574f58e2b4Sjmcneill BLD_WRITE(sc, BLD_FILL_COLOR_CTL, val);
11584f58e2b4Sjmcneill
11594f58e2b4Sjmcneill /* Commit settings */
11604f58e2b4Sjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
11614f58e2b4Sjmcneill
11624f58e2b4Sjmcneill return 0;
11634f58e2b4Sjmcneill }
11644f58e2b4Sjmcneill
11654f58e2b4Sjmcneill static int
sunxi_mixer_overlay_disable_plane(struct drm_plane * plane,struct drm_modeset_acquire_ctx * ctx)11663973e774Sriastradh sunxi_mixer_overlay_disable_plane(struct drm_plane *plane,
11673973e774Sriastradh struct drm_modeset_acquire_ctx *ctx)
11684f58e2b4Sjmcneill {
1169afcdf04fSjmcneill struct sunxi_mixer_plane *overlay = to_sunxi_mixer_plane(plane);
11704f58e2b4Sjmcneill struct sunxi_mixer_softc * const sc = overlay->sc;
11714f58e2b4Sjmcneill uint32_t val;
11724f58e2b4Sjmcneill
1173480d8f6aSjmcneill sunxi_mixer_csc_disable(sc);
1174480d8f6aSjmcneill
11754f58e2b4Sjmcneill val = BLD_READ(sc, BLD_FILL_COLOR_CTL);
11764f58e2b4Sjmcneill val &= ~BLD_FILL_COLOR_CTL_P1_EN;
11774f58e2b4Sjmcneill BLD_WRITE(sc, BLD_FILL_COLOR_CTL, val);
11784f58e2b4Sjmcneill
11794f58e2b4Sjmcneill /* Commit settings */
11804f58e2b4Sjmcneill GLB_WRITE(sc, GLB_DBUFFER, GLB_DBUFFER_DOUBLE_BUFFER_RDY);
11814f58e2b4Sjmcneill
11824f58e2b4Sjmcneill return 0;
11834f58e2b4Sjmcneill }
11844f58e2b4Sjmcneill
11854f58e2b4Sjmcneill static const struct drm_plane_funcs sunxi_mixer_overlay_funcs = {
11864f58e2b4Sjmcneill .update_plane = sunxi_mixer_overlay_update_plane,
11874f58e2b4Sjmcneill .disable_plane = sunxi_mixer_overlay_disable_plane,
11884f58e2b4Sjmcneill .destroy = sunxi_mixer_overlay_destroy,
11894f58e2b4Sjmcneill };
11904f58e2b4Sjmcneill
11914f58e2b4Sjmcneill static uint32_t sunxi_mixer_overlay_formats[] = {
1192afcdf04fSjmcneill DRM_FORMAT_ARGB8888,
11934f58e2b4Sjmcneill DRM_FORMAT_XRGB8888,
11944f58e2b4Sjmcneill #if notyet
11954f58e2b4Sjmcneill DRM_FORMAT_VYUY,
11964f58e2b4Sjmcneill DRM_FORMAT_YVYU,
11974f58e2b4Sjmcneill DRM_FORMAT_UYVY,
11984f58e2b4Sjmcneill DRM_FORMAT_YUYV,
1199480d8f6aSjmcneill #endif
12004f58e2b4Sjmcneill DRM_FORMAT_YUV422,
12014f58e2b4Sjmcneill DRM_FORMAT_YUV420,
12024f58e2b4Sjmcneill DRM_FORMAT_YUV411,
12034f58e2b4Sjmcneill };
12044f58e2b4Sjmcneill
1205a9d03646Sjmcneill static int
sunxi_mixer_ep_activate(device_t dev,struct fdt_endpoint * ep,bool activate)1206a9d03646Sjmcneill sunxi_mixer_ep_activate(device_t dev, struct fdt_endpoint *ep, bool activate)
1207a9d03646Sjmcneill {
1208a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = device_private(dev);
1209a9d03646Sjmcneill struct drm_device *ddev;
1210afcdf04fSjmcneill bus_size_t reg;
1211a9d03646Sjmcneill
1212a9d03646Sjmcneill if (!activate)
1213a9d03646Sjmcneill return EINVAL;
1214a9d03646Sjmcneill
1215a9d03646Sjmcneill ddev = sunxi_drm_endpoint_device(ep);
1216a9d03646Sjmcneill if (ddev == NULL) {
1217a9d03646Sjmcneill DRM_ERROR("couldn't find DRM device\n");
1218a9d03646Sjmcneill return ENXIO;
1219a9d03646Sjmcneill }
1220a9d03646Sjmcneill
1221a9d03646Sjmcneill sc->sc_crtc.sc = sc;
12224f58e2b4Sjmcneill sc->sc_overlay.sc = sc;
1223a9d03646Sjmcneill
1224afcdf04fSjmcneill /* Initialize registers */
1225afcdf04fSjmcneill for (reg = 0; reg < 0xc000; reg += 4)
1226afcdf04fSjmcneill bus_space_write_4(sc->sc_bst, sc->sc_bsh, reg, 0);
1227afcdf04fSjmcneill BLD_WRITE(sc, BLD_CTL(0), 0x03010301);
1228afcdf04fSjmcneill BLD_WRITE(sc, BLD_CTL(1), 0x03010301);
1229afcdf04fSjmcneill BLD_WRITE(sc, BLD_CTL(2), 0x03010301);
1230afcdf04fSjmcneill BLD_WRITE(sc, BLD_CTL(3), 0x03010301);
1231afcdf04fSjmcneill
12325d72569bSjmcneill if (sc->sc_ovl_ui_count > 1)
12335d72569bSjmcneill drm_crtc_init(ddev, &sc->sc_crtc.base, &sunxi_mixer0_crtc_funcs);
12345d72569bSjmcneill else
12355d72569bSjmcneill drm_crtc_init(ddev, &sc->sc_crtc.base, &sunxi_mixer1_crtc_funcs);
1236a9d03646Sjmcneill drm_crtc_helper_add(&sc->sc_crtc.base, &sunxi_mixer_crtc_helper_funcs);
1237a9d03646Sjmcneill
12384f58e2b4Sjmcneill drm_universal_plane_init(ddev, &sc->sc_overlay.base,
12394f58e2b4Sjmcneill 1 << drm_crtc_index(&sc->sc_crtc.base), &sunxi_mixer_overlay_funcs,
12404f58e2b4Sjmcneill sunxi_mixer_overlay_formats, __arraycount(sunxi_mixer_overlay_formats),
12413973e774Sriastradh NULL, DRM_PLANE_TYPE_OVERLAY, NULL);
12424f58e2b4Sjmcneill
1243a9d03646Sjmcneill return fdt_endpoint_activate(ep, activate);
1244a9d03646Sjmcneill }
1245a9d03646Sjmcneill
1246a9d03646Sjmcneill static void *
sunxi_mixer_ep_get_data(device_t dev,struct fdt_endpoint * ep)1247a9d03646Sjmcneill sunxi_mixer_ep_get_data(device_t dev, struct fdt_endpoint *ep)
1248a9d03646Sjmcneill {
1249a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = device_private(dev);
1250a9d03646Sjmcneill
1251a9d03646Sjmcneill return &sc->sc_crtc;
1252a9d03646Sjmcneill }
1253a9d03646Sjmcneill
1254a9d03646Sjmcneill static int
sunxi_mixer_match(device_t parent,cfdata_t cf,void * aux)1255a9d03646Sjmcneill sunxi_mixer_match(device_t parent, cfdata_t cf, void *aux)
1256a9d03646Sjmcneill {
1257a9d03646Sjmcneill struct fdt_attach_args * const faa = aux;
1258a9d03646Sjmcneill
12596e54367aSthorpej return of_compatible_match(faa->faa_phandle, compat_data);
1260a9d03646Sjmcneill }
1261a9d03646Sjmcneill
1262a9d03646Sjmcneill static void
sunxi_mixer_attach(device_t parent,device_t self,void * aux)1263a9d03646Sjmcneill sunxi_mixer_attach(device_t parent, device_t self, void *aux)
1264a9d03646Sjmcneill {
1265a9d03646Sjmcneill struct sunxi_mixer_softc * const sc = device_private(self);
1266a9d03646Sjmcneill struct fdt_attach_args * const faa = aux;
1267a9d03646Sjmcneill struct fdt_endpoint *out_ep;
1268a9d03646Sjmcneill const int phandle = faa->faa_phandle;
1269b23f4a3aSjakllsch const struct sunxi_mixer_compat_data * const cd =
12706e54367aSthorpej of_compatible_lookup(phandle, compat_data)->data;
1271a9d03646Sjmcneill struct clk *clk_bus, *clk_mod;
1272a9d03646Sjmcneill struct fdtbus_reset *rst;
1273a9d03646Sjmcneill bus_addr_t addr;
1274a9d03646Sjmcneill bus_size_t size;
1275a9d03646Sjmcneill
1276a9d03646Sjmcneill if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
1277a9d03646Sjmcneill aprint_error(": couldn't get registers\n");
1278a9d03646Sjmcneill return;
1279a9d03646Sjmcneill }
1280a9d03646Sjmcneill
1281a9d03646Sjmcneill rst = fdtbus_reset_get_index(phandle, 0);
1282a9d03646Sjmcneill if (rst == NULL || fdtbus_reset_deassert(rst) != 0) {
1283a9d03646Sjmcneill aprint_error(": couldn't de-assert reset\n");
1284a9d03646Sjmcneill return;
1285a9d03646Sjmcneill }
1286a9d03646Sjmcneill
1287a9d03646Sjmcneill clk_bus = fdtbus_clock_get(phandle, "bus");
1288a9d03646Sjmcneill if (clk_bus == NULL || clk_enable(clk_bus) != 0) {
1289a9d03646Sjmcneill aprint_error(": couldn't enable bus clock\n");
1290a9d03646Sjmcneill return;
1291a9d03646Sjmcneill }
1292a9d03646Sjmcneill
1293a9d03646Sjmcneill clk_mod = fdtbus_clock_get(phandle, "mod");
1294a9d03646Sjmcneill if (clk_mod == NULL ||
1295a9d03646Sjmcneill clk_set_rate(clk_mod, SUNXI_MIXER_FREQ) != 0 ||
1296a9d03646Sjmcneill clk_enable(clk_mod) != 0) {
1297a9d03646Sjmcneill aprint_error(": couldn't enable mod clock\n");
1298a9d03646Sjmcneill return;
1299a9d03646Sjmcneill }
1300a9d03646Sjmcneill
1301a9d03646Sjmcneill sc->sc_dev = self;
1302a9d03646Sjmcneill sc->sc_bst = faa->faa_bst;
1303a9d03646Sjmcneill if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
1304a9d03646Sjmcneill aprint_error(": couldn't map registers\n");
1305a9d03646Sjmcneill return;
1306a9d03646Sjmcneill }
1307a9d03646Sjmcneill sc->sc_phandle = faa->faa_phandle;
1308b23f4a3aSjakllsch sc->sc_ovl_ui_count = cd->ovl_ui_count;
1309a9d03646Sjmcneill
1310a9d03646Sjmcneill aprint_naive("\n");
1311a9d03646Sjmcneill aprint_normal(": Display Engine Mixer\n");
1312a9d03646Sjmcneill
1313a9d03646Sjmcneill sc->sc_ports.dp_ep_activate = sunxi_mixer_ep_activate;
1314a9d03646Sjmcneill sc->sc_ports.dp_ep_get_data = sunxi_mixer_ep_get_data;
1315a9d03646Sjmcneill fdt_ports_register(&sc->sc_ports, self, phandle, EP_DRM_CRTC);
1316a9d03646Sjmcneill
1317b23f4a3aSjakllsch out_ep = fdt_endpoint_get_from_index(&sc->sc_ports,
1318b23f4a3aSjakllsch MIXER_PORT_OUTPUT, cd->mixer_index);
1319b23f4a3aSjakllsch if (out_ep == NULL) {
1320b23f4a3aSjakllsch /* Couldn't find new-style DE2 endpoint, try old style. */
1321b23f4a3aSjakllsch out_ep = fdt_endpoint_get_from_index(&sc->sc_ports,
1322b23f4a3aSjakllsch MIXER_PORT_OUTPUT, 0);
1323b23f4a3aSjakllsch }
1324b23f4a3aSjakllsch
1325a9d03646Sjmcneill if (out_ep != NULL)
1326a9d03646Sjmcneill sunxi_drm_register_endpoint(phandle, out_ep);
1327a9d03646Sjmcneill }
1328a9d03646Sjmcneill
1329a9d03646Sjmcneill CFATTACH_DECL_NEW(sunxi_mixer, sizeof(struct sunxi_mixer_softc),
1330a9d03646Sjmcneill sunxi_mixer_match, sunxi_mixer_attach, NULL, NULL);
1331