/**********************************************************************
 *
 * Copyright (C) Imagination Technologies Ltd. All rights reserved.
 * 
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope it will be useful but, except 
 * as otherwise stated in writing, without any warranty; without even the 
 * implied warranty of merchantability or fitness for a particular purpose. 
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 * The full GNU General Public License is included in this distribution in
 * the file called "COPYING".
 *
 * Contact Information:
 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK 
 *
 ******************************************************************************/

#if !defined(__MMAP_H__)
#define __MMAP_H__

#include <linux/mm.h>
#include <linux/list.h>

#if defined(VM_MIXEDMAP)
#define	PVR_MAKE_ALL_PFNS_SPECIAL
#endif

#include "perproc.h"
#include "mm.h"

typedef struct KV_OFFSET_STRUCT_TAG
{
    
    IMG_UINT32			ui32Mapped;

    
    IMG_UINT32                  ui32MMapOffset;
    
    IMG_UINT32			ui32RealByteSize;

    
    LinuxMemArea                *psLinuxMemArea;
    
#if !defined(PVR_MAKE_ALL_PFNS_SPECIAL)
    
    IMG_UINT32			ui32TID;
#endif

    
    IMG_UINT32			ui32PID;

    
    IMG_BOOL			bOnMMapList;

    
    IMG_UINT32			ui32RefCount;

    
    IMG_UINT32			ui32UserVAddr;

    
#if defined(DEBUG_LINUX_MMAP_AREAS)
    const IMG_CHAR		*pszName;
#endif
    
   
   struct list_head		sMMapItem;

   
   struct list_head		sAreaItem;
}KV_OFFSET_STRUCT, *PKV_OFFSET_STRUCT;



IMG_VOID PVRMMapInit(IMG_VOID);


IMG_VOID PVRMMapCleanup(IMG_VOID);


PVRSRV_ERROR PVRMMapRegisterArea(LinuxMemArea *psLinuxMemArea);


PVRSRV_ERROR PVRMMapRemoveRegisteredArea(LinuxMemArea *psLinuxMemArea);


PVRSRV_ERROR PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc,
#if defined (SUPPORT_SID_INTERFACE)
                                          IMG_SID     hMHandle,
#else
                                          IMG_HANDLE hMHandle,
#endif
                                          IMG_UINT32 *pui32MMapOffset,
                                          IMG_UINT32 *pui32ByteOffset,
                                          IMG_UINT32 *pui32RealByteSize,
                                          IMG_UINT32 *pui32UserVAddr);

PVRSRV_ERROR
PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc,
#if defined (SUPPORT_SID_INTERFACE)
				IMG_SID   hMHandle,
#else
				IMG_HANDLE hMHandle,
#endif
				IMG_BOOL *pbMUnmap,
				IMG_UINT32 *pui32RealByteSize,
                                IMG_UINT32 *pui32UserVAddr);

int PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma);


#endif	

