summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2015-09-10 12:12:47 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2015-10-12 11:58:35 -0400
commit1cf6539990dccd4c7a94154cd75d4c257ed39f37 (patch)
tree484363e821eb38100bd357d9fe221c6405d0600c /drivers
parent960552df3ef3f270bce64ed00104dce300531369 (diff)
gpu: nvgpu: rework secure_page allocation path
Currently, if can_railgate = false, then we have below sequence to allocate secure_page - unrailgate GPU (forever) - reset_assert() - allocate secure_page - reset_deassert() But if we allocate secure page even before unrailgating GPU for first time, then we can avoid reset_assert()/deassert() calls since GPU should already be in reset/railgated at boot time hence, rework this sequence as below - init required mutex, set platform->reset_control - allocate secure page (GPU should already be in reset at this point) - gk20a_pm_init() which unrailgates GPU in case of can_railgate = false Bug 200137963 Bug 1678611 Change-Id: I79d0543bb5cf1eaf1009e1e6ac142532d84514a5 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/797153 (cherry picked from commit 368004501943d38c003747f6bec0384fed57ee65) Reviewed-on: http://git-master/r/816005 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index 0cc29026..fd7fdee1 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -1275,8 +1275,6 @@ static int gk20a_pm_init(struct platform_device *dev)
1275 1275
1276 gk20a_dbg_fn(""); 1276 gk20a_dbg_fn("");
1277 1277
1278 mutex_init(&platform->railgate_lock);
1279
1280 /* Initialise pm runtime */ 1278 /* Initialise pm runtime */
1281 if (platform->clockgate_delay) { 1279 if (platform->clockgate_delay) {
1282 pm_runtime_set_autosuspend_delay(&dev->dev, 1280 pm_runtime_set_autosuspend_delay(&dev->dev,
@@ -1299,10 +1297,6 @@ static int gk20a_pm_init(struct platform_device *dev)
1299 if (IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) 1297 if (IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS))
1300 err = gk20a_pm_initialise_domain(dev); 1298 err = gk20a_pm_initialise_domain(dev);
1301 1299
1302 platform->reset_control = devm_reset_control_get(&dev->dev, NULL);
1303 if (IS_ERR(platform->reset_control))
1304 platform->reset_control = NULL;
1305
1306 return err; 1300 return err;
1307} 1301}
1308 1302
@@ -1312,17 +1306,11 @@ static int gk20a_secure_page_alloc(struct platform_device *pdev)
1312 int err = 0; 1306 int err = 0;
1313 1307
1314 if (platform->secure_page_alloc) { 1308 if (platform->secure_page_alloc) {
1315 if (platform->num_clks > 0)
1316 tegra_periph_reset_assert(platform->clk[0]);
1317 udelay(10);
1318 err = platform->secure_page_alloc(pdev); 1309 err = platform->secure_page_alloc(pdev);
1319 if (platform->num_clks > 0) 1310 if (!err)
1320 tegra_periph_reset_deassert(platform->clk[0]); 1311 platform->secure_alloc_ready = true;
1321 } 1312 }
1322 1313
1323 if (!err)
1324 platform->secure_alloc_ready = true;
1325
1326 return err; 1314 return err;
1327} 1315}
1328 1316
@@ -1413,9 +1401,14 @@ static int gk20a_probe(struct platform_device *dev)
1413 gk20a_init_support(dev); 1401 gk20a_init_support(dev);
1414 1402
1415 init_rwsem(&gk20a->busy_lock); 1403 init_rwsem(&gk20a->busy_lock);
1404 mutex_init(&platform->railgate_lock);
1416 1405
1417 spin_lock_init(&gk20a->mc_enable_lock); 1406 spin_lock_init(&gk20a->mc_enable_lock);
1418 1407
1408 platform->reset_control = devm_reset_control_get(&dev->dev, NULL);
1409 if (IS_ERR(platform->reset_control))
1410 platform->reset_control = NULL;
1411
1419 gk20a_debug_init(dev); 1412 gk20a_debug_init(dev);
1420 1413
1421 /* Initialize the platform interface. */ 1414 /* Initialize the platform interface. */
@@ -1425,6 +1418,11 @@ static int gk20a_probe(struct platform_device *dev)
1425 return err; 1418 return err;
1426 } 1419 }
1427 1420
1421 err = gk20a_secure_page_alloc(dev);
1422 if (err)
1423 dev_err(&dev->dev,
1424 "failed to allocate secure buffer %d\n", err);
1425
1428 err = gk20a_pm_init(dev); 1426 err = gk20a_pm_init(dev);
1429 if (err) { 1427 if (err) {
1430 dev_err(&dev->dev, "pm init failed"); 1428 dev_err(&dev->dev, "pm init failed");
@@ -1445,11 +1443,6 @@ static int gk20a_probe(struct platform_device *dev)
1445 } 1443 }
1446 } 1444 }
1447 1445
1448 err = gk20a_secure_page_alloc(dev);
1449 if (err)
1450 dev_err(&dev->dev,
1451 "failed to allocate secure buffer %d\n", err);
1452
1453 /* Set DMA parameters to allow larger sgt lists */ 1446 /* Set DMA parameters to allow larger sgt lists */
1454 dev->dev.dma_parms = &gk20a->dma_parms; 1447 dev->dev.dma_parms = &gk20a->dma_parms;
1455 dma_set_max_seg_size(&dev->dev, UINT_MAX); 1448 dma_set_max_seg_size(&dev->dev, UINT_MAX);