Subject: Re: How to implement PSC driver on Au1550
To: Shigeyuki Fukushima <shige@NetBSD.org>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: port-evbmips
Date: 02/23/2006 09:25:09
Shigeyuki Fukushima wrote:
> Izumi Tsutsui wrote:
>   
>>> On OMS-AL400, DBAU1550 code works fine. Thanks, Garrett!
>>>       
>> Good news. How about PCI devices (wm and ehci)?
>>     
>
> Almost Ok.
> But Attaching wm0 failed. Hummmm...
>   
Please send me dmesg output.  Probably wm0 isn't in the kernel config at
least.
> kiyohara's OMS-AL400 works fine.
>
>   
>> If we can assume each PSC ports are initialized by the firmware
>> properly, we can read the protocol select register to probe
>> which protocol is selected. In this case the kernel config could be:
>>
>> aupsc* at aubus?
>> ausmbus* at aupsc?
>> smbus* at ausmbus?
>>     
>
> Is the role of aupsc device only switching/selecting protocols?
>
> Is the following kernel config bad idea??
>
> aupsc* at aubus?
> audio* at aupsc?
> spi* at aupsc?
> i2s* at aupsc?
> smbus* at aupsc?
>   
I think so.  The reason is that auaudio is e.g. very similar on the
au1550 and earlier parts, except that the au1550 implements it on a
psc.  I'd like to have a generic auaudio* module, with two different
attachment versions:

    auaudio_aubus.c -- for the earlier au1500/au1000/au1100
    auaudio_aupsc.c -- for the au1550 (and maybe au1200, i haven't
looked at the 1200 yet)

This may apply to the other modules (spi/i2s,smbus) as well.  If nothing
else, it means that you can have a limited config with only the code for
the modules you have on board in your kernel.

So lets keep aupsc really generic, with just the bits to program the PSC
registers (or possibly autodetect, but I'm not a fan of that option
primarily because I've seen bad firmware out there, and not everyone
will have YAMON) and attach the underlying "protocol-specific" drivers.

> I will attach current-working codes.
> Please review it.
>   
Looks reasonable.  I don't have any objections if you want to commit
this, as it isn't in any default configs yet.  (C.F. my PCMCIA commits.)

    -- Garrett
