Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 04 Feb 2008 13:49:30 -0700 (MST)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        rrs@freebsd.org
Cc:        perforce@freebsd.org
Subject:   Re: PERFORCE change 134769 for review
Message-ID:  <20080204.134930.-1350498280.imp@bsdimp.com>
In-Reply-To: <200802040843.m148htF0037992@repoman.freebsd.org>
References:  <200802040843.m148htF0037992@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <200802040843.m148htF0037992@repoman.freebsd.org>
            "Randall R. Stewart" <rrs@freebsd.org> writes:
: http://perforce.freebsd.org/chv.cgi?CH=134769
: 
: Change 134769 by rrs@rrs-mips2-jnpr on 2008/02/04 08:43:01
: 
: 	Ok, It still works but now uses the correct registers.
: 	       Now, only question I have is if the MCR is used properly.
: 	       What was being done before does not match any valid register
: 	       need to figure out what its trying to do with the ioctl.
: 	       There may be other strange things like this too. Need to
: 	       go through the driver and look for other strange things.
: 
: Affected files ...
: 
: .. //depot/projects/mips2-jnpr/src/sys/mips/conf/OCTEON_rrs#9 edit
: .. //depot/projects/mips2-jnpr/src/sys/mips/mips/swtch.S#11 edit
: .. //depot/projects/mips2-jnpr/src/sys/mips/mips32/octeon32/uart_dev_oct16550.c#4 edit
: 
: Differences ...
: 
: ==== //depot/projects/mips2-jnpr/src/sys/mips/conf/OCTEON_rrs#9 (text+ko) ====
: 
: @@ -33,7 +33,7 @@
:  
:  makeoptions	DEBUG=-g		#Build kernel with gdb(1) debug symbols
:  
: -options 	ISA_MIPS32
: +options 	ISA_MIPS64
:  options         CPU_NOFPU

I don't think you want this change.  it is wrong because we don't
support ISA_MIPS64's notion of 64-bit registers correctly.

