@@ -500,11 +500,14 @@ static void gsi_evt_ring_de_alloc_command(struct gsi *gsi, u32 evt_ring_id)
500
500
/* Fetch the current state of a channel from hardware */
501
501
static enum gsi_channel_state gsi_channel_state (struct gsi_channel * channel )
502
502
{
503
+ const struct reg * reg = gsi_reg (channel -> gsi , CH_C_CNTXT_0 );
503
504
u32 channel_id = gsi_channel_id (channel );
504
- void __iomem * virt = channel -> gsi -> virt ;
505
+ struct gsi * gsi = channel -> gsi ;
506
+ void __iomem * virt = gsi -> virt ;
505
507
u32 val ;
506
508
507
- val = ioread32 (virt + GSI_CH_C_CNTXT_0_OFFSET (channel_id ));
509
+ reg = gsi_reg (gsi , CH_C_CNTXT_0 );
510
+ val = ioread32 (virt + reg_n_offset (reg , channel_id ));
508
511
509
512
return u32_get_bits (val , CHSTATE_FMASK );
510
513
}
@@ -799,27 +802,34 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell)
799
802
struct gsi * gsi = channel -> gsi ;
800
803
const struct reg * reg ;
801
804
u32 wrr_weight = 0 ;
805
+ u32 offset ;
802
806
u32 val ;
803
807
808
+ reg = gsi_reg (gsi , CH_C_CNTXT_0 );
809
+
804
810
/* We program all channels as GPI type/protocol */
805
811
val = ch_c_cntxt_0_type_encode (gsi -> version , GSI_CHANNEL_TYPE_GPI );
806
812
if (channel -> toward_ipa )
807
813
val |= CHTYPE_DIR_FMASK ;
808
814
val |= u32_encode_bits (channel -> evt_ring_id , ERINDEX_FMASK );
809
815
val |= u32_encode_bits (GSI_RING_ELEMENT_SIZE , ELEMENT_SIZE_FMASK );
810
- iowrite32 (val , gsi -> virt + GSI_CH_C_CNTXT_0_OFFSET ( channel_id ));
816
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
811
817
818
+ reg = gsi_reg (gsi , CH_C_CNTXT_1 );
812
819
val = ch_c_cntxt_1_length_encode (gsi -> version , size );
813
- iowrite32 (val , gsi -> virt + GSI_CH_C_CNTXT_1_OFFSET ( channel_id ));
820
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
814
821
815
822
/* The context 2 and 3 registers store the low-order and
816
823
* high-order 32 bits of the address of the channel ring,
817
824
* respectively.
818
825
*/
826
+ reg = gsi_reg (gsi , CH_C_CNTXT_2 );
819
827
val = lower_32_bits (channel -> tre_ring .addr );
820
- iowrite32 (val , gsi -> virt + GSI_CH_C_CNTXT_2_OFFSET (channel_id ));
828
+ iowrite32 (val , gsi -> virt + reg_n_offset (reg , channel_id ));
829
+
830
+ reg = gsi_reg (gsi , CH_C_CNTXT_3 );
821
831
val = upper_32_bits (channel -> tre_ring .addr );
822
- iowrite32 (val , gsi -> virt + GSI_CH_C_CNTXT_3_OFFSET ( channel_id ));
832
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
823
833
824
834
reg = gsi_reg (gsi , CH_C_QOS );
825
835
@@ -857,22 +867,27 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell)
857
867
GSI_RING_ELEMENT_SIZE ;
858
868
gpi -> outstanding_threshold = 2 * GSI_RING_ELEMENT_SIZE ;
859
869
870
+ reg = gsi_reg (gsi , CH_C_SCRATCH_0 );
860
871
val = scr .data .word1 ;
861
- iowrite32 (val , gsi -> virt + GSI_CH_C_SCRATCH_0_OFFSET ( channel_id ));
872
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
862
873
874
+ reg = gsi_reg (gsi , CH_C_SCRATCH_1 );
863
875
val = scr .data .word2 ;
864
- iowrite32 (val , gsi -> virt + GSI_CH_C_SCRATCH_1_OFFSET ( channel_id ));
876
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
865
877
878
+ reg = gsi_reg (gsi , CH_C_SCRATCH_2 );
866
879
val = scr .data .word3 ;
867
- iowrite32 (val , gsi -> virt + GSI_CH_C_SCRATCH_2_OFFSET ( channel_id ));
880
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
868
881
869
882
/* We must preserve the upper 16 bits of the last scratch register.
870
883
* The next sequence assumes those bits remain unchanged between the
871
884
* read and the write.
872
885
*/
873
- val = ioread32 (gsi -> virt + GSI_CH_C_SCRATCH_3_OFFSET (channel_id ));
886
+ reg = gsi_reg (gsi , CH_C_SCRATCH_3 );
887
+ offset = reg_n_offset (reg , channel_id );
888
+ val = ioread32 (gsi -> virt + offset );
874
889
val = (scr .data .word4 & GENMASK (31 , 16 )) | (val & GENMASK (15 , 0 ));
875
- iowrite32 (val , gsi -> virt + GSI_CH_C_SCRATCH_3_OFFSET ( channel_id ) );
890
+ iowrite32 (val , gsi -> virt + offset );
876
891
877
892
/* All done! */
878
893
}
@@ -1506,11 +1521,13 @@ void gsi_channel_doorbell(struct gsi_channel *channel)
1506
1521
struct gsi_ring * tre_ring = & channel -> tre_ring ;
1507
1522
u32 channel_id = gsi_channel_id (channel );
1508
1523
struct gsi * gsi = channel -> gsi ;
1524
+ const struct reg * reg ;
1509
1525
u32 val ;
1510
1526
1527
+ reg = gsi_reg (gsi , CH_C_DOORBELL_0 );
1511
1528
/* Note: index *must* be used modulo the ring count here */
1512
1529
val = gsi_ring_addr (tre_ring , tre_ring -> index % tre_ring -> count );
1513
- iowrite32 (val , gsi -> virt + GSI_CH_C_DOORBELL_0_OFFSET ( channel_id ));
1530
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , channel_id ));
1514
1531
}
1515
1532
1516
1533
/* Consult hardware, move newly completed transactions to completed state */
0 commit comments