21
21
/* PCIe Mode Setting Register 0 */
22
22
#define PCIEMSR0 0x0000
23
23
#define BIFUR_MOD_SET_ON BIT(0)
24
+ #define DEVICE_TYPE_EP 0
24
25
#define DEVICE_TYPE_RC BIT(4)
25
26
26
27
/* PCIe Interrupt Status 0 */
44
45
#define RCAR_NUM_SPEED_CHANGE_RETRIES 10
45
46
#define RCAR_MAX_LINK_SPEED 4
46
47
48
+ #define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000
49
+ #define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET 0x800
50
+
47
51
struct rcar_gen4_pcie {
48
52
struct dw_pcie dw ;
49
53
void __iomem * base ;
@@ -52,6 +56,7 @@ struct rcar_gen4_pcie {
52
56
};
53
57
#define to_rcar_gen4_pcie (_dw ) container_of(_dw, struct rcar_gen4_pcie, dw)
54
58
59
+ /* Common */
55
60
static void rcar_gen4_pcie_ltssm_enable (struct rcar_gen4_pcie * rcar ,
56
61
bool enable )
57
62
{
@@ -169,6 +174,8 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
169
174
val = readl (rcar -> base + PCIEMSR0 );
170
175
if (rcar -> mode == DW_PCIE_RC_TYPE ) {
171
176
val |= DEVICE_TYPE_RC ;
177
+ } else if (rcar -> mode == DW_PCIE_EP_TYPE ) {
178
+ val |= DEVICE_TYPE_EP ;
172
179
} else {
173
180
ret = - EINVAL ;
174
181
goto err_unprepare ;
@@ -308,9 +315,11 @@ static int rcar_gen4_add_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
308
315
{
309
316
struct dw_pcie_rp * pp = & rcar -> dw .pp ;
310
317
318
+ if (!IS_ENABLED (CONFIG_PCIE_RCAR_GEN4_HOST ))
319
+ return - ENODEV ;
320
+
311
321
pp -> num_vectors = MAX_MSI_IRQS ;
312
322
pp -> ops = & rcar_gen4_pcie_host_ops ;
313
- rcar -> mode = DW_PCIE_RC_TYPE ;
314
323
315
324
return dw_pcie_host_init (pp );
316
325
}
@@ -320,6 +329,125 @@ static void rcar_gen4_remove_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
320
329
dw_pcie_host_deinit (& rcar -> dw .pp );
321
330
}
322
331
332
+ /* Endpoint mode */
333
+ static void rcar_gen4_pcie_ep_pre_init (struct dw_pcie_ep * ep )
334
+ {
335
+ struct dw_pcie * dw = to_dw_pcie_from_ep (ep );
336
+ struct rcar_gen4_pcie * rcar = to_rcar_gen4_pcie (dw );
337
+ int ret ;
338
+
339
+ ret = rcar_gen4_pcie_common_init (rcar );
340
+ if (ret )
341
+ return ;
342
+
343
+ writel (PCIEDMAINTSTSEN_INIT , rcar -> base + PCIEDMAINTSTSEN );
344
+ }
345
+
346
+ static void rcar_gen4_pcie_ep_init (struct dw_pcie_ep * ep )
347
+ {
348
+ struct dw_pcie * pci = to_dw_pcie_from_ep (ep );
349
+ enum pci_barno bar ;
350
+
351
+ for (bar = 0 ; bar < PCI_STD_NUM_BARS ; bar ++ )
352
+ dw_pcie_ep_reset_bar (pci , bar );
353
+ }
354
+
355
+ static void rcar_gen4_pcie_ep_deinit (struct dw_pcie_ep * ep )
356
+ {
357
+ struct dw_pcie * dw = to_dw_pcie_from_ep (ep );
358
+ struct rcar_gen4_pcie * rcar = to_rcar_gen4_pcie (dw );
359
+
360
+ writel (0 , rcar -> base + PCIEDMAINTSTSEN );
361
+ rcar_gen4_pcie_common_deinit (rcar );
362
+ }
363
+
364
+ static int rcar_gen4_pcie_ep_raise_irq (struct dw_pcie_ep * ep , u8 func_no ,
365
+ enum pci_epc_irq_type type ,
366
+ u16 interrupt_num )
367
+ {
368
+ struct dw_pcie * dw = to_dw_pcie_from_ep (ep );
369
+
370
+ switch (type ) {
371
+ case PCI_EPC_IRQ_LEGACY :
372
+ return dw_pcie_ep_raise_legacy_irq (ep , func_no );
373
+ case PCI_EPC_IRQ_MSI :
374
+ return dw_pcie_ep_raise_msi_irq (ep , func_no , interrupt_num );
375
+ default :
376
+ dev_err (dw -> dev , "Unknown IRQ type\n" );
377
+ return - EINVAL ;
378
+ }
379
+
380
+ return 0 ;
381
+ }
382
+
383
+ static const struct pci_epc_features rcar_gen4_pcie_epc_features = {
384
+ .linkup_notifier = false,
385
+ .msi_capable = true,
386
+ .msix_capable = false,
387
+ .reserved_bar = 1 << BAR_1 | 1 << BAR_3 | 1 << BAR_5 ,
388
+ .align = SZ_1M ,
389
+ };
390
+
391
+ static const struct pci_epc_features *
392
+ rcar_gen4_pcie_ep_get_features (struct dw_pcie_ep * ep )
393
+ {
394
+ return & rcar_gen4_pcie_epc_features ;
395
+ }
396
+
397
+ static unsigned int rcar_gen4_pcie_ep_func_conf_select (struct dw_pcie_ep * ep ,
398
+ u8 func_no )
399
+ {
400
+ return func_no * RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET ;
401
+ }
402
+
403
+ static unsigned int rcar_gen4_pcie_ep_get_dbi2_offset (struct dw_pcie_ep * ep ,
404
+ u8 func_no )
405
+ {
406
+ return func_no * RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET ;
407
+ }
408
+
409
+ static const struct dw_pcie_ep_ops pcie_ep_ops = {
410
+ .pre_init = rcar_gen4_pcie_ep_pre_init ,
411
+ .ep_init = rcar_gen4_pcie_ep_init ,
412
+ .deinit = rcar_gen4_pcie_ep_deinit ,
413
+ .raise_irq = rcar_gen4_pcie_ep_raise_irq ,
414
+ .get_features = rcar_gen4_pcie_ep_get_features ,
415
+ .func_conf_select = rcar_gen4_pcie_ep_func_conf_select ,
416
+ .get_dbi2_offset = rcar_gen4_pcie_ep_get_dbi2_offset ,
417
+ };
418
+
419
+ static int rcar_gen4_add_dw_pcie_ep (struct rcar_gen4_pcie * rcar )
420
+ {
421
+ struct dw_pcie_ep * ep = & rcar -> dw .ep ;
422
+
423
+ if (!IS_ENABLED (CONFIG_PCIE_RCAR_GEN4_EP ))
424
+ return - ENODEV ;
425
+
426
+ ep -> ops = & pcie_ep_ops ;
427
+
428
+ return dw_pcie_ep_init (ep );
429
+ }
430
+
431
+ static void rcar_gen4_remove_dw_pcie_ep (struct rcar_gen4_pcie * rcar )
432
+ {
433
+ dw_pcie_ep_exit (& rcar -> dw .ep );
434
+ }
435
+
436
+ /* Common */
437
+ static int rcar_gen4_add_dw_pcie (struct rcar_gen4_pcie * rcar )
438
+ {
439
+ rcar -> mode = (enum dw_pcie_device_mode )of_device_get_match_data (& rcar -> pdev -> dev );
440
+
441
+ switch (rcar -> mode ) {
442
+ case DW_PCIE_RC_TYPE :
443
+ return rcar_gen4_add_dw_pcie_rp (rcar );
444
+ case DW_PCIE_EP_TYPE :
445
+ return rcar_gen4_add_dw_pcie_ep (rcar );
446
+ default :
447
+ return - EINVAL ;
448
+ }
449
+ }
450
+
323
451
static int rcar_gen4_pcie_probe (struct platform_device * pdev )
324
452
{
325
453
struct rcar_gen4_pcie * rcar ;
@@ -337,7 +465,7 @@ static int rcar_gen4_pcie_probe(struct platform_device *pdev)
337
465
if (err )
338
466
return err ;
339
467
340
- err = rcar_gen4_add_dw_pcie_rp (rcar );
468
+ err = rcar_gen4_add_dw_pcie (rcar );
341
469
if (err )
342
470
goto err_unprepare ;
343
471
@@ -349,16 +477,37 @@ static int rcar_gen4_pcie_probe(struct platform_device *pdev)
349
477
return err ;
350
478
}
351
479
480
+ static void rcar_gen4_remove_dw_pcie (struct rcar_gen4_pcie * rcar )
481
+ {
482
+ switch (rcar -> mode ) {
483
+ case DW_PCIE_RC_TYPE :
484
+ rcar_gen4_remove_dw_pcie_rp (rcar );
485
+ break ;
486
+ case DW_PCIE_EP_TYPE :
487
+ rcar_gen4_remove_dw_pcie_ep (rcar );
488
+ break ;
489
+ default :
490
+ break ;
491
+ }
492
+ }
493
+
352
494
static void rcar_gen4_pcie_remove (struct platform_device * pdev )
353
495
{
354
496
struct rcar_gen4_pcie * rcar = platform_get_drvdata (pdev );
355
497
356
- rcar_gen4_remove_dw_pcie_rp (rcar );
498
+ rcar_gen4_remove_dw_pcie (rcar );
357
499
rcar_gen4_pcie_unprepare (rcar );
358
500
}
359
501
360
502
static const struct of_device_id rcar_gen4_pcie_of_match [] = {
361
- { .compatible = "renesas,rcar-gen4-pcie" , },
503
+ {
504
+ .compatible = "renesas,rcar-gen4-pcie" ,
505
+ .data = (void * )DW_PCIE_RC_TYPE ,
506
+ },
507
+ {
508
+ .compatible = "renesas,rcar-gen4-pcie-ep" ,
509
+ .data = (void * )DW_PCIE_EP_TYPE ,
510
+ },
362
511
{},
363
512
};
364
513
MODULE_DEVICE_TABLE (of , rcar_gen4_pcie_of_match );
0 commit comments