Skip to content

Commit 7466bfc

Browse files
rrendecabhishek-6246
authored andcommitted
PCI: dwc: Code cleanup
Code cleanup with no functional changes. These changes were originally made by Thomas Gleixner (see Link tag below) in a patch that was never submitted as is. Other parts of that patch were eventually submitted as commit 8e71711 ("PCI: dwc: Switch to msi_create_parent_irq_domain()") and the remaining parts are the code cleanup changes: - Use guard()/scoped_guard() instead of open-coded lock/unlock. - Return void in a few functions whose return value is never used. - Simplify dw_handle_msi_irq() by using for_each_set_bit(). One notable deviation from the original patch is that it reverts back to a simple 1 by 1 iteration over the controllers inside dw_handle_msi_irq. The reason is that with the original changes, the IRQ offset was calculated incorrectly. This prepares the ground for enabling MSI affinity support, which was originally part of that same series that Thomas Gleixner prepared. Originally-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Radu Rendec <rrendec@redhat.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/linux-pci/878qpg4o4t.ffs@tglx/ Link: https://patch.msgid.link/20251128212055.1409093-3-rrendec@redhat.com (cherry picked from commit f187509)
1 parent 9577ab9 commit 7466bfc

2 files changed

Lines changed: 34 additions & 71 deletions

File tree

drivers/pci/controller/dwc/pcie-designware-host.c

Lines changed: 32 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -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

132115
static 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

151130
static 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

164143
static 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

215182
static 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);

drivers/pci/controller/dwc/pcie-designware.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ const char *dw_pcie_ltssm_status_string(enum dw_pcie_ltssm ltssm);
816816
#ifdef CONFIG_PCIE_DW_HOST
817817
int dw_pcie_suspend_noirq(struct dw_pcie *pci);
818818
int dw_pcie_resume_noirq(struct dw_pcie *pci);
819-
irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp);
819+
void dw_handle_msi_irq(struct dw_pcie_rp *pp);
820820
void dw_pcie_msi_init(struct dw_pcie_rp *pp);
821821
int dw_pcie_msi_host_init(struct dw_pcie_rp *pp);
822822
void dw_pcie_free_msi(struct dw_pcie_rp *pp);
@@ -837,10 +837,7 @@ static inline int dw_pcie_resume_noirq(struct dw_pcie *pci)
837837
return 0;
838838
}
839839

840-
static inline irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
841-
{
842-
return IRQ_NONE;
843-
}
840+
static inline void dw_handle_msi_irq(struct dw_pcie_rp *pp) { }
844841

845842
static inline void dw_pcie_msi_init(struct dw_pcie_rp *pp)
846843
{ }

0 commit comments

Comments
 (0)