@@ -48,35 +48,25 @@ static const struct msi_parent_ops dw_pcie_msi_parent_ops = {
4848};
4949
5050/* MSI int handler */
51- irqreturn_t dw_handle_msi_irq (struct dw_pcie_rp * pp )
51+ void dw_handle_msi_irq (struct dw_pcie_rp * pp )
5252{
53- int i , pos ;
54- unsigned long val ;
55- u32 status , num_ctrls ;
56- irqreturn_t ret = IRQ_NONE ;
5753 struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
54+ unsigned int i , num_ctrls ;
5855
5956 num_ctrls = pp -> num_vectors / MAX_MSI_IRQS_PER_CTRL ;
6057
6158 for (i = 0 ; i < num_ctrls ; i ++ ) {
62- status = dw_pcie_readl_dbi (pci , PCIE_MSI_INTR0_STATUS +
63- (i * MSI_REG_CTRL_BLOCK_SIZE ));
59+ unsigned int reg_off = i * MSI_REG_CTRL_BLOCK_SIZE ;
60+ unsigned int irq_off = i * MAX_MSI_IRQS_PER_CTRL ;
61+ unsigned long status , pos ;
62+
63+ status = dw_pcie_readl_dbi (pci , PCIE_MSI_INTR0_STATUS + reg_off );
6464 if (!status )
6565 continue ;
6666
67- ret = IRQ_HANDLED ;
68- val = status ;
69- pos = 0 ;
70- while ((pos = find_next_bit (& val , MAX_MSI_IRQS_PER_CTRL ,
71- pos )) != MAX_MSI_IRQS_PER_CTRL ) {
72- generic_handle_domain_irq (pp -> irq_domain ,
73- (i * MAX_MSI_IRQS_PER_CTRL ) +
74- pos );
75- pos ++ ;
76- }
67+ for_each_set_bit (pos , & status , MAX_MSI_IRQS_PER_CTRL )
68+ generic_handle_domain_irq (pp -> irq_domain , irq_off + pos );
7769 }
78-
79- return ret ;
8070}
8171
8272/* Chained MSI interrupt service routine */
@@ -97,13 +87,10 @@ static void dw_pci_setup_msi_msg(struct irq_data *d, struct msi_msg *msg)
9787{
9888 struct dw_pcie_rp * pp = irq_data_get_irq_chip_data (d );
9989 struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
100- u64 msi_target ;
101-
102- msi_target = (u64 )pp -> msi_data ;
90+ u64 msi_target = (u64 )pp -> msi_data ;
10391
10492 msg -> address_lo = lower_32_bits (msi_target );
10593 msg -> address_hi = upper_32_bits (msi_target );
106-
10794 msg -> data = d -> hwirq ;
10895
10996 dev_dbg (pci -> dev , "msi#%d address_hi %#x address_lo %#x\n" ,
@@ -115,37 +102,29 @@ static void dw_pci_bottom_mask(struct irq_data *d)
115102 struct dw_pcie_rp * pp = irq_data_get_irq_chip_data (d );
116103 struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
117104 unsigned int res , bit , ctrl ;
118- unsigned long flags ;
119-
120- raw_spin_lock_irqsave (& pp -> lock , flags );
121105
106+ guard (raw_spinlock )(& pp -> lock );
122107 ctrl = d -> hwirq / MAX_MSI_IRQS_PER_CTRL ;
123108 res = ctrl * MSI_REG_CTRL_BLOCK_SIZE ;
124109 bit = d -> hwirq % MAX_MSI_IRQS_PER_CTRL ;
125110
126111 pp -> irq_mask [ctrl ] |= BIT (bit );
127112 dw_pcie_writel_dbi (pci , PCIE_MSI_INTR0_MASK + res , pp -> irq_mask [ctrl ]);
128-
129- raw_spin_unlock_irqrestore (& pp -> lock , flags );
130113}
131114
132115static void dw_pci_bottom_unmask (struct irq_data * d )
133116{
134117 struct dw_pcie_rp * pp = irq_data_get_irq_chip_data (d );
135118 struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
136119 unsigned int res , bit , ctrl ;
137- unsigned long flags ;
138-
139- raw_spin_lock_irqsave (& pp -> lock , flags );
140120
121+ guard (raw_spinlock )(& pp -> lock );
141122 ctrl = d -> hwirq / MAX_MSI_IRQS_PER_CTRL ;
142123 res = ctrl * MSI_REG_CTRL_BLOCK_SIZE ;
143124 bit = d -> hwirq % MAX_MSI_IRQS_PER_CTRL ;
144125
145126 pp -> irq_mask [ctrl ] &= ~BIT (bit );
146127 dw_pcie_writel_dbi (pci , PCIE_MSI_INTR0_MASK + res , pp -> irq_mask [ctrl ]);
147-
148- raw_spin_unlock_irqrestore (& pp -> lock , flags );
149128}
150129
151130static void dw_pci_bottom_ack (struct irq_data * d )
@@ -162,54 +141,42 @@ static void dw_pci_bottom_ack(struct irq_data *d)
162141}
163142
164143static struct irq_chip dw_pci_msi_bottom_irq_chip = {
165- .name = "DWPCI-MSI" ,
166- .irq_ack = dw_pci_bottom_ack ,
167- .irq_compose_msi_msg = dw_pci_setup_msi_msg ,
168- .irq_mask = dw_pci_bottom_mask ,
169- .irq_unmask = dw_pci_bottom_unmask ,
144+ .name = "DWPCI-MSI" ,
145+ .irq_ack = dw_pci_bottom_ack ,
146+ .irq_compose_msi_msg = dw_pci_setup_msi_msg ,
147+ .irq_mask = dw_pci_bottom_mask ,
148+ .irq_unmask = dw_pci_bottom_unmask ,
170149};
171150
172- static int dw_pcie_irq_domain_alloc (struct irq_domain * domain ,
173- unsigned int virq , unsigned int nr_irqs ,
174- void * args )
151+ static int dw_pcie_irq_domain_alloc (struct irq_domain * domain , unsigned int virq ,
152+ unsigned int nr_irqs , void * args )
175153{
176154 struct dw_pcie_rp * pp = domain -> host_data ;
177- unsigned long flags ;
178- u32 i ;
179155 int bit ;
180156
181- raw_spin_lock_irqsave (& pp -> lock , flags );
182-
183- bit = bitmap_find_free_region (pp -> msi_irq_in_use , pp -> num_vectors ,
184- order_base_2 (nr_irqs ));
185-
186- raw_spin_unlock_irqrestore (& pp -> lock , flags );
157+ scoped_guard (raw_spinlock_irq , & pp -> lock ) {
158+ bit = bitmap_find_free_region (pp -> msi_irq_in_use , pp -> num_vectors ,
159+ order_base_2 (nr_irqs ));
160+ }
187161
188162 if (bit < 0 )
189163 return - ENOSPC ;
190164
191- for (i = 0 ; i < nr_irqs ; i ++ )
192- irq_domain_set_info (domain , virq + i , bit + i ,
193- pp -> msi_irq_chip ,
194- pp , handle_edge_irq ,
195- NULL , NULL );
196-
165+ for (unsigned int i = 0 ; i < nr_irqs ; i ++ ) {
166+ irq_domain_set_info (domain , virq + i , bit + i , pp -> msi_irq_chip ,
167+ pp , handle_edge_irq , NULL , NULL );
168+ }
197169 return 0 ;
198170}
199171
200- static void dw_pcie_irq_domain_free (struct irq_domain * domain ,
201- unsigned int virq , unsigned int nr_irqs )
172+ static void dw_pcie_irq_domain_free (struct irq_domain * domain , unsigned int virq ,
173+ unsigned int nr_irqs )
202174{
203175 struct irq_data * d = irq_domain_get_irq_data (domain , virq );
204176 struct dw_pcie_rp * pp = domain -> host_data ;
205- unsigned long flags ;
206-
207- raw_spin_lock_irqsave (& pp -> lock , flags );
208177
209- bitmap_release_region (pp -> msi_irq_in_use , d -> hwirq ,
210- order_base_2 (nr_irqs ));
211-
212- raw_spin_unlock_irqrestore (& pp -> lock , flags );
178+ guard (raw_spinlock_irq )(& pp -> lock );
179+ bitmap_release_region (pp -> msi_irq_in_use , d -> hwirq , order_base_2 (nr_irqs ));
213180}
214181
215182static const struct irq_domain_ops dw_pcie_msi_domain_ops = {
@@ -242,8 +209,7 @@ void dw_pcie_free_msi(struct dw_pcie_rp *pp)
242209
243210 for (ctrl = 0 ; ctrl < MAX_MSI_CTRLS ; ctrl ++ ) {
244211 if (pp -> msi_irq [ctrl ] > 0 )
245- irq_set_chained_handler_and_data (pp -> msi_irq [ctrl ],
246- NULL , NULL );
212+ irq_set_chained_handler_and_data (pp -> msi_irq [ctrl ], NULL , NULL );
247213 }
248214
249215 irq_domain_remove (pp -> irq_domain );
0 commit comments