Bring back the local patch that has a habit of vanishing every time we

update mesa.

Specifically, we disallow in radeondrm for dri clients mapping
registers, so don't try and map them (and thus fail as we currently
were). for r300+ this was only used for falling back on old drm versions
(doesn't matter). For r100, the new BO abstraction used the SWI number
(in hardware scratch reg 3) for the buffer age, so use the newly added
getparam member to grab that info instead of trying to read the mapped
registers.

Update to the lastest kernel headers  before you even think about
building this or trying to use a snapshot on r100/r200.

So now radeon works with mesa again, hoorah!

Tested on rv250 by Josh Elsasser, and on R420 (and x800) by myself.
This commit is contained in:
oga 2010-05-26 22:55:53 +00:00
parent 67c78d50a7
commit 9dc65d790c
3 changed files with 13 additions and 38 deletions

View File

@ -171,25 +171,24 @@ static int legacy_free_handle(struct bo_manager_legacy *bom, uint32_t handle)
static void legacy_get_current_age(struct bo_manager_legacy *boml)
{
drm_radeon_getparam_t gp;
unsigned char *RADEONMMIO = NULL;
int r;
/* R300 we emit scratch writes in mesa. on r100/r200 we use the IRQ
* emit ioctl and thus we need to ask for a different scratch register.
*/
if ( IS_R300_CLASS(boml->screen)
|| IS_R600_CLASS(boml->screen) )
{
gp.param = RADEON_PARAM_LAST_CLEAR;
gp.value = (int *)&boml->current_age;
r = drmCommandWriteRead(boml->base.fd, DRM_RADEON_GETPARAM,
&gp, sizeof(gp));
if (r) {
fprintf(stderr, "%s: drmRadeonGetParam: %d\n", __FUNCTION__, r);
exit(1);
}
}
else {
RADEONMMIO = boml->screen->mmio.map;
boml->current_age = boml->screen->scratch[3];
boml->current_age = INREG(RADEON_GUI_SCRATCH_REG3);
gp.param = RADEON_PARAM_LAST_CLEAR;
} else {
gp.param = RADEON_PARAM_LAST_SWI;
}
gp.value = (int *)&boml->current_age;
r = drmCommandWriteRead(boml->base.fd, DRM_RADEON_GETPARAM,
&gp, sizeof(gp));
if (r) {
fprintf(stderr, "%s: drmRadeonGetParam: %d\n", __FUNCTION__, r);
exit(1);
}
}

View File

@ -917,7 +917,6 @@ radeonCreateScreen( __DRIscreen *sPriv )
{
radeonScreenPtr screen;
RADEONDRIPtr dri_priv = (RADEONDRIPtr)sPriv->pDevPriv;
unsigned char *RADEONMMIO = NULL;
int i;
int ret;
uint32_t temp = 0;
@ -986,26 +985,12 @@ radeonCreateScreen( __DRIscreen *sPriv )
if (ret == -1)
return NULL;
screen->mmio.handle = dri_priv->registerHandle;
screen->mmio.size = dri_priv->registerSize;
if ( drmMap( sPriv->fd,
screen->mmio.handle,
screen->mmio.size,
&screen->mmio.map ) ) {
FREE( screen );
__driUtilMessage("%s: drmMap failed\n", __FUNCTION__ );
return NULL;
}
RADEONMMIO = screen->mmio.map;
screen->status.handle = dri_priv->statusHandle;
screen->status.size = dri_priv->statusSize;
if ( drmMap( sPriv->fd,
screen->status.handle,
screen->status.size,
&screen->status.map ) ) {
drmUnmap( screen->mmio.map, screen->mmio.size );
FREE( screen );
__driUtilMessage("%s: drmMap (2) failed\n", __FUNCTION__ );
return NULL;
@ -1020,7 +1005,6 @@ radeonCreateScreen( __DRIscreen *sPriv )
screen->buffers = drmMapBufs( sPriv->fd );
if ( !screen->buffers ) {
drmUnmap( screen->status.map, screen->status.size );
drmUnmap( screen->mmio.map, screen->mmio.size );
FREE( screen );
__driUtilMessage("%s: drmMapBufs failed\n", __FUNCTION__ );
return NULL;
@ -1035,7 +1019,6 @@ radeonCreateScreen( __DRIscreen *sPriv )
(drmAddressPtr)&screen->gartTextures.map ) ) {
drmUnmapBufs( screen->buffers );
drmUnmap( screen->status.map, screen->status.size );
drmUnmap( screen->mmio.map, screen->mmio.size );
FREE( screen );
__driUtilMessage("%s: drmMap failed for GART texture area\n", __FUNCTION__);
return NULL;
@ -1090,14 +1073,9 @@ radeonCreateScreen( __DRIscreen *sPriv )
{
if (ret)
{
if (screen->chip_family < CHIP_FAMILY_RS600 && !screen->kernel_mm)
screen->fbLocation = ( INREG( RADEON_MC_FB_LOCATION ) & 0xffff) << 16;
else
{
FREE( screen );
fprintf(stderr, "Unable to get fb location need newer drm\n");
return NULL;
}
}
else
{
@ -1425,7 +1403,6 @@ radeonDestroyScreen( __DRIscreen *sPriv )
}
drmUnmapBufs( screen->buffers );
drmUnmap( screen->status.map, screen->status.size );
drmUnmap( screen->mmio.map, screen->mmio.size );
}
/* free all option information */

View File

@ -78,7 +78,6 @@ typedef struct radeon_screen {
int texSize[RADEON_NR_TEX_HEAPS];
int logTexGranularity[RADEON_NR_TEX_HEAPS];
radeonRegionRec mmio;
radeonRegionRec status;
radeonRegionRec gartTextures;