xref: /openbsd-src/sys/arch/armv7/omap/omdisplay.c (revision 0f9e9ec23bb2b65cc62a3d17df12827a45dae80c)
1*0f9e9ec2Sjsg /* $OpenBSD: omdisplay.c,v 1.11 2024/05/13 01:15:50 jsg Exp $ */
28eda2d14Spatrick /*
38eda2d14Spatrick  * Copyright (c) 2007 Dale Rahn <drahn@openbsd.org>
48eda2d14Spatrick  *
58eda2d14Spatrick  * Permission to use, copy, modify, and distribute this software for any
68eda2d14Spatrick  * purpose with or without fee is hereby granted, provided that the above
78eda2d14Spatrick  * copyright notice and this permission notice appear in all copies.
88eda2d14Spatrick  *
98eda2d14Spatrick  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
108eda2d14Spatrick  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
118eda2d14Spatrick  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
128eda2d14Spatrick  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
138eda2d14Spatrick  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
148eda2d14Spatrick  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
158eda2d14Spatrick  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
168eda2d14Spatrick  */
178eda2d14Spatrick 
188eda2d14Spatrick #include <sys/param.h>
198eda2d14Spatrick #include <sys/systm.h>
208eda2d14Spatrick #include <sys/queue.h>
218eda2d14Spatrick #include <sys/malloc.h>
228eda2d14Spatrick #include <sys/device.h>
238eda2d14Spatrick #include <sys/evcount.h>
248eda2d14Spatrick #include <sys/conf.h>
258eda2d14Spatrick #include <sys/uio.h>
268eda2d14Spatrick #include <machine/bus.h>
278eda2d14Spatrick #include <armv7/omap/omgpiovar.h>
288eda2d14Spatrick 
298eda2d14Spatrick #include <dev/cons.h>
308eda2d14Spatrick #include <dev/wscons/wsconsio.h>
318eda2d14Spatrick #include <dev/wscons/wsdisplayvar.h>
328eda2d14Spatrick #include <dev/wscons/wscons_callbacks.h>
338eda2d14Spatrick 
348eda2d14Spatrick #include <dev/rasops/rasops.h>
358eda2d14Spatrick 
368eda2d14Spatrick #include "splash16.h"
378eda2d14Spatrick 
388eda2d14Spatrick #define OMDISPLAY_SIZE			0x1000
398eda2d14Spatrick /* registers */
408eda2d14Spatrick /* DSS */
418eda2d14Spatrick #define DSS_REVISIONNUMBER		0x00
428eda2d14Spatrick #define DSS_CONTROL			0x40
438eda2d14Spatrick #define DSS_PSA_LCD_REG_1		0x50
448eda2d14Spatrick #define DSS_PSA_LCD_REG_2		0x54
458eda2d14Spatrick #define DSS_PSA_VIDEO_REG		0x58
468eda2d14Spatrick #define DSS_STATUS			0x5C
478eda2d14Spatrick 
488eda2d14Spatrick /* DCR */
498eda2d14Spatrick #define DISPC_REVISION			0x0000
508eda2d14Spatrick #define DISPC_SYSCONFIG			0x0010
518eda2d14Spatrick #define		DISPC_SYSCONFIG_AUTOIDLE		0x00000001
528eda2d14Spatrick #define		DISPC_SYSCONFIG_SOFTRESET		0x00000002
538eda2d14Spatrick #define		DISPC_SYSCONFIG_SIDLEMODE_FORCE		0x00000000
548eda2d14Spatrick #define		DISPC_SYSCONFIG_SIDLEMODE_NONE		0x00000008
558eda2d14Spatrick #define		DISPC_SYSCONFIG_SIDLEMODE_SMART		0x00000010
568eda2d14Spatrick #define		DISPC_SYSCONFIG_MIDLEMODE_FORCE		0x00000000
578eda2d14Spatrick #define		DISPC_SYSCONFIG_MIDLEMODE_NONE		0x00001000
588eda2d14Spatrick #define		DISPC_SYSCONFIG_MIDLEMODE_SMART		0x00002000
598eda2d14Spatrick #define DISPC_SYSSTATUS			0x0014
608eda2d14Spatrick #define		DISPC_SYSTATUS_RESETDONE		0x00000001
618eda2d14Spatrick #define DISPC_IRQSTATUS			0x0018
628eda2d14Spatrick #define		DISPC_IRQSTATUS_FRAMEDONE		0x00000001
638eda2d14Spatrick #define		DISPC_IRQSTATUS_VSYNC			0x00000002
648eda2d14Spatrick #define		DISPC_IRQSTATUS_EVSYNCEVEN		0x00000004
658eda2d14Spatrick #define		DISPC_IRQSTATUS_EVSYNCODD		0x00000008
668eda2d14Spatrick #define		DISPC_IRQSTATUS_ACBIASCOUNT		0x00000010
678eda2d14Spatrick #define		DISPC_IRQSTATUS_PROGLINENUM		0x00000020
688eda2d14Spatrick #define		DISPC_IRQSTATUS_GFXFIFOUNDER		0x00000040
698eda2d14Spatrick #define		DISPC_IRQSTATUS_GFXENDWINDOW		0x00000080
708eda2d14Spatrick #define		DISPC_IRQSTATUS_PALGAMMA		0x00000100
718eda2d14Spatrick #define		DISPC_IRQSTATUS_OCPERROR		0x00000200
728eda2d14Spatrick #define		DISPC_IRQSTATUS_VID1FIFOUNDER		0x00000400
738eda2d14Spatrick #define		DISPC_IRQSTATUS_VID1ENDWIND		0x00000800
748eda2d14Spatrick #define		DISPC_IRQSTATUS_VID2FIFOUNDER		0x00001000
758eda2d14Spatrick #define		DISPC_IRQSTATUS_VID2ENDWIND		0x00002000
768eda2d14Spatrick #define		DISPC_IRQSTATUS_SYNCLOST		0x00004000
778eda2d14Spatrick #define DISPC_IRQENABLE			0x001C
788eda2d14Spatrick #define		DISPC_IRQENABLE_FRAMEDONE		0x00000001
798eda2d14Spatrick #define		DISPC_IRQENABLE_VSYNC			0x00000002
808eda2d14Spatrick #define		DISPC_IRQENABLE_EVSYNCEVEN		0x00000004
818eda2d14Spatrick #define		DISPC_IRQENABLE_EVSYNCODD		0x00000008
828eda2d14Spatrick #define		DISPC_IRQENABLE_ACBIASCOUNT		0x00000010
838eda2d14Spatrick #define		DISPC_IRQENABLE_PROGLINENUM		0x00000020
848eda2d14Spatrick #define		DISPC_IRQENABLE_GFXFIFOUNDER		0x00000040
858eda2d14Spatrick #define		DISPC_IRQENABLE_GFXENDWINDOW		0x00000080
868eda2d14Spatrick #define		DISPC_IRQENABLE_PALGAMMA		0x00000100
878eda2d14Spatrick #define		DISPC_IRQENABLE_OCPERROR		0x00000200
888eda2d14Spatrick #define		DISPC_IRQENABLE_VID1FIFOUNDER		0x00000400
898eda2d14Spatrick #define		DISPC_IRQENABLE_VID1ENDWIND		0x00000800
908eda2d14Spatrick #define		DISPC_IRQENABLE_VID2FIFOUNDER		0x00001000
918eda2d14Spatrick #define		DISPC_IRQENABLE_VID2ENDWIND		0x00002000
928eda2d14Spatrick #define		DISPC_IRQENABLE_SYNCLOST		0x00004000
938eda2d14Spatrick #define DISPC_CONTROL			0x0040
948eda2d14Spatrick #define 	DISPC_CONTROL_LCDENABLE			0x00000001
958eda2d14Spatrick #define 	DISPC_CONTROL_DIGITALENABLE		0x00000002
968eda2d14Spatrick #define 	DISPC_CONTROL_MONOCOLOR			0x00000004
978eda2d14Spatrick #define 	DISPC_CONTROL_STNTFT			0x00000008
988eda2d14Spatrick #define 	DISPC_CONTROL_M8B			0x00000010
998eda2d14Spatrick #define 	DISPC_CONTROL_GOLCD			0x00000020
1008eda2d14Spatrick #define 	DISPC_CONTROL_GODIGITAL			0x00000040
1018eda2d14Spatrick #define 	DISPC_CONTROL_TFTDITHEREN		0x00000080
1028eda2d14Spatrick #define 	DISPC_CONTROL_TFTDATALINES_12		0x00000000
1038eda2d14Spatrick #define 	DISPC_CONTROL_TFTDATALINES_16		0x00000100
1048eda2d14Spatrick #define 	DISPC_CONTROL_TFTDATALINES_18		0x00000200
1058eda2d14Spatrick #define 	DISPC_CONTROL_TFTDATALINES_24		0x00000300
1068eda2d14Spatrick #define 	DISPC_CONTROL_SECURE			0x00000400
1078eda2d14Spatrick #define 	DISPC_CONTROL_RFBIMODE			0x00000800
1088eda2d14Spatrick #define 	DISPC_CONTROL_OVERLAYOPT		0x00001000
1098eda2d14Spatrick #define 	DISPC_CONTROL_GPIN0			0x00002000
1108eda2d14Spatrick #define 	DISPC_CONTROL_GPIN1			0x00004000
1118eda2d14Spatrick #define 	DISPC_CONTROL_GPOUT0			0x00008000
1128eda2d14Spatrick #define 	DISPC_CONTROL_GPOUT1			0x00010000
1138eda2d14Spatrick #define 	DISPC_CONTROL_HT			0x00070000
1148eda2d14Spatrick #define 	DISPC_CONTROL_HT_s(x)			((x) << 17)
1158eda2d14Spatrick #define 	DISPC_CONTROL_TDMENABLE			0x00100000
1168eda2d14Spatrick #define 	DISPC_CONTROL_TDMPARALLEL_8		0x00000000
1178eda2d14Spatrick #define 	DISPC_CONTROL_TDMPARALLEL_9		0x00200000
1188eda2d14Spatrick #define 	DISPC_CONTROL_TDMPARALLEL_12		0x00400000
1198eda2d14Spatrick #define 	DISPC_CONTROL_TDMPARALLEL_16		0x00600000
1208eda2d14Spatrick #define 	DISPC_CONTROL_TDMCYCLE_1		0x00000000
1218eda2d14Spatrick #define 	DISPC_CONTROL_TDMCYCLE_2		0x00800000
1228eda2d14Spatrick #define 	DISPC_CONTROL_TDMCYCLE_3		0x00000000
1238eda2d14Spatrick #define 	DISPC_CONTROL_TDMCYCLE_3_2		0x01800000
1248eda2d14Spatrick #define 	DISPC_CONTROL_TDMUNUSED_0		0x00000000
1258eda2d14Spatrick #define 	DISPC_CONTROL_TDMUNUSED_1		0x02000000
1268eda2d14Spatrick #define 	DISPC_CONTROL_TDMUNUSED_M		0x04000000
1278eda2d14Spatrick #define DISPC_CONFIG			0x0044
1288eda2d14Spatrick #define 	DISPC_CONFIG_PIXELGATED			0x00000001
1298eda2d14Spatrick #define 	DISPC_CONFIG_LOADMODE_PGE		0x00000000
1308eda2d14Spatrick #define 	DISPC_CONFIG_LOADMODE_PG		0x00000002
1318eda2d14Spatrick #define 	DISPC_CONFIG_LOADMODE_DATA		0x00000004
1328eda2d14Spatrick #define 	DISPC_CONFIG_LOADMODE_DATA_PG		0x00000006
1338eda2d14Spatrick #define 	DISPC_CONFIG_PALETTEGAMMA		0x00000008
1348eda2d14Spatrick #define 	DISPC_CONFIG_PIXELDATAGATED		0x00000010
1358eda2d14Spatrick #define 	DISPC_CONFIG_PIXELCLOCKGATED		0x00000020
1368eda2d14Spatrick #define 	DISPC_CONFIG_HSYNCGATED			0x00000040
1378eda2d14Spatrick #define 	DISPC_CONFIG_VSYNCGATED			0x00000080
1388eda2d14Spatrick #define 	DISPC_CONFIG_ACBIAGATED			0x00000100
1398eda2d14Spatrick #define 	DISPC_CONFIG_FUNCGATED			0x00000200
1408eda2d14Spatrick #define 	DISPC_CONFIG_TCKLCDEN			0x00000400
1418eda2d14Spatrick #define 	DISPC_CONFIG_TCKLCDSEL			0x00000800
1428eda2d14Spatrick #define 	DISPC_CONFIG_TCKDIGEN			0x00001000
1438eda2d14Spatrick #define 	DISPC_CONFIG_TCKDIGSEL			0x00002000
1448eda2d14Spatrick #define DISPC_CAPABLE			0x0048
1458eda2d14Spatrick #define DISPC_DEFAULT_COLOR0		0x004C
1468eda2d14Spatrick #define DISPC_DEFAULT_COLOR1		0x0050
1478eda2d14Spatrick #define DISPC_TRANS_COLOR0		0x0054
1488eda2d14Spatrick #define DISPC_TRANS_COLOR1		0x0058
1498eda2d14Spatrick #define DISPC_LINE_STATUS		0x005C
1508eda2d14Spatrick #define DISPC_LINE_NUMBER		0x0060
1518eda2d14Spatrick #define DISPC_TIMING_H			0x0064
1528eda2d14Spatrick #define		DISPC_TIMING_H_HSW_s(x)	((x) << 0)
1538eda2d14Spatrick #define		DISPC_TIMING_H_HFP_s(x)	((x) << 8)
1548eda2d14Spatrick #define		DISPC_TIMING_H_HBP_s(x)	((x) << 20)
1558eda2d14Spatrick #define DISPC_TIMING_V			0x0068
1568eda2d14Spatrick #define		DISPC_TIMING_V_VSW_s(x)	((x) << 0)
1578eda2d14Spatrick #define		DISPC_TIMING_V_VFP_s(x)	((x) << 8)
1588eda2d14Spatrick #define		DISPC_TIMING_V_VBP_s(x)	((x) << 20)
1598eda2d14Spatrick #define DISPC_POL_FREQ			0x006C
1608eda2d14Spatrick #define 	DISPC_POL_FREQ_ACB_s(x)	((x) << 0)
1618eda2d14Spatrick #define 	DISPC_POL_FREQ_ACBI_s(x)	((x) << 8)
1628eda2d14Spatrick #define 	DISPC_POL_FREQ_IVS	0x00001000
1638eda2d14Spatrick #define 	DISPC_POL_FREQ_IHS	0x00002000
1648eda2d14Spatrick #define 	DISPC_POL_FREQ_IPC	0x00004000
1658eda2d14Spatrick #define 	DISPC_POL_FREQ_IEO	0x00008000
1668eda2d14Spatrick #define 	DISPC_POL_FREQ_RF	0x00010000
1678eda2d14Spatrick #define 	DISPC_POL_FREQ_ONOFF	0x00020000
1688eda2d14Spatrick #define DISPC_DIVISOR			0x0070
1698eda2d14Spatrick #define		DISPC_DIVISOR_PCD_s(x)	((x) << 0)
1708eda2d14Spatrick #define		DISPC_DIVISOR_LCD_s(x)	((x) << 16)
1718eda2d14Spatrick #define DISPC_SIZE_DIG			0x0078
1728eda2d14Spatrick #define		DISPC_SIZE_DIG_PPL_s(x)	((x) << 0)
1738eda2d14Spatrick #define		DISPC_SIZE_DIG_LPP_s(x)	((x) << 16)
1748eda2d14Spatrick #define DISPC_SIZE_LCD			0x007C
1758eda2d14Spatrick #define		DISPC_SIZE_LCD_PPL_s(x)	((x) << 0)
1768eda2d14Spatrick #define		DISPC_SIZE_LCD_LPP_s(x)	((x) << 16)
1778eda2d14Spatrick #define DISPC_GFX_BA0			0x0080
1788eda2d14Spatrick #define DISPC_GFX_BA1			0x0084
1798eda2d14Spatrick #define DISPC_GFX_POSITION		0x0088
1808eda2d14Spatrick #define DISPC_GFX_SIZE			0x008C
1818eda2d14Spatrick #define		DISPC_GFX_SIZE_X_s(x)	((x) << 0)
1828eda2d14Spatrick #define		DISPC_GFX_SIZE_Y_s(x)	((x) << 16)
1838eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES		0x00A0
1848eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXENABLE		0x001
1858eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_1		0x000
1868eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_2		0x002
1878eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_4		0x004
1888eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_8		0x006
1898eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_12		0x008
1908eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_16		0x00c
1918eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXFMT_24		0x010
1928eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXREPLICATE	0x020
1938eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_BURST_4		0x000
1948eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_BURST_8		0x040
1958eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_BURST_16		0x080
1968eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_GFXCHANNELOUT	0x100
1978eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_NIBBLEMODE		0x200
1988eda2d14Spatrick #define		DISPC_GFX_ATTRIBUTES_ENDIAN		0x400
1998eda2d14Spatrick #define DISPC_GFX_FIFO_THRESHOLD	0x00A4
2008eda2d14Spatrick #define 	DISPC_GFX_FIFO_THRESHOLD_HIGH_SHIFT	16
2018eda2d14Spatrick #define 	DISPC_GFX_FIFO_THRESHOLD_LOW_SHIFT	0
2028eda2d14Spatrick #define DISPC_GFX_FIFO_SIZE_STATUS	0x00A8
2038eda2d14Spatrick #define DISPC_GFX_ROW_INC		0x00AC
2048eda2d14Spatrick #define DISPC_GFX_PIXEL_INC		0x00B0
2058eda2d14Spatrick #define DISPC_GFX_WINDOW_SKIP		0x00B4
2068eda2d14Spatrick #define DISPC_GFX_TABLE_BA		0x00B8
2078eda2d14Spatrick #define DISPC_VID1_BA0			0x00BC
2088eda2d14Spatrick #define DISPC_VID1_BA1			0x00C0
2098eda2d14Spatrick #define DISPC_VID1_POSITION		0x00C4
2108eda2d14Spatrick #define DISPC_VID1_SIZE			0x00C8
2118eda2d14Spatrick #define DISPC_VID1_ATTRIBUTES		0x00CC
2128eda2d14Spatrick #define DISPC_VID1_FIFO_THRESHOLD	0x00D0
2138eda2d14Spatrick #define DISPC_VID1_FIFO_SIZE_STATUS	0x00D4
2148eda2d14Spatrick #define DISPC_VID1_ROW_INC		0x00D8
2158eda2d14Spatrick #define DISPC_VID1_PIXEL_INC		0x00DC
2168eda2d14Spatrick #define DISPC_VID1_FIR			0x00E0
2178eda2d14Spatrick #define DISPC_VID1_PICTURE_SIZE		0x00E4
2188eda2d14Spatrick #define DISPC_VID1_ACCU0 		0x00E8
2198eda2d14Spatrick #define DISPC_VID1_ACCU1		0x00EC
2208eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H0		0x00F0
2218eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H1		0x00F8
2228eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H2		0x0100
2238eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H3		0x0108
2248eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H4		0x0110
2258eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H5		0x0118
2268eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H6		0x0120
2278eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H7		0x0128
2288eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV0		0x00F4
2298eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV1		0x00FC
2308eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV2		0x0104
2318eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV3		0x010C
2328eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV4		0x0114
2338eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV5		0x011C
2348eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV6		0x0124
2358eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV7		0x012C
2368eda2d14Spatrick #define DISPC_VID1_CONV_COEF0		0x0130
2378eda2d14Spatrick #define DISPC_VID1_CONV_COEF1		0x0134
2388eda2d14Spatrick #define DISPC_VID1_CONV_COEF2		0x0138
2398eda2d14Spatrick #define DISPC_VID1_CONV_COEF3		0x013C
2408eda2d14Spatrick #define DISPC_VID1_CONV_COEF4		0x0140
2418eda2d14Spatrick #define DISPC_VID2_BA0			0x014C
2428eda2d14Spatrick #define DISPC_VID2_BA1			0x0150
2438eda2d14Spatrick #define DISPC_VID2_POSITION		0x0154
2448eda2d14Spatrick #define DISPC_VID2_SIZE			0x0158
2458eda2d14Spatrick #define DISPC_VID2_ATTRIBUTES		0x015C
2468eda2d14Spatrick #define DISPC_VID2_FIFO_THRESHOLD	0x0160
2478eda2d14Spatrick #define DISPC_VID2_FIFO_SIZE_STATUS	0x0164
2488eda2d14Spatrick #define DISPC_VID2_ROW_INC		0x0168
2498eda2d14Spatrick #define DISPC_VID2_PIXEL_INC		0x016C
2508eda2d14Spatrick #define DISPC_VID2_FIR			0x0170
2518eda2d14Spatrick #define DISPC_VID2_PICTURE_SIZE		0x0174
2528eda2d14Spatrick #define DISPC_VID2_ACCU0		0x0178
2538eda2d14Spatrick #define DISPC_VID2_ACCU1		0x017C
2548eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H0		0x0180
2558eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H1		0x0188
2568eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H2		0x0190
2578eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H3		0x0198
2588eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H4		0x01A0
2598eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H5		0x01A8
2608eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H6		0x01B0
2618eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H7		0x01B8
2628eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV0		0x0184
2638eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV1		0x018C
2648eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV2		0x0194
2658eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV3		0x019C
2668eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV4		0x01A4
2678eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV5		0x01AC
2688eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV6		0x01B4
2698eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV7		0x01BC
2708eda2d14Spatrick #define DISPC_VID2_CONV_COEF0		0x01C0
2718eda2d14Spatrick #define DISPC_VID2_CONV_COEF1		0x01C4
2728eda2d14Spatrick #define DISPC_VID2_CONV_COEF2		0x01C8
2738eda2d14Spatrick #define DISPC_VID2_CONV_COEF3		0x01CC
2748eda2d14Spatrick #define DISPC_VID2_CONV_COEF4		0x01D0
2758eda2d14Spatrick #define DISPC_DATA_CYCLE1		0x01D4
2768eda2d14Spatrick #define DISPC_DATA_CYCLE2		0x01D8
2778eda2d14Spatrick #define DISPC_DATA_CYCLE3		0x01DC
2788eda2d14Spatrick #define DISPC_SIZE			0x0200
2798eda2d14Spatrick 
2808eda2d14Spatrick /* RFBI */
2818eda2d14Spatrick #define RFBI_REVISION		0x0000
2828eda2d14Spatrick #define RFBI_SYSCONFIG		0x0010
2838eda2d14Spatrick #define RFBI_SYSSTATUS		0x0014
2848eda2d14Spatrick #define RFBI_CONTROL		0x0040
2858eda2d14Spatrick #define RFBI_PIXEL_CNT		0x0044
2868eda2d14Spatrick #define RFBI_LINE_NUMBER	0x0048
2878eda2d14Spatrick #define RFBI_CMD		0x004C
2888eda2d14Spatrick #define RFBI_PARAM		0x0050
2898eda2d14Spatrick #define RFBI_DATA		0x0054
2908eda2d14Spatrick #define RFBI_READ		0x0058
2918eda2d14Spatrick #define RFBI_STATUS		0x005C
2928eda2d14Spatrick #define RFBI_CONFIG0		0x0060
2938eda2d14Spatrick #define RFBI_CONFIG1		0x0078
2948eda2d14Spatrick #define RFBI_ONOFF_TIME0	0x0064
2958eda2d14Spatrick #define RFBI_ONOFF_TIME1	0x007C
2968eda2d14Spatrick #define RFBI_CYCLE_TIME0	0x0068
2978eda2d14Spatrick #define RFBI_CYCLE_TIME1	0x0080
2988eda2d14Spatrick #define RFBI_DATA_CYCLE1_0	0x006C
2998eda2d14Spatrick #define RFBI_DATA_CYCLE1_1	0x0084
3008eda2d14Spatrick #define RFBI_DATA_CYCLE2_0	0x0070
3018eda2d14Spatrick #define RFBI_DATA_CYCLE2_1	0x0088
3028eda2d14Spatrick #define RFBI_DATA_CYCLE3_0	0x0074
3038eda2d14Spatrick #define RFBI_DATA_CYCLE3_1	0x008C
3048eda2d14Spatrick #define RFBI_VSYNC_WIDTH	0x0090
3058eda2d14Spatrick #define RFBI_HSYNC_WIDTH	0x0094
3068eda2d14Spatrick 
3078eda2d14Spatrick /* VENC1 */
3088eda2d14Spatrick #define REV_ID				0x0000
3098eda2d14Spatrick #define STATUS				0x0004
3108eda2d14Spatrick #define F_CONTROL			0x0008
3118eda2d14Spatrick #define VIDOUT_CTRL			0x0010
3128eda2d14Spatrick #define SYNC_CTRL			0x0014
3138eda2d14Spatrick #define LLEN				0x001C
3148eda2d14Spatrick #define FLENS				0x0020
3158eda2d14Spatrick #define HFLTR_CTRL			0x0024
3168eda2d14Spatrick #define CC_CARR_WSS_CARR		0x0028
3178eda2d14Spatrick #define C_PHASE				0x002C
3188eda2d14Spatrick #define GAIN_U				0x0030
3198eda2d14Spatrick #define GAIN_V				0x0034
3208eda2d14Spatrick #define GAIN_Y				0x0038
3218eda2d14Spatrick #define BLACK_LEVEL			0x003C
3228eda2d14Spatrick #define BLANK_LEVEL			0x0040
3238eda2d14Spatrick #define X_COLOR				0x0044
3248eda2d14Spatrick #define M_CONTROL			0x0048
3258eda2d14Spatrick #define BSTAMP_WSS_DATA			0x004C
3268eda2d14Spatrick #define S_CARR				0x0050
3278eda2d14Spatrick #define LINE21				0x0054
3288eda2d14Spatrick #define LN_SEL				0x0058
3298eda2d14Spatrick #define L21_WC_CTL			0x005C
3308eda2d14Spatrick #define HTRIGGER_VTRIGGER		0x0060
3318eda2d14Spatrick #define SAVID_EAVID			0x0064
3328eda2d14Spatrick #define FLEN_FAL			0x0068
3338eda2d14Spatrick #define LAL_PHASE_RESET			0x006C
3348eda2d14Spatrick #define HS_INT_START_STOP_X			0x0070
3358eda2d14Spatrick #define HS_EXT_START_STOP_X			0x0074
3368eda2d14Spatrick #define VS_INT_START_X				0x0078
3378eda2d14Spatrick #define VS_INT_STOP_X_VS_INT_START_Y		0x007C
3388eda2d14Spatrick #define VS_INT_STOP_Y_VS_EXT_START_X		0x0080
3398eda2d14Spatrick #define VS_EXT_STOP_X_VS_EXT_START_Y		0x0084
3408eda2d14Spatrick #define VS_EXT_STOP_Y				0x0088
3418eda2d14Spatrick #define AVID_START_STOP_X			0x0090
3428eda2d14Spatrick #define AVID_START_STOP_Y			0x0094
3438eda2d14Spatrick #define FID_INT_START_X_FID_INT_START_Y		0x00A0
3448eda2d14Spatrick #define FID_INT_OFFSET_Y_FID_EXT_START_X	0x00A4
3458eda2d14Spatrick #define FID_EXT_START_Y_FID_EXT_OFFSET_Y	0x00A8
3468eda2d14Spatrick #define TVDETGP_INT_START_STOP_X	0x00B0
3478eda2d14Spatrick #define TVDETGP_INT_START_STOP_Y	0x00B4
3488eda2d14Spatrick #define GEN_CTRL			0x00B8
3498eda2d14Spatrick #define DAC_TST_DAC_A			0x00C4
3508eda2d14Spatrick #define DAC_B_DAC_C			0x00C8
3518eda2d14Spatrick 
3528eda2d14Spatrick 
3538eda2d14Spatrick /* NO CONSOLE SUPPORT */
3548eda2d14Spatrick 
3558eda2d14Spatrick 
3568eda2d14Spatrick /* assumes 565 panel. */
3578eda2d14Spatrick struct omdisplay_panel_data {
3588eda2d14Spatrick 	int width;
3598eda2d14Spatrick 	int height;
3608eda2d14Spatrick 	int horiz_sync_width;
3618eda2d14Spatrick 	int horiz_front_porch;
3628eda2d14Spatrick 	int horiz_back_porch;
3638eda2d14Spatrick 	int vert_sync_width;
3648eda2d14Spatrick 	int vert_front_porch;
3658eda2d14Spatrick 	int vert_back_porch;
3668eda2d14Spatrick 	int panel_flags;
3678eda2d14Spatrick 	int sync;
3688eda2d14Spatrick 	int depth;
3698eda2d14Spatrick #define PANEL_SYNC_H_ACTIVE_HIGH 1
3708eda2d14Spatrick #define PANEL_SYNC_V_ACTIVE_HIGH 2
3718eda2d14Spatrick 	int linebytes;
3728eda2d14Spatrick };
3738eda2d14Spatrick 
3748eda2d14Spatrick #define PIXELDEPTH	16
3758eda2d14Spatrick #define PIXELWIDTH	2
3768eda2d14Spatrick 
3778eda2d14Spatrick struct omdisplay_panel_data	default_panel = {
3788eda2d14Spatrick 	240,	/* Width */
3798eda2d14Spatrick 	322,	/* Height */
3808eda2d14Spatrick 	9, 9, 19, 	/* horiz sync, fp, bp */
3818eda2d14Spatrick 	1, 2, 2,  	/* vert  sync, fp, bp */
3828eda2d14Spatrick 	0, 	/* flags */
3838eda2d14Spatrick 	0,	/* sync */
3848eda2d14Spatrick 	PIXELDEPTH,
3858eda2d14Spatrick 	240*PIXELWIDTH
3868eda2d14Spatrick };
3878eda2d14Spatrick 
3888eda2d14Spatrick struct omdisplay_screen {
3898eda2d14Spatrick 	LIST_ENTRY(omdisplay_screen) link;
3908eda2d14Spatrick 
3918eda2d14Spatrick 	/* Frame buffer */
3928eda2d14Spatrick 	bus_dmamap_t dma;
3938eda2d14Spatrick 	bus_dma_segment_t segs[1];
3948eda2d14Spatrick 	int     nsegs;
3958eda2d14Spatrick 	size_t  buf_size;
3968eda2d14Spatrick 	size_t  map_size;
3978eda2d14Spatrick 	void    *buf_va;
3988eda2d14Spatrick 	int     depth;
3998eda2d14Spatrick 
4008eda2d14Spatrick 	/* rasterop */
4018eda2d14Spatrick 	struct rasops_info rinfo;
4028eda2d14Spatrick };
4038eda2d14Spatrick 
4048eda2d14Spatrick struct omdisplay_softc {
4058eda2d14Spatrick 	struct device sc_dev;
4068eda2d14Spatrick 	bus_space_tag_t sc_iot;
4078eda2d14Spatrick 	bus_space_handle_t sc_dsioh;
4088eda2d14Spatrick 	bus_space_handle_t sc_dcioh;
4098eda2d14Spatrick 	bus_space_handle_t sc_rfbioh;
4108eda2d14Spatrick 	bus_space_handle_t sc_venioh;
4118eda2d14Spatrick 	bus_dma_tag_t 		sc_dma_tag;
4128eda2d14Spatrick 
4138eda2d14Spatrick 	void *sc_ih;
4148eda2d14Spatrick 
4158eda2d14Spatrick 	int	sc_nscreens;
4168eda2d14Spatrick 	LIST_HEAD(,omdisplay_screen) sc_screens;
4178eda2d14Spatrick 
4188eda2d14Spatrick 	struct omdisplay_panel_data	*sc_geometry;
4198eda2d14Spatrick 	struct omdisplay_screen		*sc_active;
4208eda2d14Spatrick };
4218eda2d14Spatrick 
4228eda2d14Spatrick int omdisplay_match(struct device *parent, void *v, void *aux);
4238eda2d14Spatrick void omdisplay_attach(struct device *parent, struct device *self, void *args);
4248eda2d14Spatrick int omdisplay_activate(struct device *, int);
4258eda2d14Spatrick int omdisplay_ioctl(void *v, u_long cmd, caddr_t data, int flag,
4268eda2d14Spatrick     struct proc *p);
4278eda2d14Spatrick void omdisplay_burner(void *v, u_int on, u_int flags);
4288eda2d14Spatrick int omdisplay_show_screen(void *v, void *cookie, int waitok,
4298eda2d14Spatrick     void (*cb)(void *, int, int), void *cbarg);
4308eda2d14Spatrick int omdisplay_param(struct omdisplay_softc *sc, ulong cmd,
4318eda2d14Spatrick     struct wsdisplay_param *dp);
4328eda2d14Spatrick int omdisplay_max_brightness(void);
4338eda2d14Spatrick int omdisplay_get_brightness(void);
4348eda2d14Spatrick void omdisplay_set_brightness(int newval);
4358eda2d14Spatrick void omdisplay_set_brightness_internal(int newval);
4368eda2d14Spatrick int omdisplay_get_backlight(void);
4378eda2d14Spatrick void omdisplay_set_backlight(int on);
4388eda2d14Spatrick void omdisplay_blank(int blank);
4398eda2d14Spatrick void omdisplay_suspend(struct omdisplay_softc *sc);
4408eda2d14Spatrick void omdisplay_resume(struct omdisplay_softc *sc);
4418eda2d14Spatrick void omdisplay_initialize(struct omdisplay_softc *sc,
4428eda2d14Spatrick     struct omdisplay_panel_data *geom);
4438eda2d14Spatrick void omdisplay_setup_rasops(struct omdisplay_softc *sc,
4448eda2d14Spatrick     struct rasops_info *rinfo);
4458eda2d14Spatrick int omdisplay_alloc_screen(void *v, const struct wsscreen_descr *_type,
446e0c3e559Sjsg     void **cookiep, int *curxp, int *curyp, uint32_t *attrp);
4478eda2d14Spatrick int omdisplay_new_screen(struct omdisplay_softc *sc,
4488eda2d14Spatrick     struct omdisplay_screen *scr, int depth);
4498eda2d14Spatrick paddr_t omdisplay_mmap(void *v, off_t offset, int prot);
45083275742Smiod int omdisplay_load_font(void *, void *, struct wsdisplay_font *);
45183275742Smiod int omdisplay_list_font(void *, struct wsdisplay_font *);
4528eda2d14Spatrick void omdisplay_free_screen(void *v, void *cookie);
4538eda2d14Spatrick void omdisplay_start(struct omdisplay_softc *sc);
4548eda2d14Spatrick void omdisplay_stop(struct omdisplay_softc *sc);
4558eda2d14Spatrick int omdisplay_intr(void *v);
4568eda2d14Spatrick 
4579fdf0c62Smpi const struct cfattach	omdisplay_ca = {
4588eda2d14Spatrick 	sizeof (struct omdisplay_softc), omdisplay_match, omdisplay_attach,
4598eda2d14Spatrick 	NULL, omdisplay_activate
4608eda2d14Spatrick };
4618eda2d14Spatrick 
4628eda2d14Spatrick struct cfdriver omdisplay_cd = {
4638eda2d14Spatrick 	NULL, "omdisplay", DV_DULL
4648eda2d14Spatrick };
4658eda2d14Spatrick 
4668eda2d14Spatrick struct wsdisplay_accessops omdisplay_accessops = {
46787eec248Smiod 	.ioctl = omdisplay_ioctl,
46887eec248Smiod 	.mmap = omdisplay_mmap,
46987eec248Smiod 	.alloc_screen = omdisplay_alloc_screen,
47087eec248Smiod 	.free_screen = omdisplay_free_screen,
47187eec248Smiod 	.show_screen = omdisplay_show_screen,
47283275742Smiod 	.load_font = omdisplay_load_font,
47383275742Smiod 	.list_font = omdisplay_list_font,
47487eec248Smiod 	.burn_screen = omdisplay_burner
4758eda2d14Spatrick 
4768eda2d14Spatrick };
4778eda2d14Spatrick 
4788eda2d14Spatrick struct omdisplay_wsscreen_descr {
4798eda2d14Spatrick 	struct wsscreen_descr  c;       /* standard descriptor */
4808eda2d14Spatrick 	int depth;                      /* bits per pixel */
4818eda2d14Spatrick 	int flags;                      /* rasops flags */
4828eda2d14Spatrick };
4838eda2d14Spatrick 
4848eda2d14Spatrick struct omdisplay_wsscreen_descr omdisplay_screen = {
4858eda2d14Spatrick 	{
4868eda2d14Spatrick 		"std"
4878eda2d14Spatrick 	},
4888eda2d14Spatrick 	16,			/* bits per pixel */
4898eda2d14Spatrick 	0 /* rotate */
4908eda2d14Spatrick };
4918eda2d14Spatrick 
4928eda2d14Spatrick const struct wsscreen_descr *omdisplay_scr_descr[] = {
4938eda2d14Spatrick 	&omdisplay_screen.c
4948eda2d14Spatrick };
4958eda2d14Spatrick 
4968eda2d14Spatrick /* XXX - what about flip phones with CLI */
4978eda2d14Spatrick const struct wsscreen_list omdisplay_screen_list = {
4988eda2d14Spatrick         sizeof omdisplay_scr_descr / sizeof omdisplay_scr_descr[0],
4998eda2d14Spatrick 	omdisplay_scr_descr
5008eda2d14Spatrick };
5018eda2d14Spatrick 
5028eda2d14Spatrick 
5038eda2d14Spatrick int
omdisplay_match(struct device * parent,void * v,void * aux)5048eda2d14Spatrick omdisplay_match(struct device *parent, void *v, void *aux)
5058eda2d14Spatrick {
5068eda2d14Spatrick 	/* XXX */
5078eda2d14Spatrick 	return (1);
5088eda2d14Spatrick }
5098eda2d14Spatrick 
5108eda2d14Spatrick void
omdisplay_attach(struct device * parent,struct device * self,void * args)5118eda2d14Spatrick omdisplay_attach(struct device *parent, struct device *self, void *args)
5128eda2d14Spatrick {
5138eda2d14Spatrick 	struct ahb_attach_args *aa = args;
5148eda2d14Spatrick 	struct omdisplay_softc *sc = (struct omdisplay_softc *) self;
5158eda2d14Spatrick 	struct wsemuldisplaydev_attach_args wsaa;
5168eda2d14Spatrick 
5178eda2d14Spatrick 
5188eda2d14Spatrick 	sc->sc_iot = aa->aa_iot;
5198eda2d14Spatrick 
5208eda2d14Spatrick 	if (bus_space_map(sc->sc_iot, aa->aa_addr, OMDISPLAY_SIZE, 0,
5218eda2d14Spatrick 	    &sc->sc_dsioh))
5228eda2d14Spatrick 		panic("omdisplay_attach: bus_space_map failed!");
5238eda2d14Spatrick 
5248eda2d14Spatrick 	if (bus_space_subregion(sc->sc_iot, sc->sc_dsioh, 0x400, 1024,
5258eda2d14Spatrick 	    &sc->sc_dcioh))
5268eda2d14Spatrick 		panic("omdisplay_attach: bus_space_submap failed!");
5278eda2d14Spatrick 
5288eda2d14Spatrick 	if (bus_space_subregion(sc->sc_iot, sc->sc_dsioh, 0x800, 1024,
5298eda2d14Spatrick 	    &sc->sc_rfbioh))
5308eda2d14Spatrick 		panic("omdisplay_attach: bus_space_submap failed!");
5318eda2d14Spatrick 
5328eda2d14Spatrick 	if (bus_space_subregion(sc->sc_iot, sc->sc_dsioh, 0xc00, 1024,
5338eda2d14Spatrick 	    &sc->sc_venioh))
5348eda2d14Spatrick 		panic("omdisplay_attach: bus_space_submap failed!");
5358eda2d14Spatrick 
5368eda2d14Spatrick 
5378eda2d14Spatrick 	sc->sc_nscreens = 0;
5388eda2d14Spatrick 	LIST_INIT(&sc->sc_screens);
5398eda2d14Spatrick 
5408eda2d14Spatrick 	sc->sc_dma_tag = aa->aa_dmat;
5418eda2d14Spatrick 
5428eda2d14Spatrick 	sc->sc_ih = arm_intr_establish(aa->aa_intr, IPL_BIO /* XXX */,
5438eda2d14Spatrick 	    omdisplay_intr, sc, sc->sc_dev.dv_xname);
5448eda2d14Spatrick 
5458eda2d14Spatrick 	printf ("\n");
5468eda2d14Spatrick 
5478eda2d14Spatrick 	sc->sc_geometry = &default_panel;
5488eda2d14Spatrick 
5498eda2d14Spatrick 	{
5508eda2d14Spatrick 		/* XXX - dummy? */
5518eda2d14Spatrick 		struct rasops_info dummy;
5528eda2d14Spatrick 
5538eda2d14Spatrick 		omdisplay_initialize(sc, sc->sc_geometry);
5548eda2d14Spatrick 
5558eda2d14Spatrick 		/*
5568eda2d14Spatrick 		 * Initialize a dummy rasops_info to compute fontsize and
5578eda2d14Spatrick 		 * the screen size in chars.
5588eda2d14Spatrick 		 */
5598eda2d14Spatrick 		bzero(&dummy, sizeof(dummy));
5608eda2d14Spatrick 		omdisplay_setup_rasops(sc, &dummy);
5618eda2d14Spatrick 	}
5628eda2d14Spatrick 
5638eda2d14Spatrick 	wsaa.console = 0;
5648eda2d14Spatrick 	wsaa.scrdata = &omdisplay_screen_list;
5658eda2d14Spatrick 	wsaa.accessops = &omdisplay_accessops;
5668eda2d14Spatrick 	wsaa.accesscookie = sc;
5678eda2d14Spatrick 	wsaa.defaultscreens = 0;
5688eda2d14Spatrick 
5698eda2d14Spatrick 	(void)config_found(self, &wsaa, wsemuldisplaydevprint);
5708eda2d14Spatrick 
5718eda2d14Spatrick 	/* backlight? */
5728eda2d14Spatrick }
5738eda2d14Spatrick 
5748eda2d14Spatrick 
5758eda2d14Spatrick int
omdisplay_ioctl(void * v,u_long cmd,caddr_t data,int flag,struct proc * p)5768eda2d14Spatrick omdisplay_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
5778eda2d14Spatrick {
5788eda2d14Spatrick 	struct omdisplay_softc *sc = v;
5798eda2d14Spatrick 	struct wsdisplay_fbinfo *wsdisp_info;
5808eda2d14Spatrick 	struct omdisplay_screen *scr = sc->sc_active;
5818eda2d14Spatrick 	int res = EINVAL;
5828eda2d14Spatrick 
5838eda2d14Spatrick 	switch (cmd) {
5848eda2d14Spatrick 	case WSDISPLAYIO_GETPARAM:
5858eda2d14Spatrick 	case WSDISPLAYIO_SETPARAM:
5868eda2d14Spatrick 		res = omdisplay_param(sc, cmd, (struct wsdisplay_param *)data);
5878eda2d14Spatrick 		break;
5888eda2d14Spatrick 	case WSDISPLAYIO_GTYPE:
5898eda2d14Spatrick 		*(u_int *)data = WSDISPLAY_TYPE_PXALCD; /* XXX */
5908eda2d14Spatrick 		break;
5918eda2d14Spatrick 
5928eda2d14Spatrick 	case WSDISPLAYIO_GINFO:
5938eda2d14Spatrick 		wsdisp_info = (struct wsdisplay_fbinfo *)data;
5948eda2d14Spatrick 
5958eda2d14Spatrick 		wsdisp_info->height = sc->sc_geometry->height;
5968eda2d14Spatrick 		wsdisp_info->width = sc->sc_geometry->width;
5978eda2d14Spatrick 		wsdisp_info->depth = 16; /* XXX */
59863294167Skettenis 		if (scr != NULL)
59963294167Skettenis 			wsdisp_info->stride = scr->rinfo.r_stride;
60063294167Skettenis 		else
60163294167Skettenis 			wsdisp_info->stride = 0;
60263294167Skettenis 		wsdisp_info->offset = 0;
6038eda2d14Spatrick 		wsdisp_info->cmsize = 0;
6048eda2d14Spatrick 		break;
6058eda2d14Spatrick 
6068eda2d14Spatrick 	case WSDISPLAYIO_GETCMAP:
6078eda2d14Spatrick 	case WSDISPLAYIO_PUTCMAP:
6088eda2d14Spatrick 		return EINVAL;  /* XXX Colormap */
6098eda2d14Spatrick 
6108eda2d14Spatrick 	case WSDISPLAYIO_SVIDEO:
6118eda2d14Spatrick 	case WSDISPLAYIO_GVIDEO:
6128eda2d14Spatrick 		break;
6138eda2d14Spatrick 
6148eda2d14Spatrick 	case WSDISPLAYIO_GCURPOS:
6158eda2d14Spatrick 	case WSDISPLAYIO_SCURPOS:
6168eda2d14Spatrick 	case WSDISPLAYIO_GCURMAX:
6178eda2d14Spatrick 	case WSDISPLAYIO_GCURSOR:
6188eda2d14Spatrick 	case WSDISPLAYIO_SCURSOR:
6198eda2d14Spatrick 	default:
6208eda2d14Spatrick 		return -1;      /* not implemented */
6218eda2d14Spatrick 
6228eda2d14Spatrick 	case WSDISPLAYIO_LINEBYTES:
6238eda2d14Spatrick 		if (scr != NULL)
6248eda2d14Spatrick 			*(u_int *)data = scr->rinfo.ri_stride;
6258eda2d14Spatrick 		else
6268eda2d14Spatrick 			*(u_int *)data = 0;
6278eda2d14Spatrick 		break;
6288eda2d14Spatrick 
6298eda2d14Spatrick 	}
6308eda2d14Spatrick 
6318eda2d14Spatrick 	if (res == EINVAL)
6328eda2d14Spatrick 		res = omdisplay_ioctl(v, cmd, data, flag, p);
6338eda2d14Spatrick 
6348eda2d14Spatrick 	return res;
6358eda2d14Spatrick }
6368eda2d14Spatrick 
6378eda2d14Spatrick void
omdisplay_burner(void * v,u_int on,u_int flags)6388eda2d14Spatrick omdisplay_burner(void *v, u_int on, u_int flags)
6398eda2d14Spatrick {
6408eda2d14Spatrick 
6418eda2d14Spatrick         omdisplay_set_brightness(on ? omdisplay_get_brightness() : 0);
6428eda2d14Spatrick 
6438eda2d14Spatrick 	/* GPIO controls for appsliver */
6448eda2d14Spatrick 	if (on) {
6458eda2d14Spatrick 		omgpio_set_bit(93);			/* 1 enable backlight */
6468eda2d14Spatrick 		omgpio_set_dir(93, OMGPIO_DIR_OUT);
6478eda2d14Spatrick 		omgpio_clear_bit(26);			/* 0 enable LCD */
6488eda2d14Spatrick 		omgpio_set_dir(26, OMGPIO_DIR_OUT);
6498eda2d14Spatrick 	} else {
6508eda2d14Spatrick 		omgpio_clear_bit(93);			/* 0 disable backlt */
6518eda2d14Spatrick 		omgpio_set_dir(93, OMGPIO_DIR_OUT);
6528eda2d14Spatrick 		omgpio_set_bit(26);			/* 1 disable LCD */
6538eda2d14Spatrick 		omgpio_set_dir(26, OMGPIO_DIR_OUT);
6548eda2d14Spatrick 	}
6558eda2d14Spatrick }
6568eda2d14Spatrick 
6578eda2d14Spatrick int
omdisplay_show_screen(void * v,void * cookie,int waitok,void (* cb)(void *,int,int),void * cbarg)6588eda2d14Spatrick omdisplay_show_screen(void *v, void *cookie, int waitok,
6598eda2d14Spatrick     void (*cb)(void *, int, int), void *cbarg)
6608eda2d14Spatrick {
6618eda2d14Spatrick 	struct omdisplay_softc *sc = v;
6628eda2d14Spatrick 	struct rasops_info *ri = cookie;
6638eda2d14Spatrick 	struct omdisplay_screen *scr = ri->ri_hw, *old;
6648eda2d14Spatrick 
6658eda2d14Spatrick 	old = sc->sc_active;
6668eda2d14Spatrick 	if (old == scr)
6678eda2d14Spatrick 		return 0;
6688eda2d14Spatrick 
6698eda2d14Spatrick 	if (old != NULL)
6708eda2d14Spatrick 		; /* Stop old screen */
6718eda2d14Spatrick 
6728eda2d14Spatrick 	sc->sc_active = scr;
6738eda2d14Spatrick 	omdisplay_initialize(sc, sc->sc_geometry);
6748eda2d14Spatrick 
6758eda2d14Spatrick 	/* Turn on LCD */
6768eda2d14Spatrick 	omdisplay_burner(v, 1, 0);
6778eda2d14Spatrick 
6788eda2d14Spatrick 	return (0);
6798eda2d14Spatrick }
6808eda2d14Spatrick 
6818eda2d14Spatrick 
6828eda2d14Spatrick 
6838eda2d14Spatrick /*
6848eda2d14Spatrick  * wsdisplay I/O controls
6858eda2d14Spatrick  */
6868eda2d14Spatrick int
omdisplay_param(struct omdisplay_softc * sc,ulong cmd,struct wsdisplay_param * dp)6878eda2d14Spatrick omdisplay_param(struct omdisplay_softc *sc, ulong cmd,
6888eda2d14Spatrick     struct wsdisplay_param *dp)
6898eda2d14Spatrick {
6908eda2d14Spatrick 	int res = EINVAL;
6918eda2d14Spatrick 
6928eda2d14Spatrick 	switch (dp->param) {
6938eda2d14Spatrick 	case WSDISPLAYIO_PARAM_BACKLIGHT:
6948eda2d14Spatrick 		if (cmd == WSDISPLAYIO_GETPARAM) {
6958eda2d14Spatrick 			dp->min = 0;
6968eda2d14Spatrick 			dp->max = 1;
6978eda2d14Spatrick 			dp->curval = omdisplay_get_backlight();
6988eda2d14Spatrick 			res = 0;
6998eda2d14Spatrick 		} else if (cmd == WSDISPLAYIO_SETPARAM) {
7008eda2d14Spatrick /* XXX */
7018eda2d14Spatrick //			omdisplay_set_backlight(dp->curval);
7028eda2d14Spatrick 			res = 0;
7038eda2d14Spatrick 		}
7048eda2d14Spatrick 		break;
7058eda2d14Spatrick 
7068eda2d14Spatrick 	case WSDISPLAYIO_PARAM_CONTRAST:
7078eda2d14Spatrick 		/* unsupported */
7088eda2d14Spatrick 		res = ENOTTY;
7098eda2d14Spatrick 		break;
7108eda2d14Spatrick 
7118eda2d14Spatrick 	case WSDISPLAYIO_PARAM_BRIGHTNESS:
7128eda2d14Spatrick 		if (cmd == WSDISPLAYIO_GETPARAM) {
7138eda2d14Spatrick 			dp->min = 1;
7148eda2d14Spatrick 			dp->max = omdisplay_max_brightness();
7158eda2d14Spatrick 			dp->curval = omdisplay_get_brightness();
7168eda2d14Spatrick 			res = 0;
7178eda2d14Spatrick 		} else if (cmd == WSDISPLAYIO_SETPARAM) {
7188eda2d14Spatrick /* XXX */
7198eda2d14Spatrick //			omdisplay_set_brightness(dp->curval);
7208eda2d14Spatrick 			res = 0;
7218eda2d14Spatrick 		}
7228eda2d14Spatrick 		break;
7238eda2d14Spatrick 	}
7248eda2d14Spatrick 
7258eda2d14Spatrick 	return res;
7268eda2d14Spatrick }
7278eda2d14Spatrick 
7288eda2d14Spatrick 
7298eda2d14Spatrick /*
7308eda2d14Spatrick  * LCD backlight
7318eda2d14Spatrick  */
7328eda2d14Spatrick 
7338eda2d14Spatrick static  int lcdbrightnesscurval = 1;
7348eda2d14Spatrick static  int lcdislit = 1;
7358eda2d14Spatrick static  int lcdisblank = 0;
7368eda2d14Spatrick 
7378eda2d14Spatrick struct lcd_backlight {
7388eda2d14Spatrick 	int	duty;		/* LZ9JG18 DAC value */
7398eda2d14Spatrick 	int	cont;		/* BACKLIGHT_CONT signal */
7408eda2d14Spatrick 	int	on;		/* BACKLIGHT_ON signal */
7418eda2d14Spatrick };
7428eda2d14Spatrick 
7438eda2d14Spatrick const struct lcd_backlight lcd_bl[] = {
7448eda2d14Spatrick 	{ 0x00, 0, 0 },		/* 0:     Off */
7458eda2d14Spatrick 	{ 0x00, 0, 1 },		/* 1:      0% */
7468eda2d14Spatrick 	{ 0x01, 0, 1 },		/* 2:     20% */
7478eda2d14Spatrick 	{ 0x07, 0, 1 },		/* 3:     40% */
7488eda2d14Spatrick 	{ 0x01, 1, 1 },		/* 4:     60% */
7498eda2d14Spatrick 	{ 0x07, 1, 1 },		/* 5:     80% */
7508eda2d14Spatrick 	{ 0x11, 1, 1 },		/* 6:    100% */
7518eda2d14Spatrick 	{ -1, -1, -1 }		/* 7: Invalid */
7528eda2d14Spatrick };
7538eda2d14Spatrick #define CURRENT_BACKLIGHT lcd_bl
7548eda2d14Spatrick 
7558eda2d14Spatrick int
omdisplay_max_brightness(void)7568eda2d14Spatrick omdisplay_max_brightness(void)
7578eda2d14Spatrick {
7588eda2d14Spatrick 	int i;
7598eda2d14Spatrick 
7608eda2d14Spatrick 	for (i = 0; CURRENT_BACKLIGHT[i].duty != -1; i++)
7618eda2d14Spatrick 		;
7628eda2d14Spatrick 	return i - 1;
7638eda2d14Spatrick }
7648eda2d14Spatrick 
7658eda2d14Spatrick int
omdisplay_get_brightness(void)7668eda2d14Spatrick omdisplay_get_brightness(void)
7678eda2d14Spatrick {
7688eda2d14Spatrick 
7698eda2d14Spatrick 	return lcdbrightnesscurval;
7708eda2d14Spatrick }
7718eda2d14Spatrick 
7728eda2d14Spatrick void
omdisplay_set_brightness(int newval)7738eda2d14Spatrick omdisplay_set_brightness(int newval)
7748eda2d14Spatrick {
7758eda2d14Spatrick 	int max;
7768eda2d14Spatrick 
7778eda2d14Spatrick 	max = omdisplay_max_brightness();
7788eda2d14Spatrick 	if (newval < 0)
7798eda2d14Spatrick 		newval = 0;
7808eda2d14Spatrick 	else if (newval > max)
7818eda2d14Spatrick 		newval = max;
7828eda2d14Spatrick 
7838eda2d14Spatrick 	if (omdisplay_get_backlight() && !lcdisblank)
7848eda2d14Spatrick 		omdisplay_set_brightness_internal(newval);
7858eda2d14Spatrick 
7868eda2d14Spatrick 	if (newval > 0)
7878eda2d14Spatrick 		lcdbrightnesscurval = newval;
7888eda2d14Spatrick }
7898eda2d14Spatrick 
7908eda2d14Spatrick void
omdisplay_set_brightness_internal(int newval)7918eda2d14Spatrick omdisplay_set_brightness_internal(int newval)
7928eda2d14Spatrick {
7938eda2d14Spatrick 	static int curval = 1;
7948eda2d14Spatrick 	int i;
7958eda2d14Spatrick 
7968eda2d14Spatrick 	/*
7978eda2d14Spatrick 	 * It appears that the C3000 backlight can draw too much power if we
7988eda2d14Spatrick 	 * switch it from a low to a high brightness.  Increasing brightness
7998eda2d14Spatrick 	 * in steps avoids this issue.
8008eda2d14Spatrick 	 */
8018eda2d14Spatrick 	if (newval > curval) {
8028eda2d14Spatrick 		for (i = curval + 1; i <= newval; i++) {
8038eda2d14Spatrick /* atlas controls */
8048eda2d14Spatrick 			/* CURRENT_BACKLIGHT[newval].duty); */
8058eda2d14Spatrick 		}
8068eda2d14Spatrick 	} else {
8078eda2d14Spatrick /* atlas controls */
8088eda2d14Spatrick 		/* CURRENT_BACKLIGHT[newval].duty); */
8098eda2d14Spatrick 	}
8108eda2d14Spatrick 
8118eda2d14Spatrick 	curval = newval;
8128eda2d14Spatrick }
8138eda2d14Spatrick 
8148eda2d14Spatrick int
omdisplay_get_backlight(void)8158eda2d14Spatrick omdisplay_get_backlight(void)
8168eda2d14Spatrick {
8178eda2d14Spatrick 
8188eda2d14Spatrick 	return lcdislit;
8198eda2d14Spatrick }
8208eda2d14Spatrick 
8218eda2d14Spatrick void
omdisplay_set_backlight(int on)8228eda2d14Spatrick omdisplay_set_backlight(int on)
8238eda2d14Spatrick {
8248eda2d14Spatrick 
8258eda2d14Spatrick 	if (!on) {
8268eda2d14Spatrick 		omdisplay_set_brightness(0);
8278eda2d14Spatrick 		lcdislit = 0;
8288eda2d14Spatrick 	} else {
8298eda2d14Spatrick 		lcdislit = 1;
8308eda2d14Spatrick 		omdisplay_set_brightness(omdisplay_get_brightness());
8318eda2d14Spatrick 	}
8328eda2d14Spatrick }
8338eda2d14Spatrick 
8348eda2d14Spatrick void
omdisplay_blank(int blank)8358eda2d14Spatrick omdisplay_blank(int blank)
8368eda2d14Spatrick {
8378eda2d14Spatrick 
8388eda2d14Spatrick 	if (blank) {
8398eda2d14Spatrick 		omdisplay_set_brightness(0);
8408eda2d14Spatrick 		lcdisblank = 1;
8418eda2d14Spatrick 	} else {
8428eda2d14Spatrick 		lcdisblank = 0;
8438eda2d14Spatrick 		omdisplay_set_brightness(omdisplay_get_brightness());
8448eda2d14Spatrick 	}
8458eda2d14Spatrick }
8468eda2d14Spatrick 
8478eda2d14Spatrick void
omdisplay_suspend(struct omdisplay_softc * sc)8488eda2d14Spatrick omdisplay_suspend(struct omdisplay_softc *sc)
8498eda2d14Spatrick {
8508eda2d14Spatrick 	if (sc->sc_active != NULL) {
8518eda2d14Spatrick 		omdisplay_stop(sc);
8528eda2d14Spatrick 		/* XXX disable clocks */
8538eda2d14Spatrick 	}
8548eda2d14Spatrick }
8558eda2d14Spatrick 
8568eda2d14Spatrick void
omdisplay_resume(struct omdisplay_softc * sc)8578eda2d14Spatrick omdisplay_resume(struct omdisplay_softc *sc)
8588eda2d14Spatrick {
8598eda2d14Spatrick 	if (sc->sc_active != NULL) {
8608eda2d14Spatrick 		/* XXX - clocks? */
8618eda2d14Spatrick 		omdisplay_initialize(sc, sc->sc_geometry);
8628eda2d14Spatrick 		omdisplay_start(sc);
8638eda2d14Spatrick 	}
8648eda2d14Spatrick }
8658eda2d14Spatrick 
8668eda2d14Spatrick void
omdisplay_activate(struct device * self,int act)8678eda2d14Spatrick omdisplay_activate(struct device *self, int act)
8688eda2d14Spatrick {
8698eda2d14Spatrick 	struct omdisplay_softc *sc = (struct omdisplay_softc *)self;
8708eda2d14Spatrick 
8718eda2d14Spatrick 	switch (act) {
8728eda2d14Spatrick 	case DVACT_SUSPEND:
8738eda2d14Spatrick 		omdisplay_set_brightness(0);
8748eda2d14Spatrick 		omdisplay_suspend(sc);
8758eda2d14Spatrick 		break;
8768eda2d14Spatrick 	case DVACT_RESUME:
8778eda2d14Spatrick 		omdisplay_resume(sc);
8788eda2d14Spatrick 		omdisplay_set_brightness(omdisplay_get_brightness());
8798eda2d14Spatrick 		break;
8808eda2d14Spatrick 	}
8818eda2d14Spatrick 	return 0;
8828eda2d14Spatrick }
8838eda2d14Spatrick 
8848eda2d14Spatrick void
omdisplay_initialize(struct omdisplay_softc * sc,struct omdisplay_panel_data * geom)8858eda2d14Spatrick omdisplay_initialize(struct omdisplay_softc *sc,
8868eda2d14Spatrick     struct omdisplay_panel_data *geom)
8878eda2d14Spatrick {
8888eda2d14Spatrick 	struct omdisplay_screen *scr;
8898eda2d14Spatrick 	u_int32_t reg;
8908eda2d14Spatrick 	u_int32_t mode;
8918eda2d14Spatrick #if 0
8928eda2d14Spatrick 	int den, nom; /* pixel rate */
8938eda2d14Spatrick #endif
8948eda2d14Spatrick 
8958eda2d14Spatrick 
8968eda2d14Spatrick 	reg = bus_space_read_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL);
8978eda2d14Spatrick 
8988eda2d14Spatrick 	scr = sc->sc_active;
8998eda2d14Spatrick 
9008eda2d14Spatrick 	if (reg & (DISPC_CONTROL_LCDENABLE|DISPC_CONTROL_DIGITALENABLE)) {
9018eda2d14Spatrick 		omdisplay_stop(sc);
9028eda2d14Spatrick 	}
9038eda2d14Spatrick 
9048eda2d14Spatrick 	/* XXX - enable clocks */
9058eda2d14Spatrick 
9068eda2d14Spatrick 	/* disable all interrupts */
9078eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_IRQENABLE, 0);
9088eda2d14Spatrick 
9098eda2d14Spatrick 	/* GPIOs ? */
9108eda2d14Spatrick 
9118eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONFIG,
9128eda2d14Spatrick 	    DISPC_CONFIG_LOADMODE_PG|DISPC_CONFIG_LOADMODE_DATA);
9138eda2d14Spatrick 
9148eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DEFAULT_COLOR0, 0);
9158eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DEFAULT_COLOR1, 0);
9168eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TRANS_COLOR0, 0);
9178eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TRANS_COLOR1, 0);
9188eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_LINE_NUMBER, 0);
9198eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DATA_CYCLE1, 0);
9208eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DATA_CYCLE2, 0);
9218eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DATA_CYCLE3, 0);
9228eda2d14Spatrick 
9238eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_SYSCONFIG,
9248eda2d14Spatrick 	    DISPC_SYSCONFIG_SIDLEMODE_NONE|
9258eda2d14Spatrick 	    DISPC_SYSCONFIG_MIDLEMODE_NONE);
9268eda2d14Spatrick 
9278eda2d14Spatrick #if 0
9288eda2d14Spatrick 	if (geom->panel_flags & LCDPANEL_TDM) {
9298eda2d14Spatrick 		nom = tdmflags >>8 & 0x3;
9308eda2d14Spatrick 		den = tdmflags & 0x3;
9318eda2d14Spatrick 	} else {
9328eda2d14Spatrick 		nom = 1;
9338eda2d14Spatrick 		den = 1;
9348eda2d14Spatrick 	}
9358eda2d14Spatrick 	hsync = geom->width*den/nom + geom->horiz_sync_width +
9368eda2d14Spatrick 	    geom->horiz_front_porch + geom->horiz_back_porch;
9378eda2d14Spatrick #endif
9388eda2d14Spatrick 
9398eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TIMING_H,
9408eda2d14Spatrick 	    DISPC_TIMING_H_HSW_s(geom->horiz_sync_width) |
9418eda2d14Spatrick 	    DISPC_TIMING_H_HFP_s(geom->horiz_front_porch) |
9428eda2d14Spatrick 	    DISPC_TIMING_H_HBP_s(geom->horiz_back_porch));
9438eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TIMING_V,
9448eda2d14Spatrick 	    DISPC_TIMING_V_VSW_s(geom->vert_sync_width) |
9458eda2d14Spatrick 	    DISPC_TIMING_V_VFP_s(geom->vert_front_porch) |
9468eda2d14Spatrick 	    DISPC_TIMING_V_VBP_s(geom->vert_back_porch));
9478eda2d14Spatrick 
9488eda2d14Spatrick 	reg = 0;
9498eda2d14Spatrick 	if (geom->sync & PANEL_SYNC_H_ACTIVE_HIGH)
9508eda2d14Spatrick 		reg |= DISPC_POL_FREQ_IHS;
9518eda2d14Spatrick 	if (geom->sync & PANEL_SYNC_V_ACTIVE_HIGH)
9528eda2d14Spatrick 		reg |= DISPC_POL_FREQ_IVS;
9538eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_POL_FREQ, reg);
9548eda2d14Spatrick 
9558eda2d14Spatrick 
9568eda2d14Spatrick 	/* clkdiv = pixclock/period; */
9578eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_SIZE_LCD,
9588eda2d14Spatrick 	    DISPC_SIZE_LCD_PPL_s(geom->width-1) |
9598eda2d14Spatrick 	    DISPC_SIZE_LCD_LPP_s(geom->height-1));
9608eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_SIZE_DIG,
9618eda2d14Spatrick 	    DISPC_SIZE_LCD_PPL_s(geom->width-1) |
9628eda2d14Spatrick 	    DISPC_SIZE_LCD_LPP_s(geom->height-1));
9638eda2d14Spatrick 
9648eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_SIZE,
9658eda2d14Spatrick 		DISPC_GFX_SIZE_X_s(geom->width-1) |
9668eda2d14Spatrick 		DISPC_GFX_SIZE_Y_s(geom->height-1));
9678eda2d14Spatrick 
9688eda2d14Spatrick 
9698eda2d14Spatrick 	/* XXX!!! */
9708eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DIVISOR,
9718eda2d14Spatrick 		DISPC_DIVISOR_LCD_s(1) | DISPC_DIVISOR_PCD_s(6));
9728eda2d14Spatrick 
9738eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_BA0,
9748eda2d14Spatrick 	    scr->segs[0].ds_addr);
9758eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_BA1,
9768eda2d14Spatrick 	    scr->segs[0].ds_addr);
9778eda2d14Spatrick 
9788eda2d14Spatrick 	/* non-rotated */
9798eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_PIXEL_INC, 1);
9808eda2d14Spatrick 
9818eda2d14Spatrick 
9828eda2d14Spatrick 	/* XXX 24bit -> 32 pixels */
9838eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_ROW_INC,
9848eda2d14Spatrick 	    1 + scr->rinfo.ri_stride -
9858eda2d14Spatrick 	    (scr->rinfo.ri_width * scr->rinfo.ri_depth / 8));
9868eda2d14Spatrick 
9878eda2d14Spatrick 	switch (geom->depth) {
9888eda2d14Spatrick 	case 1:
9898eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_1;
9908eda2d14Spatrick 		break;
9918eda2d14Spatrick 	case 2:
9928eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_2;
9938eda2d14Spatrick 		break;
9948eda2d14Spatrick 	case 4:
9958eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_4;
9968eda2d14Spatrick 		break;
9978eda2d14Spatrick 	case 8:
9988eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_8;
9998eda2d14Spatrick 		break;
10008eda2d14Spatrick 	case 12:
10018eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_12;
10028eda2d14Spatrick 		break;
10038eda2d14Spatrick 	case 16:
10048eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_16;
10058eda2d14Spatrick 		break;
10068eda2d14Spatrick 	case 24:
10078eda2d14Spatrick 		mode = DISPC_GFX_ATTRIBUTES_GFXFMT_24;
10088eda2d14Spatrick 		break;
10098eda2d14Spatrick 	default:
10108eda2d14Spatrick 		panic("invalid depth %d", geom->depth);
10118eda2d14Spatrick 	}
10128eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_ATTRIBUTES,
10138eda2d14Spatrick 	    DISPC_GFX_ATTRIBUTES_GFXENABLE | mode |
10148eda2d14Spatrick 	    DISPC_GFX_ATTRIBUTES_BURST_8);
10158eda2d14Spatrick 
10168eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_POSITION, 0);
10178eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_WINDOW_SKIP, 0);
10188eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_FIFO_THRESHOLD,
10198eda2d14Spatrick 	    (0xfc << DISPC_GFX_FIFO_THRESHOLD_HIGH_SHIFT) |
10208eda2d14Spatrick 	    (0xc0 << DISPC_GFX_FIFO_THRESHOLD_LOW_SHIFT));
10218eda2d14Spatrick 
10228eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_ROW_INC, 1);
10238eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_PIXEL_INC, 1);
10248eda2d14Spatrick 
10258eda2d14Spatrick 	/* DISPC_CONFIG_PALETTEGAMMA not enabled */
10268eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_TABLE_BA,
10278eda2d14Spatrick 	    scr->segs[0].ds_addr);
10288eda2d14Spatrick 
10298eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_BA0, 0);
10308eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_BA1, 0);
10318eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_SIZE, 0);
10328eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ATTRIBUTES, 0);
10338eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIFO_THRESHOLD,
10348eda2d14Spatrick 	    0xc00040); /* XXX */
10358eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIFO_SIZE_STATUS,
10368eda2d14Spatrick 	    0);
10378eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ROW_INC, 1);
10388eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_PIXEL_INC, 1);
10398eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR, 0);
10408eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_PICTURE_SIZE, 0);
10418eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ACCU0, 0);
10428eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ACCU1, 0);
10438eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H0, 0);
10448eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H1, 0);
10458eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H2, 0);
10468eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H3, 0);
10478eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H4, 0);
10488eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H5, 0);
10498eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H6, 0);
10508eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H7, 0);
10518eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV0, 0);
10528eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV1, 0);
10538eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV2, 0);
10548eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV3, 0);
10558eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV4, 0);
10568eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV5, 0);
10578eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV6, 0);
10588eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV7, 0);
10598eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF0, 0);
10608eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF1, 0);
10618eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF2, 0);
10628eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF3, 0);
10638eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF4, 0);
10648eda2d14Spatrick 
10658eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_BA0, 0);
10668eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_BA1, 0);
10678eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_SIZE, 0);
10688eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ATTRIBUTES, 0);
10698eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIFO_THRESHOLD,
10708eda2d14Spatrick 	    0xc00040); /* XXX */
10718eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIFO_SIZE_STATUS,
10728eda2d14Spatrick 	    0);
10738eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ROW_INC, 1);
10748eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_PIXEL_INC, 1);
10758eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR, 0);
10768eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_PICTURE_SIZE, 0);
10778eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ACCU0, 0);
10788eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ACCU1, 0);
10798eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H0, 0);
10808eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H1, 0);
10818eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H2, 0);
10828eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H3, 0);
10838eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H4, 0);
10848eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H5, 0);
10858eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H6, 0);
10868eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H7, 0);
10878eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV0, 0);
10888eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV1, 0);
10898eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV2, 0);
10908eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV3, 0);
10918eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV4, 0);
10928eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV5, 0);
10938eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV6, 0);
10948eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV7, 0);
10958eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF0, 0);
10968eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF1, 0);
10978eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF2, 0);
10988eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF3, 0);
10998eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF4, 0);
11008eda2d14Spatrick 
11018eda2d14Spatrick 	omdisplay_start(sc);
11028eda2d14Spatrick }
11038eda2d14Spatrick 
11048eda2d14Spatrick void
omdisplay_setup_rasops(struct omdisplay_softc * sc,struct rasops_info * rinfo)11058eda2d14Spatrick omdisplay_setup_rasops(struct omdisplay_softc *sc, struct rasops_info *rinfo)
11068eda2d14Spatrick {
11078eda2d14Spatrick 	struct omdisplay_wsscreen_descr *descr;
11088eda2d14Spatrick 	struct omdisplay_panel_data *geom;
11098eda2d14Spatrick 
11108eda2d14Spatrick 	descr = &omdisplay_screen;
11118eda2d14Spatrick 	geom = sc->sc_geometry;
11128eda2d14Spatrick 
11138eda2d14Spatrick 	rinfo->ri_flg = descr->flags;
11148eda2d14Spatrick 	rinfo->ri_depth = descr->depth;
11158eda2d14Spatrick 	rinfo->ri_width = geom->width;
11168eda2d14Spatrick 	rinfo->ri_height = geom->height;
11178eda2d14Spatrick 	rinfo->ri_stride = geom->linebytes;
11188eda2d14Spatrick 
11198eda2d14Spatrick 	/* pixel position */
11208eda2d14Spatrick 	if (descr->depth == 16) {
11218eda2d14Spatrick 		rinfo->ri_rnum = 5;
11228eda2d14Spatrick 		rinfo->ri_rpos = 11;
11238eda2d14Spatrick 		rinfo->ri_gnum = 6;
11248eda2d14Spatrick 		rinfo->ri_gpos = 5;
11258eda2d14Spatrick 		rinfo->ri_bnum = 5;
11268eda2d14Spatrick 		rinfo->ri_bpos = 0;
11278eda2d14Spatrick 	}
11288eda2d14Spatrick 
11298eda2d14Spatrick 	if (descr->c.nrows == 0) {
11308eda2d14Spatrick 		/* get rasops to compute screen size the first time */
11318eda2d14Spatrick 		rasops_init(rinfo, 100, 100);
11328eda2d14Spatrick 	} else {
11338eda2d14Spatrick 		if (descr->flags != 0) /* rotate */
11348eda2d14Spatrick 			rasops_init(rinfo, descr->c.ncols, descr->c.nrows);
11358eda2d14Spatrick 		else
11368eda2d14Spatrick 			rasops_init(rinfo, descr->c.nrows, descr->c.ncols);
11378eda2d14Spatrick 	}
11388eda2d14Spatrick 
11398eda2d14Spatrick 	descr->c.nrows = rinfo->ri_rows;
11408eda2d14Spatrick 	descr->c.ncols = rinfo->ri_cols;
11418eda2d14Spatrick 	descr->c.capabilities = rinfo->ri_caps;
11428eda2d14Spatrick 	descr->c.textops = &rinfo->ri_ops;
11438eda2d14Spatrick 
11448eda2d14Spatrick }
11458eda2d14Spatrick 
11468eda2d14Spatrick 
11478eda2d14Spatrick int
omdisplay_alloc_screen(void * v,const struct wsscreen_descr * _type,void ** cookiep,int * curxp,int * curyp,uint32_t * attrp)11488eda2d14Spatrick omdisplay_alloc_screen(void *v, const struct wsscreen_descr *_type,
1149e0c3e559Sjsg     void **cookiep, int *curxp, int *curyp, uint32_t *attrp)
11508eda2d14Spatrick {
11518eda2d14Spatrick 	struct omdisplay_softc *sc = v;
11528eda2d14Spatrick 	struct omdisplay_screen *scr;
11538eda2d14Spatrick 	struct rasops_info *ri;
11548eda2d14Spatrick 	struct omdisplay_wsscreen_descr *type =
11558eda2d14Spatrick 	    (struct omdisplay_wsscreen_descr *)_type;
11568eda2d14Spatrick 	int error;
11578eda2d14Spatrick 
11588eda2d14Spatrick 	scr = malloc(sizeof *scr, M_DEVBUF, (cold ? M_NOWAIT : M_WAITOK));
11598eda2d14Spatrick 	if (scr == NULL)
11608eda2d14Spatrick 		return (ENOMEM);
11618eda2d14Spatrick 
11628eda2d14Spatrick 	error = omdisplay_new_screen(sc, scr, type->depth);
11638eda2d14Spatrick 	if (error != 0) {
1164f8e6c425Stedu 		free(scr, M_DEVBUF, 0);
11658eda2d14Spatrick 		return (error);
11668eda2d14Spatrick 	}
11678eda2d14Spatrick 
11688eda2d14Spatrick 	/*
11698eda2d14Spatrick 	 * initialize raster operation for this screen.
11708eda2d14Spatrick 	 */
11718eda2d14Spatrick 	ri = &scr->rinfo;
11728eda2d14Spatrick 	ri->ri_hw = (void *)scr;
11738eda2d14Spatrick 	ri->ri_bits = scr->buf_va;
11748eda2d14Spatrick 	omdisplay_setup_rasops(sc, ri);
11758eda2d14Spatrick 
11768eda2d14Spatrick 	/* assumes 16 bpp */
1177fc223b23Sjsg 	ri->ri_ops.pack_attr(ri, 0, 0, 0, attrp);
11788eda2d14Spatrick 
11798eda2d14Spatrick 	*cookiep = ri;
11808eda2d14Spatrick 	*curxp = 0;
11818eda2d14Spatrick 	*curyp = 0;
11828eda2d14Spatrick 
11838eda2d14Spatrick 	return 0;
11848eda2d14Spatrick }
11858eda2d14Spatrick 
11868eda2d14Spatrick /*
11878eda2d14Spatrick  * Create and initialize a new screen buffer.
11888eda2d14Spatrick  */
11898eda2d14Spatrick int
omdisplay_new_screen(struct omdisplay_softc * sc,struct omdisplay_screen * scr,int depth)11908eda2d14Spatrick omdisplay_new_screen(struct omdisplay_softc *sc,
11918eda2d14Spatrick     struct omdisplay_screen *scr, int depth)
11928eda2d14Spatrick {
11938eda2d14Spatrick 	bus_space_tag_t iot;
11948eda2d14Spatrick 	bus_space_handle_t ioh;
11958eda2d14Spatrick 	bus_dma_tag_t dma_tag;
11968eda2d14Spatrick 	struct omdisplay_panel_data *geometry;
11978eda2d14Spatrick 	int width, height;
11988eda2d14Spatrick 	bus_size_t size;
11998eda2d14Spatrick 	int error, palette_size;
12008eda2d14Spatrick 	int busdma_flag = (cold ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
12018eda2d14Spatrick 
12028eda2d14Spatrick 	if (sc != NULL) {
12038eda2d14Spatrick 		iot = sc->sc_iot;
12048eda2d14Spatrick 		ioh = sc->sc_dcioh;
12058eda2d14Spatrick 		dma_tag = sc->sc_dma_tag;
12068eda2d14Spatrick 		geometry = sc->sc_geometry;
12078eda2d14Spatrick 	} else {
12088eda2d14Spatrick 		/* We are creating the console screen. */
12098eda2d14Spatrick #if 0
12108eda2d14Spatrick 		iot = omdisplay_console.iot;
12118eda2d14Spatrick 		ioh = omdisplay_console.ioh;
12128eda2d14Spatrick 		dma_tag = omdisplay_console.dma_tag;
12138eda2d14Spatrick 		geometry = omdisplay_console.geometry;
12148eda2d14Spatrick #endif
12158eda2d14Spatrick 	}
12168eda2d14Spatrick 
12178eda2d14Spatrick 	width = geometry->width;
12188eda2d14Spatrick 	height = geometry->height;
12198eda2d14Spatrick 	palette_size = 0;
12208eda2d14Spatrick 
12218eda2d14Spatrick 	switch (depth) {
12228eda2d14Spatrick 	case 1:
12238eda2d14Spatrick 	case 2:
12248eda2d14Spatrick 	case 4:
12258eda2d14Spatrick 	case 8:
12268eda2d14Spatrick 		palette_size = (1 << depth) * sizeof (uint16_t);
12278eda2d14Spatrick 		/* FALLTHROUGH */
12288eda2d14Spatrick 	case 16:
12298eda2d14Spatrick 	case 24:
12308eda2d14Spatrick 		size = geometry->height * geometry->linebytes;
12318eda2d14Spatrick 		break;
12328eda2d14Spatrick 	default:
12338eda2d14Spatrick 		printf("%s: Unknown depth (%d)\n",
12348eda2d14Spatrick 		    sc != NULL ? sc->sc_dev.dv_xname : "console", depth);
12358eda2d14Spatrick 		return (EINVAL);
12368eda2d14Spatrick 	}
12378eda2d14Spatrick 
12388eda2d14Spatrick 	bzero(scr, sizeof *scr);
12398eda2d14Spatrick 
12408eda2d14Spatrick 	scr->nsegs = 0;
12418eda2d14Spatrick 	scr->depth = depth;
12428eda2d14Spatrick 	scr->buf_size = size;
12438eda2d14Spatrick 	scr->buf_va = NULL;
12448eda2d14Spatrick 	size = roundup(size, 16);
12458eda2d14Spatrick #if 0
12468eda2d14Spatrick 	 + 3 * sizeof (struct lcd_dma_descriptor)
12478eda2d14Spatrick 	    + palette_size;
12488eda2d14Spatrick #endif
12498eda2d14Spatrick 
12508eda2d14Spatrick 	error = bus_dmamem_alloc(dma_tag, size, 0x100000, 0,
12518eda2d14Spatrick 	    scr->segs, 1, &(scr->nsegs), busdma_flag);
12528eda2d14Spatrick 	if (error != 0 || scr->nsegs != 1) {
12538eda2d14Spatrick 		/* XXX: Actually we can handle nsegs > 1 case by means
12548eda2d14Spatrick 		   of multiple DMA descriptors for a panel.  It would
12558eda2d14Spatrick 		    make code here a bit hairy */
12568eda2d14Spatrick 		if (error == 0)
12578eda2d14Spatrick 			error = E2BIG;
12588eda2d14Spatrick 		goto bad;
12598eda2d14Spatrick 	}
12608eda2d14Spatrick 
12618eda2d14Spatrick 	error = bus_dmamem_map(dma_tag, scr->segs, scr->nsegs,
12628eda2d14Spatrick 	    size, (caddr_t *)&(scr->buf_va), busdma_flag | BUS_DMA_COHERENT);
12638eda2d14Spatrick 	if (error != 0)
12648eda2d14Spatrick 		goto bad;
12658eda2d14Spatrick 
12668eda2d14Spatrick 	memset(scr->buf_va, 0, scr->buf_size);
12678eda2d14Spatrick 	bcopy(splash, scr->buf_va,
12688eda2d14Spatrick 	    sizeof (splash) > scr->buf_size ? scr->buf_size : sizeof (splash));
12698eda2d14Spatrick 
12708eda2d14Spatrick 	/* map memory for DMA */
12718eda2d14Spatrick 	if (bus_dmamap_create(dma_tag, 1024 * 1024 * 2, 1,
12728eda2d14Spatrick 	    1024 * 1024 * 2, 0,  busdma_flag, &scr->dma))
12738eda2d14Spatrick 		goto bad;
12748eda2d14Spatrick 	error = bus_dmamap_load(dma_tag, scr->dma,
12758eda2d14Spatrick 	    scr->buf_va, size, NULL, busdma_flag);
12768eda2d14Spatrick 	if (error != 0) {
12778eda2d14Spatrick 		goto bad;
12788eda2d14Spatrick 	}
12798eda2d14Spatrick 
12808eda2d14Spatrick 	scr->map_size = size;		/* used when unmap this. */
12818eda2d14Spatrick 
12828eda2d14Spatrick 	if (sc != NULL) {
12838eda2d14Spatrick 		LIST_INSERT_HEAD(&(sc->sc_screens), scr, link);
12848eda2d14Spatrick 		sc->sc_nscreens++;
12858eda2d14Spatrick 	}
12868eda2d14Spatrick 
12878eda2d14Spatrick 	omdisplay_initialize(sc, geometry);
12888eda2d14Spatrick 
12898eda2d14Spatrick 	return (0);
12908eda2d14Spatrick 
12918eda2d14Spatrick  bad:
12928eda2d14Spatrick 	if (scr->buf_va)
12938eda2d14Spatrick 		bus_dmamem_unmap(dma_tag, scr->buf_va, size);
12948eda2d14Spatrick 	if (scr->nsegs)
12958eda2d14Spatrick 		bus_dmamem_free(dma_tag, scr->segs, scr->nsegs);
12968eda2d14Spatrick 	return (error);
12978eda2d14Spatrick }
12988eda2d14Spatrick paddr_t
omdisplay_mmap(void * v,off_t offset,int prot)12998eda2d14Spatrick omdisplay_mmap(void *v, off_t offset, int prot)
13008eda2d14Spatrick {
13018eda2d14Spatrick 	struct omdisplay_softc *sc = v;
13028eda2d14Spatrick 	struct omdisplay_screen *screen = sc->sc_active;  /* ??? */
13038eda2d14Spatrick 
13048eda2d14Spatrick 	if ((offset & PAGE_MASK) != 0)
13058eda2d14Spatrick 		return (-1);
13068eda2d14Spatrick 
13078eda2d14Spatrick 	if (screen == NULL)
13088eda2d14Spatrick 		return (-1);
13098eda2d14Spatrick 
13108eda2d14Spatrick 	if (offset < 0 ||
13118eda2d14Spatrick 	    offset >= screen->rinfo.ri_stride * screen->rinfo.ri_height)
13128eda2d14Spatrick 		return (-1);
13138eda2d14Spatrick 
13148eda2d14Spatrick 	return (bus_dmamem_mmap(sc->sc_dma_tag, screen->segs, screen->nsegs,
13158eda2d14Spatrick 	    offset, prot, BUS_DMA_WAITOK | BUS_DMA_COHERENT));
13168eda2d14Spatrick }
13178eda2d14Spatrick 
13188eda2d14Spatrick void
omdisplay_free_screen(void * v,void * cookie)13198eda2d14Spatrick omdisplay_free_screen(void *v, void *cookie)
13208eda2d14Spatrick {
13218eda2d14Spatrick 	struct omdisplay_softc *sc = v;
13228eda2d14Spatrick 	struct rasops_info *ri = cookie;
13238eda2d14Spatrick 	struct omdisplay_screen *scr = ri->ri_hw;
13248eda2d14Spatrick 
13258eda2d14Spatrick 	LIST_REMOVE(scr, link);
13268eda2d14Spatrick 	sc->sc_nscreens--;
13278eda2d14Spatrick 	if (scr == sc->sc_active) {
13288eda2d14Spatrick 		/* at first, we need to stop LCD DMA */
13298eda2d14Spatrick 		sc->sc_active = NULL;
13308eda2d14Spatrick 
13318eda2d14Spatrick #ifdef DEBUG
13328eda2d14Spatrick 		printf("lcd_free on active screen\n");
13338eda2d14Spatrick #endif
13348eda2d14Spatrick 
13358eda2d14Spatrick 		omdisplay_stop(sc);
13368eda2d14Spatrick 	}
13378eda2d14Spatrick 
13388eda2d14Spatrick 	if (scr->buf_va)
13398eda2d14Spatrick 		bus_dmamem_unmap(sc->sc_dma_tag, scr->buf_va, scr->map_size);
13408eda2d14Spatrick 
13418eda2d14Spatrick 	if (scr->nsegs > 0)
13428eda2d14Spatrick 		bus_dmamem_free(sc->sc_dma_tag, scr->segs, scr->nsegs);
13438eda2d14Spatrick 
1344f8e6c425Stedu 	free(scr, M_DEVBUF, 0);
13458eda2d14Spatrick }
13468eda2d14Spatrick 
134783275742Smiod int
omdisplay_load_font(void * v,void * emulcookie,struct wsdisplay_font * font)134883275742Smiod omdisplay_load_font(void *v, void *emulcookie, struct wsdisplay_font *font)
134983275742Smiod {
135083275742Smiod 	struct omdisplay_softc *sc = v;
135183275742Smiod 	struct omdisplay_screen *scr = sc->sc_active;
135283275742Smiod 
135383275742Smiod 	if (scr == NULL)
135483275742Smiod 		return ENXIO;
135583275742Smiod 
135683275742Smiod 	return rasops_load_font(scr->rinfo, emulcookie, font);
135783275742Smiod }
135883275742Smiod 
135983275742Smiod int
omdisplay_list_font(void * v,struct wsdisplay_font * font)136083275742Smiod omdisplay_list_font(void *v, struct wsdisplay_font *font)
136183275742Smiod {
136283275742Smiod 	struct omdisplay_softc *sc = v;
136383275742Smiod 	struct omdisplay_screen *scr = sc->sc_active;
136483275742Smiod 
136583275742Smiod 	if (scr == NULL)
136683275742Smiod 		return ENXIO;
136783275742Smiod 
136883275742Smiod 	return rasops_list_font(scr->rinfo, font);
136983275742Smiod }
137083275742Smiod 
13718eda2d14Spatrick void
omdisplay_start(struct omdisplay_softc * sc)13728eda2d14Spatrick omdisplay_start(struct omdisplay_softc *sc)
13738eda2d14Spatrick {
13748eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL,
13758eda2d14Spatrick 	    DISPC_CONTROL_GPOUT0 | DISPC_CONTROL_GPOUT1 |
13768eda2d14Spatrick 	    DISPC_CONTROL_TFTDATALINES_18 /*XXX 18? */ |
13778eda2d14Spatrick 	    DISPC_CONTROL_STNTFT |
13788eda2d14Spatrick 	    DISPC_CONTROL_GOLCD |
13798eda2d14Spatrick 	    DISPC_CONTROL_LCDENABLE);
13808eda2d14Spatrick }
13818eda2d14Spatrick 
13828eda2d14Spatrick void
omdisplay_stop(struct omdisplay_softc * sc)13838eda2d14Spatrick omdisplay_stop(struct omdisplay_softc *sc)
13848eda2d14Spatrick {
13858eda2d14Spatrick 	bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL,
13868eda2d14Spatrick 	    bus_space_read_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL) &
13878eda2d14Spatrick 	    ~(DISPC_CONTROL_DIGITALENABLE|DISPC_CONTROL_LCDENABLE));
13888eda2d14Spatrick 
13898eda2d14Spatrick 	/* XXX - wait for end of frame? */
13908eda2d14Spatrick }
13918eda2d14Spatrick 
13928eda2d14Spatrick int
omdisplay_intr(void * v)13938eda2d14Spatrick omdisplay_intr(void *v)
13948eda2d14Spatrick {
13958eda2d14Spatrick 	/* XXX */
13968eda2d14Spatrick 	return 1;
13978eda2d14Spatrick }
13988eda2d14Spatrick 
1399