cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sm750.h (5725B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef LYNXDRV_H_
      3#define LYNXDRV_H_
      4
      5#define FB_ACCEL_SMI 0xab
      6
      7#define MHZ(x) ((x) * 1000000)
      8
      9#define DEFAULT_SM750_CHIP_CLOCK	290
     10#define DEFAULT_SM750LE_CHIP_CLOCK	333
     11#ifndef SM750LE_REVISION_ID
     12#define SM750LE_REVISION_ID ((unsigned char)0xfe)
     13#endif
     14
     15enum sm750_pnltype {
     16	sm750_24TFT = 0,	/* 24bit tft */
     17	sm750_dualTFT = 2,	/* dual 18 bit tft */
     18	sm750_doubleTFT = 1,	/* 36 bit double pixel tft */
     19};
     20
     21/* vga channel is not concerned  */
     22enum sm750_dataflow {
     23	sm750_simul_pri,	/* primary => all head */
     24	sm750_simul_sec,	/* secondary => all head */
     25	sm750_dual_normal,	/* primary => panel head and secondary => crt */
     26	sm750_dual_swap,	/* primary => crt head and secondary => panel */
     27};
     28
     29enum sm750_channel {
     30	sm750_primary = 0,
     31	/* enum value equal to the register filed data */
     32	sm750_secondary = 1,
     33};
     34
     35enum sm750_path {
     36	sm750_panel = 1,
     37	sm750_crt = 2,
     38	sm750_pnc = 3,	/* panel and crt */
     39};
     40
     41struct init_status {
     42	ushort powerMode;
     43	/* below three clocks are in unit of MHZ*/
     44	ushort chip_clk;
     45	ushort mem_clk;
     46	ushort master_clk;
     47	ushort setAllEngOff;
     48	ushort resetMemory;
     49};
     50
     51struct lynx_accel {
     52	/* base virtual address of DPR registers */
     53	volatile unsigned char __iomem *dprBase;
     54	/* base virtual address of de data port */
     55	volatile unsigned char __iomem *dpPortBase;
     56
     57	/* function pointers */
     58	void (*de_init)(struct lynx_accel *accel);
     59
     60	int (*de_wait)(void);/* see if hardware ready to work */
     61
     62	int (*de_fillrect)(struct lynx_accel *accel,
     63			   u32 base, u32 pitch, u32 bpp,
     64			   u32 x, u32 y, u32 width, u32 height,
     65			   u32 color, u32 rop);
     66
     67	int (*de_copyarea)(struct lynx_accel *accel,
     68			   u32 s_base, u32 s_pitch,
     69			   u32 sx, u32 sy,
     70			   u32 d_base, u32 d_pitch,
     71			   u32 bpp, u32 dx, u32 dy,
     72			   u32 width, u32 height,
     73			   u32 rop2);
     74
     75	int (*de_imageblit)(struct lynx_accel *accel, const char *p_srcbuf,
     76			    u32 src_delta, u32 start_bit, u32 d_base, u32 d_pitch,
     77			    u32 byte_per_pixel, u32 dx, u32 dy, u32 width,
     78			    u32 height, u32 f_color, u32 b_color, u32 rop2);
     79
     80};
     81
     82struct sm750_dev {
     83	/* common members */
     84	u16 devid;
     85	u8 revid;
     86	struct pci_dev *pdev;
     87	struct fb_info *fbinfo[2];
     88	struct lynx_accel accel;
     89	int accel_off;
     90	int fb_count;
     91	int mtrr_off;
     92	struct{
     93		int vram;
     94	} mtrr;
     95	/* all smi graphic adaptor got below attributes */
     96	unsigned long vidmem_start;
     97	unsigned long vidreg_start;
     98	__u32 vidmem_size;
     99	__u32 vidreg_size;
    100	void __iomem *pvReg;
    101	unsigned char __iomem *pvMem;
    102	/* locks*/
    103	spinlock_t slock;
    104
    105	struct init_status initParm;
    106	enum sm750_pnltype pnltype;
    107	enum sm750_dataflow dataflow;
    108	int nocrt;
    109
    110	/*
    111	 * 0: no hardware cursor
    112	 * 1: primary crtc hw cursor enabled,
    113	 * 2: secondary crtc hw cursor enabled
    114	 * 3: both ctrc hw cursor enabled
    115	 */
    116	int hwCursor;
    117};
    118
    119struct lynx_cursor {
    120	/* cursor width ,height and size */
    121	int w;
    122	int h;
    123	int size;
    124	/* hardware limitation */
    125	int max_w;
    126	int max_h;
    127	/* base virtual address and offset  of cursor image */
    128	char __iomem *vstart;
    129	int offset;
    130	/* mmio addr of hw cursor */
    131	volatile char __iomem *mmio;
    132};
    133
    134struct lynxfb_crtc {
    135	unsigned char __iomem *v_cursor; /* virtual address of cursor */
    136	unsigned char __iomem *v_screen; /* virtual address of on_screen */
    137	int o_cursor; /* cursor address offset in vidmem */
    138	int o_screen; /* onscreen address offset in vidmem */
    139	int channel;/* which channel this crtc stands for*/
    140	resource_size_t vidmem_size;/* this view's video memory max size */
    141
    142	/* below attributes belong to info->fix, their value depends on specific adaptor*/
    143	u16 line_pad;/* padding information:0,1,2,4,8,16,... */
    144	u16 xpanstep;
    145	u16 ypanstep;
    146	u16 ywrapstep;
    147
    148	void *priv;
    149
    150	/* cursor information */
    151	struct lynx_cursor cursor;
    152};
    153
    154struct lynxfb_output {
    155	int dpms;
    156	int paths;
    157	/*
    158	 * which paths(s) this output stands for,for sm750:
    159	 * paths=1:means output for panel paths
    160	 * paths=2:means output for crt paths
    161	 * paths=3:means output for both panel and crt paths
    162	 */
    163
    164	int *channel;
    165	/*
    166	 * which channel these outputs linked with,for sm750:
    167	 * *channel=0 means primary channel
    168	 * *channel=1 means secondary channel
    169	 * output->channel ==> &crtc->channel
    170	 */
    171	void *priv;
    172
    173	int (*proc_setBLANK)(struct lynxfb_output *output, int blank);
    174};
    175
    176struct lynxfb_par {
    177	/* either 0 or 1 for dual head adaptor,0 is the older one registered */
    178	int index;
    179	unsigned int pseudo_palette[256];
    180	struct lynxfb_crtc crtc;
    181	struct lynxfb_output output;
    182	struct fb_info *info;
    183	struct sm750_dev *dev;
    184};
    185
    186static inline unsigned long ps_to_hz(unsigned int psvalue)
    187{
    188	unsigned long long numerator = 1000 * 1000 * 1000 * 1000ULL;
    189	/* 10^12 / picosecond period gives frequency in Hz */
    190	do_div(numerator, psvalue);
    191	return (unsigned long)numerator;
    192}
    193
    194int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
    195int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
    196void hw_sm750_initAccel(struct sm750_dev *sm750_dev);
    197int hw_sm750_deWait(void);
    198int hw_sm750le_deWait(void);
    199
    200int hw_sm750_output_setMode(struct lynxfb_output *output,
    201			    struct fb_var_screeninfo *var,
    202			    struct fb_fix_screeninfo *fix);
    203
    204int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
    205			    struct fb_var_screeninfo *var);
    206
    207int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
    208			  struct fb_var_screeninfo *var,
    209			  struct fb_fix_screeninfo *fix);
    210
    211int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,
    212		       ushort red, ushort green, ushort blue);
    213
    214int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);
    215int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);
    216int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
    217			 const struct fb_var_screeninfo *var,
    218			 const struct fb_info *info);
    219
    220#endif