/* SPDX-License-Identifier: GPL-2.0 */
|
#ifndef LYNXDRV_H_
|
#define LYNXDRV_H_
|
|
#define FB_ACCEL_SMI 0xab
|
|
#define MHZ(x) ((x) * 1000000)
|
|
#define DEFAULT_SM750_CHIP_CLOCK 290
|
#define DEFAULT_SM750LE_CHIP_CLOCK 333
|
#ifndef SM750LE_REVISION_ID
|
#define SM750LE_REVISION_ID ((unsigned char)0xfe)
|
#endif
|
|
enum sm750_pnltype {
|
sm750_24TFT = 0, /* 24bit tft */
|
sm750_dualTFT = 2, /* dual 18 bit tft */
|
sm750_doubleTFT = 1, /* 36 bit double pixel tft */
|
};
|
|
/* vga channel is not concerned */
|
enum sm750_dataflow {
|
sm750_simul_pri, /* primary => all head */
|
sm750_simul_sec, /* secondary => all head */
|
sm750_dual_normal, /* primary => panel head and secondary => crt */
|
sm750_dual_swap, /* primary => crt head and secondary => panel */
|
};
|
|
enum sm750_channel {
|
sm750_primary = 0,
|
/* enum value equal to the register filed data */
|
sm750_secondary = 1,
|
};
|
|
enum sm750_path {
|
sm750_panel = 1,
|
sm750_crt = 2,
|
sm750_pnc = 3, /* panel and crt */
|
};
|
|
struct init_status {
|
ushort powerMode;
|
/* below three clocks are in unit of MHZ*/
|
ushort chip_clk;
|
ushort mem_clk;
|
ushort master_clk;
|
ushort setAllEngOff;
|
ushort resetMemory;
|
};
|
|
struct lynx_accel {
|
/* base virtual address of DPR registers */
|
volatile unsigned char __iomem *dprBase;
|
/* base virtual address of de data port */
|
volatile unsigned char __iomem *dpPortBase;
|
|
/* function pointers */
|
void (*de_init)(struct lynx_accel *);
|
|
int (*de_wait)(void);/* see if hardware ready to work */
|
|
int (*de_fillrect)(struct lynx_accel *,
|
u32, u32, u32, u32,
|
u32, u32, u32, u32, u32);
|
|
int (*de_copyarea)(struct lynx_accel *,
|
u32, u32, u32, u32,
|
u32, u32, u32, u32,
|
u32, u32, u32, u32);
|
|
int (*de_imageblit)(struct lynx_accel *, const char *,
|
u32, u32, u32, u32,
|
u32, u32, u32, u32,
|
u32, u32, u32, u32);
|
|
};
|
|
struct sm750_dev {
|
/* common members */
|
u16 devid;
|
u8 revid;
|
struct pci_dev *pdev;
|
struct fb_info *fbinfo[2];
|
struct lynx_accel accel;
|
int accel_off;
|
int fb_count;
|
int mtrr_off;
|
struct{
|
int vram;
|
} mtrr;
|
/* all smi graphic adaptor got below attributes */
|
unsigned long vidmem_start;
|
unsigned long vidreg_start;
|
__u32 vidmem_size;
|
__u32 vidreg_size;
|
void __iomem *pvReg;
|
unsigned char __iomem *pvMem;
|
/* locks*/
|
spinlock_t slock;
|
|
struct init_status initParm;
|
enum sm750_pnltype pnltype;
|
enum sm750_dataflow dataflow;
|
int nocrt;
|
|
/*
|
* 0: no hardware cursor
|
* 1: primary crtc hw cursor enabled,
|
* 2: secondary crtc hw cursor enabled
|
* 3: both ctrc hw cursor enabled
|
*/
|
int hwCursor;
|
};
|
|
struct lynx_cursor {
|
/* cursor width ,height and size */
|
int w;
|
int h;
|
int size;
|
/* hardware limitation */
|
int maxW;
|
int maxH;
|
/* base virtual address and offset of cursor image */
|
char __iomem *vstart;
|
int offset;
|
/* mmio addr of hw cursor */
|
volatile char __iomem *mmio;
|
};
|
|
struct lynxfb_crtc {
|
unsigned char __iomem *vCursor; /* virtual address of cursor */
|
unsigned char __iomem *vScreen; /* virtual address of on_screen */
|
int oCursor; /* cursor address offset in vidmem */
|
int oScreen; /* onscreen address offset in vidmem */
|
int channel;/* which channel this crtc stands for*/
|
resource_size_t vidmem_size;/* this view's video memory max size */
|
|
/* below attributes belong to info->fix, their value depends on specific adaptor*/
|
u16 line_pad;/* padding information:0,1,2,4,8,16,... */
|
u16 xpanstep;
|
u16 ypanstep;
|
u16 ywrapstep;
|
|
void *priv;
|
|
/* cursor information */
|
struct lynx_cursor cursor;
|
};
|
|
struct lynxfb_output {
|
int dpms;
|
int paths;
|
/*
|
* which paths(s) this output stands for,for sm750:
|
* paths=1:means output for panel paths
|
* paths=2:means output for crt paths
|
* paths=3:means output for both panel and crt paths
|
*/
|
|
int *channel;
|
/*
|
* which channel these outputs linked with,for sm750:
|
* *channel=0 means primary channel
|
* *channel=1 means secondary channel
|
* output->channel ==> &crtc->channel
|
*/
|
void *priv;
|
|
int (*proc_setBLANK)(struct lynxfb_output *output, int blank);
|
};
|
|
struct lynxfb_par {
|
/* either 0 or 1 for dual head adaptor,0 is the older one registered */
|
int index;
|
unsigned int pseudo_palette[256];
|
struct lynxfb_crtc crtc;
|
struct lynxfb_output output;
|
struct fb_info *info;
|
struct sm750_dev *dev;
|
};
|
|
static inline unsigned long ps_to_hz(unsigned int psvalue)
|
{
|
unsigned long long numerator = 1000 * 1000 * 1000 * 1000ULL;
|
/* 10^12 / picosecond period gives frequency in Hz */
|
do_div(numerator, psvalue);
|
return (unsigned long)numerator;
|
}
|
|
int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
|
int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
|
void hw_sm750_initAccel(struct sm750_dev *sm750_dev);
|
int hw_sm750_deWait(void);
|
int hw_sm750le_deWait(void);
|
|
int hw_sm750_output_setMode(struct lynxfb_output *output,
|
struct fb_var_screeninfo *var,
|
struct fb_fix_screeninfo *fix);
|
|
int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
|
struct fb_var_screeninfo *var);
|
|
int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
|
struct fb_var_screeninfo *var,
|
struct fb_fix_screeninfo *fix);
|
|
int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,
|
ushort red, ushort green, ushort blue);
|
|
int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);
|
int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);
|
int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
|
const struct fb_var_screeninfo *var,
|
const struct fb_info *info);
|
|
#endif
|