#define X86_FEATURE_AMD_IBRS           (13*32+14) /* "" Indirect Branch Restricted Speculation */
 #define X86_FEATURE_AMD_STIBP          (13*32+15) /* "" Single Thread Indirect Branch Predictors */
 #define X86_FEATURE_AMD_STIBP_ALWAYS_ON        (13*32+17) /* "" Single Thread Indirect Branch Predictors always-on preferred */
+#define X86_FEATURE_AMD_PPIN           (13*32+23) /* Protected Processor Inventory Number */
 #define X86_FEATURE_AMD_SSBD           (13*32+24) /* "" Speculative Store Bypass Disable */
 #define X86_FEATURE_VIRT_SSBD          (13*32+25) /* Virtualized Speculative Store Bypass Disable */
 #define X86_FEATURE_AMD_SSB_NO         (13*32+26) /* "" Speculative Store Bypass is fixed in hardware. */
 
        per_cpu(cpu_llc_id, cpu) = c->phys_proc_id;
 }
 
+static void amd_detect_ppin(struct cpuinfo_x86 *c)
+{
+       unsigned long long val;
+
+       if (!cpu_has(c, X86_FEATURE_AMD_PPIN))
+               return;
+
+       /* When PPIN is defined in CPUID, still need to check PPIN_CTL MSR */
+       if (rdmsrl_safe(MSR_AMD_PPIN_CTL, &val))
+               goto clear_ppin;
+
+       /* PPIN is locked in disabled mode, clear feature bit */
+       if ((val & 3UL) == 1UL)
+               goto clear_ppin;
+
+       /* If PPIN is disabled, try to enable it */
+       if (!(val & 2UL)) {
+               wrmsrl_safe(MSR_AMD_PPIN_CTL,  val | 2UL);
+               rdmsrl_safe(MSR_AMD_PPIN_CTL, &val);
+       }
+
+       /* If PPIN_EN bit is 1, return from here; otherwise fall through */
+       if (val & 2UL)
+               return;
+
+clear_ppin:
+       clear_cpu_cap(c, X86_FEATURE_AMD_PPIN);
+}
+
 u16 amd_get_nb_id(int cpu)
 {
        return per_cpu(cpu_llc_id, cpu);
        amd_detect_cmp(c);
        amd_get_topology(c);
        srat_detect_node(c);
+       amd_detect_ppin(c);
 
        init_amd_cacheinfo(c);
 
 
 
        if (this_cpu_has(X86_FEATURE_INTEL_PPIN))
                rdmsrl(MSR_PPIN, m->ppin);
+       else if (this_cpu_has(X86_FEATURE_AMD_PPIN))
+               rdmsrl(MSR_AMD_PPIN, m->ppin);
 
        m->microcode = boot_cpu_data.microcode;
 }