diff options
author | 2025-03-08 22:04:20 +0800 | |
---|---|---|
committer | 2025-03-08 22:04:20 +0800 | |
commit | a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a (patch) | |
tree | 84f21bd0bf7071bc5fc7dd989e77d7ceb5476682 /arch/mips/pci/pci-generic.c | |
download | ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.tar.gz ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.zip |
Initial commit: OpenHarmony-v4.0-ReleaseOpenHarmony-v4.0-Release
Diffstat (limited to 'arch/mips/pci/pci-generic.c')
-rw-r--r-- | arch/mips/pci/pci-generic.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/arch/mips/pci/pci-generic.c b/arch/mips/pci/pci-generic.c new file mode 100644 index 000000000..95b000178 --- /dev/null +++ b/arch/mips/pci/pci-generic.c | |||
@@ -0,0 +1,48 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
2 | /* | ||
3 | * Copyright (C) 2016 Imagination Technologies | ||
4 | * Author: Paul Burton <paul.burton@mips.com> | ||
5 | * | ||
6 | * pcibios_align_resource taken from arch/arm/kernel/bios32.c. | ||
7 | */ | ||
8 | |||
9 | #include <linux/pci.h> | ||
10 | |||
11 | /* | ||
12 | * We need to avoid collisions with `mirrored' VGA ports | ||
13 | * and other strange ISA hardware, so we always want the | ||
14 | * addresses to be allocated in the 0x000-0x0ff region | ||
15 | * modulo 0x400. | ||
16 | * | ||
17 | * Why? Because some silly external IO cards only decode | ||
18 | * the low 10 bits of the IO address. The 0x00-0xff region | ||
19 | * is reserved for motherboard devices that decode all 16 | ||
20 | * bits, so it's ok to allocate at, say, 0x2800-0x28ff, | ||
21 | * but we want to try to avoid allocating at 0x2900-0x2bff | ||
22 | * which might have be mirrored at 0x0100-0x03ff.. | ||
23 | */ | ||
24 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | ||
25 | resource_size_t size, resource_size_t align) | ||
26 | { | ||
27 | struct pci_dev *dev = data; | ||
28 | resource_size_t start = res->start; | ||
29 | struct pci_host_bridge *host_bridge; | ||
30 | |||
31 | if (res->flags & IORESOURCE_IO && start & 0x300) | ||
32 | start = (start + 0x3ff) & ~0x3ff; | ||
33 | |||
34 | start = (start + align - 1) & ~(align - 1); | ||
35 | |||
36 | host_bridge = pci_find_host_bridge(dev->bus); | ||
37 | |||
38 | if (host_bridge->align_resource) | ||
39 | return host_bridge->align_resource(dev, res, | ||
40 | start, size, align); | ||
41 | |||
42 | return start; | ||
43 | } | ||
44 | |||
45 | void pcibios_fixup_bus(struct pci_bus *bus) | ||
46 | { | ||
47 | pci_read_bridge_bases(bus); | ||
48 | } | ||