xref: /openbmc/linux/arch/alpha/kernel/pci-noop.c (revision 8a7f97b9)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *	linux/arch/alpha/kernel/pci-noop.c
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Stub PCI interfaces for Jensen-specific kernels.
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #include <linux/pci.h>
91da177e4SLinus Torvalds #include <linux/init.h>
1057c8a661SMike Rapoport #include <linux/memblock.h>
115a0e3ad6STejun Heo #include <linux/gfp.h>
12a9415644SRandy Dunlap #include <linux/capability.h>
131da177e4SLinus Torvalds #include <linux/mm.h>
141da177e4SLinus Torvalds #include <linux/errno.h>
151da177e4SLinus Torvalds #include <linux/sched.h>
161da177e4SLinus Torvalds #include <linux/dma-mapping.h>
178c8d7214SFUJITA Tomonori #include <linux/scatterlist.h>
18e4eacd6bSAl Viro #include <linux/syscalls.h>
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds #include "proto.h"
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds /*
241da177e4SLinus Torvalds  * The PCI controller list.
251da177e4SLinus Torvalds  */
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds struct pci_controller *hose_head, **hose_tail = &hose_head;
281da177e4SLinus Torvalds struct pci_controller *pci_isa_hose;
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds struct pci_controller * __init
alloc_pci_controller(void)321da177e4SLinus Torvalds alloc_pci_controller(void)
331da177e4SLinus Torvalds {
341da177e4SLinus Torvalds 	struct pci_controller *hose;
351da177e4SLinus Torvalds 
367e1c4e27SMike Rapoport 	hose = memblock_alloc(sizeof(*hose), SMP_CACHE_BYTES);
378a7f97b9SMike Rapoport 	if (!hose)
388a7f97b9SMike Rapoport 		panic("%s: Failed to allocate %zu bytes\n", __func__,
398a7f97b9SMike Rapoport 		      sizeof(*hose));
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds 	*hose_tail = hose;
421da177e4SLinus Torvalds 	hose_tail = &hose->next;
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds 	return hose;
451da177e4SLinus Torvalds }
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds struct resource * __init
alloc_resource(void)481da177e4SLinus Torvalds alloc_resource(void)
491da177e4SLinus Torvalds {
508a7f97b9SMike Rapoport 	void *ptr = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES);
518a7f97b9SMike Rapoport 
528a7f97b9SMike Rapoport 	if (!ptr)
538a7f97b9SMike Rapoport 		panic("%s: Failed to allocate %zu bytes\n", __func__,
548a7f97b9SMike Rapoport 		      sizeof(struct resource));
558a7f97b9SMike Rapoport 
568a7f97b9SMike Rapoport 	return ptr;
571da177e4SLinus Torvalds }
581da177e4SLinus Torvalds 
SYSCALL_DEFINE3(pciconfig_iobase,long,which,unsigned long,bus,unsigned long,dfn)59e4eacd6bSAl Viro SYSCALL_DEFINE3(pciconfig_iobase, long, which, unsigned long, bus,
60e4eacd6bSAl Viro 		unsigned long, dfn)
611da177e4SLinus Torvalds {
621da177e4SLinus Torvalds 	struct pci_controller *hose;
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds 	/* from hose or from bus.devfn */
651da177e4SLinus Torvalds 	if (which & IOBASE_FROM_HOSE) {
661da177e4SLinus Torvalds 		for (hose = hose_head; hose; hose = hose->next)
671da177e4SLinus Torvalds 			if (hose->index == bus)
681da177e4SLinus Torvalds 				break;
691da177e4SLinus Torvalds 		if (!hose)
701da177e4SLinus Torvalds 			return -ENODEV;
711da177e4SLinus Torvalds 	} else {
721da177e4SLinus Torvalds 		/* Special hook for ISA access.  */
731da177e4SLinus Torvalds 		if (bus == 0 && dfn == 0)
741da177e4SLinus Torvalds 			hose = pci_isa_hose;
751da177e4SLinus Torvalds 		else
761da177e4SLinus Torvalds 			return -ENODEV;
771da177e4SLinus Torvalds 	}
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds 	switch (which & ~IOBASE_FROM_HOSE) {
801da177e4SLinus Torvalds 	case IOBASE_HOSE:
811da177e4SLinus Torvalds 		return hose->index;
821da177e4SLinus Torvalds 	case IOBASE_SPARSE_MEM:
831da177e4SLinus Torvalds 		return hose->sparse_mem_base;
841da177e4SLinus Torvalds 	case IOBASE_DENSE_MEM:
851da177e4SLinus Torvalds 		return hose->dense_mem_base;
861da177e4SLinus Torvalds 	case IOBASE_SPARSE_IO:
871da177e4SLinus Torvalds 		return hose->sparse_io_base;
881da177e4SLinus Torvalds 	case IOBASE_DENSE_IO:
891da177e4SLinus Torvalds 		return hose->dense_io_base;
901da177e4SLinus Torvalds 	case IOBASE_ROOT_BUS:
911da177e4SLinus Torvalds 		return hose->bus->number;
921da177e4SLinus Torvalds 	}
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds 	return -EOPNOTSUPP;
951da177e4SLinus Torvalds }
961da177e4SLinus Torvalds 
SYSCALL_DEFINE5(pciconfig_read,unsigned long,bus,unsigned long,dfn,unsigned long,off,unsigned long,len,void __user *,buf)97e4eacd6bSAl Viro SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,
98e4eacd6bSAl Viro 		unsigned long, off, unsigned long, len, void __user *, buf)
991da177e4SLinus Torvalds {
1001da177e4SLinus Torvalds 	if (!capable(CAP_SYS_ADMIN))
1011da177e4SLinus Torvalds 		return -EPERM;
1021da177e4SLinus Torvalds 	else
1031da177e4SLinus Torvalds 		return -ENODEV;
1041da177e4SLinus Torvalds }
1051da177e4SLinus Torvalds 
SYSCALL_DEFINE5(pciconfig_write,unsigned long,bus,unsigned long,dfn,unsigned long,off,unsigned long,len,void __user *,buf)106e4eacd6bSAl Viro SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn,
107e4eacd6bSAl Viro 		unsigned long, off, unsigned long, len, void __user *, buf)
1081da177e4SLinus Torvalds {
1091da177e4SLinus Torvalds 	if (!capable(CAP_SYS_ADMIN))
1101da177e4SLinus Torvalds 		return -EPERM;
1111da177e4SLinus Torvalds 	else
1121da177e4SLinus Torvalds 		return -ENODEV;
1131da177e4SLinus Torvalds }
114