hc
2024-08-12 0517ab8c70e05fc5877c0c6dae1a5f42a16dcf88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * PCIe driver for Renesas R-Car SoCs
 *  Copyright (C) 2014-2020 Renesas Electronics Europe Ltd
 *
 * Author: Phil Edworthy <phil.edworthy@renesas.com>
 */
 
#ifndef _PCIE_RCAR_H
#define _PCIE_RCAR_H
 
#define PCIECAR            0x000010
#define PCIECCTLR        0x000018
#define  CONFIG_SEND_ENABLE    BIT(31)
#define  TYPE0            (0 << 8)
#define  TYPE1            BIT(8)
#define PCIECDR            0x000020
#define PCIEMSR            0x000028
#define PCIEINTXR        0x000400
#define  ASTINTX        BIT(16)
#define PCIEPHYSR        0x0007f0
#define  PHYRDY            BIT(0)
#define PCIEMSITXR        0x000840
 
/* Transfer control */
#define PCIETCTLR        0x02000
#define  DL_DOWN        BIT(3)
#define  CFINIT            BIT(0)
#define PCIETSTR        0x02004
#define  DATA_LINK_ACTIVE    BIT(0)
#define PCIEERRFR        0x02020
#define  UNSUPPORTED_REQUEST    BIT(4)
#define PCIEMSIFR        0x02044
#define PCIEMSIALR        0x02048
#define  MSIFE            BIT(0)
#define PCIEMSIAUR        0x0204c
#define PCIEMSIIER        0x02050
 
/* root port address */
#define PCIEPRAR(x)        (0x02080 + ((x) * 0x4))
 
/* local address reg & mask */
#define PCIELAR(x)        (0x02200 + ((x) * 0x20))
#define PCIELAMR(x)        (0x02208 + ((x) * 0x20))
#define  LAM_PREFETCH        BIT(3)
#define  LAM_64BIT        BIT(2)
#define  LAR_ENABLE        BIT(1)
 
/* PCIe address reg & mask */
#define PCIEPALR(x)        (0x03400 + ((x) * 0x20))
#define PCIEPAUR(x)        (0x03404 + ((x) * 0x20))
#define PCIEPAMR(x)        (0x03408 + ((x) * 0x20))
#define PCIEPTCTLR(x)        (0x0340c + ((x) * 0x20))
#define  PAR_ENABLE        BIT(31)
#define  IO_SPACE        BIT(8)
 
/* Configuration */
#define PCICONF(x)        (0x010000 + ((x) * 0x4))
#define  INTDIS            BIT(10)
#define PMCAP(x)        (0x010040 + ((x) * 0x4))
#define MSICAP(x)        (0x010050 + ((x) * 0x4))
#define  MSICAP0_MSIE        BIT(16)
#define  MSICAP0_MMESCAP_OFFSET    17
#define  MSICAP0_MMESE_OFFSET    20
#define  MSICAP0_MMESE_MASK    GENMASK(22, 20)
#define EXPCAP(x)        (0x010070 + ((x) * 0x4))
#define VCCAP(x)        (0x010100 + ((x) * 0x4))
 
/* link layer */
#define IDSETR0            0x011000
#define IDSETR1            0x011004
#define SUBIDSETR        0x011024
#define TLCTLR            0x011048
#define MACSR            0x011054
#define  SPCHGFIN        BIT(4)
#define  SPCHGFAIL        BIT(6)
#define  SPCHGSUC        BIT(7)
#define  LINK_SPEED        (0xf << 16)
#define  LINK_SPEED_2_5GTS    (1 << 16)
#define  LINK_SPEED_5_0GTS    (2 << 16)
#define MACCTLR            0x011058
#define  MACCTLR_NFTS_MASK    GENMASK(23, 16)    /* The name is from SH7786 */
#define  SPEED_CHANGE        BIT(24)
#define  SCRAMBLE_DISABLE    BIT(27)
#define  LTSMDIS        BIT(31)
#define  MACCTLR_INIT_VAL    (LTSMDIS | MACCTLR_NFTS_MASK)
#define PMSR            0x01105c
#define MACS2R            0x011078
#define MACCGSPSETR        0x011084
#define  SPCNGRSN        BIT(31)
 
/* R-Car H1 PHY */
#define H1_PCIEPHYADRR        0x04000c
#define  WRITE_CMD        BIT(16)
#define  PHY_ACK        BIT(24)
#define  RATE_POS        12
#define  LANE_POS        8
#define  ADR_POS        0
#define H1_PCIEPHYDOUTR        0x040014
 
/* R-Car Gen2 PHY */
#define GEN2_PCIEPHYADDR    0x780
#define GEN2_PCIEPHYDATA    0x784
#define GEN2_PCIEPHYCTRL    0x78c
 
#define INT_PCI_MSI_NR        32
 
#define RCONF(x)        (PCICONF(0) + (x))
#define RPMCAP(x)        (PMCAP(0) + (x))
#define REXPCAP(x)        (EXPCAP(0) + (x))
#define RVCCAP(x)        (VCCAP(0) + (x))
 
#define PCIE_CONF_BUS(b)    (((b) & 0xff) << 24)
#define PCIE_CONF_DEV(d)    (((d) & 0x1f) << 19)
#define PCIE_CONF_FUNC(f)    (((f) & 0x7) << 16)
 
#define RCAR_PCI_MAX_RESOURCES    4
#define MAX_NR_INBOUND_MAPS    6
 
struct rcar_pcie {
   struct device        *dev;
   void __iomem        *base;
};
 
enum {
   RCAR_PCI_ACCESS_READ,
   RCAR_PCI_ACCESS_WRITE,
};
 
void rcar_pci_write_reg(struct rcar_pcie *pcie, u32 val, unsigned int reg);
u32 rcar_pci_read_reg(struct rcar_pcie *pcie, unsigned int reg);
void rcar_rmw32(struct rcar_pcie *pcie, int where, u32 mask, u32 data);
int rcar_pcie_wait_for_phyrdy(struct rcar_pcie *pcie);
int rcar_pcie_wait_for_dl(struct rcar_pcie *pcie);
void rcar_pcie_set_outbound(struct rcar_pcie *pcie, int win,
               struct resource_entry *window);
void rcar_pcie_set_inbound(struct rcar_pcie *pcie, u64 cpu_addr,
              u64 pci_addr, u64 flags, int idx, bool host);
 
#endif