From: pixo@polepetko.eu
To: "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Cc: "Andre Przywara" <andre.przywara@amd.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Daniel P. Berrange" <berrange@redhat.com>,
"Longpeng(Mike)" <longpeng2@huawei.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Richard Henderson" <rth@twiddle.net>,
"Andreas Färber" <afaerber@suse.de>,
"Benoît Canet" <benoit@irqsave.net>,
"Paolo Bonzini" <pbonzini@redhat.com>,
qemu-devel@nongnu.org, qemu-trivial@nongnu.org,
"Philippe Mathieu-Daudé" <philippe.mathieu.daude@gmail.com>
Subject: Re: [Qemu-devel] [PATCH] AMD Processor Topology Information
Date: Thu, 09 Nov 2017 17:04:27 +0100 [thread overview]
Message-ID: <1c6e1d30b20c4b6963bca5f59585497a@polepetko.eu> (raw)
In-Reply-To: <111e80b1-025c-aa6c-1df8-27ded2258371@amsat.org>
Hi Philippe,
Most of the code for 'case 0x8000001E:' is a copy of 'case 4:' of the
same procedure in both cpu.c and kvm.c
Values were changes for AMD Zen architecture.
The only new code is 'case 0x8000001D:' which defines core topology.
Hope this info helps wit review.
On 2017-11-08 13:44, Philippe Mathieu-Daudé wrote:
> Hi Stanislav,
>
> This does not seem so trivial ;)
>
> Cc'ing more reviewers.
>
> On 11/03/2017 02:30 PM, Stanislav Lanci wrote:
>> V2:
>> Adds information about cache size and topology on leaf 0x8000001D for
>> family 17h
>> Without the added cache topology guest with SMT suffers latency
>> problems
>>
>> Add CPUID 0x8000001E for describing AMD Processor Topology Information
>> Disables warning about smt for 17h family of AMD CPUs
>>
>> Signed-off-by: Stanislav Lanci <pixo@polepetko.eu>
>> ---
>> target/i386/cpu.c | 93
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>> target/i386/kvm.c | 28 +++++++++++++++--
>> 2 files changed, 117 insertions(+), 4 deletions(-)
>>
>> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
>> index ddc45abd70..1545e3fe31 100644
>> --- a/target/i386/cpu.c
>> +++ b/target/i386/cpu.c
>> @@ -113,7 +113,9 @@
>> /* L1 instruction cache: */
>> #define L1I_LINE_SIZE 64
>> #define L1I_ASSOCIATIVITY 8
>> +#define L1I_ASSOC_AMD_ZEN 4
>> #define L1I_SETS 64
>> +#define L1I_SETS_AMD_ZEN 256
>> #define L1I_PARTITIONS 1
>> /* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 32KiB */
>> #define L1I_DESCRIPTOR CPUID_2_L1I_32KB_8WAY_64B
>> @@ -125,7 +127,9 @@
>> /* Level 2 unified cache: */
>> #define L2_LINE_SIZE 64
>> #define L2_ASSOCIATIVITY 16
>> +#define L2_ASSOC_AMD_ZEN 8
>> #define L2_SETS 4096
>> +#define L2_SETS_AMD_ZEN 1024
>> #define L2_PARTITIONS 1
>> /* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 4MiB */
>> /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
>> @@ -142,6 +146,7 @@
>> #define L3_N_LINE_SIZE 64
>> #define L3_N_ASSOCIATIVITY 16
>> #define L3_N_SETS 16384
>> +#define L3_N_SETS_AMD_ZEN 4096
>> #define L3_N_PARTITIONS 1
>> #define L3_N_DESCRIPTOR CPUID_2_L3_16MB_16WAY_64B
>> #define L3_N_LINES_PER_TAG 1
>> @@ -3072,6 +3077,91 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t
>> index, uint32_t count,
>> *edx = 0;
>> }
>> break;
>> + case 0x8000001D: /* AMD TOPOEXT cache info for ZEN */
>> + if (cpu->cache_info_passthrough) {
>> + host_cpuid(index, count, eax, ebx, ecx, edx);
>> + break;
>> + } else if ((env->cpuid_version & 0xFF00F00) == 0x800F00) {
>> + *eax = 0;
>> + switch (count) {
>> + case 0: /* L1 dcache info */
>> + *eax |= CPUID_4_TYPE_DCACHE | \
>> + CPUID_4_LEVEL(1) | \
>> + CPUID_4_SELF_INIT_LEVEL | \
>> + ((cs->nr_threads - 1) << 14);
>> + *ebx = (L1D_LINE_SIZE - 1) | \
>> + ((L1D_PARTITIONS - 1) << 12) | \
>> + ((L1D_ASSOCIATIVITY - 1) << 22);
>> + *ecx = L1D_SETS - 1;
>> + *edx = 0;
>> + break;
>> + case 1: /* L1 icache info */
>> + *eax |= CPUID_4_TYPE_ICACHE | \
>> + CPUID_4_LEVEL(1) | \
>> + CPUID_4_SELF_INIT_LEVEL | \
>> + ((cs->nr_threads - 1) << 14);
>> + *ebx = (L1I_LINE_SIZE - 1) | \
>> + ((L1I_PARTITIONS - 1) << 12) | \
>> + ((L1I_ASSOC_AMD_ZEN - 1) << 22);
>> + *ecx = L1I_SETS_AMD_ZEN - 1;
>> + *edx = 0;
>> + break;
>> + case 2: /* L2 cache info */
>> + *eax |= CPUID_4_TYPE_UNIFIED | \
>> + CPUID_4_LEVEL(2) | \
>> + CPUID_4_SELF_INIT_LEVEL | \
>> + ((cs->nr_threads - 1) << 14);
>> + *ebx = (L2_LINE_SIZE - 1) | \
>> + ((L2_PARTITIONS - 1) << 12) | \
>> + ((L2_ASSOC_AMD_ZEN - 1) << 22);
>> + *ecx = L2_SETS_AMD_ZEN - 1;
>> + *edx = CPUID_4_INCLUSIVE;
>> + break;
>> + case 3: /* L3 cache info */
>> + if (!cpu->enable_l3_cache) {
>> + *eax = 0;
>> + *ebx = 0;
>> + *ecx = 0;
>> + *edx = 0;
>> + break;
>> + }
>> + *eax |= CPUID_4_TYPE_UNIFIED | \
>> + CPUID_4_LEVEL(3) | \
>> + CPUID_4_SELF_INIT_LEVEL | \
>> + ((cs->nr_cores * cs->nr_threads - 1) << 14);
>> + *ebx = (L3_N_LINE_SIZE - 1) | \
>> + ((L3_N_PARTITIONS - 1) << 12) | \
>> + ((L3_N_ASSOCIATIVITY - 1) << 22);
>> + *ecx = L3_N_SETS_AMD_ZEN - 1;
>> + *edx = CPUID_4_NO_INVD_SHARING;
>> + break;
>> + default: /* end of info */
>> + *eax = 0;
>> + *ebx = 0;
>> + *ecx = 0;
>> + *edx = 0;
>> + break;
>> + }
>> + } else {
>> + *eax = 0;
>> + *ebx = 0;
>> + *ecx = 0;
>> + *edx = 0;
>> + }
>> + break;
>> + case 0x8000001E: /* AMD TOPOEXT cpu topology info for ZEN */
>> + if ((env->cpuid_version & 0xFF00F00) == 0x800F00) {
>> + *eax = cpu->apic_id;
>> + *ebx = (cs->nr_threads - 1) << 8 | cpu->core_id;
>> + *ecx = cpu->socket_id;
>> + *edx = 0;
>> + } else {
>> + *eax = 0;
>> + *ebx = 0;
>> + *ecx = 0;
>> + *edx = 0;
>> + }
>> + break;
>> case 0xC0000000:
>> *eax = env->cpuid_xlevel2;
>> *ebx = 0;
>> @@ -3742,7 +3832,8 @@ static void x86_cpu_realizefn(DeviceState *dev,
>> Error **errp)
>> * NOTE: the following code has to follow qemu_init_vcpu().
>> Otherwise
>> * cs->nr_threads hasn't be populated yet and the checking is
>> incorrect.
>> */
>> - if (!IS_INTEL_CPU(env) && cs->nr_threads > 1 && !ht_warned) {
>> + if (!IS_INTEL_CPU(env) && cs->nr_threads > 1 && !ht_warned && \
>> + (env->cpuid_version & 0xFF00F00) != 0x800F00) {
>> error_report("AMD CPU doesn't support hyperthreading. Please
>> configure"
>> " -smp options properly.");
>> ht_warned = true;
>> diff --git a/target/i386/kvm.c b/target/i386/kvm.c
>> index 6db7783edc..d6b4e1ae74 100644
>> --- a/target/i386/kvm.c
>> +++ b/target/i386/kvm.c
>> @@ -869,9 +869,31 @@ int kvm_arch_init_vcpu(CPUState *cs)
>> }
>> c = &cpuid_data.entries[cpuid_i++];
>>
>> - c->function = i;
>> - c->flags = 0;
>> - cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
>> + switch (i) {
>> + case 0x8000001d:
>> + for (j = 0; ; j++) {
>> + c->function = i;
>> + c->flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
>> + c->index = j;
>> + cpu_x86_cpuid(env, i, j, &c->eax, &c->ebx, &c->ecx,
>> &c->edx);
>> +
>> + if (c->eax == 0) {
>> + break;
>> + }
>> + if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
>> + fprintf(stderr, "cpuid_data is full, no space for
>> "
>> + "cpuid(eax:0x%x,ecx:0x%x)\n", i, j);
>> + abort();
>> + }
>> + c = &cpuid_data.entries[cpuid_i++];
>> + }
>> + break;
>> + default:
>> + c->function = i;
>> + c->flags = 0;
>> + cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx,
>> &c->edx);
>> + break;
>> + }
>> }
>>
>> /* Call Centaur's CPUID instructions they are supported. */
>>
next prev parent reply other threads:[~2017-11-09 16:04 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-03 17:30 [Qemu-devel] [PATCH] AMD Processor Topology Information Stanislav Lanci
2017-11-08 12:44 ` Philippe Mathieu-Daudé
2017-11-09 16:04 ` pixo [this message]
2018-01-25 21:56 ` Babu Moger
-- strict thread matches above, loose matches on Subject: below --
2017-10-29 21:22 Stanislav Lanci
2017-10-29 22:14 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1c6e1d30b20c4b6963bca5f59585497a@polepetko.eu \
--to=pixo@polepetko.eu \
--cc=afaerber@suse.de \
--cc=andre.przywara@amd.com \
--cc=benoit@irqsave.net \
--cc=berrange@redhat.com \
--cc=ehabkost@redhat.com \
--cc=f4bug@amsat.org \
--cc=longpeng2@huawei.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philippe.mathieu.daude@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-trivial@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).