linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Winischhofer <thomas@winischhofer.net>
To: bert hubert <ahu@ds9a.nl>
Cc: jsimmons@transvirtual.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] botched sisfb fixes for 2.5.38
Date: Mon, 23 Sep 2002 01:02:30 +0200	[thread overview]
Message-ID: <3D8E4C06.17542139@winischhofer.net> (raw)
In-Reply-To: 20020922212234.GA24640@outpost.ds9a.nl


Bert,

thanks, but: This is not a proper fix. The disp-structure will be
removed soon, and so will the high level console acceleration stuff. It
might be alright for 2.5.38, but I will not include this in my current
driver. (And moving sisfb.h away from the kernel headers will break user
land applications)

Thomas

bert hubert wrote:
> 
> Thomas, James, list,
> 
> The FB API is still not entirely stable according to Thomas and James but I
> really want to get my laptop working with 2.5 and X. 2.5.38 has new sisfb
> code that actually works but it is not quite ready for the current FB API,
> and does not compile.
> 
> This patch is the best I can do right now in fixing that. It compiles, links
> and boots and shows a penguin logo, but it does not run X.
> 
> When starting X it says:
> sisfb: Change mode to 1024x768x16-60Hz
> sisfb: CRT2 type is LCD
> sisfb: (LCDInfo = 0xe9 LCDResInfo = 0x2 LCDTypeInfo = 0xe)
> 
> X says:
> 
> mmap fbmem: Invalid argument
> 
> The diff moves a file around, which is why it is pretty large. The meat is
> in the first file.
> 
> diff -uBbrN linux-2.5.38/drivers/video/sis/sis_main.c linux-ahu/drivers/video/sis/sis_main.c
> --- linux-2.5.38/drivers/video/sis/sis_main.c   Sun Sep 22 23:02:10 2002
> +++ linux-ahu/drivers/video/sis/sis_main.c      Sun Sep 22 22:49:28 2002
> @@ -646,11 +646,19 @@
>         return 0;
>  }
> 
> +static struct fb_fix_screeninfo sisfb_fix __initdata = {
> +       .id     = "SIS VGA",
> +       .type   = FB_TYPE_PACKED_PIXELS,
> +       .accel  = FB_ACCEL_SIS_GLAMOUR,
> +};
> +
> +
>  static void sisfb_set_disp(int con, struct fb_var_screeninfo *var)
>  {
>         struct fb_fix_screeninfo fix;
>         struct display *display;
>         struct display_switch *sw;
> +       static spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
>         long flags;
> 
>         if (con >= 0)
> @@ -663,18 +671,20 @@
>  #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,23)
>         display->screen_base = ivideo.video_vbase;
>  #endif
> -       display->visual = fix.visual;
> -       display->type = fix.type;
> -       display->type_aux = fix.type_aux;
> -       display->ypanstep = fix.ypanstep;
> -       display->ywrapstep = fix.ywrapstep;
> -       display->line_length = fix.line_length;
> +       sisfb_fix.visual = fix.visual;
> +       sisfb_fix.type = fix.type;
> +       sisfb_fix.type_aux = fix.type_aux;
> +       sisfb_fix.ypanstep = fix.ypanstep;
> +       sisfb_fix.ywrapstep = fix.ywrapstep;
> +       sisfb_fix.line_length = fix.line_length;
>         display->next_line = fix.line_length;
>         display->can_soft_blank = 0;
>         display->inverse = sisfb_inverse;
>         display->var = *var;
> 
> -       save_flags(flags);
> +       fb_info.fix=sisfb_fix;
> +
> +       spin_lock_irqsave(&driver_lock, flags);
>         switch (ivideo.video_bpp) {
>  #ifdef FBCON_HAS_CFB8
>            case 8:
> @@ -706,7 +716,7 @@
>         }
>         memcpy(&sisfb_sw, sw, sizeof(*sw));
>         display->dispsw = &sisfb_sw;
> -       restore_flags(flags);
> +       spin_unlock_irqrestore(&driver_lock, flags);
> 
>         display->scrollmode = SCROLL_YREDRAW;
>         sisfb_sw.bmove = fbcon_redraw_bmove;
> @@ -2560,8 +2570,8 @@
> 
>  static struct fb_ops sisfb_ops = {
>         .owner          = THIS_MODULE,
> -       .fb_get_fix     = sisfb_get_fix,
> -       .fb_get_var     = sisfb_get_var,
> +       //      .fb_get_fix     = sisfb_get_fix,
> +       //      .fb_get_var     = sisfb_get_var,
>         .fb_set_var     = sisfb_set_var,
>         .fb_get_cmap    = sisfb_get_cmap,
>         .fb_set_cmap    = sisfb_set_cmap,
> @@ -2627,7 +2637,7 @@
>         return 1;
>  }
> 
> -static void sisfb_blank(int blank, struct fb_info *info)
> +static int sisfb_blank(int blank, struct fb_info *info)
>  {
>         u8 reg;
> 
> @@ -2641,6 +2651,7 @@
> 
>         vgawb(CRTC_ADR, 0x17);
>         vgawb(CRTC_DATA, reg);
> +       return 0;
>  }
> 
>  int sisfb_setup(char *options)
> 
> diff -uBbrN linux-2.5.38/drivers/video/sis/sis_main.h linux-ahu/drivers/video/sis/sis_main.h
> --- linux-2.5.38/drivers/video/sis/sis_main.h   Sun Sep 22 23:01:26 2002
> +++ linux-ahu/drivers/video/sis/sis_main.h      Sun Sep 22 22:42:26 2002
> @@ -717,7 +716,7 @@
>  int sisfb_init(void);
>  static int sisfb_update_var(int con, struct fb_info *info);
>  static int sisfb_switch(int con, struct fb_info *info);
> -static void sisfb_blank(int blank, struct fb_info *info);
> +static int sisfb_blank(int blank, struct fb_info *info);
> 
>  /* hardware access routines */
>  void sisfb_set_reg1(u16 port, u16 index, u16 data);
> 
> diff -uBbrN linux-2.5.38/drivers/video/sis/sisfb.h linux-ahu/drivers/video/sis/sisfb.h
> --- linux-2.5.38/drivers/video/sis/sisfb.h      Sun Sep 22 23:01:26 2002
> +++ linux-ahu/drivers/video/sis/sisfb.h Thu Jan  1 01:00:00 1970
> @@ -1,153 +0,0 @@
> -#ifndef _LINUX_SISFB
> -#define _LINUX_SISFB
> -
> -#include <asm/ioctl.h>
> -#include <asm/types.h>
> -
> -#define DISPTYPE_CRT1       0x00000008L
> -#define DISPTYPE_CRT2       0x00000004L
> -#define DISPTYPE_LCD        0x00000002L
> -#define DISPTYPE_TV         0x00000001L
> -#define DISPTYPE_DISP1      DISPTYPE_CRT1
> -#define DISPTYPE_DISP2      (DISPTYPE_CRT2 | DISPTYPE_LCD | DISPTYPE_TV)
> -#define DISPMODE_SINGLE            0x00000020L
> -#define DISPMODE_MIRROR            0x00000010L
> -#define DISPMODE_DUALVIEW   0x00000040L
> -
> -#define HASVB_NONE             0x00
> -#define HASVB_301              0x01
> -#define HASVB_LVDS             0x02
> -#define HASVB_TRUMPION         0x04
> -#define HASVB_LVDS_CHRONTEL    0x10
> -#define HASVB_302              0x20
> -#define HASVB_303              0x40
> -#define HASVB_CHRONTEL         0x80
> -
> -/* TW: *Never* change the order of the following enum */
> -typedef enum _SIS_CHIP_TYPE {
> -       SIS_VGALegacy = 0,
> -       SIS_300,
> -       SIS_630,
> -       SIS_540,
> -       SIS_730,
> -       SIS_315H,
> -       SIS_315,
> -       SIS_550,
> -       SIS_315PRO,
> -       SIS_640,
> -       SIS_740,
> -       SIS_650,
> -       SIS_330,
> -       MAX_SIS_CHIP
> -} SIS_CHIP_TYPE;
> -
> -typedef enum _TVTYPE {
> -       TVMODE_NTSC = 0,
> -       TVMODE_PAL,
> -       TVMODE_HIVISION,
> -       TVMODE_TOTAL
> -} SIS_TV_TYPE;
> -
> -typedef enum _TVPLUGTYPE {
> -       TVPLUG_Legacy = 0,
> -       TVPLUG_COMPOSITE,
> -       TVPLUG_SVIDEO,
> -       TVPLUG_SCART,
> -       TVPLUG_TOTAL
> -} SIS_TV_PLUG;
> -
> -struct sis_memreq {
> -       unsigned long offset;
> -       unsigned long size;
> -};
> -
> -struct mode_info {
> -       int    bpp;
> -       int    xres;
> -       int    yres;
> -       int    v_xres;
> -       int    v_yres;
> -       int    org_x;
> -       int    org_y;
> -       unsigned int  vrate;
> -};
> -
> -struct ap_data {
> -       struct mode_info minfo;
> -       unsigned long iobase;
> -       unsigned int  mem_size;
> -       unsigned long disp_state;
> -       SIS_CHIP_TYPE chip;
> -       unsigned char hasVB;
> -       SIS_TV_TYPE TV_type;
> -       SIS_TV_PLUG TV_plug;
> -       unsigned long version;
> -       char reserved[256];
> -};
> -
> -struct video_info {
> -       int    chip_id;
> -       unsigned int  video_size;
> -       unsigned long video_base;
> -       char  *video_vbase;
> -       unsigned long mmio_base;
> -       char  *mmio_vbase;
> -       unsigned long vga_base;
> -       unsigned long mtrr;
> -       unsigned long heapstart;
> -
> -       int    video_bpp;
> -       int    video_width;
> -       int    video_height;
> -       int    video_vwidth;
> -       int    video_vheight;
> -       int    org_x;
> -       int    org_y;
> -       unsigned int refresh_rate;
> -
> -       unsigned long disp_state;
> -       unsigned char hasVB;
> -       unsigned char TV_type;
> -       unsigned char TV_plug;
> -
> -       SIS_CHIP_TYPE chip;
> -       unsigned char revision_id;
> -
> -       char reserved[256];
> -};
> -
> -
> -/* TW: Addtional IOCTL for communication sisfb <> X driver                 */
> -/*     If changing this, vgatypes.h must also be changed (for X driver)    */
> -
> -/* TW: ioctl for identifying and giving some info (esp. memory heap start) */
> -#define SISFB_GET_INFO   _IOR('n',0xF8,sizeof(__u32))
> -
> -/* TW: Structure argument for SISFB_GET_INFO ioctl  */
> -typedef struct _SISFB_INFO sisfb_info, *psisfb_info;
> -
> -struct _SISFB_INFO {
> -       unsigned long sisfb_id;         /* for identifying sisfb */
> -#ifndef SISFB_ID
> -#define SISFB_ID         0x53495346    /* Identify myself with 'SISF' */
> -#endif
> -       int    chip_id;                 /* PCI ID of detected chip */
> -       int    memory;                  /* video memory in KB which sisfb manages */
> -       int    heapstart;               /* heap start (= sisfb "mem" argument) in KB */
> -       unsigned char fbvidmode;        /* current sisfb mode */
> -
> -       unsigned char sisfb_version;
> -       unsigned char sisfb_revision;
> -       unsigned char sisfb_patchlevel;
> -
> -       char reserved[253];             /* for future use */
> -};
> -
> -#ifdef __KERNEL__
> -extern struct video_info ivideo;
> -
> -extern void sis_malloc(struct sis_memreq *req);
> -extern void sis_free(unsigned long base);
> -extern void sis_dispinfo(struct ap_data *rec);
> -#endif
> -#endif
> 
> diff -uBbrN linux-2.5.38/include/linux/sisfb.h linux-ahu/include/linux/sisfb.h
> --- linux-2.5.38/include/linux/sisfb.h  Wed Jul 17 01:49:27 2002
> +++ linux-ahu/include/linux/sisfb.h     Fri Sep 20 18:04:55 2002
> @@ -1,6 +1,9 @@
>  #ifndef _LINUX_SISFB
>  #define _LINUX_SISFB
> 
> +#include <asm/ioctl.h>
> +#include <asm/types.h>
> +
>  #define DISPTYPE_CRT1       0x00000008L
>  #define DISPTYPE_CRT2       0x00000004L
>  #define DISPTYPE_LCD        0x00000002L
> @@ -20,6 +23,7 @@
>  #define HASVB_303              0x40
>  #define HASVB_CHRONTEL         0x80
> 
> +/* TW: *Never* change the order of the following enum */
>  typedef enum _SIS_CHIP_TYPE {
>         SIS_VGALegacy = 0,
>         SIS_300,
> @@ -32,6 +36,7 @@
>         SIS_315PRO,
>         SIS_640,
>         SIS_740,
> +       SIS_650,
>         SIS_330,
>         MAX_SIS_CHIP
>  } SIS_CHIP_TYPE;
> @@ -88,6 +93,8 @@
>         unsigned long mmio_base;
>         char  *mmio_vbase;
>         unsigned long vga_base;
> +       unsigned long mtrr;
> +       unsigned long heapstart;
> 
>         int    video_bpp;
>         int    video_width;
> @@ -107,6 +114,33 @@
>         unsigned char revision_id;
> 
>         char reserved[256];
> +};
> +
> +
> +/* TW: Addtional IOCTL for communication sisfb <> X driver                 */
> +/*     If changing this, vgatypes.h must also be changed (for X driver)    */
> +
> +/* TW: ioctl for identifying and giving some info (esp. memory heap start) */
> +#define SISFB_GET_INFO   _IOR('n',0xF8,sizeof(__u32))
> +
> +/* TW: Structure argument for SISFB_GET_INFO ioctl  */
> +typedef struct _SISFB_INFO sisfb_info, *psisfb_info;
> +
> +struct _SISFB_INFO {
> +       unsigned long sisfb_id;         /* for identifying sisfb */
> +#ifndef SISFB_ID
> +#define SISFB_ID         0x53495346    /* Identify myself with 'SISF' */
> +#endif
> +       int    chip_id;                 /* PCI ID of detected chip */
> +       int    memory;                  /* video memory in KB which sisfb manages */
> +       int    heapstart;               /* heap start (= sisfb "mem" argument) in KB */
> +       unsigned char fbvidmode;        /* current sisfb mode */
> +
> +       unsigned char sisfb_version;
> +       unsigned char sisfb_revision;
> +       unsigned char sisfb_patchlevel;
> +
> +       char reserved[253];             /* for future use */
>  };
> 
>  #ifdef __KERNEL__
> 
> 
> --
> http://www.PowerDNS.com          Versatile DNS Software & Services
> http://www.tk                              the dot in .tk
> http://lartc.org           Linux Advanced Routing & Traffic Control HOWTO

-- 
Thomas Winischhofer
Vienna/Austria
mailto:thomas@winischhofer.net          *** http://www.winischhofer.net

      reply	other threads:[~2002-09-22 23:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-09-22 21:22 [PATCH] botched sisfb fixes for 2.5.38 bert hubert
2002-09-22 23:02 ` Thomas Winischhofer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3D8E4C06.17542139@winischhofer.net \
    --to=thomas@winischhofer.net \
    --cc=ahu@ds9a.nl \
    --cc=jsimmons@transvirtual.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).