1#ifndef _INTELFB_H
2#define _INTELFB_H
3
4/* $DHD: intelfb/intelfb.h,v 1.40 2003/06/27 15:06:25 dawes Exp $ */
5
6#include <linux/agp_backend.h>
7#include <linux/fb.h>
8
9#ifdef CONFIG_FB_INTEL_I2C
10#include <linux/i2c.h>
11#include <linux/i2c-algo-bit.h>
12#endif
13
14/*** Version/name ***/
15#define INTELFB_VERSION			"0.9.4"
16#define INTELFB_MODULE_NAME		"intelfb"
17#define SUPPORTED_CHIPSETS		"830M/845G/852GM/855GM/865G/915G/915GM/945G/945GM"
18
19
20/*** Debug/feature defines ***/
21
22#ifndef DEBUG
23#define DEBUG				0
24#endif
25
26#ifndef VERBOSE
27#define VERBOSE				0
28#endif
29
30#ifndef REGDUMP
31#define REGDUMP				0
32#endif
33
34#ifndef DETECT_VGA_CLASS_ONLY
35#define DETECT_VGA_CLASS_ONLY		1
36#endif
37
38#ifndef ALLOCATE_FOR_PANNING
39#define ALLOCATE_FOR_PANNING		1
40#endif
41
42#ifndef PREFERRED_MODE
43#define PREFERRED_MODE			"1024x768-32@70"
44#endif
45
46/*** hw-related values ***/
47
48/* Resource Allocation */
49#define INTELFB_FB_ACQUIRED                 1
50#define INTELFB_MMIO_ACQUIRED               2
51
52/* PCI ids for supported devices */
53#define PCI_DEVICE_ID_INTEL_830M	0x3577
54#define PCI_DEVICE_ID_INTEL_845G	0x2562
55#define PCI_DEVICE_ID_INTEL_85XGM	0x3582
56#define PCI_DEVICE_ID_INTEL_865G	0x2572
57#define PCI_DEVICE_ID_INTEL_915G	0x2582
58#define PCI_DEVICE_ID_INTEL_915GM	0x2592
59#define PCI_DEVICE_ID_INTEL_945G	0x2772
60#define PCI_DEVICE_ID_INTEL_945GM	0x27A2
61
62/* Size of MMIO region */
63#define INTEL_REG_SIZE			0x80000
64
65#define STRIDE_ALIGNMENT		16
66#define STRIDE_ALIGNMENT_I9XX		64
67
68#define PALETTE_8_ENTRIES		256
69
70
71/*** Macros ***/
72
73/* basic arithmetic */
74#define KB(x)			((x) * 1024)
75#define MB(x)			((x) * 1024 * 1024)
76#define BtoKB(x)		((x) / 1024)
77#define BtoMB(x)		((x) / 1024 / 1024)
78
79#define GTT_PAGE_SIZE           KB(4)
80
81#define ROUND_UP_TO(x, y)	(((x) + (y) - 1) / (y) * (y))
82#define ROUND_DOWN_TO(x, y)	((x) / (y) * (y))
83#define ROUND_UP_TO_PAGE(x)	ROUND_UP_TO((x), GTT_PAGE_SIZE)
84#define ROUND_DOWN_TO_PAGE(x)	ROUND_DOWN_TO((x), GTT_PAGE_SIZE)
85
86/* messages */
87#define PFX			INTELFB_MODULE_NAME ": "
88
89#define ERR_MSG(fmt, args...)	printk(KERN_ERR PFX fmt, ## args)
90#define WRN_MSG(fmt, args...)	printk(KERN_WARNING PFX fmt, ## args)
91#define NOT_MSG(fmt, args...)	printk(KERN_NOTICE PFX fmt, ## args)
92#define INF_MSG(fmt, args...)	printk(KERN_INFO PFX fmt, ## args)
93#if DEBUG
94#define DBG_MSG(fmt, args...)	printk(KERN_DEBUG PFX fmt, ## args)
95#else
96#define DBG_MSG(fmt, args...)	while (0) printk(fmt, ## args)
97#endif
98
99/* get commonly used pointers */
100#define GET_DINFO(info)		(info)->par
101
102/* misc macros */
103#define ACCEL(d, i)                                                     \
104	((d)->accel && !(d)->ring_lockup &&                             \
105	 ((i)->var.accel_flags & FB_ACCELF_TEXT))
106
107/*#define NOACCEL_CHIPSET(d)						\
108	((d)->chipset != INTEL_865G)*/
109#define NOACCEL_CHIPSET(d)						\
110	(0)
111
112#define FIXED_MODE(d) ((d)->fixed_mode)
113
114/*** Driver paramters ***/
115
116#define RINGBUFFER_SIZE		KB(64)
117#define HW_CURSOR_SIZE		KB(4)
118
119/* Intel agpgart driver */
120#define AGP_PHYSICAL_MEMORY     2
121
122/* store information about an Ixxx DVO */
123/* The i830->i865 use multiple DVOs with multiple i2cs */
124/* the i915, i945 have a single sDVO i2c bus - which is different */
125#define MAX_OUTPUTS 6
126
127/* these are outputs from the chip - integrated only
128   external chips are via DVO or SDVO output */
129#define INTELFB_OUTPUT_UNUSED 0
130#define INTELFB_OUTPUT_ANALOG 1
131#define INTELFB_OUTPUT_DVO 2
132#define INTELFB_OUTPUT_SDVO 3
133#define INTELFB_OUTPUT_LVDS 4
134#define INTELFB_OUTPUT_TVOUT 5
135
136#define INTELFB_DVO_CHIP_NONE 0
137#define INTELFB_DVO_CHIP_LVDS 1
138#define INTELFB_DVO_CHIP_TMDS 2
139#define INTELFB_DVO_CHIP_TVOUT 4
140
141#define INTELFB_OUTPUT_PIPE_NC  0
142#define INTELFB_OUTPUT_PIPE_A   1
143#define INTELFB_OUTPUT_PIPE_B   2
144
145/*** Data Types ***/
146
147/* supported chipsets */
148enum intel_chips {
149	INTEL_830M,
150	INTEL_845G,
151	INTEL_85XGM,
152	INTEL_852GM,
153	INTEL_852GME,
154	INTEL_855GM,
155	INTEL_855GME,
156	INTEL_865G,
157	INTEL_915G,
158	INTEL_915GM,
159	INTEL_945G,
160	INTEL_945GM,
161};
162
163struct intelfb_hwstate {
164	u32 vga0_divisor;
165	u32 vga1_divisor;
166	u32 vga_pd;
167	u32 dpll_a;
168	u32 dpll_b;
169	u32 fpa0;
170	u32 fpa1;
171	u32 fpb0;
172	u32 fpb1;
173	u32 palette_a[PALETTE_8_ENTRIES];
174	u32 palette_b[PALETTE_8_ENTRIES];
175	u32 htotal_a;
176	u32 hblank_a;
177	u32 hsync_a;
178	u32 vtotal_a;
179	u32 vblank_a;
180	u32 vsync_a;
181	u32 src_size_a;
182	u32 bclrpat_a;
183	u32 htotal_b;
184	u32 hblank_b;
185	u32 hsync_b;
186	u32 vtotal_b;
187	u32 vblank_b;
188	u32 vsync_b;
189	u32 src_size_b;
190	u32 bclrpat_b;
191	u32 adpa;
192	u32 dvoa;
193	u32 dvob;
194	u32 dvoc;
195	u32 dvoa_srcdim;
196	u32 dvob_srcdim;
197	u32 dvoc_srcdim;
198	u32 lvds;
199	u32 pipe_a_conf;
200	u32 pipe_b_conf;
201	u32 disp_arb;
202	u32 cursor_a_control;
203	u32 cursor_b_control;
204	u32 cursor_a_base;
205	u32 cursor_b_base;
206	u32 cursor_size;
207	u32 disp_a_ctrl;
208	u32 disp_b_ctrl;
209	u32 disp_a_base;
210	u32 disp_b_base;
211	u32 cursor_a_palette[4];
212	u32 cursor_b_palette[4];
213	u32 disp_a_stride;
214	u32 disp_b_stride;
215	u32 vgacntrl;
216	u32 add_id;
217	u32 swf0x[7];
218	u32 swf1x[7];
219	u32 swf3x[3];
220	u32 fence[8];
221	u32 instpm;
222	u32 mem_mode;
223	u32 fw_blc_0;
224	u32 fw_blc_1;
225	u16 hwstam;
226	u16 ier;
227	u16 iir;
228	u16 imr;
229};
230
231struct intelfb_heap_data {
232	u32 physical;
233	u8 __iomem *virtual;
234	u32 offset;  // in GATT pages
235	u32 size;    // in bytes
236};
237
238#ifdef CONFIG_FB_INTEL_I2C
239struct intelfb_i2c_chan {
240    struct intelfb_info *dinfo;
241    u32 reg;
242    struct i2c_adapter adapter;
243    struct i2c_algo_bit_data algo;
244};
245#endif
246
247struct intelfb_output_rec {
248    int type;
249    int pipe;
250    int flags;
251
252#ifdef CONFIG_FB_INTEL_I2C
253    struct intelfb_i2c_chan i2c_bus;
254    struct intelfb_i2c_chan ddc_bus;
255#endif
256};
257
258struct intelfb_vsync {
259	wait_queue_head_t wait;
260	unsigned int count;
261	int pan_display;
262	u32 pan_offset;
263};
264
265struct intelfb_info {
266	struct fb_info *info;
267	struct fb_ops  *fbops;
268	struct pci_dev *pdev;
269
270	struct intelfb_hwstate save_state;
271
272	/* agpgart structs */
273	struct agp_memory *gtt_fb_mem;     // use all stolen memory or vram
274	struct agp_memory *gtt_ring_mem;   // ring buffer
275	struct agp_memory *gtt_cursor_mem; // hw cursor
276
277	/* use a gart reserved fb mem */
278	u8 fbmem_gart;
279
280	/* mtrr support */
281	int mtrr_reg;
282	u32 has_mtrr;
283
284	/* heap data */
285	struct intelfb_heap_data aperture;
286	struct intelfb_heap_data fb;
287	struct intelfb_heap_data ring;
288	struct intelfb_heap_data cursor;
289
290	/* mmio regs */
291	u32 mmio_base_phys;
292	u8 __iomem *mmio_base;
293
294	/* fb start offset (in bytes) */
295	u32 fb_start;
296
297	/* ring buffer */
298	u32 ring_head;
299	u32 ring_tail;
300	u32 ring_tail_mask;
301	u32 ring_space;
302	u32 ring_lockup;
303
304	/* palette */
305	u32 pseudo_palette[17];
306
307	/* chip info */
308	int pci_chipset;
309	int chipset;
310	const char *name;
311	int mobile;
312
313	/* current mode */
314	int bpp, depth;
315	u32 visual;
316	int xres, yres, pitch;
317	int pixclock;
318
319	/* current pipe */
320	int pipe;
321
322	/* some flags */
323	int accel;
324	int hwcursor;
325	int fixed_mode;
326	int ring_active;
327	int flag;
328	unsigned long irq_flags;
329	int open;
330
331	/* vsync */
332	struct intelfb_vsync vsync;
333	spinlock_t int_lock;
334
335	/* hw cursor */
336	int cursor_on;
337	int cursor_blanked;
338	u8  cursor_src[64];
339
340	/* initial parameters */
341	int initial_vga;
342	struct fb_var_screeninfo initial_var;
343	u32 initial_fb_base;
344	u32 initial_video_ram;
345	u32 initial_pitch;
346
347	/* driver registered */
348	int registered;
349
350	/* index into plls */
351	int pll_index;
352
353	/* outputs */
354	int num_outputs;
355	struct intelfb_output_rec output[MAX_OUTPUTS];
356};
357
358#define IS_I9XX(dinfo) (((dinfo)->chipset == INTEL_915G)||(dinfo->chipset == INTEL_915GM)||((dinfo)->chipset == INTEL_945G)||(dinfo->chipset==INTEL_945GM))
359
360#ifndef FBIO_WAITFORVSYNC
361#define FBIO_WAITFORVSYNC	_IOW('F', 0x20, __u32)
362#endif
363
364/*** function prototypes ***/
365
366extern int intelfb_var_to_depth(const struct fb_var_screeninfo *var);
367
368#ifdef CONFIG_FB_INTEL_I2C
369extern void intelfb_create_i2c_busses(struct intelfb_info *dinfo);
370extern void intelfb_delete_i2c_busses(struct intelfb_info *dinfo);
371#endif
372
373#endif /* _INTELFB_H */
374