Skip to content

Commit 53fd3cb

Browse files
kishonLorenzo Pieralisi
authored andcommitted
PCI: endpoint: Add virtual function number in pci_epc ops
Add virtual function number in pci_epc ops. EPC controller driver can perform virtual function specific initialization based on the virtual function number. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Kishon Vijay Abraham I <[email protected]> Signed-off-by: Lorenzo Pieralisi <[email protected]>
1 parent 101600e commit 53fd3cb

File tree

9 files changed

+328
-189
lines changed

9 files changed

+328
-189
lines changed

drivers/pci/controller/cadence/pcie-cadence-ep.c

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#define CDNS_PCIE_EP_IRQ_PCI_ADDR_NONE 0x1
1717
#define CDNS_PCIE_EP_IRQ_PCI_ADDR_LEGACY 0x3
1818

19-
static int cdns_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
19+
static int cdns_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
2020
struct pci_epf_header *hdr)
2121
{
2222
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
@@ -47,7 +47,7 @@ static int cdns_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
4747
return 0;
4848
}
4949

50-
static int cdns_pcie_ep_set_bar(struct pci_epc *epc, u8 fn,
50+
static int cdns_pcie_ep_set_bar(struct pci_epc *epc, u8 fn, u8 vfn,
5151
struct pci_epf_bar *epf_bar)
5252
{
5353
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
@@ -117,7 +117,7 @@ static int cdns_pcie_ep_set_bar(struct pci_epc *epc, u8 fn,
117117
return 0;
118118
}
119119

120-
static void cdns_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn,
120+
static void cdns_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn, u8 vfn,
121121
struct pci_epf_bar *epf_bar)
122122
{
123123
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
@@ -147,8 +147,8 @@ static void cdns_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn,
147147
epf->epf_bar[bar] = NULL;
148148
}
149149

150-
static int cdns_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, phys_addr_t addr,
151-
u64 pci_addr, size_t size)
150+
static int cdns_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, u8 vfn,
151+
phys_addr_t addr, u64 pci_addr, size_t size)
152152
{
153153
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
154154
struct cdns_pcie *pcie = &ep->pcie;
@@ -169,7 +169,7 @@ static int cdns_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, phys_addr_t addr,
169169
return 0;
170170
}
171171

172-
static void cdns_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn,
172+
static void cdns_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,
173173
phys_addr_t addr)
174174
{
175175
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
@@ -189,7 +189,7 @@ static void cdns_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn,
189189
clear_bit(r, &ep->ob_region_map);
190190
}
191191

192-
static int cdns_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 mmc)
192+
static int cdns_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn, u8 mmc)
193193
{
194194
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
195195
struct cdns_pcie *pcie = &ep->pcie;
@@ -209,7 +209,7 @@ static int cdns_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 mmc)
209209
return 0;
210210
}
211211

212-
static int cdns_pcie_ep_get_msi(struct pci_epc *epc, u8 fn)
212+
static int cdns_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
213213
{
214214
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
215215
struct cdns_pcie *pcie = &ep->pcie;
@@ -230,7 +230,7 @@ static int cdns_pcie_ep_get_msi(struct pci_epc *epc, u8 fn)
230230
return mme;
231231
}
232232

233-
static int cdns_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no)
233+
static int cdns_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
234234
{
235235
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
236236
struct cdns_pcie *pcie = &ep->pcie;
@@ -247,8 +247,9 @@ static int cdns_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no)
247247
return val;
248248
}
249249

