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

Reply via email to