1#include <linux/timer.h>
2#include <asm/sbus.h>
3#include <asm/oplib.h>
4#include <asm/fbio.h>
5
6#include <video/fbcon.h>
7
8struct bt_regs {
9	volatile unsigned int addr;           /* address register */
10	volatile unsigned int color_map;      /* color map */
11	volatile unsigned int control;        /* control register */
12	volatile unsigned int cursor;         /* cursor map register */
13};
14
15struct fb_info_creator {
16	struct ffb_fbc *fbc;
17	struct ffb_dac *dac;
18	int xy_margin;
19	int fifo_cache;
20	u64 yx_margin;
21	int fg_cache;
22	int bg_cache;
23	int dac_rev;
24};
25struct fb_info_cgsix {
26	struct bt_regs *bt;
27	struct cg6_fbc *fbc;
28	struct cg6_thc *thc;
29	struct cg6_tec *tec;
30	volatile u32 *fhc;
31};
32struct fb_info_bwtwo {
33	struct bw2_regs *regs;
34};
35struct fb_info_cgthree {
36	struct cg3_regs *regs;
37};
38struct fb_info_tcx {
39	struct bt_regs *bt;
40	struct tcx_thc *thc;
41	struct tcx_tec *tec;
42	u32 *cplane;
43};
44struct fb_info_leo {
45	struct leo_lx_krn *lx_krn;
46	struct leo_lc_ss0_usr *lc_ss0_usr;
47	struct leo_ld_ss0 *ld_ss0;
48	struct leo_ld_ss1 *ld_ss1;
49	struct leo_cursor *cursor;
50	unsigned int extent;
51};
52struct fb_info_cgfourteen {
53	struct cg14_regs *regs;
54	struct cg14_cursor *cursor;
55	struct cg14_clut *clut;
56	int ramsize;
57	int mode;
58};
59struct fb_info_p9100 {
60	struct p9100_ctrl *ctrl;
61	volatile u32 *fbmem;
62};
63
64struct cg_cursor {
65	char	enable;         /* cursor is enabled */
66	char	mode;		/* cursor mode */
67	struct	fbcurpos cpos;  /* position */
68	struct	fbcurpos chot;  /* hot-spot */
69	struct	fbcurpos size;  /* size of mask & image fields */
70	struct	fbcurpos hwsize; /* hw max size */
71	int	bits[2][128];   /* space for mask & image bits */
72	char	color [6];      /* cursor colors */
73	struct	timer_list timer; /* cursor timer */
74	int	blink_rate;	/* cursor blink rate */
75};
76
77struct sbus_mmap_map {
78	unsigned long voff;
79	unsigned long poff;
80	unsigned long size;
81};
82
83#define SBUS_MMAP_FBSIZE(n) (-n)
84#define SBUS_MMAP_EMPTY	0x80000000
85
86struct fb_info_sbusfb {
87	struct fb_info info;
88	struct fb_fix_screeninfo fix;
89	struct fb_var_screeninfo var;
90	struct display disp;
91	struct display_switch dispsw;
92	struct fbtype type;
93	struct sbus_dev *sbdp;
94	spinlock_t lock;
95	int prom_node, prom_parent;
96	union {
97		struct fb_info_creator ffb;
98		struct fb_info_cgsix cg6;
99		struct fb_info_bwtwo bw2;
100		struct fb_info_cgthree cg3;
101		struct fb_info_tcx tcx;
102		struct fb_info_leo leo;
103		struct fb_info_cgfourteen cg14;
104		struct fb_info_p9100 p9100;
105	} s;
106	unsigned char *color_map;
107	struct cg_cursor cursor;
108	unsigned char open;
109	unsigned char mmaped;
110	unsigned char blanked;
111	int x_margin;
112	int y_margin;
113	int vtconsole;
114	int consolecnt;
115	int graphmode;
116	int emulations[4];
117	struct sbus_mmap_map *mmap_map;
118	unsigned long physbase;
119	int iospace;
120	/* Methods */
121	void (*setup)(struct display *);
122	void (*setcursor)(struct fb_info_sbusfb *);
123	void (*setcurshape)(struct fb_info_sbusfb *);
124	void (*setcursormap)(struct fb_info_sbusfb *, unsigned char *, unsigned char *, unsigned char *);
125	void (*loadcmap)(struct fb_info_sbusfb *, struct display *, int, int);
126	void (*blank)(struct fb_info_sbusfb *);
127	void (*unblank)(struct fb_info_sbusfb *);
128	void (*margins)(struct fb_info_sbusfb *, struct display *, int, int);
129	void (*reset)(struct fb_info_sbusfb *);
130	void (*fill)(struct fb_info_sbusfb *, struct display *, int, int, unsigned short *);
131	void (*switch_from_graph)(struct fb_info_sbusfb *);
132	void (*restore_palette)(struct fb_info_sbusfb *);
133	int (*ioctl)(struct fb_info_sbusfb *, unsigned int, unsigned long);
134};
135
136extern char *creatorfb_init(struct fb_info_sbusfb *);
137extern char *cgsixfb_init(struct fb_info_sbusfb *);
138extern char *cgthreefb_init(struct fb_info_sbusfb *);
139extern char *tcxfb_init(struct fb_info_sbusfb *);
140extern char *leofb_init(struct fb_info_sbusfb *);
141extern char *bwtwofb_init(struct fb_info_sbusfb *);
142extern char *cgfourteenfb_init(struct fb_info_sbusfb *);
143extern char *p9100fb_init(struct fb_info_sbusfb *);
144
145#define sbusfbinfod(disp) ((struct fb_info_sbusfb *)(disp->fb_info))
146#define sbusfbinfo(info) ((struct fb_info_sbusfb *)(info))
147#define CM(i, j) [3*(i)+(j)]
148
149#define SBUSFBINIT_SIZECHANGE ((char *)-1)
150