2005-04-17 02:20:36 +04:00
# ifndef _INTELFB_H
# define _INTELFB_H
/* $DHD: intelfb/intelfb.h,v 1.40 2003/06/27 15:06:25 dawes Exp $ */
# include <linux/agp_backend.h>
# include <linux/fb.h>
2006-06-20 22:55:55 +04:00
# ifdef CONFIG_FB_INTEL_I2C
# include <linux/i2c.h>
# include <linux/i2c-algo-bit.h>
# endif
2005-04-17 02:20:36 +04:00
/*** Version/name ***/
2008-04-28 13:15:43 +04:00
# define INTELFB_VERSION "0.9.5"
2005-04-17 02:20:36 +04:00
# define INTELFB_MODULE_NAME "intelfb"
2008-04-28 13:15:43 +04:00
# define SUPPORTED_CHIPSETS "830M / 845G / 852GM / 855GM / 865G / 915G / 915GM / 945G / 945GM / 965G / 965GM"
2005-04-17 02:20:36 +04:00
/*** Debug/feature defines ***/
# ifndef DEBUG
# define DEBUG 0
# endif
# ifndef VERBOSE
# define VERBOSE 0
# endif
# ifndef REGDUMP
# define REGDUMP 0
# endif
# ifndef DETECT_VGA_CLASS_ONLY
# define DETECT_VGA_CLASS_ONLY 1
# endif
# ifndef ALLOCATE_FOR_PANNING
# define ALLOCATE_FOR_PANNING 1
# endif
# ifndef PREFERRED_MODE
# define PREFERRED_MODE "1024x768-32@70"
# endif
/*** hw-related values ***/
2005-12-19 10:11:40 +03:00
/* Resource Allocation */
# define INTELFB_FB_ACQUIRED 1
# define INTELFB_MMIO_ACQUIRED 2
2005-04-17 02:20:36 +04:00
/* PCI ids for supported devices */
# define PCI_DEVICE_ID_INTEL_830M 0x3577
# define PCI_DEVICE_ID_INTEL_845G 0x2562
# define PCI_DEVICE_ID_INTEL_85XGM 0x3582
# define PCI_DEVICE_ID_INTEL_865G 0x2572
# define PCI_DEVICE_ID_INTEL_915G 0x2582
2005-11-07 12:00:33 +03:00
# define PCI_DEVICE_ID_INTEL_915GM 0x2592
2006-03-23 03:23:55 +03:00
# define PCI_DEVICE_ID_INTEL_945G 0x2772
2006-03-23 13:53:05 +03:00
# define PCI_DEVICE_ID_INTEL_945GM 0x27A2
2008-04-28 13:15:43 +04:00
# define PCI_DEVICE_ID_INTEL_965G 0x29A2
# define PCI_DEVICE_ID_INTEL_965GM 0x2A02
2005-04-17 02:20:36 +04:00
/* Size of MMIO region */
# define INTEL_REG_SIZE 0x80000
# define STRIDE_ALIGNMENT 16
2006-05-27 12:17:52 +04:00
# define STRIDE_ALIGNMENT_I9XX 64
2005-04-17 02:20:36 +04:00
# define PALETTE_8_ENTRIES 256
/*** Macros ***/
/* basic arithmetic */
# define KB(x) ((x) * 1024)
# define MB(x) ((x) * 1024 * 1024)
# define BtoKB(x) ((x) / 1024)
# define BtoMB(x) ((x) / 1024 / 1024)
# define GTT_PAGE_SIZE KB(4)
# define ROUND_UP_TO(x, y) (((x) + (y) - 1) / (y) * (y))
# define ROUND_DOWN_TO(x, y) ((x) / (y) * (y))
# define ROUND_UP_TO_PAGE(x) ROUND_UP_TO((x), GTT_PAGE_SIZE)
# define ROUND_DOWN_TO_PAGE(x) ROUND_DOWN_TO((x), GTT_PAGE_SIZE)
/* messages */
# define PFX INTELFB_MODULE_NAME ": "
# define ERR_MSG(fmt, args...) printk(KERN_ERR PFX fmt, ## args)
# define WRN_MSG(fmt, args...) printk(KERN_WARNING PFX fmt, ## args)
# define NOT_MSG(fmt, args...) printk(KERN_NOTICE PFX fmt, ## args)
# define INF_MSG(fmt, args...) printk(KERN_INFO PFX fmt, ## args)
# if DEBUG
# define DBG_MSG(fmt, args...) printk(KERN_DEBUG PFX fmt, ## args)
# else
# define DBG_MSG(fmt, args...) while (0) printk(fmt, ## args)
# endif
/* get commonly used pointers */
# define GET_DINFO(info) (info)->par
/* misc macros */
# define ACCEL(d, i) \
( ( d ) - > accel & & ! ( d ) - > ring_lockup & & \
( ( i ) - > var . accel_flags & FB_ACCELF_TEXT ) )
/*#define NOACCEL_CHIPSET(d) \
( ( d ) - > chipset ! = INTEL_865G ) */
# define NOACCEL_CHIPSET(d) \
( 0 )
# define FIXED_MODE(d) ((d)->fixed_mode)
2008-02-03 18:31:49 +03:00
/*** Driver parameters ***/
2005-04-17 02:20:36 +04:00
# define RINGBUFFER_SIZE KB(64)
# define HW_CURSOR_SIZE KB(4)
/* Intel agpgart driver */
# define AGP_PHYSICAL_MEMORY 2
2006-06-20 22:55:55 +04:00
/* store information about an Ixxx DVO */
/* The i830->i865 use multiple DVOs with multiple i2cs */
/* the i915, i945 have a single sDVO i2c bus - which is different */
# define MAX_OUTPUTS 6
2006-06-20 22:55:55 +04:00
/* these are outputs from the chip - integrated only
external chips are via DVO or SDVO output */
# define INTELFB_OUTPUT_UNUSED 0
# define INTELFB_OUTPUT_ANALOG 1
# define INTELFB_OUTPUT_DVO 2
# define INTELFB_OUTPUT_SDVO 3
# define INTELFB_OUTPUT_LVDS 4
# define INTELFB_OUTPUT_TVOUT 5
# define INTELFB_DVO_CHIP_NONE 0
# define INTELFB_DVO_CHIP_LVDS 1
# define INTELFB_DVO_CHIP_TMDS 2
# define INTELFB_DVO_CHIP_TVOUT 4
# define INTELFB_OUTPUT_PIPE_NC 0
# define INTELFB_OUTPUT_PIPE_A 1
# define INTELFB_OUTPUT_PIPE_B 2
2005-04-17 02:20:36 +04:00
/*** Data Types ***/
/* supported chipsets */
enum intel_chips {
INTEL_830M ,
INTEL_845G ,
INTEL_85XGM ,
INTEL_852GM ,
INTEL_852GME ,
INTEL_855GM ,
INTEL_855GME ,
INTEL_865G ,
2005-11-07 12:00:33 +03:00
INTEL_915G ,
2006-03-23 03:23:55 +03:00
INTEL_915GM ,
2006-03-23 13:53:05 +03:00
INTEL_945G ,
INTEL_945GM ,
2008-04-28 13:15:43 +04:00
INTEL_965G ,
INTEL_965GM ,
2005-04-17 02:20:36 +04:00
} ;
struct intelfb_hwstate {
u32 vga0_divisor ;
u32 vga1_divisor ;
u32 vga_pd ;
u32 dpll_a ;
u32 dpll_b ;
u32 fpa0 ;
u32 fpa1 ;
u32 fpb0 ;
u32 fpb1 ;
u32 palette_a [ PALETTE_8_ENTRIES ] ;
u32 palette_b [ PALETTE_8_ENTRIES ] ;
u32 htotal_a ;
u32 hblank_a ;
u32 hsync_a ;
u32 vtotal_a ;
u32 vblank_a ;
u32 vsync_a ;
u32 src_size_a ;
u32 bclrpat_a ;
u32 htotal_b ;
u32 hblank_b ;
u32 hsync_b ;
u32 vtotal_b ;
u32 vblank_b ;
u32 vsync_b ;
u32 src_size_b ;
u32 bclrpat_b ;
u32 adpa ;
u32 dvoa ;
u32 dvob ;
u32 dvoc ;
u32 dvoa_srcdim ;
u32 dvob_srcdim ;
u32 dvoc_srcdim ;
u32 lvds ;
u32 pipe_a_conf ;
u32 pipe_b_conf ;
u32 disp_arb ;
u32 cursor_a_control ;
u32 cursor_b_control ;
u32 cursor_a_base ;
u32 cursor_b_base ;
u32 cursor_size ;
u32 disp_a_ctrl ;
u32 disp_b_ctrl ;
u32 disp_a_base ;
u32 disp_b_base ;
u32 cursor_a_palette [ 4 ] ;
u32 cursor_b_palette [ 4 ] ;
u32 disp_a_stride ;
u32 disp_b_stride ;
u32 vgacntrl ;
u32 add_id ;
u32 swf0x [ 7 ] ;
u32 swf1x [ 7 ] ;
u32 swf3x [ 3 ] ;
u32 fence [ 8 ] ;
u32 instpm ;
u32 mem_mode ;
u32 fw_blc_0 ;
u32 fw_blc_1 ;
2006-06-20 22:36:41 +04:00
u16 hwstam ;
u16 ier ;
u16 iir ;
u16 imr ;
2005-04-17 02:20:36 +04:00
} ;
struct intelfb_heap_data {
u32 physical ;
u8 __iomem * virtual ;
2007-10-16 12:29:31 +04:00
u32 offset ; /* in GATT pages */
u32 size ; /* in bytes */
2005-04-17 02:20:36 +04:00
} ;
2006-06-20 22:55:55 +04:00
# ifdef CONFIG_FB_INTEL_I2C
struct intelfb_i2c_chan {
struct intelfb_info * dinfo ;
u32 reg ;
struct i2c_adapter adapter ;
struct i2c_algo_bit_data algo ;
} ;
# endif
2006-06-20 22:55:55 +04:00
struct intelfb_output_rec {
int type ;
int pipe ;
int flags ;
# ifdef CONFIG_FB_INTEL_I2C
struct intelfb_i2c_chan i2c_bus ;
struct intelfb_i2c_chan ddc_bus ;
# endif
} ;
2006-06-20 22:36:41 +04:00
struct intelfb_vsync {
wait_queue_head_t wait ;
unsigned int count ;
2006-06-20 22:36:42 +04:00
int pan_display ;
u32 pan_offset ;
2006-06-20 22:36:41 +04:00
} ;
2005-04-17 02:20:36 +04:00
struct intelfb_info {
struct fb_info * info ;
struct fb_ops * fbops ;
struct pci_dev * pdev ;
struct intelfb_hwstate save_state ;
/* agpgart structs */
2007-10-16 12:29:31 +04:00
struct agp_memory * gtt_fb_mem ; /* use all stolen memory or vram */
struct agp_memory * gtt_ring_mem ; /* ring buffer */
struct agp_memory * gtt_cursor_mem ; /* hw cursor */
2005-04-17 02:20:36 +04:00
/* use a gart reserved fb mem */
u8 fbmem_gart ;
/* mtrr support */
2006-08-22 04:10:56 +04:00
int mtrr_reg ;
2005-04-17 02:20:36 +04:00
u32 has_mtrr ;
/* heap data */
struct intelfb_heap_data aperture ;
struct intelfb_heap_data fb ;
struct intelfb_heap_data ring ;
struct intelfb_heap_data cursor ;
/* mmio regs */
u32 mmio_base_phys ;
u8 __iomem * mmio_base ;
/* fb start offset (in bytes) */
u32 fb_start ;
/* ring buffer */
2006-06-23 09:05:39 +04:00
u32 ring_head ;
2005-04-17 02:20:36 +04:00
u32 ring_tail ;
u32 ring_tail_mask ;
u32 ring_space ;
u32 ring_lockup ;
/* palette */
2007-07-17 15:05:44 +04:00
u32 pseudo_palette [ 16 ] ;
2005-04-17 02:20:36 +04:00
/* chip info */
int pci_chipset ;
int chipset ;
const char * name ;
int mobile ;
/* current mode */
int bpp , depth ;
u32 visual ;
int xres , yres , pitch ;
int pixclock ;
/* current pipe */
int pipe ;
/* some flags */
int accel ;
int hwcursor ;
int fixed_mode ;
int ring_active ;
2005-12-19 10:11:40 +03:00
int flag ;
2006-06-20 22:36:41 +04:00
unsigned long irq_flags ;
int open ;
/* vsync */
struct intelfb_vsync vsync ;
spinlock_t int_lock ;
2005-04-17 02:20:36 +04:00
/* hw cursor */
int cursor_on ;
int cursor_blanked ;
u8 cursor_src [ 64 ] ;
/* initial parameters */
int initial_vga ;
struct fb_var_screeninfo initial_var ;
u32 initial_fb_base ;
u32 initial_video_ram ;
u32 initial_pitch ;
/* driver registered */
int registered ;
2007-10-16 12:29:31 +04:00
2006-03-20 12:26:45 +03:00
/* index into plls */
int pll_index ;
2006-06-20 22:55:55 +04:00
/* outputs */
int num_outputs ;
struct intelfb_output_rec output [ MAX_OUTPUTS ] ;
2005-04-17 02:20:36 +04:00
} ;
2007-10-16 12:29:33 +04:00
# define IS_I9XX(dinfo) (((dinfo)->chipset == INTEL_915G) || \
( ( dinfo ) - > chipset = = INTEL_915GM ) | | \
( ( dinfo ) - > chipset = = INTEL_945G ) | | \
2008-04-28 13:15:43 +04:00
( ( dinfo ) - > chipset = = INTEL_945GM ) | | \
( ( dinfo ) - > chipset = = INTEL_965G ) | | \
( ( dinfo ) - > chipset = = INTEL_965GM ) )
2006-03-23 05:06:32 +03:00
2006-06-20 22:36:42 +04:00
# ifndef FBIO_WAITFORVSYNC
# define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
# endif
2005-04-17 02:20:36 +04:00
/*** function prototypes ***/
extern int intelfb_var_to_depth ( const struct fb_var_screeninfo * var ) ;
2006-06-20 22:55:55 +04:00
# ifdef CONFIG_FB_INTEL_I2C
extern void intelfb_create_i2c_busses ( struct intelfb_info * dinfo ) ;
2006-06-20 22:55:55 +04:00
extern void intelfb_delete_i2c_busses ( struct intelfb_info * dinfo ) ;
2006-06-20 22:55:55 +04:00
# endif
2005-04-17 02:20:36 +04:00
# endif /* _INTELFB_H */