From: Austin Hu <[email protected]> Take gles1test1 for example, it swaps buffers via PVR2DPresentBlt() to blit to its primary buffer which still points to the previous frame buffer, but another frame buffer has been created and added to FB list by resizing when X launches with HDMI connected.
So update the 3rd party's system buffer to link it to the current FB in the drmModeAddFB()/drmModeRmFB() process. Signed-off-by: Austin Hu <[email protected]> Signed-off-by: Jackie Li <[email protected]> Signed-off-by: Hitesh K. Patel <[email protected]> --- drivers/staging/mrst/drv/psb_fb.c | 8 +++- drivers/staging/mrst/medfield/Makefile | 3 +- .../linux_framebuffer_mrst/mrstlfb_displayclass.c | 34 +++++++++++++------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/drivers/staging/mrst/drv/psb_fb.c b/drivers/staging/mrst/drv/psb_fb.c index ec90f20..d9a66fb 100644 --- a/drivers/staging/mrst/drv/psb_fb.c +++ b/drivers/staging/mrst/drv/psb_fb.c @@ -858,8 +858,6 @@ static struct drm_framebuffer *psb_user_framebuffer_create psbfb->size = size; psbfb->hKernelMemInfo = hKernelMemInfo; - MRSTLFBHandleChangeFB(dev, psbfb); - DRM_DEBUG("Mapping to gtt..., KernelMemInfo %p\n", psKernelMemInfo); /*if not VRAM, map it into tt aperture*/ @@ -945,6 +943,10 @@ static struct drm_framebuffer *psb_user_framebuffer_create #else psbfb->fbdev = info; fbdev->pfb = psbfb; + + fbdev->psb_fb_helper.fb = fb; + fbdev->psb_fb_helper.fbdev = info; + MRSTLFBHandleChangeFB(dev, psbfb); #endif return fb; @@ -1548,6 +1550,8 @@ int psbfb_remove(struct drm_device *dev, struct drm_framebuffer *fb) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) info = psbfb->fbdev; + psbfb->pvrBO = NULL; + MRSTLFBHandleChangeFB(dev, psbfb); #else info = fb->fbdev; #endif diff --git a/drivers/staging/mrst/medfield/Makefile b/drivers/staging/mrst/medfield/Makefile index 14ab4a5..19ac16b 100644 --- a/drivers/staging/mrst/medfield/Makefile +++ b/drivers/staging/mrst/medfield/Makefile @@ -54,7 +54,8 @@ ccflags-y += \ -DSUPPORT_CPU_CACHED_BUFFERS \ -DDEBUG_MESA_OGL_TRACE \ -DDISABLE_PM \ - -DSUPPORT_SGX_NEW_STATUS_VALS + -DSUPPORT_SGX_NEW_STATUS_VALS \ + -DDRM_PVR_USE_INTEL_FB SUPPORT_EGL_EXTENSIONS ?=1 ifeq ($(SUPPORT_EGL_EXTENSIONS),1) diff --git a/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_mrst/mrstlfb_displayclass.c b/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_mrst/mrstlfb_displayclass.c index f757ac5..a92f400 100644 --- a/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_mrst/mrstlfb_displayclass.c +++ b/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_mrst/mrstlfb_displayclass.c @@ -1325,8 +1325,10 @@ int MRSTLFBHandleChangeFB(struct drm_device* dev, struct psb_framebuffer *psbfb) { MRSTLFB_DEVINFO *psDevInfo = GetAnchorPtr(); int i; + struct drm_psb_private * dev_priv = (struct drm_psb_private *)dev->dev_private; + struct psb_gtt * pg = dev_priv->pg; + LinuxMemArea *psLinuxMemArea; - if( !psDevInfo->sSystemBuffer.bIsContiguous ) MRSTLFBFreeKernelMem( psDevInfo->sSystemBuffer.uSysAddr.psNonCont ); @@ -1337,30 +1339,38 @@ int MRSTLFBHandleChangeFB(struct drm_device* dev, struct psb_framebuffer *psbfb) psDevInfo->sDisplayDim.ui32Height = psbfb->base.height; psDevInfo->sSystemBuffer.ui32BufferSize = psbfb->size; - - psDevInfo->sSystemBuffer.sDevVAddr.uiAddr = psbfb->offset; + + if (psbfb->pvrBO != NULL) + { + psDevInfo->sSystemBuffer.sCPUVAddr = psbfb->fbdev->screen_base; + psDevInfo->sSystemBuffer.sDevVAddr.uiAddr = psbfb->offset; + } + else + { + psDevInfo->sSystemBuffer.sCPUVAddr = pg->vram_addr; + psDevInfo->sSystemBuffer.sDevVAddr.uiAddr = 0; + } + psDevInfo->sSystemBuffer.bIsAllocated = MRST_FALSE; - if ( psbfb->pvrBO == 0 ) + if (psbfb->pvrBO != NULL) { - - struct drm_device * psDrmDevice = psDevInfo->psDrmDevice; - struct drm_psb_private * dev_priv = (struct drm_psb_private *)psDrmDevice->dev_private; - struct psb_gtt * pg = dev_priv->pg; + psLinuxMemArea = (LinuxMemArea *)psbfb->pvrBO->sMemBlk.hOSMemHandle; + } + if ((psbfb->pvrBO == NULL) || (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_ALLOC_PAGES)) + { psDevInfo->sSystemBuffer.bIsContiguous = MRST_TRUE; psDevInfo->sSystemBuffer.uSysAddr.sCont.uiAddr = pg->stolen_base; } else { - - LinuxMemArea *psLinuxMemArea = (LinuxMemArea *)psbfb->pvrBO->sMemBlk.hOSMemHandle; struct page **page_list = psLinuxMemArea->uData.sPageList.pvPageList; psDevInfo->sSystemBuffer.bIsContiguous = MRST_FALSE; psDevInfo->sSystemBuffer.uSysAddr.psNonCont = MRSTLFBAllocKernelMem( sizeof( IMG_SYS_PHYADDR ) * (psbfb->size >> PAGE_SHIFT)); + for (i = 0; i < psbfb->size >> PAGE_SHIFT; i++) { - psDevInfo->sSystemBuffer.uSysAddr.psNonCont[i].uiAddr = page_to_pfn( page_list[i] ); - + psDevInfo->sSystemBuffer.uSysAddr.psNonCont[i].uiAddr = page_to_pfn( page_list[i] ) << PAGE_SHIFT; } } -- 1.7.1 _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
