@@ -392,9 +392,10 @@ static bool gsi_command(struct gsi *gsi, u32 reg, u32 val)
392
392
static enum gsi_evt_ring_state
393
393
gsi_evt_ring_state (struct gsi * gsi , u32 evt_ring_id )
394
394
{
395
+ const struct reg * reg = gsi_reg (gsi , EV_CH_E_CNTXT_0 );
395
396
u32 val ;
396
397
397
- val = ioread32 (gsi -> virt + GSI_EV_CH_E_CNTXT_0_OFFSET ( evt_ring_id ));
398
+ val = ioread32 (gsi -> virt + reg_n_offset ( reg , evt_ring_id ));
398
399
399
400
return u32_get_bits (val , EV_CHSTATE_FMASK );
400
401
}
@@ -690,56 +691,72 @@ static void gsi_channel_de_alloc_command(struct gsi *gsi, u32 channel_id)
690
691
*/
691
692
static void gsi_evt_ring_doorbell (struct gsi * gsi , u32 evt_ring_id , u32 index )
692
693
{
694
+ const struct reg * reg = gsi_reg (gsi , EV_CH_E_DOORBELL_0 );
693
695
struct gsi_ring * ring = & gsi -> evt_ring [evt_ring_id ].ring ;
694
696
u32 val ;
695
697
696
698
ring -> index = index ; /* Next unused entry */
697
699
698
700
/* Note: index *must* be used modulo the ring count here */
699
701
val = gsi_ring_addr (ring , (index - 1 ) % ring -> count );
700
- iowrite32 (val , gsi -> virt + GSI_EV_CH_E_DOORBELL_0_OFFSET ( evt_ring_id ));
702
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , evt_ring_id ));
701
703
}
702
704
703
705
/* Program an event ring for use */
704
706
static void gsi_evt_ring_program (struct gsi * gsi , u32 evt_ring_id )
705
707
{
706
708
struct gsi_evt_ring * evt_ring = & gsi -> evt_ring [evt_ring_id ];
707
709
struct gsi_ring * ring = & evt_ring -> ring ;
710
+ const struct reg * reg ;
708
711
size_t size ;
709
712
u32 val ;
710
713
714
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_0 );
711
715
/* We program all event rings as GPI type/protocol */
712
716
val = u32_encode_bits (GSI_CHANNEL_TYPE_GPI , EV_CHTYPE_FMASK );
713
717
val |= EV_INTYPE_FMASK ;
714
718
val |= u32_encode_bits (GSI_RING_ELEMENT_SIZE , EV_ELEMENT_SIZE_FMASK );
715
- iowrite32 (val , gsi -> virt + GSI_EV_CH_E_CNTXT_0_OFFSET ( evt_ring_id ));
719
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , evt_ring_id ));
716
720
721
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_1 );
717
722
size = ring -> count * GSI_RING_ELEMENT_SIZE ;
718
723
val = ev_ch_e_cntxt_1_length_encode (gsi -> version , size );
719
- iowrite32 (val , gsi -> virt + GSI_EV_CH_E_CNTXT_1_OFFSET ( evt_ring_id ));
724
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , evt_ring_id ));
720
725
721
726
/* The context 2 and 3 registers store the low-order and
722
727
* high-order 32 bits of the address of the event ring,
723
728
* respectively.
724
729
*/
730
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_2 );
725
731
val = lower_32_bits (ring -> addr );
726
- iowrite32 (val , gsi -> virt + GSI_EV_CH_E_CNTXT_2_OFFSET (evt_ring_id ));
732
+ iowrite32 (val , gsi -> virt + reg_n_offset (reg , evt_ring_id ));
733
+
734
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_3 );
727
735
val = upper_32_bits (ring -> addr );
728
- iowrite32 (val , gsi -> virt + GSI_EV_CH_E_CNTXT_3_OFFSET ( evt_ring_id ));
736
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , evt_ring_id ));
729
737
730
738
/* Enable interrupt moderation by setting the moderation delay */
739
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_8 );
731
740
val = u32_encode_bits (GSI_EVT_RING_INT_MODT , MODT_FMASK );
732
741
val |= u32_encode_bits (1 , MODC_FMASK ); /* comes from channel */
733
- iowrite32 (val , gsi -> virt + GSI_EV_CH_E_CNTXT_8_OFFSET ( evt_ring_id ));
742
+ iowrite32 (val , gsi -> virt + reg_n_offset ( reg , evt_ring_id ));
734
743
735
744
/* No MSI write data, and MSI address high and low address is 0 */
736
- iowrite32 (0 , gsi -> virt + GSI_EV_CH_E_CNTXT_9_OFFSET (evt_ring_id ));
737
- iowrite32 (0 , gsi -> virt + GSI_EV_CH_E_CNTXT_10_OFFSET (evt_ring_id ));
738
- iowrite32 (0 , gsi -> virt + GSI_EV_CH_E_CNTXT_11_OFFSET (evt_ring_id ));
745
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_9 );
746
+ iowrite32 (0 , gsi -> virt + reg_n_offset (reg , evt_ring_id ));
747
+
748
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_10 );
749
+ iowrite32 (0 , gsi -> virt + reg_n_offset (reg , evt_ring_id ));
750
+
751
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_11 );
752
+ iowrite32 (0 , gsi -> virt + reg_n_offset (reg , evt_ring_id ));
739
753
740
754
/* We don't need to get event read pointer updates */
741
- iowrite32 (0 , gsi -> virt + GSI_EV_CH_E_CNTXT_12_OFFSET (evt_ring_id ));
742
- iowrite32 (0 , gsi -> virt + GSI_EV_CH_E_CNTXT_13_OFFSET (evt_ring_id ));
755
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_12 );
756
+ iowrite32 (0 , gsi -> virt + reg_n_offset (reg , evt_ring_id ));
757
+
758
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_13 );
759
+ iowrite32 (0 , gsi -> virt + reg_n_offset (reg , evt_ring_id ));
743
760
744
761
/* Finally, tell the hardware our "last processed" event (arbitrary) */
745
762
gsi_evt_ring_doorbell (gsi , evt_ring_id , ring -> index );
@@ -1538,6 +1555,7 @@ void gsi_channel_update(struct gsi_channel *channel)
1538
1555
struct gsi_evt_ring * evt_ring ;
1539
1556
struct gsi_trans * trans ;
1540
1557
struct gsi_ring * ring ;
1558
+ const struct reg * reg ;
1541
1559
u32 offset ;
1542
1560
u32 index ;
1543
1561
@@ -1547,7 +1565,8 @@ void gsi_channel_update(struct gsi_channel *channel)
1547
1565
/* See if there's anything new to process; if not, we're done. Note
1548
1566
* that index always refers to an entry *within* the event ring.
1549
1567
*/
1550
- offset = GSI_EV_CH_E_CNTXT_4_OFFSET (evt_ring_id );
1568
+ reg = gsi_reg (gsi , EV_CH_E_CNTXT_4 );
1569
+ offset = reg_n_offset (reg , evt_ring_id );
1551
1570
index = gsi_ring_index (ring , ioread32 (gsi -> virt + offset ));
1552
1571
if (index == ring -> index % ring -> count )
1553
1572
return ;
0 commit comments