Subject: Re: cg4 problems revisited...
To: None <sellis@rohan.sdsu.edu>
From: Brad Spencer <brad@anduin.eldar.org>
List: port-sun3
Date: 07/11/1996 18:31:14
[snip]

>> I suspect that this is the same thing I saw on my 4/110 with a cgfour.
>> 
>> Basically, the driver get the wrong plane mapped for the X server.
>> The X server thinks it has an 8 bit color plane, when, in fact, the 2
>> bit mono place is mapped.
>
>That explanation seems to make sense...corresponds to the vertical
>'stripes'
>I'm seeing which end up about every 4th pixel or so.
>
>Did you determine a fix for the problem?  I'm dinking around with
>cg4mmap(),
>trying to twiddle with what offset is returned, but not having any success.
>I also tried using the BT_INIT() and BT_BLANK() functions from the Sparc
>port, w/o any noticable change...I'm running out of places to look. ;-)
>
>    Scott
>
>
>-- 
>   //////////////////////////////////////////////////////////////////////
>  //  Scott Ellis   //   sellis@gi.com   //   sellis@rohan.sdsu.edu   //
> //////////////////////////////////////////////////////////////////////
>// WARNING: This signature warps  time and space in its vicinity    //

Basically, I redid the mmap function in the driver.  I sorta stumbled
on the change by mistake.

Here is the config line I use:

cgfour0 at obio0 addr 0x0b300000 level 4        # P4 4/100

I have not had a lot of time lately to fiddle with my 4/110, but the
last time I thunked on it, the following worked [around the 1.2
version of cgfour.c].  The information was derrived from staring at
the cgfour driver in OpenBSD and by some guesses [I don't know if
there ever was a cgfour on the Sun 4 that wasn't on a P4 bus.  That is
what the 0x300000 is all about in the return()].

--------------------------
#define CG4REG_CMAP     0x200000 
#define CG4REG_OVERLAY  0x400000
#define CG4REG_ENABLE   0x600000
#define CG4REG_COLOUR   0x800000
#define CG4REG_END      0xa00000
int
cgfourmmap(dev, off, prot)
        dev_t dev;
        int off, prot;
{       
        register struct cgfour_softc *sc = cgfourcd.cd_devs[minor(dev)];
        int poff;

#define START_ENABLE    (128*1024)
#define START_COLOUR    (128*1024 + 128*1024)
#define COLOUR_SIZE     (sc->sc_fb.fb_type.fb_width * sc->sc_fb.fb_type.fb_heigh
t)
#define END_COLOUR      (START_COLOUR + COLOUR_SIZE)
#define NOOVERLAY       (0x04000000)
        
        if (off & PGOFSET)
                panic("cgfourmap");
        
        if ((u_int)off >= NOOVERLAY)
          {
            off = off - NOOVERLAY;

            /*   
             * X11 maps a huge chunk of the frame buffer; far more than
             * there really is. We compensate by double-mapping the
             * first page for as many other pages as it wants
             */
            while (off >= COLOUR_SIZE)
              off = 0;
            poff = off + (CG4REG_COLOUR - CG4REG_OVERLAY);
          }
        else
          if ((u_int)off < START_ENABLE)        /* in overlay plane */
            poff = off;
          else
            if ((u_int)off < START_COLOUR)      /* in enable plane */
              poff = off + (CG4REG_ENABLE - CG4REG_OVERLAY) - START_ENABLE;
            else
              if ((u_int)off < (CG4REG_END - CG4REG_OVERLAY))   /* in colour pla
ne */
                poff = off + (CG4REG_COLOUR - CG4REG_OVERLAY) - START_COLOUR;
              else
                return (-1);
        return (REG2PHYS(&sc->sc_phys, poff + CG4REG_OVERLAY - 0x300000, sc->sc_
bustype) | PMAP_NC);
}
--------------------------





Brad Spencer - brad@anduin.eldar.org   http://anduin.eldar.org