@@ -90,8 +90,6 @@ static int aead_pri = 150;
90
90
module_param (aead_pri , int , 0644 );
91
91
MODULE_PARM_DESC (aead_pri , "Priority for AEAD algos" );
92
92
93
- #define MAX_SPUS 16
94
-
95
93
/* A type 3 BCM header, expected to precede the SPU header for SPU-M.
96
94
* Bits 3 and 4 in the first byte encode the channel number (the dma ringset).
97
95
* 0x60 - ring 0
@@ -120,7 +118,7 @@ static u8 select_channel(void)
120
118
{
121
119
u8 chan_idx = atomic_inc_return (& iproc_priv .next_chan );
122
120
123
- return chan_idx % iproc_priv .spu .num_spu ;
121
+ return chan_idx % iproc_priv .spu .num_chan ;
124
122
}
125
123
126
124
/**
@@ -4528,8 +4526,13 @@ static void spu_functions_register(struct device *dev,
4528
4526
*/
4529
4527
static int spu_mb_init (struct device * dev )
4530
4528
{
4531
- struct mbox_client * mcl = & iproc_priv .mcl [iproc_priv .spu .num_spu ];
4532
- int err ;
4529
+ struct mbox_client * mcl = & iproc_priv .mcl ;
4530
+ int err , i ;
4531
+
4532
+ iproc_priv .mbox = devm_kcalloc (dev , iproc_priv .spu .num_chan ,
4533
+ sizeof (struct mbox_chan * ), GFP_KERNEL );
4534
+ if (!iproc_priv .mbox )
4535
+ return - ENOMEM ;
4533
4536
4534
4537
mcl -> dev = dev ;
4535
4538
mcl -> tx_block = false;
@@ -4538,25 +4541,33 @@ static int spu_mb_init(struct device *dev)
4538
4541
mcl -> rx_callback = spu_rx_callback ;
4539
4542
mcl -> tx_done = NULL ;
4540
4543
4541
- iproc_priv .mbox [iproc_priv .spu .num_spu ] =
4542
- mbox_request_channel (mcl , 0 );
4543
- if (IS_ERR (iproc_priv .mbox [iproc_priv .spu .num_spu ])) {
4544
- err = (int )PTR_ERR (iproc_priv .mbox [iproc_priv .spu .num_spu ]);
4545
- dev_err (dev ,
4546
- "Mbox channel %d request failed with err %d" ,
4547
- iproc_priv .spu .num_spu , err );
4548
- iproc_priv .mbox [iproc_priv .spu .num_spu ] = NULL ;
4549
- return err ;
4544
+ for (i = 0 ; i < iproc_priv .spu .num_chan ; i ++ ) {
4545
+ iproc_priv .mbox [i ] = mbox_request_channel (mcl , i );
4546
+ if (IS_ERR (iproc_priv .mbox [i ])) {
4547
+ err = (int )PTR_ERR (iproc_priv .mbox [i ]);
4548
+ dev_err (dev ,
4549
+ "Mbox channel %d request failed with err %d" ,
4550
+ i , err );
4551
+ iproc_priv .mbox [i ] = NULL ;
4552
+ goto free_channels ;
4553
+ }
4550
4554
}
4551
4555
4552
4556
return 0 ;
4557
+ free_channels :
4558
+ for (i = 0 ; i < iproc_priv .spu .num_chan ; i ++ ) {
4559
+ if (iproc_priv .mbox [i ])
4560
+ mbox_free_channel (iproc_priv .mbox [i ]);
4561
+ }
4562
+
4563
+ return err ;
4553
4564
}
4554
4565
4555
4566
static void spu_mb_release (struct platform_device * pdev )
4556
4567
{
4557
4568
int i ;
4558
4569
4559
- for (i = 0 ; i < iproc_priv .spu .num_spu ; i ++ )
4570
+ for (i = 0 ; i < iproc_priv .spu .num_chan ; i ++ )
4560
4571
mbox_free_channel (iproc_priv .mbox [i ]);
4561
4572
}
4562
4573
@@ -4567,7 +4578,7 @@ static void spu_counters_init(void)
4567
4578
4568
4579
atomic_set (& iproc_priv .session_count , 0 );
4569
4580
atomic_set (& iproc_priv .stream_count , 0 );
4570
- atomic_set (& iproc_priv .next_chan , (int )iproc_priv .spu .num_spu );
4581
+ atomic_set (& iproc_priv .next_chan , (int )iproc_priv .spu .num_chan );
4571
4582
atomic64_set (& iproc_priv .bytes_in , 0 );
4572
4583
atomic64_set (& iproc_priv .bytes_out , 0 );
4573
4584
for (i = 0 ; i < SPU_OP_NUM ; i ++ ) {
@@ -4809,8 +4820,11 @@ static int spu_dt_read(struct platform_device *pdev)
4809
4820
struct resource * spu_ctrl_regs ;
4810
4821
const struct of_device_id * match ;
4811
4822
const struct spu_type_subtype * matched_spu_type ;
4812
- void __iomem * spu_reg_vbase [MAX_SPUS ];
4813
- int err ;
4823
+ struct device_node * dn = pdev -> dev .of_node ;
4824
+ int err , i ;
4825
+
4826
+ /* Count number of mailbox channels */
4827
+ spu -> num_chan = of_count_phandle_with_args (dn , "mboxes" , "#mbox-cells" );
4814
4828
4815
4829
match = of_match_device (of_match_ptr (bcm_spu_dt_ids ), dev );
4816
4830
if (!match ) {
@@ -4820,41 +4834,24 @@ static int spu_dt_read(struct platform_device *pdev)
4820
4834
4821
4835
matched_spu_type = match -> data ;
4822
4836
4823
- if (iproc_priv .spu .num_spu > 1 ) {
4824
- /* If this is 2nd or later SPU, make sure it's same type */
4825
- if ((spu -> spu_type != matched_spu_type -> type ) ||
4826
- (spu -> spu_subtype != matched_spu_type -> subtype )) {
4827
- err = - EINVAL ;
4828
- dev_err (& pdev -> dev , "Multiple SPU types not allowed" );
4829
- return err ;
4830
- }
4831
- } else {
4832
- /* Record type of first SPU */
4833
- spu -> spu_type = matched_spu_type -> type ;
4834
- spu -> spu_subtype = matched_spu_type -> subtype ;
4835
- }
4837
+ spu -> spu_type = matched_spu_type -> type ;
4838
+ spu -> spu_subtype = matched_spu_type -> subtype ;
4836
4839
4837
- /* Get and map SPU registers */
4838
- spu_ctrl_regs = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
4839
- if (!spu_ctrl_regs ) {
4840
- err = - EINVAL ;
4841
- dev_err (& pdev -> dev , "Invalid/missing registers for SPU\n" );
4842
- return err ;
4843
- }
4840
+ i = 0 ;
4841
+ for (i = 0 ; (i < MAX_SPUS ) && ((spu_ctrl_regs =
4842
+ platform_get_resource (pdev , IORESOURCE_MEM , i )) != NULL ); i ++ ) {
4844
4843
4845
- spu_reg_vbase [ iproc_priv . spu . num_spu ] =
4846
- devm_ioremap_resource ( dev , spu_ctrl_regs );
4847
- if ( IS_ERR ( spu_reg_vbase [ iproc_priv . spu . num_spu ])) {
4848
- err = PTR_ERR ( spu_reg_vbase [ iproc_priv . spu . num_spu ]);
4849
- dev_err ( & pdev -> dev , "Failed to map registers: %d\n" ,
4850
- err ) ;
4851
- spu_reg_vbase [ iproc_priv . spu . num_spu ] = NULL ;
4852
- return err ;
4844
+ spu -> reg_vbase [ i ] = devm_ioremap_resource ( dev , spu_ctrl_regs );
4845
+ if ( IS_ERR ( spu -> reg_vbase [ i ])) {
4846
+ err = PTR_ERR ( spu -> reg_vbase [ i ]);
4847
+ dev_err ( & pdev -> dev , "Failed to map registers: %d\n" ,
4848
+ err );
4849
+ spu -> reg_vbase [ i ] = NULL ;
4850
+ return err ;
4851
+ }
4853
4852
}
4854
-
4855
- dev_dbg (dev , "SPU %d detected." , iproc_priv .spu .num_spu );
4856
-
4857
- spu -> reg_vbase [iproc_priv .spu .num_spu ] = spu_reg_vbase ;
4853
+ spu -> num_spu = i ;
4854
+ dev_dbg (dev , "Device has %d SPUs" , spu -> num_spu );
4858
4855
4859
4856
return 0 ;
4860
4857
}
@@ -4865,8 +4862,8 @@ int bcm_spu_probe(struct platform_device *pdev)
4865
4862
struct spu_hw * spu = & iproc_priv .spu ;
4866
4863
int err = 0 ;
4867
4864
4868
- iproc_priv .pdev [ iproc_priv . spu . num_spu ] = pdev ;
4869
- platform_set_drvdata (iproc_priv .pdev [ iproc_priv . spu . num_spu ] ,
4865
+ iproc_priv .pdev = pdev ;
4866
+ platform_set_drvdata (iproc_priv .pdev ,
4870
4867
& iproc_priv );
4871
4868
4872
4869
err = spu_dt_read (pdev );
@@ -4877,12 +4874,6 @@ int bcm_spu_probe(struct platform_device *pdev)
4877
4874
if (err < 0 )
4878
4875
goto failure ;
4879
4876
4880
- iproc_priv .spu .num_spu ++ ;
4881
-
4882
- /* If already initialized, we've just added another SPU and are done */
4883
- if (iproc_priv .inited )
4884
- return 0 ;
4885
-
4886
4877
if (spu -> spu_type == SPU_TYPE_SPUM )
4887
4878
iproc_priv .bcm_hdr_len = 8 ;
4888
4879
else if (spu -> spu_type == SPU_TYPE_SPU2 )
@@ -4898,8 +4889,6 @@ int bcm_spu_probe(struct platform_device *pdev)
4898
4889
if (err < 0 )
4899
4890
goto fail_reg ;
4900
4891
4901
- iproc_priv .inited = true;
4902
-
4903
4892
return 0 ;
4904
4893
4905
4894
fail_reg :
0 commit comments