]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
1da177e4 LT |
2 | /* |
3 | * linux/arch/alpha/kernel/pci-noop.c | |
4 | * | |
5 | * Stub PCI interfaces for Jensen-specific kernels. | |
6 | */ | |
7 | ||
8 | #include <linux/pci.h> | |
9 | #include <linux/init.h> | |
57c8a661 | 10 | #include <linux/memblock.h> |
5a0e3ad6 | 11 | #include <linux/gfp.h> |
a9415644 | 12 | #include <linux/capability.h> |
1da177e4 LT |
13 | #include <linux/mm.h> |
14 | #include <linux/errno.h> | |
15 | #include <linux/sched.h> | |
16 | #include <linux/dma-mapping.h> | |
8c8d7214 | 17 | #include <linux/scatterlist.h> |
e4eacd6b | 18 | #include <linux/syscalls.h> |
1da177e4 LT |
19 | |
20 | #include "proto.h" | |
21 | ||
22 | ||
23 | /* | |
24 | * The PCI controller list. | |
25 | */ | |
26 | ||
27 | struct pci_controller *hose_head, **hose_tail = &hose_head; | |
28 | struct pci_controller *pci_isa_hose; | |
29 | ||
30 | ||
31 | struct pci_controller * __init | |
32 | alloc_pci_controller(void) | |
33 | { | |
34 | struct pci_controller *hose; | |
35 | ||
7e1c4e27 | 36 | hose = memblock_alloc(sizeof(*hose), SMP_CACHE_BYTES); |
8a7f97b9 MR |
37 | if (!hose) |
38 | panic("%s: Failed to allocate %zu bytes\n", __func__, | |
39 | sizeof(*hose)); | |
1da177e4 LT |
40 | |
41 | *hose_tail = hose; | |
42 | hose_tail = &hose->next; | |
43 | ||
44 | return hose; | |
45 | } | |
46 | ||
47 | struct resource * __init | |
48 | alloc_resource(void) | |
49 | { | |
8a7f97b9 MR |
50 | void *ptr = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES); |
51 | ||
52 | if (!ptr) | |
53 | panic("%s: Failed to allocate %zu bytes\n", __func__, | |
54 | sizeof(struct resource)); | |
55 | ||
56 | return ptr; | |
1da177e4 LT |
57 | } |
58 | ||
e4eacd6b AV |
59 | SYSCALL_DEFINE3(pciconfig_iobase, long, which, unsigned long, bus, |
60 | unsigned long, dfn) | |
1da177e4 LT |
61 | { |
62 | struct pci_controller *hose; | |
63 | ||
64 | /* from hose or from bus.devfn */ | |
65 | if (which & IOBASE_FROM_HOSE) { | |
8a7f97b9 | 66 | for (hose = hose_head; hose; hose = hose->next) |
1da177e4 LT |
67 | if (hose->index == bus) |
68 | break; | |
69 | if (!hose) | |
70 | return -ENODEV; | |
71 | } else { | |
72 | /* Special hook for ISA access. */ | |
73 | if (bus == 0 && dfn == 0) | |
74 | hose = pci_isa_hose; | |
75 | else | |
76 | return -ENODEV; | |
77 | } | |
78 | ||
79 | switch (which & ~IOBASE_FROM_HOSE) { | |
80 | case IOBASE_HOSE: | |
81 | return hose->index; | |
82 | case IOBASE_SPARSE_MEM: | |
83 | return hose->sparse_mem_base; | |
84 | case IOBASE_DENSE_MEM: | |
85 | return hose->dense_mem_base; | |
86 | case IOBASE_SPARSE_IO: | |
87 | return hose->sparse_io_base; | |
88 | case IOBASE_DENSE_IO: | |
89 | return hose->dense_io_base; | |
90 | case IOBASE_ROOT_BUS: | |
91 | return hose->bus->number; | |
92 | } | |
93 | ||
94 | return -EOPNOTSUPP; | |
95 | } | |
96 | ||
e4eacd6b AV |
97 | SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn, |
98 | unsigned long, off, unsigned long, len, void __user *, buf) | |
1da177e4 LT |
99 | { |
100 | if (!capable(CAP_SYS_ADMIN)) | |
101 | return -EPERM; | |
102 | else | |
103 | return -ENODEV; | |
104 | } | |
105 | ||
e4eacd6b AV |
106 | SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn, |
107 | unsigned long, off, unsigned long, len, void __user *, buf) | |
1da177e4 LT |
108 | { |
109 | if (!capable(CAP_SYS_ADMIN)) | |
110 | return -EPERM; | |
111 | else | |
112 | return -ENODEV; | |
113 | } |