diff options
author | Paul Mackerras <paulus@samba.org> | 2005-09-09 09:02:36 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-09-09 09:02:36 -0400 |
commit | b2ad7b5e8115582cdf5bbda065aa516c24d62c21 (patch) | |
tree | e488a3600f1081ef87bcca67103ea4f45708017c /arch/ppc64/kernel/sys_ppc32.c | |
parent | 766375362a1dcac63dc0c0fb61ce4143c8de63d9 (diff) |
Allow PCI config space syscalls to be used by 64-bit processes.
The pciconfig_iobase, pciconfig_read and pciconfig_write system calls
were only implemented for 32-bit processes; for 64-bit processes they
returned an ENOSYS error. This allows them to be used by 64-bit
processes as well. The X server uses pciconfig_iobase at least, and
this change is necessary to allow a 64-bit X server to work on my G5.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/ppc64/kernel/sys_ppc32.c')
-rw-r--r-- | arch/ppc64/kernel/sys_ppc32.c | 55 |
1 files changed, 1 insertions, 54 deletions
diff --git a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c index 57a6db7d7c9c..e93c13458910 100644 --- a/arch/ppc64/kernel/sys_ppc32.c +++ b/arch/ppc64/kernel/sys_ppc32.c | |||
@@ -708,62 +708,9 @@ asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubu | |||
708 | compat_ptr(ubuf)); | 708 | compat_ptr(ubuf)); |
709 | } | 709 | } |
710 | 710 | ||
711 | #define IOBASE_BRIDGE_NUMBER 0 | ||
712 | #define IOBASE_MEMORY 1 | ||
713 | #define IOBASE_IO 2 | ||
714 | #define IOBASE_ISA_IO 3 | ||
715 | #define IOBASE_ISA_MEM 4 | ||
716 | |||
717 | asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn) | 711 | asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn) |
718 | { | 712 | { |
719 | #ifdef CONFIG_PCI | 713 | return sys_pciconfig_iobase(which, in_bus, in_devfn); |
720 | struct pci_controller* hose; | ||
721 | struct list_head *ln; | ||
722 | struct pci_bus *bus = NULL; | ||
723 | struct device_node *hose_node; | ||
724 | |||
725 | /* Argh ! Please forgive me for that hack, but that's the | ||
726 | * simplest way to get existing XFree to not lockup on some | ||
727 | * G5 machines... So when something asks for bus 0 io base | ||
728 | * (bus 0 is HT root), we return the AGP one instead. | ||
729 | */ | ||
730 | #ifdef CONFIG_PPC_PMAC | ||
731 | if (systemcfg->platform == PLATFORM_POWERMAC && | ||
732 | machine_is_compatible("MacRISC4")) | ||
733 | if (in_bus == 0) | ||
734 | in_bus = 0xf0; | ||
735 | #endif /* CONFIG_PPC_PMAC */ | ||
736 | |||
737 | /* That syscall isn't quite compatible with PCI domains, but it's | ||
738 | * used on pre-domains setup. We return the first match | ||
739 | */ | ||
740 | |||
741 | for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) { | ||
742 | bus = pci_bus_b(ln); | ||
743 | if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate)) | ||
744 | break; | ||
745 | bus = NULL; | ||
746 | } | ||
747 | if (bus == NULL || bus->sysdata == NULL) | ||
748 | return -ENODEV; | ||
749 | |||
750 | hose_node = bus->sysdata; | ||
751 | hose = PCI_DN(hose_node)->phb; | ||
752 | |||
753 | switch (which) { | ||
754 | case IOBASE_BRIDGE_NUMBER: | ||
755 | return (long)hose->first_busno; | ||
756 | case IOBASE_MEMORY: | ||
757 | return (long)hose->pci_mem_offset; | ||
758 | case IOBASE_IO: | ||
759 | return (long)hose->io_base_phys; | ||
760 | case IOBASE_ISA_IO: | ||
761 | return (long)isa_io_base; | ||
762 | case IOBASE_ISA_MEM: | ||
763 | return -EINVAL; | ||
764 | } | ||
765 | #endif /* CONFIG_PCI */ | ||
766 | return -EOPNOTSUPP; | ||
767 | } | 714 | } |
768 | 715 | ||
769 | 716 | ||