forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-09-20 cf4ce59b3b70238352c7f1729f0f7223214828ad
kernel/arch/x86/pci/sta2x11-fixup.c
....@@ -1,25 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
2
- * arch/x86/pci/sta2x11-fixup.c
3
- * glue code for lib/swiotlb.c and DMA translation between STA2x11
4
- * AMBA memory mapping and the X86 memory mapping
3
+ * DMA translation between STA2x11 AMBA memory mapping and the x86 memory mapping
54 *
65 * ST Microelectronics ConneXt (STA2X11/STA2X10)
76 *
87 * Copyright (c) 2010-2011 Wind River Systems, Inc.
9
- *
10
- * This program is free software; you can redistribute it and/or modify
11
- * it under the terms of the GNU General Public License version 2 as
12
- * published by the Free Software Foundation.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
- * See the GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program; if not, write to the Free Software
21
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
- *
238 */
249
2510 #include <linux/pci.h>
....@@ -30,7 +15,6 @@
3015 #include <asm/iommu.h>
3116
3217 #define STA2X11_SWIOTLB_SIZE (4*1024*1024)
33
-extern int swiotlb_late_init_with_default_size(size_t default_size);
3418
3519 /*
3620 * We build a list of bus numbers that are under the ConneXt. The
....@@ -45,7 +29,6 @@
4529 };
4630
4731 struct sta2x11_mapping {
48
- u32 amba_base;
4932 int is_suspended;
5033 struct sta2x11_ahb_regs regs[STA2X11_NR_FUNCS];
5134 };
....@@ -107,57 +90,12 @@
10790 return pdev->bus->number - instance->bus0;
10891 }
10992
110
-static struct sta2x11_mapping *sta2x11_pdev_to_mapping(struct pci_dev *pdev)
111
-{
112
- struct sta2x11_instance *instance;
113
- int ep;
114
-
115
- instance = sta2x11_pdev_to_instance(pdev);
116
- if (!instance)
117
- return NULL;
118
- ep = sta2x11_pdev_to_ep(pdev);
119
- return instance->map + ep;
120
-}
121
-
12293 /* This is exported, as some devices need to access the MFD registers */
12394 struct sta2x11_instance *sta2x11_get_instance(struct pci_dev *pdev)
12495 {
12596 return sta2x11_pdev_to_instance(pdev);
12697 }
12798 EXPORT_SYMBOL(sta2x11_get_instance);
128
-
129
-
130
-/**
131
- * p2a - Translate physical address to STA2x11 AMBA address,
132
- * used for DMA transfers to STA2x11
133
- * @p: Physical address
134
- * @pdev: PCI device (must be hosted within the connext)
135
- */
136
-static dma_addr_t p2a(dma_addr_t p, struct pci_dev *pdev)
137
-{
138
- struct sta2x11_mapping *map;
139
- dma_addr_t a;
140
-
141
- map = sta2x11_pdev_to_mapping(pdev);
142
- a = p + map->amba_base;
143
- return a;
144
-}
145
-
146
-/**
147
- * a2p - Translate STA2x11 AMBA address to physical address
148
- * used for DMA transfers from STA2x11
149
- * @a: STA2x11 AMBA address
150
- * @pdev: PCI device (must be hosted within the connext)
151
- */
152
-static dma_addr_t a2p(dma_addr_t a, struct pci_dev *pdev)
153
-{
154
- struct sta2x11_mapping *map;
155
- dma_addr_t p;
156
-
157
- map = sta2x11_pdev_to_mapping(pdev);
158
- p = a - map->amba_base;
159
- return p;
160
-}
16199
162100 /* At setup time, we use our own ops if the device is a ConneXt one */
163101 static void sta2x11_setup_pdev(struct pci_dev *pdev)
....@@ -166,70 +104,11 @@
166104
167105 if (!instance) /* either a sta2x11 bridge or another ST device */
168106 return;
169
- pci_set_consistent_dma_mask(pdev, STA2X11_AMBA_SIZE - 1);
170
- pci_set_dma_mask(pdev, STA2X11_AMBA_SIZE - 1);
171
- pdev->dev.dma_ops = &swiotlb_dma_ops;
172
- pdev->dev.archdata.is_sta2x11 = true;
173107
174108 /* We must enable all devices as master, for audio DMA to work */
175109 pci_set_master(pdev);
176110 }
177111 DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_STMICRO, PCI_ANY_ID, sta2x11_setup_pdev);
178
-
179
-/*
180
- * The following three functions are exported (used in swiotlb: FIXME)
181
- */
182
-/**
183
- * dma_capable - Check if device can manage DMA transfers (FIXME: kill it)
184
- * @dev: device for a PCI device
185
- * @addr: DMA address
186
- * @size: DMA size
187
- */
188
-bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
189
-{
190
- struct sta2x11_mapping *map;
191
-
192
- if (!dev->archdata.is_sta2x11) {
193
- if (!dev->dma_mask)
194
- return false;
195
- return addr + size - 1 <= *dev->dma_mask;
196
- }
197
-
198
- map = sta2x11_pdev_to_mapping(to_pci_dev(dev));
199
-
200
- if (!map || (addr < map->amba_base))
201
- return false;
202
- if (addr + size >= map->amba_base + STA2X11_AMBA_SIZE) {
203
- return false;
204
- }
205
-
206
- return true;
207
-}
208
-
209
-/**
210
- * __phys_to_dma - Return the DMA AMBA address used for this STA2x11 device
211
- * @dev: device for a PCI device
212
- * @paddr: Physical address
213
- */
214
-dma_addr_t __phys_to_dma(struct device *dev, phys_addr_t paddr)
215
-{
216
- if (!dev->archdata.is_sta2x11)
217
- return paddr;
218
- return p2a(paddr, to_pci_dev(dev));
219
-}
220
-
221
-/**
222
- * dma_to_phys - Return the physical address used for this STA2x11 DMA address
223
- * @dev: device for a PCI device
224
- * @daddr: STA2x11 AMBA DMA address
225
- */
226
-phys_addr_t __dma_to_phys(struct device *dev, dma_addr_t daddr)
227
-{
228
- if (!dev->archdata.is_sta2x11)
229
- return daddr;
230
- return a2p(daddr, to_pci_dev(dev));
231
-}
232
-
233112
234113 /*
235114 * At boot we must set up the mappings for the pcie-to-amba bridge.
....@@ -250,12 +129,24 @@
250129 /* At probe time, enable mapping for each endpoint, using the pdev */
251130 static void sta2x11_map_ep(struct pci_dev *pdev)
252131 {
253
- struct sta2x11_mapping *map = sta2x11_pdev_to_mapping(pdev);
254
- int i;
132
+ struct sta2x11_instance *instance = sta2x11_pdev_to_instance(pdev);
133
+ struct device *dev = &pdev->dev;
134
+ u32 amba_base, max_amba_addr;
135
+ int i, ret;
255136
256
- if (!map)
137
+ if (!instance)
257138 return;
258
- pci_read_config_dword(pdev, AHB_BASE(0), &map->amba_base);
139
+
140
+ pci_read_config_dword(pdev, AHB_BASE(0), &amba_base);
141
+ max_amba_addr = amba_base + STA2X11_AMBA_SIZE - 1;
142
+
143
+ ret = dma_direct_set_offset(dev, 0, amba_base, STA2X11_AMBA_SIZE);
144
+ if (ret)
145
+ dev_err(dev, "sta2x11: could not set DMA offset\n");
146
+
147
+ dev->bus_dma_limit = max_amba_addr;
148
+ pci_set_consistent_dma_mask(pdev, max_amba_addr);
149
+ pci_set_dma_mask(pdev, max_amba_addr);
259150
260151 /* Configure AHB mapping */
261152 pci_write_config_dword(pdev, AHB_PEXLBASE(0), 0);
....@@ -269,13 +160,24 @@
269160
270161 dev_info(&pdev->dev,
271162 "sta2x11: Map EP %i: AMBA address %#8x-%#8x\n",
272
- sta2x11_pdev_to_ep(pdev), map->amba_base,
273
- map->amba_base + STA2X11_AMBA_SIZE - 1);
163
+ sta2x11_pdev_to_ep(pdev), amba_base, max_amba_addr);
274164 }
275165 DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_STMICRO, PCI_ANY_ID, sta2x11_map_ep);
276166
277167 #ifdef CONFIG_PM /* Some register values must be saved and restored */
278168
169
+static struct sta2x11_mapping *sta2x11_pdev_to_mapping(struct pci_dev *pdev)
170
+{
171
+ struct sta2x11_instance *instance;
172
+ int ep;
173
+
174
+ instance = sta2x11_pdev_to_instance(pdev);
175
+ if (!instance)
176
+ return NULL;
177
+ ep = sta2x11_pdev_to_ep(pdev);
178
+ return instance->map + ep;
179
+}
180
+
279181 static void suspend_mapping(struct pci_dev *pdev)
280182 {
281183 struct sta2x11_mapping *map = sta2x11_pdev_to_mapping(pdev);