lkml.org 
[lkml]   [2003]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH] visws: framebuffer driver update (10/13)
    From
    Hi.

    This patch contains SGI visws framebuffer update. Patch makes it
    compile again and brings flatpanel monitor support back.

    Please consider applying.

    Best regards.

    --
    Andrey Panin | Embedded systems software developer
    pazke@orbita1.ru | PGP key: wwwkeys.pgp.net
    diff -urN -X /usr/share/dontdiff linux-2.5.60.vanilla/drivers/video/Kconfig linux-2.5.60/drivers/video/Kconfig
    --- linux-2.5.60.vanilla/drivers/video/Kconfig Thu Feb 13 20:29:09 2003
    +++ linux-2.5.60/drivers/video/Kconfig Thu Feb 13 20:42:02 2003
    @@ -363,7 +363,7 @@

    config FB_SGIVW
    tristate "SGI Visual Workstation framebuffer support"
    - depends on FB && VISWS
    + depends on FB && X86_VISWS
    help
    SGI Visual Workstation support for framebuffer graphics.

    diff -urN -X /usr/share/dontdiff linux-2.5.60.vanilla/drivers/video/sgivwfb.c linux-2.5.60/drivers/video/sgivwfb.c
    --- linux-2.5.60.vanilla/drivers/video/sgivwfb.c Thu Feb 13 20:29:10 2003
    +++ linux-2.5.60/drivers/video/sgivwfb.c Thu Feb 13 20:42:02 2003
    @@ -13,14 +13,7 @@
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/errno.h>
    -#include <linux/string.h>
    -#include <linux/mm.h>
    -#include <linux/tty.h>
    -#include <linux/slab.h>
    -#include <linux/vmalloc.h>
    #include <linux/delay.h>
    -#include <linux/interrupt.h>
    -#include <asm/uaccess.h>
    #include <linux/fb.h>
    #include <linux/init.h>
    #include <linux/ioport.h>
    @@ -29,7 +22,7 @@

    #define INCLUDE_TIMING_TABLE_DATA
    #define DBE_REG_BASE default_par.regs
    -#include <asm/sgi-vwdbe.h>
    +#include <video/sgivw.h>

    struct sgivw_par {
    struct asregs *regs;
    @@ -37,6 +30,8 @@
    u_long timing_num;
    };

    +#define FLATPANEL_SGI_1600SW 5
    +
    /*
    * RAM we reserve for the frame buffer. This defines the maximum screen
    * size
    @@ -54,26 +49,29 @@
    static int ypan = 0;
    static int ywrap = 0;

    +static int flatpanel_id = -1;
    +
    static struct fb_fix_screeninfo sgivwfb_fix __initdata = {
    .id = "SGI Vis WS FB",
    .type = FB_TYPE_PACKED_PIXELS,
    .visual = FB_VISUAL_PSEUDOCOLOR,
    .mmio_start = DBE_REG_PHYS,
    .mmio_len = DBE_REG_SIZE,
    - .accel = FB_ACCEL_NONE
    + .accel = FB_ACCEL_NONE,
    + .line_length = 640,
    };

    static struct fb_var_screeninfo sgivwfb_var __initdata = {
    - /* 640x480, 8 bpp */
    - .xres = 640,
    + /* 640x480, 8 bpp */
    + .xres = 640,
    .yres = 480,
    .xres_virtual = 640,
    .yres_virtual = 480,
    .bits_per_pixel = 8,
    - .red = {0, 8, 0},
    - .green = {0, 8, 0},
    - .blue = {0, 8, 0},
    - .height = -1,
    + .red = { 0, 8, 0 },
    + .green = { 0, 8, 0 },
    + .blue = { 0, 8, 0 },
    + .height = -1,
    .width = -1,
    .pixclock = 20000,
    .left_margin = 64,
    @@ -82,14 +80,35 @@
    .lower_margin = 32,
    .hsync_len = 64,
    .vsync_len = 2,
    - .vmode = FB_VMODE_NONINTERLACED
    + .vmode = FB_VMODE_NONINTERLACED
    +};
    +
    +static struct fb_var_screeninfo sgivwfb_var1600sw __initdata = {
    + /* 1600x1024, 8 bpp */
    + .xres = 1600,
    + .yres = 1024,
    + .xres_virtual = 1600,
    + .yres_virtual = 1024,
    + .bits_per_pixel = 8,
    + .red = { 0, 8, 0 },
    + .green = { 0, 8, 0 },
    + .blue = { 0, 8, 0 },
    + .height = -1,
    + .width = -1,
    + .pixclock = 9353,
    + .left_margin = 20,
    + .right_margin = 30,
    + .upper_margin = 37,
    + .lower_margin = 3,
    + .hsync_len = 20,
    + .vsync_len = 3,
    + .vmode = FB_VMODE_NONINTERLACED
    };

    /*
    * Interface used by the world
    */
    int sgivwfb_init(void);
    -int sgivwfb_setup(char *);

    static int sgivwfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info);
    static int sgivwfb_set_par(struct fb_info *info);
    @@ -114,34 +133,24 @@
    /*
    * Internal routines
    */
    -static u_long get_line_length(int xres_virtual, int bpp);
    -static unsigned long bytes_per_pixel(int bpp);
    -
    -static unsigned long get_line_length(int xres_virtual, int bpp)
    -{
    - return (xres_virtual * bytes_per_pixel(bpp));
    -}
    -
    static unsigned long bytes_per_pixel(int bpp)
    {
    - unsigned long length;
    -
    switch (bpp) {
    - case 8:
    - length = 1;
    - break;
    - case 16:
    - length = 2;
    - break;
    - case 32:
    - length = 4;
    - break;
    - default:
    - printk(KERN_INFO "sgivwfb: unsupported bpp=%d\n", bpp);
    - length = 0;
    - break;
    + case 8:
    + return 1;
    + case 16:
    + return 2;
    + case 32:
    + return 4;
    + default:
    + printk(KERN_INFO "sgivwfb: unsupported bpp %d\n", bpp);
    + return 0;
    }
    - return (length);
    +}
    +
    +static unsigned long get_line_length(int xres_virtual, int bpp)
    +{
    + return (xres_virtual * bytes_per_pixel(bpp));
    }

    /*
    @@ -280,8 +289,7 @@
    test_mode--;
    min_mode = test_mode;
    timing = &dbeVTimings[min_mode];
    - printk(KERN_INFO "sgivwfb: granted dot-clock=%d KHz\n",
    - timing->cfreq);
    + printk(KERN_INFO "sgivwfb: granted dot-clock=%d KHz\n", timing->cfreq);

    /* Adjust virtual resolution, if necessary */
    if (var->xres > var->xres_virtual || (!ywrap && !ypan))
    @@ -292,11 +300,12 @@
    /*
    * Memory limit
    */
    - line_length =
    - get_line_length(var->xres_virtual, var->bits_per_pixel);
    + line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
    if (line_length * var->yres_virtual > sgivwfb_mem_size)
    return -ENOMEM; /* Virtual resolution to high */

    + info->fix.line_length = line_length;
    +
    switch (var->bits_per_pixel) {
    case 8:
    var->red.offset = 0;
    @@ -355,6 +364,48 @@
    }

    /*
    + * Setup flatpanel related registers.
    + */
    +static void sgivwfb_setup_flatpanel(struct dbe_timing_info *currentTiming)
    +{
    + int fp_wid, fp_hgt, fp_vbs, fp_vbe;
    + u32 outputVal = 0;
    +
    + SET_DBE_FIELD(VT_FLAGS, HDRV_INVERT, outputVal,
    + (currentTiming->flags & FB_SYNC_HOR_HIGH_ACT) ? 0 : 1);
    + SET_DBE_FIELD(VT_FLAGS, VDRV_INVERT, outputVal,
    + (currentTiming->flags & FB_SYNC_VERT_HIGH_ACT) ? 0 : 1);
    + DBE_SETREG(vt_flags, outputVal);
    +
    + /* Turn on the flat panel */
    + switch (flatpanel_id) {
    + case FLATPANEL_SGI_1600SW:
    + fp_wid = 1600;
    + fp_hgt = 1024;
    + fp_vbs = 0;
    + fp_vbe = 1600;
    + currentTiming->pll_m = 4;
    + currentTiming->pll_n = 1;
    + currentTiming->pll_p = 0;
    + break;
    + default:
    + fp_wid = fp_hgt = fp_vbs = fp_vbe = 0xfff;
    + }
    +
    + outputVal = 0;
    + SET_DBE_FIELD(FP_DE, FP_DE_ON, outputVal, fp_vbs);
    + SET_DBE_FIELD(FP_DE, FP_DE_OFF, outputVal, fp_vbe);
    + DBE_SETREG(fp_de, outputVal);
    + outputVal = 0;
    + SET_DBE_FIELD(FP_HDRV, FP_HDRV_OFF, outputVal, fp_wid);
    + DBE_SETREG(fp_hdrv, outputVal);
    + outputVal = 0;
    + SET_DBE_FIELD(FP_VDRV, FP_VDRV_ON, outputVal, 1);
    + SET_DBE_FIELD(FP_VDRV, FP_VDRV_OFF, outputVal, fp_hgt + 1);
    + DBE_SETREG(fp_vdrv, outputVal);
    +}
    +
    +/*
    * Set the hardware according to 'par'.
    */
    static int sgivwfb_set_par(struct fb_info *info)
    @@ -364,7 +415,7 @@
    u32 readVal, outputVal;
    int wholeTilesX, maxPixelsPerTileX;
    int frmWrite1, frmWrite2, frmWrite3b;
    - struct dbe_timing_info_t *currentTiming; /* Current Video Timing */
    + struct dbe_timing_info *currentTiming; /* Current Video Timing */
    int xpmax, ypmax; // Monitor resolution
    int bytesPerPixel; // Bytes per pixel

    @@ -514,6 +565,9 @@
    currentTiming->hblank_end - 3);
    DBE_SETREG(vt_hcmap, outputVal);

    + if (flatpanel_id != -1)
    + sgivwfb_setup_flatpanel(currentTiming);
    +
    outputVal = 0;
    temp = currentTiming->vblank_start - currentTiming->vblank_end - 1;
    if (temp > 0)
    @@ -680,14 +734,16 @@
    {
    char *this_opt;

    - fb_info.fontname[0] = '\0';
    -
    if (!options || !*options)
    return 0;

    while ((this_opt = strsep(&options, ",")) != NULL) {
    - if (!strncmp(this_opt, "font:", 5))
    - strcpy(fb_info.fontname, this_opt + 5);
    + if (!strncmp(this_opt, "monitor:", 8)) {
    + if (!strncmp(this_opt + 8, "crt", 3))
    + flatpanel_id = -1;
    + else if (!strncmp(this_opt + 8, "1600sw", 6))
    + flatpanel_id = FLATPANEL_SGI_1600SW;
    + }
    }
    return 0;
    }
    @@ -697,12 +753,11 @@
    */
    int __init sgivwfb_init(void)
    {
    - printk(KERN_INFO "sgivwfb: framebuffer at 0x%lx, size %ldk\n",
    - sgivwfb_mem_phys, sgivwfb_mem_size / 1024);
    + char *monitor;

    if (!request_mem_region(DBE_REG_PHYS, DBE_REG_SIZE, "sgivwfb")) {
    printk(KERN_ERR "sgivwfb: couldn't reserve mmio region\n");
    - goto fail_request_mem_region;
    + return -EBUSY;
    }
    default_par.regs = (struct asregs *) ioremap_nocache(DBE_REG_PHYS, DBE_REG_SIZE);
    if (!default_par.regs) {
    @@ -710,10 +765,7 @@
    goto fail_ioremap_regs;
    }

    -#ifdef CONFIG_MTRR
    - mtrr_add((unsigned long) sgivwfb_mem_phys, sgivwfb_mem_size,
    - MTRR_TYPE_WRCOMB, 1);
    -#endif
    + mtrr_add(sgivwfb_mem_phys, sgivwfb_mem_size, MTRR_TYPE_WRCOMB, 1);

    sgivwfb_fix.smem_start = sgivwfb_mem_phys;
    sgivwfb_fix.smem_len = sgivwfb_mem_size;
    @@ -722,13 +774,24 @@

    fb_info.node = NODEV;
    fb_info.fix = sgivwfb_fix;
    - fb_info.var = sgivwfb_var;
    +
    + switch (flatpanel_id) {
    + case FLATPANEL_SGI_1600SW:
    + fb_info.var = sgivwfb_var1600sw;
    + monitor = "SGI 1600SW flatpanel";
    + break;
    + default:
    + fb_info.var = sgivwfb_var;
    + monitor = "CRT";
    + }
    +
    + printk(KERN_INFO "sgivwfb: %s monitor selected\n", monitor);
    +
    fb_info.fbops = &sgivwfb_ops;
    fb_info.pseudo_palette = pseudo_palette;
    fb_info.par = &default_par;
    fb_info.flags = FBINFO_FLAG_DEFAULT;

    - fb_info.screen_base =
    fb_info.screen_base = ioremap_nocache((unsigned long) sgivwfb_mem_phys, sgivwfb_mem_size);
    if (!fb_info.screen_base) {
    printk(KERN_ERR "sgivwfb: couldn't ioremap screen_base\n");
    @@ -742,14 +805,16 @@
    goto fail_register_framebuffer;
    }

    - printk(KERN_INFO "fb%d: SGI BDE frame buffer device, using %ldK of video memory\n", minor(fb_info.node, sgivwfb_mem_size >> 10);
    + printk(KERN_INFO "fb%d: SGI DBE frame buffer device, using %ldK of video memory at %#lx\n",
    + minor(fb_info.node), sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
    return 0;

    - fail_register_framebuffer:
    +fail_register_framebuffer:
    iounmap((char *) fb_info.screen_base);
    - fail_ioremap_fbmem:
    +fail_ioremap_fbmem:
    iounmap(default_par.regs);
    - fail_ioremap_regs:
    +fail_ioremap_regs:
    + release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
    return -ENXIO;
    }

    @@ -767,6 +832,7 @@
    dbe_TurnOffDma();
    iounmap(regs);
    iounmap(&fb_info.screen_base);
    + release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
    }

    #endif /* MODULE */
    diff -urN -X /usr/share/dontdiff linux-2.5.60.vanilla/include/video/sgivw.h linux-2.5.60/include/video/sgivw.h
    --- linux-2.5.60.vanilla/include/video/sgivw.h Thu Feb 13 20:31:34 2003
    +++ linux-2.5.60/include/video/sgivw.h Thu Feb 13 20:42:02 2003
    @@ -1,5 +1,5 @@
    /*
    - * linux/drivers/video/sgivwfb.h -- SGI DBE frame buffer device header
    + * linux/drivers/video/sgivw.h -- SGI DBE frame buffer device header
    *
    * Copyright (C) 1999 Silicon Graphics, Inc.
    * Jeffrey Newquist, newquist@engr.sgi.som
    @@ -12,10 +12,10 @@
    #ifndef __SGIVWFB_H__
    #define __SGIVWFB_H__

    -#define DBE_GETREG(reg, dest) ((dest) = DBE_REG_BASE->##reg)
    -#define DBE_SETREG(reg, src) DBE_REG_BASE->##reg = (src)
    -#define DBE_IGETREG(reg, idx, dest) ((dest) = DBE_REG_BASE->##reg##[idx])
    -#define DBE_ISETREG(reg, idx, src) (DBE_REG_BASE->##reg##[idx] = (src))
    +#define DBE_GETREG(reg, dest) ((dest) = DBE_REG_BASE->reg)
    +#define DBE_SETREG(reg, src) DBE_REG_BASE->reg = (src)
    +#define DBE_IGETREG(reg, idx, dest) ((dest) = DBE_REG_BASE->reg[idx])
    +#define DBE_ISETREG(reg, idx, src) (DBE_REG_BASE->reg[idx] = (src))

    #define MASK(msb, lsb) ( (((u32)1<<((msb)-(lsb)+1))-1) << (lsb) )
    #define GET(v, msb, lsb) ( ((u32)(v) & MASK(msb,lsb)) >> (lsb) )
    @@ -29,7 +29,7 @@
    #define DBE_REG_PHYS 0xd0000000
    #define DBE_REG_SIZE 0x01000000

    -typedef struct {
    +struct asregs {
    volatile u32 ctrlstat; /* 0x000000 general control */
    volatile u32 dotclock; /* 0x000004 dot clock PLL control */
    volatile u32 i2c; /* 0x000008 crt I2C control */
    @@ -121,7 +121,7 @@
    volatile u32 vc_6; /* 0x080018 video capture crtl 3 */
    volatile u32 vc_7; /* 0x08001c video capture crtl 3 */
    volatile u32 vc_8; /* 0x08000c video capture crtl 3 */
    -} asregs;
    +};

    /* Bit mask information */

    @@ -144,6 +144,21 @@
    #define DBE_VT_XY_VT_FREEZE_MSB 31
    #define DBE_VT_XY_VT_FREEZE_LSB 31

    +#define DBE_FP_VDRV_FP_VDRV_ON_MSB 23
    +#define DBE_FP_VDRV_FP_VDRV_ON_LSB 12
    +#define DBE_FP_VDRV_FP_VDRV_OFF_MSB 11
    +#define DBE_FP_VDRV_FP_VDRV_OFF_LSB 0
    +
    +#define DBE_FP_HDRV_FP_HDRV_ON_MSB 23
    +#define DBE_FP_HDRV_FP_HDRV_ON_LSB 12
    +#define DBE_FP_HDRV_FP_HDRV_OFF_MSB 11
    +#define DBE_FP_HDRV_FP_HDRV_OFF_LSB 0
    +
    +#define DBE_FP_DE_FP_DE_ON_MSB 23
    +#define DBE_FP_DE_FP_DE_ON_LSB 12
    +#define DBE_FP_DE_FP_DE_OFF_MSB 11
    +#define DBE_FP_DE_FP_DE_OFF_LSB 0
    +
    #define DBE_VT_VSYNC_VT_VSYNC_ON_MSB 23
    #define DBE_VT_VSYNC_VT_VSYNC_ON_LSB 12
    #define DBE_VT_VSYNC_VT_VSYNC_OFF_MSB 11
    @@ -164,6 +179,11 @@
    #define DBE_VT_HBLANK_VT_HBLANK_OFF_MSB 11
    #define DBE_VT_HBLANK_VT_HBLANK_OFF_LSB 0

    +#define DBE_VT_FLAGS_VDRV_INVERT_MSB 0
    +#define DBE_VT_FLAGS_VDRV_INVERT_LSB 0
    +#define DBE_VT_FLAGS_HDRV_INVERT_MSB 2
    +#define DBE_VT_FLAGS_HDRV_INVERT_LSB 2
    +
    #define DBE_VT_VCMAP_VT_VCMAP_ON_MSB 23
    #define DBE_VT_VCMAP_VT_VCMAP_ON_LSB 12
    #define DBE_VT_VCMAP_VT_VCMAP_OFF_MSB 11
    @@ -264,6 +284,8 @@

    #define DBE_CRS_MAGIC 54

    +#define DBE_CLOCK_REF_KHZ 27000
    +
    /* Config Register (DBE Only) Definitions */

    #define DBE_CONFIG_VDAC_ENABLE 0x00000001
    @@ -326,7 +348,7 @@
    * Crime Video Timing Data Structure
    */

    -typedef struct dbe_timing_info
    +struct dbe_timing_info
    {
    dbe_timing_t type;
    int flags;
    @@ -347,7 +369,7 @@
    short pll_m; /* PLL M parameter */
    short pll_n; /* PLL P parameter */
    short pll_p; /* PLL N parameter */
    -} dbe_timing_info_t;
    +};

    /* Defines for dbe_vof_info_t flags */
    \
     
     \ /
      Last update: 2005-03-22 13:33    [W:0.044 / U:1.756 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site