>   
>> But we should implement smbus and RTC drivers first
>> because logical layers for device configuration could be
>> changed later, IMHO.
>>     
>
> Thank you for your advice.
>
>
> FYI:
> OMS-AL400 boot log is the following:
>
> YAMON> go 80100000
> MIPS32/64 params: cpu arch: 32
> MIPS32/64 params: TLB entries: 32
> MIPS32/64 params: Icache: line = 32, total = 16384, ways = 4
>                  sets = 128
> MIPS32/64 params: Dcache: line = 32, total = 16384, ways = 4
>                  sets = 128
>   picache_stride    = 4096
>   picache_loopcount = 4
>   pdcache_stride    = 4096
>   pdcache_loopcount = 4
>   Dcache is coherent
>   Icache is coherent against Dcache
> Memory size: 0x08000000
> Loaded initial symtab at 0x803832b4, strtab at 0x80398768, # entries 5349
> Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
> 2005, 2006
>     The NetBSD Foundation, Inc.  All rights reserved.
> Copyright (c) 1982, 1986, 1989, 1991, 1993
>     The Regents of the University of California.  All rights reserved.
>
> NetBSD 3.99.15 (OMSAL400) #25: Fri Feb 24 01:01:42 JST 2006
>
> root@netbsd.griffinet.dyndns.org:/opt/build/objdir.mipsel/sys/arch/evbmips/compile/OMSAL400
> Plathome Open Micro Sever AL400/AMD Alchemy Au1550
> total memory = 128 MB
> avail memory = 120 MB
> mainbus0 (root)
> cpu0 at mainbus0: 396.00MHz (hz cycles = 773438, delay divisor = 396)
> cpu0: Alchemy Au1550 (Rev 2 core) (0x3030200) Rev. 0 with software
> emulated floating point
> cpu0: 16KB/32B 4-way set-associative L1 Instruction cache, 32 TLB entries
> cpu0: 16KB/32B 4-way set-associative write-back L1 Data cache
> obio0 at mainbus0
> aubus0 at mainbus0
> aucom0 at aubus0 addr 0x11100000 irq 0: Au1X00 UART, working fifo
> aucom0: console
> aucom1 at aubus0 addr 0x11200000 irq 8: Au1X00 UART, working fifo
> aucom2 at aubus0 addr 0x11400000 irq 9: Au1X00 UART, working fifo
> aurtc0 at aubus0 addr 0x0: Au1X00 programmable clock
> aumac0 at aubus0 addr 0x10500000 irq 27: Au1X00 10/100 Ethernet
> aumac0: Ethernet address 00:0a:85:02:00:bf
> lxtphy0 at aumac0 phy 0: LXT971/2 10/100 media interface, rev. 2
> lxtphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
> aumac1 at aubus0 addr 0x10510000 irq 28: Au1X00 10/100 Ethernet
> aumac1: Ethernet address 00:0a:85:02:10:bf
> ohci0 at aubus0 addr 0x14020000 irq 26: Alchemy OHCI
> ohci0: OHCI version 1.0
> usb0 at ohci0: USB revision 1.0
> uhub0 at usb0
> uhub0: vendor 0x0000 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
> uhub0: 2 ports with 2 removable, self powered
> aupci0 at aubus0 addr 0x14005000: Alchemy Host-PCI Bridge, 66MHz
> pci0 at aupci0 bus 0
> pci0: i/o space, memory space enabled
> ohci1 at pci0 dev 2 function 0: NEC USB Host Controller (rev. 0x43)
> ohci1: interrupting at irq 5
> ohci1: OHCI version 1.0
> usb1 at ohci1: USB revision 1.0
> uhub1 at usb1
> uhub1: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
> uhub1: 3 ports with 3 removable, self powered
> ohci2 at pci0 dev 2 function 1: NEC USB Host Controller (rev. 0x43)
> ohci2: interrupting at irq 5
> ohci2: OHCI version 1.0
> usb2 at ohci2: USB revision 1.0
> uhub2 at usb2
> uhub2: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
> uhub2: 2 ports with 2 removable, self powered
> ehci0 at pci0 dev 2 function 2: NEC USB Host Controller (rev. 0x04)
> ehci0: interrupting at irq 5
> ehci0: BIOS has given up ownership
> ehci0: EHCI version 1.0
> ehci0: companion controllers, 3 ports each: ohci1 ohci2
> usb3 at ehci0: USB revision 2.0
> uhub3 at usb3
> uhub3: NEC EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
> uhub3: 5 ports with 5 removable, self powered
> wm0 at pci0 dev 3 function 0: Intel i82541GI 1000BASE-T Ethernet, rev. 5
> wm0: unable to map device registers
> wm1 at pci0 dev 4 function 0: Intel i82541GI 1000BASE-T Ethernet, rev. 5
> wm1: interrupting at irq 1
> wm1: Ethernet address 00:0a:85:02:50:46
> igphy0 at wm1 phy 1: Intel IGP01E1000 Gigabit PHY, rev. 0
> igphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT,
> 1000baseT-FDX, auto
> augpio0 at aubus0 addr 0x11900100: Alchemy GPIO, primary block
> gpio0 at augpio0: 27 pins
> augpio1 at aubus0 addr 0x11700000: Alchemy GPIO, secondary block
> gpio1 at augpio1: 16 pins
> aupsc0 at aubus0 addr 0x11a0000 irq 10: Alchemy PSC
> aupsc1 at aubus0 addr 0x11b0000 irq 11: Alchemy PSC
> aupsc2 at aubus0 addr 0x10a0000 irq 12: Alchemy PSC
> aupsc3 at aubus0 addr 0x10b0000 irq 13: Alchemy PSC
> root device:
>
>   
> ------------------------------------------------------------------------
>
> /* $NetBSD$ */
>
> /*-
>  * Copyright (c) 2006 Shigeyuki Fukushima.
>  * All rights reserved.
>  *
>  * Written by Shigeyuki Fukushima.
>  *
>  * Redistribution and use in source and binary forms, with or without
>  * modification, are permitted provided that the following conditions
>  * are met:
>  * 1. Redistributions of source code must retain the above copyright
>  *    notice, this list of conditions and the following disclaimer.
>  * 2. Redistributions in binary form must reproduce the above
>  *    copyright notice, this list of conditions and the following
>  *    disclaimer in the documentation and/or other materials provided
>  *    with the distribution.
>  * 3. The name of the author may not be used to endorse or promote
>  *    products derived from this software without specific prior
>  *    written permission.
>  *
>  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
>  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
>  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
>  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
>  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
>  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
>  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
>  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
>  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  */
>
> #ifndef _MIPS_ALCHEMY_DEV_AUPSCREG_H_
> #define	_MIPS_ALCHEMY_DEV_AUPSCREG_H_
>
> /*
>  * PSC registers (offset from PSCn_BASE).
>  */
>
> /* psc_sel: PSC clock and protocol select
>  *   CLK [5:4]
>  *     00 = pscn_intclk (for SPI, SMBus, I2S Master[PSC3 Only])
>  *     01 = PSCn_EXTCLK (for SPI, SMBus, I2S Master)
>  *     10 = PSCn_CLK    (for AC97, I2S Slave)
>  *     11 = Reserved
>  *   PS [2:0]
>  *     000 = Protocol disable
>  *     001 = Reserved
>  *     010 = SPI mode
>  *     011 = I2S mode
>  *     100 = AC97 mode
>  *     101 = SMBus mode
>  *     11x = Reserved
>  */
> #define	AUPSC_SEL			0x00	/* R/W */
> #  define	AUPSC_SEL_CLK(x)	((x & 0x03) << 4) /* CLK */
> #  define	AUPSC_SEL_PS(x)		(x & 0x07)
> #  define	AUPSC_SEL_DISABLE	0
> #  define	AUPSC_SEL_SPI		2
> #  define	AUPSC_SEL_I2S		3
> #  define	AUPSC_SEL_AC97		4
> #  define	AUPSC_SEL_SMBUS		5
>
> /* psc_ctrl: PSC control
>  *  ENA [1:0]
>  *    00 = Disable/Reset
>  *    01 = Reserved
>  *    10 = Suspend
>  *    10 = Enable
>  */
> #define	AUPSC_CTRL			0x04	/* R/W */
> #  define	AUPSC_CTRL_ENA(x)	(x & 0x03)
>
> /* 0x0008 - 0x002F: Protocol-specific registers */
>
> /* PSC registers size */
> #define	AUPSC_SIZE			0x2f
>
>
> /*
>  * SPI Protocol registers
>  */
> #define	AUPSC_SPICFG			0x08	/* R/W */
> #define	AUPSC_SPIMSK			0x0c	/* R/W */
> #define	AUPSC_SPIPCR			0x10	/* R/W */
> #define	AUPSC_SPISTAT			0x14	/* Read only */
> #define	AUPSC_SPIEVNT			0x18	/* R/W */
> #define	AUPSC_SPITXRX			0x1c	/* R/W */
> /* #include <mips/alchemy/dev/spireg.h> */
>
> /*
>  * I2S Protocol registers
>  */
> #define	AUPSC_I2SCFG			0x08	/* R/W */
> #define	AUPSC_I2SMSK			0x0c	/* R/W */
> #define	AUPSC_I2SPCR			0x10	/* R/W */
> #define	AUPSC_I2SSTAT			0x14	/* Read only */
> #define	AUPSC_I2SEVNT			0x18	/* R/W */
> #define	AUPSC_I2STXRX			0x1c	/* R/W */
> #define	AUPSC_I2SUDF			0x20	/* R/W */
> /* #include <mips/alchemy/dev/i2sreg.h> */
>
> /*
>  * AC97 Protocol registers
>  */
> #define	AUPSC_AC97CFG			0x08	/* R/W */
> #define	AUPSC_AC97MSK			0x0c	/* R/W */
> #define	AUPSC_AC97PCR			0x10	/* R/W */
> #define	AUPSC_AC97STAT			0x14	/* Read only */
> #define	AUPSC_AC97EVNT			0x18	/* R/W */
> #define	AUPSC_AC97TXRX			0x1c	/* R/W */
> #define	AUPSC_AC97CDC			0x20	/* R/W */
> #define	AUPSC_AC97RST			0x24	/* R/W */
> #define	AUPSC_AC97GPO			0x28	/* R/W */
> #define	AUPSC_AC97GPI			0x2c	/* Read only */
> /* #include <mips/alchemy/dev/ac97reg.h> */
>
> /*
>  * SMBus Protocol registers
>  */
> #define	AUPSC_SMBCFG			0x08	/* R/W */
> #define	AUPSC_SMBMSK			0x0c	/* R/W */
> #define	AUPSC_SMBPCR			0x10	/* R/W */
> #define	AUPSC_SMBSTAT			0x14	/* Read only */
> #define	AUPSC_SMBEVNT			0x18	/* R/W */
> #define	AUPSC_SMBTXRX			0x1c	/* R/W */
> #define	AUPSC_SMBTMR			0x20	/* R/W */
> #include <mips/alchemy/dev/smbusreg.h>
>
> #endif	/* _MIPS_ALCHEMY_DEV_AUPSCREG_H_ */
>   
> ------------------------------------------------------------------------
>
> /* $NetBSD$ */
>
> /*-
>  * Copyright (c) 2006 Shigeyuki Fukushima.
>  * All rights reserved.
>  *
>  * Written by Shigeyuki Fukushima.
>  *
>  * Redistribution and use in source and binary forms, with or without
>  * modification, are permitted provided that the following conditions
>  * are met:
>  * 1. Redistributions of source code must retain the above copyright
>  *    notice, this list of conditions and the following disclaimer.
>  * 2. Redistributions in binary form must reproduce the above
>  *    copyright notice, this list of conditions and the following
>  *    disclaimer in the documentation and/or other materials provided
>  *    with the distribution.
>  * 3. The name of the author may not be used to endorse or promote
>  *    products derived from this software without specific prior
>  *    written permission.
>  *
>  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
>  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
>  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
>  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
>  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
>  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
>  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
>  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
>  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  */
>
> #include <sys/cdefs.h>
> __KERNEL_RCSID(0, "$NetBSD$");
>
> #include "locators.h"
>
> #include <sys/param.h>
> #include <sys/systm.h>
> #include <sys/device.h>
> #include <sys/errno.h>
>
> #include <machine/bus.h>
> #include <machine/cpu.h>
>
> #include <mips/alchemy/include/aubusvar.h>
> #include <mips/alchemy/include/aureg.h>
> #include <mips/alchemy/dev/aupscreg.h>
> #include <mips/alchemy/dev/aupscvar.h>
>
> struct aupsc_softc {
> 	struct device		sc_dev;
> 	bus_space_tag_t		sc_bst;
> 	bus_space_handle_t	sc_bsh;
> 	int			sc_pscsel;
> 	struct aupsc_ac97	sc_ac97;
> 	struct aupsc_i2s	sc_i2s;
> 	struct aupsc_spi	sc_spi;
> 	struct aupsc_smbus	sc_smbus;
> };
>
> static int	aupsc_match(struct device *, struct cfdata *, void *);
> static void	aupsc_attach(struct device *, struct device *, void *);
>
> CFATTACH_DECL(aupsc, sizeof(struct aupsc_softc),
>     aupsc_match, aupsc_attach, NULL, NULL);
>
> static int
> aupsc_match(struct device *parent, struct cfdata *cf, void *aux)
> {
> 	struct aubus_attach_args *aa = (struct aubus_attach_args *)aux;
>
> 	if (strcmp(aa->aa_name, cf->cf_name) != 0)
> 		return 0;
>
> 	return 1;
> }
>
> static void
> aupsc_attach(struct device *parent, struct device *self, void *aux)
> {
> 	struct aupsc_softc *sc = (struct aupsc_softc *)self;
> 	struct aubus_attach_args *aa = (struct aubus_attach_args *)aux;
>
> 	sc->sc_bst = aa->aa_st;
> 	if (bus_space_map(sc->sc_bst, aa->aa_addrs[0],
> 			AUPSC_SIZE, 0, &sc->sc_bsh) != 0) {
> 		printf(": unbale to map device registers\n");
> 		return;
> 	}
>
> 	sc->sc_pscsel = AUPSC_SEL_DISABLE;
>
> 	aprint_normal(": Alchemy PSC\n");
> }
>   
> ------------------------------------------------------------------------
>
> /* $NetBSD$ */
>
> /*-
>  * Copyright (c) 2006 Shigeyuki Fukushima.
>  * All rights reserved.
>  *
>  * Written by Shigeyuki Fukushima.
>  *
>  * Redistribution and use in source and binary forms, with or without
>  * modification, are permitted provided that the following conditions
>  * are met:
>  * 1. Redistributions of source code must retain the above copyright
>  *    notice, this list of conditions and the following disclaimer.
>  * 2. Redistributions in binary form must reproduce the above
>  *    copyright notice, this list of conditions and the following
>  *    disclaimer in the documentation and/or other materials provided
>  *    with the distribution.
>  * 3. The name of the author may not be used to endorse or promote
>  *    products derived from this software without specific prior
>  *    written permission.
>  *
>  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
>  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
>  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
>  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
>  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
>  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
>  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
>  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
>  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  */
>
> #ifndef _MIPS_ALCHEMY_DEV_AUPSCVAR_H_
> #define	_MIPS_ALCHEMY_DEV_AUPSCVAR_H_
>
> #include <dev/i2c/i2cvar.h>
> #include <dev/i2c/i2c_bitbang.h>
>
> struct aupsc_ac97 {
> };
>
> struct aupsc_i2s {
> };
>
> struct aupsc_spi {
> };
>
> struct aupsc_smbus {
> 	uint8_t			i2c_txen;
> 	struct i2c_controller	i2c_ctl;
> 	struct i2c_bitbang_ops	i2c_bops;
> 	struct lock		i2c_buslock;
> };
>
> #endif	/* _MIPS_ALCHEMY_DEV_AUPSCVAR_H_ */
>   


-- 
Garrett D'Amore, Principal Software Engineer
Tadpole Computer / Computing Technologies Division,
General Dynamics C4 Systems
http://www.tadpolecomputer.com/
Phone: 951 325-2134  Fax: 951 325-2191