diff options
Diffstat (limited to 'drivers/gpu/pvr/omap4/sysconfig.c')
-rw-r--r-- | drivers/gpu/pvr/omap4/sysconfig.c | 239 |
1 files changed, 148 insertions, 91 deletions
diff --git a/drivers/gpu/pvr/omap4/sysconfig.c b/drivers/gpu/pvr/omap4/sysconfig.c index f08bf8e13fc..5c82be77d46 100644 --- a/drivers/gpu/pvr/omap4/sysconfig.c +++ b/drivers/gpu/pvr/omap4/sysconfig.c | |||
@@ -24,28 +24,18 @@ | |||
24 | * | 24 | * |
25 | ******************************************************************************/ | 25 | ******************************************************************************/ |
26 | 26 | ||
27 | #include "sysconfig.h" | ||
27 | #include "services_headers.h" | 28 | #include "services_headers.h" |
28 | #include "kerneldisplay.h" | 29 | #include "kerneldisplay.h" |
29 | #include "oemfuncs.h" | 30 | #include "oemfuncs.h" |
30 | #include "sgxinfo.h" | 31 | #include "sgxinfo.h" |
31 | #include "sgxinfokm.h" | 32 | #include "sgxinfokm.h" |
32 | #include "syslocal.h" | 33 | #include "syslocal.h" |
33 | #include "sysconfig.h" | ||
34 | |||
35 | #include <linux/platform_device.h> | ||
36 | #include <plat/omap_device.h> | ||
37 | #include <plat/omap-pm.h> | ||
38 | 34 | ||
39 | #include "ocpdefs.h" | 35 | #include "ocpdefs.h" |
40 | 36 | ||
41 | #if !defined(NO_HARDWARE) && \ | 37 | #if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) |
42 | defined(SYS_USING_INTERRUPTS) && \ | 38 | #include <plat/omap_device.h> |
43 | defined(SGX540) | ||
44 | #define SGX_OCP_REGS_ENABLED | ||
45 | #endif | ||
46 | |||
47 | #if defined(LDM_PLATFORM) && !defined(SUPPORT_DRI_DRM) | ||
48 | extern struct platform_device *gpsPVRLDMDev; | ||
49 | #endif | 39 | #endif |
50 | 40 | ||
51 | SYS_DATA* gpsSysData = (SYS_DATA*)IMG_NULL; | 41 | SYS_DATA* gpsSysData = (SYS_DATA*)IMG_NULL; |
@@ -60,10 +50,14 @@ static PVRSRV_DEVICE_NODE *gpsSGXDevNode; | |||
60 | 50 | ||
61 | #define DEVICE_SGX_INTERRUPT (1 << 0) | 51 | #define DEVICE_SGX_INTERRUPT (1 << 0) |
62 | 52 | ||
63 | #if defined(NO_HARDWARE) | 53 | #if defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) |
64 | static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr; | 54 | static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr; |
65 | #endif | 55 | #endif |
66 | 56 | ||
57 | #if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) | ||
58 | extern struct platform_device *gpsPVRLDMDev; | ||
59 | #endif | ||
60 | |||
67 | IMG_UINT32 PVRSRV_BridgeDispatchKM(IMG_UINT32 Ioctl, | 61 | IMG_UINT32 PVRSRV_BridgeDispatchKM(IMG_UINT32 Ioctl, |
68 | IMG_BYTE *pInBuf, | 62 | IMG_BYTE *pInBuf, |
69 | IMG_UINT32 InBufLen, | 63 | IMG_UINT32 InBufLen, |
@@ -73,25 +67,19 @@ IMG_UINT32 PVRSRV_BridgeDispatchKM(IMG_UINT32 Ioctl, | |||
73 | 67 | ||
74 | #if defined(SGX_OCP_REGS_ENABLED) | 68 | #if defined(SGX_OCP_REGS_ENABLED) |
75 | 69 | ||
76 | #define SYS_OMAP4430_OCP_REGS_SYS_PHYS_BASE (SYS_OMAP4430_SGX_REGS_SYS_PHYS_BASE + EUR_CR_OCP_REVISION) | ||
77 | #define SYS_OMAP4430_OCP_REGS_SIZE 0x110 | ||
78 | |||
79 | static IMG_CPU_VIRTADDR gpvOCPRegsLinAddr; | 70 | static IMG_CPU_VIRTADDR gpvOCPRegsLinAddr; |
80 | 71 | ||
81 | static PVRSRV_ERROR EnableSGXClocksWrap(SYS_DATA *psSysData) | 72 | static PVRSRV_ERROR EnableSGXClocksWrap(SYS_DATA *psSysData) |
82 | { | 73 | { |
83 | PVRSRV_ERROR eError = EnableSGXClocks(psSysData); | 74 | PVRSRV_ERROR eError = EnableSGXClocks(psSysData); |
84 | 75 | ||
76 | #if !defined(SGX_OCP_NO_INT_BYPASS) | ||
85 | if(eError == PVRSRV_OK) | 77 | if(eError == PVRSRV_OK) |
86 | { | 78 | { |
87 | OSWriteHWReg(gpvOCPRegsLinAddr, | 79 | OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_SYSCONFIG, 0x14); |
88 | EUR_CR_OCP_SYSCONFIG - EUR_CR_OCP_REVISION, | 80 | OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_DEBUG_CONFIG, EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_MASK); |
89 | 0x14); | ||
90 | OSWriteHWReg(gpvOCPRegsLinAddr, | ||
91 | EUR_CR_OCP_DEBUG_CONFIG - EUR_CR_OCP_REVISION, | ||
92 | EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_MASK); | ||
93 | } | 81 | } |
94 | 82 | #endif | |
95 | return eError; | 83 | return eError; |
96 | } | 84 | } |
97 | 85 | ||
@@ -112,7 +100,11 @@ static INLINE PVRSRV_ERROR EnableSystemClocksWrap(SYS_DATA *psSysData) | |||
112 | if(eError == PVRSRV_OK) | 100 | if(eError == PVRSRV_OK) |
113 | { | 101 | { |
114 | 102 | ||
115 | EnableSGXClocksWrap(psSysData); | 103 | eError = EnableSGXClocksWrap(psSysData); |
104 | if (eError != PVRSRV_OK) | ||
105 | { | ||
106 | DisableSystemClocks(psSysData); | ||
107 | } | ||
116 | } | 108 | } |
117 | #endif | 109 | #endif |
118 | 110 | ||
@@ -124,6 +116,11 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) | |||
124 | #if defined(NO_HARDWARE) | 116 | #if defined(NO_HARDWARE) |
125 | PVRSRV_ERROR eError; | 117 | PVRSRV_ERROR eError; |
126 | IMG_CPU_PHYADDR sCpuPAddr; | 118 | IMG_CPU_PHYADDR sCpuPAddr; |
119 | #else | ||
120 | #if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) | ||
121 | struct resource *dev_res; | ||
122 | int dev_irq; | ||
123 | #endif | ||
127 | #endif | 124 | #endif |
128 | 125 | ||
129 | PVR_UNREFERENCED_PARAMETER(psSysData); | 126 | PVR_UNREFERENCED_PARAMETER(psSysData); |
@@ -134,7 +131,9 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) | |||
134 | #if defined(NO_HARDWARE) | 131 | #if defined(NO_HARDWARE) |
135 | 132 | ||
136 | 133 | ||
137 | eError = OSBaseAllocContigMemory(SYS_OMAP4430_SGX_REGS_SIZE, | 134 | gsSGXDeviceMap.ui32RegsSize = SYS_OMAP4430_SGX_REGS_SIZE; |
135 | |||
136 | eError = OSBaseAllocContigMemory(gsSGXDeviceMap.ui32RegsSize, | ||
138 | &gsSGXRegsCPUVAddr, | 137 | &gsSGXRegsCPUVAddr, |
139 | &sCpuPAddr); | 138 | &sCpuPAddr); |
140 | if(eError != PVRSRV_OK) | 139 | if(eError != PVRSRV_OK) |
@@ -143,7 +142,6 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) | |||
143 | } | 142 | } |
144 | gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr; | 143 | gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr; |
145 | gsSGXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase); | 144 | gsSGXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase); |
146 | gsSGXDeviceMap.ui32RegsSize = SYS_OMAP4430_SGX_REGS_SIZE; | ||
147 | #if defined(__linux__) | 145 | #if defined(__linux__) |
148 | 146 | ||
149 | gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; | 147 | gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; |
@@ -152,7 +150,7 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) | |||
152 | gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL; | 150 | gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL; |
153 | #endif | 151 | #endif |
154 | 152 | ||
155 | OSMemSet(gsSGXRegsCPUVAddr, 0, SYS_OMAP4430_SGX_REGS_SIZE); | 153 | OSMemSet(gsSGXRegsCPUVAddr, 0, gsSGXDeviceMap.ui32RegsSize); |
156 | 154 | ||
157 | 155 | ||
158 | 156 | ||
@@ -160,13 +158,56 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) | |||
160 | gsSGXDeviceMap.ui32IRQ = 0; | 158 | gsSGXDeviceMap.ui32IRQ = 0; |
161 | 159 | ||
162 | #else | 160 | #else |
161 | #if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) | ||
162 | |||
163 | dev_res = platform_get_resource(gpsPVRLDMDev, IORESOURCE_MEM, 0); | ||
164 | if (dev_res == NULL) | ||
165 | { | ||
166 | PVR_DPF((PVR_DBG_ERROR, "%s: platform_get_resource failed", __FUNCTION__)); | ||
167 | return PVRSRV_ERROR_INVALID_DEVICE; | ||
168 | } | ||
169 | |||
170 | dev_irq = platform_get_irq(gpsPVRLDMDev, 0); | ||
171 | if (dev_irq < 0) | ||
172 | { | ||
173 | PVR_DPF((PVR_DBG_ERROR, "%s: platform_get_irq failed (%d)", __FUNCTION__, -dev_irq)); | ||
174 | return PVRSRV_ERROR_INVALID_DEVICE; | ||
175 | } | ||
176 | |||
177 | gsSGXDeviceMap.sRegsSysPBase.uiAddr = dev_res->start; | ||
178 | gsSGXDeviceMap.sRegsCpuPBase = | ||
179 | SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); | ||
180 | PVR_TRACE(("SGX register base: 0x%lx", (unsigned long)gsSGXDeviceMap.sRegsCpuPBase.uiAddr)); | ||
163 | 181 | ||
182 | gsSGXDeviceMap.ui32RegsSize = (unsigned int)(dev_res->end - dev_res->start); | ||
183 | PVR_TRACE(("SGX register size: %d",gsSGXDeviceMap.ui32RegsSize)); | ||
184 | |||
185 | gsSGXDeviceMap.ui32IRQ = dev_irq; | ||
186 | PVR_TRACE(("SGX IRQ: %d", gsSGXDeviceMap.ui32IRQ)); | ||
187 | #else | ||
164 | gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_OMAP4430_SGX_REGS_SYS_PHYS_BASE; | 188 | gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_OMAP4430_SGX_REGS_SYS_PHYS_BASE; |
165 | gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); | 189 | gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); |
166 | gsSGXDeviceMap.ui32RegsSize = SYS_OMAP4430_SGX_REGS_SIZE; | 190 | gsSGXDeviceMap.ui32RegsSize = SYS_OMAP4430_SGX_REGS_SIZE; |
167 | 191 | ||
168 | gsSGXDeviceMap.ui32IRQ = SYS_OMAP4430_SGX_IRQ; | 192 | gsSGXDeviceMap.ui32IRQ = SYS_OMAP4430_SGX_IRQ; |
169 | 193 | ||
194 | #endif | ||
195 | #if defined(SGX_OCP_REGS_ENABLED) | ||
196 | gsSGXRegsCPUVAddr = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, | ||
197 | gsSGXDeviceMap.ui32RegsSize, | ||
198 | PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, | ||
199 | IMG_NULL); | ||
200 | |||
201 | if (gsSGXRegsCPUVAddr == IMG_NULL) | ||
202 | { | ||
203 | PVR_DPF((PVR_DBG_ERROR,"SysLocateDevices: Failed to map SGX registers")); | ||
204 | return PVRSRV_ERROR_BAD_MAPPING; | ||
205 | } | ||
206 | |||
207 | |||
208 | gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; | ||
209 | gpvOCPRegsLinAddr = gsSGXRegsCPUVAddr; | ||
210 | #endif | ||
170 | #endif | 211 | #endif |
171 | 212 | ||
172 | #if defined(PDUMP) | 213 | #if defined(PDUMP) |
@@ -184,7 +225,7 @@ static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) | |||
184 | } | 225 | } |
185 | 226 | ||
186 | 227 | ||
187 | IMG_CHAR *SysCreateVersionString(IMG_CPU_PHYADDR sRegRegion) | 228 | static IMG_CHAR *SysCreateVersionString(void) |
188 | { | 229 | { |
189 | static IMG_CHAR aszVersionString[100]; | 230 | static IMG_CHAR aszVersionString[100]; |
190 | SYS_DATA *psSysData; | 231 | SYS_DATA *psSysData; |
@@ -193,8 +234,8 @@ IMG_CHAR *SysCreateVersionString(IMG_CPU_PHYADDR sRegRegion) | |||
193 | #if !defined(NO_HARDWARE) | 234 | #if !defined(NO_HARDWARE) |
194 | IMG_VOID *pvRegsLinAddr; | 235 | IMG_VOID *pvRegsLinAddr; |
195 | 236 | ||
196 | pvRegsLinAddr = OSMapPhysToLin(sRegRegion, | 237 | pvRegsLinAddr = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, |
197 | SYS_OMAP4430_SGX_REGS_SIZE, | 238 | gsSGXDeviceMap.ui32RegsSize, |
198 | PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, | 239 | PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, |
199 | IMG_NULL); | 240 | IMG_NULL); |
200 | if(!pvRegsLinAddr) | 241 | if(!pvRegsLinAddr) |
@@ -286,17 +327,6 @@ PVRSRV_ERROR SysInitialise(IMG_VOID) | |||
286 | return eError; | 327 | return eError; |
287 | } | 328 | } |
288 | 329 | ||
289 | #if !defined(PVR_NO_OMAP_TIMER) | ||
290 | TimerRegPhysBase.uiAddr = SYS_OMAP4430_GP11TIMER_REGS_SYS_PHYS_BASE; | ||
291 | gpsSysData->pvSOCTimerRegisterKM = IMG_NULL; | ||
292 | gpsSysData->hSOCTimerRegisterOSMemHandle = 0; | ||
293 | OSReservePhys(TimerRegPhysBase, | ||
294 | 4, | ||
295 | PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, | ||
296 | (IMG_VOID **)&gpsSysData->pvSOCTimerRegisterKM, | ||
297 | &gpsSysData->hSOCTimerRegisterOSMemHandle); | ||
298 | #endif | ||
299 | |||
300 | #if !defined(SGX_DYNAMIC_TIMING_INFO) | 330 | #if !defined(SGX_DYNAMIC_TIMING_INFO) |
301 | 331 | ||
302 | psTimingInfo = &gsSGXDeviceMap.sTimingInfo; | 332 | psTimingInfo = &gsSGXDeviceMap.sTimingInfo; |
@@ -329,28 +359,6 @@ PVRSRV_ERROR SysInitialise(IMG_VOID) | |||
329 | } | 359 | } |
330 | SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV); | 360 | SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV); |
331 | 361 | ||
332 | #if defined(SGX_OCP_REGS_ENABLED) | ||
333 | { | ||
334 | IMG_SYS_PHYADDR sOCPRegsSysPBase; | ||
335 | IMG_CPU_PHYADDR sOCPRegsCpuPBase; | ||
336 | |||
337 | sOCPRegsSysPBase.uiAddr = SYS_OMAP4430_OCP_REGS_SYS_PHYS_BASE; | ||
338 | sOCPRegsCpuPBase = SysSysPAddrToCpuPAddr(sOCPRegsSysPBase); | ||
339 | |||
340 | gpvOCPRegsLinAddr = OSMapPhysToLin(sOCPRegsCpuPBase, | ||
341 | SYS_OMAP4430_OCP_REGS_SIZE, | ||
342 | PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, | ||
343 | IMG_NULL); | ||
344 | |||
345 | if (gpvOCPRegsLinAddr == IMG_NULL) | ||
346 | { | ||
347 | PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to map OCP registers")); | ||
348 | return PVRSRV_ERROR_BAD_MAPPING; | ||
349 | } | ||
350 | SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS); | ||
351 | } | ||
352 | #endif | ||
353 | |||
354 | eError = SysPMRuntimeRegister(); | 362 | eError = SysPMRuntimeRegister(); |
355 | if (eError != PVRSRV_OK) | 363 | if (eError != PVRSRV_OK) |
356 | { | 364 | { |
@@ -419,8 +427,10 @@ PVRSRV_ERROR SysInitialise(IMG_VOID) | |||
419 | psDeviceNode = psDeviceNode->psNext; | 427 | psDeviceNode = psDeviceNode->psNext; |
420 | } | 428 | } |
421 | 429 | ||
430 | #if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) | ||
422 | omap_device_set_rate(&gpsPVRLDMDev->dev, | 431 | omap_device_set_rate(&gpsPVRLDMDev->dev, |
423 | &gpsPVRLDMDev->dev, SYS_SGX_CLOCK_SPEED); | 432 | &gpsPVRLDMDev->dev, SYS_SGX_CLOCK_SPEED); |
433 | #endif | ||
424 | 434 | ||
425 | eError = EnableSystemClocksWrap(gpsSysData); | 435 | eError = EnableSystemClocksWrap(gpsSysData); |
426 | if (eError != PVRSRV_OK) | 436 | if (eError != PVRSRV_OK) |
@@ -457,6 +467,24 @@ PVRSRV_ERROR SysInitialise(IMG_VOID) | |||
457 | DisableSGXClocks(gpsSysData); | 467 | DisableSGXClocks(gpsSysData); |
458 | #endif | 468 | #endif |
459 | 469 | ||
470 | #if !defined(PVR_NO_OMAP_TIMER) | ||
471 | #if defined(PVR_OMAP_TIMER_BASE_IN_SYS_SPEC_DATA) | ||
472 | TimerRegPhysBase = gsSysSpecificData.sTimerRegPhysBase; | ||
473 | #else | ||
474 | TimerRegPhysBase.uiAddr = SYS_OMAP4430_GP11TIMER_REGS_SYS_PHYS_BASE; | ||
475 | #endif | ||
476 | gpsSysData->pvSOCTimerRegisterKM = IMG_NULL; | ||
477 | gpsSysData->hSOCTimerRegisterOSMemHandle = 0; | ||
478 | if (TimerRegPhysBase.uiAddr != 0) | ||
479 | { | ||
480 | OSReservePhys(TimerRegPhysBase, | ||
481 | 4, | ||
482 | PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, | ||
483 | (IMG_VOID **)&gpsSysData->pvSOCTimerRegisterKM, | ||
484 | &gpsSysData->hSOCTimerRegisterOSMemHandle); | ||
485 | } | ||
486 | #endif | ||
487 | |||
460 | return PVRSRV_OK; | 488 | return PVRSRV_OK; |
461 | } | 489 | } |
462 | 490 | ||
@@ -495,14 +523,14 @@ PVRSRV_ERROR SysFinalise(IMG_VOID) | |||
495 | 523 | ||
496 | #if defined(__linux__) | 524 | #if defined(__linux__) |
497 | 525 | ||
498 | gpsSysData->pszVersionString = SysCreateVersionString(gsSGXDeviceMap.sRegsCpuPBase); | 526 | gpsSysData->pszVersionString = SysCreateVersionString(); |
499 | if (!gpsSysData->pszVersionString) | 527 | if (!gpsSysData->pszVersionString) |
500 | { | 528 | { |
501 | PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to create a system version string")); | 529 | PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to create a system version string")); |
502 | } | 530 | } |
503 | else | 531 | else |
504 | { | 532 | { |
505 | PVR_DPF((PVR_DBG_WARNING, "SysFinalise: Version string: %s", gpsSysData->pszVersionString)); | 533 | PVR_TRACE(("SysFinalise: Version string: %s", gpsSysData->pszVersionString)); |
506 | } | 534 | } |
507 | #endif | 535 | #endif |
508 | 536 | ||
@@ -521,6 +549,14 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) | |||
521 | { | 549 | { |
522 | PVRSRV_ERROR eError; | 550 | PVRSRV_ERROR eError; |
523 | 551 | ||
552 | if(gpsSysData->pvSOCTimerRegisterKM) | ||
553 | { | ||
554 | OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, | ||
555 | 4, | ||
556 | PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, | ||
557 | gpsSysData->hSOCTimerRegisterOSMemHandle); | ||
558 | } | ||
559 | |||
524 | #if defined(SYS_USING_INTERRUPTS) | 560 | #if defined(SYS_USING_INTERRUPTS) |
525 | if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) | 561 | if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) |
526 | { | 562 | { |
@@ -571,22 +607,11 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) | |||
571 | if (eError != PVRSRV_OK) | 607 | if (eError != PVRSRV_OK) |
572 | { | 608 | { |
573 | PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to unregister with OSPM!")); | 609 | PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to unregister with OSPM!")); |
574 | (IMG_VOID)SysDeinitialise(gpsSysData); | ||
575 | gpsSysData = IMG_NULL; | 610 | gpsSysData = IMG_NULL; |
576 | return eError; | 611 | return eError; |
577 | } | 612 | } |
578 | } | 613 | } |
579 | 614 | ||
580 | #if defined(SGX_OCP_REGS_ENABLED) | ||
581 | if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS)) | ||
582 | { | ||
583 | OSUnMapPhysToLin(gpvOCPRegsLinAddr, | ||
584 | SYS_OMAP4430_OCP_REGS_SIZE, | ||
585 | PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, | ||
586 | IMG_NULL); | ||
587 | } | ||
588 | #endif | ||
589 | |||
590 | 615 | ||
591 | 616 | ||
592 | if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) | 617 | if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) |
@@ -604,21 +629,26 @@ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) | |||
604 | } | 629 | } |
605 | } | 630 | } |
606 | 631 | ||
607 | if(gpsSysData->pvSOCTimerRegisterKM) | ||
608 | { | ||
609 | OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, | ||
610 | 4, | ||
611 | PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, | ||
612 | gpsSysData->hSOCTimerRegisterOSMemHandle); | ||
613 | } | ||
614 | |||
615 | SysDeinitialiseCommon(gpsSysData); | 632 | SysDeinitialiseCommon(gpsSysData); |
616 | 633 | ||
617 | #if defined(NO_HARDWARE) | 634 | #if defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) |
618 | if(SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV)) | 635 | if(gsSGXRegsCPUVAddr != IMG_NULL) |
619 | { | 636 | { |
637 | #if defined(NO_HARDWARE) | ||
620 | 638 | ||
621 | OSBaseFreeContigMemory(SYS_OMAP4430_SGX_REGS_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); | 639 | OSBaseFreeContigMemory(SYS_OMAP4430_SGX_REGS_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); |
640 | #else | ||
641 | #if defined(SGX_OCP_REGS_ENABLED) | ||
642 | OSUnMapPhysToLin(gsSGXRegsCPUVAddr, | ||
643 | gsSGXDeviceMap.ui32RegsSize, | ||
644 | PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, | ||
645 | IMG_NULL); | ||
646 | |||
647 | gpvOCPRegsLinAddr = IMG_NULL; | ||
648 | #endif | ||
649 | #endif | ||
650 | gsSGXRegsCPUVAddr = IMG_NULL; | ||
651 | gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; | ||
622 | } | 652 | } |
623 | #endif | 653 | #endif |
624 | 654 | ||
@@ -740,14 +770,41 @@ IMG_UINT32 SysGetInterruptSource(SYS_DATA *psSysData, | |||
740 | 770 | ||
741 | IMG_VOID SysClearInterrupts(SYS_DATA* psSysData, IMG_UINT32 ui32ClearBits) | 771 | IMG_VOID SysClearInterrupts(SYS_DATA* psSysData, IMG_UINT32 ui32ClearBits) |
742 | { | 772 | { |
743 | PVR_UNREFERENCED_PARAMETER(psSysData); | ||
744 | PVR_UNREFERENCED_PARAMETER(ui32ClearBits); | 773 | PVR_UNREFERENCED_PARAMETER(ui32ClearBits); |
745 | 774 | #if defined(NO_HARDWARE) | |
775 | PVR_UNREFERENCED_PARAMETER(psSysData); | ||
776 | #else | ||
777 | #if defined(SGX_OCP_NO_INT_BYPASS) | ||
778 | OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQSTATUS_2, 0x1); | ||
779 | #endif | ||
746 | 780 | ||
747 | OSReadHWReg(((PVRSRV_SGXDEV_INFO *)gpsSGXDevNode->pvDevice)->pvRegsBaseKM, | 781 | OSReadHWReg(((PVRSRV_SGXDEV_INFO *)gpsSGXDevNode->pvDevice)->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR); |
748 | EUR_CR_EVENT_HOST_CLEAR); | 782 | #endif |
749 | } | 783 | } |
750 | 784 | ||
785 | #if defined(SGX_OCP_NO_INT_BYPASS) | ||
786 | IMG_VOID SysEnableSGXInterrupts(SYS_DATA *psSysData) | ||
787 | { | ||
788 | SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData; | ||
789 | if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_LISR) && !SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) | ||
790 | { | ||
791 | OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQSTATUS_2, 0x1); | ||
792 | OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQENABLE_SET_2, 0x1); | ||
793 | SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); | ||
794 | } | ||
795 | } | ||
796 | |||
797 | IMG_VOID SysDisableSGXInterrupts(SYS_DATA *psSysData) | ||
798 | { | ||
799 | SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData; | ||
800 | |||
801 | if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) | ||
802 | { | ||
803 | OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQENABLE_CLR_2, 0x1); | ||
804 | SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); | ||
805 | } | ||
806 | } | ||
807 | #endif | ||
751 | 808 | ||
752 | PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) | 809 | PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) |
753 | { | 810 | { |