[coreboot] [PATCH] coreboot: Don't loop forever waiting for HDA codecs

Uwe Hermann uwe at hermann-uwe.de
Tue Oct 7 02:42:07 CEST 2008


On Mon, Oct 06, 2008 at 06:11:15PM -0600, Jordan Crouse wrote:
> [PATCH] coreboot:  Don't loop forever waiting for HDA codecs
> 
> We shouldn't assume the presence of a working HDA codec, so put in
> a reasonable timeout of 50usecs (timeout value borrowed from the kernel).
> This makes SimNow work, since apparently though the codec is 
> present in Simnow, it is non functional.
> 
> Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>

Acked-by: Uwe Hermann <uwe at hermann-uwe.de>

(assuming this is build-tested). But see also below...


> Index: coreboot-v2/src/southbridge/amd/sb600/sb600_hda.c
> ===================================================================
> --- coreboot-v2.orig/src/southbridge/amd/sb600/sb600_hda.c	2008-10-06 18:00:06.000000000 -0600
> +++ coreboot-v2/src/southbridge/amd/sb600/sb600_hda.c	2008-10-06 18:10:32.000000000 -0600
> @@ -160,6 +160,32 @@
>  	return sizeof(cim_verb_data) / sizeof(u32);
>  }
>  

I'd add some (Doxygen) comment, at least saying "Don't loop forever
waiting for HDA codecs" or something more elaborate...


> +static int wait_for_ready(u8 *base)
> +{
> +	int timeout = 50;

A comment here why it's exactly 50 would be nice.


> +	while(timeout--) {
             ^
           space

> +		u32 dword=readl(base + 0x68);
                         ^^
                        spaces


> +		if (!(dword & 1))

Make the hardcoded "1" into a nice, descriptive #define?


> +			return 0;
> +		udelay(1);
> +	}
> +
> +	return -1;
> +}
> +
> +static int wait_for_valid(u8 *base)
> +{
> +	int timeout = 50;
> +	while(timeout--) {
             ^
           space

> +		u32 dword = readl(base + 0x68);
> +		if ((dword & 3) == 2)

Make the hardcoded "2" and "3" into nice, descriptive #defines?
Also the 0x68 register could be a #define.


> +			return 0;
> +		udelay(1);
> +	}
> +
> +	return 1;
> +}
> +
>  static void codec_init(u8 * base, int addr)
>  {
>  	u32 dword;
> @@ -168,16 +194,14 @@
>  	int i;
>  
>  	/* 1 */
> -	do {
> -		dword = readl(base + 0x68);
> -	} while (dword & 1);
> +	if (wait_for_ready(base) == -1)
> +		return;
>  
>  	dword = (addr << 28) | 0x000f0000;
>  	writel(dword, base + 0x60);
>  
> -	do {
> -		dword = readl(base + 0x68);
> -	} while ((dword & 3) != 2);
> +	if (wait_for_valid(base) == -1)
> +		return;
>  
>  	dword = readl(base + 0x64);
>  
> @@ -193,15 +217,13 @@
>  	printk_debug("verb_size: %d\n", verb_size);
>  	/* 3 */
>  	for (i = 0; i < verb_size; i++) {
> -		do {
> -			dword = readl(base + 0x68);
> -		} while (dword & 1);
> +		if (wait_for_ready(base) == -1)
> +			return;
>  
>  		writel(verb[i], base + 0x60);
>  
> -		do {
> -			dword = readl(base + 0x68);
> -		} while ((dword & 3) != 2);
> +		if (wait_for_valid(base) == -1)
> +			return;
>  	}
>  	printk_debug("verb loaded!\n");
>  }


Uwe.
-- 
http://www.hermann-uwe.de  | http://www.holsham-traders.de
http://www.crazy-hacks.org | http://www.unmaintained-free-software.org




More information about the coreboot mailing list