250-
static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u16 interrupts,
251-
enum pci_barno bir, u32 offset)
250+
static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u8 vfn,
251+
u16 interrupts, enum pci_barno bir,
252+
u32 offset)
252253
{
253254
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
254255
struct cdns_pcie *pcie = &ep->pcie;
@@ -317,7 +318,8 @@ static void cdns_pcie_ep_assert_intx(struct cdns_pcie_ep *ep, u8 fn,
317318
writel(0, ep->irq_cpu_addr + offset);
318319
}
319320

320-
static int cdns_pcie_ep_send_legacy_irq(struct cdns_pcie_ep *ep, u8 fn, u8 intx)
321+
static int cdns_pcie_ep_send_legacy_irq(struct cdns_pcie_ep *ep, u8 fn, u8 vfn,
322+
u8 intx)
321323
{
322324
u16 cmd;
323325

@@ -334,7 +336,7 @@ static int cdns_pcie_ep_send_legacy_irq(struct cdns_pcie_ep *ep, u8 fn, u8 intx)
334336
return 0;
335337
}
336338

337-
static int cdns_pcie_ep_send_msi_irq(struct cdns_pcie_ep *ep, u8 fn,
339+
static int cdns_pcie_ep_send_msi_irq(struct cdns_pcie_ep *ep, u8 fn, u8 vfn,
338340
u8 interrupt_num)
339341
{
340342
struct cdns_pcie *pcie = &ep->pcie;
@@ -382,7 +384,7 @@ static int cdns_pcie_ep_send_msi_irq(struct cdns_pcie_ep *ep, u8 fn,
382384
return 0;
383385
}
384386

385-
static int cdns_pcie_ep_map_msi_irq(struct pci_epc *epc, u8 fn,
387+
static int cdns_pcie_ep_map_msi_irq(struct pci_epc *epc, u8 fn, u8 vfn,
386388
phys_addr_t addr, u8 interrupt_num,
387389
u32 entry_size, u32 *msi_data,
388390
u32 *msi_addr_offset)
@@ -419,7 +421,7 @@ static int cdns_pcie_ep_map_msi_irq(struct pci_epc *epc, u8 fn,
419421
pci_addr &= GENMASK_ULL(63, 2);
420422

421423
for (i = 0; i < interrupt_num; i++) {
422-
ret = cdns_pcie_ep_map_addr(epc, fn, addr,
424+
ret = cdns_pcie_ep_map_addr(epc, fn, vfn, addr,
423425
pci_addr & ~pci_addr_mask,
424426
entry_size);
425427
if (ret)
@@ -433,7 +435,7 @@ static int cdns_pcie_ep_map_msi_irq(struct pci_epc *epc, u8 fn,
433435
return 0;
434436
}
435437

436-
static int cdns_pcie_ep_send_msix_irq(struct cdns_pcie_ep *ep, u8 fn,
438+
static int cdns_pcie_ep_send_msix_irq(struct cdns_pcie_ep *ep, u8 fn, u8 vfn,
437439
u16 interrupt_num)
438440
{
439441
u32 cap = CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET;
@@ -478,21 +480,21 @@ static int cdns_pcie_ep_send_msix_irq(struct cdns_pcie_ep *ep, u8 fn,
478480
return 0;
479481
}
480482

481-
static int cdns_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn,
483+
static int cdns_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn, u8 vfn,
482484
enum pci_epc_irq_type type,
483485
u16 interrupt_num)
484486
{
485487
struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
486488

487489
switch (type) {
488490
case PCI_EPC_IRQ_LEGACY:
489-
return cdns_pcie_ep_send_legacy_irq(ep, fn, 0);
491+
return cdns_pcie_ep_send_legacy_irq(ep, fn, vfn, 0);
490492

491493
case PCI_EPC_IRQ_MSI:
492-
return cdns_pcie_ep_send_msi_irq(ep, fn, interrupt_num);
494+
return cdns_pcie_ep_send_msi_irq(ep, fn, vfn, interrupt_num);
493495

494496
case PCI_EPC_IRQ_MSIX:
495-
return cdns_pcie_ep_send_msix_irq(ep, fn, interrupt_num);
497+
return cdns_pcie_ep_send_msix_irq(ep, fn, vfn, interrupt_num);
496498

497499
default:
498500
break;
@@ -531,7 +533,7 @@ static const struct pci_epc_features cdns_pcie_epc_features = {
531533
};
532534

533535
static const struct pci_epc_features*
534-
cdns_pcie_ep_get_features(struct pci_epc *epc, u8 func_no)
536+
cdns_pcie_ep_get_features(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
535537
{
536538
return &cdns_pcie_epc_features;
537539
}

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ static u8 dw_pcie_ep_find_capability(struct dw_pcie_ep *ep, u8 func_no, u8 cap)
125125
return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap);
126126
}
127127

128-
static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no,
128+
static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
129129
struct pci_epf_header *hdr)
130130
{
131131
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
@@ -202,7 +202,7 @@ static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, u8 func_no,
202202
return 0;
203203
}
204204

205-
static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no,
205+
static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
206206
struct pci_epf_bar *epf_bar)
207207
{
208208
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
@@ -217,7 +217,7 @@ static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no,
217217
ep->epf_bar[bar] = NULL;
218218
}
219219

220-
static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no,
220+
static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
221221
struct pci_epf_bar *epf_bar)
222222
{
223223
int ret;
@@ -276,7 +276,7 @@ static int dw_pcie_find_index(struct dw_pcie_ep *ep, phys_addr_t addr,
276276
return -EINVAL;
277277
}
278278

279-
static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, u8 func_no,
279+
static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
280280
phys_addr_t addr)
281281
{
282282
int ret;
@@ -292,9 +292,8 @@ static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, u8 func_no,
292292
clear_bit(atu_index, ep->ob_window_map);
293293
}
294294

295-
static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no,
296-
phys_addr_t addr,
297-
u64 pci_addr, size_t size)
295+
static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
296+
phys_addr_t addr, u64 pci_addr, size_t size)
298297
{
299298
int ret;
300299
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
@@ -309,7 +308,7 @@ static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no,
309308
return 0;
310309
}
311310

312-
static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no)
311+
static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
313312
{
314313
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
315314
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
@@ -333,7 +332,8 @@ static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no)
333332
return val;
334333
}
335334

336-
static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 interrupts)
335+
static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
336+
u8 interrupts)
337337
{
338338
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
339339
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
@@ -358,7 +358,7 @@ static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 interrupts)
358358
return 0;
359359
}
360360

361-
static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no)
361+
static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
362362
{
363363
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
364364
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
@@ -382,8 +382,8 @@ static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no)
382382
return val;
383383
}
384384

