From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vince Hsu Subject: [PATCH nouveau 10/11] platform: add suspend/resume support Date: Tue, 23 Dec 2014 18:40:03 +0800 Message-ID: <1419331204-26679-11-git-send-email-vinceh@nvidia.com> References: <1419331204-26679-1-git-send-email-vinceh@nvidia.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1419331204-26679-1-git-send-email-vinceh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org, gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, martin.peres-GANU6spQydw@public.gmane.org, seven-FA6nBp6kBxZzu6KWmfFNGwC/G2K4zDHf@public.gmane.org, samuel.pitoiset-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org Cc: linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-tegra@vger.kernel.org V2UgcmV1c2UgbW9zdCBvZiB0aGUgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb25zIG9mIHRoZSBkR1BV IGZvciBub3V2ZWF1CnBsYXRmb3JtIGRldmljZS4gT25seSB0aGUgcG93ZXIgdXAvZG93biBzZXF1 ZW5jZXMgbmVlZCB0byBiZSBoYW5kbGVkCnNlcGFyYXRlbHkuCgpTaWduZWQtb2ZmLWJ5OiBWaW5j ZSBIc3UgPHZpbmNlaEBudmlkaWEuY29tPgotLS0KIGRybS9ub3V2ZWF1X3BsYXRmb3JtLmMgfCA2 MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBm aWxlIGNoYW5nZWQsIDYwIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcm0vbm91dmVhdV9w bGF0Zm9ybS5jIGIvZHJtL25vdXZlYXVfcGxhdGZvcm0uYwppbmRleCA1MjdmZTIzNThmYzkuLjUx YmZjZTU5YzQ5OCAxMDA2NDQKLS0tIGEvZHJtL25vdXZlYXVfcGxhdGZvcm0uYworKysgYi9kcm0v bm91dmVhdV9wbGF0Zm9ybS5jCkBAIC0yMTEsNiArMjExLDY1IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIG5vdXZlYXVfcGxhdGZvcm1fbWF0Y2hbXSA9IHsKIE1PRFVMRV9ERVZJ Q0VfVEFCTEUob2YsIG5vdXZlYXVfcGxhdGZvcm1fbWF0Y2gpOwogI2VuZGlmCiAKK3N0YXRpYyBp bnQKK25vdXZlYXVfcGxhdGZvcm1fcG1vcHNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7 CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYp OworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRl dik7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShkcm1fZGV2KTsKKwlz dHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52a21fZGV2aWNlKCZkcm0tPmRldmljZSk7 CisJc3RydWN0IG5vdXZlYXVfcGxhdGZvcm1fZ3B1ICpncHUgPSBudl9kZXZpY2VfdG9fcGxhdGZv cm0oZGV2aWNlKS0+Z3B1OworCWludCByZXQ7CisKKwlpZiAoZHJtX2Rldi0+c3dpdGNoX3Bvd2Vy X3N0YXRlID09IERSTV9TV0lUQ0hfUE9XRVJfT0ZGIHx8CisJICAgIGRybV9kZXYtPnN3aXRjaF9w b3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX0RZTkFNSUNfT0ZGKQorCQlyZXR1cm4gMDsK KworCXJldCA9IG5vdXZlYXVfZG9fc3VzcGVuZChkcm1fZGV2LCBmYWxzZSk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfcGxhdGZvcm1fcG93ZXJfZG93bihncHUp OworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcG93ZXIgZG93biBncHUg KGVycjolZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQKK25vdXZlYXVfcGxhdGZvcm1fcG1vcHNfcmVzdW1lKHN0cnVjdCBkZXZpY2Ug KmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2 aWNlKGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2 ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKGRybV9k ZXYpOworCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2aWNlID0gbnZrbV9kZXZpY2UoJmRybS0+ ZGV2aWNlKTsKKwlzdHJ1Y3Qgbm91dmVhdV9wbGF0Zm9ybV9ncHUgKmdwdSA9IG52X2RldmljZV90 b19wbGF0Zm9ybShkZXZpY2UpLT5ncHU7CisJaW50IHJldDsKKworCWlmIChkcm1fZGV2LT5zd2l0 Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYgfHwKKwkgICAgZHJtX2Rldi0+ c3dpdGNoX3Bvd2VyX3N0YXRlID09IERSTV9TV0lUQ0hfUE9XRVJfRFlOQU1JQ19PRkYpCisJCXJl dHVybiAwOworCisJcmV0ID0gbm91dmVhdV9wbGF0Zm9ybV9wb3dlcl91cChncHUpOworCWlmIChy ZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcG93ZXIgdXAgZ3B1XG4iKTsKKwkJcmV0 dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2RvX3Jlc3VtZShkcm1fZGV2LCBmYWxzZSk7 CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29u c3Qgc3RydWN0IGRldl9wbV9vcHMgbm91dmVhdV9wbGF0Zm9ybV9wbV9vcHMgPSB7CisJLnN1c3Bl bmQgPSBub3V2ZWF1X3BsYXRmb3JtX3Btb3BzX3N1c3BlbmQsCisJLnJlc3VtZSA9IG5vdXZlYXVf cGxhdGZvcm1fcG1vcHNfcmVzdW1lLAorfTsKKwogc3RydWN0IHBsYXRmb3JtX2RyaXZlciBub3V2 ZWF1X3BsYXRmb3JtX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJub3V2ZWF1 IiwKQEAgLTIxOCw2ICsyNzcsNyBAQCBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG5vdXZlYXVfcGxh dGZvcm1fZHJpdmVyID0gewogCX0sCiAJLnByb2JlID0gbm91dmVhdV9wbGF0Zm9ybV9wcm9iZSwK IAkucmVtb3ZlID0gbm91dmVhdV9wbGF0Zm9ybV9yZW1vdmUsCisJLmRyaXZlci5wbSA9ICZub3V2 ZWF1X3BsYXRmb3JtX3BtX29wcywKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobm91dmVh dV9wbGF0Zm9ybV9kcml2ZXIpOwotLSAKMS45LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCk5vdXZlYXUgbWFpbGluZyBsaXN0Ck5vdXZlYXVAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9ub3V2ZWF1Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755992AbaLWKkg (ORCPT ); Tue, 23 Dec 2014 05:40:36 -0500 Received: from hqemgate15.nvidia.com ([216.228.121.64]:18063 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755971AbaLWKke (ORCPT ); Tue, 23 Dec 2014 05:40:34 -0500 X-PGP-Universal: processed; by hqnvupgp07.nvidia.com on Tue, 23 Dec 2014 02:35:24 -0800 From: Vince Hsu To: thierry.reding@gmail.com, swarren@wwwdotorg.org, gnurou@gmail.com, bskeggs@redhat.com, martin.peres@free.fr, seven@nimrod-online.com, samuel.pitoiset@gmail.com CC: nouveau@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, Vince Hsu Subject: [PATCH nouveau 10/11] platform: add suspend/resume support Date: Tue, 23 Dec 2014 18:40:03 +0800 Message-ID: <1419331204-26679-11-git-send-email-vinceh@nvidia.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1419331204-26679-1-git-send-email-vinceh@nvidia.com> References: <1419331204-26679-1-git-send-email-vinceh@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We reuse most of the suspend/resume functions of the dGPU for nouveau platform device. Only the power up/down sequences need to be handled separately. Signed-off-by: Vince Hsu --- drm/nouveau_platform.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/drm/nouveau_platform.c b/drm/nouveau_platform.c index 527fe2358fc9..51bfce59c498 100644 --- a/drm/nouveau_platform.c +++ b/drm/nouveau_platform.c @@ -211,6 +211,65 @@ static const struct of_device_id nouveau_platform_match[] = { MODULE_DEVICE_TABLE(of, nouveau_platform_match); #endif +static int +nouveau_platform_pmops_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct drm_device *drm_dev = platform_get_drvdata(pdev); + struct nouveau_drm *drm = nouveau_drm(drm_dev); + struct nouveau_device *device = nvkm_device(&drm->device); + struct nouveau_platform_gpu *gpu = nv_device_to_platform(device)->gpu; + int ret; + + if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF || + drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) + return 0; + + ret = nouveau_do_suspend(drm_dev, false); + if (ret) + return ret; + + ret = nouveau_platform_power_down(gpu); + if (ret) { + dev_err(dev, "failed to power down gpu (err:%d)\n", ret); + return ret; + } + + return 0; +} + +static int +nouveau_platform_pmops_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct drm_device *drm_dev = platform_get_drvdata(pdev); + struct nouveau_drm *drm = nouveau_drm(drm_dev); + struct nouveau_device *device = nvkm_device(&drm->device); + struct nouveau_platform_gpu *gpu = nv_device_to_platform(device)->gpu; + int ret; + + if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF || + drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) + return 0; + + ret = nouveau_platform_power_up(gpu); + if (ret) { + dev_err(dev, "failed to power up gpu\n"); + return ret; + } + + ret = nouveau_do_resume(drm_dev, false); + if (ret) + return ret; + + return 0; +} + +static const struct dev_pm_ops nouveau_platform_pm_ops = { + .suspend = nouveau_platform_pmops_suspend, + .resume = nouveau_platform_pmops_resume, +}; + struct platform_driver nouveau_platform_driver = { .driver = { .name = "nouveau", @@ -218,6 +277,7 @@ struct platform_driver nouveau_platform_driver = { }, .probe = nouveau_platform_probe, .remove = nouveau_platform_remove, + .driver.pm = &nouveau_platform_pm_ops, }; module_platform_driver(nouveau_platform_driver); -- 1.9.1