5050#define NOC_QOS_MODE_FIXED_VAL 0x0
5151#define NOC_QOS_MODE_BYPASS_VAL 0x2
5252
53- static int qcom_icc_set_qnoc_qos (struct icc_node * src , u64 max_bw )
53+ static int qcom_icc_set_qnoc_qos (struct icc_node * src )
5454{
5555 struct icc_provider * provider = src -> provider ;
5656 struct qcom_icc_provider * qp = to_qcom_provider (provider );
@@ -95,7 +95,7 @@ static int qcom_icc_bimc_set_qos_health(struct qcom_icc_provider *qp,
9595 mask , val );
9696}
9797
98- static int qcom_icc_set_bimc_qos (struct icc_node * src , u64 max_bw )
98+ static int qcom_icc_set_bimc_qos (struct icc_node * src )
9999{
100100 struct qcom_icc_provider * qp ;
101101 struct qcom_icc_node * qn ;
@@ -150,7 +150,7 @@ static int qcom_icc_noc_set_qos_priority(struct qcom_icc_provider *qp,
150150 NOC_QOS_PRIORITY_P0_MASK , qos -> prio_level );
151151}
152152
153- static int qcom_icc_set_noc_qos (struct icc_node * src , u64 max_bw )
153+ static int qcom_icc_set_noc_qos (struct icc_node * src )
154154{
155155 struct qcom_icc_provider * qp ;
156156 struct qcom_icc_node * qn ;
@@ -187,7 +187,7 @@ static int qcom_icc_set_noc_qos(struct icc_node *src, u64 max_bw)
187187 NOC_QOS_MODEn_MASK , mode );
188188}
189189
190- static int qcom_icc_qos_set (struct icc_node * node , u64 sum_bw )
190+ static int qcom_icc_qos_set (struct icc_node * node )
191191{
192192 struct qcom_icc_provider * qp = to_qcom_provider (node -> provider );
193193 struct qcom_icc_node * qn = node -> data ;
@@ -196,65 +196,48 @@ static int qcom_icc_qos_set(struct icc_node *node, u64 sum_bw)
196196
197197 switch (qp -> type ) {
198198 case QCOM_ICC_BIMC :
199- return qcom_icc_set_bimc_qos (node , sum_bw );
199+ return qcom_icc_set_bimc_qos (node );
200200 case QCOM_ICC_QNOC :
201- return qcom_icc_set_qnoc_qos (node , sum_bw );
201+ return qcom_icc_set_qnoc_qos (node );
202202 default :
203- return qcom_icc_set_noc_qos (node , sum_bw );
203+ return qcom_icc_set_noc_qos (node );
204204 }
205205}
206206
207- static int qcom_icc_rpm_set (int mas_rpm_id , int slv_rpm_id , u64 sum_bw )
207+ static int qcom_icc_rpm_set (struct qcom_icc_node * qn , u64 sum_bw )
208208{
209209 int ret = 0 ;
210210
211- if (mas_rpm_id != -1 ) {
211+ if (qn -> qos .ap_owned )
212+ return 0 ;
213+
214+ if (qn -> mas_rpm_id != -1 ) {
212215 ret = qcom_icc_rpm_smd_send (QCOM_SMD_RPM_ACTIVE_STATE ,
213216 RPM_BUS_MASTER_REQ ,
214- mas_rpm_id ,
217+ qn -> mas_rpm_id ,
215218 sum_bw );
216219 if (ret ) {
217220 pr_err ("qcom_icc_rpm_smd_send mas %d error %d\n" ,
218- mas_rpm_id , ret );
221+ qn -> mas_rpm_id , ret );
219222 return ret ;
220223 }
221224 }
222225
223- if (slv_rpm_id != -1 ) {
226+ if (qn -> slv_rpm_id != -1 ) {
224227 ret = qcom_icc_rpm_smd_send (QCOM_SMD_RPM_ACTIVE_STATE ,
225228 RPM_BUS_SLAVE_REQ ,
226- slv_rpm_id ,
229+ qn -> slv_rpm_id ,
227230 sum_bw );
228231 if (ret ) {
229232 pr_err ("qcom_icc_rpm_smd_send slv %d error %d\n" ,
230- slv_rpm_id , ret );
233+ qn -> slv_rpm_id , ret );
231234 return ret ;
232235 }
233236 }
234237
235238 return ret ;
236239}
237240
238- static int __qcom_icc_set (struct icc_node * n , struct qcom_icc_node * qn ,
239- u64 sum_bw )
240- {
241- int ret ;
242-
243- if (!qn -> qos .ap_owned ) {
244- /* send bandwidth request message to the RPM processor */
245- ret = qcom_icc_rpm_set (qn -> mas_rpm_id , qn -> slv_rpm_id , sum_bw );
246- if (ret )
247- return ret ;
248- } else if (qn -> qos .qos_mode != NOC_QOS_MODE_INVALID ) {
249- /* set bandwidth directly from the AP */
250- ret = qcom_icc_qos_set (n , sum_bw );
251- if (ret )
252- return ret ;
253- }
254-
255- return 0 ;
256- }
257-
258241/**
259242 * qcom_icc_pre_bw_aggregate - cleans up values before re-aggregate requests
260243 * @node: icc node to operate on
@@ -370,16 +353,17 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
370353
371354 sum_bw = icc_units_to_bps (max_agg_avg );
372355
373- ret = __qcom_icc_set ( src , src_qn , sum_bw );
356+ ret = qcom_icc_rpm_set ( src_qn , sum_bw );
374357 if (ret )
375358 return ret ;
359+
376360 if (dst_qn ) {
377- ret = __qcom_icc_set ( dst , dst_qn , sum_bw );
361+ ret = qcom_icc_rpm_set ( dst_qn , sum_bw );
378362 if (ret )
379363 return ret ;
380364 }
381365
382- for (i = 0 ; i < qp -> num_clks ; i ++ ) {
366+ for (i = 0 ; i < qp -> num_bus_clks ; i ++ ) {
383367 /*
384368 * Use WAKE bucket for active clock, otherwise, use SLEEP bucket
385369 * for other clocks. If a platform doesn't set interconnect
@@ -425,7 +409,7 @@ int qnoc_probe(struct platform_device *pdev)
425409 struct qcom_icc_provider * qp ;
426410 struct icc_node * node ;
427411 size_t num_nodes , i ;
428- const char * const * cds ;
412+ const char * const * cds = NULL ;
429413 int cd_num ;
430414 int ret ;
431415
@@ -440,31 +424,34 @@ int qnoc_probe(struct platform_device *pdev)
440424 qnodes = desc -> nodes ;
441425 num_nodes = desc -> num_nodes ;
442426
443- if (desc -> num_clocks ) {
444- cds = desc -> clocks ;
445- cd_num = desc -> num_clocks ;
427+ if (desc -> num_intf_clocks ) {
428+ cds = desc -> intf_clocks ;
429+ cd_num = desc -> num_intf_clocks ;
446430 } else {
447- cds = bus_clocks ;
448- cd_num = ARRAY_SIZE ( bus_clocks ) ;
431+ /* 0 intf clocks is perfectly fine */
432+ cd_num = 0 ;
449433 }
450434
451- qp = devm_kzalloc (dev , struct_size ( qp , bus_clks , cd_num ), GFP_KERNEL );
435+ qp = devm_kzalloc (dev , sizeof ( * qp ), GFP_KERNEL );
452436 if (!qp )
453437 return - ENOMEM ;
454438
455- qp -> bus_clk_rate = devm_kcalloc (dev , cd_num , sizeof (* qp -> bus_clk_rate ),
456- GFP_KERNEL );
457- if (!qp -> bus_clk_rate )
439+ qp -> intf_clks = devm_kcalloc (dev , cd_num , sizeof (* qp -> intf_clks ), GFP_KERNEL );
440+ if (!qp -> intf_clks )
458441 return - ENOMEM ;
459442
460443 data = devm_kzalloc (dev , struct_size (data , nodes , num_nodes ),
461444 GFP_KERNEL );
462445 if (!data )
463446 return - ENOMEM ;
464447
448+ qp -> num_intf_clks = cd_num ;
465449 for (i = 0 ; i < cd_num ; i ++ )
466- qp -> bus_clks [i ].id = cds [i ];
467- qp -> num_clks = cd_num ;
450+ qp -> intf_clks [i ].id = cds [i ];
451+
452+ qp -> num_bus_clks = desc -> no_clk_scaling ? 0 : NUM_BUS_CLKS ;
453+ for (i = 0 ; i < qp -> num_bus_clks ; i ++ )
454+ qp -> bus_clks [i ].id = bus_clocks [i ];
468455
469456 qp -> type = desc -> type ;
470457 qp -> qos_offset = desc -> qos_offset ;
@@ -494,11 +481,15 @@ int qnoc_probe(struct platform_device *pdev)
494481 }
495482
496483regmap_done :
497- ret = devm_clk_bulk_get_optional (dev , qp -> num_clks , qp -> bus_clks );
484+ ret = devm_clk_bulk_get (dev , qp -> num_bus_clks , qp -> bus_clks );
485+ if (ret )
486+ return ret ;
487+
488+ ret = clk_bulk_prepare_enable (qp -> num_bus_clks , qp -> bus_clks );
498489 if (ret )
499490 return ret ;
500491
501- ret = clk_bulk_prepare_enable ( qp -> num_clks , qp -> bus_clks );
492+ ret = devm_clk_bulk_get ( dev , qp -> num_intf_clks , qp -> intf_clks );
502493 if (ret )
503494 return ret ;
504495
@@ -512,6 +503,11 @@ int qnoc_probe(struct platform_device *pdev)
512503
513504 icc_provider_init (provider );
514505
506+ /* If this fails, bus accesses will crash the platform! */
507+ ret = clk_bulk_prepare_enable (qp -> num_intf_clks , qp -> intf_clks );
508+ if (ret )
509+ return ret ;
510+
515511 for (i = 0 ; i < num_nodes ; i ++ ) {
516512 size_t j ;
517513
@@ -528,10 +524,20 @@ int qnoc_probe(struct platform_device *pdev)
528524 for (j = 0 ; j < qnodes [i ]-> num_links ; j ++ )
529525 icc_link_create (node , qnodes [i ]-> links [j ]);
530526
527+ /* Set QoS registers (we only need to do it once, generally) */
528+ if (qnodes [i ]-> qos .ap_owned &&
529+ qnodes [i ]-> qos .qos_mode != NOC_QOS_MODE_INVALID ) {
530+ ret = qcom_icc_qos_set (node );
531+ if (ret )
532+ return ret ;
533+ }
534+
531535 data -> nodes [i ] = node ;
532536 }
533537 data -> num_nodes = num_nodes ;
534538
539+ clk_bulk_disable_unprepare (qp -> num_intf_clks , qp -> intf_clks );
540+
535541 ret = icc_provider_register (provider );
536542 if (ret )
537543 goto err_remove_nodes ;
@@ -551,7 +557,7 @@ int qnoc_probe(struct platform_device *pdev)
551557 icc_provider_deregister (provider );
552558err_remove_nodes :
553559 icc_nodes_remove (provider );
554- clk_bulk_disable_unprepare (qp -> num_clks , qp -> bus_clks );
560+ clk_bulk_disable_unprepare (qp -> num_bus_clks , qp -> bus_clks );
555561
556562 return ret ;
557563}
@@ -563,7 +569,7 @@ int qnoc_remove(struct platform_device *pdev)
563569
564570 icc_provider_deregister (& qp -> provider );
565571 icc_nodes_remove (& qp -> provider );
566- clk_bulk_disable_unprepare (qp -> num_clks , qp -> bus_clks );
572+ clk_bulk_disable_unprepare (qp -> num_bus_clks , qp -> bus_clks );
567573
568574 return 0 ;
569575}
0 commit comments