Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Dec 2005 13:18:13 +0200
From:      Ruslan Ermilov <ru@FreeBSD.org>
To:        Artemiev Igor <ai@bmc.brk.ru>
Cc:        freebsd-current@FreeBSD.org
Subject:   Re: cvs commit: src/sys/pci amdpm.c
Message-ID:  <20051216111813.GE41326@ip.net.ua>
In-Reply-To: <20051216134225.09aa93a3.ai@bmc.brk.ru>
References:  <200512141749.jBEHnjRV081112@repoman.freebsd.org> <20051214183345.GE51686@ip.net.ua> <20051215093643.694e995b.ai@bmc.brk.ru> <200512151306.57961.jhb@freebsd.org> <20051216083657.GA41326@ip.net.ua> <20051216134225.09aa93a3.ai@bmc.brk.ru>

next in thread | previous in thread | raw e-mail | index | archive | help

--L2Brqb15TUChFOBK
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Fri, Dec 16, 2005 at 01:42:25PM +0300, Artemiev Igor wrote:
> > OK, I looked some more, and I doubt the usefullness of the
> > nForce-2/3/4 support in its current shape.  Perhaps I'm mistaken and
> > you can shed a light on this.  :-)
> > The amdpm(4) driver originally supported AMD-756's PMC SMBus 1.0.
> > Later, AMD-8111 support was added.  All of these AMDs seem to support
> > both SMBus 2.0 and SMBus 1.0 interfaces, and the driver uses the SMBus
> > 1.0 interface (offset 0xe0).   The nForce seems to also support SMBus
> > 1.0 interface (offset 0).  At least, the following lm_sensors pages
> > amd AMD-8111 datasheet confirm this:
> >=20
> > 	http://www.lm-sensors.org/supported.html
> > 	http://www2.lm-sensors.nu/~lm78/cvs/lm_sensors2/doc/busses/i2c-amd756
> > 	http://www2.lm-sensors.nu/~lm78/cvs/lm_sensors2/doc/busses/i2c-amd8111
> >=20
> > Now, the same supported.html page and googling says that nForce2/3/4
> > MCPs all use SMBus 2.0 interface similar to AMD-8111 SMBus 2amd86.0
> > interface.  But we don't support SMBus 2.0 interface in amdpm(4)!
> > (lm_sensors, OTOH, does implement SMBus 2.0.).
> i2c-amd756.c, i2c-amd8111.c and i2c-nforce2.c looks very similar for me.
> Differences between i2c-amd756 and i2c-nforce2.c/i2c-amd8111.c in
> pair ioctl.
>=20
i2c-amd8111.c and i2c-nforce2.c are indeed very similar, because they
both use SMBus 2.0 API.  :-)

But i2c-amd756.c, which also handles AMD-8111 SMBus 1.0, and is similar
to FreeBSD's amdpm.c, uses a different API (SMBus 1.0).  Are you sure
the following fragments look similar to you?

http://www2.lm-sensors.nu/~lm78/cvs/browse.cgi/lm_sensors2/kernel/busses/i2=
c-amd756.c
http://www2.lm-sensors.nu/~lm78/cvs/browse.cgi/lm_sensors2/kernel/busses/i2=
c-nforce2.c

Let's consider I2C_SMBUS_QUICK+I2C_SMBUS_WRITE case, which is in FreeBSD's
smb(4) spelling is:

     SMB_QUICK_WRITE    The QuickWrite command just issues the device addre=
ss
                        with write intent to the bus, without transferring =
any
                        data.

I've added offsets in `//' style comments...

   203	static s32 amd756_access(struct i2c_adapter * adap, u16 addr,
   204			  unsigned short flags, char read_write,
   205			  u8 command, int size, union i2c_smbus_data * data)
   206	{
   207		int i, len;
   208=09
   209		/** TODO: Should I supporte the 10-bit transfers? */
   210		switch (size) {
   211		/* TODO: proc call is supported, I'm just not sure what to do here.=
=2E. */
   212		case I2C_SMBUS_QUICK:
   213			outw_p(((addr & 0x7f) << 1) | (read_write & 0x01),
   214			       SMB_HOST_ADDRESS);		// (0x4 + amd756_ioport)
   215			size =3D AMD756_QUICK;
   216			break;
[...]
   264		/* How about enabling interrupts... */
   265		outw_p(size & GE_CYC_TYPE_MASK, SMB_GLOBAL_ENABLE);	// (0x2 + amd75=
6_ioport) word
   266=09
   267		if (amd756_transaction())	/* Error in transaction */
   268			return -1;
   269=09
   270		if ((read_write =3D=3D I2C_SMBUS_WRITE) || (size =3D=3D AMD756_QUIC=
K))
   271			return 0;



   141	s32 nforce2_access(struct i2c_adapter * adap, u16 addr, unsigned sho=
rt flags,
   142			char read_write, u8 command, int size,
   143			union i2c_smbus_data * data)
   144	{
   145		struct nforce2_smbus *smbus =3D adap->algo_data;
   146		unsigned char protocol, pec, temp;
   147		unsigned char len =3D 0; /* to keep the compiler quiet */
   148		int i;
   149=09
   150		protocol =3D (read_write =3D=3D I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_=
READ : NVIDIA_SMB_PRTCL_WRITE;
   151		pec =3D (flags & I2C_CLIENT_PEC) ? NVIDIA_SMB_PRTCL_PEC : 0;
   152=09
   153		switch (size) {
   154=09
   155			case I2C_SMBUS_QUICK:
   156				protocol |=3D NVIDIA_SMB_PRTCL_QUICK;
   157				read_write =3D I2C_SMBUS_WRITE;
   158				break;
[...]
   214		}
   215=09
   216		outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR);		// smbus->base + 0x02=
 (byte)
   217		outb_p(protocol, NVIDIA_SMB_PRTCL);			// smbus->base + 0x00 (byte)
   218=09
   219		temp =3D inb_p(NVIDIA_SMB_STS);				// smbus->base + 0x01 (byte)
   220=09
   221		if (~temp & NVIDIA_SMB_STS_DONE) {
   222			udelay(500);
   223			temp =3D inb_p(NVIDIA_SMB_STS);
   224		}
   225		if (~temp & NVIDIA_SMB_STS_DONE) {
   226			i2c_delay(HZ/100);
   227			temp =3D inb_p(NVIDIA_SMB_STS);
   228		}
   229=09
   230		if ((~temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)=
) {
   231			printk(KERN_DEBUG "i2c-nforce2.o: SMBus Timeout! (0x%02x)\n",
   232			       temp);
   233			return -1;
   234		}
   235=09
   236		if (read_write =3D=3D I2C_SMBUS_WRITE)
   237			return 0;

See how the offset 0x2 register means completely different things.


Cheers,
--=20
Ruslan Ermilov
ru@FreeBSD.org
FreeBSD committer

--L2Brqb15TUChFOBK
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (FreeBSD)

iD8DBQFDoqJ1qRfpzJluFF4RAgDYAKCGdajD3GfCD9OzsYTkb9Nph7YMnACfYG47
Xfr+95AmFva/CjM6YOdM9p0=
=nrSp
-----END PGP SIGNATURE-----

--L2Brqb15TUChFOBK--



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