@@ -1712,25 +1712,24 @@ static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid)
1712
1712
{
1713
1713
dma_addr_t l2ptr_dma ;
1714
1714
struct arm_smmu_strtab_cfg * cfg = & smmu -> strtab_cfg ;
1715
- struct arm_smmu_strtab_l1_desc * desc ;
1716
- __le64 * dst ;
1715
+ struct arm_smmu_strtab_l2 * * l2table ;
1717
1716
1718
- desc = & cfg -> l1_desc [arm_smmu_strtab_l1_idx (sid )];
1719
- if (desc -> l2ptr )
1717
+ l2table = & cfg -> l2 . l2ptrs [arm_smmu_strtab_l1_idx (sid )];
1718
+ if (* l2table )
1720
1719
return 0 ;
1721
1720
1722
- desc -> l2ptr = dmam_alloc_coherent (smmu -> dev , sizeof (* desc -> l2ptr ),
1723
- & l2ptr_dma , GFP_KERNEL );
1724
- if (!desc -> l2ptr ) {
1721
+ * l2table = dmam_alloc_coherent (smmu -> dev , sizeof (* * l2table ),
1722
+ & l2ptr_dma , GFP_KERNEL );
1723
+ if (!* l2table ) {
1725
1724
dev_err (smmu -> dev ,
1726
1725
"failed to allocate l2 stream table for SID %u\n" ,
1727
1726
sid );
1728
1727
return - ENOMEM ;
1729
1728
}
1730
1729
1731
- arm_smmu_init_initial_stes (desc -> l2ptr -> stes , STRTAB_NUM_L2_STES );
1732
- dst = & cfg -> strtab [ arm_smmu_strtab_l1_idx ( sid )] ;
1733
- arm_smmu_write_strtab_l1_desc (( struct arm_smmu_strtab_l1 * ) dst ,
1730
+ arm_smmu_init_initial_stes (( * l2table ) -> stes ,
1731
+ ARRAY_SIZE (( * l2table ) -> stes )) ;
1732
+ arm_smmu_write_strtab_l1_desc (& cfg -> l2 . l1tab [ arm_smmu_strtab_l1_idx ( sid )] ,
1734
1733
l2ptr_dma );
1735
1734
return 0 ;
1736
1735
}
@@ -2487,12 +2486,11 @@ arm_smmu_get_step_for_sid(struct arm_smmu_device *smmu, u32 sid)
2487
2486
2488
2487
if (smmu -> features & ARM_SMMU_FEAT_2_LVL_STRTAB ) {
2489
2488
/* Two-level walk */
2490
- return & cfg -> l1_desc [arm_smmu_strtab_l1_idx (sid )]
2491
- . l2ptr -> stes [arm_smmu_strtab_l2_idx (sid )];
2489
+ return & cfg -> l2 . l2ptrs [arm_smmu_strtab_l1_idx (sid )]
2490
+ -> stes [arm_smmu_strtab_l2_idx (sid )];
2492
2491
} else {
2493
2492
/* Simple linear lookup */
2494
- return (struct arm_smmu_ste * )& cfg
2495
- -> strtab [sid * STRTAB_STE_DWORDS ];
2493
+ return & cfg -> linear .table [sid ];
2496
2494
}
2497
2495
}
2498
2496
@@ -3193,8 +3191,8 @@ struct arm_smmu_device *arm_smmu_get_by_fwnode(struct fwnode_handle *fwnode)
3193
3191
static bool arm_smmu_sid_in_range (struct arm_smmu_device * smmu , u32 sid )
3194
3192
{
3195
3193
if (smmu -> features & ARM_SMMU_FEAT_2_LVL_STRTAB )
3196
- return arm_smmu_strtab_l1_idx (sid ) < smmu -> strtab_cfg .num_l1_ents ;
3197
- return sid < smmu -> strtab_cfg .num_l1_ents ;
3194
+ return arm_smmu_strtab_l1_idx (sid ) < smmu -> strtab_cfg .l2 . num_l1_ents ;
3195
+ return sid < smmu -> strtab_cfg .linear . num_ents ;
3198
3196
}
3199
3197
3200
3198
static int arm_smmu_init_sid_strtab (struct arm_smmu_device * smmu , u32 sid )
@@ -3629,72 +3627,69 @@ static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
3629
3627
3630
3628
static int arm_smmu_init_strtab_2lvl (struct arm_smmu_device * smmu )
3631
3629
{
3632
- void * strtab ;
3633
3630
u64 reg ;
3634
3631
u32 l1size ;
3635
3632
struct arm_smmu_strtab_cfg * cfg = & smmu -> strtab_cfg ;
3636
3633
unsigned int last_sid_idx =
3637
3634
arm_smmu_strtab_l1_idx ((1 << smmu -> sid_bits ) - 1 );
3638
3635
3639
3636
/* Calculate the L1 size, capped to the SIDSIZE. */
3640
- cfg -> num_l1_ents = min (last_sid_idx + 1 , STRTAB_MAX_L1_ENTRIES );
3641
- if (cfg -> num_l1_ents <= last_sid_idx )
3637
+ cfg -> l2 . num_l1_ents = min (last_sid_idx + 1 , STRTAB_MAX_L1_ENTRIES );
3638
+ if (cfg -> l2 . num_l1_ents <= last_sid_idx )
3642
3639
dev_warn (smmu -> dev ,
3643
3640
"2-level strtab only covers %u/%u bits of SID\n" ,
3644
- ilog2 (cfg -> num_l1_ents * STRTAB_NUM_L2_STES ),
3641
+ ilog2 (cfg -> l2 . num_l1_ents * STRTAB_NUM_L2_STES ),
3645
3642
smmu -> sid_bits );
3646
3643
3647
- l1size = cfg -> num_l1_ents * sizeof (struct arm_smmu_strtab_l1 );
3648
- strtab = dmam_alloc_coherent (smmu -> dev , l1size , & cfg -> strtab_dma ,
3649
- GFP_KERNEL );
3650
- if (!strtab ) {
3644
+ l1size = cfg -> l2 . num_l1_ents * sizeof (struct arm_smmu_strtab_l1 );
3645
+ cfg -> l2 . l1tab = dmam_alloc_coherent (smmu -> dev , l1size , & cfg -> l2 . l1_dma ,
3646
+ GFP_KERNEL );
3647
+ if (!cfg -> l2 . l1tab ) {
3651
3648
dev_err (smmu -> dev ,
3652
3649
"failed to allocate l1 stream table (%u bytes)\n" ,
3653
3650
l1size );
3654
3651
return - ENOMEM ;
3655
3652
}
3656
- cfg -> strtab = strtab ;
3657
3653
3658
3654
/* Configure strtab_base_cfg for 2 levels */
3659
3655
reg = FIELD_PREP (STRTAB_BASE_CFG_FMT , STRTAB_BASE_CFG_FMT_2LVL );
3660
3656
reg |= FIELD_PREP (STRTAB_BASE_CFG_LOG2SIZE ,
3661
- ilog2 (cfg -> num_l1_ents ) + STRTAB_SPLIT );
3657
+ ilog2 (cfg -> l2 . num_l1_ents ) + STRTAB_SPLIT );
3662
3658
reg |= FIELD_PREP (STRTAB_BASE_CFG_SPLIT , STRTAB_SPLIT );
3663
3659
cfg -> strtab_base_cfg = reg ;
3664
3660
3665
- cfg -> l1_desc = devm_kcalloc (smmu -> dev , cfg -> num_l1_ents ,
3666
- sizeof (* cfg -> l1_desc ), GFP_KERNEL );
3667
- if (!cfg -> l1_desc )
3661
+ cfg -> l2 . l2ptrs = devm_kcalloc (smmu -> dev , cfg -> l2 . num_l1_ents ,
3662
+ sizeof (* cfg -> l2 . l2ptrs ), GFP_KERNEL );
3663
+ if (!cfg -> l2 . l2ptrs )
3668
3664
return - ENOMEM ;
3669
3665
3670
3666
return 0 ;
3671
3667
}
3672
3668
3673
3669
static int arm_smmu_init_strtab_linear (struct arm_smmu_device * smmu )
3674
3670
{
3675
- void * strtab ;
3676
3671
u64 reg ;
3677
3672
u32 size ;
3678
3673
struct arm_smmu_strtab_cfg * cfg = & smmu -> strtab_cfg ;
3679
3674
3680
- size = (1 << smmu -> sid_bits ) * (STRTAB_STE_DWORDS << 3 );
3681
- strtab = dmam_alloc_coherent (smmu -> dev , size , & cfg -> strtab_dma ,
3682
- GFP_KERNEL );
3683
- if (!strtab ) {
3675
+ size = (1 << smmu -> sid_bits ) * sizeof (struct arm_smmu_ste );
3676
+ cfg -> linear .table = dmam_alloc_coherent (smmu -> dev , size ,
3677
+ & cfg -> linear .ste_dma ,
3678
+ GFP_KERNEL );
3679
+ if (!cfg -> linear .table ) {
3684
3680
dev_err (smmu -> dev ,
3685
3681
"failed to allocate linear stream table (%u bytes)\n" ,
3686
3682
size );
3687
3683
return - ENOMEM ;
3688
3684
}
3689
- cfg -> strtab = strtab ;
3690
- cfg -> num_l1_ents = 1 << smmu -> sid_bits ;
3685
+ cfg -> linear .num_ents = 1 << smmu -> sid_bits ;
3691
3686
3692
3687
/* Configure strtab_base_cfg for a linear table covering all SIDs */
3693
3688
reg = FIELD_PREP (STRTAB_BASE_CFG_FMT , STRTAB_BASE_CFG_FMT_LINEAR );
3694
3689
reg |= FIELD_PREP (STRTAB_BASE_CFG_LOG2SIZE , smmu -> sid_bits );
3695
3690
cfg -> strtab_base_cfg = reg ;
3696
3691
3697
- arm_smmu_init_initial_stes (strtab , cfg -> num_l1_ents );
3692
+ arm_smmu_init_initial_stes (cfg -> linear . table , cfg -> linear . num_ents );
3698
3693
return 0 ;
3699
3694
}
3700
3695
@@ -3703,16 +3698,17 @@ static int arm_smmu_init_strtab(struct arm_smmu_device *smmu)
3703
3698
u64 reg ;
3704
3699
int ret ;
3705
3700
3706
- if (smmu -> features & ARM_SMMU_FEAT_2_LVL_STRTAB )
3701
+ if (smmu -> features & ARM_SMMU_FEAT_2_LVL_STRTAB ) {
3707
3702
ret = arm_smmu_init_strtab_2lvl (smmu );
3708
- else
3703
+ reg = smmu -> strtab_cfg .l2 .l1_dma & STRTAB_BASE_ADDR_MASK ;
3704
+ } else {
3709
3705
ret = arm_smmu_init_strtab_linear (smmu );
3710
-
3706
+ reg = smmu -> strtab_cfg .linear .ste_dma & STRTAB_BASE_ADDR_MASK ;
3707
+ }
3711
3708
if (ret )
3712
3709
return ret ;
3713
3710
3714
3711
/* Set the strtab base address */
3715
- reg = smmu -> strtab_cfg .strtab_dma & STRTAB_BASE_ADDR_MASK ;
3716
3712
reg |= STRTAB_BASE_RA ;
3717
3713
smmu -> strtab_cfg .strtab_base = reg ;
3718
3714
0 commit comments