[coreboot] mcp55 patch

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Sun Aug 10 22:23:44 CEST 2008


On 09.08.2008 23:19, ron minnich wrote:
> This patch reconciles mcp55 to the new pci changes.
>
> Gets much further. Adds usb debug code.
>
> Last change of the day. 
>
> Add stage1.h to the files for standard defines used by all stage1 functions. 
>
> Modify all functions to use the new v3 pci operations calling conventions. 
> Uncomment delayx and let it take a full int. 
>
> Add the USB debug support function. 
> This is compiling pretty well for me save for the missing hypertransport function. 
>
> Signed-off-by: Ronald G. Minnich <rminnich at gmail.com>
>   

It would be great if you could split the big patch in a few smaller
ones, each doing one thing. Suggested splitting mentioned in the review
below.
The Ack is for all small patches (or, if unavoidable, for the big one).

Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

>
> Index: southbridge/nvidia/mcp55/stage1.c
> ===================================================================
> --- southbridge/nvidia/mcp55/stage1.c	(revision 726)
> +++ southbridge/nvidia/mcp55/stage1.c	(working copy)
> @@ -26,8 +26,7 @@
>  #include <cpu.h>
>  #include <amd/k8/k8.h>
>  #include "mcp55.h"
> -#define pci_read_config32(bus, dev, where) pci_cf8_conf1.read32(NULL, bus, dev, where)
> -#define pci_write_config32(bus, dev, where, what) pci_cf8_conf1.write32(NULL, bus, dev, where, what)
> +#include "stage1.h"
>  
>  #warning fix disgusting define of MCP55_NUM it is mainboard dependent
>  #define MCP55_NUM 1
> @@ -139,13 +138,12 @@
>  
>  
>  }
> -static void delayx(u8 value) {
> -#if 1
> +static void delayx(unsigned int value) {
> +
>  	int i;
>  	for(i=0;i<0x8000;i++) {
> -		outb(value, 0x80);
> +		inb(0x80);
>  	}
> -#endif
>  }
>   

delayx() as a separate patch, please. It's useful and we may want to do
the same in v2.
Or we could kill it altogether and use udelay() from
arch/x86/udelay_io.c. It's the same code anyway.

>  
>  static void mcp55_early_pcie_setup(unsigned busnx, unsigned devnx, unsigned anactrl_io_base, unsigned pci_e_x)
> @@ -154,11 +152,10 @@
>  	u32 pll_ctrl;
>  	u32 dword;
>  	int i;
> -	u32 dev;
> -	//	dev = PCI_BDF(busnx, devnx+1, 1);
> -	dword = pci_read_config32(busnx, (devnx+1)<<3 | 1, 0xe4);
> +	u32 bdf = PCI_BDF(busnx, devnx+1, 1);
> +	dword = pci_read_config32(bdf, 0xe4);
>  	dword |= 0x3f0; // disable it at first
> -	pci_write_config32(busnx,  (devnx+1)<<3 | 1, 0xe4, dword);
> +	pci_write_config32(bdf, 0xe4, dword);
>  
>  	for(i=0; i<3; i++) {
>  		tgio_ctrl = inl(anactrl_io_base + 0xcc);
> @@ -180,9 +177,9 @@
>  //	wait 100us
>  	delayx(1);
>  
> -	dword = pci_read_config32(busnx,  (devnx+1)<<3 | 1, 0xe4);
> +	dword = pci_read_config32(bdf, 0xe4);
>  	dword &= ~(0x3f0); // enable
> -	pci_write_config32(busnx,  (devnx+1)<<3 | 1, 0xe4, dword);
> +	pci_write_config32(bdf, 0xe4, dword);
>  
>  //	need to wait 100ms
>  	delayx(1000);
> @@ -403,8 +400,9 @@
>  		busnx = ht_c_index * HT_CHAIN_BUSN_D;
>  		for(devnx=0;devnx<0x20;devnx++) {
>  			u32 id;
> -			//			dev = PCI_BDF(busnx, devnx, 0);
> -			id = pci_read_config32(busnx, devnx<<3, PCI_VENDOR_ID);
> +			u32 bdf;
> +			bdf = PCI_BDF(busnx, devnx, 0);
> +			id = pci_read_config32(bdf, PCI_VENDOR_ID);
>  			if(id == 0x036910de) {
>  				busn[mcp55_num] = busnx;
>  				devn[mcp55_num] = devnx;
> Index: southbridge/nvidia/mcp55/stage1_usbdebug.c
> ===================================================================
> --- southbridge/nvidia/mcp55/stage1_usbdebug.c	(revision 0)
> +++ southbridge/nvidia/mcp55/stage1_usbdebug.c	(revision 0)
> @@ -0,0 +1,55 @@
> +/*
> + * This file is part of the coreboot project.
> + *
> + * Copyright (C) 2004 Tyan Computer
> + * Written by Yinghai Lu <yhlu at tyan.com> for Tyan Computer.
> + * Copyright (C) 2006,2007 AMD
> + * Written by Yinghai Lu <yinghai.lu at amd.com> for AMD.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
> + */
> +
> +/* This should probably be a config variable. */
> +#if HT_CHAIN_END_UNITID_BASE != 0x20
> +	#define MCP55_DEVN_BASE	HT_CHAIN_END_UNITID_BASE
> +#else
> +	#define MCP55_DEVN_BASE	HT_CHAIN_UNITID_BASE
> +#endif
> +
> +#define EHCI_BAR_INDEX	0x10
> +#define EHCI_BAR	0xFEF00000
> +#define EHCI_DEBUG_OFFSET	0x98
> +
> +#include "pci.h"
> +#include "stage1.h"
> +static void set_debug_port(unsigned port)
> +{
> +	u32 dword;
> +	u32 bdf = PCI_BDF(0, MCP55_DEVN_BASE+2, 1);
> +	dword = pci_read_config32(bdf, 0x74);
> +	dword &= ~(0xf<<12);
> +	dword |= (port<<12);
> +	pci_write_config32(bdf, 0x74, dword);
> +
> +}
> +
> +static void mcp55_enable_usbdebug_direct(unsigned port)
> +{
> +	u32 bdf = PCI_BDF(0, MCP55_DEVN_BASE+2, 1);
> +	set_debug_port(port);
> +	pci_write_config32(bdf, EHCI_BAR_INDEX, EHCI_BAR);
> +	pci_write_config8(bdf, 0x04, 0x2); // mem space enabe
>   

Typo: enable

> +}
> +
>   

USB debug as a separate patch, please.

> Index: southbridge/nvidia/mcp55/stage1.h
> ===================================================================
> --- southbridge/nvidia/mcp55/stage1.h	(revision 0)
> +++ southbridge/nvidia/mcp55/stage1.h	(revision 0)
> @@ -0,0 +1,24 @@
> +/*
> + * This file is part of the coreboot project.
> + *
> + * Copyright (C) 2008 Ronald G. Minnich
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
> + */
> +#define pci_read_config32(bdf, where) pci_cf8_conf1.read32(bdf, where)
> +#define pci_write_config32(bdf, where, what) pci_cf8_conf1.write32(bdf, where, what)
> +#define pci_read_config16(bdf, where) pci_cf8_conf1.read32(bdf, where)
> +#define pci_write_config16(bdf, where, what) pci_cf8_conf1.write32(bdf, where, what)
> +#define pci_locate_device(vid, did, slot) pci_cf8_conf1.find(vid, did, slot)
>   


> Index: southbridge/nvidia/mcp55/stage1_smbus.c
> ===================================================================
> --- southbridge/nvidia/mcp55/stage1_smbus.c	(revision 728)
> +++ southbridge/nvidia/mcp55/stage1_smbus.c	(working copy)
> @@ -5,6 +5,7 @@
>   * Written by Yinghai Lu <yhlu at tyan.com> for Tyan Computer.
>   * Copyright (C) 2006,2007 AMD
>   * Written by Yinghai Lu <yinghai.lu at amd.com> for AMD.
> + * Copyright (C) 2008 Ronald G. Minnich (for v3)
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License as published by
> @@ -26,10 +27,7 @@
>  #include <device/device.h>
>  #include <device/pci.h>
>  #include "mcp55.h"
> -#define pci_read_config32(bus, dev, where) pci_cf8_conf1.read32(NULL, bus, dev, where)
> -#define pci_write_config32(bus, dev, where, what) pci_cf8_conf1.write32(NULL, bus, dev, where, what)
> -#define pci_read_config16(bus, dev, where) pci_cf8_conf1.read32(NULL, bus, dev, where)
> -#define pci_write_config16(bus, dev, where, what) pci_cf8_conf1.write32(NULL, bus, dev, where, what)
> +#include "stage1.h"
>  #include "mcp55_smbus.h"
>  
>  #define SMBUS0_IO_BASE	0x1000
> @@ -38,20 +36,17 @@
>  
>  static void enable_smbus(void)
>  {
> -	u32 dev;
> -	dev = pci_locate_device(PCI_ID(0x10de, 0x0368), 0);
> -#if 0
> -	if (dev == PCI_DEV_INVALID) {
> +	u32 bdf;
> +	if (!pci_locate_device(0x10de, 0x0368, &bdf)) {
>   

In theory, the device model should allow us to call enable_smbus with
the right device as argument.

>  		die("SMBUS controller not found\r\n");
>  	}
>  
> -	printk(BIOS_DEBUG, "SMBus controller enabled\r\n");
> -#endif
> +	printk(BIOS_DEBUG, "SMBus controller enabled\n");
>  	/* set smbus iobase */
> -	pci_write_config32(0, dev, 0x20, SMBUS0_IO_BASE | 1);
> -	pci_write_config32(0, dev, 0x24, SMBUS1_IO_BASE | 1);
> +	pci_write_config32(bdf, 0x20, SMBUS0_IO_BASE | 1);
> +	pci_write_config32(bdf, 0x24, SMBUS1_IO_BASE | 1);
>  	/* Set smbus iospace enable */
> -	pci_write_config16(0, dev, 0x4, 0x01);
> +	pci_write_config16(bdf, 0x4, 0x01);
>  	/* clear any lingering errors, so the transaction will run */
>  	outb(inb(SMBUS0_IO_BASE + SMBHSTSTAT), SMBUS0_IO_BASE + SMBHSTSTAT);
>  	outb(inb(SMBUS1_IO_BASE + SMBHSTSTAT), SMBUS1_IO_BASE + SMBHSTSTAT);
>
>   

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/





More information about the coreboot mailing list