385-
static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u16 interrupts,
386-
enum pci_barno bir, u32 offset)
385+
static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
386+
u16 interrupts, enum pci_barno bir, u32 offset)
387387
{
388388
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
389389
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
@@ -418,7 +418,7 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u16 interrupts,
418418
return 0;
419419
}
420420

421-
static int dw_pcie_ep_raise_irq(struct pci_epc *epc, u8 func_no,
421+
static int dw_pcie_ep_raise_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
422422
enum pci_epc_irq_type type, u16 interrupt_num)
423423
{
424424
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
@@ -450,7 +450,7 @@ static int dw_pcie_ep_start(struct pci_epc *epc)
450450
}
451451

452452
static const struct pci_epc_features*
453-
dw_pcie_ep_get_features(struct pci_epc *epc, u8 func_no)
453+
dw_pcie_ep_get_features(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
454454
{
455455
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
456456

@@ -525,14 +525,14 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
525525
aligned_offset = msg_addr_lower & (epc->mem->window.page_size - 1);
526526
msg_addr = ((u64)msg_addr_upper) << 32 |
527527
(msg_addr_lower & ~aligned_offset);
528-
ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
528+
ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr,
529529
epc->mem->window.page_size);
530530
if (ret)
531531
return ret;
532532

533533
writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
534534

535-
dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
535+
dw_pcie_ep_unmap_addr(epc, func_no, 0, ep->msi_mem_phys);
536536

537537
return 0;
538538
}
@@ -593,14 +593,14 @@ int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
593593
}
594594

595595
aligned_offset = msg_addr & (epc->mem->window.page_size - 1);
596-
ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
596+
ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr,
597597
epc->mem->window.page_size);
598598
if (ret)
599599
return ret;
600600

601601
writel(msg_data, ep->msi_mem + aligned_offset);
602602

603-
dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
603+
dw_pcie_ep_unmap_addr(epc, func_no, 0, ep->msi_mem_phys);
604604

605605
return 0;
606606
}

drivers/pci/controller/pcie-rcar-ep.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static int rcar_pcie_ep_get_pdata(struct rcar_pcie_endpoint *ep,
159159
return 0;
160160
}
161161

162-
static int rcar_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
162+
static int rcar_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
163163
struct pci_epf_header *hdr)
164164
{
165165
struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
@@ -195,7 +195,7 @@ static int rcar_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
195195
return 0;
196196
}
197197

198-
static int rcar_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no,
198+
static int rcar_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
199199
struct pci_epf_bar *epf_bar)
200200
{
201201
int flags = epf_bar->flags | LAR_ENABLE | LAM_64BIT;
@@ -246,7 +246,7 @@ static int rcar_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no,
246246
return 0;
247247
}
248248

249-
static void rcar_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn,
249+
static void rcar_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn, u8 vfn,
250250
struct pci_epf_bar *epf_bar)
251251
{
252252
struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
@@ -259,7 +259,8 @@ static void rcar_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn,
259259
clear_bit(atu_index + 1, ep->ib_window_map);
260260
}
261261

262-
static int rcar_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 interrupts)
262+
static int rcar_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
263+
u8 interrupts)
263264
{
264265
struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
265266
struct rcar_pcie *pcie = &ep->pcie;
@@ -272,7 +273,7 @@ static int rcar_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 interrupts)
272273
return 0;
273274
}
274275

275-
static int rcar_pcie_ep_get_msi(struct pci_epc *epc, u8 fn)
276+
static int rcar_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
276277
{
277278
struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
278279
struct rcar_pcie *pcie = &ep->pcie;
@@ -285,7 +286,7 @@ static int rcar_pcie_ep_get_msi(struct pci_epc *epc, u8 fn)
285286
return ((flags & MSICAP0_MMESE_MASK) >> MSICAP0_MMESE_OFFSET);
286287
}
287288

288-
static int rcar_pcie_ep_map_addr(struct pci_epc *epc, u8 fn,
289+
static int rcar_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, u8 vfn,
289290
phys_addr_t addr, u64 pci_addr, size_t size)
290291
{
291292
struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
@@ -322,7 +323,7 @@ static int rcar_pcie_ep_map_addr(struct pci_epc *epc, u8 fn,
322323
return 0;
323324
}
324325

325-
static void rcar_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn,
326+
static void rcar_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,
326327
phys_addr_t addr)
327328
{
328329
struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
@@ -403,7 +404,7 @@ static int rcar_pcie_ep_assert_msi(struct rcar_pcie *pcie,
403404
return 0;
404405
}
405406

406-
static int rcar_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn,
407+
static int rcar_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn, u8 vfn,
407408
enum pci_epc_irq_type type,
408409
u16 interrupt_num)
409410
{
@@ -451,7 +452,7 @@ static const struct pci_epc_features rcar_pcie_epc_features = {
451452
};
452453

453454
static const struct pci_epc_features*
454-
rcar_pcie_ep_get_features(struct pci_epc *epc, u8 func_no)
455+
rcar_pcie_ep_get_features(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
455456
{
456457
return &rcar_pcie_epc_features;
457458
}

0 commit comments

Comments
 (0)