Received: by 2002:a19:771d:0:0:0:0:0 with SMTP id s29csp1277584lfc; Wed, 1 Jun 2022 13:58:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxBo1mkqRu9F01eon+GuIr81UlBvhCEuWJjWzBI33PoqA7pAQOa3QKvWTahS27Df6UDsjHT X-Received: by 2002:a17:90a:e7c7:b0:1e6:8093:3fc2 with SMTP id kb7-20020a17090ae7c700b001e680933fc2mr648440pjb.7.1654117135401; Wed, 01 Jun 2022 13:58:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654117135; cv=none; d=google.com; s=arc-20160816; b=GGEebE/BOw4mXRJlNYFjG51smKwS/Z32YrizF3oyWD16JEOrBkVBRcUXI8lGYSM9gl 4tz2DjAAE0p79mXxfNt4VxekCzh+mQDHs1FUGJPwLZfe56UCzRvBQg6JoA7bLCFa8o4v xtBF+TwyNSpzyvUp6r5mnv+MPElYEc4cKQ/sQ864fhrNSF2j5Er3bHweNbpx1nu+L+1q PBCuTl4LJBTORzdTd+FOfmru1h+4AzYanoedoU7IJUGRaE/Hr5Y3KKpq0Jn+3H5hq0lY VRb8MZ5IJNRfTXQRK2LJsx1AvCfmkMEvZOsT9CuTfh9WaIh/8kUjIlu1yxVdqgrcaUnz HoWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=nA80fCdjT4lK6SgmXZdWqpPcUbhUEOdbdj0+26h0SvM=; b=HNtysNTsbE3gO8y0pmrECYYtJmLVL8sR4MvyEA6YL0PUtwBgg1ivoBsGkyCp9FWb2V +Kl2cMBEzACNJ7Fb3uxzuninVyIOA12NdcJUgB1v12b7A1wfdx76zR4ian+O4/jlwlBj OzVsZ/IGRWzCkZgeGjD6vDiP+ENoFTIML6StOctLYYW/mXrMDtQYxSYrrFSH/1gjQP0L 7dLAJapbom8EZGpROdh8JwC6NzZXy7A7A6Qg1DR737wiFgh3Vf21UHriabmBSx8zlfw4 bLjV4vHO7LKtHivtpD8nd2sZ1qzKGs9dQfB0eL2AUudmpxxyooA6Me0Wet7uOTa9/7/9 tYjg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=QYtLRf65; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id q9-20020a654949000000b003fc8f8ac636si3667381pgs.523.2022.06.01.13.58.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Jun 2022 13:58:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=QYtLRf65; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A41D62C651B; Wed, 1 Jun 2022 13:01:25 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240154AbiEaAMH (ORCPT + 99 others); Mon, 30 May 2022 20:12:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231827AbiEaAMG (ORCPT ); Mon, 30 May 2022 20:12:06 -0400 Received: from mail-oa1-x2d.google.com (mail-oa1-x2d.google.com [IPv6:2001:4860:4864:20::2d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9BA51101EB for ; Mon, 30 May 2022 17:12:04 -0700 (PDT) Received: by mail-oa1-x2d.google.com with SMTP id 586e51a60fabf-f2a4c51c45so16213891fac.9 for ; Mon, 30 May 2022 17:12:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=nA80fCdjT4lK6SgmXZdWqpPcUbhUEOdbdj0+26h0SvM=; b=QYtLRf65kMtILJleosMg1Kiu/TS3PrZzDyXQ0t28NEjm38jl1dkvS71XQBsJDnFbYa ycgg+XsLifypvPaqKlSMgdjoqN9dV+HnsW5FMVUPtQO5C9YFWlJpIobBGQYkqEC0t8lD N+IQR6Qzzf+biaBPNbB1jZIMIbPA6Db4HEUdw6Hc1R+U69PFF/82fUkB3LW8DzfQdjva I8sQNF2fQsMQXSn4fD3JHup9GsxW51bYBMYKCJ9JzQ6kGaEUGNrTykP0ZbkTgLl3Tl+Y KIRvAPI52LfgRtG+GKTIjTXi9LUD+Nl9nTy6rdBTxDi70Zt8VGOF3iqct70uMMUjys60 eLjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=nA80fCdjT4lK6SgmXZdWqpPcUbhUEOdbdj0+26h0SvM=; b=zEt1nZ6JGF8wYrpTLlk3vnLPiCiGoQluV5SXLX8z0emXh55VNXn7795e8PJhxuLSIY GAjglNdxzPWWILVYt2FAPCd7mRhdggfsqqgBORVtHLkoQbMCx/EmGOBV4VqLP0HGZ72w hV3YqNFodwuudhnQ4nt0+mpgEiIKGn4g2T17PUWLNOBLxg/ehpS9torZIG6vV2sAlcJU RFUI3sCO7ECzZDtctOYn6oLHIakekLTgWZwsjVPGE9diMrw+FIO32IeyF1UMnkNTnH5e LgiSpp2iO0BiNROItUqBiS7Zam3ixiNNrgHWmyidiUufsSUz7Cnq1wZE7A592eRV1xzC +c7A== X-Gm-Message-State: AOAM531SY7boVc3HSa8CdahIbqjUmSlTP//GOVdAKEqqpIZT+5Pk4lKt +O0+VnhtZT8nW3vz6V/m8fsu7vY8wZErVuAFCiTgS/ijvpAdppFh X-Received: by 2002:a05:6870:b00a:b0:f1:7f07:8c36 with SMTP id y10-20020a056870b00a00b000f17f078c36mr11730540oae.278.1653955923937; Mon, 30 May 2022 17:12:03 -0700 (PDT) MIME-Version: 1.0 References: <20220523235057.123882-1-atishp@rivosinc.com> <20220523235057.123882-12-atishp@rivosinc.com> In-Reply-To: <20220523235057.123882-12-atishp@rivosinc.com> From: Alistair Francis Date: Tue, 31 May 2022 10:11:37 +1000 Message-ID: Subject: Re: [PATCH v9 11/12] hw/riscv: virt: Add PMU DT node to the device tree To: Atish Patra Cc: Linux Kernel Mailing List , Alistair Francis , Bin Meng , Palmer Dabbelt , "qemu-devel@nongnu.org Developers" , "open list:RISC-V" Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 24, 2022 at 10:10 AM Atish Patra wrote: > > Qemu virt machine can support few cache events and cycle/instret counters. > It also supports counter overflow for these events. > > Add a DT node so that OpenSBI/Linux kernel is aware of the virt machine > capabilities. There are some dummy nodes added for testing as well. > > Signed-off-by: Atish Patra > Signed-off-by: Atish Patra Acked-by: Alistair Francis Alistair > --- > hw/riscv/virt.c | 28 +++++++++++++++++++++++ > target/riscv/cpu.c | 1 + > target/riscv/pmu.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ > target/riscv/pmu.h | 1 + > 4 files changed, 87 insertions(+) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index 3326f4db96a2..1b17ba7f8059 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -29,6 +29,7 @@ > #include "hw/char/serial.h" > #include "target/riscv/cpu.h" > #include "hw/core/sysbus-fdt.h" > +#include "target/riscv/pmu.h" > #include "hw/riscv/riscv_hart.h" > #include "hw/riscv/virt.h" > #include "hw/riscv/boot.h" > @@ -715,6 +716,32 @@ static void create_fdt_socket_aplic(RISCVVirtState *s, > aplic_phandles[socket] = aplic_s_phandle; > } > > +static void create_fdt_socket_pmu(RISCVVirtState *s, > + int socket, uint32_t *phandle, > + uint32_t *intc_phandles) > +{ > + int cpu; > + char *pmu_name; > + uint32_t *pmu_cells; > + MachineState *mc = MACHINE(s); > + RISCVCPU hart = s->soc[socket].harts[0]; > + > + pmu_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2); > + > + for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) { > + pmu_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]); > + pmu_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_PMU_OVF); > + } > + > + pmu_name = g_strdup_printf("/soc/pmu"); > + qemu_fdt_add_subnode(mc->fdt, pmu_name); > + qemu_fdt_setprop_string(mc->fdt, pmu_name, "compatible", "riscv,pmu"); > + riscv_pmu_generate_fdt_node(mc->fdt, hart.cfg.pmu_num, pmu_name); > + > + g_free(pmu_name); > + g_free(pmu_cells); > +} > + > static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap, > bool is_32_bit, uint32_t *phandle, > uint32_t *irq_mmio_phandle, > @@ -760,6 +787,7 @@ static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap, > &intc_phandles[phandle_pos]); > } > } > + create_fdt_socket_pmu(s, socket, phandle, intc_phandles); > } > > if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) { > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index a8f156a66eba..b51ad7496f71 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -1032,6 +1032,7 @@ static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, int max_str_len) > ISA_EDATA_ENTRY(zkt, ext_zkt), > ISA_EDATA_ENTRY(zve32f, ext_zve32f), > ISA_EDATA_ENTRY(zve64f, ext_zve64f), > + ISA_EDATA_ENTRY(sscofpmf, ext_sscofpmf), > ISA_EDATA_ENTRY(svinval, ext_svinval), > ISA_EDATA_ENTRY(svnapot, ext_svnapot), > ISA_EDATA_ENTRY(svpbmt, ext_svpbmt), > diff --git a/target/riscv/pmu.c b/target/riscv/pmu.c > index 7bb85d8d6ad7..0163758297c4 100644 > --- a/target/riscv/pmu.c > +++ b/target/riscv/pmu.c > @@ -20,11 +20,68 @@ > #include "cpu.h" > #include "pmu.h" > #include "sysemu/cpu-timers.h" > +#include "sysemu/device_tree.h" > > #define RISCV_TIMEBASE_FREQ 1000000000 /* 1Ghz */ > #define MAKE_32BIT_MASK(shift, length) \ > (((uint32_t)(~0UL) >> (32 - (length))) << (shift)) > > +/** > + * To keep it simple, any event can be mapped to any programmable counters in > + * QEMU. The generic cycle & instruction count events can also be monitored > + * using programmable counters. In that case, mcycle & minstret must continue > + * to provide the correct value as well. Heterogeneous PMU per hart is not > + * supported yet. Thus, number of counters are same across all harts. > + */ > +void riscv_pmu_generate_fdt_node(void *fdt, int num_ctrs, char *pmu_name) > +{ > + uint32_t fdt_event_ctr_map[20] = {}; > + uint32_t cmask; > + > + /* All the programmable counters can map to any event */ > + cmask = MAKE_32BIT_MASK(3, num_ctrs); > + > + /** > + * The event encoding is specified in the SBI specification > + * Event idx is a 20bits wide number encoded as follows: > + * event_idx[19:16] = type > + * event_idx[15:0] = code > + * The code field in cache events are encoded as follows: > + * event_idx.code[15:3] = cache_id > + * event_idx.code[2:1] = op_id > + * event_idx.code[0:0] = result_id > + */ > + > + /* SBI_PMU_HW_CPU_CYCLES: 0x01 : type(0x00) */ > + fdt_event_ctr_map[0] = cpu_to_be32(0x00000001); > + fdt_event_ctr_map[1] = cpu_to_be32(0x00000001); > + fdt_event_ctr_map[2] = cpu_to_be32(cmask | 1 << 0); > + > + /* SBI_PMU_HW_INSTRUCTIONS: 0x02 : type(0x00) */ > + fdt_event_ctr_map[3] = cpu_to_be32(0x00000002); > + fdt_event_ctr_map[4] = cpu_to_be32(0x00000002); > + fdt_event_ctr_map[5] = cpu_to_be32(cmask | 1 << 2); > + > + /* SBI_PMU_HW_CACHE_DTLB : 0x03 READ : 0x00 MISS : 0x00 type(0x01) */ > + fdt_event_ctr_map[6] = cpu_to_be32(0x00010019); > + fdt_event_ctr_map[7] = cpu_to_be32(0x00010019); > + fdt_event_ctr_map[8] = cpu_to_be32(cmask); > + > + /* SBI_PMU_HW_CACHE_DTLB : 0x03 WRITE : 0x01 MISS : 0x00 type(0x01) */ > + fdt_event_ctr_map[9] = cpu_to_be32(0x0001001B); > + fdt_event_ctr_map[10] = cpu_to_be32(0x0001001B); > + fdt_event_ctr_map[11] = cpu_to_be32(cmask); > + > + /* SBI_PMU_HW_CACHE_ITLB : 0x04 READ : 0x00 MISS : 0x00 type(0x01) */ > + fdt_event_ctr_map[12] = cpu_to_be32(0x00010021); > + fdt_event_ctr_map[13] = cpu_to_be32(0x00010021); > + fdt_event_ctr_map[14] = cpu_to_be32(cmask); > + > + /* This a OpenSBI specific DT property documented in OpenSBI docs */ > + qemu_fdt_setprop(fdt, pmu_name, "riscv,event-to-mhpmcounters", > + fdt_event_ctr_map, sizeof(fdt_event_ctr_map)); > +} > + > static bool riscv_pmu_counter_valid(RISCVCPU *cpu, uint32_t ctr_idx) > { > if (ctr_idx < 3 || ctr_idx >= RV_MAX_MHPMCOUNTERS || > diff --git a/target/riscv/pmu.h b/target/riscv/pmu.h > index 036653627f78..3004ce37b636 100644 > --- a/target/riscv/pmu.h > +++ b/target/riscv/pmu.h > @@ -31,5 +31,6 @@ int riscv_pmu_init(RISCVCPU *cpu, int num_counters); > int riscv_pmu_update_event_map(CPURISCVState *env, uint64_t value, > uint32_t ctr_idx); > int riscv_pmu_incr_ctr(RISCVCPU *cpu, enum riscv_pmu_event_idx event_idx); > +void riscv_pmu_generate_fdt_node(void *fdt, int num_counters, char *pmu_name); > int riscv_pmu_setup_timer(CPURISCVState *env, uint64_t value, > uint32_t ctr_idx); > -- > 2.25.1 > >