Skip to content

Commit a60d92f

Browse files
Mayank RanaMani-Sadhasivam
authored andcommitted
PCI: dwc: Export DWC MSI controller related APIs
Export dw_pcie_msi_host_init(), dw_pcie_msi_init(), and dw_pcie_free_msi() APIs to allow them to be reused by the upcoming DWC based ECAM driver implementation. Also, move MSI IRQ related initialization code to dw_pcie_msi_init(), as this code must be executed before dw_pcie_msi_init() API can be used with ECAM driver. Signed-off-by: Mayank Rana <[email protected]> [mani: commit message rewording] Signed-off-by: Manivannan Sadhasivam <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 19272b3 commit a60d92f

File tree

2 files changed

+34
-18
lines changed

2 files changed

+34
-18
lines changed

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

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ int dw_pcie_allocate_domains(struct dw_pcie_rp *pp)
250250
return 0;
251251
}
252252

253-
static void dw_pcie_free_msi(struct dw_pcie_rp *pp)
253+
void dw_pcie_free_msi(struct dw_pcie_rp *pp)
254254
{
255255
u32 ctrl;
256256

@@ -263,19 +263,34 @@ static void dw_pcie_free_msi(struct dw_pcie_rp *pp)
263263
irq_domain_remove(pp->msi_domain);
264264
irq_domain_remove(pp->irq_domain);
265265
}
266+
EXPORT_SYMBOL_GPL(dw_pcie_free_msi);
266267

267-
static void dw_pcie_msi_init(struct dw_pcie_rp *pp)
268+
void dw_pcie_msi_init(struct dw_pcie_rp *pp)
268269
{
269270
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
270271
u64 msi_target = (u64)pp->msi_data;
272+
u32 ctrl, num_ctrls;
271273

272274
if (!pci_msi_enabled() || !pp->has_msi_ctrl)
273275
return;
274276

277+
num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
278+
279+
/* Initialize IRQ Status array */
280+
for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
281+
dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK +
282+
(ctrl * MSI_REG_CTRL_BLOCK_SIZE),
283+
pp->irq_mask[ctrl]);
284+
dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_ENABLE +
285+
(ctrl * MSI_REG_CTRL_BLOCK_SIZE),
286+
~0);
287+
}
288+
275289
/* Program the msi_data */
276290
dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_LO, lower_32_bits(msi_target));
277291
dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_HI, upper_32_bits(msi_target));
278292
}
293+
EXPORT_SYMBOL_GPL(dw_pcie_msi_init);
279294

280295
static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp)
281296
{
@@ -317,7 +332,7 @@ static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp)
317332
return 0;
318333
}
319334

320-
static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
335+
int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
321336
{
322337
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
323338
struct device *dev = pci->dev;
@@ -391,6 +406,7 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
391406

392407
return 0;
393408
}
409+
EXPORT_SYMBOL_GPL(dw_pcie_msi_host_init);
394410

395411
static void dw_pcie_host_request_msg_tlp_res(struct dw_pcie_rp *pp)
396412
{
@@ -909,7 +925,7 @@ static void dw_pcie_config_presets(struct dw_pcie_rp *pp)
909925
int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
910926
{
911927
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
912-
u32 val, ctrl, num_ctrls;
928+
u32 val;
913929
int ret;
914930

915931
/*
@@ -920,20 +936,6 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
920936

921937
dw_pcie_setup(pci);
922938

923-
if (pp->has_msi_ctrl) {
924-
num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
925-
926-
/* Initialize IRQ Status array */
927-
for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
928-
dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK +
929-
(ctrl * MSI_REG_CTRL_BLOCK_SIZE),
930-
pp->irq_mask[ctrl]);
931-
dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_ENABLE +
932-
(ctrl * MSI_REG_CTRL_BLOCK_SIZE),
933-
~0);
934-
}
935-
}
936-
937939
dw_pcie_msi_init(pp);
938940

939941
/* Setup RC BARs */

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,9 @@ static inline enum dw_pcie_ltssm dw_pcie_get_ltssm(struct dw_pcie *pci)
759759
int dw_pcie_suspend_noirq(struct dw_pcie *pci);
760760
int dw_pcie_resume_noirq(struct dw_pcie *pci);
761761
irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp);
762+
void dw_pcie_msi_init(struct dw_pcie_rp *pp);
763+
int dw_pcie_msi_host_init(struct dw_pcie_rp *pp);
764+
void dw_pcie_free_msi(struct dw_pcie_rp *pp);
762765
int dw_pcie_setup_rc(struct dw_pcie_rp *pp);
763766
int dw_pcie_host_init(struct dw_pcie_rp *pp);
764767
void dw_pcie_host_deinit(struct dw_pcie_rp *pp);
@@ -781,6 +784,17 @@ static inline irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
781784
return IRQ_NONE;
782785
}
783786

787+
static inline void dw_pcie_msi_init(struct dw_pcie_rp *pp)
788+
{ }
789+
790+
static inline int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
791+
{
792+
return -ENODEV;
793+
}
794+
795+
static inline void dw_pcie_free_msi(struct dw_pcie_rp *pp)
796+
{ }
797+
784798
static inline int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
785799
{
786800
return 0;

0 commit comments

Comments
 (0)