Module Name: src
Committed By: matt
Date: Fri Dec 30 06:42:29 UTC 2011
Modified Files:
src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixlp_pcie.c
Log Message:
Cleanup USB byte swap support.
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.3 -r1.1.2.4 src/sys/arch/mips/rmi/rmixlp_pcie.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/rmi/rmixlp_pcie.c
diff -u src/sys/arch/mips/rmi/rmixlp_pcie.c:1.1.2.3 src/sys/arch/mips/rmi/rmixlp_pcie.c:1.1.2.4
--- src/sys/arch/mips/rmi/rmixlp_pcie.c:1.1.2.3 Wed Dec 28 05:35:06 2011
+++ src/sys/arch/mips/rmi/rmixlp_pcie.c Fri Dec 30 06:42:29 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixlp_pcie.c,v 1.1.2.3 2011/12/28 05:35:06 matt Exp $ */
+/* $NetBSD: rmixlp_pcie.c,v 1.1.2.4 2011/12/30 06:42:29 matt Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixlp_pcie.c,v 1.1.2.3 2011/12/28 05:35:06 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixlp_pcie.c,v 1.1.2.4 2011/12/30 06:42:29 matt Exp $");
#include "opt_pci.h"
#include "pci.h"
@@ -108,6 +108,7 @@ static struct rmixlp_pcie_softc {
bus_dma_tag_t sc_dmat64;
rmixlp_pcie_lnkcfg_t sc_lnkcfg;
uint8_t sc_lnkmode;
+ bool sc_usb_bswapped;
kmutex_t sc_mutex;
} rmixlp_pcie_softc = {
.sc_pc = &rmixl_configuration.rc_pci_chipset,
@@ -296,6 +297,15 @@ rmixlp_pcie_attach(device_t parent, devi
/*
* Make sure the USB devices aren't still in reset.
*/
+ /*
+ * Disable byte swapping.
+ */
+#ifdef BYTESWAP_USB
+ pci_conf_write(sc->sc_pc, RMIXLP_EHCI0_PCITAG,
+ RMIXLP_USB_BYTE_SWAP_DIS, 1);
+#endif
+ sc->sc_usb_bswapped = (pci_conf_read(sc->sc_pc, RMIXLP_EHCI0_PCITAG,
+ RMIXLP_USB_BYTE_SWAP_DIS) != 0);
rmixlp_pcie_usb_init_hook(sc->sc_pc, RMIXLP_EHCI0_PCITAG);
rmixlp_pcie_usb_init_hook(sc->sc_pc, RMIXLP_OHCI0_PCITAG);
rmixlp_pcie_usb_init_hook(sc->sc_pc, RMIXLP_OHCI1_PCITAG);
@@ -513,6 +523,38 @@ rmixlp_pcie_link_bar_update(struct rmixl
}
}
+static void
+rmixlp_pcie_print_bus0_bar0(struct rmixlp_pcie_softc *sc, pcitag_t tag)
+{
+ const size_t bar = PCI_BAR0;
+ pcireg_t ml = rmixlp_pcie_conf_read(sc, tag, PCI_BAR0);
+
+ switch (PCI_MAPREG_TYPE(ml)|PCI_MAPREG_MEM_TYPE(ml)) {
+ case PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_32BIT: {
+ bus_addr_t addr = PCI_MAPREG_MEM_ADDR(ml);
+ if (addr) {
+ aprint_normal_dev(sc->sc_dev,
+ "tag %#lx bar[0]: mem32=%#"PRIxBUSADDR"\n",
+ tag, addr);
+ }
+ break;
+ }
+ case PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_64BIT: {
+ pcireg_t mu = rmixlp_pcie_conf_read(sc, tag, bar + 4);
+ bus_addr_t addr =
+ PCI_MAPREG_MEM64_ADDR(ml|((uint64_t)mu << 32));
+ if (addr) {
+ aprint_normal_dev(sc->sc_dev,
+ "tag %#lx bar[0]: mem64=%#"PRIxBUSADDR"\n",
+ tag, addr);
+ }
+ break;
+ }
+ default:
+ return;
+ }
+}
+
static bus_addr_t
rmixlp_pcie_set_bus0_bar0(struct rmixlp_pcie_softc *sc, pcitag_t tag,
bus_addr_t pbase)
@@ -531,8 +573,10 @@ rmixlp_pcie_set_bus0_bar0(struct rmixlp_
pbase = (pbase + bar_size - 1) & -bar_size;
KASSERT((uint32_t)pbase == pbase);
rmixlp_pcie_conf_write(sc, tag, bar, pbase);
- printf("%s: tag %#lx bar[0]: mem32=%#"PRIxBUSADDR" size=%#"PRIxBUSSIZE"\n",
- __func__, tag, pbase, bar_size);
+ aprint_normal_dev(sc->sc_dev,
+ "tag %#lx bar[0]: mem32=%#"PRIxBUSADDR
+ " size=%#"PRIxBUSSIZE"\n",
+ tag, pbase, bar_size);
pbase += bar_size;
break;
}
@@ -550,8 +594,10 @@ rmixlp_pcie_set_bus0_bar0(struct rmixlp_
(pbase >> 0) & 0xffffffff);
rmixlp_pcie_conf_write(sc, tag, bar + 4,
(pbase >> 32) & 0xffffffff);
- printf("%s: tag %#lx bar[0]: mem64=%#"PRIxBUSADDR" size=%#"PRIxBUSSIZE"\n",
- __func__, tag, pbase, bar_size);
+ aprint_normal_dev(sc->sc_dev,
+ "tag %#lx bar[0]: mem64=%#"PRIxBUSADDR
+ " size=%#"PRIxBUSSIZE"\n",
+ tag, pbase, bar_size);
pbase += bar_size;
break;
@@ -600,16 +646,26 @@ rmixlp_pcie_configure_bus(struct rmixlp_
#endif
if (0) {
- bus_addr_t pbase = rcp->rc_pci_mem.r_pbase;
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_EHCI0_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI0_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI1_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_EHCI1_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI2_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI3_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_NAE_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_POE_PCITAG, pbase);
- pbase = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_FMN_PCITAG, pbase);
+ bus_addr_t mem = rcp->rc_pci_mem.r_pbase;
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_EHCI0_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI0_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI1_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_EHCI1_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI2_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_OHCI3_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_NAE_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_POE_PCITAG, mem);
+ mem = rmixlp_pcie_set_bus0_bar0(sc, RMIXLP_FMN_PCITAG, mem);
+ } else {
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_EHCI0_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_OHCI0_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_OHCI1_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_EHCI1_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_OHCI2_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_OHCI3_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_NAE_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_POE_PCITAG);
+ rmixlp_pcie_print_bus0_bar0(sc, RMIXLP_FMN_PCITAG);
}
for (size_t i = 0; i < 4; i++) {
@@ -735,14 +791,6 @@ rmixlp_pcie_usb_init_hook(pci_chipset_ta
if (id != PCI_ID_CODE(PCI_VENDOR_NETLOGIC, PCI_PRODUCT_NETLOGIC_XLP_EHCIUSB)
&& id != PCI_ID_CODE(PCI_VENDOR_NETLOGIC, PCI_PRODUCT_NETLOGIC_XLP_OHCIUSB))
return;
-#if 0
- /*
- * Disable byte swapping.
- */
- if (func == 0) {
- pci_conf_read(pc, tag, RMIXLP_USB_BYTE_SWAP_DIS, 1);
- }
-#endif
if (func == 0 || func == 3) {
/*
@@ -873,6 +921,12 @@ rmixlp_pcie_conf_read(void *v, pcitag_t
if (__predict_true(!cold))
mutex_exit(&sc->sc_mutex);
+ if (_RMIXL_PCITAG_BUS(tag) == _RMIXL_PCITAG_BUS(RMIXLP_EHCI0_PCITAG)
+ && _RMIXL_PCITAG_DEV(tag) == _RMIXL_PCITAG_DEV(RMIXLP_EHCI0_PCITAG)
+ && sc->sc_usb_bswapped) {
+ rv = bswap32(rv);
+ }
+
return rv;
}
@@ -887,6 +941,12 @@ rmixlp_pcie_conf_write(void *v, pcitag_t
KASSERT(offset < 0x1000);
KASSERT((offset & 3) == 0);
+ if (_RMIXL_PCITAG_BUS(tag) == _RMIXL_PCITAG_BUS(RMIXLP_EHCI0_PCITAG)
+ && _RMIXL_PCITAG_DEV(tag) == _RMIXL_PCITAG_DEV(RMIXLP_EHCI0_PCITAG)
+ && sc->sc_usb_bswapped) {
+ val = bswap32(val);
+ }
+
/*
* If this register isn't addressable via PCI ECFG space, it might
* be accesible via normal PCI CFG space.