diff options
-rw-r--r-- | sys/arch/sparc64/conf/files.sparc64 | 8 | ||||
-rw-r--r-- | sys/arch/sparc64/include/rbus_machdep.h | 35 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/rbus_machdep.c | 91 |
3 files changed, 133 insertions, 1 deletions
diff --git a/sys/arch/sparc64/conf/files.sparc64 b/sys/arch/sparc64/conf/files.sparc64 index 84bb3d96537..3c05d99a572 100644 --- a/sys/arch/sparc64/conf/files.sparc64 +++ b/sys/arch/sparc64/conf/files.sparc64 @@ -1,4 +1,4 @@ -# $OpenBSD: files.sparc64,v 1.85 2007/06/08 22:57:43 jasper Exp $ +# $OpenBSD: files.sparc64,v 1.86 2007/08/04 16:46:03 kettenis Exp $ # $NetBSD: files.sparc64,v 1.50 2001/08/10 20:53:50 eeh Exp $ # maxpartitions must be first item in files.${ARCH} @@ -292,6 +292,12 @@ include "dev/usb/files.usb" include "dev/bluetooth/files.bluetooth" # +# Cardbus +# +include "dev/cardbus/files.cardbus" +file arch/sparc64/sparc64/rbus_machdep.c cardbus + +# # Machine-dependent I2C drivers # diff --git a/sys/arch/sparc64/include/rbus_machdep.h b/sys/arch/sparc64/include/rbus_machdep.h new file mode 100644 index 00000000000..5fd4308124e --- /dev/null +++ b/sys/arch/sparc64/include/rbus_machdep.h @@ -0,0 +1,35 @@ +/* $OpenBSD: rbus_machdep.h,v 1.1 2007/08/04 16:46:03 kettenis Exp $ */ + +/* + * Copyright (c) 2007 Mark Kettenis + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _SPARC64_RBUS_MACHDEP_H_ +#define _SPARC64_RBUS_MACHDEP_H_ + +struct pci_attach_args; + +rbus_tag_t rbus_pccbb_parent_io(struct device *, struct pci_attach_args *); +rbus_tag_t rbus_pccbb_parent_mem(struct device *, struct pci_attach_args *); + +#define md_space_map(t, addr, size, flags, hp) \ + bus_space_map((t), (addr), (size), (flags), (hp)) +#define md_space_unmap(t, h, size, addrp) \ + do { \ + *addrp = (t)->sparc_bus_addr((t), (t), (h)); \ + bus_space_unmap((t), (h), (size)); \ + } while (0) + +#endif /* _SPARC64_RBUS_MACHDEP_H_ */ diff --git a/sys/arch/sparc64/sparc64/rbus_machdep.c b/sys/arch/sparc64/sparc64/rbus_machdep.c new file mode 100644 index 00000000000..b76631ad06d --- /dev/null +++ b/sys/arch/sparc64/sparc64/rbus_machdep.c @@ -0,0 +1,91 @@ +/* $OpenBSD: rbus_machdep.c,v 1.1 2007/08/04 16:46:03 kettenis Exp $ */ + +/* + * Copyright (c) 2007 Mark Kettenis + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/device.h> +#include <sys/systm.h> + +#include <machine/bus.h> + +#include <dev/cardbus/rbus.h> +#include <dev/ofw/openfirm.h> +#include <dev/ofw/ofw_pci.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/pccbbreg.h> + +struct rbustag rbus_null; + +/* + * The PROM doesn't really understand CardBus bridges. So it treats + * the memory and IO window register as ordinary BARs and assigns + * address space to them. We re-use that address space for rbus. + * This is a bit of a hack, but it seems to work and saves us from + * tracking down available address space globally. + */ + +rbus_tag_t +rbus_pccbb_parent_mem(struct device *self, struct pci_attach_args *pa) +{ + struct ofw_pci_register addr[5]; + int naddr, len, i; + int space, reg; + + len = OF_getprop(PCITAG_NODE(pa->pa_tag), "assigned-addresses", + &addr, sizeof(addr)); + naddr = len / sizeof(struct ofw_pci_register); + + for (i = 0; i < naddr; i++) { + space = addr[i].phys_hi & OFW_PCI_PHYS_HI_SPACEMASK; + if (space != OFW_PCI_PHYS_HI_SPACE_MEM32) + continue; + reg = addr[i].phys_hi & OFW_PCI_PHYS_HI_REGISTERMASK; + if (reg < PCI_CB_MEMBASE0 || reg > PCI_CB_IOLIMIT1) + continue; + + return (rbus_new_root_delegate(pa->pa_memt, + addr[i].phys_lo, addr[i].size_lo, 0)); + } + + return &rbus_null; +} + +rbus_tag_t +rbus_pccbb_parent_io(struct device *self, struct pci_attach_args *pa) +{ + struct ofw_pci_register addr[5]; + int naddr, len, i; + int space, reg; + + len = OF_getprop(PCITAG_NODE(pa->pa_tag), "assigned-addresses", + &addr, sizeof(addr)); + naddr = len / sizeof(struct ofw_pci_register); + + for (i = 0; i < naddr; i++) { + space = addr[i].phys_hi & OFW_PCI_PHYS_HI_SPACEMASK; + if (space != OFW_PCI_PHYS_HI_SPACE_IO) + continue; + reg = addr[i].phys_hi & OFW_PCI_PHYS_HI_REGISTERMASK; + if (reg < PCI_CB_MEMBASE0 || reg > PCI_CB_IOLIMIT1) + continue; + + return (rbus_new_root_delegate(pa->pa_iot, + addr[i].phys_lo, addr[i].size_lo, 0)); + } + + return &rbus_null; +} |