diff options
author | Xianzhong <xianzhong.li@nxp.com> | 2018-07-18 00:53:11 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2019-02-12 10:32:40 +0800 |
commit | bbf3d583f9cfc51b49919fcb825cabf7d2c9d798 (patch) | |
tree | f917153bf81badfd8a48ecebde643c0411e05790 /drivers/mxc/gpu-viv/hal | |
parent | a2619a1333a0cc948ea589fce690f49eaa5f234f (diff) |
MGS-3904 gpu: integrate vivante 6.2.4.p2 driver
version upgrade from 6.2.4.p1.150331 to 6.2.4.p2.163672
fixed gpu kernel panic for CONFIG_ARM64_SW_TTBR0_PAN,
support frequency query for gpu shader and core.
Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
Diffstat (limited to 'drivers/mxc/gpu-viv/hal')
54 files changed, 1980 insertions, 1171 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c index 5293deaf8b31..618d1d42996c 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c +++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c @@ -2525,7 +2525,7 @@ if (halti5){ vsConstBase = 0xD000; if (halti5) { - index += _State(Context, index, 0x14920 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE); + index += _State(Context, index, 0x14920 >> 2, 0x03012000, 7, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x14940 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x14960 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x14980 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE); diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c index 19373b0e832c..ec9de84de2c4 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c +++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c @@ -1751,7 +1751,9 @@ gckHARDWARE_Construct( 22:22) + 1))))))) << (0 ? 22:22))))); #endif - if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_64K_L2_CACHE) == gcvFALSE) + hardware->hasL2Cache = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_64K_L2_CACHE); + + if (!hardware->hasL2Cache) { gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, @@ -1865,6 +1867,7 @@ gckHARDWARE_Construct( gcmkONERROR(gckOS_AllocateNonPagedMemory( hardware->os, gcvFALSE, + gcvALLOC_FLAG_CONTIGUOUS, &hardware->pagetableArray.size, &hardware->pagetableArray.physical, &hardware->pagetableArray.logical @@ -1875,6 +1878,12 @@ gckHARDWARE_Construct( hardware->pagetableArray.logical, &hardware->pagetableArray.address )); + + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + hardware->os, + hardware->pagetableArray.address, + &hardware->pagetableArray.address + )); } /* Return pointer to the gckHARDWARE object. */ @@ -2966,6 +2975,81 @@ OnError: return status; } +/* Atomic version of Execute, for IRQ routine. */ +static gceSTATUS +gckHARDWARE_AtomicExecute( + IN gckHARDWARE Hardware, + IN gctUINT32 Address, + IN gctSIZE_T Bytes + ) +{ + gctUINT32 control; + + /* Enable all events. */ + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00014, ~0U); + + /* Write address register. */ + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00654, Address); + + /* Build control register. */ + control = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 16:16) - (0 ? 16:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 16:16) - (0 ? + 16:16) + 1))))))) << (0 ? 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? + 16:16) - (0 ? 16:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 16:16) - (0 ? + 16:16) + 1))))))) << (0 ? 16:16))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 15:0) - (0 ? 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? + 15:0))) | (((gctUINT32) ((gctUINT32) ((Bytes + 7) >> 3) & ((gctUINT32) ((((1 ? + 15:0) - (0 ? 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? + 15:0))); + + /* Set big endian */ + if (Hardware->bigEndian) + { + control |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 21:20) - (0 ? 21:20) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 21:20) - (0 ? + 21:20) + 1))))))) << (0 ? 21:20))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ? + 21:20) - (0 ? 21:20) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 21:20) - (0 ? + 21:20) + 1))))))) << (0 ? 21:20))); + } + + /* Make sure writing to command buffer and previous AHB register is done. */ + gckOS_MemoryBarrier(Hardware->os, gcvNULL); + + /* Write control register. */ + switch (Hardware->options.secureMode) + { + case gcvSECURE_NONE: + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00658, control); + break; + case gcvSECURE_IN_NORMAL: + +#if defined(__KERNEL__) + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00658, control); +#endif + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x003A4, control); + + break; +#if gcdENABLE_TRUST_APPLICATION + case gcvSECURE_IN_TA: + /* Send message to TA. */ + gckKERNEL_SecurityStartCommand(Hardware->kernel, Address, (gctUINT32)Bytes); + break; +#endif + default: + break; + } + + /* Increase execute count. */ + Hardware->executeCount++; + + /* Record last execute address. */ + Hardware->lastExecuteAddress = Address; + + /* Success. */ + return gcvSTATUS_OK; +} + /******************************************************************************* ** ** gckHARDWARE_WaitLink @@ -3032,7 +3116,7 @@ gckHARDWARE_WaitLink( gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); gcmkVERIFY_ARGUMENT((Logical != gcvNULL) || (Bytes != gcvNULL)); - useL2 = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_64K_L2_CACHE); + useL2 = Hardware->hasL2Cache; /* Compute number of bytes required. */ if (useL2) @@ -3596,6 +3680,7 @@ gckHARDWARE_Event( { gctPHYS_ADDR_T phys; gckOS_GetPhysicalAddress(Hardware->os, Logical, &phys); + gckOS_CPUPhysicalToGPUPhysical(Hardware->os, phys, &phys); gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%08x: EVENT %d", phys, Event); } @@ -4356,6 +4441,8 @@ gckHARDWARE_ConvertLogical( gcmkONERROR(gckOS_GetPhysicalAddress(Hardware->os, Logical, &physical)); } + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical)); + gcmkSAFECASTPHYSADDRT(address, physical); /* For old MMU, get GPU address according to baseAddress. */ @@ -4390,6 +4477,42 @@ OnError: return status; } +static void +_ResumeWaitLinkFE( + gckHARDWARE Hardware + ) +{ + gctUINT32 resume; + gctUINT32 bytes; + gctUINT32 idle; + + /* Make sure FE is idle. */ + do + { + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00004, + &idle); + } + while (idle != 0x7FFFFFFF); + + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00664, + &resume); + + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00664, + &resume); + + /* Determine the wait-link command size. */ + bytes = Hardware->hasL2Cache ? 24 : 16; + + /* Start Command Parser. */ + gckHARDWARE_AtomicExecute(Hardware, resume, bytes); +} + /******************************************************************************* ** ** gckHARDWARE_Interrupt @@ -4437,11 +4560,15 @@ gckHARDWARE_Interrupt( * That means, only need return ERROR when both FEs reports ERROR. */ /* Read AQIntrAcknowledge register. */ - gcmkONERROR( - gckOS_ReadRegisterEx(Hardware->os, - Hardware->core, - 0x00010, - &data)); + status = gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00010, + &data); + + if (gcmIS_ERROR(status)) + { + goto OnError; + } if (data == 0) { @@ -4453,6 +4580,13 @@ gckHARDWARE_Interrupt( #if gcdINTERRUPT_STATISTIC gckOS_AtomClearMask(Hardware->pendingEvent, data); #endif + if (data & (1 << 29)) + { + /* Event ID 29 is not a normal event, but for invalidating pipe. */ + _ResumeWaitLinkFE(Hardware); + data &= ~(1 << 29); + } + /* Inform gckEVENT of the interrupt. */ status = gckEVENT_Interrupt(eventObj, data); } @@ -4796,6 +4930,8 @@ gckHARDWARE_SetMMU( /* Convert the logical address into physical address. */ gcmkONERROR(gckOS_GetPhysicalAddress(Hardware->os, Logical, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical)); + gcmkSAFECASTPHYSADDRT(address, physical); gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, @@ -4915,6 +5051,9 @@ gckHARDWARE_SetMMU( gcmkONERROR( gckOS_GetPhysicalAddress(Hardware->os, safeLogical, &physical)); + gcmkVERIFY_OK( + gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical)); + address = (gctUINT32)(physical & 0xFFFFFFFF); extSafeAddress = (gctUINT32)(physical >> 32); @@ -5656,10 +5795,15 @@ gckHARDWARE_SetMMUStates( } } + reserveBytes += 8; + /* Convert logical address into physical address. */ gcmkONERROR( gckOS_GetPhysicalAddress(Hardware->os, MtlbAddress, &physical)); + gcmkVERIFY_OK( + gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical)); + config = (gctUINT32)(physical & 0xFFFFFFFF); extMtlb = (gctUINT32)(physical >> 32); @@ -5672,6 +5816,9 @@ gckHARDWARE_SetMMUStates( gcmkONERROR( gckOS_GetPhysicalAddress(Hardware->os, SafeAddress, &physical)); + gcmkVERIFY_OK( + gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical)); + address = (gctUINT32)(physical & 0xFFFFFFFF); extSafeAddress = (gctUINT32)(physical >> 32); @@ -5844,6 +5991,30 @@ gckHARDWARE_SetMMUStates( } } + *buffer++ + = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 31:27) - (0 ? 31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? + 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? + 31:27) - (0 ? 31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? + 31:27) + 1))))))) << (0 ? 31:27))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 15:0) - (0 ? 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? + 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E12) & ((gctUINT32) ((((1 ? 15:0) - (0 ? + 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? + 15:0))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 25:16) - (0 ? 25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? + 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? + 25:16) - (0 ? 25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? + 25:16) + 1))))))) << (0 ? 25:16))); + + *buffer++ + = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? + 16:16) - (0 ? 16:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 16:16) - (0 ? + 16:16) + 1))))))) << (0 ? 16:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? + 16:16) - (0 ? 16:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 16:16) - (0 ? + 16:16) + 1))))))) << (0 ? 16:16))); + do{*buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? @@ -6185,11 +6356,23 @@ gckHARDWARE_ConfigMMU( /* Get physical address of this command buffer segment. */ gcmkONERROR(gckOS_GetPhysicalAddress(Hardware->os, buffer, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + Hardware->os, + physical, + &physical + )); + gcmkSAFECASTPHYSADDRT(address, physical); /* Get physical address of Master TLB. */ gcmkONERROR(gckOS_GetPhysicalAddress(Hardware->os, MtlbLogical, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + Hardware->os, + physical, + &physical + )); + gcmkSAFECASTPHYSADDRT(config, physical); config |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? @@ -12109,11 +12292,19 @@ gckHARDWARE_PrepareFunctions( { gctUINT32 mmuBytes; gctPHYS_ADDR_T physical = 0; + gctUINT32 flags = gcvALLOC_FLAG_CONTIGUOUS; + +#if defined(CONFIG_ZONE_DMA32) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + flags |= gcvALLOC_FLAG_4GB_ADDR; +#endif +#endif /* Allocate mmu command buffer within 32bit space */ gcmkONERROR(gckOS_AllocateNonPagedMemory( os, gcvFALSE, + flags, &Hardware->mmuFuncBytes, &Hardware->mmuFuncPhysical, &Hardware->mmuFuncLogical @@ -12125,9 +12316,16 @@ gckHARDWARE_PrepareFunctions( &physical )); - if (physical & 0xFFFFFFFF00000000ULL) + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + os, + physical, + &physical + )); + + if (!(flags & gcvALLOC_FLAG_4GB_ADDR) && (physical & 0xFFFFFFFF00000000ULL)) { - gcmkFATAL("%s(%d): Command buffer physical address (0x%llx) for MMU setup exceeds 32bits", + gcmkFATAL("%s(%d): Command buffer physical address (0x%llx) for MMU setup exceeds 32bits, " + "please rebuild kernel with CONFIG_ZONE_DMA32=y.", __FUNCTION__, __LINE__, physical); } @@ -12185,6 +12383,7 @@ gckHARDWARE_PrepareFunctions( gcmkONERROR(gckOS_AllocateNonPagedMemory( os, gcvFALSE, + gcvALLOC_FLAG_CONTIGUOUS, &Hardware->auxFuncBytes, &Hardware->auxFuncPhysical, &Hardware->auxFuncLogical @@ -12196,6 +12395,12 @@ gckHARDWARE_PrepareFunctions( &physical )); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + os, + physical, + &physical + )); + gcmkSAFECASTPHYSADDRT(Hardware->auxFuncAddress, physical); gcmkONERROR(gckMMU_FillFlatMapping( @@ -13711,4 +13916,87 @@ gckHARDWARE_DummyDraw( return gcvSTATUS_OK; } +gceSTATUS +gckHARDWARE_EnterQueryClock( + IN gckHARDWARE Hardware, + OUT gctUINT64 *McStart, + OUT gctUINT64 *ShStart + ) +{ + gceSTATUS status; + gctUINT64 mcStart, shStart; + + gcmkONERROR(gckOS_GetTime(&mcStart)); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0)); + + *McStart = mcStart; + + if (Hardware->core <= gcvCORE_3D_MAX) + { + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, 0xFFU << 24)); + + gcmkONERROR(gckOS_GetTime(&shStart)); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, 0x4U << 24)); + + *ShStart = shStart; + } + +OnError: + return status; +} + +gceSTATUS +gckHARDWARE_ExitQueryClock( + IN gckHARDWARE Hardware, + IN gctUINT64 McStart, + IN gctUINT64 ShStart, + OUT gctUINT32 *McClk, + OUT gctUINT32 *ShClk + ) +{ + gceSTATUS status; + gctUINT64 mcEnd, shEnd; + gctUINT32 mcCycle, shCycle; + gctUINT64 mcFreq, shFreq = 0; + + gcmkONERROR(gckOS_GetTime(&mcEnd)); + gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00438, &mcCycle)); + + if (mcCycle == 0) + { + gcmkONERROR(gcvSTATUS_GENERIC_IO); + } + + /* cycle = (gctUINT64)cycle * 1000000 / (end - start); */ + mcFreq = ((gctUINT64)mcCycle * ((1000000U << 12) / (gctUINT32)(mcEnd - McStart))) >> 12; + + *McClk = (gctUINT32)mcFreq; + + if (Hardware->core <= gcvCORE_3D_MAX) + { + gcmkONERROR(gckOS_GetTime(&shEnd)); + gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &shCycle)); + + if (!shCycle) + { + /*TODO: [VIV] Query SH cycle not support for old chips */ + *ShClk = *McClk; + return gcvSTATUS_OK; + } + + if (!ShStart) + { + gcmkONERROR(gcvSTATUS_GENERIC_IO); + } + + shFreq = ((gctUINT64)shCycle * ((1000000U << 12) / (gctUINT32)(shEnd - ShStart))) >> 12; + } + + *ShClk = (gctUINT32)shFreq; + +OnError: + return status; +} + diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h index 5dd2c251c780..e1e7de61df6c 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h +++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h @@ -215,6 +215,9 @@ struct _gckHARDWARE gctUINT32 minFscaleValue; gctUINT waitCount; + gctUINT32 mcClk; + gctUINT32 shClk; + gctPOINTER pendingEvent; /* Function used by gckHARDWARE. */ @@ -238,6 +241,7 @@ struct _gckHARDWARE gctPOINTER featureDatabase; gctBOOL hasAsyncFe; + gctBOOL hasL2Cache; gcsHARDWARE_SIGNATURE signature; @@ -335,6 +339,22 @@ gckHARDWARE_DummyDraw( IN OUT gctUINT32 * Bytes ); +gceSTATUS +gckHARDWARE_EnterQueryClock( + IN gckHARDWARE Hardware, + OUT gctUINT64 *McStart, + OUT gctUINT64 *ShStart + ); + +gceSTATUS +gckHARDWARE_ExitQueryClock( + IN gckHARDWARE Hardware, + IN gctUINT64 McStart, + IN gctUINT64 ShStart, + OUT gctUINT32 *McClk, + OUT gctUINT32 *ShClk + ); + #define gcmkWRITE_MEMORY(logical, data) \ do { \ gcmkVERIFY_OK(gckOS_WriteMemory(os, logical, data)); \ diff --git a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c index a4f7f7f0a8a1..cf007fd2ce5b 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c @@ -1229,6 +1229,8 @@ gckVGHARDWARE_ConvertLogical( )); } + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical)); + gcmkSAFECASTPHYSADDRT(address, physical); /* Return hardware specific address. */ diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c index 2cdc21f92930..ba3347a6cd55 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c @@ -82,6 +82,7 @@ gctCONST_STRING _DispatchText[] = { gcmDEFINE2TEXT(gcvHAL_QUERY_VIDEO_MEMORY), gcmDEFINE2TEXT(gcvHAL_QUERY_CHIP_IDENTITY), + gcmDEFINE2TEXT(gcvHAL_QUERY_CHIP_FREQUENCY), gcmDEFINE2TEXT(gcvHAL_ALLOCATE_NON_PAGED_MEMORY), gcmDEFINE2TEXT(gcvHAL_FREE_NON_PAGED_MEMORY), gcmDEFINE2TEXT(gcvHAL_ALLOCATE_CONTIGUOUS_MEMORY), @@ -303,6 +304,8 @@ _MapCommandBuffer( &physical )); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, physical, &physical)); + gcmkSAFECASTPHYSADDRT(address, physical); gcmkONERROR(gckMMU_FlatMapping(mmu, address, 1)); @@ -850,6 +853,13 @@ gckKERNEL_Destroy( Kernel->monitorTimerStop = gcvTRUE; } + if (Kernel->monitorTimer) + { + /* Stop and destroy monitor timer. */ + gcmkVERIFY_OK(gckOS_StopTimer(Kernel->os, Kernel->monitorTimer)); + gcmkVERIFY_OK(gckOS_DestroyTimer(Kernel->os, Kernel->monitorTimer)); + } + #if gcdENABLE_VG if (Kernel->vg) { @@ -936,12 +946,6 @@ gckKERNEL_Destroy( } #endif - if (Kernel->monitorTimer) - { - gcmkVERIFY_OK(gckOS_StopTimer(Kernel->os, Kernel->monitorTimer)); - gcmkVERIFY_OK(gckOS_DestroyTimer(Kernel->os, Kernel->monitorTimer)); - } - /* Mark the gckKERNEL object as unknown. */ Kernel->object.type = gcvOBJ_UNKNOWN; @@ -1911,6 +1915,93 @@ OnError: return status; } +static gceSTATUS +gckKERNEL_CacheOperation( + IN gckKERNEL Kernel, + IN gctUINT32 ProcessID, + IN gctUINT32 Node, + IN gceCACHEOPERATION Operation, + IN gctPOINTER Logical, + IN gctSIZE_T Bytes + ) +{ + gceSTATUS status; + gckVIDMEM_NODE nodeObject = gcvNULL; + gcuVIDMEM_NODE_PTR node = gcvNULL; + void *memHandle; + + gcmkHEADER_ARG("Kernel=%p pid=%u Node=%u op=%d Logical=%p Bytes=0x%lx", + Kernel, ProcessID, Node, Operation, Logical, Bytes); + + gcmkONERROR(gckVIDMEM_HANDLE_Lookup(Kernel, + ProcessID, + Node, + &nodeObject)); + + node = nodeObject->node; + + if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) + { + static gctBOOL printed; + + if (!printed) + { + printed = gcvTRUE; + gcmkPRINT("[galcore]: %s: Flush Video Memory", __FUNCTION__); + } + + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + } + else + { + memHandle = node->Virtual.physical; + } + + switch (Operation) + { + case gcvCACHE_FLUSH: + /* Clean and invalidate the cache. */ + status = gckOS_CacheFlush(Kernel->os, + ProcessID, + memHandle, + gcvINVALID_PHYSICAL_ADDRESS, + Logical, + Bytes); + break; + case gcvCACHE_CLEAN: + /* Clean the cache. */ + status = gckOS_CacheClean(Kernel->os, + ProcessID, + memHandle, + gcvINVALID_PHYSICAL_ADDRESS, + Logical, + Bytes); + break; + case gcvCACHE_INVALIDATE: + /* Invalidate the cache. */ + status = gckOS_CacheInvalidate(Kernel->os, + ProcessID, + memHandle, + gcvINVALID_PHYSICAL_ADDRESS, + Logical, + Bytes); + break; + + case gcvCACHE_MEMORY_BARRIER: + status = gckOS_MemoryBarrier(Kernel->os, Logical); + break; + + default: + gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); + break; + } + +OnError: + gcmkFOOTER(); + return status; +} + gceSTATUS gckKERNEL_WaitFence( IN gckKERNEL Kernel, @@ -2150,7 +2241,6 @@ gckKERNEL_Dispatch( gcskSECURE_CACHE_PTR cache; gctPOINTER logical; #endif - gctUINT64 paddr = gcvINVALID_ADDRESS; #if !USE_NEW_LINUX_SIGNAL gctSIGNAL signal; #endif @@ -2209,6 +2299,12 @@ gckKERNEL_Dispatch( &Interface->u.QueryChipIdentity)); break; + case gcvHAL_QUERY_CHIP_FREQUENCY: + /* Query chip clock. */ + Interface->u.QueryChipFrequency.mcClk = Kernel->hardware->mcClk; + Interface->u.QueryChipFrequency.shClk = Kernel->hardware->shClk; + break; + case gcvHAL_MAP_MEMORY: physical = gcmINT2PTR(Interface->u.MapMemory.physical); @@ -2254,6 +2350,7 @@ gckKERNEL_Dispatch( gckOS_AllocateNonPagedMemory( Kernel->os, FromUser, + gcvALLOC_FLAG_CONTIGUOUS, &bytes, &physical, &logical)); @@ -2486,11 +2583,10 @@ gckKERNEL_Dispatch( } else { - gctUINT32 i; + gctUINT32 i; + if (Interface->u.Commit.count > 1 && Interface->engine == gcvENGINE_RENDER) { - gctUINT32 i; - for (i = 0; i < Interface->u.Commit.count; i++) { gceHARDWARE_TYPE type = Interface->hardwareType; @@ -2531,7 +2627,6 @@ gckKERNEL_Dispatch( if (Interface->u.Commit.count > 1 && Interface->engine == gcvENGINE_RENDER) { - for (i = 1; i < Interface->u.Commit.count; i++) { gceHARDWARE_TYPE type = Interface->hardwareType; @@ -2568,22 +2663,24 @@ gckKERNEL_Dispatch( } } - for (i = 0; i < Interface->u.Commit.count; i++) { - gceHARDWARE_TYPE type = Interface->hardwareType; - gckKERNEL kernel = Device->map[type].kernels[i]; - - if ((kernel->hardware->options.gpuProfiler == gcvTRUE) && - (kernel->profileEnable == gcvTRUE)) { - gcmkONERROR(gckCOMMAND_Stall(kernel->command, gcvTRUE)); + for (i = 0; i < Interface->u.Commit.count; i++) + { + gceHARDWARE_TYPE type = Interface->hardwareType; + gckKERNEL kernel = Device->map[type].kernels[i]; - if (kernel->command->currContext) { - gcmkONERROR(gckHARDWARE_UpdateContextProfile( - kernel->hardware, - kernel->command->currContext)); - } - } - } + if ((kernel->hardware->options.gpuProfiler == gcvTRUE) && + (kernel->profileEnable == gcvTRUE)) + { + gcmkONERROR(gckCOMMAND_Stall(kernel->command, gcvTRUE)); + if (kernel->command->currContext) + { + gcmkONERROR(gckHARDWARE_UpdateContextProfile( + kernel->hardware, + kernel->command->currContext)); + } + } + } } gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex)); commitMutexAcquired = gcvFALSE; @@ -2913,48 +3010,15 @@ gckKERNEL_Dispatch( break; case gcvHAL_CACHE: - logical = gcmUINT64_TO_PTR(Interface->u.Cache.logical); - bytes = (gctSIZE_T) Interface->u.Cache.bytes; - switch(Interface->u.Cache.operation) - { - case gcvCACHE_FLUSH: - /* Clean and invalidate the cache. */ - status = gckOS_CacheFlush(Kernel->os, - processID, - physical, - paddr, - logical, - bytes); - break; - case gcvCACHE_CLEAN: - /* Clean the cache. */ - status = gckOS_CacheClean(Kernel->os, - processID, - physical, - paddr, - logical, - bytes); - break; - case gcvCACHE_INVALIDATE: - /* Invalidate the cache. */ - status = gckOS_CacheInvalidate(Kernel->os, - processID, - physical, - paddr, - logical, - bytes); - break; - case gcvCACHE_MEMORY_BARRIER: - status = gckOS_MemoryBarrier(Kernel->os, - logical); - break; - default: - status = gcvSTATUS_INVALID_ARGUMENT; - break; - } + gcmkONERROR(gckKERNEL_CacheOperation(Kernel, + processID, + Interface->u.Cache.node, + Interface->u.Cache.operation, + logical, + bytes)); break; case gcvHAL_TIMESTAMP: @@ -3635,6 +3699,8 @@ gckKERNEL_MapLogicalToPhysical( /* Map the logical address to a DMA address. */ gcmkONERROR( gckOS_GetPhysicalAddress(Kernel->os, *Data, &slot->dma)); + + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, slot->dma, &slot->dma)); } /* Move slot to head of list. */ @@ -3743,6 +3809,8 @@ gckKERNEL_MapLogicalToPhysical( /* Map the logical address to a DMA address. */ gcmkONERROR( gckOS_GetPhysicalAddress(Kernel->os, *Data, &slot->dma)); + + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, slot->dma, &slot->dma)); } /* Save time stamp. */ @@ -3798,6 +3866,8 @@ gckKERNEL_MapLogicalToPhysical( gcmkONERROR( gckOS_GetPhysicalAddress(Kernel->os, *Data, &slot->dma)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, slot->dma, &slot->dma)); + if (hash->nextHash != gcvNULL) { gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_KERNEL, @@ -3845,6 +3915,8 @@ gckKERNEL_MapLogicalToPhysical( /* Map the logical address to a DMA address. */ gcmkONERROR( gckOS_GetPhysicalAddress(Kernel->os, *Data, &slot->dma)); + + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, slot->dma, &slot->dma)); } } #endif @@ -4534,6 +4606,7 @@ gckKERNEL_AllocateVirtualMemory( gcmkONERROR(gckOS_AllocateNonPagedMemory( os, InUserSpace, + gcvALLOC_FLAG_CONTIGUOUS, &bytes, &buffer->physical, &logical @@ -5864,6 +5937,7 @@ gckFENCE_Create( gcmkONERROR(gckOS_AllocateNonPagedMemory( Os, gcvFALSE, + gcvALLOC_FLAG_CONTIGUOUS, &pageSize, &fence->physical, &fence->logical @@ -6408,6 +6482,8 @@ gckKERNEL_MapInTrustApplicaiton( logical, &phys )); + + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, phys, &phys)); } phys &= ~pageMask; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h index 9dac34d2fe8f..63a10897636e 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h @@ -60,7 +60,7 @@ #include "gc_hal_kernel_hardware.h" #include "gc_hal_driver.h" #include "gc_hal_kernel_mutex.h" -#include "gc_hal_kernel_metadata.h" +#include "gc_hal_metadata.h" #if gcdENABLE_VG #include "gc_hal_kernel_vg.h" diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c index a9cb300c72e1..5a336cba2ace 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c @@ -148,7 +148,13 @@ _NewQueue( gcmkONERROR(gckOS_GetPhysicalAddress( Command->os, Command->logical, - &physical + &physical + )); + + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + Command->os, + physical, + &physical )); gcmkSAFECASTPHYSADDRT(Command->physical, physical); @@ -602,6 +608,8 @@ _DumpKernelCommandBuffer( gckOS_GetPhysicalAddress(Command->os, entry, &physical); + gckOS_CPUPhysicalToGPUPhysical(Command->os, physical, &physical); + gcmkPRINT("Kernel command buffer %d\n", i); gcmkSAFECASTPHYSADDRT(address, physical); @@ -1132,6 +1140,7 @@ gckCOMMAND_Construct( gcmkONERROR(gckOS_AllocateNonPagedMemory( os, gcvFALSE, + gcvALLOC_FLAG_CONTIGUOUS, &pageSize, &command->queues[i].physical, &command->queues[i].logical @@ -1991,6 +2000,7 @@ gckCOMMAND_Commit( commandBufferLogical, &commandBufferPhysical )); + #else /* Get the physical address. */ gcmkONERROR(gckOS_UserLogicalToPhysical( diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c index 6167212eff38..6c30ceb5027a 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c @@ -1187,6 +1187,8 @@ _AllocateLinear( gcmkERR_BREAK(gckOS_GetPhysicalAddress(Command->os, logical, &paddr)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Command->os, paddr, &paddr)); + gcmkSAFECASTPHYSADDRT(address, paddr); /* Set return values. */ diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c index f526793296d9..77d275056e3e 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c @@ -2031,6 +2031,7 @@ gckOS_DumpBuffer( if (Type != gcvDUMP_BUFFER_FROM_USER) { gcmkVERIFY_OK(gckOS_GetPhysicalAddress(Os, Buffer, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os, physical, &physical)); gcmkSAFECASTPHYSADDRT(address, physical); } else diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c index 03bd3c724232..fb3a99423d7c 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c @@ -2038,62 +2038,6 @@ gckEVENT_Interrupt( IN gctUINT32 Data ) { - gcmkHEADER_ARG("Event=0x%x Data=0x%x", Event, Data); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT); - - if (Data & 0x20000000) - { - gctUINT32 resume; - gctUINT32 bytes; - gctUINT32 idle; - gctUINT32 pageSize = Event->kernel->command->pageSize; - Data &= ~0x20000000; - - { - /* Make sure FE is idle. */ - do - { - gcmkVERIFY_OK(gckOS_ReadRegisterEx( - Event->os, - Event->kernel->core, - 0x4, - &idle)); - } - while (idle != 0x7FFFFFFF); - - gcmkVERIFY_OK(gckOS_ReadRegisterEx( - Event->os, - Event->kernel->core, - 0x664, - &resume)); - - gcmkVERIFY_OK(gckOS_ReadRegisterEx( - Event->os, - Event->kernel->core, - 0x664, - &resume)); - - gcmkVERIFY_OK(gckHARDWARE_WaitLink( - Event->kernel->hardware, - gcvNULL, - ~0U, - resume & (pageSize - 1), - &bytes, - gcvNULL, - gcvNULL - )); - - /* Start Command Parser. */ - gcmkVERIFY_OK(gckHARDWARE_Execute( - Event->kernel->hardware, - resume, - bytes - )); - } - } - /* Combine current interrupt status with pending flags. */ gckOS_AtomSetMask(Event->pending, Data); @@ -2106,16 +2050,17 @@ gckEVENT_Interrupt( { if ((Data & (1 << j))) { - gcmkVERIFY_OK(gckOS_AtomDecrement(Event->os, - Event->interruptCount, - &oldValue)); + gckOS_AtomDecrement( + Event->os, + Event->interruptCount, + &oldValue + ); } } } #endif /* Success. */ - gcmkFOOTER_NO(); return gcvSTATUS_OK; } diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c index d78e78bd698f..95f4b56226fd 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c @@ -638,6 +638,8 @@ _AllocateStlb( gcmkONERROR(gckOS_GetPhysicalAddress(Os, stlb->logical, &stlb->physBase)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os, stlb->physBase, &stlb->physBase)); + #if gcdUSE_MMU_EXCEPTION _FillPageTable(stlb->logical, stlb->size / 4, gcdMMU_STLB_EXCEPTION); #else @@ -910,6 +912,11 @@ _FillFlatMapping( newStlbChunk->logical, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + Mmu->os, + physical, + &physical)); + gcmkSAFECASTPHYSADDRT(newStlbChunk->physBase, physical); if (newStlbChunk->physBase & (gcdMMU_STLB_64K_SIZE - 1)) @@ -1176,6 +1183,10 @@ _SetupDynamicSpace( area->pageTableLogical, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Mmu->os, + physical, + &physical)); + gcmkSAFECASTPHYSADDRT(address, physical); /* Grab the mutex. */ @@ -1438,6 +1449,12 @@ _Construct( &gpuPhysical )); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + mmu->os, + gpuPhysical, + &gpuPhysical + )); + gcmkSAFECASTPHYSADDRT(gpuAddress, gpuPhysical); gcmkONERROR(gckMMU_FlatMapping(mmu, gpuAddress, 1)); @@ -1534,11 +1551,18 @@ _Construct( &mmu->safePageLogical )); - gcmkONERROR(gckOS_GetPhysicalAddress(os, + gcmkONERROR(gckOS_GetPhysicalAddress( + os, mmu->safePageLogical, &gpuPhysical )); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical( + os, + gpuPhysical, + &gpuPhysical + )); + gcmkSAFECASTPHYSADDRT(mmu->safeAddress, gpuPhysical); gckOS_ZeroMemory(mmu->safePageLogical, mmu->safePageSize); diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c index 6c169a2a536a..abf5485052ae 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c @@ -195,6 +195,7 @@ gckKERNEL_SecurityExecute( #if defined(LINUX) gcmkONERROR(gckOS_GetPhysicalAddress(Kernel->os, Buffer, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, physical, &physical)); gcmkSAFECASTPHYSADDRT(address, physical); iface.u.Execute.command_buffer = (gctUINT32 *)address; @@ -236,6 +237,7 @@ gckKERNEL_SecurityMapMemory( #if defined(LINUX) gcmkONERROR(gckOS_GetPhysicalAddress(Kernel->os, PhysicalArray, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, physical, &physical)); gcmkSAFECASTPHYSADDRT(address, physical); iface.u.MapMemory.physicals = (gctUINT32 *)address; #endif diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c index 93a914c9d79a..44a1bb0861eb 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c @@ -326,6 +326,7 @@ gceSTATUS gckVGKERNEL_Dispatch( gcmkERR_BREAK(gckOS_AllocateNonPagedMemory( Kernel->os, gcvTRUE, + gcvALLOC_FLAG_CONTIGUOUS, &bytes, &physical, &logical diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h index be74a97fb36b..19c7cc680a1d 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h @@ -53,7 +53,7 @@ *****************************************************************************/ -/*Auto created on 2018-05-02 10:01*/ +/*Auto created on 2018-05-16 12:13*/ #ifndef _gc_feature_database_h_ #define _gc_feature_database_h_ @@ -8810,8 +8810,8 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x0, /* PatchVersion */ 0x1, /* FormalRelease */ 0x4, /* gcFEATURE_VALUE_Streams */ - 0x20, /* gcFEATURE_VALUE_TempRegisters */ - 0x40, /* gcFEATURE_VALUE_ThreadCount */ + 0x40, /* gcFEATURE_VALUE_TempRegisters */ + 0x80, /* gcFEATURE_VALUE_ThreadCount */ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */ 0x1, /* gcFEATURE_VALUE_NumShaderCores */ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */ @@ -9270,8 +9270,8 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x0, /* PatchVersion */ 0x1, /* FormalRelease */ 0x4, /* gcFEATURE_VALUE_Streams */ - 0x20, /* gcFEATURE_VALUE_TempRegisters */ - 0x40, /* gcFEATURE_VALUE_ThreadCount */ + 0x40, /* gcFEATURE_VALUE_TempRegisters */ + 0x80, /* gcFEATURE_VALUE_ThreadCount */ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */ 0x1, /* gcFEATURE_VALUE_NumShaderCores */ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */ @@ -9730,8 +9730,8 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x4, /* PatchVersion */ 0x1, /* FormalRelease */ 0x4, /* gcFEATURE_VALUE_Streams */ - 0x20, /* gcFEATURE_VALUE_TempRegisters */ - 0x40, /* gcFEATURE_VALUE_ThreadCount */ + 0x40, /* gcFEATURE_VALUE_TempRegisters */ + 0x80, /* gcFEATURE_VALUE_ThreadCount */ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */ 0x1, /* gcFEATURE_VALUE_NumShaderCores */ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */ @@ -10190,8 +10190,8 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x7, /* PatchVersion */ 0x0, /* FormalRelease */ 0x4, /* gcFEATURE_VALUE_Streams */ - 0x20, /* gcFEATURE_VALUE_TempRegisters */ - 0x40, /* gcFEATURE_VALUE_ThreadCount */ + 0x40, /* gcFEATURE_VALUE_TempRegisters */ + 0x80, /* gcFEATURE_VALUE_ThreadCount */ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */ 0x1, /* gcFEATURE_VALUE_NumShaderCores */ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */ @@ -10650,8 +10650,8 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x7, /* PatchVersion */ 0x1, /* FormalRelease */ 0x4, /* gcFEATURE_VALUE_Streams */ - 0x20, /* gcFEATURE_VALUE_TempRegisters */ - 0x40, /* gcFEATURE_VALUE_ThreadCount */ + 0x40, /* gcFEATURE_VALUE_TempRegisters */ + 0x80, /* gcFEATURE_VALUE_ThreadCount */ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */ 0x1, /* gcFEATURE_VALUE_NumShaderCores */ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */ @@ -11110,8 +11110,8 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x9, /* PatchVersion */ 0x1, /* FormalRelease */ 0x4, /* gcFEATURE_VALUE_Streams */ - 0x20, /* gcFEATURE_VALUE_TempRegisters */ - 0x40, /* gcFEATURE_VALUE_ThreadCount */ + 0x40, /* gcFEATURE_VALUE_TempRegisters */ + 0x80, /* gcFEATURE_VALUE_ThreadCount */ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */ 0x1, /* gcFEATURE_VALUE_NumShaderCores */ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */ @@ -49321,7 +49321,7 @@ static gcsFEATURE_DATABASE gChipInfo[] = { 0x100, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */ 0x400, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */ - 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */ + 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */ 0x1, /* gcFEATURE_BIT_REG_FastClear */ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */ @@ -68189,3 +68189,5 @@ gcQueryFeatureDB( return gcvNULL; } #endif /* _gc_feature_database_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h index 6cde22deb38c..3438052dde92 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h @@ -76,18 +76,18 @@ extern "C" { /* Alignment with a non-power of two value. */ #define gcmALIGN_NP2(n, align) \ -( \ +(\ ((n) + (align) - 1) - (((n) + (align) - 1) % (align)) \ ) /* Alignment with a power of two value. */ #define gcmALIGN(n, align) \ -( \ +(\ ((n) + ((align) - 1)) & ~((align) - 1) \ ) #define gcmALIGN_BASE(n, align) \ -( \ +(\ ((n) & ~((align) - 1)) \ ) @@ -96,12 +96,12 @@ extern "C" { \******************************************************************************/ #define gcmSIZEOF(a) \ -( \ +(\ (gctSIZE_T) (sizeof(a)) \ ) #define gcmCOUNTOF(a) \ -( \ +(\ sizeof(a) / sizeof(a[0]) \ ) @@ -118,22 +118,22 @@ extern "C" { gckKERNEL_DeleteName(kernel, gcmALL_TO_UINT32(na)) #define gcmALL_TO_UINT32(t) \ -( \ +(\ (gctUINT32) (gctUINTPTR_T) (t)\ ) #define gcmPTR_TO_UINT64(p) \ -( \ +(\ (gctUINT64) (gctUINTPTR_T) (p)\ ) #define gcmUINT64_TO_PTR(u) \ -( \ +(\ (gctPOINTER) (gctUINTPTR_T) (u)\ ) #define gcmUINT64_TO_TYPE(u, t) \ -( \ +(\ (t) (gctUINTPTR_T) (u)\ ) @@ -457,6 +457,7 @@ gceSTATUS gckOS_AllocateNonPagedMemory( IN gckOS Os, IN gctBOOL InUserSpace, + IN gctUINT32 Flag, IN OUT gctSIZE_T * Bytes, OUT gctPHYS_ADDR * Physical, OUT gctPOINTER * Logical @@ -573,6 +574,20 @@ gckOS_WriteRegisterEx( IN gctUINT32 Data ); +#ifdef __QNXNTO__ +static gcmINLINE gceSTATUS +gckOS_WriteMemory( + IN gckOS Os, + IN gctPOINTER Address, + IN gctUINT32 Data + ) +{ + /* Write memory. */ + *(gctUINT32 *)Address = Data; + return gcvSTATUS_OK; +} + +#else /* Write data to a 32-bit memory location. */ gceSTATUS gckOS_WriteMemory( @@ -580,6 +595,7 @@ gckOS_WriteMemory( IN gctPOINTER Address, IN gctUINT32 Data ); +#endif /* Map physical memory into the process space. */ gceSTATUS @@ -1813,9 +1829,9 @@ gceSTATUS gckKERNEL_QueryVidMemPoolNodes( gckKERNEL Kernel, gcePOOL Pool, - gctUINT32 * TotalSize, /* sum of the sizes of the contiguous blocks (i.e. total memory used at current time) : to be filled by the called function */ - gcsContiguousBlock * MemoryBlocks, /* previously allocated by the calling function : to be filled by the called function */ - gctUINT32 NumMaxBlocks, /* provided by the calling function */ + gctUINT32 * TotalSize, /* sum of the sizes of the contiguous blocks (i.e. total memory used at current time) : to be filled by the called function */ + gcsContiguousBlock * MemoryBlocks, /* previously allocated by the calling function : to be filled by the called function */ + gctUINT32 NumMaxBlocks, /* provided by the calling function */ gctUINT32 * NumBlocks /* actual number of contiguous blocks : to be filled by the called function */ ); @@ -2825,3 +2841,5 @@ gckOS_DumpParam( #endif #endif /* __gc_hal_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h index 3c4897c0cd77..bf7a264e09d2 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h @@ -119,7 +119,7 @@ typedef struct _gcsUSER_MEMORY_DESC * gcsUSER_MEMORY_DESC_PTR; { \ if(Obj->sharedLock != gcvNULL)\ {\ - (gcoOS_AcquireMutex( \ + (gcoOS_AcquireMutex(\ gcvNULL, Obj->sharedLock, gcvINFINITE));\ }\ } @@ -145,85 +145,88 @@ gcsSystemInfo; #if gcdSYNC #define gcPLS_INITIALIZER \ { \ - gcvNULL, /* gcoOS object. */ \ - gcvNULL, /* gcoHAL object. */ \ - 0, /* internalSize */ \ - gcvNULL, /* internalPhysical */ \ - gcvNULL, /* internalLogical */ \ - 0, /* externalSize */ \ - gcvNULL, /* externalPhysical */ \ - gcvNULL, /* externalLogical */ \ - 0, /* contiguousSize */ \ - gcvNULL, /* contiguousPhysical */ \ - gcvNULL, /* contiguousLogical */ \ - gcvNULL, /* eglDisplayInfo */ \ - gcvNULL, /* eglSurfaceInfo */ \ + gcvNULL, /* gcoOS object. */ \ + gcvNULL, /* gcoHAL object. */ \ + 0, /* internalSize */ \ + gcvNULL, /* internalPhysical */ \ + gcvNULL, /* internalLogical */ \ + 0, /* externalSize */ \ + gcvNULL, /* externalPhysical */ \ + gcvNULL, /* externalLogical */ \ + 0, /* contiguousSize */ \ + gcvNULL, /* contiguousPhysical */ \ + gcvNULL, /* contiguousLogical */ \ + gcvNULL, /* eglDisplayInfo */ \ + gcvNULL, /* eglSurfaceInfo */ \ gcvSURF_A8R8G8B8,/* eglConfigFormat */ \ - gcvNULL, /* reference */ \ - 0, /* processID */ \ - 0, /* threadID */ \ - gcvFALSE, /* exiting */ \ - gcvFALSE, /* Special flag for NP2 texture. */ \ - gcvNULL, /* destructor */ \ - gcvNULL, /* accessLock */ \ - gcvNULL, /* GL FE compiler lock*/ \ - gcvNULL, /* CL FE compiler lock*/ \ + gcvNULL, /* reference */ \ + 0, /* processID */ \ + 0, /* threadID */ \ + gcvFALSE, /* exiting */ \ + gcvFALSE, /* Special flag for NP2 texture. */ \ + gcvFALSE, /* device open. */ \ + gcvNULL, /* destructor */ \ + gcvNULL, /* accessLock */ \ + gcvNULL, /* GL FE compiler lock*/ \ + gcvNULL, /* CL FE compiler lock*/ \ gcvPATCH_NOTINIT,/* global patchID */ \ - gcvNULL, /* global fenceID*/ \ + gcvNULL, /* global fenceID*/ \ } #else #define gcPLS_INITIALIZER \ { \ - gcvNULL, /* gcoOS object. */ \ - gcvNULL, /* gcoHAL object. */ \ - 0, /* internalSize */ \ - gcvNULL, /* internalPhysical */ \ - gcvNULL, /* internalLogical */ \ - 0, /* externalSize */ \ - gcvNULL, /* externalPhysical */ \ - gcvNULL, /* externalLogical */ \ - 0, /* contiguousSize */ \ - gcvNULL, /* contiguousPhysical */ \ - gcvNULL, /* contiguousLogical */ \ - gcvNULL, /* eglDisplayInfo */ \ - gcvNULL, /* eglSurfaceInfo */ \ + gcvNULL, /* gcoOS object. */ \ + gcvNULL, /* gcoHAL object. */ \ + 0, /* internalSize */ \ + gcvNULL, /* internalPhysical */ \ + gcvNULL, /* internalLogical */ \ + 0, /* externalSize */ \ + gcvNULL, /* externalPhysical */ \ + gcvNULL, /* externalLogical */ \ + 0, /* contiguousSize */ \ + gcvNULL, /* contiguousPhysical */ \ + gcvNULL, /* contiguousLogical */ \ + gcvNULL, /* eglDisplayInfo */ \ + gcvNULL, /* eglSurfaceInfo */ \ gcvSURF_A8R8G8B8,/* eglConfigFormat */ \ - gcvNULL, /* reference */ \ - 0, /* processID */ \ - 0, /* threadID */ \ - gcvFALSE, /* exiting */ \ - gcvFALSE, /* Special flag for NP2 texture. */ \ - gcvNULL, /* destructor */ \ - gcvNULL, /* accessLock */ \ - gcvNULL, /* GL FE compiler lock*/ \ - gcvNULL, /* CL FE compiler lock*/ \ + gcvNULL, /* reference */ \ + 0, /* processID */ \ + 0, /* threadID */ \ + gcvFALSE, /* exiting */ \ + gcvFALSE, /* Special flag for NP2 texture. */ \ + gcvFALSE, /* device open. */ \ + gcvNULL, /* destructor */ \ + gcvNULL, /* accessLock */ \ + gcvNULL, /* GL FE compiler lock*/ \ + gcvNULL, /* CL FE compiler lock*/ \ gcvPATCH_NOTINIT,/* global patchID */ \ } #endif #else #define gcPLS_INITIALIZER \ { \ - gcvNULL, /* gcoOS object. */ \ - gcvNULL, /* gcoHAL object. */ \ - 0, /* internalSize */ \ - gcvNULL, /* internalPhysical */ \ - gcvNULL, /* internalLogical */ \ - 0, /* externalSize */ \ - gcvNULL, /* externalPhysical */ \ - gcvNULL, /* externalLogical */ \ - 0, /* contiguousSize */ \ - gcvNULL, /* contiguousPhysical */ \ - gcvNULL, /* contiguousLogical */ \ - gcvNULL, /* eglDisplayInfo */ \ - gcvNULL, /* eglSurfaceInfo */ \ + gcvNULL, /* gcoOS object. */ \ + gcvNULL, /* gcoHAL object. */ \ + 0, /* internalSize */ \ + gcvNULL, /* internalPhysical */ \ + gcvNULL, /* internalLogical */ \ + 0, /* externalSize */ \ + gcvNULL, /* externalPhysical */ \ + gcvNULL, /* externalLogical */ \ + 0, /* contiguousSize */ \ + gcvNULL, /* contiguousPhysical */ \ + gcvNULL, /* contiguousLogical */ \ + gcvNULL, /* eglDisplayInfo */ \ + gcvNULL, /* eglSurfaceInfo */ \ gcvSURF_A8R8G8B8,/* eglConfigFormat */ \ - gcvNULL, /* reference */ \ - 0, /* processID */ \ - 0, /* threadID */ \ - gcvFALSE, /* exiting */ \ - gcvFALSE, /* Special flag for NP2 texture. */ \ - gcvNULL, /* destructor */ \ - gcvNULL, /* accessLock */ \ + gcvNULL, /* reference */ \ + 0, /* processID */ \ + 0, /* threadID */ \ + gcvFALSE, /* exiting */ \ + gcvFALSE, /* Special flag for NP2 texture. */ \ + gcvFALSE, /* device open. */ \ + gcvNULL, /* destructor */ \ + gcvNULL, /* accessLock */ \ } #endif @@ -2352,6 +2355,9 @@ typedef struct _gcsSURF_FORMAT_INFO /* sRGB format. */ gctBOOL sRGB; + /* How GPU read from big-endian host memory */ + gceENDIAN_HINT endian; + /* Format components. */ gcuPIXEL_FORMAT_CLASS u; @@ -2440,7 +2446,10 @@ gcoSURF_QueryVidMemNode( IN gcoSURF Surface, OUT gctUINT32 * Node, OUT gcePOOL * Pool, - OUT gctSIZE_T_PTR Bytes + OUT gctSIZE_T_PTR Bytes, + OUT gctUINT32 * TsNode, + OUT gcePOOL * TsPool, + OUT gctSIZE_T_PTR TsBytes ); /* Set the color type of the surface. */ @@ -2946,6 +2955,12 @@ gcoSURF_WrapUserMultiBuffer( OUT gcoSURF * Surface ); +gceSTATUS +gcoSURF_UpdateMetadata( + IN gcoSURF Surface, + IN gctINT TsFD + ); + #define MAX_SURF_MIX_SRC_NUM 64 gceSTATUS gcoSURF_MixSurfacesCPU( @@ -4609,7 +4624,7 @@ gckOS_Verify( gcoOS_Verify(verifyStatus); \ if (verifyStatus != gcvSTATUS_OK) \ { \ - gcmTRACE( \ + gcmTRACE(\ gcvLEVEL_ERROR, \ "gcmVERIFY_OK(%d): function returned %d", \ __LINE__, verifyStatus \ @@ -4624,7 +4639,7 @@ gckOS_Verify( gceSTATUS verifyStatus = func; \ if (verifyStatus != gcvSTATUS_OK) \ { \ - gcmkTRACE( \ + gcmkTRACE(\ gcvLEVEL_ERROR, \ "gcmkVERIFY_OK(%d): function returned %d", \ __LINE__, verifyStatus \ @@ -5137,7 +5152,7 @@ gcoHAL_GetUserDebugOption( CommandBuffer->lastLoadStateCount = Count # define gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address) \ - gcmASSERT( \ + gcmASSERT(\ (gctUINT) (Memory - gcmUINT64_TO_TYPE(CommandBuffer->lastLoadStatePtr, gctUINT32_PTR) - 1) \ == \ (gctUINT) (Address - CommandBuffer->lastLoadStateAddress) \ @@ -5246,7 +5261,7 @@ gcoHAL_GetUserDebugOption( #define gcmBEGINSTATEBUFFER(Hardware, CommandBuffer, StateDelta, Memory, ReserveSize) \ { \ - gcmONERROR(gcoBUFFER_Reserve( \ + gcmONERROR(gcoBUFFER_Reserve(\ Hardware->engine[CurrentEngine].buffer, ReserveSize, gcvTRUE, gcvCOMMAND_3D, &CommandBuffer \ )); \ \ @@ -5261,7 +5276,7 @@ gcoHAL_GetUserDebugOption( { \ gcmENDSECUREUSER(); \ \ - gcmASSERT( \ + gcmASSERT(\ gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT8_PTR) + ReserveSize \ == \ (gctUINT8_PTR) Memory \ @@ -5280,9 +5295,9 @@ gcoHAL_GetUserDebugOption( gcmSTORELOADSTATE(CommandBuffer, Memory, Address, Count); \ \ *Memory++ \ - = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \ - | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, FLOAT, FixedPoint) \ - | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, Count) \ + = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \ + | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, FLOAT, FixedPoint) \ + | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, Count) \ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, ADDRESS, Address); \ \ gcmSKIPSECUREUSER(); \ @@ -5308,7 +5323,7 @@ gcoHAL_GetUserDebugOption( \ *Memory++ = __temp_data32__; \ \ - gcoHARDWARE_UpdateDelta( \ + gcoHARDWARE_UpdateDelta(\ StateDelta, Address, 0, __temp_data32__ \ ); \ \ @@ -5328,7 +5343,7 @@ gcoHAL_GetUserDebugOption( \ *Memory++ = __temp_data32__; \ \ - gcoHARDWARE_UpdateDelta( \ + gcoHARDWARE_UpdateDelta(\ StateDelta, Address, Mask, __temp_data32__ \ ); \ \ @@ -5395,7 +5410,7 @@ gcoHAL_GetUserDebugOption( #define gcmSETSEMASTALLPIPE(StateDelta, CommandBuffer, Memory, Data) \ { \ - gcmSETSINGLECTRLSTATE(StateDelta, CommandBuffer, Memory, gcvFALSE, AQSemaphoreRegAddrs, Data); \ + gcmSETSINGLECTRLSTATE(StateDelta, CommandBuffer, Memory, gcvFALSE, 0x0E02, Data); \ \ *Memory++ = gcmSETFIELDVALUE(0, STALL_COMMAND, OPCODE, STALL); \ \ @@ -5423,8 +5438,8 @@ gcoHAL_GetUserDebugOption( #define gcmSETSTARTDECOMMAND(Memory, Count) \ { \ *Memory++ \ - = gcmSETFIELDVALUE(0, AQ_COMMAND_START_DE_COMMAND, OPCODE, START_DE) \ - | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, COUNT, Count) \ + = gcmSETFIELDVALUE(0, AQ_COMMAND_START_DE_COMMAND, OPCODE, START_DE) \ + | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, COUNT, Count) \ | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, DATA_COUNT, 0); \ \ *Memory++ = 0xDEADDEED; \ @@ -5450,7 +5465,7 @@ gcoHAL_GetUserDebugOption( }\ else \ {\ - gcmONERROR(gcoBUFFER_StartTEMPCMDBUF( \ + gcmONERROR(gcoBUFFER_StartTEMPCMDBUF(\ Hardware->engine[CurrentEngine].buffer, &CommandBuffer \ ));\ \ @@ -5496,7 +5511,7 @@ gcoHAL_GetUserDebugOption( } \ else \ { \ - gcmONERROR(gcoBUFFER_StartTEMPCMDBUF( \ + gcmONERROR(gcoBUFFER_StartTEMPCMDBUF(\ Hardware->engine[CurrentEngine].buffer, &CommandBuffer \ )); \ \ @@ -5514,9 +5529,9 @@ gcoHAL_GetUserDebugOption( gcmASSERT((gctUINT32)Count <= 1024); \ \ *Memory++ \ - = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \ - | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, FLOAT, FixedPoint) \ - | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, Count) \ + = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \ + | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, FLOAT, FixedPoint) \ + | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, Count) \ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, ADDRESS, Address); \ \ gcmSKIPSECUREUSER(); \ @@ -5536,7 +5551,7 @@ gcoHAL_GetUserDebugOption( \ *Memory++ = __temp_data32__; \ \ - gcoHARDWARE_UpdateDelta( \ + gcoHARDWARE_UpdateDelta(\ StateDelta, Address, 0, __temp_data32__ \ ); \ \ @@ -5554,7 +5569,7 @@ gcoHAL_GetUserDebugOption( \ *Memory++ = __temp_data32__; \ \ - gcoHARDWARE_UpdateDelta( \ + gcoHARDWARE_UpdateDelta(\ StateDelta, Address, Mask, __temp_data32__ \ ); \ \ @@ -5617,7 +5632,7 @@ gcoHAL_GetUserDebugOption( #define gcmSETSEMASTALLPIPE_NEW(StateDelta, CommandBuffer, Memory, Data) \ { \ - gcmSETSINGLECTRLSTATE_NEW(StateDelta, CommandBuffer, Memory, gcvFALSE, AQSemaphoreRegAddrs, Data); \ + gcmSETSINGLECTRLSTATE_NEW(StateDelta, CommandBuffer, Memory, gcvFALSE, 0x0E02, Data); \ \ *Memory++ = gcmSETFIELDVALUE(0, STALL_COMMAND, OPCODE, STALL); \ \ @@ -5633,8 +5648,8 @@ gcoHAL_GetUserDebugOption( #define gcmSETSTARTDECOMMAND_NEW(CommandBuffer, Memory, Count) \ { \ *Memory++ \ - = gcmSETFIELDVALUE(0, AQ_COMMAND_START_DE_COMMAND, OPCODE, START_DE) \ - | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, COUNT, Count) \ + = gcmSETFIELDVALUE(0, AQ_COMMAND_START_DE_COMMAND, OPCODE, START_DE) \ + | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, COUNT, Count) \ | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, DATA_COUNT, 0); \ \ *Memory++ = 0xDEADDEED; \ @@ -5751,7 +5766,7 @@ gcoHAL_GetUserDebugOption( #define gcmBEGINSTATEBUFFER_FAST(Hardware, CommandBuffer, Memory, ReserveSize) \ { \ - gcmONERROR(gcoBUFFER_Reserve( \ + gcmONERROR(gcoBUFFER_Reserve(\ Hardware->engine[gcvENGINE_RENDER].buffer, ReserveSize, gcvTRUE, &CommandBuffer \ )); \ \ @@ -5768,7 +5783,7 @@ gcoHAL_GetUserDebugOption( }\ else \ {\ - gcmONERROR(gcoBUFFER_StartTEMPCMDBUF( \ + gcmONERROR(gcoBUFFER_StartTEMPCMDBUF(\ Hardware->engine[gcvENGINE_RENDER].buffer, &CommandBuffer \ ));\ \ @@ -5811,8 +5826,8 @@ gcoHAL_GetUserDebugOption( if (ChipModel == gcv2000 && (ChipRevision == 0x5118 || ChipRevision == 0x5140)) \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 64; \ ConstMax = 320; \ @@ -5820,8 +5835,8 @@ gcoHAL_GetUserDebugOption( else if (NumConstants == 320) \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 64; \ ConstMax = 320; \ @@ -5830,8 +5845,8 @@ gcoHAL_GetUserDebugOption( else if (NumConstants > 256 && ChipModel == gcv1000) \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 64; \ ConstMax = 320; \ @@ -5839,8 +5854,8 @@ gcoHAL_GetUserDebugOption( else if (NumConstants > 256) \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 256; \ ConstMax = 512; \ @@ -5848,8 +5863,8 @@ gcoHAL_GetUserDebugOption( else if (NumConstants == 256) \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 256; \ ConstMax = 512; \ @@ -5857,8 +5872,8 @@ gcoHAL_GetUserDebugOption( else \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 168; \ PsConstMax = 64; \ ConstMax = 232; \ @@ -5873,13 +5888,13 @@ gcoHAL_GetUserDebugOption( UnifiedConst = gcvTRUE; \ if (Halti5Avail) \ { \ - VsConstBase = gcregGpipeUniformsRegAddrs; \ - PsConstBase = gcregPixelUniformsRegAddrs; \ + VsConstBase = 0xD000; \ + PsConstBase = 0xD800; \ } \ else \ {\ - VsConstBase = gcregSHUniformsRegAddrs; \ - PsConstBase = gcregSHUniformsRegAddrs; \ + VsConstBase = 0xC000; \ + PsConstBase = 0xC000; \ }\ if ((ChipModel == gcv880) && ((ChipRevision & 0xfff0) == 0x5120)) \ { \ @@ -5899,8 +5914,8 @@ gcoHAL_GetUserDebugOption( if (ChipModel == gcv2000 && (ChipRevision == 0x5118 || ChipRevision == 0x5140)) \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 64; \ ConstMax = 320; \ @@ -5908,8 +5923,8 @@ gcoHAL_GetUserDebugOption( else \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 256; \ PsConstMax = 256; \ ConstMax = 512; \ @@ -5918,8 +5933,8 @@ gcoHAL_GetUserDebugOption( else \ { \ UnifiedConst = gcvFALSE; \ - VsConstBase = AQVertexShaderConstRegAddrs; \ - PsConstBase = AQPixelShaderConstRegAddrs; \ + VsConstBase = 0x1400; \ + PsConstBase = 0x1C00; \ VsConstMax = 168; \ PsConstMax = 64; \ ConstMax = 232; \ @@ -6001,3 +6016,5 @@ gcoHAL_GetUserDebugOption( #endif #endif /* __gc_hal_base_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h index 69ffbc40a2bd..cf5267fa6ae9 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h @@ -86,6 +86,7 @@ typedef enum _gceHAL_COMMAND_CODES /* Generic query. */ gcvHAL_QUERY_VIDEO_MEMORY, gcvHAL_QUERY_CHIP_IDENTITY, + gcvHAL_QUERY_CHIP_FREQUENCY, /* Contiguous memory. */ gcvHAL_ALLOCATE_NON_PAGED_MEMORY, @@ -94,8 +95,8 @@ typedef enum _gceHAL_COMMAND_CODES gcvHAL_FREE_CONTIGUOUS_MEMORY, /* Video memory allocation. */ - gcvHAL_ALLOCATE_VIDEO_MEMORY, /* Enforced alignment. */ - gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY, /* No alignment. */ + gcvHAL_ALLOCATE_VIDEO_MEMORY, /* Enforced alignment. */ + gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY, /* No alignment. */ gcvHAL_RELEASE_VIDEO_MEMORY, /* Physical-to-logical mapping. */ @@ -226,6 +227,7 @@ typedef enum _gceHAL_COMMAND_CODES */ gcvHAL_GET_GRAPHIC_BUFFER_FD, + gcvHAL_SET_VIDEO_MEMORY_METADATA, /* Connect a video node to an OS native fd. */ @@ -455,6 +457,13 @@ typedef struct _gcsHAL_INTERFACE /* gcvHAL_QUERY_CHIP_IDENTITY */ gcsHAL_QUERY_CHIP_IDENTITY QueryChipIdentity; + struct _gcsHAL_QUERY_CHIP_FREQUENCY + { + OUT gctUINT32 mcClk; + OUT gctUINT32 shClk; + } + QueryChipFrequency; + /* gcvHAL_MAP_MEMORY */ struct _gcsHAL_MAP_MEMORY { @@ -1244,6 +1253,7 @@ typedef struct _gcsHAL_INTERFACE } GetGraphicBufferFd; + struct _gcsHAL_VIDEO_MEMORY_METADATA { /* Allocated video memory. */ @@ -1363,3 +1373,5 @@ gcsHAL_INTERFACE; #endif #endif /* __gc_hal_driver_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h index 9dc4afd00e79..4fd5d0121947 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h @@ -298,3 +298,5 @@ gcsTASK_UNMAP_USER_MEMORY; #endif #endif /* __gc_hal_driver_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h index cb59f8194c7f..97ba6f8832f7 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h @@ -52,7 +52,6 @@ * *****************************************************************************/ - #ifndef __VIVNATE_DRM_H__ #define __VIVNATE_DRM_H__ diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h index aad72e789137..b8c9ffab9ad3 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h @@ -121,3 +121,5 @@ gcsDUMP_DATA; #endif /* __gc_hal_dump_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h index 1dbdd4c907bb..7d2a6fa35e25 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h @@ -585,3 +585,5 @@ gcoOS_RSForSwap( #endif /* __gc_hal_eglplatform_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h index a86708e88b72..c35cab5a613b 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h @@ -322,3 +322,5 @@ halDISPLAY_INFO; #endif #endif /* __gc_hal_eglplatform_type_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h index 531cb4cfe364..7a209878f1c1 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h @@ -2968,3 +2968,5 @@ gcoBUFOBJ_Dump( #endif #endif /* __gc_hal_engine_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h index 13c79c557848..9bbbe05f0101 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h @@ -136,33 +136,33 @@ gcePATHTYPE; */ typedef enum _gceVGCMD { - gcvVGCMD_END, /* 0: GCCMD_TS_OPCODE_END */ - gcvVGCMD_CLOSE, /* 1: GCCMD_TS_OPCODE_CLOSE */ - gcvVGCMD_MOVE, /* 2: GCCMD_TS_OPCODE_MOVE */ - gcvVGCMD_MOVE_REL, /* 3: GCCMD_TS_OPCODE_MOVE_REL */ - gcvVGCMD_LINE, /* 4: GCCMD_TS_OPCODE_LINE */ - gcvVGCMD_LINE_REL, /* 5: GCCMD_TS_OPCODE_LINE_REL */ - gcvVGCMD_QUAD, /* 6: GCCMD_TS_OPCODE_QUADRATIC */ - gcvVGCMD_QUAD_REL, /* 7: GCCMD_TS_OPCODE_QUADRATIC_REL */ - gcvVGCMD_CUBIC, /* 8: GCCMD_TS_OPCODE_CUBIC */ - gcvVGCMD_CUBIC_REL, /* 9: GCCMD_TS_OPCODE_CUBIC_REL */ - gcvVGCMD_BREAK, /* 10: GCCMD_TS_OPCODE_BREAK */ - gcvVGCMD_HLINE, /* 11: ******* R E S E R V E D *******/ - gcvVGCMD_HLINE_REL, /* 12: ******* R E S E R V E D *******/ - gcvVGCMD_VLINE, /* 13: ******* R E S E R V E D *******/ - gcvVGCMD_VLINE_REL, /* 14: ******* R E S E R V E D *******/ - gcvVGCMD_SQUAD, /* 15: ******* R E S E R V E D *******/ - gcvVGCMD_SQUAD_REL, /* 16: ******* R E S E R V E D *******/ - gcvVGCMD_SCUBIC, /* 17: ******* R E S E R V E D *******/ - gcvVGCMD_SCUBIC_REL, /* 18: ******* R E S E R V E D *******/ - gcvVGCMD_SCCWARC, /* 19: ******* R E S E R V E D *******/ - gcvVGCMD_SCCWARC_REL, /* 20: ******* R E S E R V E D *******/ - gcvVGCMD_SCWARC, /* 21: ******* R E S E R V E D *******/ - gcvVGCMD_SCWARC_REL, /* 22: ******* R E S E R V E D *******/ - gcvVGCMD_LCCWARC, /* 23: ******* R E S E R V E D *******/ - gcvVGCMD_LCCWARC_REL, /* 24: ******* R E S E R V E D *******/ - gcvVGCMD_LCWARC, /* 25: ******* R E S E R V E D *******/ - gcvVGCMD_LCWARC_REL, /* 26: ******* R E S E R V E D *******/ + gcvVGCMD_END, /* 0: 0x00 */ + gcvVGCMD_CLOSE, /* 1: 0x01 */ + gcvVGCMD_MOVE, /* 2: 0x02 */ + gcvVGCMD_MOVE_REL, /* 3: 0x03 */ + gcvVGCMD_LINE, /* 4: 0x04 */ + gcvVGCMD_LINE_REL, /* 5: 0x05 */ + gcvVGCMD_QUAD, /* 6: 0x06 */ + gcvVGCMD_QUAD_REL, /* 7: 0x07 */ + gcvVGCMD_CUBIC, /* 8: 0x08 */ + gcvVGCMD_CUBIC_REL, /* 9: 0x09 */ + gcvVGCMD_BREAK, /* 10: 0x0A */ + gcvVGCMD_HLINE, /* 11: ******* R E S E R V E D *******/ + gcvVGCMD_HLINE_REL, /* 12: ******* R E S E R V E D *******/ + gcvVGCMD_VLINE, /* 13: ******* R E S E R V E D *******/ + gcvVGCMD_VLINE_REL, /* 14: ******* R E S E R V E D *******/ + gcvVGCMD_SQUAD, /* 15: ******* R E S E R V E D *******/ + gcvVGCMD_SQUAD_REL, /* 16: ******* R E S E R V E D *******/ + gcvVGCMD_SCUBIC, /* 17: ******* R E S E R V E D *******/ + gcvVGCMD_SCUBIC_REL, /* 18: ******* R E S E R V E D *******/ + gcvVGCMD_SCCWARC, /* 19: ******* R E S E R V E D *******/ + gcvVGCMD_SCCWARC_REL, /* 20: ******* R E S E R V E D *******/ + gcvVGCMD_SCWARC, /* 21: ******* R E S E R V E D *******/ + gcvVGCMD_SCWARC_REL, /* 22: ******* R E S E R V E D *******/ + gcvVGCMD_LCCWARC, /* 23: ******* R E S E R V E D *******/ + gcvVGCMD_LCCWARC_REL, /* 24: ******* R E S E R V E D *******/ + gcvVGCMD_LCWARC, /* 25: ******* R E S E R V E D *******/ + gcvVGCMD_LCWARC_REL, /* 26: ******* R E S E R V E D *******/ /* The width of the command recognized by the hardware on bits. */ gcvVGCMD_WIDTH = 5, @@ -171,27 +171,27 @@ typedef enum _gceVGCMD gcvVGCMD_MASK = (1 << gcvVGCMD_WIDTH) - 1, /* Command modifiers. */ - gcvVGCMD_H_MOD = 1 << gcvVGCMD_WIDTH, /* = 32 */ - gcvVGCMD_V_MOD = 2 << gcvVGCMD_WIDTH, /* = 64 */ - gcvVGCMD_S_MOD = 3 << gcvVGCMD_WIDTH, /* = 96 */ - gcvVGCMD_ARC_MOD = 4 << gcvVGCMD_WIDTH, /* = 128 */ + gcvVGCMD_H_MOD = 1 << gcvVGCMD_WIDTH, /* = 32 */ + gcvVGCMD_V_MOD = 2 << gcvVGCMD_WIDTH, /* = 64 */ + gcvVGCMD_S_MOD = 3 << gcvVGCMD_WIDTH, /* = 96 */ + gcvVGCMD_ARC_MOD = 4 << gcvVGCMD_WIDTH, /* = 128 */ /* Emulated LINE commands. */ - gcvVGCMD_HLINE_EMUL = gcvVGCMD_H_MOD | gcvVGCMD_LINE, /* = 36 */ - gcvVGCMD_HLINE_EMUL_REL = gcvVGCMD_H_MOD | gcvVGCMD_LINE_REL, /* = 37 */ - gcvVGCMD_VLINE_EMUL = gcvVGCMD_V_MOD | gcvVGCMD_LINE, /* = 68 */ - gcvVGCMD_VLINE_EMUL_REL = gcvVGCMD_V_MOD | gcvVGCMD_LINE_REL, /* = 69 */ + gcvVGCMD_HLINE_EMUL = gcvVGCMD_H_MOD | gcvVGCMD_LINE, /* = 36 */ + gcvVGCMD_HLINE_EMUL_REL = gcvVGCMD_H_MOD | gcvVGCMD_LINE_REL, /* = 37 */ + gcvVGCMD_VLINE_EMUL = gcvVGCMD_V_MOD | gcvVGCMD_LINE, /* = 68 */ + gcvVGCMD_VLINE_EMUL_REL = gcvVGCMD_V_MOD | gcvVGCMD_LINE_REL, /* = 69 */ /* Emulated SMOOTH commands. */ - gcvVGCMD_SQUAD_EMUL = gcvVGCMD_S_MOD | gcvVGCMD_QUAD, /* = 102 */ - gcvVGCMD_SQUAD_EMUL_REL = gcvVGCMD_S_MOD | gcvVGCMD_QUAD_REL, /* = 103 */ - gcvVGCMD_SCUBIC_EMUL = gcvVGCMD_S_MOD | gcvVGCMD_CUBIC, /* = 104 */ - gcvVGCMD_SCUBIC_EMUL_REL = gcvVGCMD_S_MOD | gcvVGCMD_CUBIC_REL, /* = 105 */ + gcvVGCMD_SQUAD_EMUL = gcvVGCMD_S_MOD | gcvVGCMD_QUAD, /* = 102 */ + gcvVGCMD_SQUAD_EMUL_REL = gcvVGCMD_S_MOD | gcvVGCMD_QUAD_REL, /* = 103 */ + gcvVGCMD_SCUBIC_EMUL = gcvVGCMD_S_MOD | gcvVGCMD_CUBIC, /* = 104 */ + gcvVGCMD_SCUBIC_EMUL_REL = gcvVGCMD_S_MOD | gcvVGCMD_CUBIC_REL, /* = 105 */ /* Emulation ARC commands. */ - gcvVGCMD_ARC_LINE = gcvVGCMD_ARC_MOD | gcvVGCMD_LINE, /* = 132 */ - gcvVGCMD_ARC_LINE_REL = gcvVGCMD_ARC_MOD | gcvVGCMD_LINE_REL, /* = 133 */ - gcvVGCMD_ARC_QUAD = gcvVGCMD_ARC_MOD | gcvVGCMD_QUAD, /* = 134 */ + gcvVGCMD_ARC_LINE = gcvVGCMD_ARC_MOD | gcvVGCMD_LINE, /* = 132 */ + gcvVGCMD_ARC_LINE_REL = gcvVGCMD_ARC_MOD | gcvVGCMD_LINE_REL, /* = 133 */ + gcvVGCMD_ARC_QUAD = gcvVGCMD_ARC_MOD | gcvVGCMD_QUAD, /* = 134 */ gcvVGCMD_ARC_QUAD_REL = gcvVGCMD_ARC_MOD | gcvVGCMD_QUAD_REL /* = 135 */ } gceVGCMD; @@ -774,7 +774,7 @@ gceSTATUS gcoVG_Destroy( IN gcoVG Vg #if gcdGC355_PROFILER - , +, IN gctUINT TreeDepth, IN gctUINT saveLayerTreeDepth, IN gctUINT varTreeDepth @@ -863,7 +863,7 @@ gceSTATUS gcoVG_FlushMask( IN gcoVG Vg #if gcdGC355_PROFILER - , +, IN gctUINT TreeDepth, IN gctUINT saveLayerTreeDepth, IN gctUINT varTreeDepth @@ -1316,3 +1316,5 @@ gcoVG_Resolve( #endif #endif /* __gc_hal_vg_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h index 5b5dfd5d9b71..168594bc1a0c 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h @@ -513,8 +513,9 @@ typedef enum _gceFEATURE gcvFEATURE_FENCE, gcvFEATURE_PE_DEPTH_ONLY_OQFIX, gcvFEATURE_VG_RESOLUTION_8K, - gcvFEATURE_IMAGE_LS_NO_FULLMASK_FIX, + gcvFEATURE_IMAGE_LS_NO_FULLMASK_FIX, gcvFEATURE_PE_TILE_CACHE_FLUSH_FIX, + /* Insert features above this comment only. */ gcvFEATURE_COUNT /* Not a feature. */ } @@ -618,9 +619,9 @@ gceCHIPPOWERSTATE; /* CPU cache operations */ typedef enum _gceCACHEOPERATION { - gcvCACHE_CLEAN = 0x01, /* Flush CPU cache to mem */ - gcvCACHE_INVALIDATE = 0x02, /* Invalidte CPU cache */ - gcvCACHE_FLUSH = gcvCACHE_CLEAN | gcvCACHE_INVALIDATE, /* Both flush & invalidate */ + gcvCACHE_CLEAN = 0x01, /* Flush CPU cache to mem */ + gcvCACHE_INVALIDATE = 0x02, /* Invalidte CPU cache */ + gcvCACHE_FLUSH = gcvCACHE_CLEAN | gcvCACHE_INVALIDATE, /* Both flush & invalidate */ gcvCACHE_MEMORY_BARRIER = 0x04 } gceCACHEOPERATION; @@ -647,23 +648,24 @@ typedef enum _gceSURF_TYPE gcvSURF_NUM_TYPES, /* Make sure this is the last one! */ /* Combinations. */ + gcvSURF_CMA_LIMIT = 0x80000000, gcvSURF_NO_TILE_STATUS = 0x100, - gcvSURF_NO_VIDMEM = 0x200, /* Used to allocate surfaces with no underlying vidmem node. + gcvSURF_NO_VIDMEM = 0x200, /* Used to allocate surfaces with no underlying vidmem node. In Android, vidmem node is allocated by another process. */ - gcvSURF_CACHEABLE = 0x400, /* Used to allocate a cacheable surface */ - gcvSURF_TILE_RLV_FENCE = 0x800, /* create texture fence as tile */ - gcvSURF_TILE_STATUS_DIRTY = 0x1000, /* Init tile status to all dirty */ + gcvSURF_CACHEABLE = 0x400, /* Used to allocate a cacheable surface */ + gcvSURF_TILE_RLV_FENCE = 0x800, /* create texture fence as tile */ + gcvSURF_TILE_STATUS_DIRTY = 0x1000, /* Init tile status to all dirty */ gcvSURF_LINEAR = 0x2000, - gcvSURF_CREATE_AS_TEXTURE = 0x4000, /* create it as a texture */ - gcvSURF_PROTECTED_CONTENT = 0x8000, /* create it as content protected */ - gcvSURF_CREATE_AS_DISPLAYBUFFER = 0x10000, /*create it as a display buffer surface */ - gcvSURF_CONTIGUOUS = 0x20000, /*create it as contiguous */ - gcvSURF_NO_COMPRESSION = 0x40000, /* Create it as no compression, valid on when it has tile status. */ - gcvSURF_DEC = 0x80000, /* Surface is DEC compressed */ + gcvSURF_CREATE_AS_TEXTURE = 0x4000, /* create it as a texture */ + gcvSURF_PROTECTED_CONTENT = 0x8000, /* create it as content protected */ + gcvSURF_CREATE_AS_DISPLAYBUFFER = 0x10000, /*create it as a display buffer surface */ + gcvSURF_CONTIGUOUS = 0x20000, /*create it as contiguous */ + gcvSURF_NO_COMPRESSION = 0x40000, /* Create it as no compression, valid on when it has tile status. */ + gcvSURF_DEC = 0x80000, /* Surface is DEC compressed */ gcvSURF_NO_HZ = 0x100000, gcvSURF_3D = 0x200000, /* It's 3d surface */ gcvSURF_DMABUF_EXPORTABLE = 0x400000, /* master node can be exported as dma-buf fd */ - gcvSURF_CMA_LIMIT = 0x800000, + gcvSURF_CACHE_MODE_128 = 0x800000, gcvSURF_TEXTURE_LINEAR = gcvSURF_TEXTURE | gcvSURF_LINEAR, @@ -928,6 +930,8 @@ typedef enum _gceSURF_FORMAT gcvSURF_A12L12, gcvSURF_A16L16, + gcvSURF_A8L8_1_A8R8G8B8, + /* Bump formats. */ gcvSURF_L6V5U5 = 1000, gcvSURF_V8U8, @@ -1290,21 +1294,21 @@ typedef enum _gceSURF_BLEND_MODE { /* Porter-Duff blending modes. */ /* Fsrc Fdst */ - gcvBLEND_CLEAR = 0, /* 0 0 */ - gcvBLEND_SRC, /* 1 0 */ - gcvBLEND_DST, /* 0 1 */ - gcvBLEND_SRC_OVER_DST, /* 1 1 - Asrc */ - gcvBLEND_DST_OVER_SRC, /* 1 - Adst 1 */ - gcvBLEND_SRC_IN_DST, /* Adst 0 */ - gcvBLEND_DST_IN_SRC, /* 0 Asrc */ - gcvBLEND_SRC_OUT_DST, /* 1 - Adst 0 */ - gcvBLEND_DST_OUT_SRC, /* 0 1 - Asrc */ - gcvBLEND_SRC_ATOP_DST, /* Adst 1 - Asrc */ - gcvBLEND_DST_ATOP_SRC, /* 1 - Adst Asrc */ - gcvBLEND_SRC_XOR_DST, /* 1 - Adst 1 - Asrc */ + gcvBLEND_CLEAR = 0, /* 0 0 */ + gcvBLEND_SRC, /* 1 0 */ + gcvBLEND_DST, /* 0 1 */ + gcvBLEND_SRC_OVER_DST, /* 1 1 - Asrc */ + gcvBLEND_DST_OVER_SRC, /* 1 - Adst 1 */ + gcvBLEND_SRC_IN_DST, /* Adst 0 */ + gcvBLEND_DST_IN_SRC, /* 0 Asrc */ + gcvBLEND_SRC_OUT_DST, /* 1 - Adst 0 */ + gcvBLEND_DST_OUT_SRC, /* 0 1 - Asrc */ + gcvBLEND_SRC_ATOP_DST, /* Adst 1 - Asrc */ + gcvBLEND_DST_ATOP_SRC, /* 1 - Adst Asrc */ + gcvBLEND_SRC_XOR_DST, /* 1 - Adst 1 - Asrc */ /* Special blending modes. */ - gcvBLEND_SET, /* DST = 1 */ + gcvBLEND_SET, /* DST = 1 */ gcvBLEND_SUB /* DST = DST * (1 - SRC) */ } gceSURF_BLEND_MODE; @@ -1574,21 +1578,22 @@ gceFILTER_PASS_TYPE; /* Endian hints. */ typedef enum _gceENDIAN_HINT { - gcvENDIAN_NO_SWAP = 0, - gcvENDIAN_SWAP_WORD, - gcvENDIAN_SWAP_DWORD + gcvENDIAN_NO_SWAP = 0, + gcvENDIAN_SWAP_WORD = 1, + gcvENDIAN_SWAP_DWORD = 2, + gcvENDIAN_SWAP_QWORD = 3, } gceENDIAN_HINT; /* Tiling modes. */ typedef enum _gceTILING { - gcvINVALIDTILED = 0x0, /* Invalid tiling */ + gcvINVALIDTILED = 0x0, /* Invalid tiling */ /* Tiling basic modes enum'ed in power of 2. */ - gcvLINEAR = 0x1, /* No tiling. */ - gcvTILED = 0x2, /* 4x4 tiling. */ - gcvSUPERTILED = 0x4, /* 64x64 tiling. */ - gcvMINORTILED = 0x8, /* 2x2 tiling. */ + gcvLINEAR = 0x1, /* No tiling. */ + gcvTILED = 0x2, /* 4x4 tiling. */ + gcvSUPERTILED = 0x4, /* 64x64 tiling. */ + gcvMINORTILED = 0x8, /* 2x2 tiling. */ /* Tiling special layouts. */ gcvTILING_SPLIT_BUFFER = 0x10, @@ -2112,6 +2117,8 @@ gceCOMPRESSION_OPTION; /* Can be exported as dmabuf-fd */ #define gcvALLOC_FLAG_DMABUF_EXPORTABLE 0x00000010 +#define gcvALLOC_FLAG_4GB_ADDR 0x00000020 + /* Do not try slow pools (gcvPOOL_VIRTUAL/gcvPOOL_CONTIGUOUS) */ #define gcvALLOC_FLAG_FAST_POOLS 0x00000100 @@ -2177,3 +2184,5 @@ typedef void * gctTHREAD; #endif #endif /* __gc_hal_enum_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h index 51a1d8ddd64d..0adf62fe0f9a 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h @@ -191,7 +191,7 @@ extern "C" { #if USE_LOCAL_MEMORY_POOL #define gcmMEM_DeclareFSMemPool(Type, TypeName, Prefix) \ gceSTATUS \ -Prefix##_Allocate##TypeName( \ +Prefix##_Allocate##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type ** Pointer \ ) \ @@ -200,7 +200,7 @@ Prefix##_Allocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_CAllocate##TypeName( \ +Prefix##_CAllocate##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type ** Pointer \ ) \ @@ -214,7 +214,7 @@ Prefix##_CAllocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName( \ +Prefix##_Free##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type * Pointer \ ) \ @@ -227,7 +227,7 @@ Prefix##_Free##TypeName( \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName##List( \ +Prefix##_Free##TypeName##List(\ gcsMEM_FS_MEM_POOL MemPool, \ Type * FirstPointer, \ Type * LastPointer \ @@ -242,7 +242,7 @@ Prefix##_Free##TypeName##List( \ #define gcmMEM_DeclareVSMemPool(Type, TypeName, Prefix) \ gceSTATUS \ -Prefix##_Allocate##TypeName( \ +Prefix##_Allocate##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Size \ @@ -256,7 +256,7 @@ Prefix##_Allocate##TypeName( \ } \ \ gceSTATUS \ - Prefix##_CAllocate##TypeName( \ + Prefix##_CAllocate##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Size \ @@ -271,7 +271,7 @@ gceSTATUS \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName( \ +Prefix##_Free##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type * Pointer \ ) \ @@ -285,7 +285,7 @@ Prefix##_Free##TypeName( \ #define gcmMEM_DeclareAFSMemPool(Type, TypeName, Prefix) \ gceSTATUS \ -Prefix##_Allocate##TypeName( \ +Prefix##_Allocate##TypeName(\ gcsMEM_AFS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Count \ @@ -299,7 +299,7 @@ Prefix##_Allocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_CAllocate##TypeName( \ +Prefix##_CAllocate##TypeName(\ gcsMEM_AFS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Count \ @@ -314,7 +314,7 @@ Prefix##_CAllocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName( \ +Prefix##_Free##TypeName(\ gcsMEM_AFS_MEM_POOL MemPool, \ Type * Pointer \ ) \ @@ -330,7 +330,7 @@ Prefix##_Free##TypeName( \ #define gcmMEM_DeclareFSMemPool(Type, TypeName, Prefix) \ gceSTATUS \ -Prefix##_Allocate##TypeName( \ +Prefix##_Allocate##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type ** Pointer \ ) \ @@ -345,7 +345,7 @@ Prefix##_Allocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_CAllocate##TypeName( \ +Prefix##_CAllocate##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type ** Pointer \ ) \ @@ -361,7 +361,7 @@ Prefix##_CAllocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName( \ +Prefix##_Free##TypeName(\ gcsMEM_FS_MEM_POOL MemPool, \ Type * Pointer \ ) \ @@ -375,7 +375,7 @@ Prefix##_Free##TypeName( \ #define gcmMEM_DeclareVSMemPool(Type, TypeName, Prefix) \ gceSTATUS \ -Prefix##_Allocate##TypeName( \ +Prefix##_Allocate##TypeName(\ gcsMEM_VS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Size \ @@ -391,7 +391,7 @@ Prefix##_Allocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_CAllocate##TypeName( \ +Prefix##_CAllocate##TypeName(\ gcsMEM_VS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Size \ @@ -408,7 +408,7 @@ Prefix##_CAllocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName( \ +Prefix##_Free##TypeName(\ gcsMEM_VS_MEM_POOL MemPool, \ Type * Pointer \ ) \ @@ -422,7 +422,7 @@ Prefix##_Free##TypeName( \ #define gcmMEM_DeclareAFSMemPool(Type, TypeName, Prefix) \ gceSTATUS \ -Prefix##_Allocate##TypeName( \ +Prefix##_Allocate##TypeName(\ gcsMEM_AFS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Count \ @@ -438,7 +438,7 @@ Prefix##_Allocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_CAllocate##TypeName( \ +Prefix##_CAllocate##TypeName(\ gcsMEM_AFS_MEM_POOL MemPool, \ Type ** Pointer, \ gctUINT Count \ @@ -455,7 +455,7 @@ Prefix##_CAllocate##TypeName( \ } \ \ gceSTATUS \ -Prefix##_Free##TypeName( \ +Prefix##_Free##TypeName(\ gcsMEM_AFS_MEM_POOL MemPool, \ Type * Pointer \ ) \ @@ -562,3 +562,5 @@ gcfMEM_AFSMemPoolFreeANode( #endif /* (gcdENABLE_3D || gcdENABLE_VG) */ #endif /* __gc_hal_mem_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_metadata.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_metadata.h index 55dd82393099..c617e4ff8af7 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_metadata.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_metadata.h @@ -52,6 +52,7 @@ * *****************************************************************************/ + #ifndef __gc_hal_kernel_metadata_h_ #define __gc_hal_kernel_metadata_h_ @@ -59,12 +60,39 @@ extern "C" { #endif -/* Macro to combine four characters into a Charcater Code. */ +/* Macro to combine four characters into a Character Code. */ #define __FOURCC(a, b, c, d) \ ((uint32_t)(a) | ((uint32_t)(b) << 8) | ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) #define VIV_VIDMEM_METADATA_MAGIC __FOURCC('v', 'i', 'v', 'm') +/* Compressed format now was defined same as dec400d, should be general. */ +typedef enum _VIV_COMPRESS_FMT +{ + _VIV_CFMT_ARGB8 = 0, + _VIV_CFMT_XRGB8, + _VIV_CFMT_AYUV, + _VIV_CFMT_UYVY, + _VIV_CFMT_YUY2, + _VIV_CFMT_YUV_ONLY, + _VIV_CFMT_UV_MIX, + _VIV_CFMT_ARGB4, + _VIV_CFMT_XRGB4, + _VIV_CFMT_A1R5G5B5, + _VIV_CFMT_X1R5G5B5, + _VIV_CFMT_R5G6B5, + _VIV_CFMT_Z24S8, + _VIV_CFMT_Z24, + _VIV_CFMT_Z16, + _VIV_CFMT_A2R10G10B10, + _VIV_CFMT_BAYER, + _VIV_CFMT_SIGNED_BAYER, + _VIV_CFMT_VAA16, + _VIV_CFMT_S8, + + _VIV_CFMT_MAX, +} _VIV_COMPRESS_FMT; + /* Metadata for cross-device fd share with additional (ts) info. */ typedef struct _VIV_VIDMEM_METADATA { @@ -86,3 +114,5 @@ typedef struct _VIV_VIDMEM_METADATA #endif #endif /* __gc_hal_kernel_metadata_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h index 4a11200d7fb5..73e98a918685 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h @@ -276,7 +276,7 @@ This define enables the use of VM for gckCommand and fence buffers. # endif /* gcdDEBUG_OPTION_NONE_TEXTURE - When set to 1, the type of texture will be set to AQ_TEXTURE_SAMPLE_MODE_TYPE_NONE. + When set to 1, the type of texture will be set to 0x0. */ #ifndef gcdDEBUG_OPTION_NONE_TEXTURE # define gcdDEBUG_OPTION_NONE_TEXTURE 0 @@ -762,7 +762,7 @@ This define enables the use of VM for gckCommand and fence buffers. /* gcdENABLE_INFINITE_SPEED_HW - enable the Infinte HW , this is for 2D openVG + enable the Infinte HW, this is for 2D openVG */ #ifndef gcdENABLE_INFINITE_SPEED_HW # define gcdENABLE_INFINITE_SPEED_HW 0 @@ -1402,3 +1402,5 @@ VIV:gcdUSE_MMU_EXCEPTION #endif /* __gc_hal_options_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h index 2ee13d972d6f..38f42709fc3e 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h @@ -682,7 +682,7 @@ extern "C" { #endif #if gcdENDIAN_BIG -#define BIG_ENDIAN_TRANS_INT(x) ((gctUINT32)( \ +#define BIG_ENDIAN_TRANS_INT(x) ((gctUINT32)(\ (((gctUINT32)(x) & (gctUINT32)0x000000FFUL) << 24) | \ (((gctUINT32)(x) & (gctUINT32)0x0000FF00UL) << 8) | \ (((gctUINT32)(x) & (gctUINT32)0x00FF0000UL) >> 8) | \ @@ -1171,3 +1171,5 @@ gcoPROFILER_Flush( #endif #endif /* __gc_hal_profiler_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h index 24c260f24cca..df842afcbe61 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h @@ -275,3 +275,5 @@ #endif #endif /* __gc_hal_rename_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_resource.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_resource.h index e8ff2a7b4254..01642229d869 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_resource.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_resource.h @@ -65,3 +65,5 @@ extern "C" { #endif #endif /* __gc_hal_resource_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h index db76826ba637..346dac955c9e 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h @@ -64,11 +64,11 @@ typedef enum kernel_packet_command { KERNEL_START_COMMAND, KERNEL_SUBMIT, - KERNEL_MAP_MEMORY, /* */ + KERNEL_MAP_MEMORY, /* */ KERNEL_UNMAP_MEMORY, - KERNEL_ALLOCATE_SECRUE_MEMORY, /*! Security memory management. */ + KERNEL_ALLOCATE_SECRUE_MEMORY, /*! Security memory management. */ KERNEL_FREE_SECURE_MEMORY, - KERNEL_EXECUTE, /* Execute a command buffer. */ + KERNEL_EXECUTE, /* Execute a command buffer. */ KERNEL_DUMP_MMU_EXCEPTION, KERNEL_HANDLE_MMU_EXCEPTION, KERNEL_READ_MMU_EXCEPTION, @@ -182,3 +182,5 @@ enum { }; #endif + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h index 2c48772ad1b1..94a1d3e674b3 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h @@ -131,3 +131,5 @@ gcfSTATISTICS_DisableDynamicEarlyZ ( #endif /*__gc_hal_statistics_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h index f2d3d2ae7ba9..8d2a4eb94ee4 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h @@ -73,6 +73,7 @@ #include "vadefs.h" #elif defined(__QNXNTO__) #define _QNX_SOURCE +#include <stdlib.h> #include <stdint.h> #include <stddef.h> #else @@ -83,12 +84,10 @@ #endif #ifdef _WIN32 -#pragma warning(disable:4127) /* Conditional expression is constant (do { } - ** while(0)). */ +#pragma warning(disable:4127) /* Conditional expression is constant (do { } while(0)). */ #pragma warning(disable:4100) /* Unreferenced formal parameter. */ #pragma warning(disable:4204) /* Non-constant aggregate initializer (C99). */ -#pragma warning(disable:4131) /* Uses old-style declarator (for Bison and - ** Flex generated files). */ +#pragma warning(disable:4131) /* Uses old-style declarator. */ #pragma warning(disable:4206) /* Translation unit is empty. */ #pragma warning(disable:4214) /* Nonstandard extension used : ** bit field types other than int. */ @@ -148,7 +147,7 @@ extern "C" { #define gcdDEBUG_CODE (1 << 5) #define gcdDEBUG_STACK (1 << 6) -#define gcmIS_DEBUG(flag) ( gcdDEBUG & (flag | gcdDEBUG_ALL) ) +#define gcmIS_DEBUG(flag) (gcdDEBUG & (flag | gcdDEBUG_ALL) ) #ifndef gcdDEBUG #if (defined(DBG) && DBG) || defined(DEBUG) || defined(_DEBUG) @@ -402,7 +401,7 @@ gcs2D_PROFILE; /* Macro to combine four characters into a Charcater Code. */ #define gcmCC(c1, c2, c3, c4) \ -( \ +(\ (char) (c1) \ | \ ((char) (c2) << 8) \ @@ -415,7 +414,7 @@ gcs2D_PROFILE; #define gcmPRINTABLE(c) ((((c) >= ' ') && ((c) <= '}')) ? ((c) != '%' ? (c) : ' ') : ' ') #define gcmCC_PRINT(cc) \ - gcmPRINTABLE((char) ( (cc) & 0xFF)), \ + gcmPRINTABLE((char) ((cc) & 0xFF)), \ gcmPRINTABLE((char) (((cc) >> 8) & 0xFF)), \ gcmPRINTABLE((char) (((cc) >> 16) & 0xFF)), \ gcmPRINTABLE((char) (((cc) >> 24) & 0xFF)) @@ -570,7 +569,7 @@ gceSTATUS; ** field Name of field within register. */ #define gcmFIELDMASK(reg, field) \ -( \ +(\ __gcmALIGN(__gcmMASK(reg##_##field), reg##_##field) \ ) @@ -587,7 +586,7 @@ gceSTATUS; ** field Name of field within register. */ #define gcmGETFIELD(data, reg, field) \ -( \ +(\ ((((gctUINT32) (data)) >> __gcmSTART(reg##_##field)) \ & __gcmMASK(reg##_##field)) \ ) @@ -606,7 +605,7 @@ gceSTATUS; ** value Value for field. */ #define gcmSETFIELD(data, reg, field, value) \ -( \ +(\ (((gctUINT32) (data)) \ & ~__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field)) \ | __gcmALIGN((gctUINT32) (value) \ @@ -628,7 +627,7 @@ gceSTATUS; ** value Name of the value within the field. */ #define gcmSETFIELDVALUE(data, reg, field, value) \ -( \ +(\ (((gctUINT32) (data)) \ & ~__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field)) \ | __gcmALIGN(reg##_##field##_##value \ @@ -647,8 +646,8 @@ gceSTATUS; ** field Name of field within register. */ #define gcmGETMASKEDFIELDMASK(reg, field) \ -( \ - gcmSETFIELD(0, reg, field, ~0U) | \ +(\ + gcmSETFIELD(0, reg, field, ~0U) | \ gcmSETFIELD(0, reg, MASK_ ## field, ~0U) \ ) @@ -665,8 +664,8 @@ gceSTATUS; ** value Value for field. */ #define gcmSETMASKEDFIELD(reg, field, value) \ -( \ - gcmSETFIELD (~0U, reg, field, value) & \ +(\ + gcmSETFIELD (~0U, reg, field, value) & \ gcmSETFIELDVALUE(~0U, reg, MASK_ ## field, ENABLED) \ ) @@ -683,8 +682,8 @@ gceSTATUS; ** value Value for field. */ #define gcmSETMASKEDFIELDVALUE(reg, field, value) \ -( \ - gcmSETFIELDVALUE(~0U, reg, field, value) & \ +(\ + gcmSETFIELDVALUE(~0U, reg, field, value) & \ gcmSETFIELDVALUE(~0U, reg, MASK_ ## field, ENABLED) \ ) @@ -703,7 +702,7 @@ gceSTATUS; ** value Name of the value within the field. */ #define gcmVERIFYFIELDVALUE(data, reg, field, value) \ -( \ +(\ (((gctUINT32) (data)) >> __gcmSTART(reg##_##field) & \ __gcmMASK(reg##_##field)) \ == \ @@ -715,30 +714,30 @@ gceSTATUS; */ #define __gcmSTARTBIT(Field) \ - ( 1 ? Field ) + (1 ? Field ) #define __gcmBITSIZE(Field) \ - ( 0 ? Field ) + (0 ? Field ) #define __gcmBITMASK(Field) \ -( \ +(\ (1 << __gcmBITSIZE(Field)) - 1 \ ) #define gcmGETBITS(Value, Type, Field) \ -( \ - ( ((Type) (Value)) >> __gcmSTARTBIT(Field) ) \ +(\ + (((Type) (Value)) >> __gcmSTARTBIT(Field) ) \ & \ __gcmBITMASK(Field) \ ) #define gcmSETBITS(Value, Type, Field, NewValue) \ -( \ - ( ((Type) (Value)) \ +(\ + (((Type) (Value)) \ & ~(__gcmBITMASK(Field) << __gcmSTARTBIT(Field)) \ ) \ | \ - ( ( ((Type) (NewValue)) \ + ((((Type) (NewValue)) \ & __gcmBITMASK(Field) \ ) << __gcmSTARTBIT(Field) \ ) \ @@ -757,7 +756,7 @@ gceSTATUS; */ #define gcmISINREGRANGE(Address, Name) \ -( \ +(\ ((Address & (~0U << Name ## _LSB)) == (Name ## _Address >> 2)) \ ) @@ -792,12 +791,12 @@ gceSTATUS; ** p Pointer value. */ #define gcmPTR2INT(p) \ -( \ +(\ (gctUINTPTR_T) (p) \ ) #define gcmPTR2INT32(p) \ -( \ +(\ (gctUINT32)(gctUINTPTR_T) (p) \ ) @@ -813,7 +812,7 @@ gceSTATUS; */ #define gcmINT2PTR(i) \ -( \ +(\ (gctPOINTER) (gctUINTPTR_T)(i) \ ) @@ -829,7 +828,7 @@ gceSTATUS; ** field Field name. */ #define gcmOFFSETOF(s, field) \ -( \ +(\ gcmPTR2INT32(& (((struct s *) 0)->field)) \ ) @@ -859,7 +858,7 @@ gceSTATUS; #if defined(__GNUC__) && !defined(__KERNEL__) # define gcmBSWAP32(x) __builtin_bswap32(x) #else -# define gcmBSWAP32(x) ((gctUINT32)( \ +# define gcmBSWAP32(x) ((gctUINT32)(\ (((gctUINT32)(x) & (gctUINT32)0x000000FFUL) << 24) | \ (((gctUINT32)(x) & (gctUINT32)0x0000FF00UL) << 8) | \ (((gctUINT32)(x) & (gctUINT32)0x00FF0000UL) >> 8) | \ @@ -1032,3 +1031,5 @@ gcsLISTHEAD; #endif #endif /* __gc_hal_types_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h index 35d66f6f8ae2..1191597e73f5 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h @@ -62,8 +62,10 @@ #define gcvVERSION_PATCH 4 -#define gcvVERSION_BUILD 150331 +#define gcvVERSION_BUILD 163672 -#define gcvVERSION_STRING "6.2.4.p1.150331" +#define gcvVERSION_STRING "6.2.4.p2.163672" #endif /* __gc_hal_version_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h index 83328c37fce6..12d28b38cc65 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h @@ -121,7 +121,7 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( #define gcmkIS_ERROR(status) (status < 0) #define gcmALIGNDOWN(n, align) \ -( \ +(\ (n) & ~((align) - 1) \ ) @@ -130,7 +130,7 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( #define gcmIS_NAN(x) \ -( \ +(\ ((* (gctUINT32_PTR) &(x)) & 0x7FFFFFFF) == 0x7FFFFFFF \ ) @@ -160,7 +160,7 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( status = Function; \ if (gcmIS_ERROR(status)) \ { \ - gcmTRACE( \ + gcmTRACE(\ gcvLEVEL_ERROR, \ "gcmERR_GOTO: status=%d @ line=%d in function %s.\n", \ status, __LINE__, __FUNCTION__ \ @@ -170,9 +170,9 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( #if gcvDEBUG || gcdFORCE_MESSAGES # define gcmVERIFY_BOOLEAN(Expression) \ - gcmASSERT( \ - ( (Expression) == gcvFALSE ) || \ - ( (Expression) == gcvTRUE ) \ + gcmASSERT(\ + ((Expression) == gcvFALSE ) || \ + ((Expression) == gcvTRUE ) \ ) #else # define gcmVERIFY_BOOLEAN(Expression) @@ -192,7 +192,7 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( ** value Value for field. */ #define gcmVERIFYFIELDFIT(reg, field, value) \ - gcmASSERT( \ + gcmASSERT(\ (value) <= gcmFIELDMAX(reg, field) \ ) /******************************************************************************* @@ -207,9 +207,9 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( ** field Name of field within register. */ #define gcmFIELDMAX(reg, field) \ -( \ +(\ (gctUINT32) \ - ( \ + (\ (__gcmGETSIZE(reg##_##field) == 32) \ ? ~0U \ : (~(~0U << __gcmGETSIZE(reg##_##field))) \ @@ -250,28 +250,28 @@ typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) ( \******************************************************************************/ #define gcmKB2BYTES(Kilobyte) \ -( \ +(\ (Kilobyte) << 10 \ ) #define gcmMB2BYTES(Megabyte) \ -( \ +(\ (Megabyte) << 20 \ ) #define gcmMAT(Matrix, Row, Column) \ -( \ +(\ (Matrix) [(Row) * 3 + (Column)] \ ) #define gcmMAKE2CHAR(Char1, Char2) \ -( \ +(\ ((gctUINT16) (gctUINT8) (Char1) << 0) | \ ((gctUINT16) (gctUINT8) (Char2) << 8) \ ) #define gcmMAKE4CHAR(Char1, Char2, Char3, Char4) \ -( \ +(\ ((gctUINT32)(gctUINT8) (Char1) << 0) | \ ((gctUINT32)(gctUINT8) (Char2) << 8) | \ ((gctUINT32)(gctUINT8) (Char3) << 16) | \ @@ -914,3 +914,5 @@ gckVGMMU_Flush( #endif #endif /* __gc_hal_h_ */ + + diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c index 5aeeaaf3cfcc..bed5f6db0c74 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c @@ -157,6 +157,7 @@ _DmaAlloc( ) { gceSTATUS status; + u32 gfp = GFP_KERNEL | gcdNOWARN; gcsDMA_PRIV_PTR allocatorPriv = (gcsDMA_PRIV_PTR)Allocator->privateData; struct mdl_dma_priv *mdlPriv=gcvNULL; @@ -165,21 +166,29 @@ _DmaAlloc( gcmkHEADER_ARG("Mdl=%p NumPages=0x%zx Flags=0x%x", Mdl, NumPages, Flags); gcmkONERROR(gckOS_Allocate(os, sizeof(struct mdl_dma_priv), (gctPOINTER *)&mdlPriv)); + mdlPriv->kvaddr = gcvNULL; + +#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + if (Flags & gcvALLOC_FLAG_4GB_ADDR) + { + gfp |= __GFP_DMA32; + } +#endif mdlPriv->kvaddr #if defined CONFIG_ARM64 - = dma_alloc_coherent(_GetDevice(os), NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, GFP_KERNEL | gcdNOWARN); + = dma_alloc_coherent(_GetDevice(os), NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, gfp); #elif defined CONFIG_MIPS || defined CONFIG_CPU_CSKYV2 || defined CONFIG_PPC - = dma_alloc_coherent(gcvNULL, NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, GFP_KERNEL | gcdNOWARN); + = dma_alloc_coherent(gcvNULL, NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, gfp); #else - = dma_alloc_writecombine(gcvNULL, NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, GFP_KERNEL | gcdNOWARN); + = dma_alloc_writecombine(gcvNULL, NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, gfp); #endif #ifdef CONFLICT_BETWEEN_BASE_AND_PHYS if ((os->device->baseAddress & 0x80000000) != (mdlPriv->dmaHandle & 0x80000000)) { mdlPriv->dmaHandle = (mdlPriv->dmaHandle & ~0x80000000) - | (os->device->baseAddress & 0x80000000); + | (os->device->baseAddress & 0x80000000); } #endif @@ -243,8 +252,10 @@ _DmaGetSGT( gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) - page = phys_to_page (mdlPriv->dmaHandle); +#if !defined(phys_to_page) + page = virt_to_page(mdlPriv->kvaddr); +#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) + page = phys_to_page(mdlPriv->dmaHandle); #else page = phys_to_page(dma_to_phys(&Allocator->os->device->platform->device->dev, mdlPriv->dmaHandle)); #endif @@ -306,9 +317,10 @@ static gceSTATUS _DmaMmap( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, + IN gctBOOL Cacheable, IN gctSIZE_T skipPages, IN gctSIZE_T numPages, - INOUT struct vm_area_struct *vma + IN struct vm_area_struct *vma ) { struct mdl_dma_priv *mdlPriv = (struct mdl_dma_priv*)Mdl->priv; @@ -325,7 +337,7 @@ _DmaMmap( vma->vm_start, (mdlPriv->dmaHandle >> PAGE_SHIFT) + skipPages, numPages << PAGE_SHIFT, - gcmkNONPAGED_MEMROY_PROT(vma->vm_page_prot)) < 0) + pgprot_writecombine(vma->vm_page_prot)) < 0) #else /* map kernel memory to user space.. */ if (dma_mmap_writecombine(gcvNULL, @@ -352,7 +364,7 @@ static void _DmaUnmapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ) { @@ -363,7 +375,7 @@ _DmaUnmapUser( } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) - if (vm_munmap((unsigned long)Logical, Size) < 0) + if (vm_munmap((unsigned long)MdlMap->vmaAddr, Size) < 0) { gcmkTRACE_ZONE( gcvLEVEL_WARNING, gcvZONE_OS, @@ -373,7 +385,7 @@ _DmaUnmapUser( } #else down_write(¤t->mm->mmap_sem); - if (do_munmap(current->mm, (unsigned long)Logical, Size) < 0) + if (do_munmap(current->mm, (unsigned long)MdlMap->vmaAddr, Size) < 0) { gcmkTRACE_ZONE( gcvLEVEL_WARNING, gcvZONE_OS, @@ -389,8 +401,8 @@ static gceSTATUS _DmaMapUser( gckALLOCATOR Allocator, PLINUX_MDL Mdl, - gctBOOL Cacheable, - OUT gctPOINTER * UserLogical + PLINUX_MDL_MAP MdlMap, + gctBOOL Cacheable ) { gctPOINTER userLogical = gcvNULL; @@ -439,8 +451,6 @@ _DmaMapUser( struct vm_area_struct *vma = find_vma(current->mm, (unsigned long)userLogical); if (vma == gcvNULL) { - up_write(¤t->mm->mmap_sem); - gcmkTRACE_ZONE( gcvLEVEL_INFO, gcvZONE_OS, "%s(%d): find_vma error", @@ -450,9 +460,11 @@ _DmaMapUser( gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES); } - gcmkERR_BREAK(_DmaMmap(Allocator, Mdl, 0, Mdl->numPages, vma)); + gcmkERR_BREAK(_DmaMmap(Allocator, Mdl, Cacheable, 0, Mdl->numPages, vma)); - *UserLogical = userLogical; + MdlMap->vmaAddr = userLogical; + MdlMap->cacheable = gcvFALSE; + MdlMap->vma = vma; } while (gcvFALSE); up_write(¤t->mm->mmap_sem); @@ -498,6 +510,18 @@ _DmaCache( IN gceCACHEOPERATION Operation ) { + switch (Operation) + { + case gcvCACHE_CLEAN: + case gcvCACHE_FLUSH: + _MemoryBarrier(); + break; + case gcvCACHE_INVALIDATE: + break; + default: + return gcvSTATUS_INVALID_ARGUMENT; + } + return gcvSTATUS_OK; } @@ -578,7 +602,12 @@ _DmaAlloctorInit( * DMA allocator is only used for NonPaged memory * when NO_DMA_COHERENT is not defined. */ - allocator->capability = gcvALLOC_FLAG_DMABUF_EXPORTABLE; + allocator->capability = gcvALLOC_FLAG_CONTIGUOUS + | gcvALLOC_FLAG_DMABUF_EXPORTABLE +#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + | gcvALLOC_FLAG_4GB_ADDR +#endif + ; *Allocator = allocator; diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c index d07743be68ba..5f0e7b44948b 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c @@ -74,7 +74,7 @@ typedef struct _gcsDMABUF { struct dma_buf * dmabuf; struct dma_buf_attachment * attachment; - struct sg_table * sgtable; + struct sg_table * sgt; unsigned long * pagearray; int npages; @@ -262,7 +262,7 @@ _DmabufAttach( buf_desc->dmabuf = dmabuf; buf_desc->pagearray = pagearray; buf_desc->attachment = attachment; - buf_desc->sgtable = sgt; + buf_desc->sgt = sgt; /* Record in buffer list to support debugfs. */ buf_desc->npages = npages; @@ -313,7 +313,7 @@ _DmabufFree( list_del(&buf_desc->list); mutex_unlock(&priv->lock); - dma_buf_unmap_attachment(buf_desc->attachment, buf_desc->sgtable, DMA_BIDIRECTIONAL); + dma_buf_unmap_attachment(buf_desc->attachment, buf_desc->sgt, DMA_BIDIRECTIONAL); dma_buf_detach(buf_desc->dmabuf, buf_desc->attachment); @@ -328,12 +328,12 @@ static void _DmabufUnmapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ) { gcsDMABUF *buf_desc = Mdl->priv; - gctINT8_PTR userLogical = Logical; + gctINT8_PTR userLogical = MdlMap->vmaAddr; if (unlikely(current->mm == gcvNULL)) { @@ -341,7 +341,7 @@ _DmabufUnmapUser( return; } - userLogical -= buf_desc->sgtable->sgl->offset; + userLogical -= buf_desc->sgt->sgl->offset; vm_munmap((unsigned long)userLogical, Mdl->numPages << PAGE_SHIFT); } @@ -349,8 +349,8 @@ static gceSTATUS _DmabufMapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctBOOL Cacheable, - OUT gctPOINTER * UserLogical + IN PLINUX_MDL_MAP MdlMap, + IN gctBOOL Cacheable ) { gcsDMABUF *buf_desc = Mdl->priv; @@ -368,7 +368,7 @@ _DmabufMapUser( { gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); } - userLogical += buf_desc->sgtable->sgl->offset; + userLogical += buf_desc->sgt->sgl->offset; /* To make sure the mapping is created. */ if (access_ok(VERIFY_READ, userLogical, 4)) @@ -379,12 +379,13 @@ _DmabufMapUser( (void)mem; } - *UserLogical = (gctPOINTER)userLogical; + MdlMap->vmaAddr = (gctPOINTER)userLogical; + MdlMap->cacheable = Cacheable; OnError: if (gcmIS_ERROR(status) && userLogical) { - _DmabufUnmapUser(Allocator, Mdl, userLogical, Mdl->numPages << PAGE_SHIFT); + _DmabufUnmapUser(Allocator, Mdl, MdlMap, Mdl->numPages << PAGE_SHIFT); } return status; } @@ -422,6 +423,28 @@ _DmabufCache( IN gceCACHEOPERATION Operation ) { + gcsDMABUF *buf_desc = Mdl->priv; + struct sg_table *sgt = buf_desc->sgt; + enum dma_data_direction dir; + + switch (Operation) + { + case gcvCACHE_CLEAN: + dir = DMA_TO_DEVICE; + dma_sync_sg_for_device(galcore_device, sgt->sgl, sgt->nents, dir); + break; + case gcvCACHE_FLUSH: + dir = DMA_BIDIRECTIONAL; + dma_sync_sg_for_device(galcore_device, sgt->sgl, sgt->nents, dir); + break; + case gcvCACHE_INVALIDATE: + dir = DMA_FROM_DEVICE; + dma_sync_sg_for_cpu(galcore_device, sgt->sgl, sgt->nents, dir); + break; + default: + return gcvSTATUS_INVALID_ARGUMENT; + } + return gcvSTATUS_OK; } diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c index 20a163393e34..c76431bf5764 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c @@ -68,31 +68,44 @@ #define gcdDISCRETE_PAGES 0 -struct gfp_priv +struct gfp_alloc { atomic_t low; atomic_t high; }; +#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,24) +struct sg_table +{ + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; +#endif + struct gfp_mdl_priv { + int contiguous; + union { /* Pointer to a array of pages. */ - struct page * contiguousPages; - /* Pointer to a array of pointers to page. */ - struct page ** nonContiguousPages; - }; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) - gctBOOL exact; -#endif - - gctBOOL cacheable; + struct + { + struct page *contiguousPages; + dma_addr_t dma_addr; + int exact; + }; - gcsPLATFORM * platform; + struct + { + /* Pointer to a array of pointers to page. */ + struct page **nonContiguousPages; + struct sg_table sgt; + }; + }; - gctBOOL contiguous; + gcsPLATFORM * platform; }; /******************************************************************************\ @@ -103,7 +116,7 @@ static int gc_usage_show(struct seq_file* m, void* data) { gcsINFO_NODE *node = m->private; gckALLOCATOR Allocator = node->device; - struct gfp_priv *priv = Allocator->privateData; + struct gfp_alloc *priv = Allocator->privateData; long long low = (long long)atomic_read(&priv->low); long long high = (long long)atomic_read(&priv->high); @@ -181,14 +194,12 @@ _NonContiguousFree( static struct page ** _NonContiguousAlloc( - IN gctUINT32 NumPages + IN gctUINT32 NumPages, + IN gctUINT32 Gfp ) { struct page ** pages; struct page *p; -#if gcdDISCRETE_PAGES - struct page *l; -#endif gctINT i, size; gcmkHEADER_ARG("NumPages=%u", NumPages); @@ -220,7 +231,7 @@ _NonContiguousAlloc( for (i = 0; i < NumPages; i++) { - p = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN); + p = alloc_page(Gfp); if (!p) { @@ -235,10 +246,10 @@ _NonContiguousAlloc( if (page_to_pfn(pages[i-1]) == page_to_pfn(p)-1) { /* Replaced page. */ - l = p; + struct page *l = p; /* Allocate a page which is not contiguous to previous one. */ - p = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_NOWARN); + p = alloc_page(Gfp); /* Give replaced page back. */ __free_page(l); @@ -273,33 +284,40 @@ _GFPAlloc( { gceSTATUS status; gctUINT i; + u32 gfp = GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN; gctBOOL contiguous = Flags & gcvALLOC_FLAG_CONTIGUOUS; -#ifdef gcdSYS_FREE_MEMORY_LIMIT - struct sysinfo temsysinfo; -#endif - struct gfp_priv *priv = (struct gfp_priv *)Allocator->privateData; + struct gfp_alloc *priv = (struct gfp_alloc *)Allocator->privateData; struct gfp_mdl_priv *mdlPriv = gcvNULL; + int result; int low = 0; int high = 0; gcmkHEADER_ARG("Allocator=%p Mdl=%p NumPages=%zu Flags=0x%x", Allocator, Mdl, NumPages, Flags); #ifdef gcdSYS_FREE_MEMORY_LIMIT - si_meminfo(&temsysinfo); - if (Flags & gcvALLOC_FLAG_MEMLIMIT) { - if ( (temsysinfo.freeram < NumPages) || ((temsysinfo.freeram-NumPages) < gcdSYS_FREE_MEMORY_LIMIT) ) + struct sysinfo temsysinfo; + si_meminfo(&temsysinfo); + + if ((temsysinfo.freeram < NumPages) || ((temsysinfo.freeram-NumPages) < gcdSYS_FREE_MEMORY_LIMIT)) { gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } } #endif - gcmkONERROR(gckOS_Allocate(Allocator->os, sizeof(struct gfp_mdl_priv), (gctPOINTER *)&mdlPriv)); + mdlPriv = kzalloc(sizeof(struct gfp_mdl_priv), GFP_KERNEL | __GFP_NORETRY); - memset(mdlPriv, 0, sizeof(struct gfp_mdl_priv)); +#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + if (Flags & gcvALLOC_FLAG_4GB_ADDR) + { + /* remove __GFP_HIGHMEM bit, add __GFP_DMA32 bit */ + gfp &= ~__GFP_HIGHMEM; + gfp |= __GFP_DMA32; + } +#endif if (contiguous) { @@ -308,11 +326,14 @@ _GFPAlloc( #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) void *addr = NULL; - addr = alloc_pages_exact(bytes, GFP_KERNEL | gcdNOWARN | __GFP_NORETRY); + addr = alloc_pages_exact(bytes, (gfp & ~__GFP_HIGHMEM) | __GFP_NORETRY); mdlPriv->contiguousPages = addr ? virt_to_page(addr) : gcvNULL; - mdlPriv->exact = gcvTRUE; + if (mdlPriv->contiguousPages) + { + mdlPriv->exact = gcvTRUE; + } #endif if (mdlPriv->contiguousPages == gcvNULL) @@ -325,12 +346,8 @@ _GFPAlloc( goto OnError; } - mdlPriv->contiguousPages = - alloc_pages(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN, order); + mdlPriv->contiguousPages = alloc_pages(gfp, order); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) - mdlPriv->exact = gcvFALSE; -#endif } if (mdlPriv->contiguousPages == gcvNULL) @@ -338,6 +355,26 @@ _GFPAlloc( gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } + mdlPriv->dma_addr = dma_map_page(galcore_device, + mdlPriv->contiguousPages, 0, NumPages * PAGE_SIZE, + DMA_TO_DEVICE); + + if (!mdlPriv->dma_addr) + { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) + if (mdlPriv->exact) + { + free_pages_exact(page_address(mdlPriv->contiguousPages), bytes); + } + else +#endif + { + __free_pages(mdlPriv->contiguousPages, get_order(bytes)); + } + + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + #if defined(CONFIG_X86) if (!PageHighMem(mdlPriv->contiguousPages)) { @@ -350,13 +387,48 @@ _GFPAlloc( } else { - mdlPriv->nonContiguousPages = _NonContiguousAlloc(NumPages); + mdlPriv->nonContiguousPages = _NonContiguousAlloc(NumPages, gfp); if (mdlPriv->nonContiguousPages == gcvNULL) { gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \ + && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN)) + result = sg_alloc_table_from_pages(&mdlPriv->sgt, + mdlPriv->nonContiguousPages, NumPages, 0, + NumPages << PAGE_SHIFT, GFP_KERNEL); + +#else + result = alloc_sg_list_from_pages(&mdlPriv->sgt.sgl, + mdlPriv->nonContiguousPages, NumPages, 0, + NumPages << PAGE_SHIFT, &mdlPriv->sgt.nents); + + mdlPriv->sgt.orig_nents = mdlPriv->sgt.nents; +#endif + if (result < 0) + { + _NonContiguousFree(mdlPriv->nonContiguousPages, NumPages); + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + + result = dma_map_sg(galcore_device, + mdlPriv->sgt.sgl, mdlPriv->sgt.nents, DMA_TO_DEVICE); + + if (result != mdlPriv->sgt.nents) + { + _NonContiguousFree(mdlPriv->nonContiguousPages, NumPages); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \ + && (defined (ARCH_HAS_SG_CHAIN) || defined (CONFIG_ARCH_HAS_SG_CHAIN)) + sg_free_table(&mdlPriv->sgt); +#else + kfree(mdlPriv->sgt.sgl); +#endif + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + #if defined(CONFIG_X86) if (set_pages_array_wc(mdlPriv->nonContiguousPages, NumPages)) { @@ -387,28 +459,10 @@ _GFPAlloc( if (PageHighMem(page)) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) - void *vaddr = kmap_atomic(page); -#else - void *vaddr = kmap_atomic(page, KM_USER0); -#endif - - gcmkVERIFY_OK(gckOS_CacheFlush( - Allocator->os, _GetProcessID(), gcvNULL, phys, vaddr, PAGE_SIZE - )); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) - kunmap_atomic(vaddr); -#else - kunmap_atomic(vaddr, KM_USER0); -#endif high++; } else { - gcmkVERIFY_OK(gckOS_CacheFlush( - Allocator->os, _GetProcessID(), gcvNULL, phys, page_address(page), PAGE_SIZE - )); low++; } } @@ -426,7 +480,7 @@ _GFPAlloc( OnError: if (mdlPriv) { - gcmkOS_SAFE_FREE(Allocator->os, mdlPriv); + kfree(mdlPriv); } gcmkFOOTER(); @@ -512,11 +566,29 @@ _GFPFree( { gctINT i; struct page * page; - struct gfp_priv *priv = (struct gfp_priv *)Allocator->privateData; + struct gfp_alloc *priv = (struct gfp_alloc *)Allocator->privateData; struct gfp_mdl_priv *mdlPriv = Mdl->priv; int low = 0; int high = 0; + if (Mdl->contiguous) + { + dma_unmap_page(galcore_device, mdlPriv->dma_addr, + Mdl->numPages << PAGE_SHIFT, DMA_TO_DEVICE); + } + else + { + dma_unmap_sg(galcore_device, mdlPriv->sgt.sgl, mdlPriv->sgt.nents, + DMA_TO_DEVICE); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \ + && (defined (ARCH_HAS_SG_CHAIN) || defined (CONFIG_ARCH_HAS_SG_CHAIN)) + sg_free_table(&mdlPriv->sgt); +#else + kfree(mdlPriv->sgt.sgl); +#endif + } + for (i = 0; i < Mdl->numPages; i++) { if (Mdl->contiguous) @@ -572,16 +644,17 @@ _GFPFree( _NonContiguousFree(mdlPriv->nonContiguousPages, Mdl->numPages); } - gcmkOS_SAFE_FREE(Allocator->os, Mdl->priv); + kfree(Mdl->priv); } static gceSTATUS _GFPMmap( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, + IN gctBOOL Cacheable, IN gctSIZE_T skipPages, IN gctSIZE_T numPages, - INOUT struct vm_area_struct *vma + IN struct vm_area_struct *vma ) { struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv; @@ -591,7 +664,8 @@ _GFPMmap( gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma); vma->vm_flags |= gcdVM_FLAGS; - if (mdlPriv->cacheable == gcvFALSE) + + if (Cacheable == gcvFALSE) { vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); } @@ -659,13 +733,11 @@ static void _GFPUnmapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ) { - struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv; - - mdlPriv->cacheable = gcvFALSE; + MdlMap->cacheable = gcvFALSE; if (unlikely(current->mm == gcvNULL)) { @@ -674,7 +746,7 @@ _GFPUnmapUser( } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) - if (vm_munmap((unsigned long)Logical, Size) < 0) + if (vm_munmap((unsigned long)MdlMap->vmaAddr, Size) < 0) { gcmkTRACE_ZONE( gcvLEVEL_WARNING, gcvZONE_OS, @@ -684,7 +756,7 @@ _GFPUnmapUser( } #else down_write(¤t->mm->mmap_sem); - if (do_munmap(current->mm, (unsigned long)Logical, Size) < 0) + if (do_munmap(current->mm, (unsigned long)MdlMap->vmaAddr, Size) < 0) { gcmkTRACE_ZONE( gcvLEVEL_WARNING, gcvZONE_OS, @@ -694,14 +766,16 @@ _GFPUnmapUser( } up_write(¤t->mm->mmap_sem); #endif + + MdlMap->vma = NULL; } static gceSTATUS _GFPMapUser( gckALLOCATOR Allocator, PLINUX_MDL Mdl, - gctBOOL Cacheable, - OUT gctPOINTER * UserLogical + PLINUX_MDL_MAP MdlMap, + gctBOOL Cacheable ) { gctPOINTER userLogical = gcvNULL; @@ -751,7 +825,6 @@ _GFPMapUser( down_write(¤t->mm->mmap_sem); do { - struct gfp_mdl_priv *mdlPriv = (struct gfp_mdl_priv*)Mdl->priv; struct vm_area_struct *vma = find_vma(current->mm, (unsigned long)userLogical); if (vma == gcvNULL) @@ -765,25 +838,16 @@ _GFPMapUser( gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES); } - /* mdlPriv->cacheable must be used under protection of mdl->mapMutex. */ - mdlPriv->cacheable = Cacheable; - gcmkERR_BREAK(_GFPMmap(Allocator, Mdl, 0, Mdl->numPages, vma)); + gcmkERR_BREAK(_GFPMmap(Allocator, Mdl, Cacheable, 0, Mdl->numPages, vma)); + MdlMap->vma = vma; } while (gcvFALSE); up_write(¤t->mm->mmap_sem); if (gcmIS_SUCCESS(status)) { - gcmkONERROR(gckOS_CacheFlush( - Allocator->os, - _GetProcessID(), - Mdl, - gcvINVALID_ADDRESS, - userLogical, - Mdl->numPages * PAGE_SIZE - )); - - *UserLogical = userLogical; + MdlMap->vmaAddr = userLogical; + MdlMap->cacheable = Cacheable; } OnError: @@ -891,6 +955,60 @@ _GFPCache( IN gceCACHEOPERATION Operation ) { + struct gfp_mdl_priv *mdlPriv = Mdl->priv; + enum dma_data_direction dir; + + switch (Operation) + { + case gcvCACHE_CLEAN: + dir = DMA_TO_DEVICE; + + if (mdlPriv->contiguous) + { + dma_sync_single_for_device(galcore_device, + mdlPriv->dma_addr, Mdl->numPages << PAGE_SHIFT, dir); + } + else + { + dma_sync_sg_for_device(galcore_device, + mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir); + } + + break; + case gcvCACHE_FLUSH: + dir = DMA_BIDIRECTIONAL; + + if (mdlPriv->contiguous) + { + dma_sync_single_for_device(galcore_device, + mdlPriv->dma_addr, Mdl->numPages << PAGE_SHIFT, dir); + } + else + { + dma_sync_sg_for_device(galcore_device, + mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir); + } + + break; + case gcvCACHE_INVALIDATE: + dir = DMA_FROM_DEVICE; + + if (mdlPriv->contiguous) + { + dma_sync_single_for_cpu(galcore_device, + mdlPriv->dma_addr, Mdl->numPages << PAGE_SHIFT, dir); + } + else + { + dma_sync_sg_for_cpu(galcore_device, + mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir); + } + + break; + default: + return gcvSTATUS_INVALID_ARGUMENT; + } + return gcvSTATUS_OK; } @@ -959,12 +1077,12 @@ _GFPAlloctorInit( { gceSTATUS status; gckALLOCATOR allocator = gcvNULL; - struct gfp_priv *priv = gcvNULL; + struct gfp_alloc *priv = gcvNULL; gcmkONERROR( gckALLOCATOR_Construct(Os, &GFPAllocatorOperations, &allocator)); - priv = kzalloc(sizeof(struct gfp_priv), GFP_KERNEL | gcdNOWARN); + priv = kzalloc(sizeof(struct gfp_alloc), GFP_KERNEL | gcdNOWARN); if (!priv) { @@ -986,6 +1104,9 @@ _GFPAlloctorInit( | gcvALLOC_FLAG_MEMLIMIT | gcvALLOC_FLAG_ALLOC_ON_FAULT | gcvALLOC_FLAG_DMABUF_EXPORTABLE +#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + | gcvALLOC_FLAG_4GB_ADDR +#endif ; #if defined(gcdEMULATE_SECURE_ALLOCATOR) diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c index 52518c12a2a8..a39042fa5462 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c @@ -216,9 +216,10 @@ static gceSTATUS reserved_mem_mmap( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, + IN gctBOOL Cacheable, IN gctSIZE_T skipPages, IN gctSIZE_T numPages, - INOUT struct vm_area_struct *vma + IN struct vm_area_struct *vma ) { struct reserved_mem *res = (struct reserved_mem*)Mdl->priv; @@ -255,7 +256,7 @@ static void reserved_mem_unmap_user( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ) { @@ -263,13 +264,13 @@ reserved_mem_unmap_user( return; #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) - if (vm_munmap((unsigned long)Logical, (unsigned long)Size) < 0) + if (vm_munmap((unsigned long)MdlMap->vmaAddr, (unsigned long)Size) < 0) { printk("%s: vm_munmap failed\n", __func__); } #else down_write(¤t->mm->mmap_sem); - if (do_munmap(current->mm, (unsigned long)Logical, (unsigned long)Size) < 0) + if (do_munmap(current->mm, (unsigned long)MdlMap->vmaAddr, (unsigned long)Size) < 0) { printk("%s: do_munmap failed\n", __func__); } @@ -281,8 +282,8 @@ static gceSTATUS reserved_mem_map_user( gckALLOCATOR Allocator, PLINUX_MDL Mdl, - gctBOOL Cacheable, - OUT gctPOINTER *UserLogical + PLINUX_MDL_MAP MdlMap, + gctBOOL Cacheable ) { struct reserved_mem *res = (struct reserved_mem*)Mdl->priv; @@ -333,9 +334,11 @@ reserved_mem_map_user( gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES); } - gcmkERR_BREAK(reserved_mem_mmap(Allocator, Mdl, 0, Mdl->numPages, vma)); + gcmkERR_BREAK(reserved_mem_mmap(Allocator, Mdl, gcvFALSE, 0, Mdl->numPages, vma)); - *UserLogical = userLogical; + MdlMap->vmaAddr = userLogical; + MdlMap->cacheable = gcvFALSE; + MdlMap->vma = vma; } while (gcvFALSE); up_write(¤t->mm->mmap_sem); @@ -359,6 +362,7 @@ reserved_mem_map_kernel( struct reserved_mem *res = Mdl->priv; void *vaddr; + /* Should never run here now. */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) vaddr = memremap(res->start, res->size, MEMREMAP_WC); #elif LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0) @@ -401,6 +405,19 @@ reserved_mem_cache_op( IN gceCACHEOPERATION Operation ) { + /* Always WC or UC, safe to use mb. */ + switch (Operation) + { + case gcvCACHE_CLEAN: + case gcvCACHE_FLUSH: + _MemoryBarrier(); + break; + case gcvCACHE_INVALIDATE: + break; + default: + return gcvSTATUS_INVALID_ARGUMENT; + } + return gcvSTATUS_OK; } diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c index 690d2027b8ff..223533df8628 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c @@ -55,6 +55,7 @@ #include "gc_hal_kernel_linux.h" #include "gc_hal_kernel_allocator.h" +#include <linux/scatterlist.h> #include <linux/slab.h> #include <linux/pagemap.h> @@ -68,6 +69,15 @@ enum um_desc_type UM_PFN_MAP, }; +#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,24) +struct sg_table +{ + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; +#endif + /* Descriptor of a user memory imported. */ struct um_desc { @@ -79,7 +89,11 @@ struct um_desc unsigned long physical; /* UM_PAGE_MAP. */ - struct page **pages; + struct + { + struct page **pages; + struct sg_table sgt; + }; /* UM_PFN_MAP. */ struct @@ -92,6 +106,7 @@ struct um_desc /* contiguous chunks, does not include padding pages. */ int chunk_count; + unsigned long vm_flags; unsigned long user_vaddr; size_t size; unsigned long offset; @@ -109,7 +124,7 @@ static int import_physical_map(struct um_desc *um, unsigned long phys) } static int import_page_map(struct um_desc *um, - unsigned long addr, size_t page_count) + unsigned long addr, size_t page_count, size_t size) { int i; int result; @@ -162,10 +177,48 @@ static int import_page_map(struct um_desc *um, } } +#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \ + && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN)) + result = sg_alloc_table_from_pages(&um->sgt, pages, page_count, + addr & ~PAGE_MASK, size, GFP_KERNEL | gcdNOWARN); + +#else + result = alloc_sg_list_from_pages(&um->sgt.sgl, pages, page_count, + addr & ~PAGE_MASK, size, &um->sgt.nents); + + um->sgt.orig_nents = um->sgt.nents; +#endif + if (unlikely(result < 0)) + { + printk("[galcore]: %s: sg_alloc_table_from_pages failed\n", __FUNCTION__); + goto error; + } + + result = dma_map_sg(galcore_device, um->sgt.sgl, um->sgt.nents, DMA_TO_DEVICE); + if (unlikely(result != um->sgt.nents)) + { + printk("[galcore]: %s: dma_map_sg failed\n", __FUNCTION__); + goto error; + } + um->type = UM_PAGE_MAP; um->pages = pages; return 0; + +error: +#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \ + && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN)) + sg_free_table(&um->sgt); +#else + kfree(um->sgt.sgl); +#endif + + if (um->pages) + { + kfree(um->pages); + } + return result; } @@ -283,7 +336,8 @@ _Import( ) { gceSTATUS status = gcvSTATUS_OK; - int pfn_map = 0; + unsigned long vm_flags = 0; + struct vm_area_struct *vma = NULL; unsigned long start, end, memory; int result = 0; @@ -327,17 +381,18 @@ _Import( if (memory) { - struct vm_area_struct *vma = NULL; unsigned long vaddr = memory; for (i = 0; i < pageCount; i++) { u32 data; - get_user(data, (u32 *)((memory & PAGE_MASK) + PAGE_SIZE * i)); - put_user(data, (u32 *)((memory & PAGE_MASK) + PAGE_SIZE * i)); + + get_user(data, (u32 *)vaddr); + put_user(data, (u32 *)vaddr); + vaddr += PAGE_SIZE; } - vma = find_vma(current->mm, vaddr); + vma = find_vma(current->mm, memory); if (!vma) { @@ -345,7 +400,12 @@ _Import( gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); } - pfn_map = !!(vma->vm_flags & VM_PFNMAP); +#ifdef CONFIG_ARM + /* coherent cache in case vivt or vipt-aliasing cache. */ + __cpuc_flush_user_range(memory, memory + Size, vma->vm_flags); +#endif + + vm_flags = vma->vm_flags; vaddr = vma->vm_end; while (vaddr < memory + Size) @@ -358,7 +418,7 @@ _Import( gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); } - if (!!(vma->vm_flags & VM_PFNMAP) != pfn_map) + if ((vma->vm_flags & VM_PFNMAP) != (vm_flags & VM_PFNMAP)) { /* Can not support different map type: both PFN and PAGE detected. */ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED); @@ -374,13 +434,13 @@ _Import( } else { - if (pfn_map) + if (vm_flags & VM_PFNMAP) { result = import_pfn_map(UserMemory, memory, pageCount); } else { - result = import_page_map(UserMemory, memory, pageCount); + result = import_page_map(UserMemory, memory, pageCount, Size); } } @@ -397,20 +457,7 @@ _Import( gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); } - if (UserMemory->type == UM_PAGE_MAP) - { - for (i = 0; i < pageCount; i++) - { - gctUINT32 phys = page_to_phys(UserMemory->pages[i]); - - /* Flush(clean) the data cache. */ - gckOS_CacheFlush(Os, _GetProcessID(), gcvNULL, - phys, - (gctPOINTER)(memory & PAGE_MASK) + i*PAGE_SIZE, - PAGE_SIZE); - } - } - + UserMemory->vm_flags = vm_flags; UserMemory->user_vaddr = (unsigned long)Memory; UserMemory->size = Size; UserMemory->offset = (Physical != gcvINVALID_PHYSICAL_ADDRESS) @@ -476,6 +523,15 @@ static void release_page_map(struct um_desc *um) { int i; + dma_unmap_sg(galcore_device, um->sgt.sgl, um->sgt.nents, DMA_TO_DEVICE); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \ + && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN)) + sg_free_table(&um->sgt); +#else + kfree(um->sgt.sgl); +#endif + for (i = 0; i < um->pageCount; i++) { if (!PageReserved(um->pages[i])) @@ -551,13 +607,14 @@ static gceSTATUS _UserMemoryMapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctBOOL Cacheable, - OUT gctPOINTER * UserLogical + IN PLINUX_MDL_MAP MdlMap, + IN gctBOOL Cacheable ) { struct um_desc *userMemory = Mdl->priv; - *UserLogical = (gctPOINTER)userMemory->user_vaddr; + MdlMap->vmaAddr = (gctPOINTER)userMemory->user_vaddr; + MdlMap->cacheable = gcvTRUE; return gcvSTATUS_OK; } @@ -566,7 +623,7 @@ static void _UserMemoryUnmapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ) { @@ -582,7 +639,6 @@ _UserMemoryMapKernel( { /* Kernel doesn't acess video memory. */ return gcvSTATUS_NOT_SUPPORTED; - } static gceSTATUS @@ -606,6 +662,40 @@ _UserMemoryCache( IN gceCACHEOPERATION Operation ) { + struct um_desc *um = Mdl->priv; + enum dma_data_direction dir; + + if (um->type != UM_PAGE_MAP) + { + _MemoryBarrier(); + return gcvSTATUS_OK; + } + +#ifdef CONFIG_ARM + /* coherent cache in case vivt or vipt-aliasing cache. */ + __cpuc_flush_user_range(um->user_vaddr, + um->user_vaddr + um->size, um->vm_flags); +#endif + + switch (Operation) + { + case gcvCACHE_CLEAN: + dir = DMA_TO_DEVICE; + dma_sync_sg_for_device(galcore_device, um->sgt.sgl, um->sgt.nents, dir); + break; + case gcvCACHE_FLUSH: + dir = DMA_BIDIRECTIONAL; + dma_sync_sg_for_device(galcore_device, um->sgt.sgl, um->sgt.nents, dir); + break; + case gcvCACHE_INVALIDATE: + dir = DMA_FROM_DEVICE; + dma_sync_sg_for_cpu(galcore_device, um->sgt.sgl, um->sgt.nents, dir); + break; + default: + return gcvSTATUS_INVALID_ARGUMENT; + } + + return gcvSTATUS_OK; } diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c index 6e787c9d3e87..f3f770acb72f 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c @@ -62,7 +62,6 @@ #include <asm/atomic.h> #include <linux/dma-mapping.h> #include <linux/slab.h> -#include <linux/dma-mapping.h> #include <linux/platform_device.h> #define _GC_OBJ_ZONE gcvZONE_OS @@ -137,6 +136,7 @@ _CMAFSLAlloc( ) { gceSTATUS status; + u32 gfp = GFP_KERNEL | gcdNOWARN; gcsCMA_PRIV_PTR priv = (gcsCMA_PRIV_PTR)Allocator->privateData; struct mdl_cma_priv *mdl_priv=gcvNULL; @@ -159,10 +159,17 @@ _CMAFSLAlloc( gcmkONERROR(gckOS_Allocate(os, sizeof(struct mdl_cma_priv), (gctPOINTER *)&mdl_priv)); mdl_priv->kvaddr = gcvNULL; +#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + if (Flags & gcvALLOC_FLAG_4GB_ADDR) + { + gfp |= __GFP_DMA32; + } +#endif + mdl_priv->kvaddr = dma_alloc_writecombine(&os->device->platform->device->dev, NumPages * PAGE_SIZE, &mdl_priv->physical, - GFP_KERNEL | gcdNOWARN); + gfp); if (mdl_priv->kvaddr == gcvNULL) { @@ -220,8 +227,10 @@ _CMAFSLGetSGT( gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) - page = phys_to_page (mdlPriv->physical); +#if !defined(phys_to_page) + page = virt_to_page(mdlPriv->kvaddr); +#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) + page = phys_to_page(mdlPriv->physical); #else page = phys_to_page(dma_to_phys(&Allocator->os->device->platform->device->dev, mdl_priv->physical)); #endif @@ -276,9 +285,10 @@ static gceSTATUS _CMAFSLMmap( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, + IN gctBOOL Cacheable, IN gctSIZE_T skipPages, IN gctSIZE_T numPages, - INOUT struct vm_area_struct *vma + IN struct vm_area_struct *vma ) { gckOS os = Allocator->os; @@ -323,7 +333,7 @@ static void _CMAFSLUnmapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ) { @@ -334,7 +344,7 @@ _CMAFSLUnmapUser( } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) - if (vm_munmap((unsigned long)Logical, Size) < 0) + if (vm_munmap((unsigned long)MdlMap->vmaAddr, Size) < 0) { gcmkTRACE_ZONE( gcvLEVEL_WARNING, gcvZONE_OS, @@ -344,7 +354,7 @@ _CMAFSLUnmapUser( } #else down_write(¤t->mm->mmap_sem); - if (do_munmap(current->mm, (unsigned long)Logical, Size) < 0) + if (do_munmap(current->mm, (unsigned long)MdlMap->vmaAddr, Size) < 0) { gcmkTRACE_ZONE( gcvLEVEL_WARNING, gcvZONE_OS, @@ -360,8 +370,8 @@ static gceSTATUS _CMAFSLMapUser( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctBOOL Cacheable, - OUT gctPOINTER * UserLogical + IN PLINUX_MDL_MAP MdlMap, + IN gctBOOL Cacheable ) { gctPOINTER userLogical = gcvNULL; @@ -419,25 +429,14 @@ _CMAFSLMapUser( gcmkERR_BREAK(gcvSTATUS_OUT_OF_RESOURCES); } - gcmkERR_BREAK(_CMAFSLMmap(Allocator, Mdl, 0, Mdl->numPages, vma)); + gcmkERR_BREAK(_CMAFSLMmap(Allocator, Mdl, Cacheable, 0, Mdl->numPages, vma)); + MdlMap->vmaAddr = userLogical; + MdlMap->cacheable = Cacheable; + MdlMap->vma = vma; } while (gcvFALSE); up_write(¤t->mm->mmap_sem); - if (gcmIS_SUCCESS(status)) - { - gcmkONERROR(gckOS_CacheFlush( - Allocator->os, - _GetProcessID(), - Mdl, - gcvINVALID_ADDRESS, - userLogical, - Mdl->numPages * PAGE_SIZE - )); - - *UserLogical = userLogical; - } - OnError: if (gcmIS_ERROR(status) && userLogical) { @@ -479,6 +478,18 @@ _CMACache( IN gceCACHEOPERATION Operation ) { + switch (Operation) + { + case gcvCACHE_CLEAN: + case gcvCACHE_FLUSH: + _MemoryBarrier(); + break; + case gcvCACHE_INVALIDATE: + break; + default: + return gcvSTATUS_INVALID_ARGUMENT; + } + return gcvSTATUS_OK; } @@ -559,6 +570,9 @@ _CMAFSLAlloctorInit( allocator->capability = gcvALLOC_FLAG_CONTIGUOUS | gcvALLOC_FLAG_DMABUF_EXPORTABLE +#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) + | gcvALLOC_FLAG_4GB_ADDR +#endif ; #if defined(CONFIG_ARM64) diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c index 85b52d587302..0eee49090830 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c @@ -178,3 +178,83 @@ gckOS_FreeAllocators( return gcvSTATUS_OK; } +#if LINUX_VERSION_CODE < KERNEL_VERSION (3,6,0) \ + || (!defined (ARCH_HAS_SG_CHAIN) && !defined (CONFIG_ARCH_HAS_SG_CHAIN)) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23) +static inline void sg_set_page(struct scatterlist *sg, struct page *page, + unsigned int len, unsigned int offset) +{ + sg->page = page; + sg->offset = offset; + sg->length = len; +} + +static inline void sg_mark_end(struct scatterlist *sg) +{ + (void)sg; +} +# endif + +int +alloc_sg_list_from_pages( + struct scatterlist **sgl, + struct page **pages, + unsigned int n_pages, + unsigned long offset, + unsigned long size, + unsigned int *nents + ) +{ + unsigned int chunks; + unsigned int i; + unsigned int cur_page; + struct scatterlist *s; + + chunks = 1; + + for (i = 1; i < n_pages; ++i) + { + if (page_to_pfn(pages[i]) != page_to_pfn(pages[i - 1]) + 1) + { + ++chunks; + } + } + + s = kzalloc(sizeof(struct scatterlist) * chunks, GFP_KERNEL); + if (unlikely(!s)) + { + return -ENOMEM; + } + + *sgl = s; + *nents = chunks; + + cur_page = 0; + + for (i = 0; i < chunks; i++, s++) + { + unsigned long chunk_size; + unsigned int j; + + for (j = cur_page + 1; j < n_pages; j++) + { + if (page_to_pfn(pages[j]) != page_to_pfn(pages[j - 1]) + 1) + { + break; + } + } + + chunk_size = ((j - cur_page) << PAGE_SHIFT) - offset; + sg_set_page(s, pages[cur_page], min(size, chunk_size), offset); + size -= chunk_size; + offset = 0; + cur_page = j; + } + + sg_mark_end(s - 1); + + return 0; +} +#endif + diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h index 30690f9d4cd6..81801c747e1a 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h @@ -153,9 +153,10 @@ typedef struct _gcsALLOCATOR_OPERATIONS (*Mmap)( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, + IN gctBOOL Cacheable, IN gctSIZE_T skipPages, IN gctSIZE_T numPages, - INOUT struct vm_area_struct *vma + IN struct vm_area_struct *vma ); /************************************************************************** @@ -186,8 +187,8 @@ typedef struct _gcsALLOCATOR_OPERATIONS (*MapUser)( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctBOOL Cacheable, - OUT gctPOINTER * UserLogical + IN PLINUX_MDL_MAP MdlMap, + IN gctBOOL Cacheable ); /************************************************************************** @@ -215,7 +216,7 @@ typedef struct _gcsALLOCATOR_OPERATIONS (*UnmapUser)( IN gckALLOCATOR Allocator, IN PLINUX_MDL Mdl, - IN gctPOINTER Logical, + IN PLINUX_MDL_MAP MdlMap, IN gctUINT32 Size ); @@ -524,6 +525,19 @@ OnError: return status; } +#if LINUX_VERSION_CODE < KERNEL_VERSION (3,6,0) \ + || (!defined (ARCH_HAS_SG_CHAIN) && !defined (CONFIG_ARCH_HAS_SG_CHAIN)) +int +alloc_sg_list_from_pages( + struct scatterlist **sgl, + struct page **pages, + unsigned int n_pages, + unsigned long offset, + unsigned long size, + unsigned int *nents + ); +#endif + /* How to implement customer allocator diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c index c69dd5c9f18b..5543d1d36982 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c @@ -70,6 +70,10 @@ static gckGALDEVICE galDevice; extern gcTA globalTA[16]; +gceSTATUS +gckGALDEVICE_QueryFrequency( IN gckGALDEVICE Device); + + /******************************************************************************\ ******************************** Debugfs Support ******************************* \******************************************************************************/ @@ -692,6 +696,42 @@ static int gc_dump_trigger_write(const char __user *buf, size_t count, void* dat return strtoint_from_user(buf, count, &dumpCore); } +static int gc_clk_show(struct seq_file* m, void* data) +{ + gcsINFO_NODE *node = m->private; + gckGALDEVICE device = node->device; + gctUINT i; + + gckGALDEVICE_QueryFrequency(device); + + for (i = gcvCORE_MAJOR; i < gcvCORE_COUNT; i++) + { + if (device->kernels[i]) + { + gckHARDWARE hardware = device->kernels[i]->hardware; + +#if gcdENABLE_VG + if (i == gcvCORE_VG) + { + continue; + } +#endif + + if (hardware->mcClk) + { + seq_printf(m, "gpu%d mc clock: %d HZ.\n", i, hardware->mcClk); + } + + if (hardware->shClk) + { + seq_printf(m, "gpu%d sh clock: %d HZ.\n", i, hardware->shClk); + } + } + } + + return 0; +} + static gcsINFO InfoList[] = { {"info", gc_info_show}, @@ -702,6 +742,7 @@ static gcsINFO InfoList[] = {"version", gc_version_show}, {"vidmem", gc_vidmem_show, gc_vidmem_write}, {"dump_trigger", gc_dump_trigger_show, gc_dump_trigger_write}, + {"clk", gc_clk_show}, }; static gceSTATUS @@ -2056,6 +2097,89 @@ gckGALDEVICE_Stop_Threads( return gcvSTATUS_OK; } +gceSTATUS +gckGALDEVICE_QueryFrequency( + IN gckGALDEVICE Device + ) +{ + gctUINT64 mcStart[gcvCORE_COUNT], shStart[gcvCORE_COUNT]; + gctUINT32 mcClk[gcvCORE_COUNT], shClk[gcvCORE_COUNT]; + gckHARDWARE hardware = gcvNULL; + gceSTATUS status; + gctUINT i; + + gcmkHEADER_ARG("Device=0x%p", Device); + + for (i = gcvCORE_MAJOR; i < gcvCORE_COUNT; i++) + { +#if gcdENABLE_VG + if (i == gcvCORE_VG) + { + continue; + } +#endif + + if (Device->kernels[i]) + { + hardware = Device->kernels[i]->hardware; + + mcStart[i] = shStart[i] = 0; + + if (Device->args.powerManagement) + { + gcmkONERROR(gckHARDWARE_SetPowerManagement( + hardware, gcvFALSE + )); + } + + gcmkONERROR(gckHARDWARE_SetPowerManagementState( + hardware, gcvPOWER_ON_AUTO + )); + + gckHARDWARE_EnterQueryClock(hardware, + &mcStart[i], &shStart[i]); + } + } + + gcmkONERROR(gckOS_Delay(Device->os, 50)); + + for (i = gcvCORE_MAJOR; i < gcvCORE_COUNT; i++) + { + mcClk[i] = shClk[i] = 0; + +#if gcdENABLE_VG + if (i == gcvCORE_VG) + { + continue; + } +#endif + + if (Device->kernels[i] && mcStart[i]) + { + hardware = Device->kernels[i]->hardware; + + if (Device->args.powerManagement) + { + gcmkONERROR(gckHARDWARE_SetPowerManagement( + hardware, gcvTRUE + )); + } + + gckHARDWARE_ExitQueryClock(hardware, + mcStart[i], shStart[i], + &mcClk[i], &shClk[i]); + + hardware->mcClk = mcClk[i]; + hardware->shClk = shClk[i]; + } + } + +OnError: + gcmkFOOTER_NO(); + + return status; +} + /******************************************************************************* ** ** gckGALDEVICE_Start @@ -2090,6 +2214,8 @@ gckGALDEVICE_Start( /* Start the kernel thread. */ gcmkONERROR(gckGALDEVICE_Start_Threads(Device)); + gcmkONERROR(gckGALDEVICE_QueryFrequency(Device)); + for (i = 0; i < gcvCORE_COUNT; i++) { if (i == gcvCORE_VG) diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c index b7017382b313..b76b11882f3f 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c @@ -76,9 +76,9 @@ MODULE_LICENSE("Dual MIT/GPL"); #define USE_MSI 1 #endif -static struct class* gpuClass; +static struct class* gpuClass = NULL; -static gcsPLATFORM *platform; +static gcsPLATFORM *platform = NULL; static gckGALDEVICE galDevice; @@ -870,6 +870,8 @@ int viv_drm_probe(struct device *dev); int viv_drm_remove(struct device *dev); #endif +struct device *galcore_device = NULL; + #if USE_LINUX_PCIE static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) #else /* USE_LINUX_PCIE */ @@ -881,6 +883,8 @@ static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) #endif /* USE_LINUX_PCIE */ { int ret = -ENODEV; + static u64 dma_mask = ~0ULL; + gcsMODULE_PARAMETERS moduleParam = { .irqLine = irqLine, .registerMemBase = registerMemBase, @@ -916,8 +920,12 @@ static int gpu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) memcpy(moduleParam.registerBases, registerBases, gcmSIZEOF(gctUINT) * gcvCORE_COUNT); memcpy(moduleParam.registerSizes, registerSizes, gcmSIZEOF(gctUINT) * gcvCORE_COUNT); memcpy(moduleParam.chipIDs, chipIDs, gcmSIZEOF(gctUINT) * gcvCORE_COUNT); - moduleParam.compression = compression; + moduleParam.compression = (compression == -1) ? gcvCOMPRESSION_OPTION_DEFAULT : (gceCOMPRESSION_OPTION)compression; platform->device = pdev; + galcore_device = &pdev->dev; + + galcore_device->dma_mask = &dma_mask; + #if USE_LINUX_PCIE if (pci_enable_device(pdev)) { printk(KERN_ERR "galcore: pci_enable_device() failed.\n"); @@ -1018,6 +1026,8 @@ static void gpu_remove(struct pci_dev *pdev) gcmkFOOTER_NO(); return; #else + galcore_device->dma_mask = NULL; + galcore_device = NULL; gcmkFOOTER_NO(); return 0; #endif diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c index b4846cb65bb8..7e8e8a8764db 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c @@ -284,6 +284,7 @@ static int viv_ioctl_gem_unlock(struct drm_device *drm, void *data, { gcmkONERROR(gcvSTATUS_NOT_FOUND); } + drm_gem_object_unreference_unlocked(gem_obj); viv_obj = container_of(gem_obj, struct viv_gem_object, base); memset(&iface, 0, sizeof(iface)); diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c index bcda2c161874..5efa3d404790 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c @@ -463,12 +463,6 @@ gckKERNEL_Notify( { gceSTATUS status; - gcmkHEADER_ARG("Kernel=%p Notification=%d Data=%d", - Kernel, Notification, Data); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL); - /* Dispatch on notifcation. */ switch (Notification) { @@ -477,8 +471,7 @@ gckKERNEL_Notify( #if COMMAND_PROCESSOR_VERSION > 1 status = gckINTERRUPT_Notify(Kernel->interrupt, Data); #else - status = gckHARDWARE_Interrupt(Kernel->hardware, - Data); + status = gckHARDWARE_Interrupt(Kernel->hardware, Data); #endif break; @@ -488,7 +481,6 @@ gckKERNEL_Notify( } /* Success. */ - gcmkFOOTER(); return status; } diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h index f1ae2b196354..b613b080f003 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h @@ -148,6 +148,8 @@ # endif #endif +extern struct device *galcore_device; + /******************************************************************************\ ********************************** Structures ********************************** \******************************************************************************/ @@ -332,6 +334,26 @@ _GetProcessID( #endif } +static inline void +_MemoryBarrier( + void + ) +{ +#if defined(CONFIG_ARM) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) + dsb(); +#else + mb(); +#endif +} + +static inline void +_Barrier( + void + ) +{ + barrier(); +} + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) static inline int is_vmalloc_addr( diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c index 4b0a2ff50ce2..0209e9f52503 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -94,7 +94,7 @@ do { \ if (unlikely(!!(x))) \ { \ - gcmkPRINT("[galcore]: BUG ON @ %s(%d)", __func__, __LINE__); \ + printk("[galcore]: BUG ON @ %s(%d)\n", __func__, __LINE__); \ dump_stack(); \ } \ } while (0) @@ -457,111 +457,6 @@ _QueryProcessPageTable( } } -#if !gcdCACHE_FUNCTION_UNIMPLEMENTED && defined(CONFIG_OUTER_CACHE) -static inline gceSTATUS -outer_func( - gceCACHEOPERATION Type, - unsigned long Start, - unsigned long End - ) -{ - switch (Type) - { - case gcvCACHE_CLEAN: - outer_clean_range(Start, End); - break; - case gcvCACHE_INVALIDATE: - outer_inv_range(Start, End); - break; - case gcvCACHE_FLUSH: - outer_flush_range(Start, End); - break; - default: - return gcvSTATUS_INVALID_ARGUMENT; - break; - } - return gcvSTATUS_OK; -} - -/******************************************************************************* -** _HandleOuterCache -** -** Handle the outer cache for the specified addresses. -** -** ARGUMENTS: -** -** gckOS Os -** Pointer to gckOS object. -** -** gctPOINTER Physical -** Physical address to flush. -** -** gctPOINTER Logical -** Logical address to flush. -** -** gctSIZE_T Bytes -** Size of the address range in bytes to flush. -** -** gceOUTERCACHE_OPERATION Type -** Operation need to be execute. -*/ -gceSTATUS -_HandleOuterCache( - IN gckOS Os, - IN gctUINT32 Physical, - IN gctPOINTER Logical, - IN gctSIZE_T Bytes, - IN gceCACHEOPERATION Type - ) -{ - gceSTATUS status; - gctPHYS_ADDR_T paddr; - gctPOINTER vaddr; - gctUINT32 offset, bytes, left; - - gcmkHEADER_ARG("Os=0x%X Logical=0x%X Bytes=%lu", - Os, Logical, Bytes); - - if (Physical != gcvINVALID_ADDRESS) - { - /* Non paged memory or gcvPOOL_USER surface */ - paddr = (unsigned long) Physical; - gcmkONERROR(outer_func(Type, paddr, paddr + Bytes)); - } - else - { - /* Non contiguous virtual memory */ - vaddr = Logical; - left = Bytes; - - while (left) - { - /* Handle (part of) current page. */ - offset = (gctUINTPTR_T)vaddr & ~PAGE_MASK; - - bytes = gcmMIN(left, PAGE_SIZE - offset); - - gcmkONERROR(_QueryProcessPageTable(vaddr, &paddr)); - gcmkONERROR(outer_func(Type, paddr, paddr + bytes)); - - vaddr = (gctUINT8_PTR)vaddr + bytes; - left -= bytes; - } - } - - mb(); - - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; - -OnError: - /* Return the status. */ - gcmkFOOTER(); - return status; -} -#endif - static gceSTATUS _ShrinkMemory( @@ -1122,8 +1017,8 @@ gckOS_MapMemory( gcmkONERROR( allocator->ops->MapUser(allocator, - mdl, gcvFALSE, - &mdlMap->vmaAddr)); + mdl, mdlMap, + gcvFALSE)); } mutex_unlock(&mdl->mapsMutex); @@ -1256,8 +1151,8 @@ gckOS_UnmapMemoryEx( BUG_ON(!allocator || !allocator->ops->UnmapUser); - allocator->ops->UnmapUser(allocator, mdl, - mdlMap->vmaAddr, mdl->numPages * PAGE_SIZE); + allocator->ops->UnmapUser(allocator, mdl, mdlMap, + mdl->numPages * PAGE_SIZE); gcmkVERIFY_OK(_DestroyMdlMap(mdl, mdlMap)); @@ -1332,6 +1227,9 @@ gckOS_UnmapUserLogical( ** gctBOOL InUserSpace ** gcvTRUE if the pages need to be mapped into user space. ** +** gctUINT32 Flag +** Allocation attribute. +** ** gctSIZE_T * Bytes ** Pointer to a variable that holds the number of bytes to allocate. ** @@ -1352,6 +1250,7 @@ gceSTATUS gckOS_AllocateNonPagedMemory( IN gckOS Os, IN gctBOOL InUserSpace, + IN gctUINT32 Flag, IN OUT gctSIZE_T * Bytes, OUT gctPHYS_ADDR * Physical, OUT gctPOINTER * Logical @@ -1364,7 +1263,6 @@ gckOS_AllocateNonPagedMemory( gctPOINTER addr; gceSTATUS status = gcvSTATUS_NOT_SUPPORTED; gckALLOCATOR allocator; - gctUINT32 flag = gcvALLOC_FLAG_CONTIGUOUS; gcmkHEADER_ARG("Os=0x%X InUserSpace=%d *Bytes=%lu", Os, InUserSpace, gcmOPT_VALUE(Bytes)); @@ -1389,9 +1287,12 @@ gckOS_AllocateNonPagedMemory( gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } + gcmkASSERT(Flag & gcvALLOC_FLAG_CONTIGUOUS); + if (Os->allocatorLimitMarker) { - flag |= gcvALLOC_FLAG_CMA_LIMIT; + Flag |= gcvALLOC_FLAG_CMA_LIMIT; + Flag |= gcvALLOC_FLAG_CMA_PREEMPT; } /* Walk all allocators. */ @@ -1399,25 +1300,34 @@ gckOS_AllocateNonPagedMemory( { gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "%s(%d) flag = %x allocator->capability = %x", - __FUNCTION__, __LINE__, flag, allocator->capability); + __FUNCTION__, __LINE__, Flag, allocator->capability); #ifndef NO_DMA_COHERENT /* Point to dma coherent allocator. */ if (strcmp(allocator->name, "dma")) { - if (((flag & allocator->capability) != flag) || + /*!VIV: + * For historical issue, we force allocate all non-paged memory from + * dma coherent pool when it is not disabled. + * + * The code below changes the scheme a little: force allocate + * non-paged memory whose size is larger than 1 pages, can try other + * allocators otherwise. This is to save memory usage of dma + * coherent pool. + */ + if (((Flag & allocator->capability) != Flag) || (numPages > 1)) { continue; } } #else - if ((flag & allocator->capability) != flag) + if ((Flag & allocator->capability) != Flag) { continue; } #endif - status = allocator->ops->Alloc(allocator, mdl, numPages, flag); + status = allocator->ops->Alloc(allocator, mdl, numPages, Flag); if (gcmIS_SUCCESS(status)) { @@ -1449,7 +1359,7 @@ gckOS_AllocateNonPagedMemory( gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } - gcmkONERROR(allocator->ops->MapUser(allocator, mdl, gcvFALSE, &mdlMap->vmaAddr)); + gcmkONERROR(allocator->ops->MapUser(allocator, mdl, mdlMap, gcvFALSE)); *Logical = mdlMap->vmaAddr; } @@ -1684,40 +1594,53 @@ gckOS_ReadRegisterEx( OUT gctUINT32 * Data ) { - unsigned long flags; + if (in_irq()) + { + spin_lock(&Os->registerAccessLock); + + if (unlikely(Os->clockStates[Core] == gcvFALSE)) + { + spin_unlock(&Os->registerAccessLock); - spin_lock_irqsave(&Os->registerAccessLock, flags); + /* + * Read register when power off: + * 1. In shared IRQ, read register may be called and that's not our irq. + */ + return gcvSTATUS_GENERIC_IO; + } - if (unlikely(Os->clockStates[Core] == gcvFALSE)) + *Data = readl((gctUINT8 *)Os->device->registerBases[Core] + Address); + spin_unlock(&Os->registerAccessLock); + } + else { - spin_unlock_irqrestore(&Os->registerAccessLock, flags); + unsigned long flags; - /* - * Read register when power off: - * 1. In shared IRQ, read register may be called and that's not our irq. - * 2. In non-irq context, register access should not be called, - * otherwise it's driver bug. - */ - if (!in_irq()) + spin_lock_irqsave(&Os->registerAccessLock, flags); + + if (unlikely(Os->clockStates[Core] == gcvFALSE)) { - gcmkPRINT("[galcore]: %s(%d) GPU[%d] external clock off", - __func__, __LINE__, Core); + spin_unlock_irqrestore(&Os->registerAccessLock, flags); + + /* + * Read register when power off: + * 2. In non-irq context, register access should not be called, + * otherwise it's driver bug. + */ + printk(KERN_ERR "[galcore]: %s(%d) GPU[%d] external clock off", + __func__, __LINE__, Core); gcmkBUG_ON(1); + return gcvSTATUS_GENERIC_IO; } - return gcvSTATUS_GENERIC_IO; - } - - *Data = readl((gctUINT8 *)Os->device->registerBases[Core] + Address); - spin_unlock_irqrestore(&Os->registerAccessLock, flags); + *Data = readl((gctUINT8 *)Os->device->registerBases[Core] + Address); + spin_unlock_irqrestore(&Os->registerAccessLock, flags); #if gcdDUMP_AHB_ACCESS - if (!in_irq()) - { /* Dangerous to print in interrupt context, skip. */ gcmkPRINT("@[RD %d] %08x %08x", Core, Address, *Data); - } #endif + } /* Success. */ return gcvSTATUS_OK; @@ -1762,32 +1685,51 @@ gckOS_WriteRegisterEx( IN gctUINT32 Data ) { - unsigned long flags; + if (in_irq()) + { + spin_lock(&Os->registerAccessLock); - spin_lock_irqsave(&Os->registerAccessLock, flags); + if (unlikely(Os->clockStates[Core] == gcvFALSE)) + { + spin_unlock(&Os->registerAccessLock); - if (unlikely(Os->clockStates[Core] == gcvFALSE)) - { - spin_unlock_irqrestore(&Os->registerAccessLock, flags); + printk(KERN_ERR "[galcore]: %s(%d) GPU[%d] external clock off", + __func__, __LINE__, Core); - gcmkPRINT("[galcore]: %s(%d) GPU[%d] external clock off", - __func__, __LINE__, Core); + /* Driver bug: register write when clock off. */ + gcmkBUG_ON(1); + return gcvSTATUS_GENERIC_IO; + } - /* Driver bug: register write when clock off. */ - gcmkBUG_ON(1); - return gcvSTATUS_GENERIC_IO; + writel(Data, (gctUINT8 *)Os->device->registerBases[Core] + Address); + spin_unlock(&Os->registerAccessLock); } + else + { + unsigned long flags; - writel(Data, (gctUINT8 *)Os->device->registerBases[Core] + Address); - spin_unlock_irqrestore(&Os->registerAccessLock, flags); + spin_lock_irqsave(&Os->registerAccessLock, flags); + + if (unlikely(Os->clockStates[Core] == gcvFALSE)) + { + spin_unlock_irqrestore(&Os->registerAccessLock, flags); + + printk(KERN_ERR "[galcore]: %s(%d) GPU[%d] external clock off", + __func__, __LINE__, Core); + + /* Driver bug: register write when clock off. */ + gcmkBUG_ON(1); + return gcvSTATUS_GENERIC_IO; + } + + writel(Data, (gctUINT8 *)Os->device->registerBases[Core] + Address); + spin_unlock_irqrestore(&Os->registerAccessLock, flags); #if gcdDUMP_AHB_ACCESS - if (!in_irq()) - { /* Dangerous to print in interrupt context, skip. */ gcmkPRINT("@[WR %d] %08x %08x", Core, Address, Data); - } #endif + } /* Success. */ return gcvSTATUS_OK; @@ -1964,8 +1906,6 @@ gckOS_GetPhysicalAddress( _GetPhysicalAddressProcess(Os, Logical, processID, Address)); } - gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os, *Address, Address)); - /* Success. */ gcmkFOOTER_ARG("*Address=%p", *Address); return gcvSTATUS_OK; @@ -2525,17 +2465,8 @@ gckOS_AtomicExchange( OUT gctUINT32_PTR OldValue ) { - gcmkHEADER_ARG("Os=0x%X Target=0x%X NewValue=%u", Os, Target, NewValue); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - gcmkVERIFY_ARGUMENT(OldValue != gcvNULL); - /* Exchange the pair of 32-bit values. */ *OldValue = (gctUINT32) atomic_xchg((atomic_t *) Target, (int) NewValue); - - /* Success. */ - gcmkFOOTER_ARG("*OldValue=%u", *OldValue); return gcvSTATUS_OK; } @@ -2571,17 +2502,8 @@ gckOS_AtomicExchangePtr( OUT gctPOINTER * OldValue ) { - gcmkHEADER_ARG("Os=0x%X Target=0x%X NewValue=0x%X", Os, Target, NewValue); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - gcmkVERIFY_ARGUMENT(OldValue != gcvNULL); - /* Exchange the pair of pointers. */ *OldValue = (gctPOINTER)(gctUINTPTR_T) atomic_xchg((atomic_t *) Target, (int)(gctUINTPTR_T) NewValue); - - /* Success. */ - gcmkFOOTER_ARG("*OldValue=0x%X", *OldValue); return gcvSTATUS_OK; } @@ -2609,18 +2531,12 @@ gckOS_AtomSetMask( ) { gctUINT32 oval, nval; - - gcmkHEADER_ARG("Atom=0x%0x", Atom); - gcmkVERIFY_ARGUMENT(Atom != gcvNULL); - do { oval = atomic_read((atomic_t *) Atom); nval = oval | Mask; } while (atomic_cmpxchg((atomic_t *) Atom, oval, nval) != oval); - - gcmkFOOTER_NO(); return gcvSTATUS_OK; } @@ -2649,9 +2565,6 @@ gckOS_AtomClearMask( { gctUINT32 oval, nval; - gcmkHEADER_ARG("Atom=0x%0x", Atom); - gcmkVERIFY_ARGUMENT(Atom != gcvNULL); - do { oval = atomic_read((atomic_t *) Atom); @@ -2659,7 +2572,6 @@ gckOS_AtomClearMask( } while (atomic_cmpxchg((atomic_t *) Atom, oval, nval) != oval); - gcmkFOOTER_NO(); return gcvSTATUS_OK; } @@ -2780,17 +2692,8 @@ gckOS_AtomGet( OUT gctINT32_PTR Value ) { - gcmkHEADER_ARG("Os=0x%X Atom=0x%0x", Os, Atom); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - gcmkVERIFY_ARGUMENT(Atom != gcvNULL); - /* Return the current value of atom. */ *Value = atomic_read((atomic_t *) Atom); - - /* Success. */ - gcmkFOOTER_ARG("*Value=%d", *Value); return gcvSTATUS_OK; } @@ -2822,17 +2725,8 @@ gckOS_AtomSet( IN gctINT32 Value ) { - gcmkHEADER_ARG("Os=0x%X Atom=0x%0x Value=%d", Os, Atom); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - gcmkVERIFY_ARGUMENT(Atom != gcvNULL); - /* Set the current value of atom. */ atomic_set((atomic_t *) Atom, Value); - - /* Success. */ - gcmkFOOTER_NO(); return gcvSTATUS_OK; } @@ -2862,17 +2756,8 @@ gckOS_AtomIncrement( OUT gctINT32_PTR Value ) { - gcmkHEADER_ARG("Os=0x%X Atom=0x%0x", Os, Atom); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - gcmkVERIFY_ARGUMENT(Atom != gcvNULL); - /* Increment the atom. */ *Value = atomic_inc_return((atomic_t *) Atom) - 1; - - /* Success. */ - gcmkFOOTER_ARG("*Value=%d", *Value); return gcvSTATUS_OK; } @@ -2902,17 +2787,8 @@ gckOS_AtomDecrement( OUT gctINT32_PTR Value ) { - gcmkHEADER_ARG("Os=0x%X Atom=0x%0x", Os, Atom); - - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - gcmkVERIFY_ARGUMENT(Atom != gcvNULL); - /* Decrement the atom. */ *Value = atomic_dec_return((atomic_t *) Atom) + 1; - - /* Success. */ - gcmkFOOTER_ARG("*Value=%d", *Value); return gcvSTATUS_OK; } @@ -3074,24 +2950,8 @@ gckOS_MemoryBarrier( IN gctPOINTER Address ) { - gcmkHEADER_ARG("Os=0x%X Address=0x%X", Os, Address); + _MemoryBarrier(); - /* Verify the arguments. */ - gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); - -#if gcdNONPAGED_MEMORY_BUFFERABLE \ - && defined (CONFIG_ARM) \ - && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) - /* drain write buffer */ - dsb(); - - /* drain outer cache's write buffer? */ -#else - mb(); -#endif - - /* Success. */ - gcmkFOOTER_NO(); return gcvSTATUS_OK; } @@ -3393,7 +3253,7 @@ gckOS_LockPages( if (mdlMap->vmaAddr == gcvNULL) { - status = allocator->ops->MapUser(allocator, mdl, Cacheable, &mdlMap->vmaAddr); + status = allocator->ops->MapUser(allocator, mdl, mdlMap, Cacheable); if (gcmIS_ERROR(status)) { @@ -3717,7 +3577,7 @@ gckOS_UnlockPages( allocator->ops->UnmapUser( allocator, mdl, - mdlMap->vmaAddr, + mdlMap, mdl->numPages * PAGE_SIZE); mdlMap->vmaAddr = gcvNULL; @@ -3787,6 +3647,7 @@ gckOS_AllocateContiguous( /* Same as non-paged memory for now. */ gcmkONERROR(gckOS_AllocateNonPagedMemory(Os, InUserSpace, + gcvALLOC_FLAG_CONTIGUOUS, Bytes, Physical, Logical)); @@ -4513,6 +4374,55 @@ gckOS_ZeroMemory( /******************************************************************************* ********************************* Cache Control ******************************** *******************************************************************************/ +static gceSTATUS +_CacheOperation( + IN gckOS Os, + IN gctUINT32 ProcessID, + IN gctPHYS_ADDR Handle, + IN gctPHYS_ADDR_T Physical, + IN gctPOINTER Logical, + IN gctSIZE_T Bytes, + IN gceCACHEOPERATION Operation + ) +{ + PLINUX_MDL mdl = (PLINUX_MDL)Handle; + PLINUX_MDL_MAP mdlMap; + gckALLOCATOR allocator; + + if (!mdl || !mdl->allocator) + { + gcmkPRINT("[galcore]: %s: Logical=%p no mdl", __FUNCTION__, Logical); + return gcvSTATUS_INVALID_ARGUMENT; + } + + allocator = mdl->allocator; + + if (allocator->ops->Cache) + { + mutex_lock(&mdl->mapsMutex); + + mdlMap = FindMdlMap(mdl, ProcessID); + + mutex_unlock(&mdl->mapsMutex); + + if (mdlMap == gcvNULL) + { + return gcvSTATUS_INVALID_ARGUMENT; + } + + if (mdlMap->cacheable) + { + allocator->ops->Cache(allocator, + mdl, Logical, Physical, Bytes, Operation); + + return gcvSTATUS_OK; + } + } + + _MemoryBarrier(); + + return gcvSTATUS_OK; +} /******************************************************************************* ** gckOS_CacheClean @@ -4572,7 +4482,7 @@ gckOS_CacheClean( IN gctSIZE_T Bytes ) { - gcsPLATFORM * platform; + gceSTATUS status; gcmkHEADER_ARG("Os=0x%X ProcessID=%d Handle=0x%X Logical=%p Bytes=%lu", Os, ProcessID, Handle, Logical, Bytes); @@ -4582,61 +4492,14 @@ gckOS_CacheClean( gcmkVERIFY_ARGUMENT(Logical != gcvNULL); gcmkVERIFY_ARGUMENT(Bytes > 0); - platform = Os->device->platform; - - if (platform && platform->ops->cache) - { - platform->ops->cache( - platform, - ProcessID, - Handle, - Physical, - Logical, - Bytes, - gcvCACHE_CLEAN - ); - - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; - } - -#if !gcdCACHE_FUNCTION_UNIMPLEMENTED -#if defined(CONFIG_ARM) || defined(CONFIG_ARM64) - -#if defined (CONFIG_ARM) - /* Inner cache. */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) - dmac_map_area(Logical, Bytes, DMA_TO_DEVICE); -# else - dmac_clean_range(Logical, Logical + Bytes); -# endif - -#elif defined(CONFIG_ARM64) - __dma_map_area(Logical, Bytes, DMA_TO_DEVICE); -#endif - -#if defined(CONFIG_OUTER_CACHE) - /* Outer cache. */ - _HandleOuterCache(Os, Physical, Logical, Bytes, gcvCACHE_CLEAN); -#endif + gcmkONERROR(_CacheOperation(Os, ProcessID, + Handle, Physical, Logical, Bytes, + gcvCACHE_CLEAN)); -#elif defined(CONFIG_MIPS) - dma_cache_wback((unsigned long) Logical, Bytes); -#elif defined(CONFIG_PPC) - flush_dcache_range((unsigned long)Logical, (unsigned long)Logical + Bytes); -#else - dma_sync_single_for_device( - gcvNULL, - (dma_addr_t)Physical, - Bytes, - DMA_TO_DEVICE); -#endif -#endif +OnError: + gcmkFOOTER(); + return status; - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; } /******************************************************************************* @@ -4673,7 +4536,7 @@ gckOS_CacheInvalidate( IN gctSIZE_T Bytes ) { - gcsPLATFORM * platform; + gceSTATUS status; gcmkHEADER_ARG("Os=0x%X ProcessID=%d Handle=0x%X Logical=%p Bytes=%lu", Os, ProcessID, Handle, Logical, Bytes); @@ -4683,60 +4546,13 @@ gckOS_CacheInvalidate( gcmkVERIFY_ARGUMENT(Logical != gcvNULL); gcmkVERIFY_ARGUMENT(Bytes > 0); - platform = Os->device->platform; - - if (platform && platform->ops->cache) - { - platform->ops->cache( - platform, - ProcessID, - Handle, - Physical, - Logical, - Bytes, - gcvCACHE_INVALIDATE - ); - - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; - } - -#if !gcdCACHE_FUNCTION_UNIMPLEMENTED -#if defined(CONFIG_ARM) || defined(CONFIG_ARM64) - -#if defined (CONFIG_ARM) - /* Inner cache. */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) - dmac_unmap_area(Logical, Bytes, DMA_FROM_DEVICE); -# else - dmac_inv_range(Logical, Logical + Bytes); -# endif -#elif defined(CONFIG_ARM64) - __dma_unmap_area(Logical, Bytes, DMA_FROM_DEVICE); -#endif + gcmkONERROR(_CacheOperation(Os, ProcessID, + Handle, Physical, Logical, Bytes, + gcvCACHE_INVALIDATE)); -#if defined(CONFIG_OUTER_CACHE) - /* Outer cache. */ - _HandleOuterCache(Os, Physical, Logical, Bytes, gcvCACHE_INVALIDATE); -#endif - -#elif defined(CONFIG_MIPS) - dma_cache_inv((unsigned long) Logical, Bytes); -#elif defined(CONFIG_PPC) - flush_dcache_range((unsigned long)Logical, (unsigned long)Logical + Bytes); -#else - dma_sync_single_for_device( - gcvNULL, - (dma_addr_t)Physical, - Bytes, - DMA_FROM_DEVICE); -#endif -#endif - - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; +OnError: + gcmkFOOTER(); + return status; } /******************************************************************************* @@ -4773,7 +4589,7 @@ gckOS_CacheFlush( IN gctSIZE_T Bytes ) { - gcsPLATFORM * platform; + gceSTATUS status; gcmkHEADER_ARG("Os=0x%X ProcessID=%d Handle=0x%X Logical=%p Bytes=%lu", Os, ProcessID, Handle, Logical, Bytes); @@ -4783,61 +4599,13 @@ gckOS_CacheFlush( gcmkVERIFY_ARGUMENT(Logical != gcvNULL); gcmkVERIFY_ARGUMENT(Bytes > 0); - platform = Os->device->platform; - - if (platform && platform->ops->cache) - { - platform->ops->cache( - platform, - ProcessID, - Handle, - Physical, - Logical, - Bytes, - gcvCACHE_FLUSH - ); - - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; - } - -#if !gcdCACHE_FUNCTION_UNIMPLEMENTED -#if defined(CONFIG_ARM) || defined(CONFIG_ARM64) -#if defined (CONFIG_ARM) - /* Inner cache. */ - dmac_flush_range(Logical, Logical + Bytes); -#elif defined (CONFIG_ARM64) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) - __dma_flush_area(Logical, Bytes); -#else - __dma_flush_range(Logical, Logical + Bytes); -#endif -#endif - -#if defined(CONFIG_OUTER_CACHE) - /* Outer cache. */ - _HandleOuterCache(Os, Physical, Logical, Bytes, gcvCACHE_FLUSH); -#endif + gcmkONERROR(_CacheOperation(Os, ProcessID, + Handle, Physical, Logical, Bytes, + gcvCACHE_FLUSH)); -#elif defined(CONFIG_MIPS) - dma_cache_wback_inv((unsigned long) Logical, Bytes); -#elif defined(CONFIG_PPC) - flush_dcache_range((unsigned long)Logical, (unsigned long)Logical + Bytes); -#elif defined(CONFIG_X86) - wbinvd_on_all_cpus(); -#else - dma_sync_single_for_device( - gcvNULL, - (dma_addr_t)Physical, - Bytes, - DMA_BIDIRECTIONAL); -#endif -#endif - - /* Success. */ - gcmkFOOTER_NO(); - return gcvSTATUS_OK; +OnError: + gcmkFOOTER(); + return status; } /******************************************************************************* @@ -5385,18 +5153,6 @@ gckOS_SetGPUPower( clockChange = (Clock != Os->clockStates[Core]); - if (clockChange) - { - unsigned long flags; - - spin_lock_irqsave(&Os->registerAccessLock, flags); - - /* Record clock states, ahead. */ - Os->clockStates[Core] = Clock; - - spin_unlock_irqrestore(&Os->registerAccessLock, flags); - } - if (powerChange && (Power == gcvTRUE)) { if (platform && platform->ops->setPower) @@ -5409,10 +5165,32 @@ gckOS_SetGPUPower( if (clockChange) { + unsigned long flags; + + if (!Clock) + { + spin_lock_irqsave(&Os->registerAccessLock, flags); + + /* Record clock off, ahead. */ + Os->clockStates[Core] = gcvFALSE; + + spin_unlock_irqrestore(&Os->registerAccessLock, flags); + } + if (platform && platform->ops->setClock) { gcmkVERIFY_OK(platform->ops->setClock(platform, Core, Clock)); } + + if (Clock) + { + spin_lock_irqsave(&Os->registerAccessLock, flags); + + /* Record clock on, behind. */ + Os->clockStates[Core] = gcvTRUE; + + spin_unlock_irqrestore(&Os->registerAccessLock, flags); + } } if (powerChange && (Power == gcvFALSE)) @@ -7334,6 +7112,7 @@ gckOS_AllocatePageArray( gcmkONERROR(gckOS_AllocateNonPagedMemory( Os, gcvFALSE, + gcvALLOC_FLAG_CONTIGUOUS, &bytes, PageArrayPhysical, PageArrayLogical @@ -7606,8 +7385,10 @@ gckOS_MemoryMmap( ) { PLINUX_MDL mdl; + PLINUX_MDL_MAP mdlMap; gckALLOCATOR allocator; gceSTATUS status = gcvSTATUS_OK; + gctBOOL cacheable = gcvFALSE; if (!Physical) { @@ -7622,7 +7403,17 @@ gckOS_MemoryMmap( gcmkONERROR(gcvSTATUS_NOT_SUPPORTED); } - gcmkONERROR(allocator->ops->Mmap(allocator, mdl, skipPages, numPages, Vma)); + mutex_lock(&mdl->mapsMutex); + + mdlMap = FindMdlMap(mdl, _GetProcessID()); + if (mdlMap) + { + cacheable = mdlMap->cacheable; + } + + mutex_unlock(&mdl->mapsMutex); + + gcmkONERROR(allocator->ops->Mmap(allocator, mdl, cacheable, skipPages, numPages, Vma)); OnError: return status; diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h index 57cd01a1354b..46bbe76e986f 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h @@ -62,9 +62,14 @@ typedef struct _LINUX_MDL_MAP LINUX_MDL_MAP, *PLINUX_MDL_MAP; struct _LINUX_MDL_MAP { gctINT pid; - gctPOINTER vmaAddr; + + /* map references. */ gctUINT32 count; + struct vm_area_struct * vma; + gctPOINTER vmaAddr; + gctBOOL cacheable; + struct list_head link; }; diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c index 1d59805f135f..25805f3162ea 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c @@ -124,17 +124,6 @@ extern int unregister_thermal_notifier(struct notifier_block *nb); # define gcdFSL_CONTIGUOUS_SIZE (4 << 20) #endif -#if defined(CONFIG_PM_OPP) -typedef enum _gceGOVERN_MODE -{ - OVERDRIVE, - NOMINAL, - UNDERDRIVE, - GOVERN_COUNT -} -gceGOVERN_MODE; -#endif - static int initgpu3DMinClock = 1; module_param(initgpu3DMinClock, int, 0644); @@ -380,6 +369,22 @@ struct gpu_clk }; #if defined(CONFIG_PM_OPP) +typedef enum _GOVERN_MODE +{ + OVERDRIVE, + NOMINAL, + UNDERDRIVE, + GOVERN_COUNT +} +GOVERN_MODE; + +static const char *govern_modes[] = +{ + "overdrive", + "nominal", + "underdrive" +}; + struct gpu_govern { unsigned long core_clk_freq[GOVERN_COUNT]; @@ -421,101 +426,76 @@ struct imx_priv static struct imx_priv imxPriv; #if defined(CONFIG_PM_OPP) -static ssize_t gpu_mode_show(struct device_driver *dev, char *buf) +static ssize_t gpu_govern_show(struct device_driver *dev, char *buf) { struct imx_priv *priv = &imxPriv; - char buffer[512]; - char mode[16] = "undefined\n"; int i; + ssize_t len; - unsigned long core_freq = 0; - unsigned long shader_freq = 0; + unsigned long core_freq; + unsigned long shader_freq; - snprintf(buf, 512, "GPU support %d modes\n", priv->imx_gpu_govern.num_modes); + len = sprintf(buf, "GPU support %d modes\n", priv->imx_gpu_govern.num_modes); - for(i = 0;i<priv->imx_gpu_govern.num_modes;i++) + for (i = 0; i < priv->imx_gpu_govern.num_modes; i++) { - switch(i){ - case OVERDRIVE: - core_freq = priv->imx_gpu_govern.core_clk_freq[i]; - shader_freq = priv->imx_gpu_govern.shader_clk_freq[i]; - snprintf(buffer, 512, "overdrive:\tcore_clk frequency: %ld\tshader_clk frequency: %ld\n", core_freq,shader_freq); - strcat(buf,buffer); - if(OVERDRIVE == priv->imx_gpu_govern.current_mode) - strcpy(mode,"overdrive\n"); - break; - case NOMINAL: - core_freq = priv->imx_gpu_govern.core_clk_freq[i]; - shader_freq = priv->imx_gpu_govern.shader_clk_freq[i]; - snprintf(buffer, 512, "nominal:\tcore_clk frequency: %ld\tshader_clk frequency: %ld\n", core_freq,shader_freq); - strcat(buf,buffer); - if(NOMINAL == priv->imx_gpu_govern.current_mode) - strcpy(mode,"nominal\n"); - break; - case UNDERDRIVE: - core_freq = priv->imx_gpu_govern.core_clk_freq[i]; - shader_freq = priv->imx_gpu_govern.shader_clk_freq[i]; - snprintf(buffer, 512, "underdrive:\tcore_clk frequency: %ld\tshader_clk frequency: %ld\n", core_freq,shader_freq); - strcat(buf,buffer); - if(UNDERDRIVE == priv->imx_gpu_govern.current_mode) - strcpy(mode,"underdrive\n"); - break; - default: - strcpy(mode,"undefined\n"); - break; - } + core_freq = priv->imx_gpu_govern.core_clk_freq[i]; + shader_freq = priv->imx_gpu_govern.shader_clk_freq[i]; + + len += sprintf(buf + len, + "%s:\tcore_clk frequency: %lu\tshader_clk frequency: %lu\n", + govern_modes[i], core_freq, shader_freq); } - strcat(buf,"Currently GPU runs on mode "); - strcat(buf,mode); - return strlen(buf); + + len += sprintf(buf + len, "Currently GPU runs on mode %s\n", + govern_modes[priv->imx_gpu_govern.current_mode]); + + return len; } -static ssize_t gpu_mode_store(struct device_driver *dev, const char *buf, size_t count) +static ssize_t gpu_govern_store(struct device_driver *dev, const char *buf, size_t count) { unsigned long core_freq = 0; unsigned long shader_freq = 0; struct imx_priv *priv = &imxPriv; int core = gcvCORE_MAJOR; + int i; - do{ - if(strstr(buf,"overdrive")) - { - core_freq = priv->imx_gpu_govern.core_clk_freq[OVERDRIVE]; - shader_freq = priv->imx_gpu_govern.shader_clk_freq[OVERDRIVE]; - priv->imx_gpu_govern.current_mode = OVERDRIVE; - break; - } - if(strstr(buf,"nominal")) - { - core_freq = priv->imx_gpu_govern.core_clk_freq[NOMINAL]; - shader_freq = priv->imx_gpu_govern.shader_clk_freq[NOMINAL]; - priv->imx_gpu_govern.current_mode = NOMINAL; - break; - } - if(strstr(buf,"underdrive")) + for (i = 0; i < GOVERN_COUNT; i++) + { + if (strstr(buf, govern_modes[i])) { - core_freq = priv->imx_gpu_govern.core_clk_freq[UNDERDRIVE]; - shader_freq = priv->imx_gpu_govern.shader_clk_freq[UNDERDRIVE]; - priv->imx_gpu_govern.current_mode = UNDERDRIVE; break; } - }while(0); + } - while(core != gcvCORE_3D_MAX) + if (i == GOVERN_COUNT) { - struct clk* clk_core = priv->imx_gpu_clks[core].clk_core; + return count; + } + + core_freq = priv->imx_gpu_govern.core_clk_freq[i]; + shader_freq = priv->imx_gpu_govern.shader_clk_freq[i]; + priv->imx_gpu_govern.current_mode = i; + + for (core = gcvCORE_MAJOR; core <= gcvCORE_3D_MAX; core++) + { + struct clk* clk_core = priv->imx_gpu_clks[core].clk_core; struct clk* clk_shader = priv->imx_gpu_clks[core].clk_shader; - if(clk_core != NULL && clk_shader != NULL && core_freq != 0 && shader_freq != 0) + + if (clk_core != NULL && clk_shader != NULL && + core_freq != 0 && shader_freq != 0) { - clk_set_rate(clk_core,core_freq); - clk_set_rate(clk_shader,shader_freq); + clk_set_rate(clk_core, core_freq); + clk_set_rate(clk_shader, shader_freq); } - core++; } + return count; } -static DRIVER_ATTR_RW(gpu_mode); +static DRIVER_ATTR_RW(gpu_govern); + int init_gpu_opp_table(struct device *dev) { @@ -523,17 +503,22 @@ int init_gpu_opp_table(struct device *dev) const __be32 *val; int nr; int ret = 0; - int govern = 0; - int tuple_count = 0; + int i; struct imx_priv *priv = &imxPriv; + priv->imx_gpu_govern.num_modes = 0; priv->imx_gpu_govern.current_mode = OVERDRIVE; prop = of_find_property(dev->of_node, "operating-points", NULL); - if (!prop) + if (!prop) { + dev_err(dev, "operating-points missing. Frequency scaling will not work\n"); return -ENODEV; - if (!prop->value) + } + + if (!prop->value) { + dev_err(dev, "operating-points invalid. Frequency scaling will not work\n"); return -ENODATA; + } /* * Each OPP is a set of tuples consisting of frequency and @@ -544,48 +529,51 @@ int init_gpu_opp_table(struct device *dev) dev_err(dev, "%s: Invalid OPP list\n", __func__); return -EINVAL; } - tuple_count = nr; + val = prop->value; - while (nr > 0) { - unsigned long core_freq,core_volt,shader_freq,shader_volt; + + for (i = 0; nr > 0 && i < GOVERN_COUNT; nr -= 4) + { + unsigned long core_freq, core_volt, shader_freq, shader_volt; + core_freq = be32_to_cpup(val++) * 1000; core_volt = be32_to_cpup(val++); - if(nr == 2) + + if (nr == 2) { shader_freq = core_freq; shader_volt = core_volt; } - else{ + else + { shader_freq = be32_to_cpup(val++) * 1000; shader_volt = be32_to_cpup(val++); } - /*We only register core_clk frequency*/ + /* We only register core_clk frequency */ if (dev_pm_opp_add(dev, core_freq, core_volt)) { dev_warn(dev, "%s: Failed to add OPP %ld\n", __func__, core_freq); - nr -= 4; continue; } - priv->imx_gpu_govern.core_clk_freq[govern] = core_freq; - priv->imx_gpu_govern.shader_clk_freq[govern] = shader_freq; - govern++; - priv->imx_gpu_govern.num_modes++; - if(govern == GOVERN_COUNT) - break; + priv->imx_gpu_govern.core_clk_freq[i] = core_freq; + priv->imx_gpu_govern.shader_clk_freq[i] = shader_freq; - nr -= 4; + i++; } + + priv->imx_gpu_govern.num_modes = i; priv->imx_gpu_govern.dev = dev; - if(priv->imx_gpu_govern.num_modes > 0) + if (priv->imx_gpu_govern.num_modes > 0) { - ret = driver_create_file(dev->driver, &driver_attr_gpu_mode); + ret = driver_create_file(dev->driver, &driver_attr_gpu_govern); if (ret) - dev_err(dev, "create gpu_mode attr failed (%d)\n", ret); + dev_err(dev, "create gpu_govern attr failed (%d)\n", ret); } + return ret; } @@ -593,16 +581,21 @@ int remove_gpu_opp_table(void) { struct imx_priv *priv = &imxPriv; struct device* dev = priv->imx_gpu_govern.dev; - int govern = 0; - while(govern != priv->imx_gpu_govern.num_modes) + int i = 0; + + for (i = 0; i < priv->imx_gpu_govern.num_modes; i++) { unsigned long core_freq; - core_freq = priv->imx_gpu_govern.core_clk_freq[govern]; - dev_pm_opp_remove(dev,core_freq); - govern++; + + core_freq = priv->imx_gpu_govern.core_clk_freq[i]; + dev_pm_opp_remove(dev, core_freq); + } + + if (i > 0) + { + driver_remove_file(dev->driver, &driver_attr_gpu_govern); } - if(priv->imx_gpu_govern.num_modes > 0) - driver_remove_file(dev->driver, &driver_attr_gpu_mode); + return 0; } #endif @@ -893,18 +886,6 @@ static int patch_param(struct platform_device *pdev, #endif patch_param_imx6(pdev, args); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) - if(args->compression == -1) - { - const u32 *property; - args->compression = gcvCOMPRESSION_OPTION_DEFAULT; - property = of_get_property(pdev->dev.of_node, "depth-compression", NULL); - if (property && *property == 0) - { - args->compression &= ~gcvCOMPRESSION_OPTION_DEPTH; - } - } -#endif res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phys_baseaddr"); if (res && !args->baseAddress && !args->physSize) { @@ -1159,7 +1140,9 @@ static inline int get_power(struct device *pdev) #endif #if defined(CONFIG_PM_OPP) - init_gpu_opp_table(pdev); + ret = init_gpu_opp_table(pdev); + if (ret) + dev_err(pdev, "OPP init failed!\n"); #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) diff --git a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c index fda0493e14c5..396712e81aed 100644 --- a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c +++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c @@ -223,9 +223,9 @@ _AllocateStlb( gcmkONERROR(gctaOS_GetPhysicalAddress(Os, stlb->logical, &stlb->physBase)); #if gcdUSE_MMU_EXCEPTION - _FillPageTable(stlb->logical, stlb->size / 4, gcdMMU_STLB_EXCEPTION); + _FillPageTable(stlb->logical, (gctUINT32)stlb->size / 4, gcdMMU_STLB_EXCEPTION); #else - gctaOS_ZeroMemory(stlb->logical, stlb->size); + gctaOS_ZeroMemory(stlb->logical, (gctUINT32)stlb->size); #endif *Stlb = stlb; @@ -273,15 +273,15 @@ gctaMMU_Construct( )); #if gcdUSE_MMU_EXCEPTION - _FillPageTable(mmu->mtlbLogical, mmu->mtlbBytes / 4, gcdMMU_STLB_EXCEPTION); + _FillPageTable(mmu->mtlbLogical, (gctUINT32)mmu->mtlbBytes / 4, gcdMMU_STLB_EXCEPTION); #else - gctaOS_ZeroMemory(mmu->mtlbLogical, mmu->mtlbBytes); + gctaOS_ZeroMemory(mmu->mtlbLogical, (gctUINT32)mmu->mtlbBytes); #endif /* Allocate a array to store stlbs. */ - gcmkONERROR(gctaOS_Allocate(mmu->mtlbBytes, &mmu->stlbs)); + gcmkONERROR(gctaOS_Allocate((gctUINT32)mmu->mtlbBytes, &mmu->stlbs)); - gctaOS_ZeroMemory((gctUINT8_PTR)mmu->stlbs, mmu->mtlbBytes); + gctaOS_ZeroMemory((gctUINT8_PTR)mmu->stlbs, (gctUINT32)mmu->mtlbBytes); /* Allocate security safe page. */ gcmkONERROR(gctaOS_AllocateSecurityMemory( @@ -291,7 +291,7 @@ gctaMMU_Construct( &mmu->safePagePhysical )); - gctaOS_ZeroMemory((gctUINT8_PTR)mmu->safePageLogical, bytes); + gctaOS_ZeroMemory((gctUINT8_PTR)mmu->safePageLogical, (gctUINT32)bytes); /* Allocate non security safe page. */ gcmkONERROR(gctaOS_AllocateSecurityMemory( @@ -301,7 +301,7 @@ gctaMMU_Construct( &mmu->nonSecureSafePagePhysical )); - gctaOS_ZeroMemory((gctUINT8_PTR)mmu->nonSecureSafePageLogical, bytes); + gctaOS_ZeroMemory((gctUINT8_PTR)mmu->nonSecureSafePageLogical, (gctUINT32)bytes); /* gcmkONERROR(gctaOS_CreateMutex(TA->os, &mmu->mutex)); */ diff --git a/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c b/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c index b5dac8da1501..bd2fcbae2581 100644 --- a/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c +++ b/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c @@ -136,7 +136,7 @@ gctaOS_AllocateSecurityMemory( { gceSTATUS status; - gcmkONERROR(gckOS_AllocateNonPagedMemory(Os->os, gcvFALSE, Bytes, (gctPHYS_ADDR *)Physical, Logical)); + gcmkONERROR(gckOS_AllocateNonPagedMemory(Os->os, gcvFALSE, gcvALLOC_FLAG_CONTIGUOUS, Bytes, (gctPHYS_ADDR *)Physical, Logical)); return gcvSTATUS_OK; @@ -166,7 +166,7 @@ gctaOS_AllocateNonSecurityMemory( { gceSTATUS status; - gcmkONERROR(gckOS_AllocateNonPagedMemory(Os->os, gcvFALSE, Bytes, (gctPHYS_ADDR *)Physical, Logical)); + gcmkONERROR(gckOS_AllocateNonPagedMemory(Os->os, gcvFALSE, gcvALLOC_FLAG_CONTIGUOUS, Bytes, (gctPHYS_ADDR *)Physical, Logical)); return gcvSTATUS_OK; @@ -215,6 +215,8 @@ gctaOS_GetPhysicalAddress( gcmkONERROR(gckOS_GetPhysicalAddress(Os->os, Logical, &physical)); + gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os->os, physical, &physical)); + *Physical = (gctUINT32)physical; return gcvSTATUS_OK; |