hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
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
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * Copyright 2017 NXP
 * Copyright 2014-2015 Freescale Semiconductor, Inc.
 * Layerscape PCIe driver
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#ifndef _PCIE_LAYERSCAPE_H_
#define _PCIE_LAYERSCAPE_H_
#include <pci.h>
#include <dm.h>
 
#ifndef CONFIG_SYS_PCI_MEMORY_BUS
#define CONFIG_SYS_PCI_MEMORY_BUS CONFIG_SYS_SDRAM_BASE
#endif
 
#ifndef CONFIG_SYS_PCI_MEMORY_PHYS
#define CONFIG_SYS_PCI_MEMORY_PHYS CONFIG_SYS_SDRAM_BASE
#endif
 
#ifndef CONFIG_SYS_PCI_MEMORY_SIZE
#define CONFIG_SYS_PCI_MEMORY_SIZE (2 * 1024 * 1024 * 1024UL) /* 2G */
#endif
 
#ifndef CONFIG_SYS_PCI_EP_MEMORY_BASE
#define CONFIG_SYS_PCI_EP_MEMORY_BASE CONFIG_SYS_LOAD_ADDR
#endif
 
#define PCIE_PHYS_SIZE            0x200000000
#define LS2088A_PCIE_PHYS_SIZE        0x800000000
#define LS2088A_PCIE1_PHYS_ADDR        0x2000000000
 
/* iATU registers */
#define PCIE_ATU_VIEWPORT        0x900
#define PCIE_ATU_REGION_INBOUND        (0x1 << 31)
#define PCIE_ATU_REGION_OUTBOUND    (0x0 << 31)
#define PCIE_ATU_REGION_INDEX0        (0x0 << 0)
#define PCIE_ATU_REGION_INDEX1        (0x1 << 0)
#define PCIE_ATU_REGION_INDEX2        (0x2 << 0)
#define PCIE_ATU_REGION_INDEX3        (0x3 << 0)
#define PCIE_ATU_REGION_NUM        6
#define PCIE_ATU_CR1            0x904
#define PCIE_ATU_TYPE_MEM        (0x0 << 0)
#define PCIE_ATU_TYPE_IO        (0x2 << 0)
#define PCIE_ATU_TYPE_CFG0        (0x4 << 0)
#define PCIE_ATU_TYPE_CFG1        (0x5 << 0)
#define PCIE_ATU_CR2            0x908
#define PCIE_ATU_ENABLE            (0x1 << 31)
#define PCIE_ATU_BAR_MODE_ENABLE    (0x1 << 30)
#define PCIE_ATU_BAR_NUM(bar)        ((bar) << 8)
#define PCIE_ATU_LOWER_BASE        0x90C
#define PCIE_ATU_UPPER_BASE        0x910
#define PCIE_ATU_LIMIT            0x914
#define PCIE_ATU_LOWER_TARGET        0x918
#define PCIE_ATU_BUS(x)            (((x) & 0xff) << 24)
#define PCIE_ATU_DEV(x)            (((x) & 0x1f) << 19)
#define PCIE_ATU_FUNC(x)        (((x) & 0x7) << 16)
#define PCIE_ATU_UPPER_TARGET        0x91C
 
/* DBI registers */
#define PCIE_SRIOV        0x178
#define PCIE_STRFMR1        0x71c /* Symbol Timer & Filter Mask Register1 */
#define PCIE_DBI_RO_WR_EN    0x8bc
 
#define PCIE_LINK_CAP        0x7c
#define PCIE_LINK_SPEED_MASK    0xf
#define PCIE_LINK_WIDTH_MASK    0x3f0
#define PCIE_LINK_STA        0x82
 
#define LTSSM_STATE_MASK    0x3f
#define LTSSM_PCIE_L0        0x11 /* L0 state */
 
#define PCIE_DBI_SIZE        0x100000 /* 1M */
 
#define PCIE_LCTRL0_CFG2_ENABLE    (1 << 31)
#define PCIE_LCTRL0_VF(vf)    ((vf) << 22)
#define PCIE_LCTRL0_PF(pf)    ((pf) << 16)
#define PCIE_LCTRL0_VF_ACTIVE    (1 << 21)
#define PCIE_LCTRL0_VAL(pf, vf)    (PCIE_LCTRL0_PF(pf) |               \
                PCIE_LCTRL0_VF(vf) |               \
                ((vf) == 0 ? 0 : PCIE_LCTRL0_VF_ACTIVE) | \
                PCIE_LCTRL0_CFG2_ENABLE)
 
#define PCIE_NO_SRIOV_BAR_BASE    0x1000
 
#define PCIE_PF_NUM        2
#define PCIE_VF_NUM        64
 
#define PCIE_BAR0_SIZE        (4 * 1024) /* 4K */
#define PCIE_BAR1_SIZE        (8 * 1024) /* 8K for MSIX */
#define PCIE_BAR2_SIZE        (4 * 1024) /* 4K */
#define PCIE_BAR4_SIZE        (1 * 1024 * 1024) /* 1M */
 
/* LUT registers */
#define PCIE_LUT_UDR(n)        (0x800 + (n) * 8)
#define PCIE_LUT_LDR(n)        (0x804 + (n) * 8)
#define PCIE_LUT_ENABLE        (1 << 31)
#define PCIE_LUT_ENTRY_COUNT    32
 
/* PF Controll registers */
#define PCIE_PF_CONFIG        0x14
#define PCIE_PF_VF_CTRL        0x7F8
#define PCIE_PF_DBG        0x7FC
#define PCIE_CONFIG_READY    (1 << 0)
 
#define PCIE_SRDS_PRTCL(idx)    (PCIE1 + (idx))
#define PCIE_SYS_BASE_ADDR    0x3400000
#define PCIE_CCSR_SIZE        0x0100000
 
/* CS2 */
#define PCIE_CS2_OFFSET        0x1000 /* For PCIe without SR-IOV */
 
#define SVR_LS102XA        0
#define SVR_VAR_PER_SHIFT    8
#define SVR_LS102XA_MASK    0x700
#define SVR_LS2088A        0x870900
#define SVR_LS2084A        0x870910
#define SVR_LS2048A        0x870920
#define SVR_LS2044A        0x870930
#define SVR_LS2081A        0x870918
#define SVR_LS2041A        0x870914
 
/* LS1021a PCIE space */
#define LS1021_PCIE_SPACE_OFFSET    0x4000000000ULL
#define LS1021_PCIE_SPACE_SIZE        0x0800000000ULL
 
/* LS1021a PEX1/2 Misc Ports Status Register */
#define LS1021_PEXMSCPORTSR(pex_idx)    (0x94 + (pex_idx) * 4)
#define LS1021_LTSSM_STATE_SHIFT    20
 
struct ls_pcie {
   int idx;
   struct list_head list;
   struct udevice *bus;
   struct fdt_resource dbi_res;
   struct fdt_resource lut_res;
   struct fdt_resource ctrl_res;
   struct fdt_resource cfg_res;
   void __iomem *dbi;
   void __iomem *lut;
   void __iomem *ctrl;
   void __iomem *cfg0;
   void __iomem *cfg1;
   bool big_endian;
   bool enabled;
   int next_lut_index;
   struct pci_controller hose;
};
 
extern struct list_head ls_pcie_list;
 
#endif /* _PCIE_LAYERSCAPE_H_ */