OUT gctUINT64 *ShStart
)
{
- gceSTATUS status;
+ gceSTATUS status = gcvSTATUS_OK;
gctUINT64 mcStart, shStart;
gcmkONERROR(gckOS_GetTime(&mcStart));
OUT gctUINT32 *ShClk
)
{
- gceSTATUS status;
+ gceSTATUS status = gcvSTATUS_OK;
gctUINT64 mcEnd, shEnd;
gctUINT32 mcCycle, shCycle;
gctUINT64 mcFreq, shFreq = 0;
return status;
}
+/*******************************************************************************
+**
+** gckHARDWARE_QueryFrequency
+**
+** Query current hardware frequency.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+*/
+gceSTATUS
+gckHARDWARE_QueryFrequency(
+ IN gckHARDWARE Hardware
+ )
+{
+ gctUINT64 mcStart, shStart;
+ gctUINT32 mcClk, shClk;
+ gceSTATUS status;
+ gctUINT32 powerManagement = 0;
+
+ gcmkHEADER_ARG("Hardware=0x%p", Hardware);
+
+ gcmkVERIFY_ARGUMENT(Hardware != NULL);
+
+ mcStart = shStart = 0;
+ mcClk = shClk = 0;
+
+ gckOS_QueryOption(Hardware->os, "powerManagement", &powerManagement);
+
+ if (powerManagement)
+ {
+ gcmkONERROR(gckHARDWARE_SetPowerManagement(
+ Hardware, gcvFALSE
+ ));
+ }
+
+ gcmkONERROR(gckHARDWARE_SetPowerManagementState(
+ Hardware, gcvPOWER_ON_AUTO
+ ));
+
+ gckHARDWARE_EnterQueryClock(Hardware, &mcStart, &shStart);
+
+ gcmkONERROR(gckOS_Delay(Hardware->os, 50));
+
+ if (mcStart)
+ {
+ gckHARDWARE_ExitQueryClock(Hardware,
+ mcStart, shStart,
+ &mcClk, &shClk);
+
+ Hardware->mcClk = mcClk;
+ Hardware->shClk = shClk;
+ }
+
+ if (powerManagement)
+ {
+ gcmkONERROR(gckHARDWARE_SetPowerManagement(
+ Hardware, gcvTRUE
+ ));
+ }
+
+ gcmkFOOTER_NO();
+
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+
+ return status;
+}
+
return gcvSTATUS_OK;
}
+/*******************************************************************************
+**
+** gckGALDEVICE_QueryFrequency
+**
+** Query frequency for all the hardwares.
+**
+*/
gceSTATUS
gckGALDEVICE_QueryFrequency(
IN gckGALDEVICE Device
}
#endif
- if (Device->kernels[i] && mcStart[i])
+ if (Device->kernels[i])
{
hardware = Device->kernels[i]->hardware;
+ if (mcStart[i])
+ {
+ gckHARDWARE_ExitQueryClock(hardware,
+ mcStart[i], shStart[i],
+ &mcClk[i], &shClk[i]);
+ }
+
+ hardware->mcClk = mcClk[i];
+ hardware->shClk = shClk[i];
+
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 gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+
return status;
}
/* Start the kernel thread. */
gcmkONERROR(gckGALDEVICE_Start_Threads(Device));
- gcmkONERROR(gckGALDEVICE_QueryFrequency(Device));
-
for (i = 0; i < gcvCORE_COUNT; i++)
{
if (i == gcvCORE_VG)