Subject: Re: port-i386/19163: VIA C3 processor isn't recognized correctly
To: Bang Jun-Young <junyoung@netbsd.org>
From: Jaromir Dolecek <jdolecek@netbsd.org>
List: netbsd-bugs
Date: 12/06/2002 09:51:43
Is it really necessary to grow struct cpuinfo? It's kinda annoying
since it means all LKMs need to be rebuilt, system version bumped
etc.

Jaromir

Bang Jun-Young wrote:
> On Thu, Dec 05, 2002 at 11:40:40PM +0900, Takahiro Kambe wrote:
> > What's differ about "3DNOW" cpu feature?
> 
> Could you try with the following patch?
> 
> Index: i386/machdep.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/arch/i386/i386/machdep.c,v
> retrieving revision 1.500
> diff -u -r1.500 machdep.c
> --- i386/machdep.c	2002/12/05 16:19:08	1.500
> +++ i386/machdep.c	2002/12/06 01:08:47
> @@ -341,6 +341,7 @@
>  void amd_family5_setup __P((struct cpu_info *));
>  void transmeta_cpu_setup __P((struct cpu_info *));
>  
> +static void via_cpu_probe __P((struct cpu_info *));
>  static void amd_family6_probe __P((struct cpu_info *));
>  
>  static void transmeta_cpu_info __P((struct cpu_info *));
> @@ -792,8 +793,8 @@
>  				"K5 or K6"		/* Default */
>  			},
>  			amd_family5_setup,
> -			amd_cpuid_cpu_cacheinfo,
>  			NULL,
> +			amd_cpuid_cpu_cacheinfo,
>  		},
>  		/* Family 6 */
>  		{
> @@ -818,7 +819,7 @@
>  				"Unknown K7 (Athlon)"	/* Default */
>  			},
>  			NULL,
> -			amd_cpuid_cpu_cacheinfo,
> +			NULL,
>  			NULL,
>  		} }
>  	},
> @@ -969,8 +970,8 @@
>  				"C3"	/* Default */
>  			},
>  			NULL,
> +			via_cpu_probe,
>  			NULL,
> -			NULL,
>  		},
>  		/* Family > 6, not yet available from VIA */
>  		{
> @@ -1098,6 +1099,29 @@
>  	    : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)	\
>  	    : "a" (code));
>  
> +void
> +via_cpu_probe(struct cpu_info *ci)
> +{
> +	u_int descs[4];
> +	u_int lfunc;
> +
> +	/*
> +	 * Determine the largest extended function value.
> +	 */
> +	CPUID(0x80000000, descs[0], descs[1], descs[2], descs[3]);
> +	lfunc = descs[0];
> +
> +	/*
> +	 * Determine the extended feature flags.
> +	 */
> +	if (lfunc >= 0x80000001) {
> +		CPUID(0x80000001, descs[0], descs[1], descs[2], descs[3]);
> +		ci->ci_feature_flags = descs[3];
> +		ci->ci_feature_str2 = CPUID_EXT_FLAGS2;
> +		ci->ci_feature_str3 = CPUID_EXT_FLAGS3;
> +	}
> +}
> +
>  static void
>  cpu_probe_base_features(struct cpu_info *ci)
>  {
> @@ -1121,6 +1145,14 @@
>  
>  	CPUID(1, ci->ci_signature, miscbytes, dummy1, ci->ci_feature_flags);
>  
> +	/*
> +	 * These may be overridden with vendor specific strings in
> +	 * (*ci_info)() later.
> +	 */
> +	ci->ci_feature_str1 = CPUID_FLAGS1;
> +	ci->ci_feature_str2 = CPUID_FLAGS2;
> +	ci->ci_feature_str3 = CPUID_FLAGS3;
> +
>  	/* Brand is low order 8 bits of ebx */
>  	ci->ci_brand_id = miscbytes & 0xff;
>  
> @@ -1213,14 +1245,25 @@
>  void
>  amd_family6_probe(struct cpu_info *ci)
>  {
> -	u_int32_t eax;
> -	u_int32_t dummy1, dummy2, dummy3;
> +	u_int32_t lfunc;
> +	u_int32_t descs[4];
>  	u_int32_t brand[12];
>  	char *p;
>  	int i;
> +
> +	CPUID(0x80000000, lfunc, descs[1], descs[2], descs[3]);
> +
> +	/*
> +	 * Determine the extended feature flags.
> +	 */
> +	if (lfunc >= 0x80000001) {
> +		CPUID(0x80000001, descs[0], descs[1], descs[2], descs[3]);
> +		ci->ci_feature_flags |= descs[3];
> +		ci->ci_feature_str2 = CPUID_EXT_FLAGS2;
> +		ci->ci_feature_str3 = CPUID_EXT_FLAGS3;
> +	}
>  
> -	CPUID(0x80000000, eax, dummy1, dummy2, dummy3);
> -	if (eax < 0x80000004)
> +	if (lfunc < 0x80000004)
>  		return;
>  	
>  	CPUID(0x80000002, brand[0], brand[1], brand[2], brand[3]);
> @@ -1795,18 +1838,18 @@
>  
>  	if (ci->ci_feature_flags) {
>  		if ((ci->ci_feature_flags & CPUID_MASK1) != 0) {
> -			bitmask_snprintf(ci->ci_feature_flags, CPUID_FLAGS1,
> -			    buf, sizeof(buf));
> +			bitmask_snprintf(ci->ci_feature_flags,
> +			    ci->ci_feature_str1, buf, sizeof(buf));
>  			printf("%s: features %s\n", cpuname, buf);
>  		}
>  		if ((ci->ci_feature_flags & CPUID_MASK2) != 0) {
> -			bitmask_snprintf(ci->ci_feature_flags, CPUID_FLAGS2,
> -			    buf, sizeof(buf));
> +			bitmask_snprintf(ci->ci_feature_flags,
> +			    ci->ci_feature_str2, buf, sizeof(buf));
>  			printf("%s: features %s\n", cpuname, buf);
>  		}
>  		if ((ci->ci_feature_flags & CPUID_MASK3) != 0) {
> -			bitmask_snprintf(ci->ci_feature_flags, CPUID_FLAGS3,
> -			    buf, sizeof(buf));
> +			bitmask_snprintf(ci->ci_feature_flags,
> +			    ci->ci_feature_str3, buf, sizeof(buf));
>  			printf("%s: features %s\n", cpuname, buf);
>  		}
>  	}
> Index: include/cpu.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/arch/i386/include/cpu.h,v
> retrieving revision 1.90
> diff -u -r1.90 cpu.h
> --- include/cpu.h	2002/11/28 21:43:55	1.90
> +++ include/cpu.h	2002/12/06 01:08:47
> @@ -127,6 +127,9 @@
>  	int32_t		ci_cpuid_level;
>  	u_int32_t	ci_signature;	 /* X86 cpuid type */
>  	u_int32_t	ci_feature_flags;/* X86 CPUID feature bits */
> +	char *		ci_feature_str1; /* Vendor specific feature strings */
> +	char *		ci_feature_str2;
> +	char *		ci_feature_str3;
>  	u_int32_t	ci_cpu_class;	 /* CPU class */
>  	u_int32_t	ci_brand_id;	 /* Intel brand id */
>  	u_int32_t	ci_vendor[4];	 /* vendor string */
> Index: include/specialreg.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/arch/i386/include/specialreg.h,v
> retrieving revision 1.25
> diff -u -r1.25 specialreg.h
> --- include/specialreg.h	2002/12/05 17:25:26	1.25
> +++ include/specialreg.h	2002/12/06 01:08:47
> @@ -133,6 +133,20 @@
>  #define CPUID_FLAGS3	"\20\31FXSR\32SSE\33SSE2\34SS\35HTT\36TM\37B30\40SBF"
>  #define CPUID_MASK3	0xff000000
>  
> +/*
> + * AMD/VIA processor specific flags.
> + */
> +
> +#define CPUID_MPC	0x00080000	/* Multiprocessing Capable */
> +#define CPUID_MMXX	0x00400000	/* AMD MMX Extensions */
> +#define CPUID_3DNOW2	0x40000000	/* 3DNow! Instruction Extension */
> +#define CPUID_3DNOW	0x80000000	/* 3DNow! Instructions */
> +
> +#define CPUID_EXT_FLAGS2	"\20\16PGE\17MCA\20CMOV\21PAT\22PSE36\23PN" \
> +				    "\24MPC\25B20\26B21\27MMXX\30MMX"
> +#define CPUID_EXT_FLAGS3	"\20\31FXSR\32SSE\33B26\34B27\35B28\36B29" \
> +				    "\0373DNOW2\0403DNOW"
> +
>  #define CPUID2FAMILY(cpuid)	(((cpuid) >> 8) & 15)
>  #define CPUID2MODEL(cpuid)	(((cpuid) >> 4) & 15)
>  #define CPUID2STEPPING(cpuid)	((cpuid) & 15)
> 
> Jun-Young
> 
> -- 
> Bang Jun-Young <junyoung@netbsd.org>
> 


-- 
Jaromir Dolecek <jdolecek@NetBSD.org>            http://www.NetBSD.org/
-=- We should be mindful of the potential goal, but as the tantric    -=-
-=- Buddhist masters say, ``You may notice during meditation that you -=-
-=- sometimes levitate or glow.   Do not let this distract you.''     -=-