/* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * SNI specific PCI support for RM200/RM300. * * Copyright (C) 1997 - 2000, 2003 Ralf Baechle <ralf@linux-mips.org>
*/ #include <linux/kernel.h> #include <linux/pci.h> #include <linux/types.h> #include <asm/sni.h>
/* * It seems that on the RM200 only lower 3 bits of the 5 bit PCI device * address are decoded. We therefore manually have to reject attempts at * reading outside this range. Being on the paranoid side we only do this * test for bus 0 and hope forwarding and decoding work properly for any * subordinated busses. * * ASIC PCI only supports type 1 config cycles.
*/ staticint set_config_address(unsignedint busno, unsignedint devfn, int reg)
{ if ((devfn > 255) || (reg > 255)) return PCIBIOS_BAD_REGISTER_NUMBER;
staticint pcit_read(struct pci_bus *bus, unsignedint devfn, int reg, int size, u32 * val)
{ int res;
/* * on bus 0 we need to check, whether there is a device answering * for the devfn by doing a config write and checking the result. If * we don't do it, we will get a data bus error
*/ if (bus->number == 0) {
pcit_set_config_address(0, 0, 0x68);
outl(inl(0xcfc) | 0xc0000000, 0xcfc); if ((res = pcit_set_config_address(0, devfn, 0))) return res;
outl(0xffffffff, 0xcfc);
pcit_set_config_address(0, 0, 0x68); if (inl(0xcfc) & 0x100000) return PCIBIOS_DEVICE_NOT_FOUND;
} if ((res = pcit_set_config_address(bus->number, devfn, reg))) return res;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.