709 lines · 17.2 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 *//* * * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200, G400 and G450 * * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz> * */#ifndef __MATROXFB_H__#define __MATROXFB_H__ /* general, but fairly heavy, debugging */#undef MATROXFB_DEBUG /* heavy debugging: *//* -- logs putc[s], so every time a char is displayed, it's logged */#undef MATROXFB_DEBUG_HEAVY /* This one _could_ cause infinite loops *//* It _does_ cause lots and lots of messages during idle loops */#undef MATROXFB_DEBUG_LOOP /* Debug register calls, too? */#undef MATROXFB_DEBUG_REG /* Guard accelerator accesses with spin_lock_irqsave... */#undef MATROXFB_USE_SPINLOCKS #include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/delay.h>#include <linux/fb.h>#include <linux/console.h>#include <linux/selection.h>#include <linux/ioport.h>#include <linux/init.h>#include <linux/timer.h>#include <linux/pci.h>#include <linux/spinlock.h>#include <linux/kd.h> #include <asm/io.h>#include <linux/unaligned.h> #if defined(CONFIG_PPC_PMAC)#include "../macmodes.h"#endif #ifdef MATROXFB_DEBUG #define DEBUG#define DBG(x)		printk(KERN_DEBUG "matroxfb: %s\n", (x)); #ifdef MATROXFB_DEBUG_HEAVY#define DBG_HEAVY(x)	DBG(x)#else /* MATROXFB_DEBUG_HEAVY */#define DBG_HEAVY(x)	/* DBG_HEAVY */#endif /* MATROXFB_DEBUG_HEAVY */ #ifdef MATROXFB_DEBUG_LOOP#define DBG_LOOP(x)	DBG(x)#else /* MATROXFB_DEBUG_LOOP */#define DBG_LOOP(x)	/* DBG_LOOP */#endif /* MATROXFB_DEBUG_LOOP */ #ifdef MATROXFB_DEBUG_REG#define DBG_REG(x)	DBG(x)#else /* MATROXFB_DEBUG_REG */#define DBG_REG(x)	/* DBG_REG */#endif /* MATROXFB_DEBUG_REG */ #else /* MATROXFB_DEBUG */ #define DBG(x)		/* DBG */#define DBG_HEAVY(x)	/* DBG_HEAVY */#define DBG_REG(x)	/* DBG_REG */#define DBG_LOOP(x)	/* DBG_LOOP */ #endif /* MATROXFB_DEBUG */ #ifdef DEBUG#define dprintk(X...)	printk(X)#else#define dprintk(X...)	no_printk(X)#endif #ifndef PCI_SS_VENDOR_ID_SIEMENS_NIXDORF#define PCI_SS_VENDOR_ID_SIEMENS_NIXDORF	0x110A#endif#ifndef PCI_SS_VENDOR_ID_MATROX#define PCI_SS_VENDOR_ID_MATROX		PCI_VENDOR_ID_MATROX#endif #ifndef PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP#define PCI_SS_ID_MATROX_GENERIC		0xFF00#define PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP	0xFF01#define PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP	0xFF02#define PCI_SS_ID_MATROX_MILLENIUM_G200_AGP	0xFF03#define PCI_SS_ID_MATROX_MARVEL_G200_AGP	0xFF04#define PCI_SS_ID_MATROX_MGA_G100_PCI		0xFF05#define PCI_SS_ID_MATROX_MGA_G100_AGP		0x1001#define PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP	0x2179#define PCI_SS_ID_SIEMENS_MGA_G100_AGP		0x001E /* 30 */#define PCI_SS_ID_SIEMENS_MGA_G200_AGP		0x0032 /* 50 */#endif #define MX_VISUAL_TRUECOLOR	FB_VISUAL_DIRECTCOLOR#define MX_VISUAL_DIRECTCOLOR	FB_VISUAL_TRUECOLOR#define MX_VISUAL_PSEUDOCOLOR	FB_VISUAL_PSEUDOCOLOR #define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16) /* G-series and Mystique have (almost) same DAC */#undef NEED_DAC1064#if defined(CONFIG_FB_MATROX_MYSTIQUE) || defined(CONFIG_FB_MATROX_G)#define NEED_DAC1064 1#endif typedef struct {	void __iomem*	vaddr;} vaddr_t; static inline unsigned int mga_readb(vaddr_t va, unsigned int offs) {	return readb(va.vaddr + offs);} static inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) {	writeb(value, va.vaddr + offs);} static inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) {	writew(value, va.vaddr + offs);} static inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) {	return readl(va.vaddr + offs);} static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) {	writel(value, va.vaddr + offs);} static inline void mga_memcpy_toio(vaddr_t va, const void* src, int len) {#if defined(__alpha__) || defined(__i386__) || defined(__x86_64__)	/*	 * iowrite32_rep works for us if:	 *  (1) Copies data as 32bit quantities, not byte after byte,	 *  (2) Performs LE ordered stores, and	 *  (3) It copes with unaligned source (destination is guaranteed to be page	 *      aligned and length is guaranteed to be multiple of 4).	 */	iowrite32_rep(va.vaddr, src, len >> 2);#else        u_int32_t __iomem* addr = va.vaddr; 	if ((unsigned long)src & 3) {		while (len >= 4) {			fb_writel(get_unaligned((u32 *)src), addr);			addr++;			len -= 4;			src += 4;		}	} else {		while (len >= 4) {			fb_writel(*(u32 *)src, addr);			addr++;			len -= 4;			src += 4;		}	}#endif} static inline void vaddr_add(vaddr_t* va, unsigned long offs) {	va->vaddr += offs;} static inline void __iomem* vaddr_va(vaddr_t va) {	return va.vaddr;} struct my_timming {	unsigned int pixclock;	int mnp;	unsigned int crtc;	unsigned int HDisplay;	unsigned int HSyncStart;	unsigned int HSyncEnd;	unsigned int HTotal;	unsigned int VDisplay;	unsigned int VSyncStart;	unsigned int VSyncEnd;	unsigned int VTotal;	unsigned int sync;	int	     dblscan;	int	     interlaced;	unsigned int delay;	/* CRTC delay */}; enum { M_SYSTEM_PLL, M_PIXEL_PLL_A, M_PIXEL_PLL_B, M_PIXEL_PLL_C, M_VIDEO_PLL }; struct matrox_pll_cache {	unsigned int	valid;	struct {		unsigned int	mnp_key;		unsigned int	mnp_value;		      } data[4];}; struct matrox_pll_limits {	unsigned int	vcomin;	unsigned int	vcomax;}; struct matrox_pll_features {	unsigned int	vco_freq_min;	unsigned int	ref_freq;	unsigned int	feed_div_min;	unsigned int	feed_div_max;	unsigned int	in_div_min;	unsigned int	in_div_max;	unsigned int	post_shift_max;}; struct matroxfb_par{	unsigned int	final_bppShift;	unsigned int	cmap_len;	struct {		unsigned int bytes;		unsigned int pixels;		unsigned int chunks;		      } ydstorg;}; struct matrox_fb_info; struct matrox_DAC1064_features {	u_int8_t	xvrefctrl;	u_int8_t	xmiscctrl;}; /* current hardware status */struct mavenregs {	u_int8_t regs[256];	int	 mode;	int	 vlines;	int	 xtal;	int	 fv; 	u_int16_t htotal;	u_int16_t hcorr;}; struct matrox_crtc2 {	u_int32_t ctl;}; struct matrox_hw_state {	u_int32_t	MXoptionReg;	unsigned char	DACclk[6];	unsigned char	DACreg[80];	unsigned char	MiscOutReg;	unsigned char	DACpal[768];	unsigned char	CRTC[25];	unsigned char	CRTCEXT[9];	unsigned char	SEQ[5];	/* unused for MGA mode, but who knows... */	unsigned char	GCTL[9];	/* unused for MGA mode, but who knows... */	unsigned char	ATTR[21]; 	/* TVOut only */	struct mavenregs	maven; 	struct matrox_crtc2	crtc2;}; struct matrox_accel_data {#ifdef CONFIG_FB_MATROX_MILLENIUM	unsigned char	ramdac_rev;#endif	u_int32_t	m_dwg_rect;	u_int32_t	m_opmode;	u_int32_t	m_access;	u_int32_t	m_pitch;}; struct v4l2_queryctrl;struct v4l2_control; struct matrox_altout {	const char	*name;	int		(*compute)(void* altout_dev, struct my_timming* input);	int		(*program)(void* altout_dev);	int		(*start)(void* altout_dev);	int		(*verifymode)(void* altout_dev, u_int32_t mode);	int		(*getqueryctrl)(void* altout_dev,					struct v4l2_queryctrl* ctrl);	int		(*getctrl)(void *altout_dev,				   struct v4l2_control* ctrl);	int		(*setctrl)(void *altout_dev,				   struct v4l2_control* ctrl);}; #define MATROXFB_SRC_NONE	0#define MATROXFB_SRC_CRTC1	1#define MATROXFB_SRC_CRTC2	2 enum mga_chip { MGA_2064, MGA_2164, MGA_1064, MGA_1164, MGA_G100, MGA_G200, MGA_G400, MGA_G450, MGA_G550 }; struct matrox_bios {	unsigned int	bios_valid : 1;	unsigned int	pins_len;	unsigned char	pins[128];	struct {		unsigned char vMaj, vMin, vRev;		      } version;	struct {		unsigned char state, tvout;		      } output;}; struct matrox_switch;struct matroxfb_driver;struct matroxfb_dh_fb_info; struct matrox_vsync {	wait_queue_head_t	wait;	unsigned int		cnt;}; struct matrox_fb_info {	struct fb_info		fbcon; 	struct list_head	next_fb; 	int			dead;	int                     initialized;	unsigned int		usecount; 	unsigned int		userusecount;	unsigned long		irq_flags; 	struct matroxfb_par	curr;	struct matrox_hw_state	hw; 	struct matrox_accel_data accel; 	struct pci_dev*		pcidev; 	struct {		struct matrox_vsync	vsync;		unsigned int	pixclock;		int		mnp;		int		panpos;			      } crtc1;	struct {		struct matrox_vsync	vsync;		unsigned int 	pixclock;		int		mnp;	struct matroxfb_dh_fb_info*	info;	struct rw_semaphore	lock;			      } crtc2;	struct {	struct rw_semaphore	lock;	struct {		int brightness, contrast, saturation, hue, gamma;		int testout, deflicker;				} tvo_params;			      } altout;#define MATROXFB_MAX_OUTPUTS		3	struct {	unsigned int		src;	struct matrox_altout*	output;	void*			data;	unsigned int		mode;	unsigned int		default_src;			      } outputs[MATROXFB_MAX_OUTPUTS]; #define MATROXFB_MAX_FB_DRIVERS		5	struct matroxfb_driver* (drivers[MATROXFB_MAX_FB_DRIVERS]);	void*			(drivers_data[MATROXFB_MAX_FB_DRIVERS]);	unsigned int		drivers_count; 	struct {	unsigned long	base;	/* physical */	vaddr_t		vbase;	/* CPU view */	unsigned int	len;	unsigned int	len_usable;	unsigned int	len_maximum;		      } video; 	struct {	unsigned long	base;	/* physical */	vaddr_t		vbase;	/* CPU view */	unsigned int	len;		      } mmio; 	unsigned int	max_pixel_clock;	unsigned int	max_pixel_clock_panellink; 	struct matrox_switch*	hw_switch; 	struct {		struct matrox_pll_features pll;		struct matrox_DAC1064_features DAC1064;			      } features;	struct {		spinlock_t	DAC;		spinlock_t	accel;			      } lock; 	enum mga_chip		chip; 	int			interleave;	int			millenium;	int			milleniumII;	struct {		int		cfb4;		const int*	vxres;		int		cross4MB;		int		text;		int		plnwt;		int		srcorg;			      } capable;	int			wc_cookie;	struct {		int		precise_width;		int		mga_24bpp_fix;		int		novga;		int		nobios;		int		nopciretry;		int		noinit;		int		sgram;		int		support32MB; 		int		accelerator;		int		text_type_aux;		int		video64bits;		int		crtc2;		int		maven_capable;		unsigned int	vgastep;		unsigned int	textmode;		unsigned int	textstep;		unsigned int	textvram;	/* character cells */		unsigned int	ydstorg;	/* offset in bytes from video start to usable memory */						/* 0 except for 6MB Millenium */		int		memtype;		int		g450dac;		int		dfp_type;		int		panellink;	/* G400 DFP possible (not G450/G550) */		int		dualhead;		unsigned int	fbResource;			      } devflags;	struct fb_ops		fbops;	struct matrox_bios	bios;	struct {		struct matrox_pll_limits	pixel;		struct matrox_pll_limits	system;		struct matrox_pll_limits	video;			      } limits;	struct {		struct matrox_pll_cache	pixel;		struct matrox_pll_cache	system;		struct matrox_pll_cache	video;				      } cache;	struct {		struct {			unsigned int	video;			unsigned int	system;				      } pll;		struct {			u_int32_t	opt;			u_int32_t	opt2;			u_int32_t	opt3;			u_int32_t	mctlwtst;			u_int32_t	mctlwtst_core;			u_int32_t	memmisc;			u_int32_t	memrdbk;			u_int32_t	maccess;				      } reg;		struct {			unsigned int	ddr:1,			                emrswen:1,					dll:1;				      } memory;			      } values;	u_int32_t cmap[16];}; #define info2minfo(info) container_of(info, struct matrox_fb_info, fbcon) struct matrox_switch {	int	(*preinit)(struct matrox_fb_info *minfo);	void	(*reset)(struct matrox_fb_info *minfo);

Lines 1–500 of 709.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t