Loading Documentation/devicetree/bindings/arm/msm/msm_bus_adhoc.txt +20 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,20 @@ qcom,blacklist: An array of phandles that represent devices that this de cannot connect to either directly or via any number of intermediate nodes. qcom,agg-ports: The number of aggregation ports on the bus. qcom,node-qos-bcms: Optional property to target specific BCMs to toggle during QoS configuration, this is to ensure QoS register space is clocked and accessible. Array is defined as follows: BCM node ID, VoteX, VoteY. The vectors must be defined in sets of the three values aforementioned. qcom,prio: Default fixed priority for bus master. qcom,qos-lim-params: Array containing QoS limiter configurations defined as: Bandwidth, Saturation. Must define "qcom,qos-lim-en" for these settings to take effect. qcom,qos-lim-en: Boolean to enable limiter settings, default is disabled. qcom,qos-reg-params: Array containing QoS regulator configurations defined as: Low Priority, High Priority, Bandwidth, Saturation. Must define "qcom,qos-reg-regmode" for these settings to take effect. qcom,qos-reg-mode: Array containing QoS regulator mode enablement: Read Enable, Write Enable, default is disabled. qcom,forwarding: Boolean indicate Urgent Forwarding enablement. The following properties are optional as collecting data via coresight might and are present on child nodes that represent NOC devices. The documentation Loading Loading @@ -172,6 +186,12 @@ Example: <&clock_gcc clk_q1_clk>; q0-clk-supply = <&gdsc_q0_clk>; }; qcom,node-qos-bcms = <0x7011 0 1>; qcom,prio = 1; qcom,qos-lim-params = <1000 1000>; qcom,qos-lim-en: qcom,qos-reg-params = <1 2 1000 1000>; qcom,qos-reg-mode = <1 1>; }; mm_int_bimc: mm-int-bimc { Loading arch/arm64/boot/dts/qcom/sdm845-bus.dtsi +101 −15 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <dt-bindings/msm/msm-bus-ids.h> #include <dt-bindings/soc/qcom,tcs-mbox.h> #include <dt-bindings/clock/qcom,gcc-sdm845.h> &soc { ad_hoc_bus: ad-hoc-bus { Loading Loading @@ -355,7 +356,8 @@ label = "fab-aggre1_noc"; qcom,fab-dev; qcom,base-name = "aggre1_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <16384>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -365,7 +367,8 @@ label = "fab-aggre2_noc"; qcom,fab-dev; qcom,base-name = "aggre2_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <16384>; qcom,bus-type = <1>; clocks = <>; }; Loading Loading @@ -432,7 +435,8 @@ label = "fab-mem_noc"; qcom,fab-dev; qcom,base-name = "mem_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <65536>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -442,7 +446,8 @@ label = "fab-mmss_noc"; qcom,fab-dev; qcom,base-name = "mmss_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <36864>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -452,7 +457,8 @@ label = "fab-system_noc"; qcom,fab-dev; qcom,base-name = "system_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <36864>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -471,6 +477,8 @@ label = "fab-mem_noc_display"; qcom,fab-dev; qcom,base-name = "mem_noc-base"; qcom,qos-off = <4096>; qcom,base-offset = <65536>; qcom,bypass-qos-prg; qcom,bus-type = <1>; clocks = <>; Loading Loading @@ -524,6 +532,8 @@ qcom,qport = <1>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <1>; }; mas_xm_sdc4: mas-xm-sdc4 { Loading @@ -534,6 +544,8 @@ qcom,qport = <2>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <1>; }; mas_xm_ufs_card: mas-xm-ufs-card { Loading @@ -544,6 +556,8 @@ qcom,qport = <3>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_ufs_mem: mas-xm-ufs-mem { Loading @@ -554,6 +568,8 @@ qcom,qport = <4>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_qhm_a2noc_cfg: mas-qhm-a2noc-cfg { Loading Loading @@ -592,6 +608,8 @@ qcom,qport = <0>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,ap-owned; qcom,prio = <1>; }; mas_qxm_crypto: mas-qxm-crypto { Loading @@ -603,6 +621,8 @@ qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,bcms = <&bcm_ce0>; qcom,ap-owned; qcom,prio = <2>; }; mas_qxm_ipa: mas-qxm-ipa { Loading @@ -613,6 +633,7 @@ qcom,qport = <2>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,prio = <2>; }; mas_xm_pcie3_1: mas-xm-pcie3-1 { Loading @@ -623,6 +644,8 @@ qcom,qport = <6>; qcom,connections = <&slv_qns_pcie_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_pcie_0: mas-xm-pcie-0 { Loading @@ -632,7 +655,9 @@ qcom,agg-ports = <1>; qcom,qport = <5>; qcom,connections = <&slv_qns_pcie_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_qdss_etr: mas-xm-qdss-etr { Loading @@ -643,6 +668,8 @@ qcom,qport = <7>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_usb3_0: mas-xm-usb3-0 { Loading @@ -653,6 +680,7 @@ qcom,qport = <10>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,prio = <2>; }; mas_xm_usb3_1: mas-xm-usb3-1 { Loading @@ -663,6 +691,7 @@ qcom,qport = <11>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,prio = <2>; }; mas_qxm_camnoc_hf0_uncomp: mas-qxm-camnoc-hf0-uncomp { Loading Loading @@ -825,12 +854,12 @@ qcom,bus-dev = <&fab_gladiator_noc>; }; mas_ipa_core: mas-ipa-core { mas_ipa_core_master: mas-ipa-core-master { cell-id = <MSM_BUS_MASTER_IPA_CORE>; label = "mas-ipa-core"; qcom,buswidth = <1>; label = "mas-ipa-core-master"; qcom,buswidth = <8>; qcom,agg-ports = <1>; qcom,connections = <&slv_ipa_core>; qcom,connections = <&slv_ipa_core_slave>; qcom,bus-dev = <&fab_ipa_virt>; }; Loading @@ -853,6 +882,8 @@ &slv_qns_memnoc_snoc>; qcom,bus-dev = <&fab_mem_noc>; qcom,bcms = <&bcm_sh3>; qcom,ap-owned; qcom,prio = <6>; }; mas_qhm_memnoc_cfg: mas-qhm-memnoc-cfg { Loading @@ -874,6 +905,8 @@ qcom,connections = <&slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,bcms = <&bcm_sh5>; qcom,ap-owned; qcom,prio = <0>; }; mas_qnm_mnoc_hf: mas-qnm-mnoc-hf { Loading @@ -884,6 +917,10 @@ qcom,qport = <4 5>; qcom,connections = <&slv_qns_apps_io &slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qnm_mnoc_sf: mas-qnm-mnoc-sf { Loading @@ -895,6 +932,10 @@ qcom,connections = <&slv_qns_apps_io &slv_qns_llcc &slv_qns_memnoc_snoc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qnm_snoc_gc: mas-qnm-snoc-gc { Loading @@ -905,6 +946,9 @@ qcom,qport = <8>; qcom,connections = <&slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; }; mas_qnm_snoc_sf: mas-qnm-snoc-sf { Loading @@ -915,6 +959,9 @@ qcom,qport = <9>; qcom,connections = <&slv_qns_apps_io &slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; }; mas_qxm_gpu: mas-qxm-gpu { Loading @@ -926,7 +973,8 @@ qcom,connections = <&slv_qns_apps_io &slv_qns_llcc &slv_qns_memnoc_snoc>; qcom,bus-dev = <&fab_mem_noc>; qcom,bcms = <&bcm_sh4>; qcom,ap-owned; qcom,prio = <0>; }; mas_qhm_mnoc_cfg: mas-qhm-mnoc-cfg { Loading @@ -947,6 +995,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_camnoc_hf1: mas-qxm-camnoc-hf1 { Loading @@ -958,6 +1010,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_camnoc_sf: mas-qxm-camnoc-sf { Loading @@ -969,6 +1025,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_mdp0: mas-qxm-mdp0 { Loading @@ -980,6 +1040,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_mdp1: mas-qxm-mdp1 { Loading @@ -991,6 +1055,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_rot: mas-qxm-rot { Loading @@ -1002,6 +1070,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_venus0: mas-qxm-venus0 { Loading @@ -1013,6 +1085,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_venus1: mas-qxm-venus1 { Loading @@ -1024,6 +1100,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_venus_arm9: mas-qxm-venus-arm9 { Loading @@ -1035,6 +1115,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qhm_snoc_cfg: mas-qhm-snoc-cfg { Loading Loading @@ -1120,6 +1204,8 @@ qcom,connections = <&slv_qxs_imem &slv_qns_memnoc_gc>; qcom,bus-dev = <&fab_system_noc>; qcom,bcms = <&bcm_sn4>; qcom,ap-owned; qcom,prio = <2>; }; mas_alc: mas-alc { Loading Loading @@ -1687,10 +1773,10 @@ qcom,bus-dev = <&fab_gladiator_noc>; }; slv_ipa_core:slv-ipa-core { cell-id = <MSM_BUS_SLAVE_IPA>; label = "slv-ipa-core"; qcom,buswidth = <1>; slv_ipa_core_slave:slv-ipa-core-slave { cell-id = <MSM_BUS_SLAVE_IPA_CORE>; label = "slv-ipa-core-slave"; qcom,buswidth = <8>; qcom,agg-ports = <1>; qcom,bus-dev = <&fab_ipa_virt>; qcom,bcms = <&bcm_ip0>; Loading drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c +147 −29 Original line number Diff line number Diff line Loading @@ -272,6 +272,9 @@ static int tcs_cmd_gen(struct msm_bus_node_device_type *cur_bcm, int ret = 0; bool valid = true; if (!cmd) return ret; if (vec_a == 0 && vec_b == 0) valid = false; Loading Loading @@ -670,7 +673,30 @@ int msm_bus_query_gen(struct list_head *query_list, return ret; } static void bcm_commit_single_req(struct msm_bus_node_device_type *cur_bcm, uint64_t vec_a, uint64_t vec_b) { struct msm_bus_node_device_type *cur_rsc = NULL; struct rpmh_client *cur_mbox = NULL; struct tcs_cmd *cmd_active = NULL; if (!cur_bcm->node_info->num_rsc_devs) return; cmd_active = kzalloc(sizeof(struct tcs_cmd), GFP_KERNEL); if (!cmd_active) return; cur_rsc = to_msm_bus_node(cur_bcm->node_info->rsc_devs[0]); cur_mbox = cur_rsc->rscdev->mbox; tcs_cmd_gen(cur_bcm, cmd_active, vec_a, vec_b, true); rpmh_write_single(cur_mbox, RPMH_ACTIVE_ONLY_STATE, cmd_active->addr, cmd_active->data); kfree(cmd_active); } void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size, size_t new_size, gfp_t flags) Loading Loading @@ -733,29 +759,22 @@ static int msm_bus_disable_node_qos_clk(struct msm_bus_node_device_type *node) static int msm_bus_enable_node_qos_clk(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *bus_node = NULL; int i; int ret; long rounded_rate; if (!node || (!to_msm_bus_node(node->node_info->bus_device))) { ret = -ENXIO; goto exit_enable_node_qos_clk; } bus_node = to_msm_bus_node(node->node_info->bus_device); for (i = 0; i < bus_node->num_node_qos_clks; i++) { if (!bus_node->node_qos_clks[i].enable_only_clk) { for (i = 0; i < node->num_node_qos_clks; i++) { if (!node->node_qos_clks[i].enable_only_clk) { rounded_rate = clk_round_rate( bus_node->node_qos_clks[i].clk, 1); ret = setrate_nodeclk(&bus_node->node_qos_clks[i], node->node_qos_clks[i].clk, 1); ret = setrate_nodeclk(&node->node_qos_clks[i], rounded_rate); if (ret) MSM_BUS_DBG("%s: Failed set rate clk,node %d\n", __func__, node->node_info->id); } ret = enable_nodeclk(&bus_node->node_qos_clks[i], ret = enable_nodeclk(&node->node_qos_clks[i], node->node_info->bus_device); if (ret) { MSM_BUS_DBG("%s: Failed to set Qos Clks ret %d\n", Loading @@ -763,12 +782,85 @@ static int msm_bus_enable_node_qos_clk(struct msm_bus_node_device_type *node) msm_bus_disable_node_qos_clk(node); goto exit_enable_node_qos_clk; } } exit_enable_node_qos_clk: return ret; } static int msm_bus_vote_qos_bcms(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *cur_dev = NULL; struct msm_bus_node_device_type *cur_bcm = NULL; int i; struct device *dev = NULL; if (!node || (!to_msm_bus_node(node->node_info->bus_device))) return -ENXIO; cur_dev = node; for (i = 0; i < cur_dev->num_qos_bcms; i++) { dev = bus_find_device(&msm_bus_type, NULL, (void *) &cur_dev->qos_bcms[i].qos_bcm_id, msm_bus_device_match_adhoc); if (!dev) { MSM_BUS_ERR("Can't find dev node for %d", cur_dev->qos_bcms[i].qos_bcm_id); return -ENODEV; } cur_bcm = to_msm_bus_node(dev); if (cur_bcm->node_vec[ACTIVE_CTX].vec_a != 0 || cur_bcm->node_vec[ACTIVE_CTX].vec_b != 0 || cur_bcm->node_vec[DUAL_CTX].vec_a != 0 || cur_bcm->node_vec[DUAL_CTX].vec_b != 0) return 0; bcm_commit_single_req(cur_bcm, cur_dev->qos_bcms[i].vec.vec_a, cur_dev->qos_bcms[i].vec.vec_b); } return 0; } static int msm_bus_rm_vote_qos_bcms(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *cur_dev = NULL; struct msm_bus_node_device_type *cur_bcm = NULL; int i; struct device *dev = NULL; if (!node || (!to_msm_bus_node(node->node_info->bus_device))) return -ENXIO; cur_dev = node; for (i = 0; i < cur_dev->num_qos_bcms; i++) { dev = bus_find_device(&msm_bus_type, NULL, (void *) &cur_dev->qos_bcms[i].qos_bcm_id, msm_bus_device_match_adhoc); if (!dev) { MSM_BUS_ERR("Can't find dev node for %d", cur_dev->qos_bcms[i].qos_bcm_id); return -ENODEV; } cur_bcm = to_msm_bus_node(dev); if (cur_bcm->node_vec[ACTIVE_CTX].vec_a != 0 || cur_bcm->node_vec[ACTIVE_CTX].vec_b != 0 || cur_bcm->node_vec[DUAL_CTX].vec_a != 0 || cur_bcm->node_vec[DUAL_CTX].vec_b != 0) return 0; bcm_commit_single_req(cur_bcm, 0, 0); } return 0; } int msm_bus_enable_limiter(struct msm_bus_node_device_type *node_dev, int enable, uint64_t lim_bw) { Loading Loading @@ -847,12 +939,11 @@ static int msm_bus_dev_init_qos(struct device *dev, void *data) bus_node_info->fabdev->noc_ops.qos_init) { int ret = 0; if (node_dev->ap_owned && (node_dev->node_info->qos_params.mode) != -1) { if (node_dev->ap_owned) { if (bus_node_info->fabdev->bypass_qos_prg) goto exit_init_qos; ret = msm_bus_vote_qos_bcms(node_dev); ret = msm_bus_enable_node_qos_clk(node_dev); if (ret < 0) { MSM_BUS_DBG("Can't Enable QoS clk %d\n", Loading @@ -868,6 +959,7 @@ static int msm_bus_dev_init_qos(struct device *dev, void *data) bus_node_info->fabdev->qos_off, bus_node_info->fabdev->qos_freq); ret = msm_bus_disable_node_qos_clk(node_dev); ret = msm_bus_rm_vote_qos_bcms(node_dev); node_dev->node_info->defer_qos = false; } } else Loading Loading @@ -1136,18 +1228,27 @@ static int msm_bus_copy_node_info(struct msm_bus_node_device_type *pdata, node_info->is_fab_dev = pdata_node_info->is_fab_dev; node_info->is_bcm_dev = pdata_node_info->is_bcm_dev; node_info->is_rsc_dev = pdata_node_info->is_rsc_dev; node_info->qos_params.mode = pdata_node_info->qos_params.mode; node_info->qos_params.prio1 = pdata_node_info->qos_params.prio1; node_info->qos_params.prio0 = pdata_node_info->qos_params.prio0; node_info->qos_params.reg_prio1 = pdata_node_info->qos_params.reg_prio1; node_info->qos_params.reg_prio0 = pdata_node_info->qos_params.reg_prio0; node_info->qos_params.prio_lvl = pdata_node_info->qos_params.prio_lvl; node_info->qos_params.prio_rd = pdata_node_info->qos_params.prio_rd; node_info->qos_params.prio_wr = pdata_node_info->qos_params.prio_wr; node_info->qos_params.gp = pdata_node_info->qos_params.gp; node_info->qos_params.thmp = pdata_node_info->qos_params.thmp; node_info->qos_params.ws = pdata_node_info->qos_params.ws; node_info->qos_params.bw_buffer = pdata_node_info->qos_params.bw_buffer; node_info->qos_params.prio_dflt = pdata_node_info->qos_params.prio_dflt; node_info->qos_params.limiter.bw = pdata_node_info->qos_params.limiter.bw; node_info->qos_params.limiter.sat = pdata_node_info->qos_params.limiter.sat; node_info->qos_params.limiter_en = pdata_node_info->qos_params.limiter_en; node_info->qos_params.reg.low_prio = pdata_node_info->qos_params.reg.low_prio; node_info->qos_params.reg.hi_prio = pdata_node_info->qos_params.reg.hi_prio; node_info->qos_params.reg.bw = pdata_node_info->qos_params.reg.bw; node_info->qos_params.reg.sat = pdata_node_info->qos_params.reg.sat; node_info->qos_params.reg_mode.read = pdata_node_info->qos_params.reg_mode.read; node_info->qos_params.reg_mode.write = pdata_node_info->qos_params.reg_mode.write; node_info->qos_params.urg_fwd_en = pdata_node_info->qos_params.urg_fwd_en; node_info->agg_params.buswidth = pdata_node_info->agg_params.buswidth; node_info->agg_params.agg_scheme = pdata_node_info->agg_params.agg_scheme; Loading Loading @@ -1299,7 +1400,7 @@ static struct device *msm_bus_device_init( struct device *bus_dev = NULL; struct msm_bus_node_device_type *bus_node = NULL; struct msm_bus_node_info_type *node_info = NULL; int ret = 0; int ret = 0, i = 0; /** * Init here so we can use devm calls Loading Loading @@ -1328,6 +1429,23 @@ static struct device *msm_bus_device_init( bus_node->node_info = node_info; bus_node->ap_owned = pdata->ap_owned; bus_node->dirty = false; bus_node->num_qos_bcms = pdata->num_qos_bcms; if (bus_node->num_qos_bcms) { bus_node->qos_bcms = devm_kzalloc(bus_dev, (sizeof(struct qos_bcm_type) * bus_node->num_qos_bcms), GFP_KERNEL); if (!bus_node->qos_bcms) goto exit_device_init; for (i = 0; i < bus_node->num_qos_bcms; i++) { bus_node->qos_bcms[i].qos_bcm_id = pdata->qos_bcms[i].qos_bcm_id; bus_node->qos_bcms[i].vec.vec_a = pdata->qos_bcms[i].vec.vec_a; bus_node->qos_bcms[i].vec.vec_b = pdata->qos_bcms[i].vec.vec_b; } } bus_dev->of_node = pdata->of_node; if (msm_bus_copy_node_info(pdata, bus_dev) < 0) { Loading Loading
Documentation/devicetree/bindings/arm/msm/msm_bus_adhoc.txt +20 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,20 @@ qcom,blacklist: An array of phandles that represent devices that this de cannot connect to either directly or via any number of intermediate nodes. qcom,agg-ports: The number of aggregation ports on the bus. qcom,node-qos-bcms: Optional property to target specific BCMs to toggle during QoS configuration, this is to ensure QoS register space is clocked and accessible. Array is defined as follows: BCM node ID, VoteX, VoteY. The vectors must be defined in sets of the three values aforementioned. qcom,prio: Default fixed priority for bus master. qcom,qos-lim-params: Array containing QoS limiter configurations defined as: Bandwidth, Saturation. Must define "qcom,qos-lim-en" for these settings to take effect. qcom,qos-lim-en: Boolean to enable limiter settings, default is disabled. qcom,qos-reg-params: Array containing QoS regulator configurations defined as: Low Priority, High Priority, Bandwidth, Saturation. Must define "qcom,qos-reg-regmode" for these settings to take effect. qcom,qos-reg-mode: Array containing QoS regulator mode enablement: Read Enable, Write Enable, default is disabled. qcom,forwarding: Boolean indicate Urgent Forwarding enablement. The following properties are optional as collecting data via coresight might and are present on child nodes that represent NOC devices. The documentation Loading Loading @@ -172,6 +186,12 @@ Example: <&clock_gcc clk_q1_clk>; q0-clk-supply = <&gdsc_q0_clk>; }; qcom,node-qos-bcms = <0x7011 0 1>; qcom,prio = 1; qcom,qos-lim-params = <1000 1000>; qcom,qos-lim-en: qcom,qos-reg-params = <1 2 1000 1000>; qcom,qos-reg-mode = <1 1>; }; mm_int_bimc: mm-int-bimc { Loading
arch/arm64/boot/dts/qcom/sdm845-bus.dtsi +101 −15 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <dt-bindings/msm/msm-bus-ids.h> #include <dt-bindings/soc/qcom,tcs-mbox.h> #include <dt-bindings/clock/qcom,gcc-sdm845.h> &soc { ad_hoc_bus: ad-hoc-bus { Loading Loading @@ -355,7 +356,8 @@ label = "fab-aggre1_noc"; qcom,fab-dev; qcom,base-name = "aggre1_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <16384>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -365,7 +367,8 @@ label = "fab-aggre2_noc"; qcom,fab-dev; qcom,base-name = "aggre2_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <16384>; qcom,bus-type = <1>; clocks = <>; }; Loading Loading @@ -432,7 +435,8 @@ label = "fab-mem_noc"; qcom,fab-dev; qcom,base-name = "mem_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <65536>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -442,7 +446,8 @@ label = "fab-mmss_noc"; qcom,fab-dev; qcom,base-name = "mmss_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <36864>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -452,7 +457,8 @@ label = "fab-system_noc"; qcom,fab-dev; qcom,base-name = "system_noc-base"; qcom,bypass-qos-prg; qcom,qos-off = <4096>; qcom,base-offset = <36864>; qcom,bus-type = <1>; clocks = <>; }; Loading @@ -471,6 +477,8 @@ label = "fab-mem_noc_display"; qcom,fab-dev; qcom,base-name = "mem_noc-base"; qcom,qos-off = <4096>; qcom,base-offset = <65536>; qcom,bypass-qos-prg; qcom,bus-type = <1>; clocks = <>; Loading Loading @@ -524,6 +532,8 @@ qcom,qport = <1>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <1>; }; mas_xm_sdc4: mas-xm-sdc4 { Loading @@ -534,6 +544,8 @@ qcom,qport = <2>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <1>; }; mas_xm_ufs_card: mas-xm-ufs-card { Loading @@ -544,6 +556,8 @@ qcom,qport = <3>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_ufs_mem: mas-xm-ufs-mem { Loading @@ -554,6 +568,8 @@ qcom,qport = <4>; qcom,connections = <&slv_qns_a1noc_snoc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_qhm_a2noc_cfg: mas-qhm-a2noc-cfg { Loading Loading @@ -592,6 +608,8 @@ qcom,qport = <0>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,ap-owned; qcom,prio = <1>; }; mas_qxm_crypto: mas-qxm-crypto { Loading @@ -603,6 +621,8 @@ qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,bcms = <&bcm_ce0>; qcom,ap-owned; qcom,prio = <2>; }; mas_qxm_ipa: mas-qxm-ipa { Loading @@ -613,6 +633,7 @@ qcom,qport = <2>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,prio = <2>; }; mas_xm_pcie3_1: mas-xm-pcie3-1 { Loading @@ -623,6 +644,8 @@ qcom,qport = <6>; qcom,connections = <&slv_qns_pcie_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_pcie_0: mas-xm-pcie-0 { Loading @@ -632,7 +655,9 @@ qcom,agg-ports = <1>; qcom,qport = <5>; qcom,connections = <&slv_qns_pcie_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,bus-dev = <&fab_aggre1_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_qdss_etr: mas-xm-qdss-etr { Loading @@ -643,6 +668,8 @@ qcom,qport = <7>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,ap-owned; qcom,prio = <2>; }; mas_xm_usb3_0: mas-xm-usb3-0 { Loading @@ -653,6 +680,7 @@ qcom,qport = <10>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,prio = <2>; }; mas_xm_usb3_1: mas-xm-usb3-1 { Loading @@ -663,6 +691,7 @@ qcom,qport = <11>; qcom,connections = <&slv_qns_a2noc_snoc>; qcom,bus-dev = <&fab_aggre2_noc>; qcom,prio = <2>; }; mas_qxm_camnoc_hf0_uncomp: mas-qxm-camnoc-hf0-uncomp { Loading Loading @@ -825,12 +854,12 @@ qcom,bus-dev = <&fab_gladiator_noc>; }; mas_ipa_core: mas-ipa-core { mas_ipa_core_master: mas-ipa-core-master { cell-id = <MSM_BUS_MASTER_IPA_CORE>; label = "mas-ipa-core"; qcom,buswidth = <1>; label = "mas-ipa-core-master"; qcom,buswidth = <8>; qcom,agg-ports = <1>; qcom,connections = <&slv_ipa_core>; qcom,connections = <&slv_ipa_core_slave>; qcom,bus-dev = <&fab_ipa_virt>; }; Loading @@ -853,6 +882,8 @@ &slv_qns_memnoc_snoc>; qcom,bus-dev = <&fab_mem_noc>; qcom,bcms = <&bcm_sh3>; qcom,ap-owned; qcom,prio = <6>; }; mas_qhm_memnoc_cfg: mas-qhm-memnoc-cfg { Loading @@ -874,6 +905,8 @@ qcom,connections = <&slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,bcms = <&bcm_sh5>; qcom,ap-owned; qcom,prio = <0>; }; mas_qnm_mnoc_hf: mas-qnm-mnoc-hf { Loading @@ -884,6 +917,10 @@ qcom,qport = <4 5>; qcom,connections = <&slv_qns_apps_io &slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qnm_mnoc_sf: mas-qnm-mnoc-sf { Loading @@ -895,6 +932,10 @@ qcom,connections = <&slv_qns_apps_io &slv_qns_llcc &slv_qns_memnoc_snoc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qnm_snoc_gc: mas-qnm-snoc-gc { Loading @@ -905,6 +946,9 @@ qcom,qport = <8>; qcom,connections = <&slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; }; mas_qnm_snoc_sf: mas-qnm-snoc-sf { Loading @@ -915,6 +959,9 @@ qcom,qport = <9>; qcom,connections = <&slv_qns_apps_io &slv_qns_llcc>; qcom,bus-dev = <&fab_mem_noc>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; }; mas_qxm_gpu: mas-qxm-gpu { Loading @@ -926,7 +973,8 @@ qcom,connections = <&slv_qns_apps_io &slv_qns_llcc &slv_qns_memnoc_snoc>; qcom,bus-dev = <&fab_mem_noc>; qcom,bcms = <&bcm_sh4>; qcom,ap-owned; qcom,prio = <0>; }; mas_qhm_mnoc_cfg: mas-qhm-mnoc-cfg { Loading @@ -947,6 +995,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_camnoc_hf1: mas-qxm-camnoc-hf1 { Loading @@ -958,6 +1010,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_camnoc_sf: mas-qxm-camnoc-sf { Loading @@ -969,6 +1025,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_mdp0: mas-qxm-mdp0 { Loading @@ -980,6 +1040,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_mdp1: mas-qxm-mdp1 { Loading @@ -991,6 +1055,10 @@ qcom,connections = <&slv_qns_mem_noc_hf>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm1>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_rot: mas-qxm-rot { Loading @@ -1002,6 +1070,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_venus0: mas-qxm-venus0 { Loading @@ -1013,6 +1085,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_venus1: mas-qxm-venus1 { Loading @@ -1024,6 +1100,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qxm_venus_arm9: mas-qxm-venus-arm9 { Loading @@ -1035,6 +1115,10 @@ qcom,connections = <&slv_qns2_mem_noc>; qcom,bus-dev = <&fab_mmss_noc>; qcom,bcms = <&bcm_mm3>; qcom,ap-owned; qcom,prio = <0>; qcom,forwarding; qcom,node-qos-bcms = <7012 0 1>; }; mas_qhm_snoc_cfg: mas-qhm-snoc-cfg { Loading Loading @@ -1120,6 +1204,8 @@ qcom,connections = <&slv_qxs_imem &slv_qns_memnoc_gc>; qcom,bus-dev = <&fab_system_noc>; qcom,bcms = <&bcm_sn4>; qcom,ap-owned; qcom,prio = <2>; }; mas_alc: mas-alc { Loading Loading @@ -1687,10 +1773,10 @@ qcom,bus-dev = <&fab_gladiator_noc>; }; slv_ipa_core:slv-ipa-core { cell-id = <MSM_BUS_SLAVE_IPA>; label = "slv-ipa-core"; qcom,buswidth = <1>; slv_ipa_core_slave:slv-ipa-core-slave { cell-id = <MSM_BUS_SLAVE_IPA_CORE>; label = "slv-ipa-core-slave"; qcom,buswidth = <8>; qcom,agg-ports = <1>; qcom,bus-dev = <&fab_ipa_virt>; qcom,bcms = <&bcm_ip0>; Loading
drivers/soc/qcom/msm_bus/msm_bus_fabric_rpmh.c +147 −29 Original line number Diff line number Diff line Loading @@ -272,6 +272,9 @@ static int tcs_cmd_gen(struct msm_bus_node_device_type *cur_bcm, int ret = 0; bool valid = true; if (!cmd) return ret; if (vec_a == 0 && vec_b == 0) valid = false; Loading Loading @@ -670,7 +673,30 @@ int msm_bus_query_gen(struct list_head *query_list, return ret; } static void bcm_commit_single_req(struct msm_bus_node_device_type *cur_bcm, uint64_t vec_a, uint64_t vec_b) { struct msm_bus_node_device_type *cur_rsc = NULL; struct rpmh_client *cur_mbox = NULL; struct tcs_cmd *cmd_active = NULL; if (!cur_bcm->node_info->num_rsc_devs) return; cmd_active = kzalloc(sizeof(struct tcs_cmd), GFP_KERNEL); if (!cmd_active) return; cur_rsc = to_msm_bus_node(cur_bcm->node_info->rsc_devs[0]); cur_mbox = cur_rsc->rscdev->mbox; tcs_cmd_gen(cur_bcm, cmd_active, vec_a, vec_b, true); rpmh_write_single(cur_mbox, RPMH_ACTIVE_ONLY_STATE, cmd_active->addr, cmd_active->data); kfree(cmd_active); } void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size, size_t new_size, gfp_t flags) Loading Loading @@ -733,29 +759,22 @@ static int msm_bus_disable_node_qos_clk(struct msm_bus_node_device_type *node) static int msm_bus_enable_node_qos_clk(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *bus_node = NULL; int i; int ret; long rounded_rate; if (!node || (!to_msm_bus_node(node->node_info->bus_device))) { ret = -ENXIO; goto exit_enable_node_qos_clk; } bus_node = to_msm_bus_node(node->node_info->bus_device); for (i = 0; i < bus_node->num_node_qos_clks; i++) { if (!bus_node->node_qos_clks[i].enable_only_clk) { for (i = 0; i < node->num_node_qos_clks; i++) { if (!node->node_qos_clks[i].enable_only_clk) { rounded_rate = clk_round_rate( bus_node->node_qos_clks[i].clk, 1); ret = setrate_nodeclk(&bus_node->node_qos_clks[i], node->node_qos_clks[i].clk, 1); ret = setrate_nodeclk(&node->node_qos_clks[i], rounded_rate); if (ret) MSM_BUS_DBG("%s: Failed set rate clk,node %d\n", __func__, node->node_info->id); } ret = enable_nodeclk(&bus_node->node_qos_clks[i], ret = enable_nodeclk(&node->node_qos_clks[i], node->node_info->bus_device); if (ret) { MSM_BUS_DBG("%s: Failed to set Qos Clks ret %d\n", Loading @@ -763,12 +782,85 @@ static int msm_bus_enable_node_qos_clk(struct msm_bus_node_device_type *node) msm_bus_disable_node_qos_clk(node); goto exit_enable_node_qos_clk; } } exit_enable_node_qos_clk: return ret; } static int msm_bus_vote_qos_bcms(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *cur_dev = NULL; struct msm_bus_node_device_type *cur_bcm = NULL; int i; struct device *dev = NULL; if (!node || (!to_msm_bus_node(node->node_info->bus_device))) return -ENXIO; cur_dev = node; for (i = 0; i < cur_dev->num_qos_bcms; i++) { dev = bus_find_device(&msm_bus_type, NULL, (void *) &cur_dev->qos_bcms[i].qos_bcm_id, msm_bus_device_match_adhoc); if (!dev) { MSM_BUS_ERR("Can't find dev node for %d", cur_dev->qos_bcms[i].qos_bcm_id); return -ENODEV; } cur_bcm = to_msm_bus_node(dev); if (cur_bcm->node_vec[ACTIVE_CTX].vec_a != 0 || cur_bcm->node_vec[ACTIVE_CTX].vec_b != 0 || cur_bcm->node_vec[DUAL_CTX].vec_a != 0 || cur_bcm->node_vec[DUAL_CTX].vec_b != 0) return 0; bcm_commit_single_req(cur_bcm, cur_dev->qos_bcms[i].vec.vec_a, cur_dev->qos_bcms[i].vec.vec_b); } return 0; } static int msm_bus_rm_vote_qos_bcms(struct msm_bus_node_device_type *node) { struct msm_bus_node_device_type *cur_dev = NULL; struct msm_bus_node_device_type *cur_bcm = NULL; int i; struct device *dev = NULL; if (!node || (!to_msm_bus_node(node->node_info->bus_device))) return -ENXIO; cur_dev = node; for (i = 0; i < cur_dev->num_qos_bcms; i++) { dev = bus_find_device(&msm_bus_type, NULL, (void *) &cur_dev->qos_bcms[i].qos_bcm_id, msm_bus_device_match_adhoc); if (!dev) { MSM_BUS_ERR("Can't find dev node for %d", cur_dev->qos_bcms[i].qos_bcm_id); return -ENODEV; } cur_bcm = to_msm_bus_node(dev); if (cur_bcm->node_vec[ACTIVE_CTX].vec_a != 0 || cur_bcm->node_vec[ACTIVE_CTX].vec_b != 0 || cur_bcm->node_vec[DUAL_CTX].vec_a != 0 || cur_bcm->node_vec[DUAL_CTX].vec_b != 0) return 0; bcm_commit_single_req(cur_bcm, 0, 0); } return 0; } int msm_bus_enable_limiter(struct msm_bus_node_device_type *node_dev, int enable, uint64_t lim_bw) { Loading Loading @@ -847,12 +939,11 @@ static int msm_bus_dev_init_qos(struct device *dev, void *data) bus_node_info->fabdev->noc_ops.qos_init) { int ret = 0; if (node_dev->ap_owned && (node_dev->node_info->qos_params.mode) != -1) { if (node_dev->ap_owned) { if (bus_node_info->fabdev->bypass_qos_prg) goto exit_init_qos; ret = msm_bus_vote_qos_bcms(node_dev); ret = msm_bus_enable_node_qos_clk(node_dev); if (ret < 0) { MSM_BUS_DBG("Can't Enable QoS clk %d\n", Loading @@ -868,6 +959,7 @@ static int msm_bus_dev_init_qos(struct device *dev, void *data) bus_node_info->fabdev->qos_off, bus_node_info->fabdev->qos_freq); ret = msm_bus_disable_node_qos_clk(node_dev); ret = msm_bus_rm_vote_qos_bcms(node_dev); node_dev->node_info->defer_qos = false; } } else Loading Loading @@ -1136,18 +1228,27 @@ static int msm_bus_copy_node_info(struct msm_bus_node_device_type *pdata, node_info->is_fab_dev = pdata_node_info->is_fab_dev; node_info->is_bcm_dev = pdata_node_info->is_bcm_dev; node_info->is_rsc_dev = pdata_node_info->is_rsc_dev; node_info->qos_params.mode = pdata_node_info->qos_params.mode; node_info->qos_params.prio1 = pdata_node_info->qos_params.prio1; node_info->qos_params.prio0 = pdata_node_info->qos_params.prio0; node_info->qos_params.reg_prio1 = pdata_node_info->qos_params.reg_prio1; node_info->qos_params.reg_prio0 = pdata_node_info->qos_params.reg_prio0; node_info->qos_params.prio_lvl = pdata_node_info->qos_params.prio_lvl; node_info->qos_params.prio_rd = pdata_node_info->qos_params.prio_rd; node_info->qos_params.prio_wr = pdata_node_info->qos_params.prio_wr; node_info->qos_params.gp = pdata_node_info->qos_params.gp; node_info->qos_params.thmp = pdata_node_info->qos_params.thmp; node_info->qos_params.ws = pdata_node_info->qos_params.ws; node_info->qos_params.bw_buffer = pdata_node_info->qos_params.bw_buffer; node_info->qos_params.prio_dflt = pdata_node_info->qos_params.prio_dflt; node_info->qos_params.limiter.bw = pdata_node_info->qos_params.limiter.bw; node_info->qos_params.limiter.sat = pdata_node_info->qos_params.limiter.sat; node_info->qos_params.limiter_en = pdata_node_info->qos_params.limiter_en; node_info->qos_params.reg.low_prio = pdata_node_info->qos_params.reg.low_prio; node_info->qos_params.reg.hi_prio = pdata_node_info->qos_params.reg.hi_prio; node_info->qos_params.reg.bw = pdata_node_info->qos_params.reg.bw; node_info->qos_params.reg.sat = pdata_node_info->qos_params.reg.sat; node_info->qos_params.reg_mode.read = pdata_node_info->qos_params.reg_mode.read; node_info->qos_params.reg_mode.write = pdata_node_info->qos_params.reg_mode.write; node_info->qos_params.urg_fwd_en = pdata_node_info->qos_params.urg_fwd_en; node_info->agg_params.buswidth = pdata_node_info->agg_params.buswidth; node_info->agg_params.agg_scheme = pdata_node_info->agg_params.agg_scheme; Loading Loading @@ -1299,7 +1400,7 @@ static struct device *msm_bus_device_init( struct device *bus_dev = NULL; struct msm_bus_node_device_type *bus_node = NULL; struct msm_bus_node_info_type *node_info = NULL; int ret = 0; int ret = 0, i = 0; /** * Init here so we can use devm calls Loading Loading @@ -1328,6 +1429,23 @@ static struct device *msm_bus_device_init( bus_node->node_info = node_info; bus_node->ap_owned = pdata->ap_owned; bus_node->dirty = false; bus_node->num_qos_bcms = pdata->num_qos_bcms; if (bus_node->num_qos_bcms) { bus_node->qos_bcms = devm_kzalloc(bus_dev, (sizeof(struct qos_bcm_type) * bus_node->num_qos_bcms), GFP_KERNEL); if (!bus_node->qos_bcms) goto exit_device_init; for (i = 0; i < bus_node->num_qos_bcms; i++) { bus_node->qos_bcms[i].qos_bcm_id = pdata->qos_bcms[i].qos_bcm_id; bus_node->qos_bcms[i].vec.vec_a = pdata->qos_bcms[i].vec.vec_a; bus_node->qos_bcms[i].vec.vec_b = pdata->qos_bcms[i].vec.vec_b; } } bus_dev->of_node = pdata->of_node; if (msm_bus_copy_node_info(pdata, bus_dev) < 0) { Loading