Skip to content
Snippets Groups Projects
processor.h 25 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	u64 aperf, mperf;
    };
    
    static inline void get_aperfmperf(struct aperfmperf *am)
    {
    	WARN_ON_ONCE(!boot_cpu_has(X86_FEATURE_APERFMPERF));
    
    	rdmsrl(MSR_IA32_APERF, am->aperf);
    	rdmsrl(MSR_IA32_MPERF, am->mperf);
    }
    
    #define APERFMPERF_SHIFT 10
    
    static inline
    unsigned long calc_aperfmperf_ratio(struct aperfmperf *old,
    				    struct aperfmperf *new)
    {
    	u64 aperf = new->aperf - old->aperf;
    	u64 mperf = new->mperf - old->mperf;
    	unsigned long ratio = aperf;
    
    	mperf >>= APERFMPERF_SHIFT;
    	if (mperf)
    		ratio = div64_u64(aperf, mperf);
    
    	return ratio;
    }
    
    
    /*
     * AMD errata checking
     */
    #ifdef CONFIG_CPU_SUP_AMD
    
    extern const int amd_erratum_383[];
    
    extern const int amd_erratum_400[];
    
    extern bool cpu_has_amd_erratum(const int *);
    
    #define AMD_LEGACY_ERRATUM(...)		{ -1, __VA_ARGS__, 0 }
    #define AMD_OSVW_ERRATUM(osvw_id, ...)	{ osvw_id, __VA_ARGS__, 0 }
    #define AMD_MODEL_RANGE(f, m_start, s_start, m_end, s_end) \
    	((f << 24) | (m_start << 16) | (s_start << 12) | (m_end << 4) | (s_end))
    #define AMD_MODEL_RANGE_FAMILY(range)	(((range) >> 24) & 0xff)
    #define AMD_MODEL_RANGE_START(range)	(((range) >> 12) & 0xfff)
    #define AMD_MODEL_RANGE_END(range)	((range) & 0xfff)
    
    #else
    #define cpu_has_amd_erratum(x)	(false)
    #endif /* CONFIG_CPU_SUP_AMD */
    
    
    #endif /* _ASM_X86_PROCESSOR_H */