From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 1/1] drm/msm/a6xx: Add support for an interconnect path Date: Wed, 28 Nov 2018 11:29:29 -0700 Message-ID: <20181128182929.19925-2-jcrouse@codeaurora.org> References: <20181128182929.19925-1-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20181128182929.19925-1-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: georgi.djakov-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org List-Id: linux-arm-msm@vger.kernel.org VHJ5IHRvIGdldCB0aGUgaW50ZXJjb25uZWN0IHBhdGggZm9yIHRoZSBHUFUgYW5kIHZvdGUgZm9y IHRoZSBtYXhpbXVtCmJhbmR3aWR0aCB0byBzdXBwb3J0IGFsbCBmcmVxdWVuY2llcy4gVGhpcyBp cyBuZWVkZWQgZm9yIHBlcmZvcm1hbmNlLgpMYXRlciB3ZSB3aWxsIHdhbnQgdG8gc2NhbGUgdGhl IGJhbmR3aWR0aCBiYXNlZCBvbiB0aGUgZnJlcXVlbmN5IHRvCmFsc28gb3B0aW1pemUgZm9yIHBv d2VyIGJ1dCB0aGF0IHdpbGwgcmVxdWlyZSBzb21lIGRldmljZSB0cmVlCmluZnJhc3RydWN0dXJl IHRoYXQgZG9lcyBub3QgeWV0IGV4aXN0LgoKU2lnbmVkLW9mZi1ieTogSm9yZGFuIENyb3VzZSA8 amNyb3VzZUBjb2RlYXVyb3JhLm9yZz4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9h Nnh4X2dtdS5jICAgfCAyMCArKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL21z bS9hZHJlbm8vYWRyZW5vX2dwdS5jIHwgIDkgKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vbXNt L21zbV9ncHUuaCAgICAgICAgICAgfCAgMyArKysKIDMgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0 aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211 LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4X2dtdS5jCmluZGV4IDU0NjU5OWE3 YWIwNS4uYjk2YWUyYWIwNGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVu by9hNnh4X2dtdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E2eHhfZ211LmMK QEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51 eC9wbV9vcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcmNvbm5lY3QuaD4KICNpbmNsdWRlIDxz b2MvcWNvbS9jbWQtZGIuaD4KIAogI2luY2x1ZGUgImE2eHhfZ3B1LmgiCkBAIC02Myw2ICs2NCw5 IEBAIHN0YXRpYyBib29sIGE2eHhfZ211X2d4X2lzX29uKHN0cnVjdCBhNnh4X2dtdSAqZ211KQog CiBzdGF0aWMgdm9pZCBfX2E2eHhfZ211X3NldF9mcmVxKHN0cnVjdCBhNnh4X2dtdSAqZ211LCBp bnQgaW5kZXgpCiB7CisJc3RydWN0IGE2eHhfZ3B1ICphNnh4X2dwdSA9IGNvbnRhaW5lcl9vZihn bXUsIHN0cnVjdCBhNnh4X2dwdSwgZ211KTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdSAqYWRyZW5vX2dw dSA9ICZhNnh4X2dwdS0+YmFzZTsKKwlzdHJ1Y3QgbXNtX2dwdSAqZ3B1ID0gJmFkcmVub19ncHUt PmJhc2U7CiAJaW50IHJldDsKIAogCWdtdV93cml0ZShnbXUsIFJFR19BNlhYX0dNVV9EQ1ZTX0FD S19PUFRJT04sIDApOwpAQCAtODUsNiArODksMTIgQEAgc3RhdGljIHZvaWQgX19hNnh4X2dtdV9z ZXRfZnJlcShzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSwgaW50IGluZGV4KQogCQlkZXZfZXJyKGdtdS0+ ZGV2LCAiR01VIHNldCBHUFUgZnJlcXVlbmN5IGVycm9yOiAlZFxuIiwgcmV0KTsKIAogCWdtdS0+ ZnJlcSA9IGdtdS0+Z3B1X2ZyZXFzW2luZGV4XTsKKworCS8qCisJICogRXZlbnR1YWxseSB3ZSB3 aWxsIHdhbnQgdG8gc2NhbGUgdGhlIHBhdGggdm90ZSB3aXRoIHRoZSBmcmVxdWVuY3kgYnV0CisJ ICogZm9yIG5vdyBsZWF2ZSBpdCB0IGF0IG1heCBzbyB0aGF0IHRoZSBwZXJmb3JtYW5jZSBpcyBu b21pbmFsLgorCSAqLworCWljY19zZXQoZ3B1LT5pY2NfcGF0aCwgMCwgNzIxNjAwMDAwMCk7CiB9 CiAKIHZvaWQgYTZ4eF9nbXVfc2V0X2ZyZXEoc3RydWN0IG1zbV9ncHUgKmdwdSwgdW5zaWduZWQg bG9uZyBmcmVxKQpAQCAtNjgwLDYgKzY5MCw4IEBAIGludCBhNnh4X2dtdV9yZXNldChzdHJ1Y3Qg YTZ4eF9ncHUgKmE2eHhfZ3B1KQogCiBpbnQgYTZ4eF9nbXVfcmVzdW1lKHN0cnVjdCBhNnh4X2dw dSAqYTZ4eF9ncHUpCiB7CisJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSAmYTZ4eF9n cHUtPmJhc2U7CisJc3RydWN0IG1zbV9ncHUgKmdwdSA9ICZhZHJlbm9fZ3B1LT5iYXNlOwogCXN0 cnVjdCBhNnh4X2dtdSAqZ211ID0gJmE2eHhfZ3B1LT5nbXU7CiAJaW50IHN0YXR1cywgcmV0Owog CkBAIC02OTUsNiArNzA3LDkgQEAgaW50IGE2eHhfZ211X3Jlc3VtZShzdHJ1Y3QgYTZ4eF9ncHUg KmE2eHhfZ3B1KQogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCisJLyogU2V0IHRoZSBidXMgcXVv dGEgdG8gYSByZWFzb25hYmxlIHZhbHVlIGZvciBib290ICovCisJaWNjX3NldChncHUtPmljY19w YXRoLCAwLCAzMDcyMDAwMDAwKTsKKwogCWE2eHhfZ211X2lycV9lbmFibGUoZ211KTsKIAogCS8q IENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZG9pbmcgYSBjb2xkIG9yIHdhcm0gYm9vdCAqLwpAQCAt NzM1LDYgKzc1MCw4IEBAIGJvb2wgYTZ4eF9nbXVfaXNpZGxlKHN0cnVjdCBhNnh4X2dtdSAqZ211 KQogCiBpbnQgYTZ4eF9nbXVfc3RvcChzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQogeworCXN0 cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gJmE2eHhfZ3B1LT5iYXNlOworCXN0cnVjdCBt c21fZ3B1ICpncHUgPSAmYWRyZW5vX2dwdS0+YmFzZTsKIAlzdHJ1Y3QgYTZ4eF9nbXUgKmdtdSA9 ICZhNnh4X2dwdS0+Z211OwogCXUzMiB2YWw7CiAKQEAgLTc4MSw2ICs3OTgsOSBAQCBpbnQgYTZ4 eF9nbXVfc3RvcChzdHJ1Y3QgYTZ4eF9ncHUgKmE2eHhfZ3B1KQogCS8qIFRlbGwgUlBNaCB0byBw b3dlciBvZmYgdGhlIEdQVSAqLwogCWE2eHhfcnBtaF9zdG9wKGdtdSk7CiAKKwkvKiBSZW1vdmUg dGhlIGJ1cyB2b3RlICovCisJaWNjX3NldChncHUtPmljY19wYXRoLCAwLCAwKTsKKwogCWNsa19i dWxrX2Rpc2FibGVfdW5wcmVwYXJlKGdtdS0+bnJfY2xvY2tzLCBnbXUtPmNsb2Nrcyk7CiAKIAlw bV9ydW50aW1lX3B1dF9zeW5jKGdtdS0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9tc20vYWRyZW5vL2FkcmVub19ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2Fk cmVub19ncHUuYwppbmRleCA5M2Q3MGY0YTIxNTQuLjliYWI0OTE5MTJjZiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUg PGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX29wcC5oPgogI2luY2x1ZGUgPGxp bnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcmNvbm5lY3QuaD4KICNpbmNsdWRlICJh ZHJlbm9fZ3B1LmgiCiAjaW5jbHVkZSAibXNtX2dlbS5oIgogI2luY2x1ZGUgIm1zbV9tbXUuaCIK QEAgLTY5NSw2ICs2OTYsMTEgQEAgc3RhdGljIGludCBhZHJlbm9fZ2V0X3B3cmxldmVscyhzdHJ1 Y3QgZGV2aWNlICpkZXYsCiAKIAlEQkcoImZhc3RfcmF0ZT0ldSwgc2xvd19yYXRlPTI3MDAwMDAw IiwgZ3B1LT5mYXN0X3JhdGUpOwogCisJLyogQ2hlY2sgZm9yIGFuIGludGVyY29ubmVjdCBwYXRo IGZvciB0aGUgYnVzICovCisJZ3B1LT5pY2NfcGF0aCA9IG9mX2ljY19nZXQoZGV2LCAicG9ydDAi KTsKKwlpZiAoSVNfRVJSKGdwdS0+aWNjX3BhdGgpKQorCQlncHUtPmljY19wYXRoID0gTlVMTDsK KwogCXJldHVybiAwOwogfQogCkBAIC03MzMsMTAgKzczOSwxMyBAQCBpbnQgYWRyZW5vX2dwdV9p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYs CiAKIHZvaWQgYWRyZW5vX2dwdV9jbGVhbnVwKHN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1 KQogeworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSAmYWRyZW5vX2dwdS0+YmFzZTsKIAl1bnNpZ25l ZCBpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkcmVub19ncHUtPmluZm8t PmZ3KTsgaSsrKQogCQlyZWxlYXNlX2Zpcm13YXJlKGFkcmVub19ncHUtPmZ3W2ldKTsKIAorCWlj Y19wdXQoZ3B1LT5pY2NfcGF0aCk7CisKIAltc21fZ3B1X2NsZWFudXAoJmFkcmVub19ncHUtPmJh c2UpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmggYi9kcml2 ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaAppbmRleCBmODJiYWMwODY2NjYuLjdiMDRkMTY2NTU1 NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmgKKysrIGIvZHJpdmVy cy9ncHUvZHJtL21zbS9tc21fZ3B1LmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxp bnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1 ZGUgPGxpbnV4L2ludGVyY29ubmVjdC5oPgogCiAjaW5jbHVkZSAibXNtX2Rydi5oIgogI2luY2x1 ZGUgIm1zbV9mZW5jZS5oIgpAQCAtMTE5LDYgKzEyMCw4IEBAIHN0cnVjdCBtc21fZ3B1IHsKIAlz dHJ1Y3QgY2xrICplYmkxX2NsaywgKmNvcmVfY2xrLCAqcmJibXRpbWVyX2NsazsKIAl1aW50MzJf dCBmYXN0X3JhdGU7CiAKKwlzdHJ1Y3QgaWNjX3BhdGggKmljY19wYXRoOworCiAJLyogSGFuZyBh bmQgSW5hY3Rpdml0eSBEZXRlY3Rpb246CiAJICovCiAjZGVmaW5lIERSTV9NU01fSU5BQ1RJVkVf UEVSSU9EICAgNjYgLyogaW4gbXMgKHJvdWdobHkgZm91ciBmcmFtZXMpICovCi0tIAoyLjE4LjAK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkZyZWVkcmVu byBtYWlsaW5nIGxpc3QKRnJlZWRyZW5vQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZyZWVkcmVubwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: jcrouse@codeaurora.org (Jordan Crouse) Date: Wed, 28 Nov 2018 11:29:29 -0700 Subject: [PATCH 1/1] drm/msm/a6xx: Add support for an interconnect path In-Reply-To: <20181128182929.19925-1-jcrouse@codeaurora.org> References: <20181128182929.19925-1-jcrouse@codeaurora.org> Message-ID: <20181128182929.19925-2-jcrouse@codeaurora.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Try to get the interconnect path for the GPU and vote for the maximum bandwidth to support all frequencies. This is needed for performance. Later we will want to scale the bandwidth based on the frequency to also optimize for power but that will require some device tree infrastructure that does not yet exist. Signed-off-by: Jordan Crouse --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 20 ++++++++++++++++++++ drivers/gpu/drm/msm/adreno/adreno_gpu.c | 9 +++++++++ drivers/gpu/drm/msm/msm_gpu.h | 3 +++ 3 files changed, 32 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c index 546599a7ab05..b96ae2ab04bb 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -3,6 +3,7 @@ #include #include +#include #include #include "a6xx_gpu.h" @@ -63,6 +64,9 @@ static bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu) static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) { + struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + struct msm_gpu *gpu = &adreno_gpu->base; int ret; gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0); @@ -85,6 +89,12 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) dev_err(gmu->dev, "GMU set GPU frequency error: %d\n", ret); gmu->freq = gmu->gpu_freqs[index]; + + /* + * Eventually we will want to scale the path vote with the frequency but + * for now leave it t at max so that the performance is nominal. + */ + icc_set(gpu->icc_path, 0, 7216000000); } void a6xx_gmu_set_freq(struct msm_gpu *gpu, unsigned long freq) @@ -680,6 +690,8 @@ int a6xx_gmu_reset(struct a6xx_gpu *a6xx_gpu) int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) { + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + struct msm_gpu *gpu = &adreno_gpu->base; struct a6xx_gmu *gmu = &a6xx_gpu->gmu; int status, ret; @@ -695,6 +707,9 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) if (ret) goto out; + /* Set the bus quota to a reasonable value for boot */ + icc_set(gpu->icc_path, 0, 3072000000); + a6xx_gmu_irq_enable(gmu); /* Check to see if we are doing a cold or warm boot */ @@ -735,6 +750,8 @@ bool a6xx_gmu_isidle(struct a6xx_gmu *gmu) int a6xx_gmu_stop(struct a6xx_gpu *a6xx_gpu) { + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + struct msm_gpu *gpu = &adreno_gpu->base; struct a6xx_gmu *gmu = &a6xx_gpu->gmu; u32 val; @@ -781,6 +798,9 @@ int a6xx_gmu_stop(struct a6xx_gpu *a6xx_gpu) /* Tell RPMh to power off the GPU */ a6xx_rpmh_stop(gmu); + /* Remove the bus vote */ + icc_set(gpu->icc_path, 0, 0); + clk_bulk_disable_unprepare(gmu->nr_clocks, gmu->clocks); pm_runtime_put_sync(gmu->dev); diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 93d70f4a2154..9bab491912cf 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "adreno_gpu.h" #include "msm_gem.h" #include "msm_mmu.h" @@ -695,6 +696,11 @@ static int adreno_get_pwrlevels(struct device *dev, DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate); + /* Check for an interconnect path for the bus */ + gpu->icc_path = of_icc_get(dev, "port0"); + if (IS_ERR(gpu->icc_path)) + gpu->icc_path = NULL; + return 0; } @@ -733,10 +739,13 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu) { + struct msm_gpu *gpu = &adreno_gpu->base; unsigned int i; for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++) release_firmware(adreno_gpu->fw[i]); + icc_put(gpu->icc_path); + msm_gpu_cleanup(&adreno_gpu->base); } diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index f82bac086666..7b04d1665555 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -20,6 +20,7 @@ #include #include +#include #include "msm_drv.h" #include "msm_fence.h" @@ -119,6 +120,8 @@ struct msm_gpu { struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk; uint32_t fast_rate; + struct icc_path *icc_path; + /* Hang and Inactivity Detection: */ #define DRM_MSM_INACTIVE_PERIOD 66 /* in ms (roughly four frames) */ -- 2.18.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0084BC43441 for ; Wed, 28 Nov 2018 18:29:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B263720665 for ; Wed, 28 Nov 2018 18:29:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="iNdWF4Qu"; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="iNdWF4Qu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B263720665 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727876AbeK2FcL (ORCPT ); Thu, 29 Nov 2018 00:32:11 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:52952 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725779AbeK2FcJ (ORCPT ); Thu, 29 Nov 2018 00:32:09 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id C6D0660B11; Wed, 28 Nov 2018 18:29:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1543429775; bh=LS8lLOxG5EVr0vseojn5J/B7cuX070la6g3XCeaX5TA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iNdWF4QuCTPQDaoYUyj1IJvXw2CA/LhdOZ1Vx6MZLtYIvCmjVUkjqCc3oW0G9C/AA Ly2Gtpcj0Y1ActxzIGs7LwWDXN8tbRFXlpI5ODAaQRaDECE9AGX2xEfJgw01Nj1rKS RSHXKyAgUdxypvE9/ClaUR3YFIA7Xa+x2k+YfN1w= Received: from jcrouse-lnx.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: jcrouse@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id CF66B60312; Wed, 28 Nov 2018 18:29:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1543429775; bh=LS8lLOxG5EVr0vseojn5J/B7cuX070la6g3XCeaX5TA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iNdWF4QuCTPQDaoYUyj1IJvXw2CA/LhdOZ1Vx6MZLtYIvCmjVUkjqCc3oW0G9C/AA Ly2Gtpcj0Y1ActxzIGs7LwWDXN8tbRFXlpI5ODAaQRaDECE9AGX2xEfJgw01Nj1rKS RSHXKyAgUdxypvE9/ClaUR3YFIA7Xa+x2k+YfN1w= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org CF66B60312 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=jcrouse@codeaurora.org From: Jordan Crouse To: georgi.djakov@linaro.org Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org Subject: [PATCH 1/1] drm/msm/a6xx: Add support for an interconnect path Date: Wed, 28 Nov 2018 11:29:29 -0700 Message-Id: <20181128182929.19925-2-jcrouse@codeaurora.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181128182929.19925-1-jcrouse@codeaurora.org> References: <20181128182929.19925-1-jcrouse@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Try to get the interconnect path for the GPU and vote for the maximum bandwidth to support all frequencies. This is needed for performance. Later we will want to scale the bandwidth based on the frequency to also optimize for power but that will require some device tree infrastructure that does not yet exist. Signed-off-by: Jordan Crouse --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 20 ++++++++++++++++++++ drivers/gpu/drm/msm/adreno/adreno_gpu.c | 9 +++++++++ drivers/gpu/drm/msm/msm_gpu.h | 3 +++ 3 files changed, 32 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c index 546599a7ab05..b96ae2ab04bb 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -3,6 +3,7 @@ #include #include +#include #include #include "a6xx_gpu.h" @@ -63,6 +64,9 @@ static bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu) static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) { + struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + struct msm_gpu *gpu = &adreno_gpu->base; int ret; gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0); @@ -85,6 +89,12 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) dev_err(gmu->dev, "GMU set GPU frequency error: %d\n", ret); gmu->freq = gmu->gpu_freqs[index]; + + /* + * Eventually we will want to scale the path vote with the frequency but + * for now leave it t at max so that the performance is nominal. + */ + icc_set(gpu->icc_path, 0, 7216000000); } void a6xx_gmu_set_freq(struct msm_gpu *gpu, unsigned long freq) @@ -680,6 +690,8 @@ int a6xx_gmu_reset(struct a6xx_gpu *a6xx_gpu) int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) { + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + struct msm_gpu *gpu = &adreno_gpu->base; struct a6xx_gmu *gmu = &a6xx_gpu->gmu; int status, ret; @@ -695,6 +707,9 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) if (ret) goto out; + /* Set the bus quota to a reasonable value for boot */ + icc_set(gpu->icc_path, 0, 3072000000); + a6xx_gmu_irq_enable(gmu); /* Check to see if we are doing a cold or warm boot */ @@ -735,6 +750,8 @@ bool a6xx_gmu_isidle(struct a6xx_gmu *gmu) int a6xx_gmu_stop(struct a6xx_gpu *a6xx_gpu) { + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + struct msm_gpu *gpu = &adreno_gpu->base; struct a6xx_gmu *gmu = &a6xx_gpu->gmu; u32 val; @@ -781,6 +798,9 @@ int a6xx_gmu_stop(struct a6xx_gpu *a6xx_gpu) /* Tell RPMh to power off the GPU */ a6xx_rpmh_stop(gmu); + /* Remove the bus vote */ + icc_set(gpu->icc_path, 0, 0); + clk_bulk_disable_unprepare(gmu->nr_clocks, gmu->clocks); pm_runtime_put_sync(gmu->dev); diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 93d70f4a2154..9bab491912cf 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "adreno_gpu.h" #include "msm_gem.h" #include "msm_mmu.h" @@ -695,6 +696,11 @@ static int adreno_get_pwrlevels(struct device *dev, DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate); + /* Check for an interconnect path for the bus */ + gpu->icc_path = of_icc_get(dev, "port0"); + if (IS_ERR(gpu->icc_path)) + gpu->icc_path = NULL; + return 0; } @@ -733,10 +739,13 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu) { + struct msm_gpu *gpu = &adreno_gpu->base; unsigned int i; for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++) release_firmware(adreno_gpu->fw[i]); + icc_put(gpu->icc_path); + msm_gpu_cleanup(&adreno_gpu->base); } diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index f82bac086666..7b04d1665555 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -20,6 +20,7 @@ #include #include +#include #include "msm_drv.h" #include "msm_fence.h" @@ -119,6 +120,8 @@ struct msm_gpu { struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk; uint32_t fast_rate; + struct icc_path *icc_path; + /* Hang and Inactivity Detection: */ #define DRM_MSM_INACTIVE_PERIOD 66 /* in ms (roughly four frames) */ -- 2.18.0