:  options		DDB
: @@ -79,6 +79,6 @@
:  
:  #
:  # Use the following for RFS in mem-device
: -options         MD_ROOT
: +#options         MD_ROOT
:  # options         ROOTDEVNAME = \"ufs:md0\"
: -options         MD_ROOT_SIZE = 25200
: +#options         MD_ROOT_SIZE = 25200
: 
: ==== //depot/projects/mips2-jnpr/src/sys/mips/mips/swtch.S#11 (text+ko) ====
: 
: 
: ==== //depot/projects/mips2-jnpr/src/sys/mips/mips32/octeon32/uart_dev_oct16550.c#4 (text+ko) ====
: 
: @@ -69,16 +69,13 @@
:  #include <dev/uart/uart_cpu.h>
:  #include <dev/uart/uart_bus.h>
:  
: -#include <dev/ic/ns16550.h>
: +#include <mips/mips32/octeon32/oct16550.h>
:  
:  /* Octeon specific includes with loads of in-lines */
:  #include <mips/mips32/octeon32/octeon_pcmap_regs.h>
:  #include <mips/mips32/octeon32/bus_octeon.h>
:  
:  /* Cavium specific defines pulled from there update of ns16559.h */
: -#define IIR_BUSY           0x7
: -#define com_usr            39      /* Octeon 16750/16550 Uart Status Reg */
: -#define REG_USR            com_usr
:  #define USR_TXFIFO_NOTFULL 2    /* Uart TX FIFO Not full */
:  
:  #include "uart_if.h"
: @@ -98,19 +95,19 @@
:  {
:  	uint8_t iir;
:  
: -	iir = uart_getreg(bas, REG_IIR);
: +	iir = uart_getreg(bas, OCT_REG_IIR);
:  	while ((iir & IIR_NOPEND) == 0) {
:  		iir &= IIR_IMASK;
:  		if (iir == IIR_RLS)
: -			(void)uart_getreg(bas, REG_LSR);
: +			(void)uart_getreg(bas, OCT_REG_LSR);
:  		else if (iir == IIR_RXRDY || iir == IIR_RXTOUT)
: -			(void)uart_getreg(bas, REG_DATA);
: +			(void)uart_getreg(bas, OCT_REG_RBR);
:  		else if (iir == IIR_MLSC)
: -			(void)uart_getreg(bas, REG_MSR);
: +			(void)uart_getreg(bas, OCT_REG_MSR);
:  		else if (iir == IIR_BUSY)
: -			(void)uart_getreg(bas, REG_USR);
: +			(void)uart_getreg(bas, OCT_REG_USR);
:  		uart_barrier(bas);
: -		iir = uart_getreg(bas, REG_IIR);
: +		iir = uart_getreg(bas, OCT_REG_IIR);
:  	}
:  }
:  
: @@ -126,12 +123,12 @@
:  	if (!delay_changed)
:  		return delay;
:  	delay_changed = 0;
: -	lcr = uart_getreg(bas, REG_LCR);
: -	uart_setreg(bas, REG_LCR, lcr | LCR_DLAB);
: +	lcr = uart_getreg(bas, OCT_REG_LCR);
: +	uart_setreg(bas, OCT_REG_LCR, lcr | LCR_DLAB);
:  	uart_barrier(bas);
: -	divisor = uart_getreg(bas, REG_DLL) | (uart_getreg(bas, REG_DLH) << 8);
: +	divisor = uart_getreg(bas, OCT_REG_DLL) | (uart_getreg(bas, OCT_REG_DLH) << 8);
:  	uart_barrier(bas);
: -	uart_setreg(bas, REG_LCR, lcr);
: +	uart_setreg(bas, OCT_REG_LCR, lcr);
:  	uart_barrier(bas);
:  
:  	if (!bas->rclk)
: @@ -182,7 +179,7 @@
:  		 * high enough to handle large FIFOs.
:  		 */
:  		limit = 10 * 10 * 10 * 1024;
: -		while ((uart_getreg(bas, REG_LSR) & LSR_TEMT) == 0 && --limit)
: +		while ((uart_getreg(bas, OCT_REG_LSR) & LSR_TEMT) == 0 && --limit)
:  			DELAY(delay);
:  		if (limit == 0) {
:  			/*
: @@ -202,8 +199,8 @@
:  		 * UART is first activated.
:  		 */
:  		limit = 10 * 4096;
: -		while ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) && --limit) {
: -			(void)uart_getreg(bas, REG_DATA);
: +		while ((uart_getreg(bas, OCT_REG_LSR) & LSR_RXRDY) && --limit) {
: +			(void)uart_getreg(bas, OCT_REG_RBR);
:  			uart_barrier(bas);
:  			DELAY(delay << 2);
:  		}
: @@ -229,7 +226,7 @@
:  		fcr |= FCR_XMT_RST;
:  	if (what & UART_FLUSH_RECEIVER)
:  		fcr |= FCR_RCV_RST;
: -	uart_setreg(bas, REG_FCR, fcr);
: +	uart_setreg(bas, OCT_REG_FCR, fcr);
:  	uart_barrier(bas);
:  }
:  
: @@ -258,15 +255,15 @@
:  		divisor = oct16550_divisor(bas->rclk, baudrate);
:  		if (divisor == 0)
:  			return (EINVAL);
: -		uart_setreg(bas, REG_LCR, lcr | LCR_DLAB);
: +		uart_setreg(bas, OCT_REG_LCR, lcr | LCR_DLAB);
:  		uart_barrier(bas);
: -		uart_setreg(bas, REG_DLL, divisor & 0xff);
: -		uart_setreg(bas, REG_DLH, (divisor >> 8) & 0xff);
: +		uart_setreg(bas, OCT_REG_DLL, divisor & 0xff);
: +		uart_setreg(bas, OCT_REG_DLH, (divisor >> 8) & 0xff);
:  		uart_barrier(bas);
:  		delay_changed = 1;
:  	}
:  	/* Set LCR and clear DLAB. */
: -	uart_setreg(bas, REG_LCR, lcr);
: +	uart_setreg(bas, OCT_REG_LCR, lcr);
:  	uart_barrier(bas);
:  	return (0);
:  }
: @@ -296,13 +293,13 @@
:  	u_char val;
:  
:  	/* Check known 0 bits that don't depend on DLAB. */
: -	val = uart_getreg(bas, REG_IIR);
: +	val = uart_getreg(bas, OCT_REG_IIR);
:  	if (val & 0x30)
:  		return (ENXIO);
: -	val = uart_getreg(bas, REG_MCR);
: +	val = uart_getreg(bas, OCT_REG_MCR);
:  	if (val & 0xc0)
:  		return (ENXIO);
: -	val = uart_getreg(bas, REG_USR);
: +	val = uart_getreg(bas, OCT_REG_USR);
:  	if (val & 0xe0)
:  		return (ENXIO);
:  	return (0);
: @@ -317,16 +314,16 @@
:  	oct16550_param(bas, baudrate, databits, stopbits, parity);
:  
:  	/* Disable all interrupt sources. */
: -	ier = uart_getreg(bas, REG_IER) & 0x0;
: -	uart_setreg(bas, REG_IER, ier);
: +	ier = uart_getreg(bas, OCT_REG_IER) & 0x0;
: +	uart_setreg(bas, OCT_REG_IER, ier);
:  	uart_barrier(bas);
:  
:  	/* Disable the FIFO (if present). */
: -	//uart_setreg(bas, REG_FCR, 0);
: +	//uart_setreg(bas, OCT_REG_FCR, 0);
:  	uart_barrier(bas);
:  
:  	/* Set RTS & DTR. */
: -	uart_setreg(bas, REG_MCR, MCR_RTS | MCR_DTR);
: +	uart_setreg(bas, OCT_REG_MCR, MCR_RTS | MCR_DTR);
:  	uart_barrier(bas);
:  
:  	oct16550_clrint(bas);
: @@ -337,17 +334,17 @@
:  {
:  
:  	/* Clear RTS & DTR. */
: -	uart_setreg(bas, REG_MCR, 0);
: +	uart_setreg(bas, OCT_REG_MCR, 0);
:  	uart_barrier(bas);
:  }
:  
:  static inline void 
:  oct16550_wait_txhr_empty(struct uart_bas *bas, int limit, int delay)
:  {
: -	while (((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0) &&
: -	    ((uart_getreg(bas, REG_USR) & USR_TXFIFO_NOTFULL) == 0) && --limit)
: +	while (((uart_getreg(bas, OCT_REG_LSR) & LSR_THRE) == 0) &&
: +	    ((uart_getreg(bas, OCT_REG_USR) & USR_TX_FIFO_NOTFULL) == 0) && --limit)
:  		DELAY(delay);
: -}
: +}                                         
:  
:  static void
:  oct16550_putc(struct uart_bas *bas, int c)
: @@ -357,7 +354,7 @@
:  	/* 1/10th the time to transmit 1 character (estimate). */
:  	delay = oct16550_delay(bas);
:  	oct16550_wait_txhr_empty(bas, 100, delay);
: -	uart_setreg(bas, REG_DATA, c);
: +	uart_setreg(bas, OCT_REG_THR, c);
:  	uart_barrier(bas);
:  	oct16550_wait_txhr_empty(bas, 100, delay);
:  }
: @@ -366,7 +363,7 @@
:  oct16550_rxready(struct uart_bas *bas)
:  {
:  
: -	return ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) != 0 ? 1 : 0);
: +	return ((uart_getreg(bas, OCT_REG_LSR) & LSR_RXRDY) != 0 ? 1 : 0);
:  }
:  
:  static int
: @@ -379,13 +376,13 @@
:  	/* 1/10th the time to transmit 1 character (estimate). */
:  	delay = oct16550_delay(bas);
:  
: -	while ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) == 0) {
: +	while ((uart_getreg(bas, OCT_REG_LSR) & LSR_RXRDY) == 0) {
:  		uart_unlock(hwmtx);
:  		DELAY(delay);
:  		uart_lock(hwmtx);
:  	}
:  
: -	c = uart_getreg(bas, REG_DATA);
: +	c = uart_getreg(bas, OCT_REG_RBR);
:  
:  	uart_unlock(hwmtx);
:  
: @@ -456,9 +453,9 @@
:  	bas = &sc->sc_bas;
:  
:  	oct16550_drain(bas, UART_DRAIN_TRANSMITTER);
: -	oct16550->mcr = uart_getreg(bas, REG_MCR);
: -	oct16550->fcr = FCR_ENABLE | FCR_RX_HIGH;
: -	uart_setreg(bas, REG_FCR, oct16550->fcr);
: +	oct16550->mcr = uart_getreg(bas, OCT_REG_MCR);
: +	oct16550->fcr = FCR_ENABLE | FCR_RX_MEDH;
: +	uart_setreg(bas, OCT_REG_FCR, oct16550->fcr);
:  	uart_barrier(bas);
:  	oct16550_bus_flush(sc, UART_FLUSH_RECEIVER | UART_FLUSH_TRANSMITTER);
:  
: @@ -469,9 +466,9 @@
:  	oct16550_bus_getsig(sc);
:  
:  	oct16550_clrint(bas);
: -	oct16550->ier = uart_getreg(bas, REG_IER) & 0xf0;
: +	oct16550->ier = uart_getreg(bas, OCT_REG_IER) & 0xf0;
:  	oct16550->ier |= IER_EMSC | IER_ERLS | IER_ERXRDY;
: -	uart_setreg(bas, REG_IER, oct16550->ier);
: +	uart_setreg(bas, OCT_REG_IER, oct16550->ier);
:  	uart_barrier(bas);
:  
:  	/*
: @@ -489,8 +486,8 @@
:  	u_char ier;
:  
:  	bas = &sc->sc_bas;
: -	ier = uart_getreg(bas, REG_IER) & 0xf0;
: -	uart_setreg(bas, REG_IER, ier);
: +	ier = uart_getreg(bas, OCT_REG_IER) & 0xf0;
: +	uart_setreg(bas, OCT_REG_IER, ier);
:  	uart_barrier(bas);
:  	oct16550_clrint(bas);
:  	return (0);
: @@ -507,7 +504,7 @@
:  	uart_lock(sc->sc_hwmtx);
:  	if (sc->sc_rxfifosz > 1) {
:  		oct16550_flush(bas, what);
: -		uart_setreg(bas, REG_FCR, oct16550->fcr);
: +		uart_setreg(bas, OCT_REG_FCR, oct16550->fcr);
:  		uart_barrier(bas);
:  		error = 0;
:  	} else
: @@ -526,7 +523,7 @@
:  		old = sc->sc_hwsig;
:  		sig = old;
:  		uart_lock(sc->sc_hwmtx);
: -		msr = uart_getreg(&sc->sc_bas, REG_MSR);
: +		msr = uart_getreg(&sc->sc_bas, OCT_REG_MSR);
:  		uart_unlock(sc->sc_hwmtx);
:  		SIGCHG(msr & MSR_DSR, sig, SER_DSR, SER_DDSR);
:  		SIGCHG(msr & MSR_CTS, sig, SER_CTS, SER_DCTS);
: @@ -549,52 +546,57 @@
:  	uart_lock(sc->sc_hwmtx);
:  	switch (request) {
:  	case UART_IOCTL_BREAK:
: -		lcr = uart_getreg(bas, REG_LCR);
: +		lcr = uart_getreg(bas, OCT_REG_LCR);
:  		if (data)
: -			lcr |= LCR_SBREAK;
: +
: +		lcr |= LCR_SBREAK;
:  		else
:  			lcr &= ~LCR_SBREAK;
: -		uart_setreg(bas, REG_LCR, lcr);
: +		uart_setreg(bas, OCT_REG_LCR, lcr);
:  		uart_barrier(bas);
:  		break;
:  	case UART_IOCTL_IFLOW:
: -		lcr = uart_getreg(bas, REG_LCR);
: +		lcr = uart_getreg(bas, OCT_REG_LCR);
:  		uart_barrier(bas);
: -		uart_setreg(bas, REG_LCR, 0xbf);
: +		/* What does EFR_ENABLE do?? RRS */
: +		uart_setreg(bas, OCT_REG_LCR, LCR_EFR_ENABLE);
:  		uart_barrier(bas);
: -		efr = uart_getreg(bas, REG_EFR);
: +		/* Don't know if this is correct ?? RRS */
: +		efr = uart_getreg(bas, OCT_REG_MCR);
:  		if (data)
: -			efr |= EFR_RTS;
: +			efr |= MCR_RTS;
:  		else
: -			efr &= ~EFR_RTS;
: -		uart_setreg(bas, REG_EFR, efr);
: +			efr &= ~MCR_RTS;
: +		uart_setreg(bas, OCT_REG_MCR, efr);
:  		uart_barrier(bas);
: -		uart_setreg(bas, REG_LCR, lcr);
: +		uart_setreg(bas, OCT_REG_LCR, lcr);
:  		uart_barrier(bas);
:  		break;
:  	case UART_IOCTL_OFLOW:
: -		lcr = uart_getreg(bas, REG_LCR);
: +		lcr = uart_getreg(bas, OCT_REG_LCR);
:  		uart_barrier(bas);
: -		uart_setreg(bas, REG_LCR, 0xbf);
: +		/* Don't know if this is correct ?? RRS */
: +		uart_setreg(bas, OCT_REG_LCR, LCR_EFR_ENABLE);
:  		uart_barrier(bas);
: -		efr = uart_getreg(bas, REG_EFR);
: +		/* Don't know if this is correct ?? RRS */
: +		efr = uart_getreg(bas, OCT_REG_MCR);
:  		if (data)
: -			efr |= EFR_CTS;
: +			efr |= MCR_DTR;
:  		else
: -			efr &= ~EFR_CTS;
: -		uart_setreg(bas, REG_EFR, efr);
: +			efr &= ~MCR_DTR;
: +		uart_setreg(bas, OCT_REG_MCR, efr);
:  		uart_barrier(bas);
: -		uart_setreg(bas, REG_LCR, lcr);
: +		uart_setreg(bas, OCT_REG_LCR, lcr);
:  		uart_barrier(bas);
:  		break;
:  	case UART_IOCTL_BAUD:
: -		lcr = uart_getreg(bas, REG_LCR);
: -		uart_setreg(bas, REG_LCR, lcr | LCR_DLAB);
: +		lcr = uart_getreg(bas, OCT_REG_LCR);
: +		uart_setreg(bas, OCT_REG_LCR, lcr | LCR_DLAB);
:  		uart_barrier(bas);
: -		divisor = uart_getreg(bas, REG_DLL) |
: -		    (uart_getreg(bas, REG_DLH) << 8);
: +		divisor = uart_getreg(bas, OCT_REG_DLL) |
: +		    (uart_getreg(bas, OCT_REG_DLH) << 8);
:  		uart_barrier(bas);
: -		uart_setreg(bas, REG_LCR, lcr);
: +		uart_setreg(bas, OCT_REG_LCR, lcr);
:  		uart_barrier(bas);
:  		baudrate = (divisor > 0) ? bas->rclk / divisor / 16 : 0;
:  		delay_changed = 1;
: @@ -622,11 +624,11 @@
:  	bas = &sc->sc_bas;
:  	uart_lock(sc->sc_hwmtx);
:  
: -	iir = uart_getreg(bas, REG_IIR) & IIR_IMASK;
: +	iir = uart_getreg(bas, OCT_REG_IIR) & IIR_IMASK;
:  	if (iir != IIR_NOPEND) {
:  
:  		if (iir == IIR_RLS) {
: -			lsr = uart_getreg(bas, REG_LSR);
: +			lsr = uart_getreg(bas, OCT_REG_LSR);
:  			if (lsr & LSR_OE)
:  				ipend |= SER_INT_OVERRUN;
:  			if (lsr & LSR_BI)
: @@ -647,7 +649,7 @@
:  			ipend |= SER_INT_SIGCHG;
:  
:  		} else if (iir == IIR_BUSY) {
: -			(void)uart_getreg(bas, REG_USR);
: +			(void)uart_getreg(bas, OCT_REG_USR);
:  		}
:  	}
:  	uart_unlock(sc->sc_hwmtx);
: @@ -693,7 +695,7 @@
:  	if (error) {
:  		return (error);
:  	}
: -	uart_setreg(bas, REG_MCR, (MCR_DTR | MCR_RTS));
: +	uart_setreg(bas, OCT_REG_MCR, (MCR_DTR | MCR_RTS));
:  
:  	/*
:  	 * Enable FIFOs. And check that the UART has them. If not, we're
: @@ -703,7 +705,7 @@
:  	oct16550_drain(bas, UART_DRAIN_TRANSMITTER);
:  #define ENABLE_OCTEON_FIFO 1
:  #ifdef ENABLE_OCTEON_FIFO
: -	uart_setreg(bas, REG_FCR, FCR_ENABLE | FCR_XMT_RST | FCR_RCV_RST);
: +	uart_setreg(bas, OCT_REG_FCR, FCR_ENABLE | FCR_XMT_RST | FCR_RCV_RST);
:  #endif
:  	uart_barrier(bas);
:  
: @@ -749,31 +751,31 @@
:  
:  	bas = &sc->sc_bas;
:  	uart_lock(sc->sc_hwmtx);
: -	lsr = uart_getreg(bas, REG_LSR);
: +	lsr = uart_getreg(bas, OCT_REG_LSR);
:  
:  	while (lsr & LSR_RXRDY) {
:  		if (uart_rx_full(sc)) {
:  			sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN;
:  			break;
:  		}
: -		xc = uart_getreg(bas, REG_DATA);
: +		xc = uart_getreg(bas, OCT_REG_RBR);
:  		if (lsr & LSR_FE)
:  			xc |= UART_STAT_FRAMERR;
:  		if (lsr & LSR_PE)
:  			xc |= UART_STAT_PARERR;
:  		uart_rx_put(sc, xc);
: -		lsr = uart_getreg(bas, REG_LSR);
: +		lsr = uart_getreg(bas, OCT_REG_LSR);
:  	}
:  	/* Discard everything left in the Rx FIFO. */
:  	/*
:  	 * First do a read/discard anyway, in case the UART was lying to us.
:  	 * This was seen, when IIR said RBR, but LSR said no RXRDY
:  	 */
: -	(void)uart_getreg(bas, REG_DATA);
: +	(void)uart_getreg(bas, OCT_REG_RBR);
:  	while (lsr & LSR_RXRDY) {
: -		(void)uart_getreg(bas, REG_DATA);
: +		(void)uart_getreg(bas, OCT_REG_RBR);
:  		uart_barrier(bas);
: -		lsr = uart_getreg(bas, REG_LSR);
: +		lsr = uart_getreg(bas, OCT_REG_LSR);
:  	}
:  	uart_unlock(sc->sc_hwmtx);
:  	return (0);
: @@ -805,7 +807,7 @@
:  		oct16550->mcr |= MCR_DTR;
:  	if (new & SER_RTS)
:  		oct16550->mcr |= MCR_RTS;
: -	uart_setreg(bas, REG_MCR, oct16550->mcr);
: +	uart_setreg(bas, OCT_REG_MCR, oct16550->mcr);
:  	uart_barrier(bas);
:  	uart_unlock(sc->sc_hwmtx);
:  	return (0);
: @@ -827,11 +829,11 @@
:  #else
:  
:  	oct16550_wait_txhr_empty(bas, 100, oct16550_delay(bas));
: -	uart_setreg(bas, REG_IER, oct16550->ier | IER_ETXRDY);
: +	uart_setreg(bas, OCT_REG_IER, oct16550->ier | IER_ETXRDY);
:  	uart_barrier(bas);
:  
:  	for (i = 0; i < sc->sc_txdatasz; i++) {
: -		uart_setreg(bas, REG_DATA, sc->sc_txbuf[i]);
: +		uart_setreg(bas, OCT_REG_THR, sc->sc_txbuf[i]);
:  		uart_barrier(bas);
:  	}
:  	sc->sc_txbusy = 1;
: 
`



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080204.134930.-1350498280.imp>