diff options
-rw-r--r-- | arch/arm/include/asm/irq.h | 2 | ||||
-rw-r--r-- | arch/arm/include/asm/nmi.h | 14 | ||||
-rw-r--r-- | arch/arm/kernel/irq.c | 2 | ||||
-rw-r--r-- | drivers/gpu/pvr/Makefile | 2 | ||||
-rw-r--r-- | drivers/gpu/pvr/deviceclass.c | 57 | ||||
-rw-r--r-- | drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c | 2 | ||||
-rw-r--r-- | drivers/gpu/pvr/sgxerrata.h | 4 | ||||
-rw-r--r-- | drivers/gpu/pvr/sgxfeaturedefs.h | 6 | ||||
-rw-r--r-- | drivers/watchdog/omap_wdt.c | 23 |
9 files changed, 79 insertions, 33 deletions
diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h index 2721a58..904d0d2 100644 --- a/arch/arm/include/asm/irq.h +++ b/arch/arm/include/asm/irq.h @@ -3,6 +3,8 @@ #include <mach/irqs.h> +#define ARCH_HAS_NMI_WATCHDOG + #ifndef irq_canonicalize #define irq_canonicalize(i) (i) #endif diff --git a/arch/arm/include/asm/nmi.h b/arch/arm/include/asm/nmi.h new file mode 100644 index 0000000..3cf8bdf --- /dev/null +++ b/arch/arm/include/asm/nmi.h @@ -0,0 +1,14 @@ +#ifndef __ASM_ARM_NMI_H_ +#define __ASM_ARM_NMI_H_ + +#include <linux/notifier.h> + +extern struct atomic_notifier_head touch_watchdog_notifier_head; + +static inline void touch_nmi_watchdog(void) +{ + atomic_notifier_call_chain(&touch_watchdog_notifier_head, 0, 0); + touch_softlockup_watchdog(); +} + +#endif /* __ASM_ARM_NMI_H_ */ diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 83bbad0..fee2edf 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -51,6 +51,8 @@ unsigned long irq_err_count; +ATOMIC_NOTIFIER_HEAD(touch_watchdog_notifier_head); + int arch_show_interrupts(struct seq_file *p, int prec) { #ifdef CONFIG_FIQ diff --git a/drivers/gpu/pvr/Makefile b/drivers/gpu/pvr/Makefile index 5fa7aa2..ca9d02e 100644 --- a/drivers/gpu/pvr/Makefile +++ b/drivers/gpu/pvr/Makefile @@ -21,8 +21,8 @@ ccflags-y += \ -DPVRSRV_MODNAME="\"pvrsrvkm\"" \ -DPVR_LDM_DRIVER_REGISTRATION_NAME="\"pvrsrvkm\"" \ -DSUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED \ - -DSUPPORT_OMAP_TILER \ -DSUPPORT_LARGE_GENERAL_HEAP \ + -DPVR_NO_OMAP_TIMER \ -Idrivers/gpu/pvr/sgx ccflags-$(CONFIG_PVR_SGXCORE_540) += \ diff --git a/drivers/gpu/pvr/deviceclass.c b/drivers/gpu/pvr/deviceclass.c index 5708603..069f050 100644 --- a/drivers/gpu/pvr/deviceclass.c +++ b/drivers/gpu/pvr/deviceclass.c @@ -1518,6 +1518,8 @@ typedef struct _CALLBACK_DATA_ { IMG_PVOID pvPrivData; IMG_UINT32 ui32PrivDataLength; + IMG_PVOID ppvMemInfos; + IMG_UINT32 ui32NumMemInfos; } CALLBACK_DATA; static IMG_VOID FreePrivateData(IMG_HANDLE hCallbackData) @@ -1525,7 +1527,10 @@ static IMG_VOID FreePrivateData(IMG_HANDLE hCallbackData) CALLBACK_DATA *psCallbackData = hCallbackData; OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psCallbackData->ui32PrivDataLength, - psCallbackData->pvPrivData, IMG_NULL); + psCallbackData->pvPrivData, IMG_NULL); + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(IMG_VOID *) * psCallbackData->ui32NumMemInfos, + psCallbackData->ppvMemInfos, IMG_NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(CALLBACK_DATA), hCallbackData, IMG_NULL); } @@ -1545,10 +1550,11 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, PVRSRV_DISPLAYCLASS_INFO *psDCInfo; PVRSRV_DC_SWAPCHAIN *psSwapChain; PVRSRV_ERROR eError = PVRSRV_OK; + CALLBACK_DATA *psCallbackData; PVRSRV_QUEUE_INFO *psQueue; PVRSRV_COMMAND *psCommand; + IMG_PVOID *ppvMemInfos; SYS_DATA *psSysData; - CALLBACK_DATA *psCallbackData; if(!hDeviceKM || !hSwapChain || !ppsMemInfos || !ppsSyncInfos || ui32NumMemSyncInfos < 1) { @@ -1576,10 +1582,30 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, { return eError; } + psCallbackData->pvPrivData = pvPrivData; psCallbackData->ui32PrivDataLength = ui32PrivDataLength; + if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(IMG_VOID *) * ui32NumMemSyncInfos, + (IMG_VOID **)&ppvMemInfos, IMG_NULL, + "Swap Command Meminfos") != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list")); + psCallbackData->ppvMemInfos = IMG_NULL; + goto Exit; + } + + for(i = 0; i < ui32NumMemSyncInfos; i++) + { + ppvMemInfos[i] = ppsMemInfos[i]; + } + + psCallbackData->ppvMemInfos = ppvMemInfos; + psCallbackData->ui32NumMemInfos = ui32NumMemSyncInfos; + + psQueue = psSwapChain->psQueue; #if !defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED) @@ -1674,21 +1700,7 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, psFlipCmd->pvPrivData = pvPrivData; psFlipCmd->ui32PrivDataLength = ui32PrivDataLength; - - if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(IMG_VOID *) * ui32NumMemSyncInfos, - (IMG_VOID **)&psFlipCmd->ppvMemInfos, IMG_NULL, - "Swap Command Meminfos") != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list")); - goto Exit; - } - - for(i = 0; i < ui32NumMemSyncInfos; i++) - { - psFlipCmd->ppvMemInfos[i] = ppsMemInfos[i]; - } - + psFlipCmd->ppvMemInfos = ppvMemInfos; psFlipCmd->ui32NumMemInfos = ui32NumMemSyncInfos; @@ -1696,12 +1708,9 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to submit command")); - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(IMG_VOID *) * ui32NumMemSyncInfos, - (IMG_VOID *)psFlipCmd->ppvMemInfos, - IMG_NULL); goto Exit; } + psCallbackData = IMG_NULL; @@ -1747,6 +1756,12 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, Exit: if (psCallbackData) { + if(psCallbackData->ppvMemInfos) + { + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(IMG_VOID *) * psCallbackData->ui32NumMemInfos, + psCallbackData->ppvMemInfos, IMG_NULL); + } OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(CALLBACK_DATA), psCallbackData, IMG_NULL); } if(eError == PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE) diff --git a/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c b/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c index f5ecab4..5ccfc04 100644 --- a/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c +++ b/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c @@ -1379,7 +1379,7 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) aui32SyncCountList[DC_FLIP_COMMAND][0] = 0; - aui32SyncCountList[DC_FLIP_COMMAND][1] = 5; + aui32SyncCountList[DC_FLIP_COMMAND][1] = 10; diff --git a/drivers/gpu/pvr/sgxerrata.h b/drivers/gpu/pvr/sgxerrata.h index 1ad1a8a..9463308 100644 --- a/drivers/gpu/pvr/sgxerrata.h +++ b/drivers/gpu/pvr/sgxerrata.h @@ -566,10 +566,6 @@ #else #if SGX_CORE_REV == 112 #define FIX_HW_BRN_31272 - #define FIX_HW_BRN_31780 - #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) - #define FIX_HW_BRN_33657 - #endif #define FIX_HW_BRN_33920 #else #if SGX_CORE_REV == 114 diff --git a/drivers/gpu/pvr/sgxfeaturedefs.h b/drivers/gpu/pvr/sgxfeaturedefs.h index 593176f..bdf36fe 100644 --- a/drivers/gpu/pvr/sgxfeaturedefs.h +++ b/drivers/gpu/pvr/sgxfeaturedefs.h @@ -137,11 +137,7 @@ #define SGX_FEATURE_MULTI_EVENT_KICK #define SGX_FEATURE_EDM_VERTEX_PDSADDR_FULL_RANGE #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) - #if defined(USE_SGX_CORE_REV_HEAD) - #define SGX_FEATURE_FAST_RENDER_CONTEXT_SWITCH - #endif - #define SGX_FEATURE_SLAVE_VDM_CONTEXT_SWITCH - #define SGX_FEATURE_ISP_CONTEXT_SWITCH_REV_2 + #define SGX_FEATURE_SW_ISP_CONTEXT_SWITCH #endif #else #if defined(SGX554) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index ad89d05..574588b 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -45,6 +45,7 @@ #include <linux/pm_runtime.h> #include <linux/interrupt.h> #include <linux/workqueue.h> +#include <linux/nmi.h> #include <mach/hardware.h> #include <plat/prcm.h> @@ -70,6 +71,7 @@ struct omap_wdt_dev { struct resource *mem; struct miscdevice omap_wdt_miscdev; int irq; + struct notifier_block nb; }; static void omap_wdt_ping(struct omap_wdt_dev *wdev) @@ -319,6 +321,17 @@ static const struct file_operations omap_wdt_fops = { .llseek = no_llseek, }; +static int omap_wdt_nb_func(struct notifier_block *nb, unsigned long val, + void *v) +{ + struct omap_wdt_dev *wdev = container_of(nb, struct omap_wdt_dev, nb); + pm_runtime_get_sync(wdev->dev); + omap_wdt_ping(wdev); + pm_runtime_put_sync_suspend(wdev->dev); + + return NOTIFY_OK; +} + static int __devinit omap_wdt_probe(struct platform_device *pdev) { struct resource *res, *mem, *res_irq; @@ -397,8 +410,12 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) omap_wdt_dev = pdev; - if (kernelpet && wdev->irq) + if (kernelpet && wdev->irq) { + wdev->nb.notifier_call = omap_wdt_nb_func; + atomic_notifier_chain_register(&touch_watchdog_notifier_head, + &wdev->nb); return omap_wdt_setup(wdev); + } return 0; @@ -450,6 +467,10 @@ static int __devexit omap_wdt_remove(struct platform_device *pdev) if (wdev->irq) free_irq(wdev->irq, wdev); + if (kernelpet && wdev->irq) + atomic_notifier_chain_unregister(&touch_watchdog_notifier_head, + &wdev->nb); + iounmap(wdev->base); kfree(wdev); |