1a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#ifndef _LINUX_SVGA_H
2a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#define _LINUX_SVGA_H
3a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
4a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#include <linux/pci.h>
5a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#include <video/vga.h>
6a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
7a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek/* Terminator for register set */
8a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
9a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#define VGA_REGSET_END_VAL	0xFF
10a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#define VGA_REGSET_END		{VGA_REGSET_END_VAL, 0, 0}
11a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
12a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekstruct vga_regset {
13a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u8 regnum;
14a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u8 lowbit;
15a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u8 highbit;
16a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek};
17a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
18a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek/* ------------------------------------------------------------------------- */
19a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
20a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#define SVGA_FORMAT_END_VAL	0xFFFF
21a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#define SVGA_FORMAT_END		{SVGA_FORMAT_END_VAL, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, 0, 0, 0, 0, 0, 0}
22a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
23a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekstruct svga_fb_format {
24a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	/* var part */
25a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 bits_per_pixel;
26a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	struct fb_bitfield red;
27a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	struct fb_bitfield green;
28a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	struct fb_bitfield blue;
29a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	struct fb_bitfield transp;
30a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 nonstd;
31a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	/* fix part */
32a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 type;
33a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 type_aux;
34a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 visual;
35a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 xpanstep;
36a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 xresstep;
37a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek};
38a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
39a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekstruct svga_timing_regs {
40a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *h_total_regs;
41a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *h_display_regs;
42a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *h_blank_start_regs;
43a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *h_blank_end_regs;
44a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *h_sync_start_regs;
45a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *h_sync_end_regs;
46a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
47a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *v_total_regs;
48a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *v_display_regs;
49a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *v_blank_start_regs;
50a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *v_blank_end_regs;
51a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *v_sync_start_regs;
52a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	const struct vga_regset *v_sync_end_regs;
53a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek};
54a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
55a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekstruct svga_pll {
56a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 m_min;
57a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 m_max;
58a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 n_min;
59a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 n_max;
60a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 r_min;
61a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 r_max;  /* r_max < 32 */
62a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 f_vco_min;
63a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 f_vco_max;
64a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u32 f_base;
65a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek};
66a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
67a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
68a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek/* Write a value to the attribute register */
69a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
70f6b0cc477de99fe715f1071b13ab822daed9a34fDavid Millerstatic inline void svga_wattr(void __iomem *regbase, u8 index, u8 data)
71a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek{
72f6b0cc477de99fe715f1071b13ab822daed9a34fDavid Miller	vga_r(regbase, VGA_IS1_RC);
73f6b0cc477de99fe715f1071b13ab822daed9a34fDavid Miller	vga_w(regbase, VGA_ATT_IW, index);
74f6b0cc477de99fe715f1071b13ab822daed9a34fDavid Miller	vga_w(regbase, VGA_ATT_W, data);
75a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek}
76a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
77a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek/* Write a value to a sequence register with a mask */
78a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
79d907ec04cc498e11e039e0fff8eb58cf01e885daDavid Millerstatic inline void svga_wseq_mask(void __iomem *regbase, u8 index, u8 data, u8 mask)
80a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek{
81d907ec04cc498e11e039e0fff8eb58cf01e885daDavid Miller	vga_wseq(regbase, index, (data & mask) | (vga_rseq(regbase, index) & ~mask));
82a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek}
83a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
84a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek/* Write a value to a CRT register with a mask */
85a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
86ea770789dce2d27afab39c3891a475624acbd82fDavid Millerstatic inline void svga_wcrt_mask(void __iomem *regbase, u8 index, u8 data, u8 mask)
87a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek{
88ea770789dce2d27afab39c3891a475624acbd82fDavid Miller	vga_wcrt(regbase, index, (data & mask) | (vga_rcrt(regbase, index) & ~mask));
89a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek}
90a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
91a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekstatic inline int svga_primary_device(struct pci_dev *dev)
92a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek{
93a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	u16 flags;
94a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	pci_read_config_word(dev, PCI_COMMAND, &flags);
95a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek	return (flags & PCI_COMMAND_IO);
96a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek}
97a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
98a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
9921da386d0e4c55f6f7482b4637532b942e22b70aDavid Millervoid svga_wcrt_multi(void __iomem *regbase, const struct vga_regset *regset, u32 value);
100dc6aff3a5d3e4f565cb07cd5f3b6983850971da7David Millervoid svga_wseq_multi(void __iomem *regbase, const struct vga_regset *regset, u32 value);
101a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
102e2fade2c146ec718796049104b45267ddbfdf7a1David Millervoid svga_set_default_gfx_regs(void __iomem *regbase);
103f51a14dded14457e45b1f026a6af5ca6a51e4502David Millervoid svga_set_default_atc_regs(void __iomem *regbase);
104a4ade83948e0ffc317b8227d92107271a0acdda5David Millervoid svga_set_default_seq_regs(void __iomem *regbase);
1051d28fcadb0e277844ebffb528cdfd25d44591035David Millervoid svga_set_default_crt_regs(void __iomem *regbase);
1069c96394bb90f855d265116f37897294fa1bdb072David Millervoid svga_set_textmode_vga_regs(void __iomem *regbase);
107a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
108a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekvoid svga_settile(struct fb_info *info, struct fb_tilemap *map);
109a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekvoid svga_tilecopy(struct fb_info *info, struct fb_tilearea *area);
110a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekvoid svga_tilefill(struct fb_info *info, struct fb_tilerect *rect);
111a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekvoid svga_tileblit(struct fb_info *info, struct fb_tileblit *blit);
11255db092388455457791cf00216b6b3965a8071f8David Millervoid svga_tilecursor(void __iomem *regbase, struct fb_info *info, struct fb_tilecursor *cursor);
11334ed25f50b347c7e1ff78f9308e025ddd57c2f20Ondrej Zajicekint svga_get_tilemax(struct fb_info *info);
1145a87ede94595f58934000e26e8b13398e63868b5Antonino A. Daplasvoid svga_get_caps(struct fb_info *info, struct fb_blit_caps *caps,
1155a87ede94595f58934000e26e8b13398e63868b5Antonino A. Daplas		   struct fb_var_screeninfo *var);
116a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
117a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekint svga_compute_pll(const struct svga_pll *pll, u32 f_wanted, u16 *m, u16 *n, u16 *r, int node);
118a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekint svga_check_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, int node);
11938d2620ea40c2f9a5f17d6488bf004973570279cDavid Millervoid svga_set_timings(void __iomem *regbase, const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node);
120a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
121a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicekint svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix);
122a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
123a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek#endif /* _LINUX_SVGA_H */
124a268422de8bf1b4c0cb97987b6c329c9f6a3da4bOndrej Zajicek
125