static gctINT __set_gpu_power(gckGALDEVICE Device, gceCHIPPOWERSTATE State) { gceSTATUS status = gcvSTATUS_OK; gctINT i; for (i = 0; i < gcdMAX_GPU_COUNT; i++) { if (Device->kernels[i] != gcvNULL) { #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(Device->kernels[i]->vg->hardware, State); } else #endif { status = gckHARDWARE_SetPowerManagementState(Device->kernels[i]->hardware, State); } if (gcmIS_ERROR(status)) { return -1; } } } return 0; }
static int __devinit gpu_suspend(struct platform_device *dev, pm_message_t state) { gceSTATUS status = gcvSTATUS_OK; gckGALDEVICE device; gctINT i; gctINT ret = 0; device = platform_get_drvdata(dev); printk("[galcore] enter %s\n", __FUNCTION__); for (i = 0; i < gcdMAX_GPU_COUNT; i++) { if (device->kernels[i] != gcvNULL) { /* Store states. */ #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_QueryPowerManagementState(device->kernels[i]->vg->hardware, &device->statesStored[i]); } else #endif { status = gckHARDWARE_QueryPowerManagementState(device->kernels[i]->hardware, &device->statesStored[i]); } if (gcmIS_ERROR(status)) { ret = -1; goto err_out; } #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(device->kernels[i]->vg->hardware, gcvPOWER_OFF); } else #endif { status = gckHARDWARE_SetPowerManagementState(device->kernels[i]->hardware, gcvPOWER_OFF); } if (gcmIS_ERROR(status)) { ret = -1; goto err_out; } galDevice->currentPMode = gcvPM_SUSPEND; } } err_out: printk("[galcore] exit %s, return %d\n", __FUNCTION__, ret); return ret; }
static int gpu_suspend(struct platform_device *dev, pm_message_t state) { gceSTATUS status; gckGALDEVICE device; gctINT i; device = platform_get_drvdata(dev); if (!device) { return -1; } for (i = 0; i < gcdMAX_GPU_COUNT; i++) { if (device->kernels[i] != gcvNULL) { /* Store states. */ #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_QueryPowerManagementState(device->kernels[i]->vg->hardware, &device->statesStored[i]); } else #endif { status = gckHARDWARE_QueryPowerManagementState(device->kernels[i]->hardware, &device->statesStored[i]); } if (gcmIS_ERROR(status)) { return -1; } #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(device->kernels[i]->vg->hardware, gcvPOWER_OFF); } else #endif { status = gckHARDWARE_SetPowerManagementState(device->kernels[i]->hardware, gcvPOWER_OFF); } if (gcmIS_ERROR(status)) { return -1; } } } return 0; }
static int gpu_resume(struct platform_device *dev) { gceSTATUS status; gckGALDEVICE device; gctINT i; gceCHIPPOWERSTATE statesStored; device = platform_get_drvdata(dev); if (!device) { return -1; } for (i = 0; i < gcdMAX_GPU_COUNT; i++) { if (device->kernels[i] != gcvNULL) { #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(device->kernels[i]->vg->hardware, gcvPOWER_ON); } else #endif { status = gckHARDWARE_SetPowerManagementState(device->kernels[i]->hardware, gcvPOWER_ON); } if (gcmIS_ERROR(status)) { return -1; } /* Convert global state to crossponding internal state. */ switch(device->statesStored[i]) { case gcvPOWER_OFF: statesStored = gcvPOWER_OFF_BROADCAST; break; case gcvPOWER_IDLE: statesStored = gcvPOWER_IDLE_BROADCAST; break; case gcvPOWER_SUSPEND: statesStored = gcvPOWER_SUSPEND_BROADCAST; break; case gcvPOWER_ON: statesStored = gcvPOWER_ON_AUTO; break; default: statesStored = device->statesStored[i]; break; } /* Restore states. */ #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(device->kernels[i]->vg->hardware, statesStored); } else #endif { status = gckHARDWARE_SetPowerManagementState(device->kernels[i]->hardware, statesStored); } if (gcmIS_ERROR(status)) { return -1; } } } return 0; }
static int __devinit gpu_resume(struct platform_device *dev) { gceSTATUS status = gcvSTATUS_OK; gckGALDEVICE device; gctINT i; gctINT ret = 0; gceCHIPPOWERSTATE statesStored; device = platform_get_drvdata(dev); printk("[galcore] enter %s\n", __FUNCTION__); for (i = 0; i < gcdMAX_GPU_COUNT; i++) { if (device->kernels[i] != gcvNULL) { #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(device->kernels[i]->vg->hardware, gcvPOWER_ON); } else #endif { status = gckHARDWARE_SetPowerManagementState(device->kernels[i]->hardware, gcvPOWER_ON); } if (gcmIS_ERROR(status)) { ret = -1; goto err_out; } /* Convert global state to crossponding internal state. */ switch(device->statesStored[i]) { case gcvPOWER_OFF: statesStored = gcvPOWER_OFF_BROADCAST; break; case gcvPOWER_IDLE: statesStored = gcvPOWER_IDLE_BROADCAST; break; case gcvPOWER_SUSPEND: statesStored = gcvPOWER_SUSPEND_BROADCAST; break; case gcvPOWER_ON: statesStored = gcvPOWER_ON_AUTO; break; default: statesStored = device->statesStored[i]; break; } /* Restore states. */ #if gcdENABLE_VG if (i == gcvCORE_VG) { status = gckVGHARDWARE_SetPowerManagementState(device->kernels[i]->vg->hardware, statesStored); } else #endif { status = gckHARDWARE_SetPowerManagementState(device->kernels[i]->hardware, statesStored); } if (gcmIS_ERROR(status)) { ret = -1; goto err_out; } #if MRVL_CONFIG_ENABLE_EARLYSUSPEND galDevice->currentPMode = gcvPM_EARLY_SUSPEND; #else galDevice->currentPMode = gcvPM_NORMAL; #endif } } err_out: printk("[galcore] exit %s, return %d\n", __FUNCTION__, ret); return ret; }