xf86-video-intel: src/i810_reg.h src/i830_driver.c

Alan Hourihane alanh at fairlite.demon.co.uk
Thu May 29 09:23:52 PDT 2008


On Thu, 2008-05-29 at 08:58 -0700, Jesse Barnes wrote:
> On Thursday, May 29, 2008 1:44 am Alan Hourihane wrote:
> > On Wed, 2008-05-28 at 15:49 -0700, Jesse Barnes wrote:
> > > src/i810_reg.h    |    2 ++
> > >  src/i830_driver.c |   11 ++++++++++-
> > >  2 files changed, 12 insertions(+), 1 deletion(-)
> > >
> > > New commits:
> > > commit bd137a19dc29dd466eac030e040f729ed0807e3f
> > > Author: Jesse Barnes <jbarnes at hobbes.lan>
> > > Date:   Wed May 28 15:47:47 2008 -0700
> > >
> > >     Fixup DSPARB for 855 & 945
> > >
> > >     It turns out 855 has a different DSPARB layout than 915+.  And 945+
> > > have more FIFO entries, so we have to allocate things differently.  So on
> > > 855 split the FIFO evenly again between A & B planes, and do the same on
> > > 945, where we have a larger FIFO.  Fixes an issue reported by Daniel
> > > Stone with the previous default value.
> > >
> > > diff --git a/src/i810_reg.h b/src/i810_reg.h
> > > index d97780f..9da258a 100644
> > > --- a/src/i810_reg.h
> > > +++ b/src/i810_reg.h
> > > @@ -2105,6 +2105,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> > > SOFTWARE. #define DSPARB			0x70030
> > >  #define   DSPARB_CSTART_SHIFT	7
> > >  #define   DSPARB_BSTART_SHIFT	0
> > > +#define   DSPARB_BEND_SHIFT	9 /* on 855 */
> > > +#define   DSPARB_AEND_SHIFT	0
> > >  #define DSPFW1			0x70034
> > >  #define DSPFW2			0x70038
> > >  #define DSPFW3			0x7003c
> > > diff --git a/src/i830_driver.c b/src/i830_driver.c
> > > index 1b07064..1041fe3 100644
> > > --- a/src/i830_driver.c
> > > +++ b/src/i830_driver.c
> > > @@ -1963,7 +1963,16 @@ SetHWOperatingState(ScrnInfoPtr pScrn)
> > >      * we don't use plane C at all so we can allocate all but one of the
> > > 96 * FIFO RAM entries equally between planes A and B.
> > >      */
> > > -   OUTREG(DSPARB, (95 << DSPARB_CSTART_SHIFT) | (48 <<
> > > DSPARB_BSTART_SHIFT)); +   if (IS_I9XX(pI830)) {
> > > +       if (IS_I915GM(pI830) || IS_I915G(pI830))
> > > +	   OUTREG(DSPARB, (95 << DSPARB_CSTART_SHIFT) |
> > > +		  (48 << DSPARB_BSTART_SHIFT));
> > > +       else
> > > +	   OUTREG(DSPARB, (127 << DSPARB_CSTART_SHIFT) |
> > > +		  (64 << DSPARB_BSTART_SHIFT));
> > > +   } else {
> > > +       OUTREG(DSPARB, 254 << DSPARB_BEND_SHIFT | 128 <<
> > > DSPARB_AEND_SHIFT); +   }
> > >  }
> >
> > Jesse,
> >
> > >From what I understand of the DSPARB register, these values shouldn't be
> >
> > hardcoded values but based on the HDISPLAY value that's configured for
> > each pipe to ensure correct FIFO splits.
> >
> > Just a heads up.
> 
> You're right, we should be doing a bandwidth calculation based on the current 
> mode for each plane.  But I still don't have access to the spreadsheet that 
> documents how the FIFO should be split, so until then we'll have to hope that 
> stealing all of display plane C's FIFO entries is enough. :)  And at least 
> now we'll know when underruns happen, since I added some debug code.

The way I understand the split to be configured is as so....

e.g. FIFO RAM entries = 96, so...

HDISPLAY for PIPEA = 1280
HDISPLAY for PIPEB = 1024

Therefore the split is 1280*(96/(1280+1024)) and 1024*(96/(1280+1024))
giving a value of approx 53 and 43, so DSPARB would be set as....

OUTREG(DSPARB, (95 << DSPARB_CSTART_SHIFT) |
		  (52 << DSPARB_BSTART_SHIFT));

Things would need adjusting for FIFO RAM which is 128 or 256 wide,
obviously.

Alan.
 




More information about the xorg mailing list