Module Name:    src
Committed By:   cliff
Date:           Mon Apr 12 22:03:33 UTC 2010

Modified Files:
        src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_pcix.c

Log Message:
- add bit defines for HOST_MODE_CTL reg
- panic if Host BAR regs do not cover RAM addrs 0..mem_cluster_maxaddr


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/arch/mips/rmi/rmixl_pcix.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/rmixl_pcix.c
diff -u src/sys/arch/mips/rmi/rmixl_pcix.c:1.1.2.1 src/sys/arch/mips/rmi/rmixl_pcix.c:1.1.2.2
--- src/sys/arch/mips/rmi/rmixl_pcix.c:1.1.2.1	Wed Apr  7 19:25:48 2010
+++ src/sys/arch/mips/rmi/rmixl_pcix.c	Mon Apr 12 22:03:33 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixl_pcix.c,v 1.1.2.1 2010/04/07 19:25:48 cliff Exp $	*/
+/*	$NetBSD: rmixl_pcix.c,v 1.1.2.2 2010/04/12 22:03:33 cliff Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_pcix.c,v 1.1.2.1 2010/04/07 19:25:48 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_pcix.c,v 1.1.2.2 2010/04/12 22:03:33 cliff Exp $");
 
 #include "opt_pci.h"
 #include "pci.h"
@@ -161,6 +161,18 @@
 #define PCIX_INTR_ERR_STATUS_RESV	\
 		(PCIX_INTR_ERR_STATUS_RESa|PCIX_INTR_ERR_STATUS_RESb)
 
+/*
+ * RMIXL_PCIX_ECFG_HOST_MODE_CTL bit defines
+ */
+#define PCIX_HOST_MODE_CTL_HDMSTAT	__BIT(1)	/* Host/Dev Mode status
+							 *  read-only
+							 *  1 = host
+							 *  0 = device
+							 */
+#define PCIX_HOST_MODE_CTL_HOSTSWRST	__BIT(0)	/* Host soft reset
+							 *  set to 1 to reset
+							 *  set to 0 to un-reset
+							 */
 
 
 #if BYTE_ORDER == BIG_ENDIAN
@@ -278,7 +290,7 @@
 
 	/* read Host Mode Control register */
 	r = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_HOST_MODE_CTL);
-	r &= __BIT(1);		/* XXX HDMStat */
+	r &= PCIX_HOST_MODE_CTL_HDMSTAT;
 	if (r == 0)
 		return 0;	/* strapped for Device Mode */
 
@@ -313,22 +325,39 @@
 	/*
 	 * check XLR Control Register
 	 */
-	uint32_t xlr_control;
-	xlr_control = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_XLR_CONTROL);
-	printf("%s: XLR_CONTROL=%#x\n", __func__, xlr_control);
-
-	/*
-	 * check HBAR[0..7]
-	 */
-	uint32_t hbar_addr, hbar_size;
-	u_int addr_off = RMIXL_PCIX_ECFG_HOST_BAR0_ADDR;
-	u_int size_off = RMIXL_PCIX_ECFG_HOST_BAR0_SIZE;
-	for (int i=0; i < 7; i++) {
-		hbar_addr = RMIXL_PCIXREG_READ(addr_off);
-		hbar_size = RMIXL_PCIXREG_READ(size_off);
-		addr_off += 4;
-		size_off += 4;
-		printf("%s: HBAR[%d]=%#x @ %#x\n", __func__, i, hbar_size, hbar_addr);
+	DPRINTF(("%s: XLR_CONTROL=%#x\n", __func__, 
+		RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_XLR_CONTROL)));
+
+	/*
+	 * HBAR[0]   if a 32 bit BAR, or
+	 * HBAR[0,1] if a 64 bit BAR pair 
+	 * must cover all RAM
+	 */
+	extern u_quad_t mem_cluster_maxaddr;
+	uint64_t hbar_addr;
+	uint64_t hbar_size;
+	uint32_t hbar_size_lo, hbar_size_hi;
+	uint32_t hbar_addr_lo, hbar_addr_hi;
+
+	hbar_addr_lo = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_HOST_BAR0_ADDR);
+	hbar_addr_hi = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_HOST_BAR1_ADDR);
+	hbar_size_lo = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_HOST_BAR0_SIZE);
+	hbar_size_hi = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_HOST_BAR1_SIZE);
+
+	hbar_addr = (u_quad_t)(hbar_addr_lo & PCI_MAPREG_MEM_ADDR_MASK);
+	hbar_size = hbar_size_lo;
+	if ((hbar_size_lo & PCI_MAPREG_MEM_TYPE_64BIT) != 0) {
+		hbar_addr |= (uint64_t)hbar_addr_hi << 32;
+		hbar_size |= (uint64_t)hbar_size_hi << 32;
+	}
+	if ((hbar_addr != 0) || (hbar_size < mem_cluster_maxaddr)) {
+		printf("%s: HostBAR0 addr %#x, size %#x\n",
+			device_xname(self), hbar_addr_lo, hbar_size_lo);
+		if ((hbar_size_lo & PCI_MAPREG_MEM_TYPE_64BIT) != 0)
+			printf("%s: HostBAR1 addr %#x, size %#x\n",
+				device_xname(self), hbar_addr_hi, hbar_size_hi);
+		panic("PCI-X Host BAR does not cover RAM range 0..%#"PRIx64,
+			mem_cluster_maxaddr);
 	}
 
 	/*
@@ -339,7 +368,7 @@
 	mble = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_XLR_MBLE);
 	mba  = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_MATCH_BIT_ADDR);
 	mbs  = RMIXL_PCIXREG_READ(RMIXL_PCIX_ECFG_MATCH_BIT_SIZE);
-	printf("%s: MBLE=%#x, MBA=%#x, MBS=%#x\n", __func__, mble, mba, mbs);
+	DPRINTF(("%s: MBLE=%#x, MBA=%#x, MBS=%#x\n", __func__, mble, mba, mbs));
 	if ((mble & __BIT(40)) != 0)
 		RMIXL_PCIXREG_WRITE(RMIXL_PCIX_ECFG_XLR_MBLE, 0);
 
@@ -368,8 +397,6 @@
 	}
 	rcp->rc_pci_mem_pbase = (bus_addr_t)RMIXL_PCIX_MEM_BAR_TO_BA(bar);
 	rcp->rc_pci_mem_size  = (bus_size_t)RMIXL_PCIX_MEM_BAR_TO_SIZE(bar);
-printf("%s: rc_pci_mem_pbase %#"PRIxBUSADDR", rc_pci_mem_size %#"PRIxBUSSIZE"\n",
-__func__, rcp->rc_pci_mem_pbase, rcp->rc_pci_mem_size);
 
 	/*
 	 * get PCI IO space base [addr, size] from SBC PCIe IO BAR

Reply via email to