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

skeletonfb.c (36327B)


      1/*
      2 * linux/drivers/video/skeletonfb.c -- Skeleton for a frame buffer device
      3 *
      4 *  Modified to new api Jan 2001 by James Simmons (jsimmons@transvirtual.com)
      5 *
      6 *  Created 28 Dec 1997 by Geert Uytterhoeven
      7 *
      8 *
      9 *  I have started rewriting this driver as a example of the upcoming new API
     10 *  The primary goal is to remove the console code from fbdev and place it
     11 *  into fbcon.c. This reduces the code and makes writing a new fbdev driver
     12 *  easy since the author doesn't need to worry about console internals. It
     13 *  also allows the ability to run fbdev without a console/tty system on top 
     14 *  of it. 
     15 *
     16 *  First the roles of struct fb_info and struct display have changed. Struct
     17 *  display will go away. The way the new framebuffer console code will
     18 *  work is that it will act to translate data about the tty/console in 
     19 *  struct vc_data to data in a device independent way in struct fb_info. Then
     20 *  various functions in struct fb_ops will be called to store the device 
     21 *  dependent state in the par field in struct fb_info and to change the 
     22 *  hardware to that state. This allows a very clean separation of the fbdev
     23 *  layer from the console layer. It also allows one to use fbdev on its own
     24 *  which is a bounus for embedded devices. The reason this approach works is  
     25 *  for each framebuffer device when used as a tty/console device is allocated
     26 *  a set of virtual terminals to it. Only one virtual terminal can be active 
     27 *  per framebuffer device. We already have all the data we need in struct 
     28 *  vc_data so why store a bunch of colormaps and other fbdev specific data
     29 *  per virtual terminal. 
     30 *
     31 *  As you can see doing this makes the con parameter pretty much useless
     32 *  for struct fb_ops functions, as it should be. Also having struct  
     33 *  fb_var_screeninfo and other data in fb_info pretty much eliminates the 
     34 *  need for get_fix and get_var. Once all drivers use the fix, var, and cmap
     35 *  fbcon can be written around these fields. This will also eliminate the
     36 *  need to regenerate struct fb_var_screeninfo, struct fb_fix_screeninfo
     37 *  struct fb_cmap every time get_var, get_fix, get_cmap functions are called
     38 *  as many drivers do now. 
     39 *
     40 *  This file is subject to the terms and conditions of the GNU General Public
     41 *  License. See the file COPYING in the main directory of this archive for
     42 *  more details.
     43 */
     44
     45#include <linux/module.h>
     46#include <linux/kernel.h>
     47#include <linux/errno.h>
     48#include <linux/string.h>
     49#include <linux/mm.h>
     50#include <linux/slab.h>
     51#include <linux/delay.h>
     52#include <linux/fb.h>
     53#include <linux/init.h>
     54#include <linux/pci.h>
     55
     56    /*
     57     *  This is just simple sample code.
     58     *
     59     *  No warranty that it actually compiles.
     60     *  Even less warranty that it actually works :-)
     61     */
     62
     63/*
     64 * Driver data
     65 */
     66static char *mode_option;
     67
     68/*
     69 *  If your driver supports multiple boards, you should make the  
     70 *  below data types arrays, or allocate them dynamically (using kmalloc()). 
     71 */ 
     72
     73/* 
     74 * This structure defines the hardware state of the graphics card. Normally
     75 * you place this in a header file in linux/include/video. This file usually
     76 * also includes register information. That allows other driver subsystems
     77 * and userland applications the ability to use the same header file to 
     78 * avoid duplicate work and easy porting of software. 
     79 */
     80struct xxx_par;
     81
     82/*
     83 * Here we define the default structs fb_fix_screeninfo and fb_var_screeninfo
     84 * if we don't use modedb. If we do use modedb see xxxfb_init how to use it
     85 * to get a fb_var_screeninfo. Otherwise define a default var as well. 
     86 */
     87static const struct fb_fix_screeninfo xxxfb_fix = {
     88	.id =		"FB's name", 
     89	.type =		FB_TYPE_PACKED_PIXELS,
     90	.visual =	FB_VISUAL_PSEUDOCOLOR,
     91	.xpanstep =	1,
     92	.ypanstep =	1,
     93	.ywrapstep =	1, 
     94	.accel =	FB_ACCEL_NONE,
     95};
     96
     97    /*
     98     * 	Modern graphical hardware not only supports pipelines but some 
     99     *  also support multiple monitors where each display can have
    100     *  its own unique data. In this case each display could be  
    101     *  represented by a separate framebuffer device thus a separate 
    102     *  struct fb_info. Now the struct xxx_par represents the graphics
    103     *  hardware state thus only one exist per card. In this case the 
    104     *  struct xxx_par for each graphics card would be shared between 
    105     *  every struct fb_info that represents a framebuffer on that card. 
    106     *  This allows when one display changes it video resolution (info->var) 
    107     *  the other displays know instantly. Each display can always be
    108     *  aware of the entire hardware state that affects it because they share
    109     *  the same xxx_par struct. The other side of the coin is multiple
    110     *  graphics cards that pass data around until it is finally displayed
    111     *  on one monitor. Such examples are the voodoo 1 cards and high end
    112     *  NUMA graphics servers. For this case we have a bunch of pars, each
    113     *  one that represents a graphics state, that belong to one struct 
    114     *  fb_info. Their you would want to have *par point to a array of device
    115     *  states and have each struct fb_ops function deal with all those 
    116     *  states. I hope this covers every possible hardware design. If not
    117     *  feel free to send your ideas at jsimmons@users.sf.net 
    118     */
    119
    120    /*
    121     *  If your driver supports multiple boards or it supports multiple 
    122     *  framebuffers, you should make these arrays, or allocate them 
    123     *  dynamically using framebuffer_alloc() and free them with
    124     *  framebuffer_release().
    125     */ 
    126static struct fb_info info;
    127
    128    /* 
    129     * Each one represents the state of the hardware. Most hardware have
    130     * just one hardware state. These here represent the default state(s). 
    131     */
    132static struct xxx_par __initdata current_par;
    133
    134int xxxfb_init(void);
    135
    136/**
    137 *	xxxfb_open - Optional function. Called when the framebuffer is
    138 *		     first accessed.
    139 *	@info: frame buffer structure that represents a single frame buffer
    140 *	@user: tell us if the userland (value=1) or the console is accessing
    141 *	       the framebuffer. 
    142 *
    143 *	This function is the first function called in the framebuffer api.
    144 *	Usually you don't need to provide this function. The case where it 
    145 *	is used is to change from a text mode hardware state to a graphics
    146 * 	mode state. 
    147 *
    148 *	Returns negative errno on error, or zero on success.
    149 */
    150static int xxxfb_open(struct fb_info *info, int user)
    151{
    152    return 0;
    153}
    154
    155/**
    156 *	xxxfb_release - Optional function. Called when the framebuffer 
    157 *			device is closed. 
    158 *	@info: frame buffer structure that represents a single frame buffer
    159 *	@user: tell us if the userland (value=1) or the console is accessing
    160 *	       the framebuffer. 
    161 *	
    162 *	Thus function is called when we close /dev/fb or the framebuffer 
    163 *	console system is released. Usually you don't need this function.
    164 *	The case where it is usually used is to go from a graphics state
    165 *	to a text mode state.
    166 *
    167 *	Returns negative errno on error, or zero on success.
    168 */
    169static int xxxfb_release(struct fb_info *info, int user)
    170{
    171    return 0;
    172}
    173
    174/**
    175 *      xxxfb_check_var - Optional function. Validates a var passed in. 
    176 *      @var: frame buffer variable screen structure
    177 *      @info: frame buffer structure that represents a single frame buffer 
    178 *
    179 *	Checks to see if the hardware supports the state requested by
    180 *	var passed in. This function does not alter the hardware state!!! 
    181 *	This means the data stored in struct fb_info and struct xxx_par do 
    182 *      not change. This includes the var inside of struct fb_info. 
    183 *	Do NOT change these. This function can be called on its own if we
    184 *	intent to only test a mode and not actually set it. The stuff in 
    185 *	modedb.c is a example of this. If the var passed in is slightly 
    186 *	off by what the hardware can support then we alter the var PASSED in
    187 *	to what we can do.
    188 *
    189 *      For values that are off, this function must round them _up_ to the
    190 *      next value that is supported by the hardware.  If the value is
    191 *      greater than the highest value supported by the hardware, then this
    192 *      function must return -EINVAL.
    193 *
    194 *      Exception to the above rule:  Some drivers have a fixed mode, ie,
    195 *      the hardware is already set at boot up, and cannot be changed.  In
    196 *      this case, it is more acceptable that this function just return
    197 *      a copy of the currently working var (info->var). Better is to not
    198 *      implement this function, as the upper layer will do the copying
    199 *      of the current var for you.
    200 *
    201 *      Note:  This is the only function where the contents of var can be
    202 *      freely adjusted after the driver has been registered. If you find
    203 *      that you have code outside of this function that alters the content
    204 *      of var, then you are doing something wrong.  Note also that the
    205 *      contents of info->var must be left untouched at all times after
    206 *      driver registration.
    207 *
    208 *	Returns negative errno on error, or zero on success.
    209 */
    210static int xxxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
    211{
    212    /* ... */
    213    return 0;	   	
    214}
    215
    216/**
    217 *      xxxfb_set_par - Optional function. Alters the hardware state.
    218 *      @info: frame buffer structure that represents a single frame buffer
    219 *
    220 *	Using the fb_var_screeninfo in fb_info we set the resolution of the
    221 *	this particular framebuffer. This function alters the par AND the
    222 *	fb_fix_screeninfo stored in fb_info. It doesn't not alter var in 
    223 *	fb_info since we are using that data. This means we depend on the
    224 *	data in var inside fb_info to be supported by the hardware. 
    225 *
    226 *      This function is also used to recover/restore the hardware to a
    227 *      known working state.
    228 *
    229 *	xxxfb_check_var is always called before xxxfb_set_par to ensure that
    230 *      the contents of var is always valid.
    231 *
    232 *	Again if you can't change the resolution you don't need this function.
    233 *
    234 *      However, even if your hardware does not support mode changing,
    235 *      a set_par might be needed to at least initialize the hardware to
    236 *      a known working state, especially if it came back from another
    237 *      process that also modifies the same hardware, such as X.
    238 *
    239 *      If this is the case, a combination such as the following should work:
    240 *
    241 *      static int xxxfb_check_var(struct fb_var_screeninfo *var,
    242 *                                struct fb_info *info)
    243 *      {
    244 *              *var = info->var;
    245 *              return 0;
    246 *      }
    247 *
    248 *      static int xxxfb_set_par(struct fb_info *info)
    249 *      {
    250 *              init your hardware here
    251 *      }
    252 *
    253 *	Returns negative errno on error, or zero on success.
    254 */
    255static int xxxfb_set_par(struct fb_info *info)
    256{
    257    struct xxx_par *par = info->par;
    258    /* ... */
    259    return 0;	
    260}
    261
    262/**
    263 *  	xxxfb_setcolreg - Optional function. Sets a color register.
    264 *      @regno: Which register in the CLUT we are programming 
    265 *      @red: The red value which can be up to 16 bits wide 
    266 *	@green: The green value which can be up to 16 bits wide 
    267 *	@blue:  The blue value which can be up to 16 bits wide.
    268 *	@transp: If supported, the alpha value which can be up to 16 bits wide.
    269 *      @info: frame buffer info structure
    270 * 
    271 *  	Set a single color register. The values supplied have a 16 bit
    272 *  	magnitude which needs to be scaled in this function for the hardware. 
    273 *	Things to take into consideration are how many color registers, if
    274 *	any, are supported with the current color visual. With truecolor mode
    275 *	no color palettes are supported. Here a pseudo palette is created
    276 *	which we store the value in pseudo_palette in struct fb_info. For
    277 *	pseudocolor mode we have a limited color palette. To deal with this
    278 *	we can program what color is displayed for a particular pixel value.
    279 *	DirectColor is similar in that we can program each color field. If
    280 *	we have a static colormap we don't need to implement this function. 
    281 * 
    282 *	Returns negative errno on error, or zero on success.
    283 */
    284static int xxxfb_setcolreg(unsigned regno, unsigned red, unsigned green,
    285			   unsigned blue, unsigned transp,
    286			   struct fb_info *info)
    287{
    288    if (regno >= 256)  /* no. of hw registers */
    289       return -EINVAL;
    290    /*
    291     * Program hardware... do anything you want with transp
    292     */
    293
    294    /* grayscale works only partially under directcolor */
    295    if (info->var.grayscale) {
    296       /* grayscale = 0.30*R + 0.59*G + 0.11*B */
    297       red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
    298    }
    299
    300    /* Directcolor:
    301     *   var->{color}.offset contains start of bitfield
    302     *   var->{color}.length contains length of bitfield
    303     *   {hardwarespecific} contains width of DAC
    304     *   pseudo_palette[X] is programmed to (X << red.offset) |
    305     *                                      (X << green.offset) |
    306     *                                      (X << blue.offset)
    307     *   RAMDAC[X] is programmed to (red, green, blue)
    308     *   color depth = SUM(var->{color}.length)
    309     *
    310     * Pseudocolor:
    311     *    var->{color}.offset is 0 unless the palette index takes less than
    312     *                        bits_per_pixel bits and is stored in the upper
    313     *                        bits of the pixel value
    314     *    var->{color}.length is set so that 1 << length is the number of
    315     *                        available palette entries
    316     *    pseudo_palette is not used
    317     *    RAMDAC[X] is programmed to (red, green, blue)
    318     *    color depth = var->{color}.length
    319     *
    320     * Static pseudocolor:
    321     *    same as Pseudocolor, but the RAMDAC is not programmed (read-only)
    322     *
    323     * Mono01/Mono10:
    324     *    Has only 2 values, black on white or white on black (fg on bg),
    325     *    var->{color}.offset is 0
    326     *    white = (1 << var->{color}.length) - 1, black = 0
    327     *    pseudo_palette is not used
    328     *    RAMDAC does not exist
    329     *    color depth is always 2
    330     *
    331     * Truecolor:
    332     *    does not use RAMDAC (usually has 3 of them).
    333     *    var->{color}.offset contains start of bitfield
    334     *    var->{color}.length contains length of bitfield
    335     *    pseudo_palette is programmed to (red << red.offset) |
    336     *                                    (green << green.offset) |
    337     *                                    (blue << blue.offset) |
    338     *                                    (transp << transp.offset)
    339     *    RAMDAC does not exist
    340     *    color depth = SUM(var->{color}.length})
    341     *
    342     *  The color depth is used by fbcon for choosing the logo and also
    343     *  for color palette transformation if color depth < 4
    344     *
    345     *  As can be seen from the above, the field bits_per_pixel is _NOT_
    346     *  a criteria for describing the color visual.
    347     *
    348     *  A common mistake is assuming that bits_per_pixel <= 8 is pseudocolor,
    349     *  and higher than that, true/directcolor.  This is incorrect, one needs
    350     *  to look at the fix->visual.
    351     *
    352     *  Another common mistake is using bits_per_pixel to calculate the color
    353     *  depth.  The bits_per_pixel field does not directly translate to color
    354     *  depth. You have to compute for the color depth (using the color
    355     *  bitfields) and fix->visual as seen above.
    356     */
    357
    358    /*
    359     * This is the point where the color is converted to something that
    360     * is acceptable by the hardware.
    361     */
    362#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
    363    red = CNVT_TOHW(red, info->var.red.length);
    364    green = CNVT_TOHW(green, info->var.green.length);
    365    blue = CNVT_TOHW(blue, info->var.blue.length);
    366    transp = CNVT_TOHW(transp, info->var.transp.length);
    367#undef CNVT_TOHW
    368    /*
    369     * This is the point where the function feeds the color to the hardware
    370     * palette after converting the colors to something acceptable by
    371     * the hardware. Note, only FB_VISUAL_DIRECTCOLOR and
    372     * FB_VISUAL_PSEUDOCOLOR visuals need to write to the hardware palette.
    373     * If you have code that writes to the hardware CLUT, and it's not
    374     * any of the above visuals, then you are doing something wrong.
    375     */
    376    if (info->fix.visual == FB_VISUAL_DIRECTCOLOR ||
    377	info->fix.visual == FB_VISUAL_TRUECOLOR)
    378	    write_{red|green|blue|transp}_to_clut();
    379
    380    /* This is the point were you need to fill up the contents of
    381     * info->pseudo_palette. This structure is used _only_ by fbcon, thus
    382     * it only contains 16 entries to match the number of colors supported
    383     * by the console. The pseudo_palette is used only if the visual is
    384     * in directcolor or truecolor mode.  With other visuals, the
    385     * pseudo_palette is not used. (This might change in the future.)
    386     *
    387     * The contents of the pseudo_palette is in raw pixel format.  Ie, each
    388     * entry can be written directly to the framebuffer without any conversion.
    389     * The pseudo_palette is (void *).  However, if using the generic
    390     * drawing functions (cfb_imageblit, cfb_fillrect), the pseudo_palette
    391     * must be casted to (u32 *) _regardless_ of the bits per pixel. If the
    392     * driver is using its own drawing functions, then it can use whatever
    393     * size it wants.
    394     */
    395    if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
    396	info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
    397	    u32 v;
    398
    399	    if (regno >= 16)
    400		    return -EINVAL;
    401
    402	    v = (red << info->var.red.offset) |
    403		    (green << info->var.green.offset) |
    404		    (blue << info->var.blue.offset) |
    405		    (transp << info->var.transp.offset);
    406
    407	    ((u32*)(info->pseudo_palette))[regno] = v;
    408    }
    409
    410    /* ... */
    411    return 0;
    412}
    413
    414/**
    415 *      xxxfb_pan_display - NOT a required function. Pans the display.
    416 *      @var: frame buffer variable screen structure
    417 *      @info: frame buffer structure that represents a single frame buffer
    418 *
    419 *	Pan (or wrap, depending on the `vmode' field) the display using the
    420 *  	`xoffset' and `yoffset' fields of the `var' structure.
    421 *  	If the values don't fit, return -EINVAL.
    422 *
    423 *      Returns negative errno on error, or zero on success.
    424 */
    425static int xxxfb_pan_display(struct fb_var_screeninfo *var,
    426			     struct fb_info *info)
    427{
    428    /*
    429     * If your hardware does not support panning, _do_ _not_ implement this
    430     * function. Creating a dummy function will just confuse user apps.
    431     */
    432
    433    /*
    434     * Note that even if this function is fully functional, a setting of
    435     * 0 in both xpanstep and ypanstep means that this function will never
    436     * get called.
    437     */
    438
    439    /* ... */
    440    return 0;
    441}
    442
    443/**
    444 *      xxxfb_blank - NOT a required function. Blanks the display.
    445 *      @blank_mode: the blank mode we want. 
    446 *      @info: frame buffer structure that represents a single frame buffer
    447 *
    448 *      Blank the screen if blank_mode != FB_BLANK_UNBLANK, else unblank.
    449 *      Return 0 if blanking succeeded, != 0 if un-/blanking failed due to
    450 *      e.g. a video mode which doesn't support it.
    451 *
    452 *      Implements VESA suspend and powerdown modes on hardware that supports
    453 *      disabling hsync/vsync:
    454 *
    455 *      FB_BLANK_NORMAL = display is blanked, syncs are on.
    456 *      FB_BLANK_HSYNC_SUSPEND = hsync off
    457 *      FB_BLANK_VSYNC_SUSPEND = vsync off
    458 *      FB_BLANK_POWERDOWN =  hsync and vsync off
    459 *
    460 *      If implementing this function, at least support FB_BLANK_UNBLANK.
    461 *      Return !0 for any modes that are unimplemented.
    462 *
    463 */
    464static int xxxfb_blank(int blank_mode, struct fb_info *info)
    465{
    466    /* ... */
    467    return 0;
    468}
    469
    470/* ------------ Accelerated Functions --------------------- */
    471
    472/*
    473 * We provide our own functions if we have hardware acceleration
    474 * or non packed pixel format layouts. If we have no hardware 
    475 * acceleration, we can use a generic unaccelerated function. If using
    476 * a pack pixel format just use the functions in cfb_*.c. Each file 
    477 * has one of the three different accel functions we support.
    478 */
    479
    480/**
    481 *      xxxfb_fillrect - REQUIRED function. Can use generic routines if 
    482 *		 	 non acclerated hardware and packed pixel based.
    483 *			 Draws a rectangle on the screen.		
    484 *
    485 *      @info: frame buffer structure that represents a single frame buffer
    486 *	@region: The structure representing the rectangular region we 
    487 *		 wish to draw to.
    488 *
    489 *	This drawing operation places/removes a retangle on the screen 
    490 *	depending on the rastering operation with the value of color which
    491 *	is in the current color depth format.
    492 */
    493void xxxfb_fillrect(struct fb_info *p, const struct fb_fillrect *region)
    494{
    495/*	Meaning of struct fb_fillrect
    496 *
    497 *	@dx: The x and y corrdinates of the upper left hand corner of the 
    498 *	@dy: area we want to draw to. 
    499 *	@width: How wide the rectangle is we want to draw.
    500 *	@height: How tall the rectangle is we want to draw.
    501 *	@color:	The color to fill in the rectangle with. 
    502 *	@rop: The raster operation. We can draw the rectangle with a COPY
    503 *	      of XOR which provides erasing effect. 
    504 */
    505}
    506
    507/**
    508 *      xxxfb_copyarea - REQUIRED function. Can use generic routines if
    509 *                       non acclerated hardware and packed pixel based.
    510 *                       Copies one area of the screen to another area.
    511 *
    512 *      @info: frame buffer structure that represents a single frame buffer
    513 *      @area: Structure providing the data to copy the framebuffer contents
    514 *	       from one region to another.
    515 *
    516 *      This drawing operation copies a rectangular area from one area of the
    517 *	screen to another area.
    518 */
    519void xxxfb_copyarea(struct fb_info *p, const struct fb_copyarea *area) 
    520{
    521/*
    522 *      @dx: The x and y coordinates of the upper left hand corner of the
    523 *	@dy: destination area on the screen.
    524 *      @width: How wide the rectangle is we want to copy.
    525 *      @height: How tall the rectangle is we want to copy.
    526 *      @sx: The x and y coordinates of the upper left hand corner of the
    527 *      @sy: source area on the screen.
    528 */
    529}
    530
    531
    532/**
    533 *      xxxfb_imageblit - REQUIRED function. Can use generic routines if
    534 *                        non acclerated hardware and packed pixel based.
    535 *                        Copies a image from system memory to the screen. 
    536 *
    537 *      @info: frame buffer structure that represents a single frame buffer
    538 *	@image:	structure defining the image.
    539 *
    540 *      This drawing operation draws a image on the screen. It can be a 
    541 *	mono image (needed for font handling) or a color image (needed for
    542 *	tux). 
    543 */
    544void xxxfb_imageblit(struct fb_info *p, const struct fb_image *image) 
    545{
    546/*
    547 *      @dx: The x and y coordinates of the upper left hand corner of the
    548 *	@dy: destination area to place the image on the screen.
    549 *      @width: How wide the image is we want to copy.
    550 *      @height: How tall the image is we want to copy.
    551 *      @fg_color: For mono bitmap images this is color data for     
    552 *      @bg_color: the foreground and background of the image to
    553 *		   write directly to the frmaebuffer.
    554 *	@depth:	How many bits represent a single pixel for this image.
    555 *	@data: The actual data used to construct the image on the display.
    556 *	@cmap: The colormap used for color images.   
    557 */
    558
    559/*
    560 * The generic function, cfb_imageblit, expects that the bitmap scanlines are
    561 * padded to the next byte.  Most hardware accelerators may require padding to
    562 * the next u16 or the next u32.  If that is the case, the driver can specify
    563 * this by setting info->pixmap.scan_align = 2 or 4.  See a more
    564 * comprehensive description of the pixmap below.
    565 */
    566}
    567
    568/**
    569 *	xxxfb_cursor - 	OPTIONAL. If your hardware lacks support
    570 *			for a cursor, leave this field NULL.
    571 *
    572 *      @info: frame buffer structure that represents a single frame buffer
    573 *	@cursor: structure defining the cursor to draw.
    574 *
    575 *      This operation is used to set or alter the properities of the
    576 *	cursor.
    577 *
    578 *	Returns negative errno on error, or zero on success.
    579 */
    580int xxxfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
    581{
    582/*
    583 *      @set: 	Which fields we are altering in struct fb_cursor 
    584 *	@enable: Disable or enable the cursor 
    585 *      @rop: 	The bit operation we want to do. 
    586 *      @mask:  This is the cursor mask bitmap. 
    587 *      @dest:  A image of the area we are going to display the cursor.
    588 *		Used internally by the driver.	 
    589 *      @hot:	The hot spot. 
    590 *	@image:	The actual data for the cursor image.
    591 *
    592 *      NOTES ON FLAGS (cursor->set):
    593 *
    594 *      FB_CUR_SETIMAGE - the cursor image has changed (cursor->image.data)
    595 *      FB_CUR_SETPOS   - the cursor position has changed (cursor->image.dx|dy)
    596 *      FB_CUR_SETHOT   - the cursor hot spot has changed (cursor->hot.dx|dy)
    597 *      FB_CUR_SETCMAP  - the cursor colors has changed (cursor->fg_color|bg_color)
    598 *      FB_CUR_SETSHAPE - the cursor bitmask has changed (cursor->mask)
    599 *      FB_CUR_SETSIZE  - the cursor size has changed (cursor->width|height)
    600 *      FB_CUR_SETALL   - everything has changed
    601 *
    602 *      NOTES ON ROPs (cursor->rop, Raster Operation)
    603 *
    604 *      ROP_XOR         - cursor->image.data XOR cursor->mask
    605 *      ROP_COPY        - curosr->image.data AND cursor->mask
    606 *
    607 *      OTHER NOTES:
    608 *
    609 *      - fbcon only supports a 2-color cursor (cursor->image.depth = 1)
    610 *      - The fb_cursor structure, @cursor, _will_ always contain valid
    611 *        fields, whether any particular bitfields in cursor->set is set
    612 *        or not.
    613 */
    614}
    615
    616/**
    617 *	xxxfb_sync - NOT a required function. Normally the accel engine 
    618 *		     for a graphics card take a specific amount of time.
    619 *		     Often we have to wait for the accelerator to finish
    620 *		     its operation before we can write to the framebuffer
    621 *		     so we can have consistent display output. 
    622 *
    623 *      @info: frame buffer structure that represents a single frame buffer
    624 *
    625 *      If the driver has implemented its own hardware-based drawing function,
    626 *      implementing this function is highly recommended.
    627 */
    628int xxxfb_sync(struct fb_info *info)
    629{
    630	return 0;
    631}
    632
    633    /*
    634     *  Frame buffer operations
    635     */
    636
    637static const struct fb_ops xxxfb_ops = {
    638	.owner		= THIS_MODULE,
    639	.fb_open	= xxxfb_open,
    640	.fb_read	= xxxfb_read,
    641	.fb_write	= xxxfb_write,
    642	.fb_release	= xxxfb_release,
    643	.fb_check_var	= xxxfb_check_var,
    644	.fb_set_par	= xxxfb_set_par,
    645	.fb_setcolreg	= xxxfb_setcolreg,
    646	.fb_blank	= xxxfb_blank,
    647	.fb_pan_display	= xxxfb_pan_display,
    648	.fb_fillrect	= xxxfb_fillrect, 	/* Needed !!! */
    649	.fb_copyarea	= xxxfb_copyarea,	/* Needed !!! */
    650	.fb_imageblit	= xxxfb_imageblit,	/* Needed !!! */
    651	.fb_cursor	= xxxfb_cursor,		/* Optional !!! */
    652	.fb_sync	= xxxfb_sync,
    653	.fb_ioctl	= xxxfb_ioctl,
    654	.fb_mmap	= xxxfb_mmap,
    655};
    656
    657/* ------------------------------------------------------------------------- */
    658
    659    /*
    660     *  Initialization
    661     */
    662
    663/* static int __init xxfb_probe (struct platform_device *pdev) -- for platform devs */
    664static int xxxfb_probe(struct pci_dev *dev, const struct pci_device_id *ent)
    665{
    666    struct fb_info *info;
    667    struct xxx_par *par;
    668    struct device *device = &dev->dev; /* or &pdev->dev */
    669    int cmap_len, retval;	
    670   
    671    /*
    672     * Dynamically allocate info and par
    673     */
    674    info = framebuffer_alloc(sizeof(struct xxx_par), device);
    675
    676    if (!info) {
    677	    /* goto error path */
    678    }
    679
    680    par = info->par;
    681
    682    /* 
    683     * Here we set the screen_base to the virtual memory address
    684     * for the framebuffer. Usually we obtain the resource address
    685     * from the bus layer and then translate it to virtual memory
    686     * space via ioremap. Consult ioport.h. 
    687     */
    688    info->screen_base = framebuffer_virtual_memory;
    689    info->fbops = &xxxfb_ops;
    690    info->fix = xxxfb_fix;
    691    info->pseudo_palette = pseudo_palette; /* The pseudopalette is an
    692					    * 16-member array
    693					    */
    694    /*
    695     * Set up flags to indicate what sort of acceleration your
    696     * driver can provide (pan/wrap/copyarea/etc.) and whether it
    697     * is a module -- see FBINFO_* in include/linux/fb.h
    698     *
    699     * If your hardware can support any of the hardware accelerated functions
    700     * fbcon performance will improve if info->flags is set properly.
    701     *
    702     * FBINFO_HWACCEL_COPYAREA - hardware moves
    703     * FBINFO_HWACCEL_FILLRECT - hardware fills
    704     * FBINFO_HWACCEL_IMAGEBLIT - hardware mono->color expansion
    705     * FBINFO_HWACCEL_YPAN - hardware can pan display in y-axis
    706     * FBINFO_HWACCEL_YWRAP - hardware can wrap display in y-axis
    707     * FBINFO_HWACCEL_DISABLED - supports hardware accels, but disabled
    708     * FBINFO_READS_FAST - if set, prefer moves over mono->color expansion
    709     * FBINFO_MISC_TILEBLITTING - hardware can do tile blits
    710     *
    711     * NOTE: These are for fbcon use only.
    712     */
    713    info->flags = FBINFO_DEFAULT;
    714
    715/********************* This stage is optional ******************************/
    716     /*
    717     * The struct pixmap is a scratch pad for the drawing functions. This
    718     * is where the monochrome bitmap is constructed by the higher layers
    719     * and then passed to the accelerator.  For drivers that uses
    720     * cfb_imageblit, you can skip this part.  For those that have a more
    721     * rigorous requirement, this stage is needed
    722     */
    723
    724    /* PIXMAP_SIZE should be small enough to optimize drawing, but not
    725     * large enough that memory is wasted.  A safe size is
    726     * (max_xres * max_font_height/8). max_xres is driver dependent,
    727     * max_font_height is 32.
    728     */
    729    info->pixmap.addr = kmalloc(PIXMAP_SIZE, GFP_KERNEL);
    730    if (!info->pixmap.addr) {
    731	    /* goto error */
    732    }
    733
    734    info->pixmap.size = PIXMAP_SIZE;
    735
    736    /*
    737     * FB_PIXMAP_SYSTEM - memory is in system ram
    738     * FB_PIXMAP_IO     - memory is iomapped
    739     * FB_PIXMAP_SYNC   - if set, will call fb_sync() per access to pixmap,
    740     *                    usually if FB_PIXMAP_IO is set.
    741     *
    742     * Currently, FB_PIXMAP_IO is unimplemented.
    743     */
    744    info->pixmap.flags = FB_PIXMAP_SYSTEM;
    745
    746    /*
    747     * scan_align is the number of padding for each scanline.  It is in bytes.
    748     * Thus for accelerators that need padding to the next u32, put 4 here.
    749     */
    750    info->pixmap.scan_align = 4;
    751
    752    /*
    753     * buf_align is the amount to be padded for the buffer. For example,
    754     * the i810fb needs a scan_align of 2 but expects it to be fed with
    755     * dwords, so a buf_align = 4 is required.
    756     */
    757    info->pixmap.buf_align = 4;
    758
    759    /* access_align is how many bits can be accessed from the framebuffer
    760     * ie. some epson cards allow 16-bit access only.  Most drivers will
    761     * be safe with u32 here.
    762     *
    763     * NOTE: This field is currently unused.
    764     */
    765    info->pixmap.access_align = 32;
    766/***************************** End optional stage ***************************/
    767
    768    /*
    769     * This should give a reasonable default video mode. The following is
    770     * done when we can set a video mode. 
    771     */
    772    if (!mode_option)
    773	mode_option = "640x480@60";	 	
    774
    775    retval = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8);
    776  
    777    if (!retval || retval == 4)
    778	return -EINVAL;			
    779
    780    /* This has to be done! */
    781    if (fb_alloc_cmap(&info->cmap, cmap_len, 0))
    782	return -ENOMEM;
    783	
    784    /* 
    785     * The following is done in the case of having hardware with a static 
    786     * mode. If we are setting the mode ourselves we don't call this. 
    787     */	
    788    info->var = xxxfb_var;
    789
    790    /*
    791     * For drivers that can...
    792     */
    793    xxxfb_check_var(&info->var, info);
    794
    795    /*
    796     * Does a call to fb_set_par() before register_framebuffer needed?  This
    797     * will depend on you and the hardware.  If you are sure that your driver
    798     * is the only device in the system, a call to fb_set_par() is safe.
    799     *
    800     * Hardware in x86 systems has a VGA core.  Calling set_par() at this
    801     * point will corrupt the VGA console, so it might be safer to skip a
    802     * call to set_par here and just allow fbcon to do it for you.
    803     */
    804    /* xxxfb_set_par(info); */
    805
    806    if (register_framebuffer(info) < 0) {
    807	fb_dealloc_cmap(&info->cmap);
    808	return -EINVAL;
    809    }
    810    fb_info(info, "%s frame buffer device\n", info->fix.id);
    811    pci_set_drvdata(dev, info); /* or platform_set_drvdata(pdev, info) */
    812    return 0;
    813}
    814
    815    /*
    816     *  Cleanup
    817     */
    818/* static void xxxfb_remove(struct platform_device *pdev) */
    819static void xxxfb_remove(struct pci_dev *dev)
    820{
    821	struct fb_info *info = pci_get_drvdata(dev);
    822	/* or platform_get_drvdata(pdev); */
    823
    824	if (info) {
    825		unregister_framebuffer(info);
    826		fb_dealloc_cmap(&info->cmap);
    827		/* ... */
    828		framebuffer_release(info);
    829	}
    830}
    831
    832#ifdef CONFIG_PCI
    833#ifdef CONFIG_PM
    834/**
    835 *	xxxfb_suspend - Optional but recommended function. Suspend the device.
    836 *	@dev: PCI device
    837 *	@msg: the suspend event code.
    838 *
    839 *      See Documentation/driver-api/pm/devices.rst for more information
    840 */
    841static int xxxfb_suspend(struct device *dev)
    842{
    843	struct fb_info *info = dev_get_drvdata(dev);
    844	struct xxxfb_par *par = info->par;
    845
    846	/* suspend here */
    847	return 0;
    848}
    849
    850/**
    851 *	xxxfb_resume - Optional but recommended function. Resume the device.
    852 *	@dev: PCI device
    853 *
    854 *      See Documentation/driver-api/pm/devices.rst for more information
    855 */
    856static int xxxfb_resume(struct device *dev)
    857{
    858	struct fb_info *info = dev_get_drvdata(dev);
    859	struct xxxfb_par *par = info->par;
    860
    861	/* resume here */
    862	return 0;
    863}
    864#else
    865#define xxxfb_suspend NULL
    866#define xxxfb_resume NULL
    867#endif /* CONFIG_PM */
    868
    869static const struct pci_device_id xxxfb_id_table[] = {
    870	{ PCI_VENDOR_ID_XXX, PCI_DEVICE_ID_XXX,
    871	  PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
    872	  PCI_CLASS_MASK, 0 },
    873	{ 0, }
    874};
    875
    876static SIMPLE_DEV_PM_OPS(xxxfb_pm_ops, xxxfb_suspend, xxxfb_resume);
    877
    878/* For PCI drivers */
    879static struct pci_driver xxxfb_driver = {
    880	.name =		"xxxfb",
    881	.id_table =	xxxfb_id_table,
    882	.probe =	xxxfb_probe,
    883	.remove =	xxxfb_remove,
    884	.driver.pm =	xxxfb_pm_ops, /* optional but recommended */
    885};
    886
    887MODULE_DEVICE_TABLE(pci, xxxfb_id_table);
    888
    889int __init xxxfb_init(void)
    890{
    891	/*
    892	 *  For kernel boot options (in 'video=xxxfb:<options>' format)
    893	 */
    894#ifndef MODULE
    895	char *option = NULL;
    896
    897	if (fb_get_options("xxxfb", &option))
    898		return -ENODEV;
    899	xxxfb_setup(option);
    900#endif
    901
    902	return pci_register_driver(&xxxfb_driver);
    903}
    904
    905static void __exit xxxfb_exit(void)
    906{
    907	pci_unregister_driver(&xxxfb_driver);
    908}
    909#else /* non PCI, platform drivers */
    910#include <linux/platform_device.h>
    911/* for platform devices */
    912
    913#ifdef CONFIG_PM
    914/**
    915 *	xxxfb_suspend - Optional but recommended function. Suspend the device.
    916 *	@dev: platform device
    917 *	@msg: the suspend event code.
    918 *
    919 *      See Documentation/driver-api/pm/devices.rst for more information
    920 */
    921static int xxxfb_suspend(struct platform_device *dev, pm_message_t msg)
    922{
    923	struct fb_info *info = platform_get_drvdata(dev);
    924	struct xxxfb_par *par = info->par;
    925
    926	/* suspend here */
    927	return 0;
    928}
    929
    930/**
    931 *	xxxfb_resume - Optional but recommended function. Resume the device.
    932 *	@dev: platform device
    933 *
    934 *      See Documentation/driver-api/pm/devices.rst for more information
    935 */
    936static int xxxfb_resume(struct platform_dev *dev)
    937{
    938	struct fb_info *info = platform_get_drvdata(dev);
    939	struct xxxfb_par *par = info->par;
    940
    941	/* resume here */
    942	return 0;
    943}
    944#else
    945#define xxxfb_suspend NULL
    946#define xxxfb_resume NULL
    947#endif /* CONFIG_PM */
    948
    949static struct platform_device_driver xxxfb_driver = {
    950	.probe = xxxfb_probe,
    951	.remove = xxxfb_remove,
    952	.suspend = xxxfb_suspend, /* optional but recommended */
    953	.resume = xxxfb_resume,   /* optional but recommended */
    954	.driver = {
    955		.name = "xxxfb",
    956	},
    957};
    958
    959static struct platform_device *xxxfb_device;
    960
    961#ifndef MODULE
    962    /*
    963     *  Setup
    964     */
    965
    966/*
    967 * Only necessary if your driver takes special options,
    968 * otherwise we fall back on the generic fb_setup().
    969 */
    970int __init xxxfb_setup(char *options)
    971{
    972    /* Parse user specified options (`video=xxxfb:') */
    973}
    974#endif /* MODULE */
    975
    976static int __init xxxfb_init(void)
    977{
    978	int ret;
    979	/*
    980	 *  For kernel boot options (in 'video=xxxfb:<options>' format)
    981	 */
    982#ifndef MODULE
    983	char *option = NULL;
    984
    985	if (fb_get_options("xxxfb", &option))
    986		return -ENODEV;
    987	xxxfb_setup(option);
    988#endif
    989	ret = platform_driver_register(&xxxfb_driver);
    990
    991	if (!ret) {
    992		xxxfb_device = platform_device_register_simple("xxxfb", 0,
    993								NULL, 0);
    994
    995		if (IS_ERR(xxxfb_device)) {
    996			platform_driver_unregister(&xxxfb_driver);
    997			ret = PTR_ERR(xxxfb_device);
    998		}
    999	}
   1000
   1001	return ret;
   1002}
   1003
   1004static void __exit xxxfb_exit(void)
   1005{
   1006	platform_device_unregister(xxxfb_device);
   1007	platform_driver_unregister(&xxxfb_driver);
   1008}
   1009#endif /* CONFIG_PCI */
   1010
   1011/* ------------------------------------------------------------------------- */
   1012
   1013
   1014    /*
   1015     *  Modularization
   1016     */
   1017
   1018module_init(xxxfb_init);
   1019module_exit(xxxfb_exit);
   1020
   1021MODULE_LICENSE("GPL");