136 lines
4.7 KiB
Diff
136 lines
4.7 KiB
Diff
|
From d0826a8c2c3c389eeeed1014d7e316f39f083971 Mon Sep 17 00:00:00 2001
|
||
|
From: Jing Liu <jing2.liu@intel.com>
|
||
|
Date: Wed, 16 Feb 2022 22:04:31 -0800
|
||
|
Subject: [PATCH 09/24] x86: Add AMX CPUIDs enumeration
|
||
|
|
||
|
RH-Author: Paul Lai <plai@redhat.com>
|
||
|
RH-MergeRequest: 176: Enable KVM AMX support
|
||
|
RH-Commit: [9/13] fab147992ad927c9538529f018f06e2f48546c5b
|
||
|
RH-Bugzilla: 1916415
|
||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||
|
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||
|
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
|
||
|
Add AMX primary feature bits XFD and AMX_TILE to
|
||
|
enumerate the CPU's AMX capability. Meanwhile, add
|
||
|
AMX TILE and TMUL CPUID leaf and subleaves which
|
||
|
exist when AMX TILE is present to provide the maximum
|
||
|
capability of TILE and TMUL.
|
||
|
|
||
|
Signed-off-by: Jing Liu <jing2.liu@intel.com>
|
||
|
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||
|
Message-Id: <20220217060434.52460-6-yang.zhong@intel.com>
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
(cherry picked from commit f21a48171cf3fa39532fc8553fd82e81b88b6474)
|
||
|
Signed-off-by: Paul Lai <plai@redhat.com>
|
||
|
---
|
||
|
target/i386/cpu.c | 55 ++++++++++++++++++++++++++++++++++++++++---
|
||
|
target/i386/kvm/kvm.c | 4 +++-
|
||
|
2 files changed, 55 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||
|
index cd27c0eb81..09e08f7f38 100644
|
||
|
--- a/target/i386/cpu.c
|
||
|
+++ b/target/i386/cpu.c
|
||
|
@@ -574,6 +574,18 @@ static CPUCacheInfo legacy_l3_cache = {
|
||
|
#define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
|
||
|
#define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
|
||
|
|
||
|
+/* CPUID Leaf 0x1D constants: */
|
||
|
+#define INTEL_AMX_TILE_MAX_SUBLEAF 0x1
|
||
|
+#define INTEL_AMX_TOTAL_TILE_BYTES 0x2000
|
||
|
+#define INTEL_AMX_BYTES_PER_TILE 0x400
|
||
|
+#define INTEL_AMX_BYTES_PER_ROW 0x40
|
||
|
+#define INTEL_AMX_TILE_MAX_NAMES 0x8
|
||
|
+#define INTEL_AMX_TILE_MAX_ROWS 0x10
|
||
|
+
|
||
|
+/* CPUID Leaf 0x1E constants: */
|
||
|
+#define INTEL_AMX_TMUL_MAX_K 0x10
|
||
|
+#define INTEL_AMX_TMUL_MAX_N 0x40
|
||
|
+
|
||
|
void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
|
||
|
uint32_t vendor2, uint32_t vendor3)
|
||
|
{
|
||
|
@@ -843,8 +855,8 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||
|
"avx512-vp2intersect", NULL, "md-clear", NULL,
|
||
|
NULL, NULL, "serialize", NULL,
|
||
|
"tsx-ldtrk", NULL, NULL /* pconfig */, NULL,
|
||
|
- NULL, NULL, NULL, "avx512-fp16",
|
||
|
- NULL, NULL, "spec-ctrl", "stibp",
|
||
|
+ NULL, NULL, "amx-bf16", "avx512-fp16",
|
||
|
+ "amx-tile", "amx-int8", "spec-ctrl", "stibp",
|
||
|
NULL, "arch-capabilities", "core-capability", "ssbd",
|
||
|
},
|
||
|
.cpuid = {
|
||
|
@@ -909,7 +921,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||
|
.type = CPUID_FEATURE_WORD,
|
||
|
.feat_names = {
|
||
|
"xsaveopt", "xsavec", "xgetbv1", "xsaves",
|
||
|
- NULL, NULL, NULL, NULL,
|
||
|
+ "xfd", NULL, NULL, NULL,
|
||
|
NULL, NULL, NULL, NULL,
|
||
|
NULL, NULL, NULL, NULL,
|
||
|
NULL, NULL, NULL, NULL,
|
||
|
@@ -5593,6 +5605,43 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
+ case 0x1D: {
|
||
|
+ /* AMX TILE */
|
||
|
+ *eax = 0;
|
||
|
+ *ebx = 0;
|
||
|
+ *ecx = 0;
|
||
|
+ *edx = 0;
|
||
|
+ if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (count == 0) {
|
||
|
+ /* Highest numbered palette subleaf */
|
||
|
+ *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
|
||
|
+ } else if (count == 1) {
|
||
|
+ *eax = INTEL_AMX_TOTAL_TILE_BYTES |
|
||
|
+ (INTEL_AMX_BYTES_PER_TILE << 16);
|
||
|
+ *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
|
||
|
+ *ecx = INTEL_AMX_TILE_MAX_ROWS;
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ case 0x1E: {
|
||
|
+ /* AMX TMUL */
|
||
|
+ *eax = 0;
|
||
|
+ *ebx = 0;
|
||
|
+ *ecx = 0;
|
||
|
+ *edx = 0;
|
||
|
+ if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (count == 0) {
|
||
|
+ /* Highest numbered palette subleaf */
|
||
|
+ *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ }
|
||
|
case 0x40000000:
|
||
|
/*
|
||
|
* CPUID code in kvm_arch_init_vcpu() ignores stuff
|
||
|
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||
|
index b5d98c4361..a64a79d870 100644
|
||
|
--- a/target/i386/kvm/kvm.c
|
||
|
+++ b/target/i386/kvm/kvm.c
|
||
|
@@ -1779,7 +1779,9 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||
|
c = &cpuid_data.entries[cpuid_i++];
|
||
|
}
|
||
|
break;
|
||
|
- case 0x14: {
|
||
|
+ case 0x14:
|
||
|
+ case 0x1d:
|
||
|
+ case 0x1e: {
|
||
|
uint32_t times;
|
||
|
|
||
|
c->function = i;
|
||
|
--
|
||
|
2.35.3
|
||
|
|