From df6ff7088569aa764d27f612dba3e519f73b7fda Mon Sep 17 00:00:00 2001 From: Georgi Djakov Date: Wed, 12 Feb 2020 16:55:57 -0800 Subject: [PATCH 1/4] interconnect: qcom: Do not set any QoS for the NSP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The QoS settings for the NSP should not be configured from the HLOS side. We’ll leave that to the CDSP image, which has the code to do this. Change-Id: I6d7f319b69ca75e89bd02b40e185556aa68ab937 Signed-off-by: Georgi Djakov --- drivers/interconnect/qcom/lahaina.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/interconnect/qcom/lahaina.c b/drivers/interconnect/qcom/lahaina.c index feef63e0d2d4..6b48df01ed80 100644 --- a/drivers/interconnect/qcom/lahaina.c +++ b/drivers/interconnect/qcom/lahaina.c @@ -60,7 +60,6 @@ DEFINE_QNODE_QOS(qnm_video_cvp, 0, 1, 0, 86016); DEFINE_QNODE_QOS(qxm_mdp0, 0, 1, 0, 90112); DEFINE_QNODE_QOS(qxm_mdp1, 0, 1, 0, 90240); DEFINE_QNODE_QOS(qxm_rot, 0, 1, 0, 94208); -DEFINE_QNODE_QOS(qxm_nsp, 0, 0, 0, 49152, 53248); DEFINE_QNODE_QOS(qxm_pimem, 2, 1, 0, 45056); DEFINE_QNODE_QOS(xm_gic, 2, 0, 0, 53248); @@ -222,7 +221,7 @@ DEFINE_QNODE(qxm_rot, MASTER_ROTATOR, 1, 32, &qxm_rot_qos, 1, SLAVE_MNOC_SF_MEM_NOC); DEFINE_QNODE(qhm_nsp_noc_config, MASTER_CDSP_NOC_CFG, 1, 4, NULL, 1, SLAVE_SERVICE_NSP_NOC); -DEFINE_QNODE(qxm_nsp, MASTER_CDSP_PROC, 2, 32, &qxm_nsp_qos, 1, +DEFINE_QNODE(qxm_nsp, MASTER_CDSP_PROC, 2, 32, NULL, 1, SLAVE_CDSP_MEM_NOC); DEFINE_QNODE(qnm_aggre1_noc, MASTER_A1NOC_SNOC, 1, 16, NULL, 1, SLAVE_SNOC_GEM_NOC_SF); From ad4e53bdd353da7042b7379e4499f5ec22151bf7 Mon Sep 17 00:00:00 2001 From: Georgi Djakov Date: Tue, 18 Feb 2020 01:31:55 -0800 Subject: [PATCH 2/4] interconnect: qcom: Enable the QoS ports Start enabling QoS for most of the ports. Use predefined values for priority and urgency. Change-Id: I5bed0ddaa63007b630ef700fb6b534cb62d4b18c Signed-off-by: Georgi Djakov --- drivers/interconnect/qcom/lahaina.c | 70 ++++++++++++++--------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/drivers/interconnect/qcom/lahaina.c b/drivers/interconnect/qcom/lahaina.c index 6b48df01ed80..907046c5b08b 100644 --- a/drivers/interconnect/qcom/lahaina.c +++ b/drivers/interconnect/qcom/lahaina.c @@ -26,42 +26,42 @@ static DEFINE_MUTEX(probe_list_lock); static int probe_count; -DEFINE_QNODE_QOS(qhm_qspi, 2, 0, 0, 65536); -DEFINE_QNODE_QOS(qhm_qup1, 2, 0, 0, 69632); -DEFINE_QNODE_QOS(xm_sdc4, 2, 0, 0, 73728); -DEFINE_QNODE_QOS(xm_ufs_mem, 2, 0, 0, 77824); -DEFINE_QNODE_QOS(xm_usb3_0, 2, 0, 0, 81920); -DEFINE_QNODE_QOS(xm_usb3_1, 2, 0, 0, 86016); -DEFINE_QNODE_QOS(qhm_qdss_bam, 2, 0, 0, 98304); -DEFINE_QNODE_QOS(qhm_qup0, 2, 0, 0, 102400); -DEFINE_QNODE_QOS(qhm_qup2, 2, 0, 0, 106496); -DEFINE_QNODE_QOS(qxm_crypto, 2, 1, 0, 118784); +DEFINE_QNODE_QOS(qhm_qspi, 2, 0, 1, 65536); +DEFINE_QNODE_QOS(qhm_qup1, 2, 0, 1, 69632); +DEFINE_QNODE_QOS(xm_sdc4, 2, 0, 1, 73728); +DEFINE_QNODE_QOS(xm_ufs_mem, 2, 0, 1, 77824); +DEFINE_QNODE_QOS(xm_usb3_0, 2, 0, 1, 81920); +DEFINE_QNODE_QOS(xm_usb3_1, 2, 0, 1, 86016); +DEFINE_QNODE_QOS(qhm_qdss_bam, 2, 0, 1, 98304); +DEFINE_QNODE_QOS(qhm_qup0, 2, 0, 1, 102400); +DEFINE_QNODE_QOS(qhm_qup2, 2, 0, 1, 106496); +DEFINE_QNODE_QOS(qxm_crypto, 2, 1, 1, 118784); DEFINE_QNODE_QOS(qxm_ipa, 2, 1, 0, 65536); -DEFINE_QNODE_QOS(xm_pcie3_0, 2, 0, 0, 77824); -DEFINE_QNODE_QOS(xm_pcie3_1, 2, 0, 0, 81920); -DEFINE_QNODE_QOS(xm_qdss_etr, 2, 0, 0, 86016); -DEFINE_QNODE_QOS(xm_sdc2, 2, 0, 0, 90112); -DEFINE_QNODE_QOS(xm_ufs_card, 2, 0, 0, 94208); -DEFINE_QNODE_QOS(alm_gpu_tcu, 1, 0, 0, 655360); -DEFINE_QNODE_QOS(alm_sys_tcu, 6, 0, 0, 659456); -DEFINE_QNODE_QOS(qnm_cmpnoc, 0, 1, 0, 135168, 397312); -DEFINE_QNODE_QOS(qnm_gpu, 0, 0, 0, 139264, 401408); -DEFINE_QNODE_QOS(qnm_mnoc_hf, 0, 1, 0, 143360, 405504); -DEFINE_QNODE_QOS(qnm_mnoc_sf, 0, 1, 0, 147456, 409600); -DEFINE_QNODE_QOS(qnm_pcie, 2, 1, 0, 663552); -DEFINE_QNODE_QOS(qnm_snoc_gc, 0, 1, 0, 667648); -DEFINE_QNODE_QOS(qnm_snoc_sf, 0, 1, 0, 671744); -DEFINE_QNODE_QOS(qnm_camnoc_hf, 0, 1, 0, 65536, 65920); -DEFINE_QNODE_QOS(qnm_camnoc_icp, 5, 1, 0, 69632); -DEFINE_QNODE_QOS(qnm_camnoc_sf, 0, 1, 0, 73728, 73856); -DEFINE_QNODE_QOS(qnm_video0, 0, 1, 0, 81920); -DEFINE_QNODE_QOS(qnm_video1, 0, 1, 0, 82048); -DEFINE_QNODE_QOS(qnm_video_cvp, 0, 1, 0, 86016); -DEFINE_QNODE_QOS(qxm_mdp0, 0, 1, 0, 90112); -DEFINE_QNODE_QOS(qxm_mdp1, 0, 1, 0, 90240); -DEFINE_QNODE_QOS(qxm_rot, 0, 1, 0, 94208); -DEFINE_QNODE_QOS(qxm_pimem, 2, 1, 0, 45056); -DEFINE_QNODE_QOS(xm_gic, 2, 0, 0, 53248); +DEFINE_QNODE_QOS(xm_pcie3_0, 2, 0, 1, 77824); +DEFINE_QNODE_QOS(xm_pcie3_1, 2, 0, 1, 81920); +DEFINE_QNODE_QOS(xm_qdss_etr, 2, 0, 1, 86016); +DEFINE_QNODE_QOS(xm_sdc2, 2, 0, 1, 90112); +DEFINE_QNODE_QOS(xm_ufs_card, 2, 0, 1, 94208); +DEFINE_QNODE_QOS(alm_gpu_tcu, 1, 0, 1, 655360); +DEFINE_QNODE_QOS(alm_sys_tcu, 6, 0, 1, 659456); +DEFINE_QNODE_QOS(qnm_cmpnoc, 0, 1, 2, 135168, 397312); +DEFINE_QNODE_QOS(qnm_gpu, 0, 0, 2, 139264, 401408); +DEFINE_QNODE_QOS(qnm_mnoc_hf, 0, 1, 1, 143360, 405504); +DEFINE_QNODE_QOS(qnm_mnoc_sf, 0, 1, 1, 147456, 409600); +DEFINE_QNODE_QOS(qnm_pcie, 2, 1, 1, 663552); +DEFINE_QNODE_QOS(qnm_snoc_gc, 0, 1, 1, 667648); +DEFINE_QNODE_QOS(qnm_snoc_sf, 0, 1, 1, 671744); +DEFINE_QNODE_QOS(qnm_camnoc_hf, 0, 1, 2, 65536, 65920); +DEFINE_QNODE_QOS(qnm_camnoc_icp, 5, 1, 1, 69632); +DEFINE_QNODE_QOS(qnm_camnoc_sf, 0, 1, 2, 73728, 73856); +DEFINE_QNODE_QOS(qnm_video0, 0, 1, 1, 81920); +DEFINE_QNODE_QOS(qnm_video1, 0, 1, 1, 82048); +DEFINE_QNODE_QOS(qnm_video_cvp, 0, 1, 1, 86016); +DEFINE_QNODE_QOS(qxm_mdp0, 0, 1, 1, 90112); +DEFINE_QNODE_QOS(qxm_mdp1, 0, 1, 1, 90240); +DEFINE_QNODE_QOS(qxm_rot, 0, 1, 1, 94208); +DEFINE_QNODE_QOS(qxm_pimem, 2, 1, 1, 45056); +DEFINE_QNODE_QOS(xm_gic, 2, 0, 1, 53248); DEFINE_QNODE(qhm_qspi, MASTER_QSPI_0, 1, 4, &qhm_qspi_qos, 1, SLAVE_A1NOC_SNOC); From 51cd983d87bb8ed8610bfcc10f7da768de76679e Mon Sep 17 00:00:00 2001 From: Georgi Djakov Date: Tue, 18 Feb 2020 02:39:11 -0800 Subject: [PATCH 3/4] interconnect: qcom: Configure QoS when provider is sync stated In the current code, QoS configuration is attempted before the votes for MM0 are in place. That's why we may observe some hangs during boot. Move all QoS configuration to happen during the sync_state to ensure that the keepalive votes are already in place and also enable the relevant interface clocks while we setup QoS. Change-Id: Ief6817b8e32423f07fece4cf04068e7311c9f8cb Signed-off-by: Georgi Djakov --- drivers/interconnect/qcom/lahaina.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/interconnect/qcom/lahaina.c b/drivers/interconnect/qcom/lahaina.c index 907046c5b08b..66a3f80fc320 100644 --- a/drivers/interconnect/qcom/lahaina.c +++ b/drivers/interconnect/qcom/lahaina.c @@ -818,10 +818,6 @@ static int qnoc_probe(struct platform_device *pdev) if (qp->num_clks < 0) return qp->num_clks; - ret = clk_bulk_prepare_enable(qp->num_clks, qp->clks); - if (ret) - return ret; - for (i = 0; i < num_nodes; i++) { size_t j; @@ -848,14 +844,9 @@ static int qnoc_probe(struct platform_device *pdev) icc_link_create(node, qnodes[i]->links[j]); data->nodes[i] = node; - if (qnodes[i]->noc_ops) - qnodes[i]->noc_ops->set_qos(qnodes[i]); } data->num_nodes = num_nodes; - clk_bulk_disable_unprepare(qp->num_clks, qp->clks); - clk_bulk_put_all(qp->num_clks, qp->clks); - for (i = 0; i < qp->num_bcms; i++) qcom_icc_bcm_init(qp->bcms[i], &pdev->dev); @@ -869,8 +860,6 @@ static int qnoc_probe(struct platform_device *pdev) return ret; err: - clk_bulk_disable_unprepare(qp->num_clks, qp->clks); - clk_bulk_put_all(qp->num_clks, qp->clks); list_for_each_entry(node, &provider->nodes, node_list) { icc_node_del(node); icc_node_destroy(node->id); @@ -925,11 +914,26 @@ MODULE_DEVICE_TABLE(of, qnoc_of_match); static void qnoc_sync_state(struct device *dev) { - struct qcom_icc_provider *qp; + struct platform_device *pdev = to_platform_device(dev); + struct qcom_icc_provider *qp = platform_get_drvdata(pdev); + struct icc_provider *provider = &qp->provider; + struct qcom_icc_node *qnode; + struct icc_node *node; mutex_lock(&probe_list_lock); probe_count++; + clk_bulk_prepare_enable(qp->num_clks, qp->clks); + + list_for_each_entry(node, &provider->nodes, node_list) { + qnode = node->data; + if (qnode && qnode->noc_ops) + qnode->noc_ops->set_qos(qnode); + } + + clk_bulk_disable_unprepare(qp->num_clks, qp->clks); + clk_bulk_put_all(qp->num_clks, qp->clks); + if (probe_count < ARRAY_SIZE(qnoc_of_match) - 1) { mutex_unlock(&probe_list_lock); return; From 4d7b9fbbd20e23d5430479c9609a793f54661afa Mon Sep 17 00:00:00 2001 From: Georgi Djakov Date: Tue, 18 Feb 2020 02:53:19 -0800 Subject: [PATCH 4/4] interconnect: qcom: Remove duplicate compatible string There are duplicate compatible entries for gem_noc. Remove one of them. Change-Id: I9c667edd88646bfcdb9d023ad7668cf683d6e5c6 Signed-off-by: Georgi Djakov --- drivers/interconnect/qcom/lahaina.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/interconnect/qcom/lahaina.c b/drivers/interconnect/qcom/lahaina.c index 66a3f80fc320..67095c161afe 100644 --- a/drivers/interconnect/qcom/lahaina.c +++ b/drivers/interconnect/qcom/lahaina.c @@ -906,9 +906,7 @@ static const struct of_device_id qnoc_of_match[] = { .data = &lahaina_nsp_noc}, { .compatible = "qcom,lahaina-system_noc", .data = &lahaina_system_noc}, - { .compatible = "qcom,lahaina-gem_noc", - .data = &lahaina_gem_noc}, - { }, + { } }; MODULE_DEVICE_TABLE(of, qnoc_of_match);