aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/emgd/pvr/services4/system/common/sysconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/emgd/pvr/services4/system/common/sysconfig.c')
-rw-r--r--drivers/gpu/drm/emgd/pvr/services4/system/common/sysconfig.c1609
1 files changed, 0 insertions, 1609 deletions
diff --git a/drivers/gpu/drm/emgd/pvr/services4/system/common/sysconfig.c b/drivers/gpu/drm/emgd/pvr/services4/system/common/sysconfig.c
deleted file mode 100644
index 4c9946cf6ae4..000000000000
--- a/drivers/gpu/drm/emgd/pvr/services4/system/common/sysconfig.c
+++ /dev/null
@@ -1,1609 +0,0 @@
-/* -*- syscommon-c -*-
- *-----------------------------------------------------------------------------
- * Filename: syscommon.c
- * $Revision: 1.7 $
- *-----------------------------------------------------------------------------
- * Copyright © 2002-2010, Intel Corporation.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- *-----------------------------------------------------------------------------
- * Description: platform detection, and sharing of correct platform interface.
- *
- *-----------------------------------------------------------------------------
- * Authors:
- * Marcin Tomczyk
- *-----------------------------------------------------------------------------
- */
-
-#include <linux/pci.h>
-#include "sgxdefs.h"
-#include "services_headers.h"
-#include "kerneldisplay.h"
-#include "oemfuncs.h"
-#include "sgxinfo.h"
-#include "sgxinfokm.h"
-#ifdef SUPPORT_MSVDX
-#include "msvdx_defs.h"
-#include "msvdxapi.h"
-#include "msvdx_infokm.h"
-#include "osfunc.h"
-#endif
-#include "pdump_km.h"
-#include "syslocal.h"
-#include "sysconfig.h"
-#include "pvr_debug.h"
-#include "msvdx_pvr.h"
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Pointer to "System Data" used by all platform blocks, exported
-* in "syscommon.h" header file.
-*/
-/* --------------------------------------------------------------------------*/
-SYS_DATA *gpsSysData = (SYS_DATA*)IMG_NULL;
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Pointer to found platform interface. It is IMG_NULL when no
-* correct platform can be found.
-*/
-/* --------------------------------------------------------------------------*/
-SYS_PLATFORM_INTERFACE *gpsSysPlatformInterface = (SYS_PLATFORM_INTERFACE*)IMG_NULL;
-
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Poulsbo platform interface.
-*/
-/* --------------------------------------------------------------------------*/
-extern SYS_PLATFORM_INTERFACE gpsSysPlatformInterfacePlb;
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Atom E6xx platform interface.
-*/
-/* --------------------------------------------------------------------------*/
-extern SYS_PLATFORM_INTERFACE gpsSysPlatformInterfaceTnc;
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Table to available platforms interfaces.
-* The last element must be set to IMG_NULL.
-*
-* @Param &gpsSysPlatformInterfacePlb Poulsbo interface
-* @Param &gpsSysPlatformInterfaceTnc Atom E6xx interface
-*/
-/* --------------------------------------------------------------------------*/
-SYS_PLATFORM_INTERFACE* gpsSysPlatformInterfacesTab[] = { &gpsSysPlatformInterfacePlb,
- &gpsSysPlatformInterfaceTnc,
- (SYS_PLATFORM_INTERFACE*)IMG_NULL};
-
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Function to detect platform and set "gpsSysPlatformInterface" to
-* one member of "gpsSysPlatformInterfacesTab".
-*
-* @Param IMG_VOID
-*
-* @Returns
-*/
-/* --------------------------------------------------------------------------*/
-IMG_VOID SysPlatformDetect(IMG_VOID)
-{
- SYS_PLATFORM_INTERFACE** psSysPlatformInterfacesTab = gpsSysPlatformInterfacesTab;
-
- while(*psSysPlatformInterfacesTab != IMG_NULL) {
-
- if(pci_get_device(SYS_SGX_DEV_VENDOR_ID, (unsigned short)((*psSysPlatformInterfacesTab)->uiSgxDevDeviceID), NULL)) {
- gpsSysPlatformInterface = *psSysPlatformInterfacesTab;
- PVR_DPF((PVR_DBG_MESSAGE,"Platform detected: %s", gpsSysPlatformInterface->sProductName));
- return;
- }
- PVR_DPF((PVR_DBG_MESSAGE,"Platform search: %s", (*psSysPlatformInterfacesTab)->sProductName));
- psSysPlatformInterfacesTab++;
- }
- PVR_DPF((PVR_DBG_ERROR,"Platform detected Failed"));
-}
-
-
-/* --------------------------------------------------------------------------*/
-/**
-* @Synopsis Interface for Atom E6xx device
-*/
-/* ----------------------------------------------------------------------------*/
-
-static SYS_DATA gsSysData;
-
-static SYS_SPECIFIC_DATA gsSysSpecificData;
-
-static IMG_UINT32 gui32SGXDeviceID;
-static SGX_DEVICE_MAP gsSGXDeviceMap;
-static IMG_UINT32 gui32MSVDXDeviceID;
-
-#ifdef SUPPORT_MSVDX
-static IMG_UINT32 gui32MSVDXDeviceID;
-static MSVDX_DEVICE_MAP gsMSVDXDeviceMap;
-#endif
-
-
-#if defined(NO_HARDWARE)
-static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr;
-#ifdef SUPPORT_MSVDX
-static IMG_CPU_VIRTADDR gsMSVDXRegsCPUVAddr;
-#endif
-#endif
-
-#if !defined(NO_HARDWARE)
-static IMG_CPU_VIRTADDR gsPoulsboRegsCPUVaddr;
-
-#if defined(MAP_UNUSED_MAPPINGS)
-static IMG_CPU_VIRTADDR gsPoulsboDisplayRegsCPUVaddr;
-#endif
-
-#endif
-
-#ifdef LDM_PCI
-extern struct pci_dev *gpsPVRLDMDev;
-#endif
-
-IMG_UINT32 PVRSRV_BridgeDispatchKM( IMG_UINT32 Ioctl,
- IMG_BYTE *pInBuf,
- IMG_UINT32 InBufLen,
- IMG_BYTE *pOutBuf,
- IMG_UINT32 OutBufLen,
- IMG_UINT32 *pdwBytesTransferred);
-
-#ifdef __linux__
-#define ADDR_RANGE_INDEX (MMADR_INDEX - 4)
-#if defined(SGX_FEATURE_HOST_PORT)
-#define HP_ADDR_RANGE_INDEX (GMADR_INDEX - 4)
-#endif
-static PVRSRV_ERROR PCIInitDev(SYS_DATA *psSysData)
-{
- SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
-
-#ifdef LDM_PCI
- psSysSpecData->hSGXPCI = OSPCISetDev((IMG_VOID *)psSysSpecData->psPCIDev, HOST_PCI_INIT_FLAG_BUS_MASTER);
-#else
- psSysSpecData->hSGXPCI = OSPCIAcquireDev(SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV_DEVICE_ID, HOST_PCI_INIT_FLAG_BUS_MASTER);
-#endif
- if (!psSysSpecData->hSGXPCI)
- {
- PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Failed to acquire PCI device"));
- return PVRSRV_ERROR_GENERIC;
- }
-
- SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_PCI_ACQUIRE_DEV);
-
- PVR_TRACE(("PCI memory region: %x to %x", OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX), OSPCIAddrRangeEnd(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX)));
-#if defined(SGX_FEATURE_HOST_PORT)
- PVR_TRACE(("Host Port region: %x to %x", OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX), OSPCIAddrRangeEnd(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX)));
-#endif
-
- if (OSPCIAddrRangeLen(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX) < MAX_OFFSET)
- {
- PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Device memory region isn't big enough"));
- return PVRSRV_ERROR_GENERIC;
- }
-
-
- if (OSPCIRequestAddrRange(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX) != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Device memory region not available"));
- return PVRSRV_ERROR_GENERIC;
- }
- SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_SGX_ADDR_RANGE);
-
-
-#if defined(SGX_FEATURE_HOST_PORT)
- if (OSPCIRequestAddrRange(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX) != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Host Port region not available"));
- return PVRSRV_ERROR_GENERIC;
- }
- SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_HOST_PORT_RANGE);
-#endif
- return PVRSRV_OK;
-}
-
-static IMG_VOID PCIDeInitDev(SYS_DATA *psSysData)
-{
- SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
-
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_SGX_ADDR_RANGE))
- {
- OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX);
- }
-
-#if defined(SGX_FEATURE_HOST_PORT)
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_HOST_PORT_RANGE))
- {
- OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX);
- }
-#endif
-
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_ACQUIRE_DEV))
- {
- OSPCIReleaseDev(psSysSpecData->hSGXPCI);
- }
-}
-#else
-static PVRSRV_ERROR FindPCIDevice(IMG_UINT16 ui16VenID, IMG_UINT16 ui16DevID, PCICONFIG_SPACE *psPCISpace)
-{
- IMG_UINT32 ui32BusNum;
- IMG_UINT32 ui32DevNum;
- IMG_UINT32 ui32VenDevID;
-
-
- for (ui32BusNum=0; ui32BusNum < 255; ui32BusNum++)
- {
-
- for (ui32DevNum=0; ui32DevNum < 32; ui32DevNum++)
- {
-
- ui32VenDevID=OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 0);
-
-
- if (ui32VenDevID == (IMG_UINT32)((ui16DevID<<16)+ui16VenID))
- {
- IMG_UINT32 ui32Idx;
-
-
- OSPCIWriteDword(ui32BusNum, ui32DevNum, 0, 4, OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 4) | 0x02);
-
-
- for (ui32Idx=0; ui32Idx < 64; ui32Idx++)
- {
- psPCISpace->u.aui32PCISpace[ui32Idx] = OSPCIReadDword(ui32BusNum, ui32DevNum, 0, ui32Idx*4);
-
- if (ui32Idx < 16)
- {
- PVR_DPF((PVR_DBG_VERBOSE,"%08X\n",psPCISpace->u.aui32PCISpace[ui32Idx]));
- }
- }
- return PVRSRV_OK;
- }
-
- }
-
- }
-
- PVR_DPF((PVR_DBG_ERROR,"Couldn't find PCI device"));
-
- return PVRSRV_ERROR_GENERIC;
-}
-#endif
-
-static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData)
-{
-#if !defined(NO_HARDWARE) || defined(__linux__)
- IMG_UINT32 ui32BaseAddr;
- IMG_UINT32 ui32IRQ;
-#endif
-#if defined(SGX_FEATURE_HOST_PORT)
- IMG_UINT32 ui32HostPortAddr = 0UL;
-#endif
-#if defined(NO_HARDWARE)
- IMG_CPU_PHYADDR sCpuPAddr;
-#endif
-#if defined(NO_HARDWARE) || defined(__linux__)
- SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
-#endif
-#if (!defined(__linux__) || defined(NO_HARDWARE))
- PVRSRV_ERROR eError;
-#endif
-
-#ifdef __linux__
- ui32BaseAddr = OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX);
-#if defined(SGX_FEATURE_HOST_PORT)
- ui32HostPortAddr = OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX);
-#endif
- if (OSPCIIRQ(psSysSpecData->hSGXPCI, &ui32IRQ) != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysLocateDevices: Couldn't get IRQ"));
- return PVRSRV_ERROR_INVALID_DEVICE;
- }
- PVR_TRACE(("IRQ: %d", ui32IRQ));
-#else
- PVRSRV_ERROR eError;
- PCICONFIG_SPACE sPCISpace;
-
- eError = FindPCIDevice(VENDOR_ID, DEVICE_ID, &sPCISpace);
- if (eError == PVRSRV_OK)
- {
- ui32BaseAddr = sPCISpace.u.aui32PCISpace[MMADR_INDEX];
-#if defined(SGX_FEATURE_HOST_PORT)
- ui32HostPortAddr = sPCISpace.u.aui32PCISpace[GMADR_INDEX];
-#endif
- }
- else
- {
- return PVRSRV_ERROR_INVALID_DEVICE;
- }
-
- ui32IRQ = (IMG_UINT32)sPCISpace.u.aui8PCISpace[0x3C];
-#endif
-
-
- gsSGXDeviceMap.ui32Flags = 0x0;
-
-
-#if defined(NO_HARDWARE)
-
- gsSGXDeviceMap.ui32IRQ = 0;
-#else
- gsSGXDeviceMap.ui32IRQ = ui32IRQ;
-#endif
-
-#if defined(NO_HARDWARE)
-
- eError = OSBaseAllocContigMemory(SGX_REG_SIZE,
- &gsSGXRegsCPUVAddr,
- &sCpuPAddr);
- if(eError != PVRSRV_OK)
- {
- return eError;
- }
- SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_SGX_REGS);
-
- gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr;
-
- OSMemSet(gsSGXRegsCPUVAddr, 0, SGX_REG_SIZE);
-
-#if defined(__linux__)
-
- gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr;
-#else
-
- gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL;
-#endif
-
-#else
- gsSGXDeviceMap.sRegsSysPBase.uiAddr = ui32BaseAddr + SGX_REGS_OFFSET;
-#endif
-
-
- gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase);
- gsSGXDeviceMap.ui32RegsSize = SGX_REG_SIZE;
-
-#if defined(SGX_FEATURE_HOST_PORT)
-
- gsSGXDeviceMap.ui32Flags = SGX_HOSTPORT_PRESENT;
- gsSGXDeviceMap.sHPSysPBase.uiAddr = ui32HostPortAddr;
- gsSGXDeviceMap.sHPCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sHPSysPBase);
- gsSGXDeviceMap.ui32HPSize = SYS_SGX_HP_SIZE;
-#endif
-
-
-
-
- gsSGXDeviceMap.sLocalMemSysPBase.uiAddr = 0;
- gsSGXDeviceMap.sLocalMemDevPBase.uiAddr = 0;
- gsSGXDeviceMap.sLocalMemCpuPBase.uiAddr = 0;
- gsSGXDeviceMap.ui32LocalMemSize = 0;
-
-#if !defined(NO_HARDWARE)
-
- {
- IMG_SYS_PHYADDR sPoulsboRegsCpuPBase;
-
- sPoulsboRegsCpuPBase.uiAddr = ui32BaseAddr + REGS_OFFSET;
- gsPoulsboRegsCPUVaddr = OSMapPhysToLin(SysSysPAddrToCpuPAddr(sPoulsboRegsCpuPBase),
- REG_SIZE,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
-#if defined(MAP_UNUSED_MAPPINGS)
- sPoulsboRegsCpuPBase.uiAddr = ui32BaseAddr + DISPLAY_REGS_OFFSET;
- gsPoulsboDisplayRegsCPUVaddr = OSMapPhysToLin(SysSysPAddrToCpuPAddr(sPoulsboRegsCpuPBase),
- DISPLAY_REG_SIZE,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-#endif
- }
-#endif
-
-#ifdef SUPPORT_MSVDX
-
-
-#if defined(NO_HARDWARE)
-
- eError = OSBaseAllocContigMemory(MSVDX_REG_SIZE,
- &gsMSVDXRegsCPUVAddr,
- &sCpuPAddr);
- if(eError != PVRSRV_OK)
- {
- return eError;
- }
- SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_MSVDX_REGS);
- gsMSVDXDeviceMap.sRegsCpuPBase = sCpuPAddr;
-
- OSMemSet(gsMSVDXRegsCPUVAddr, 0, MSVDX_REG_SIZE);
-
-#if defined(__linux__)
-
- gsMSVDXDeviceMap.pvRegsCpuVBase = gsMSVDXRegsCPUVAddr;
-#else
-
- gsMSVDXDeviceMap.pvRegsCpuVBase = IMG_NULL;
-#endif
-#else
- gsMSVDXDeviceMap.sRegsCpuPBase.uiAddr = ui32BaseAddr + MSVDX_REGS_OFFSET;
-#endif
- gsMSVDXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsMSVDXDeviceMap.sRegsCpuPBase);
- gsMSVDXDeviceMap.ui32RegsSize = MSVDX_REG_SIZE;
-
-
-
-
-
- gsMSVDXDeviceMap.sLocalMemSysPBase.uiAddr = 0;
- gsMSVDXDeviceMap.sLocalMemDevPBase.uiAddr = 0;
- gsMSVDXDeviceMap.sLocalMemCpuPBase.uiAddr = 0;
- gsMSVDXDeviceMap.ui32LocalMemSize = 0;
-
-
-
- gsMSVDXDeviceMap.ui32IRQ = ui32IRQ;
-
-#endif
-
-
-
- return PVRSRV_OK;
-}
-
-#ifdef SUPPORT_MSVDX_FPGA
-static PVRSRV_ERROR FindPCIDevice(IMG_UINT16 ui16VenID, IMG_UINT16 ui16DevID, PCICONFIG_SPACE *psPCISpace)
-{
- IMG_UINT32 ui32BusNum;
- IMG_UINT32 ui32DevNum;
- IMG_UINT32 ui32VenDevID;
- IMG_UINT32 ui32BarIndex;
-
-
- for (ui32BusNum=0; ui32BusNum < 255; ui32BusNum++)
- {
-
- for (ui32DevNum=0; ui32DevNum < 32; ui32DevNum++)
- {
-
- ui32VenDevID=OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 0);
-
-
- if (ui32VenDevID == (IMG_UINT32)((ui16DevID<<16)+ui16VenID))
- {
- IMG_UINT32 ui32Idx;
-
-
- OSPCIWriteDword(ui32BusNum, ui32DevNum, 0, 4, OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 4) | 0x02);
-
- psPCISpace->ui32BusNum = ui32BusNum;
- psPCISpace->ui32DevNum = ui32DevNum;
- psPCISpace->ui32FuncNum = 0;
-
-
- for (ui32Idx=0; ui32Idx < 64; ui32Idx++)
- {
- psPCISpace->u.aui32PCISpace[ui32Idx] = OSPCIReadDword(ui32BusNum, ui32DevNum, 0, ui32Idx*4);
-
- if (ui32Idx < 16)
- {
- PVR_DPF((PVR_DBG_VERBOSE,"%08X\n",psPCISpace->u.aui32PCISpace[ui32Idx]));
- }
- }
-
- for (ui32BarIndex = 0; ui32BarIndex < 6; ui32BarIndex++)
- {
- GetPCIMemSpaceSize (ui32BusNum, ui32DevNum, ui32BarIndex, &psPCISpace->aui32PCIMemSpaceSize[ui32BarIndex]);
- }
- return PVRSRV_OK;
- }
-
- }
-
- }
-
- PVR_DPF((PVR_DBG_ERROR,"Couldn't find PCI device"));
-
- return PVRSRV_ERROR_GENERIC;
-}
-
-static IMG_UINT32 GetPCIMemSpaceSize (IMG_UINT32 ui32BusNum, IMG_UINT32 ui32DevNum, IMG_UINT32 ui32BarIndex, IMG_UINT32* pui32PCIMemSpaceSize)
-{
-
- IMG_UINT32 ui32AddressRange;
- IMG_UINT32 ui32BarSave;
-
- ui32BarSave = OSPCIReadDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)));
-
- OSPCIWriteDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)), 0xFFFFFFFF);
-
- ui32AddressRange = OSPCIReadDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)));
-
- OSPCIWriteDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)), ui32BarSave);
-
- *pui32PCIMemSpaceSize = (~(ui32AddressRange & 0xFFFFFFF0)) + 1;
- return PVRSRV_OK;
-}
-#endif
-
-
-#ifdef __linux__
-#define VERSION_STR_MAX_LEN_TEMPLATE "SGX revision = 000.000.000"
-static PVRSRV_ERROR SysCreateVersionString(SYS_DATA *psSysData)
-{
- IMG_UINT32 ui32SGXRevision = 0;
- IMG_UINT32 ui32MaxStrLen;
- PVRSRV_ERROR eError;
- IMG_INT32 i32Count;
- IMG_CHAR *pszVersionString;
-
-#if !defined(NO_HARDWARE)
-
- {
- IMG_VOID *pvSGXRegs;
-
- pvSGXRegs = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase,
- gsSGXDeviceMap.ui32RegsSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
- if (pvSGXRegs != IMG_NULL)
- {
- ui32SGXRevision = OSReadHWReg(pvSGXRegs, EUR_CR_CORE_REVISION);
-
- OSUnMapPhysToLin(pvSGXRegs,
- gsSGXDeviceMap.ui32RegsSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
- }
- else
- {
- PVR_DPF((PVR_DBG_ERROR,"SysCreateVersionString: Couldn't map SGX registers"));
- }
- }
-#endif
-
- ui32MaxStrLen = OSStringLength(VERSION_STR_MAX_LEN_TEMPLATE);
- eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32MaxStrLen + 1,
- (IMG_PVOID *)&pszVersionString,
- IMG_NULL,
- "Version String");
- if(eError != PVRSRV_OK)
- {
- return PVRSRV_ERROR_GENERIC;
- }
-
- i32Count = OSSNPrintf(pszVersionString, ui32MaxStrLen + 1,
- "SGX revision = %u.%u.%u",
- (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MAJOR_MASK)
- >> EUR_CR_CORE_REVISION_MAJOR_SHIFT),
- (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MINOR_MASK)
- >> EUR_CR_CORE_REVISION_MINOR_SHIFT),
- (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MAINTENANCE_MASK)
- >> EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT)
- );
- if(i32Count == -1)
- {
- ui32MaxStrLen = OSStringLength(VERSION_STR_MAX_LEN_TEMPLATE);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32MaxStrLen + 1,
- pszVersionString,
- IMG_NULL);
-
- return PVRSRV_ERROR_GENERIC;
- }
-
- psSysData->pszVersionString = pszVersionString;
-
- return PVRSRV_OK;
-}
-
-static IMG_VOID SysFreeVersionString(SYS_DATA *psSysData)
-{
- if(psSysData->pszVersionString)
- {
- IMG_UINT32 ui32MaxStrLen;
- ui32MaxStrLen = OSStringLength(VERSION_STR_MAX_LEN_TEMPLATE);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- ui32MaxStrLen+1,
- psSysData->pszVersionString,
- IMG_NULL);
- psSysData->pszVersionString = NULL;
- }
-}
-#endif
-PVRSRV_ERROR SysInitialise(IMG_VOID)
-{
- IMG_UINT32 i;
- PVRSRV_ERROR eError;
- PVRSRV_DEVICE_NODE *psDeviceNode;
- SGX_TIMING_INFORMATION* psTimingInfo;
-
- PVR_DPF((PVR_DBG_MESSAGE,"SysInitialise"));
-
- SysPlatformDetect();
-
- gpsSysData = &gsSysData;
- OSMemSet(gpsSysData, 0, sizeof(SYS_DATA));
-
- gpsSysData->pvSysSpecificData = &gsSysSpecificData;
- gsSysSpecificData.ui32SysSpecificData = 0;
-#ifdef LDM_PCI
-
- PVR_ASSERT(gpsPVRLDMDev != IMG_NULL);
- gsSysSpecificData.psPCIDev = gpsPVRLDMDev;
-#endif
-
- eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
-
-
- psTimingInfo = &gsSGXDeviceMap.sTimingInfo;
- psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED;
- psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ;
-#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT)
- psTimingInfo->bEnableActivePM = IMG_TRUE;
-#else
- psTimingInfo->bEnableActivePM = IMG_FALSE;
-#endif
- psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS;
- psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ;
-
-#ifdef __linux__
- eError = PCIInitDev(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
-#endif
-
- gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT;
-
-
- for(i=0; i<SYS_DEVICE_COUNT; i++)
- {
- gpsSysData->sDeviceID[i].uiID = i;
- gpsSysData->sDeviceID[i].bInUse = IMG_FALSE;
- }
-
- gpsSysData->psDeviceNodeList = IMG_NULL;
- gpsSysData->psQueueList = IMG_NULL;
-
- eError = SysInitialiseCommon(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
-
-
- eError = SysLocateDevices(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
-
-
- eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice,
- DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
-
-//#ifdef SUPPORT_MSVDX
- eError = PVRSRVRegisterDevice(gpsSysData, MSVDXRegisterDevice,
- DEVICE_MSVDX_INTERRUPT, &gui32MSVDXDeviceID);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
-//#endif
-
-
- psDeviceNode = gpsSysData->psDeviceNodeList;
-
- while(psDeviceNode)
- {
-
- switch(psDeviceNode->sDevId.eDeviceType)
- {
- case PVRSRV_DEVICE_TYPE_SGX:
- {
- DEVICE_MEMORY_INFO *psDevMemoryInfo;
- DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
-
-
- psDeviceNode->psLocalDevMemArena = IMG_NULL;
-
-
- psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
- psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
-
-
- for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++)
- {
- psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG;
-#ifdef OEM_CUSTOMISE
-
-#endif
- }
-
- break;
- }
-
-//#ifdef SUPPORT_MSVDX
- case PVRSRV_DEVICE_TYPE_MSVDX:
- {
- DEVICE_MEMORY_INFO *psDevMemoryInfo;
- DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
-
-
- psDeviceNode->psLocalDevMemArena = IMG_NULL;
-
-
- psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
- psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
-
-
- for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++)
- {
- psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG;
-#ifdef OEM_CUSTOMISE
-
-#endif
- }
- break;
- }
-//#endif
- default:
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to find SGX device node!"));
- return PVRSRV_ERROR_INIT_FAILURE;
- }
- }
-
-
- psDeviceNode = psDeviceNode->psNext;
- }
-
- PDUMPINIT();
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PDUMP_INIT);
-
-
- eError = PVRSRVInitialiseDevice (gui32SGXDeviceID);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_SGX_INITIALISED);
-
-//#ifdef SUPPORT_MSVDX
- eError = PVRSRVInitialiseDevice (gui32MSVDXDeviceID);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_MSVDX_INITIALISED);
-//#endif
-
- return PVRSRV_OK;
-}
-
-
-static IMG_VOID SysEnableInterrupts(SYS_DATA *psSysData)
-{
-#if !defined(NO_HARDWARE)
- IMG_UINT32 ui32RegData;
- IMG_UINT32 ui32Mask;
-
- ui32Mask = THALIA_MASK | MSVDX_MASK;
-
- ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG);
- OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG, ui32RegData | ui32Mask);
-
-
- ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG);
- OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG, ui32RegData & (~ui32Mask));
-
-
- ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG);
- OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG, ui32RegData | ui32Mask);
-
- PVR_TRACE(("SysEnableInterrupts: Interrupts enabled"));
-#endif
- PVR_UNREFERENCED_PARAMETER(psSysData);
-}
-
-static IMG_VOID SysDisableInterrupts(SYS_DATA *psSysData)
-{
-#if !defined(NO_HARDWARE)
- IMG_UINT32 ui32RegData;
- IMG_UINT32 ui32Mask;
-
-
- ui32Mask = THALIA_MASK | MSVDX_MASK;
-
- ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG);
- OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG, ui32RegData & (~ui32Mask));
-
-
- ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG);
- OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG, ui32RegData | ui32Mask);
-
- PVR_TRACE(("SysDisableInterrupts: Interrupts disabled"));
-#endif
- PVR_UNREFERENCED_PARAMETER(psSysData);
-}
-
-IMG_VOID SysReEnableInterrupts(IMG_VOID)
-{
- SysEnableInterrupts(gpsSysData);
-}
-
-PVRSRV_ERROR SysFinalise(IMG_VOID)
-{
- PVRSRV_ERROR eError = PVRSRV_OK;
-
-#if defined(SYS_USING_INTERRUPTS)
- eError = OSInstallMISR(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysFinalise: OSInstallMISR failed"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_MISR_INSTALLED);
-
- eError = OSInstallSystemLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysFinalise: OSInstallSystemLISR failed"));
- SysDeinitialise(gpsSysData);
- gpsSysData = IMG_NULL;
- return eError;
- }
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED);
-#endif
-
- SysEnableInterrupts(gpsSysData);
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED);
-
-#ifdef __linux__
-
- eError = SysCreateVersionString(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to create a system version string"));
- }
-#endif
-
- return eError;
-}
-
-PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
-{
- PVRSRV_ERROR eError;
-
- SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
-
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED))
- {
- SysDisableInterrupts(psSysData);
- }
-
-#if defined(SYS_USING_INTERRUPTS)
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_LISR_INSTALLED))
- {
- eError = OSUninstallSystemLISR(psSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallSystemLISR failed"));
- return eError;
- }
- }
-
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_MISR_INSTALLED))
- {
- eError = OSUninstallMISR(psSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed"));
- return eError;
- }
- }
-#endif
-
-#if defined(SUPPORT_MSVDX)
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_MSVDX_INITIALISED))
- {
-
- eError = PVRSRVDeinitialiseDevice(gui32MSVDXDeviceID);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device"));
- return eError;
- }
- }
-#endif
-
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_SGX_INITIALISED))
- {
-
- eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device"));
- return eError;
- }
- }
-
-#ifdef __linux__
- SysFreeVersionString(psSysData);
-
- PCIDeInitDev(psSysData);
-#endif
-
- eError = OSDeInitEnvData(psSysData->pvEnvSpecificData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure"));
- return eError;
- }
-
- SysDeinitialiseCommon(gpsSysData);
-
-#if defined(NO_HARDWARE)
-#ifdef SUPPORT_MSVDX
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_MSVDX_REGS))
- {
- OSBaseFreeContigMemory(MSVDX_REG_SIZE, gsMSVDXRegsCPUVAddr, gsMSVDXDeviceMap.sRegsCpuPBase);
- }
-#endif
-
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_SGX_REGS))
- {
- OSBaseFreeContigMemory(SGX_REG_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase);
- }
-#endif
-
-#if !defined(NO_HARDWARE)
-
- OSUnMapPhysToLin(gsPoulsboRegsCPUVaddr,
- REG_SIZE,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
-#if defined(MAP_UNUSED_MAPPINGS)
- OSUnMapPhysToLin(gsPoulsboDisplayRegsCPUVaddr,
- DISPLAY_REG_SIZE,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-#endif
-
-#endif
- if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PDUMP_INIT))
- {
- PDUMPDEINIT();
- }
-
- gpsSysData = IMG_NULL;
-
- return PVRSRV_OK;
-}
-
-
-IMG_UINT32 SysGetInterruptSource(SYS_DATA* psSysData,
- PVRSRV_DEVICE_NODE *psDeviceNode)
-{
-#if !defined(NO_HARDWARE)
- IMG_UINT32 ui32Devices = 0;
- IMG_UINT32 ui32Data, ui32DIMMask;
-
- PVR_UNREFERENCED_PARAMETER(psSysData);
- PVR_UNREFERENCED_PARAMETER(psDeviceNode);
-
-
- ui32Data = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG);
-
- if (ui32Data & THALIA_MASK)
- {
- ui32Devices |= DEVICE_SGX_INTERRUPT;
- }
-
- if (ui32Data & MSVDX_MASK)
- {
- ui32Devices |= DEVICE_MSVDX_INTERRUPT;
- }
-
-
- ui32DIMMask = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG);
- ui32DIMMask &= ~(THALIA_MASK | MSVDX_MASK);
-
-
- if (ui32Data & ui32DIMMask)
- {
- ui32Devices |= DEVICE_DISP_INTERRUPT;
- }
-
- return (ui32Devices);
-#else
- PVR_UNREFERENCED_PARAMETER(psSysData);
- PVR_UNREFERENCED_PARAMETER(psDeviceNode);
-
- return 0;
-#endif
-}
-
-IMG_VOID SysClearInterrupts(SYS_DATA* psSysData, IMG_UINT32 ui32ClearBits)
-{
-#if !defined(NO_HARDWARE)
- IMG_UINT32 ui32Data;
- IMG_UINT32 ui32Mask = 0;
-
- PVR_UNREFERENCED_PARAMETER(psSysData);
-
- ui32Data = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_STATUS_REG);
-
- if ((ui32ClearBits & DEVICE_SGX_INTERRUPT) &&
- ((ui32Data & THALIA_MASK) == 0))
- {
- ui32Mask |= THALIA_MASK;
- }
-
- if ((ui32ClearBits & DEVICE_MSVDX_INTERRUPT) &&
- ((ui32Data & MSVDX_MASK) == 0))
- {
- ui32Mask |= MSVDX_MASK;
- }
-
- if (ui32Mask)
- {
- OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG, ui32Mask);
- }
-#else
- PVR_UNREFERENCED_PARAMETER(psSysData);
- PVR_UNREFERENCED_PARAMETER(ui32ClearBits);
-#endif
-}
-
-
-
-PVRSRV_ERROR SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE eDeviceType,
- IMG_VOID **ppvDeviceMap)
-{
-
- switch(eDeviceType)
- {
- case PVRSRV_DEVICE_TYPE_SGX:
- {
-
- *ppvDeviceMap = (IMG_VOID*)&gsSGXDeviceMap;
- break;
- }
-#ifdef SUPPORT_MSVDX
- case PVRSRV_DEVICE_TYPE_MSVDX:
- {
-
- *ppvDeviceMap = (IMG_VOID*)&gsMSVDXDeviceMap;
- break;
- }
-#endif
- default:
- {
- PVR_DPF((PVR_DBG_ERROR,"SysGetDeviceMemoryMap: unsupported device type"));
- }
- }
- return PVRSRV_OK;
-}
-
-
-IMG_DEV_PHYADDR SysCpuPAddrToDevPAddr (PVRSRV_DEVICE_TYPE eDeviceType,
- IMG_CPU_PHYADDR CpuPAddr)
-{
- IMG_DEV_PHYADDR DevPAddr;
-
- PVR_UNREFERENCED_PARAMETER(eDeviceType);
-
-
- DevPAddr.uiAddr = CpuPAddr.uiAddr;
-
- return DevPAddr;
-}
-
-
-IMG_CPU_PHYADDR SysSysPAddrToCpuPAddr (IMG_SYS_PHYADDR sys_paddr)
-{
- IMG_CPU_PHYADDR cpu_paddr;
-
-
- cpu_paddr.uiAddr = sys_paddr.uiAddr;
- return cpu_paddr;
-}
-
-IMG_SYS_PHYADDR SysCpuPAddrToSysPAddr (IMG_CPU_PHYADDR cpu_paddr)
-{
- IMG_SYS_PHYADDR sys_paddr;
-
-
- sys_paddr.uiAddr = cpu_paddr.uiAddr;
- return sys_paddr;
-}
-
-
-IMG_DEV_PHYADDR SysSysPAddrToDevPAddr (PVRSRV_DEVICE_TYPE eDeviceType, IMG_SYS_PHYADDR SysPAddr)
-{
- IMG_DEV_PHYADDR DevPAddr;
-
- PVR_UNREFERENCED_PARAMETER(eDeviceType);
-
-
- DevPAddr.uiAddr = SysPAddr.uiAddr;
-
- return DevPAddr;
-}
-
-
-IMG_SYS_PHYADDR SysDevPAddrToSysPAddr (PVRSRV_DEVICE_TYPE eDeviceType, IMG_DEV_PHYADDR DevPAddr)
-{
- IMG_SYS_PHYADDR SysPAddr;
-
- PVR_UNREFERENCED_PARAMETER(eDeviceType);
-
-
- SysPAddr.uiAddr = DevPAddr.uiAddr;
-
- return SysPAddr;
-}
-
-
-IMG_VOID SysRegisterExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode)
-{
- PVR_UNREFERENCED_PARAMETER(psDeviceNode);
-}
-
-
-IMG_VOID SysRemoveExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode)
-{
- PVR_UNREFERENCED_PARAMETER(psDeviceNode);
-}
-
-PVRSRV_ERROR SysOEMFunction ( IMG_UINT32 ui32ID,
- IMG_VOID *pvIn,
- IMG_UINT32 ulInSize,
- IMG_VOID *pvOut,
- IMG_UINT32 ulOutSize)
-{
- if (ulInSize || pvIn);
-
- if ((ui32ID == OEM_GET_EXT_FUNCS) &&
- (ulOutSize == sizeof(PVRSRV_DC_OEM_JTABLE)))
- {
- PVRSRV_DC_OEM_JTABLE *psOEMJTable = (PVRSRV_DC_OEM_JTABLE*)pvOut;
- psOEMJTable->pfnOEMBridgeDispatch = &PVRSRV_BridgeDispatchKM;
-#ifdef __linux__
- psOEMJTable->pfnOEMReadRegistryString = IMG_NULL;
- psOEMJTable->pfnOEMWriteRegistryString = IMG_NULL;
-#else
- psOEMJTable->pfnOEMReadRegistryString = IMG_NULL;
- psOEMJTable->pfnOEMWriteRegistryString = IMG_NULL;
-#endif
- return PVRSRV_OK;
- }
-
- return PVRSRV_ERROR_INVALID_PARAMS;
-}
-
-
-static PVRSRV_ERROR SysMapInRegisters(IMG_VOID)
-{
- PVRSRV_DEVICE_NODE *psDeviceNodeList;
-
- psDeviceNodeList = gpsSysData->psDeviceNodeList;
-
- while (psDeviceNodeList)
- {
- switch(psDeviceNodeList->sDevId.eDeviceType)
- {
- case PVRSRV_DEVICE_TYPE_SGX:
- {
- PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNodeList->pvDevice;
-#if defined(NO_HARDWARE) && defined(__linux__)
-
- PVR_ASSERT(gsSGXRegsCPUVAddr);
-
- psDevInfo->pvRegsBaseKM = gsSGXRegsCPUVAddr;
-#else
-
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS))
- {
- psDevInfo->pvRegsBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase,
- gsSGXDeviceMap.ui32RegsSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
- if (!psDevInfo->pvRegsBaseKM)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in SGX registers\n"));
- return PVRSRV_ERROR_BAD_MAPPING;
- }
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS);
- }
-#endif
-
- psDevInfo->ui32RegSize = gsSGXDeviceMap.ui32RegsSize;
- psDevInfo->sRegsPhysBase = gsSGXDeviceMap.sRegsSysPBase;
-
-#if defined(SGX_FEATURE_HOST_PORT)
- if (gsSGXDeviceMap.ui32Flags & SGX_HOSTPORT_PRESENT)
- {
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP))
- {
-
- psDevInfo->pvHostPortBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sHPCpuPBase,
- gsSGXDeviceMap.ui32HPSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
- if (!psDevInfo->pvHostPortBaseKM)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in host port\n"));
- return PVRSRV_ERROR_BAD_MAPPING;
- }
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP);
- }
- psDevInfo->ui32HPSize = gsSGXDeviceMap.ui32HPSize;
- psDevInfo->sHPSysPAddr = gsSGXDeviceMap.sHPSysPBase;
- }
-#endif
- break;
- }
-#ifdef SUPPORT_MSVDX
- case PVRSRV_DEVICE_TYPE_MSVDX:
- {
- PVRSRV_MSVDXDEV_INFO *psDevInfo = (PVRSRV_MSVDXDEV_INFO *)psDeviceNodeList->pvDevice;
-#if defined(NO_HARDWARE) && defined(__linux__)
-
- PVR_ASSERT(gsMSVDXRegsCPUVAddr);
- psDevInfo->pvRegsBaseKM = gsMSVDXRegsCPUVAddr;
-#else
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_MSVDX_REGS))
- {
-
- psDevInfo->pvRegsBaseKM = OSMapPhysToLin (
- gsMSVDXDeviceMap.sRegsCpuPBase,
- gsMSVDXDeviceMap.ui32RegsSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
- if (!psDevInfo->pvRegsBaseKM)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map MSVDX registers\n"));
- return PVRSRV_ERROR_BAD_MAPPING;
- }
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_MSVDX_REGS);
- }
-#endif
- psDevInfo->ui32RegSize = gsMSVDXDeviceMap.ui32RegsSize;
- psDevInfo->sRegsPhysBase = gsMSVDXDeviceMap.sRegsSysPBase;
- break;
- }
-#endif
- default:
- break;
- }
- psDeviceNodeList = psDeviceNodeList->psNext;
- }
-
- return PVRSRV_OK;
-}
-
-
-static PVRSRV_ERROR SysUnmapRegisters(IMG_VOID)
-{
- PVRSRV_DEVICE_NODE *psDeviceNodeList;
-
- psDeviceNodeList = gpsSysData->psDeviceNodeList;
-
- while (psDeviceNodeList)
- {
- switch (psDeviceNodeList->sDevId.eDeviceType)
- {
- case PVRSRV_DEVICE_TYPE_SGX:
- {
- PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNodeList->pvDevice;
-#if !(defined(NO_HARDWARE) && defined(__linux__))
-
- if (psDevInfo->pvRegsBaseKM)
- {
- OSUnMapPhysToLin(psDevInfo->pvRegsBaseKM,
- gsSGXDeviceMap.ui32RegsSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS);
- }
-#endif
-
- psDevInfo->pvRegsBaseKM = IMG_NULL;
- psDevInfo->ui32RegSize = 0;
- psDevInfo->sRegsPhysBase.uiAddr = 0;
-
-#if defined(SGX_FEATURE_HOST_PORT)
- if (gsSGXDeviceMap.ui32Flags & SGX_HOSTPORT_PRESENT)
- {
-
- if (psDevInfo->pvHostPortBaseKM)
- {
- OSUnMapPhysToLin(psDevInfo->pvHostPortBaseKM,
- gsSGXDeviceMap.ui32HPSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP);
-
- psDevInfo->pvHostPortBaseKM = IMG_NULL;
- }
-
- psDevInfo->ui32HPSize = 0;
- psDevInfo->sHPSysPAddr.uiAddr = 0;
- }
-#endif
- break;
- }
-#ifdef SUPPORT_MSVDX
- case PVRSRV_DEVICE_TYPE_MSVDX:
- {
- PVRSRV_MSVDXDEV_INFO *psDevInfo = (PVRSRV_MSVDXDEV_INFO *)psDeviceNodeList->pvDevice;
-#if !(defined(NO_HARDWARE) && defined(__linux__))
- if (psDevInfo->pvRegsBaseKM)
- {
- OSUnMapPhysToLin(psDevInfo->pvRegsBaseKM,
- psDevInfo->ui32RegSize,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_MSVDX_REGS);
- }
-#endif
- psDevInfo->pvRegsBaseKM = IMG_NULL;
- psDevInfo->ui32RegSize = 0;
- psDevInfo->sRegsPhysBase.uiAddr = 0;
- break;
- }
-#endif
- default:
- break;
- }
- psDeviceNodeList = psDeviceNodeList->psNext;
- }
-
-#if !(defined(NO_HARDWARE) || defined(__linux__))
-
- OSUnMapPhysToLin(gsPoulsboRegsCPUVaddr,
- REG_SIZE,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-
-
-#if defined(MAP_UNUSED_MAPPINGS)
- OSUnMapPhysToLin(gsPoulsboDisplayRegsCPUVaddr,
- DISPLAY_REG_SIZE,
- PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
- IMG_NULL);
-#endif
-
-#endif
-
-#if defined(NO_HARDWARE)
-#ifdef SUPPORT_MSVDX
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_MSVDX_REGS))
- {
- PVR_ASSERT(gsMSVDXRegsCPUVAddr)
-
- OSBaseFreeContigMemory(MSVDX_REG_SIZE, gsMSVDXRegsCPUVAddr, gsMSVDXDeviceMap.sRegsCpuPBase);
-
- gsMSVDXRegsCPUVAddr = IMG_NULL;
-
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_MSVDX_REGS);
- }
-#endif
-
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_SGX_REGS))
- {
- PVR_ASSERT(gsSGXRegsCPUVAddr);
-
- OSBaseFreeContigMemory(SGX_REG_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase);
- gsSGXRegsCPUVAddr = IMG_NULL;
-
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_SGX_REGS);
- }
-#endif
-
- return PVRSRV_OK;
-}
-
-
-PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState)
-{
- PVRSRV_ERROR eError= PVRSRV_OK;
-
- if (eNewPowerState != gpsSysData->eCurrentPowerState)
- {
- if ((eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) &&
- (gpsSysData->eCurrentPowerState < PVRSRV_SYS_POWER_STATE_D3))
- {
-
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED))
- {
- SysDisableInterrupts(gpsSysData);
-
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE);
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED);
- }
-
-#if defined(SYS_USING_INTERRUPTS)
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED))
- {
- eError = OSUninstallSystemLISR(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallSystemLISR failed (%d)", eError));
- }
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR);
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED);
- }
-#endif
-
-
- SysUnmapRegisters();
-#ifdef __linux__
- eError = OSPCISuspendDev(gsSysSpecificData.hSGXPCI);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSPCISuspendDev failed (%d)", eError));
- }
-#endif
- }
- }
-
- return eError;
-}
-
-PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState)
-{
- PVRSRV_ERROR eError = PVRSRV_OK;
-
- if (eNewPowerState != gpsSysData->eCurrentPowerState)
- {
- if ((gpsSysData->eCurrentPowerState == PVRSRV_SYS_POWER_STATE_D3) &&
- (eNewPowerState < PVRSRV_SYS_POWER_STATE_D3))
- {
-#ifdef __linux__
- eError = OSPCIResumeDev(gsSysSpecificData.hSGXPCI);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSPCIResumeDev failed (%d)", eError));
- }
-#endif
-
-
-
- eError = SysLocateDevices(gpsSysData);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to locate devices"));
- return eError;
- }
-
-
- eError = SysMapInRegisters();
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to map in registers"));
- return eError;
- }
-
-#if defined(SYS_USING_INTERRUPTS)
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR))
- {
- eError = OSInstallSystemLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallSystemLISR failed to install ISR (%d)", eError));
- }
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED);
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR);
- }
-#endif
-
- if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE))
- {
- SysEnableInterrupts(gpsSysData);
-
- SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED);
- SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE);
- }
- }
- }
- return eError;
-}
-
-
-PVRSRV_ERROR SysDevicePrePowerState(IMG_UINT32 ui32DeviceIndex,
- PVRSRV_DEV_POWER_STATE eNewPowerState,
- PVRSRV_DEV_POWER_STATE eCurrentPowerState)
-{
- if (ui32DeviceIndex == gui32SGXDeviceID)
- {
- if ((eNewPowerState != eCurrentPowerState) &&
- (eNewPowerState == PVRSRV_DEV_POWER_STATE_OFF))
- {
- PVR_DPF((PVR_DBG_MESSAGE,"SysDevicePrePowerState: Remove SGX power"));
- }
- }
-
- return PVRSRV_OK;
-}
-
-
-PVRSRV_ERROR SysDevicePostPowerState(IMG_UINT32 ui32DeviceIndex,
- PVRSRV_DEV_POWER_STATE eNewPowerState,
- PVRSRV_DEV_POWER_STATE eCurrentPowerState)
-{
- if (ui32DeviceIndex == gui32SGXDeviceID)
- {
- if ((eNewPowerState != eCurrentPowerState) &&
- (eCurrentPowerState == PVRSRV_DEV_POWER_STATE_OFF))
- {
- PVR_DPF((PVR_DBG_MESSAGE,"SysDevicePostPowerState: Restore SGX power"));
- }
- }
-
- return PVRSRV_OK;
-}