From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785934; cv=none; d=zohomail.com; s=zohoarc; b=kJKoe8qqzWw/cKoaYVU5SZznSm8Ocg7U547CMZGji7g05L9DsypzDpV9xyTuAI6HSu/ISeyMJ3pXfiroj3/EZRsP9GhxXBUXPoJkCq9JaR6xSyaewg72BHFcw5mhwU8biIq5KNe/KgHX0bZk2dIvw0lcc6VlC8BmPqveT4spPZw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785934; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0dJd7rPBObktu7Dct4MA8bg8pCcWYHCPBssdWvlBGw8=; b=i5/hohM2rBDQVKn29qdzO4Te59NYG3woKYQt39NPohhXMqyBjSGlpbm18RW6qLFb600zbTjQ0U/iAw0VMlYMvqERiayZLQuxUTHpiJs1YxmDM78JRb/SEnPxPeAgxZ/D0aT7dVZ+glM9Dc/U8f/fs7QCwxBVdZaQSDY7MiA4JtY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785934199628.1609894203393; Mon, 1 Sep 2025 21:05:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2a-0007La-Nm; Mon, 01 Sep 2025 23:50:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2H-0006TQ-OS for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:24 -0400 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2E-0004wZ-1b for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:20 -0400 Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822RodB012377 for ; Tue, 2 Sep 2025 03:50:16 GMT Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48ut2fea7k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:15 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-76e2eb787f2so5321454b3a.3 for ; Mon, 01 Sep 2025 20:50:15 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 0dJd7rPBObktu7Dct4MA8bg8pCcWYHCPBssdWvlBGw8=; b=MLIOZee5iLHYeY73 dnPma6J1hoBip2/WiykYqikr6ugbwvTiBAHxxd3wLy/EuM4kx9qhwtRYJtflkBAV b/8mKvrzTNiNZavsWZATamkYMSb8jAxFuqyZRUtjyoOVKww1p3QwHIUSsvSBfLQm SuPBUeCsE0rTF5gHF0emR+o+ZdcX4BoK/5nb+Nz/KyV7waJwaJnjE6Vwvgtdw82+ 1vf+Xsc0hqxu9dCTChoMEy/QfiigMJS0BFhA4PKZycwbs7Q2ajD5EpwwqxrPZIvm 8YvsBuiSPOJ7Ys4jhIp26lc57AanUB/334isxLG0vgJBji4yRGr17WwzJMk/vkVx 6fYVJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785004; x=1757389804; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0dJd7rPBObktu7Dct4MA8bg8pCcWYHCPBssdWvlBGw8=; b=PLl8pmGwyO/uqn/S3p4f0INZn+clWxgvTU9gESUo/lxTQ7/0KqWJpYM23DinK8CA1X 2Tpak5MPo5v7/ziMpZZN/y6uRiKeUKadJc0Kvrgyg89cFJ3zUUnKC6D57OVo6bCziJGO bN49lpu6O2dXwv4h/j14OzkyJdSlHdUEL79+rDxtK4vU7ZdQMo3FAVHvFSBIsb9Y0JyU 3oIsecjnBPky3os3kfZUBNoXBpQ1DdmCnGyvuIeBQdBYMd6AZsbTE4lzo8MGT4IooFWg H3OM4YMqDbopplFT9Enx25y4J1Zal8aINYBn6iSD9t4TaS6wN9+8UKzdzB6zsd+Q1AJg 6OYg== X-Gm-Message-State: AOJu0YxA5KF7kFuVZbFcaKIJC3jtbGMZspjgUd7Nh6TihSY252EHYnsv QzqCrH5Dq7/KuNQ5U5vz+O2D/SYRcuqcTMAgQeyigpkV95znDnyZn6b+7ND4oe31s2QM3W73cbd Bp26qyEON9fgadyaOiH9VxV2Xg4lTTWPru9qjpxDV+ILVvOKJjieKL7hugIgNypfL1/C5 X-Gm-Gg: ASbGncvqVTPZ81pvX/EU6RQDkKOum3XgQf4BQ9/qZUKw5tbPrMTXImB4ph0WHJ3m1Cc LYBW8Wi1rJvfddFAoAz6o6XjNL08m8C5LUNgvPHt6xyUJxN8nsubLk3ehGoRF766+WhIRPtZcIl BN19onYhIkMXL01ZvKSEvGDOK4Cvl3mFJYMZ57SG7nyE/Sgb35JTDRVvwrQcsnBIEeybvP8ItI8 FpDCkh8Kf/obmCAO/In8r4SlVUOqzD6s4H5RwMYCb+uB+DSLZgFJIbkqq4xM782goZUUm604CHn 1E4yitaeK1ZvK7YfkSqNIcvxPPMI2ne2uyrfLmywjwMo6nM9zJ5bprVXE1Ggkdb8UbZDdbttPIU 4r3k1Z1c19+5u X-Received: by 2002:a05:6a20:3d1c:b0:243:d52d:729d with SMTP id adf61e73a8af0-243d6f0ba6dmr14145302637.34.1756785003706; Mon, 01 Sep 2025 20:50:03 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEMheqv0nNu/LJw+HDJx9VN9VGZMoO6URYuYYoBm5TrqdUCvHU9CHc655n2VmxsbceQU3xpBQ== X-Received: by 2002:a05:6a20:3d1c:b0:243:d52d:729d with SMTP id adf61e73a8af0-243d6f0ba6dmr14145264637.34.1756785003150; Mon, 01 Sep 2025 20:50:03 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com Subject: [PATCH v2 01/11] hw/hexagon: Add globalreg model Date: Mon, 1 Sep 2025 20:49:41 -0700 Message-Id: <20250902034951.1948194-2-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAzOCBTYWx0ZWRfX+09BFDLzRFkj rgMlQQhWZee1a1MeQoiMDwPe3Bf+WclBBOpWTzWdLlbbs4oy9+D15AJovgD7hzGyALch4BfXOja +X7NUQXpJw9/8/zHmcopuEdxw+aBfMNiRvrc9qxIrPNNMUL2/R7Ab1sjzRJI76bSLhfxTnqg3vP J5kSwNBa45giFS6sDryY6gxJSK3i5/MUXCKqteMjHrZmAeSyH1s7af/n1jLtT30dzApt6sgERU8 JLJajsI/DpGm0npLDKMVBdrLsxBUqe4cmyz1cWYpqG0HJNgzVMqV5DvaOdV0/PGuSKSWLJwgXJT SbWDFdCsWUEKFf/jkONXwRd2s0EIac3G+5jSHgagulW45cOlX/xbXo9RltGJCkrrbzEp9J7nVWg G3p3trrC X-Proofpoint-ORIG-GUID: hEFjbdnYYBFEbwwoo9eAt1itcQywg0UT X-Proofpoint-GUID: hEFjbdnYYBFEbwwoo9eAt1itcQywg0UT X-Authority-Analysis: v=2.4 cv=U7iSDfru c=1 sm=1 tr=0 ts=68b66978 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=VMLKkawWpi7FIoa_xNcA:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 phishscore=0 clxscore=1015 impostorscore=0 suspectscore=0 malwarescore=0 priorityscore=1501 adultscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300038 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.168.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785935716124100 Some of the system registers are shared among all threads in the core. This object contains the representation and interface to the system registers. Signed-off-by: Brian Cain --- include/hw/hexagon/hexagon_globalreg.h | 60 ++++++ target/hexagon/cpu.h | 1 + hw/hexagon/hexagon_globalreg.c | 269 +++++++++++++++++++++++++ target/hexagon/cpu.c | 2 + 4 files changed, 332 insertions(+) create mode 100644 include/hw/hexagon/hexagon_globalreg.h create mode 100644 hw/hexagon/hexagon_globalreg.c diff --git a/include/hw/hexagon/hexagon_globalreg.h b/include/hw/hexagon/he= xagon_globalreg.h new file mode 100644 index 0000000000..01eac06056 --- /dev/null +++ b/include/hw/hexagon/hexagon_globalreg.h @@ -0,0 +1,60 @@ +/* + * Hexagon Global Registers QOM Object + * + * Copyright(c) 2025 Qualcomm Innovation Center, Inc. All Rights Reserved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HEXAGON_GLOBALREG_H +#define HEXAGON_GLOBALREG_H + +#include "hw/qdev-core.h" +#include "hw/sysbus.h" +#include "qom/object.h" +#include "target/hexagon/cpu.h" + +#define TYPE_HEXAGON_GLOBALREG "hexagon-globalreg" +OBJECT_DECLARE_SIMPLE_TYPE(HexagonGlobalRegState, HEXAGON_GLOBALREG) + +struct HexagonGlobalRegState { + SysBusDevice parent_obj; + + /* Array of system registers */ + target_ulong regs[NUM_SREGS]; + + /* Global performance cycle counter base */ + uint64_t g_pcycle_base; + + /* Properties for global register reset values */ + uint32_t boot_evb; /* Boot Exception Vector Base (HEX_SREG_E= VB) */ + uint64_t config_table_addr; /* Configuration table base */ + uint32_t dsp_rev; /* DSP revision register (HEX_SREG_REV) */ + + /* ISDB properties */ + bool isdben_etm_enable; /* ISDB ETM enable bit */ + bool isdben_dfd_enable; /* ISDB DFD enable bit */ + bool isdben_trusted; /* ISDB trusted mode bit */ + bool isdben_secure; /* ISDB secure mode bit */ + + /* Hardware base addresses */ + uint32_t qtimer_base_addr; /* QTimer hardware base address */ +}; + +/* Public interface functions */ +uint32_t hexagon_globalreg_read(HexagonCPU *cpu, uint32_t reg); +void hexagon_globalreg_write(HexagonCPU *cpu, uint32_t reg, + uint32_t value); +uint32_t hexagon_globalreg_masked_value(HexagonCPU *cpu, uint32_t reg, + uint32_t value); +void hexagon_globalreg_write_masked(HexagonCPU *cpu, uint32_t reg, + uint32_t value); +void hexagon_globalreg_reset(HexagonCPU *cpu); + +/* Global performance cycle counter access */ +uint64_t hexagon_globalreg_get_pcycle_base(HexagonCPU *cpu); +void hexagon_globalreg_set_pcycle_base(HexagonCPU *cpu, uint64_t value); + +/* Hardware base address access */ +uint32_t hexagon_globalreg_get_qtimer_base_addr(HexagonCPU *cpu); + +#endif /* HEXAGON_GLOBALREG_H */ diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h index 39d6983263..89c634a09c 100644 --- a/target/hexagon/cpu.h +++ b/target/hexagon/cpu.h @@ -197,6 +197,7 @@ struct ArchCPU { uint32_t num_tlbs; uint32_t l2vic_base_addr; uint32_t boot_addr; + struct HexagonGlobalRegState *globalregs; #endif }; =20 diff --git a/hw/hexagon/hexagon_globalreg.c b/hw/hexagon/hexagon_globalreg.c new file mode 100644 index 0000000000..da943f7261 --- /dev/null +++ b/hw/hexagon/hexagon_globalreg.c @@ -0,0 +1,269 @@ +/* + * Hexagon Global Registers + * + * Copyright(c) 2025 Qualcomm Innovation Center, Inc. All Rights Reserved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/hexagon/hexagon.h" +#include "hw/hexagon/hexagon_globalreg.h" +#include "hw/qdev-properties.h" +#include "hw/sysbus.h" +#include "hw/resettable.h" +#include "migration/vmstate.h" +#include "qom/object.h" +#include "target/hexagon/cpu.h" +#include "target/hexagon/hex_regs.h" +#include "qemu/log.h" +#include "qapi/error.h" + +#define IMMUTABLE (~0) +#define INVALID_REG_VAL 0xdeadbeef + +/* Global system register mutability masks */ +static const uint32_t global_sreg_immut_masks[NUM_SREGS] =3D { + [HEX_SREG_EVB] =3D 0x000000ff, + [HEX_SREG_MODECTL] =3D IMMUTABLE, + [HEX_SREG_SYSCFG] =3D 0x80001c00, + [HEX_SREG_IPENDAD] =3D IMMUTABLE, + [HEX_SREG_VID] =3D 0xfc00fc00, + [HEX_SREG_VID1] =3D 0xfc00fc00, + [HEX_SREG_BESTWAIT] =3D 0xfffffe00, + [HEX_SREG_IAHL] =3D 0x00000000, + [HEX_SREG_SCHEDCFG] =3D 0xfffffee0, + [HEX_SREG_CFGBASE] =3D IMMUTABLE, + [HEX_SREG_DIAG] =3D 0x00000000, + [HEX_SREG_REV] =3D IMMUTABLE, + [HEX_SREG_ISDBST] =3D IMMUTABLE, + [HEX_SREG_ISDBCFG0] =3D 0xe0000000, + [HEX_SREG_BRKPTPC0] =3D 0x00000003, + [HEX_SREG_BRKPTCFG0] =3D 0xfc007000, + [HEX_SREG_BRKPTPC1] =3D 0x00000003, + [HEX_SREG_BRKPTCFG1] =3D 0xfc007000, + [HEX_SREG_ISDBMBXIN] =3D IMMUTABLE, + [HEX_SREG_ISDBMBXOUT] =3D 0x00000000, + [HEX_SREG_ISDBEN] =3D 0xfffffffe, + [HEX_SREG_TIMERLO] =3D IMMUTABLE, + [HEX_SREG_TIMERHI] =3D IMMUTABLE, +}; + +static void hexagon_globalreg_init(Object *obj) +{ + HexagonGlobalRegState *s =3D HEXAGON_GLOBALREG(obj); + + memset(s->regs, 0, sizeof(target_ulong) * NUM_SREGS); +} + +static inline uint32_t apply_write_mask(uint32_t new_val, uint32_t cur_val, + uint32_t reg_mask) +{ + if (reg_mask) { + return (new_val & ~reg_mask) | (cur_val & reg_mask); + } + return new_val; +} + +static void read_timer(HexagonGlobalRegState *s, uint32_t *low, uint32_t *= high) +{ + /* Not yet implemented */ + *low =3D 0; + *high =3D 0; +} + +uint32_t hexagon_globalreg_read(HexagonCPU *cpu, uint32_t reg) +{ + g_assert(reg < NUM_SREGS); + g_assert(reg >=3D HEX_SREG_GLB_START); + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + + uint32_t value; + uint32_t low; + uint32_t high; + if ((reg =3D=3D HEX_SREG_TIMERLO) || (reg =3D=3D HEX_SREG_TIMERHI)) { + read_timer(s, &low, &high); + value =3D (reg =3D=3D HEX_SREG_TIMERLO) ? low : high; + } else { + value =3D s->regs[reg]; + } + + return value; +} + +void hexagon_globalreg_write(HexagonCPU *cpu, uint32_t reg, + uint32_t value) +{ + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + g_assert(reg < NUM_SREGS); + g_assert(reg >=3D HEX_SREG_GLB_START); + s->regs[reg] =3D value; +} + +uint32_t hexagon_globalreg_masked_value(HexagonCPU *cpu, uint32_t reg, + uint32_t value) +{ + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + g_assert(reg < NUM_SREGS); + g_assert(reg >=3D HEX_SREG_GLB_START); + const uint32_t reg_mask =3D global_sreg_immut_masks[reg]; + return reg_mask =3D=3D IMMUTABLE ? + s->regs[reg] : + apply_write_mask(value, s->regs[reg], reg_mask); +} + +void hexagon_globalreg_write_masked(HexagonCPU *cpu, uint32_t reg, + uint32_t value) +{ + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + s->regs[reg] =3D hexagon_globalreg_masked_value(cpu, reg, value); +} + +uint64_t hexagon_globalreg_get_pcycle_base(HexagonCPU *cpu) +{ + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + return s->g_pcycle_base; +} + +void hexagon_globalreg_set_pcycle_base(HexagonCPU *cpu, uint64_t value) +{ + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + s->g_pcycle_base =3D value; +} + +uint32_t hexagon_globalreg_get_qtimer_base_addr(HexagonCPU *cpu) +{ + HexagonGlobalRegState *s =3D cpu->globalregs; + g_assert(s); + return s->qtimer_base_addr; +} + +static void do_hexagon_globalreg_reset(HexagonGlobalRegState *s) +{ + g_assert(s); + memset(s->regs, 0, sizeof(target_ulong) * NUM_SREGS); + + s->g_pcycle_base =3D 0; + + s->regs[HEX_SREG_EVB] =3D s->boot_evb; + s->regs[HEX_SREG_CFGBASE] =3D HEXAGON_CFG_ADDR_BASE(s->config_table_ad= dr); + s->regs[HEX_SREG_REV] =3D s->dsp_rev; + + target_ulong isdben_val =3D 0; + if (s->isdben_etm_enable) { + isdben_val |=3D (1 << 0); /* ETM enable bit */ + } + if (s->isdben_dfd_enable) { + isdben_val |=3D (1 << 1); /* DFD enable bit */ + } + if (s->isdben_trusted) { + isdben_val |=3D (1 << 2); /* Trusted bit */ + } + if (s->isdben_secure) { + isdben_val |=3D (1 << 3); /* Secure bit */ + } + s->regs[HEX_SREG_ISDBEN] =3D isdben_val; + s->regs[HEX_SREG_MODECTL] =3D 0x1; + + /* + * These register indices are placeholders in these arrays + * and their actual values are synthesized from state elsewhere. + * We can initialize these with invalid values so that if we + * mistakenly generate reads, they will look obviously wrong. + */ + s->regs[HEX_SREG_PCYCLELO] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PCYCLEHI] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_TIMERLO] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_TIMERHI] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT0] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT1] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT2] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT3] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT4] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT5] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT6] =3D INVALID_REG_VAL; + s->regs[HEX_SREG_PMUCNT7] =3D INVALID_REG_VAL; +} + +static void hexagon_globalreg_realize(DeviceState *dev, Error **errp) +{ +} + +void hexagon_globalreg_reset(HexagonCPU *cpu) +{ + do_hexagon_globalreg_reset(cpu->globalregs); +} + +static void hexagon_globalreg_reset_hold(Object *obj, ResetType type) +{ + HexagonGlobalRegState *s =3D HEXAGON_GLOBALREG(obj); + do_hexagon_globalreg_reset(s); +} + +static const VMStateDescription vmstate_hexagon_globalreg =3D { + .name =3D "hexagon_globalreg", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]){ + VMSTATE_UINT32_ARRAY(regs, HexagonGlobalRegState, NUM_SREGS), + VMSTATE_UINT64(g_pcycle_base, HexagonGlobalRegState), + VMSTATE_UINT32(boot_evb, HexagonGlobalRegState), + VMSTATE_UINT64(config_table_addr, HexagonGlobalRegState), + VMSTATE_UINT32(dsp_rev, HexagonGlobalRegState), + VMSTATE_BOOL(isdben_etm_enable, HexagonGlobalRegState), + VMSTATE_BOOL(isdben_dfd_enable, HexagonGlobalRegState), + VMSTATE_BOOL(isdben_trusted, HexagonGlobalRegState), + VMSTATE_BOOL(isdben_secure, HexagonGlobalRegState), + VMSTATE_UINT32(qtimer_base_addr, HexagonGlobalRegState), + VMSTATE_END_OF_LIST() + } +}; + +static const Property hexagon_globalreg_properties[] =3D { + DEFINE_PROP_UINT32("boot-evb", HexagonGlobalRegState, boot_evb, 0x0), + DEFINE_PROP_UINT64("config-table-addr", HexagonGlobalRegState, + config_table_addr, 0xffffffffULL), + DEFINE_PROP_UINT32("dsp-rev", HexagonGlobalRegState, dsp_rev, 0), + DEFINE_PROP_BOOL("isdben-etm-enable", HexagonGlobalRegState, + isdben_etm_enable, false), + DEFINE_PROP_BOOL("isdben-dfd-enable", HexagonGlobalRegState, + isdben_dfd_enable, false), + DEFINE_PROP_BOOL("isdben-trusted", HexagonGlobalRegState, + isdben_trusted, false), + DEFINE_PROP_BOOL("isdben-secure", HexagonGlobalRegState, + isdben_secure, false), + DEFINE_PROP_UINT32("qtimer-base-addr", HexagonGlobalRegState, + qtimer_base_addr, 0), +}; + +static void hexagon_globalreg_class_init(ObjectClass *klass, const void *d= ata) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + dc->realize =3D hexagon_globalreg_realize; + rc->phases.hold =3D hexagon_globalreg_reset_hold; + dc->vmsd =3D &vmstate_hexagon_globalreg; + dc->user_creatable =3D false; + device_class_set_props(dc, hexagon_globalreg_properties); +} + +static const TypeInfo hexagon_globalreg_info =3D { + .name =3D TYPE_HEXAGON_GLOBALREG, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(HexagonGlobalRegState), + .instance_init =3D hexagon_globalreg_init, + .class_init =3D hexagon_globalreg_class_init, +}; + +static void hexagon_globalreg_register_types(void) +{ + type_register_static(&hexagon_globalreg_info); +} + +type_init(hexagon_globalreg_register_types) diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c index 751ba613cc..256fdc177e 100644 --- a/target/hexagon/cpu.c +++ b/target/hexagon/cpu.c @@ -70,6 +70,8 @@ static const Property hexagon_cpu_properties[] =3D { DEFINE_PROP_UINT32("l2vic-base-addr", HexagonCPU, l2vic_base_addr, 0xffffffffULL), DEFINE_PROP_UINT32("exec-start-addr", HexagonCPU, boot_addr, 0xfffffff= fULL), + DEFINE_PROP_LINK("global-regs", HexagonCPU, globalregs, + TYPE_HEXAGON_GLOBALREG, HexagonGlobalRegState *), #endif DEFINE_PROP_BOOL("lldb-compat", HexagonCPU, lldb_compat, false), DEFINE_PROP_UNSIGNED("lldb-stack-adjust", HexagonCPU, lldb_stack_adjus= t, 0, --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756786380; cv=none; d=zohomail.com; s=zohoarc; b=dxkTdIb+81HH6u4jumanYpGi2wEKNT6bT9ElYTCJPIwoQ9Uond/TEVYBg9+Y9fIbJq/b9V0L6/yegtKRjULDlF8mw/8VEbV2HfNSTwzLYRdbQtpj0WCeyP+Trti2FkzaHVC5nDTKPJhjV9NcVwEFi2C3bUuRazKZV+olArMtD+8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756786380; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mAFIrWMBruvfJHq4yaW9qvutFMaGoHhoHMNbAZc19cw=; b=OWGOIVOciaFcEW2a1O8MWlWRa4FD31VidcMcOfRQ0XeY5DrBKDI+Jzigyt+UShnapFKZ3OSt+05JytO9SByTyn3UZkDuxbJBKfEPDcSpFfPk2IkJXysa3nLWStOK8z6ymt88RRIB/197zmdlS1YJevIdShHuiQMACd0QOFYIlfo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756786380915401.162111532297; Mon, 1 Sep 2025 21:13:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2t-0007j7-LD; Mon, 01 Sep 2025 23:51:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2N-0006b7-Ur for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:28 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2L-0004wC-2S for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:27 -0400 Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822S9g6030176 for ; Tue, 2 Sep 2025 03:50:14 GMT Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48w8wy26ux-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:14 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-3234811cab3so6085975a91.3 for ; Mon, 01 Sep 2025 20:50:13 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= mAFIrWMBruvfJHq4yaW9qvutFMaGoHhoHMNbAZc19cw=; b=OiL/GRH5/ex7eY/R EBrGoTQrjmyMW7aY3L0eQAfr6Auq6InY3+rd2Web2rugw1o9WpcRsifnQSW0REXG GksQIOTTJEuPsSOwk1kYcVEEWSOP5cY25sWogRCIjesxGNh/UZ4WxmLzfw9fiJI3 yjR4tz2VvjAN5at/GFe+/EW4GNXUucWXZiDQCn6UgP7PURYinCYZsieLvWw232hp NsqKHZda/+xjEPrzEvV983aK2elllJ8CaaS8DU1Qk1AI5mchi4b1QB3q64+MCUgy DfalgtTY+puwAmi2TZ6mVQsFWUmXKE7zJ7kEzRUGYKBUwIBs1fCbscayd1k4T4rV qoa+LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785005; x=1757389805; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mAFIrWMBruvfJHq4yaW9qvutFMaGoHhoHMNbAZc19cw=; b=k3k/AoyYgiBA3MVGh0/V9F0P62niHKf7Y8DIqfFa5MWsJIXZisovkyRvt0L2yZIADa 4pgzId2KejyfbW3LtOCHE8kZA/OOV+xLy0nz+PrbHWda5L+ed/lYlLDQNsCXaltpC/so QEgjPuyoloztkhz6ysnQJkFyxkvmxzJ48yPHlCzQxrXv70VnHm0CkYnFWVvvDW6k2ioT UrPBpjdI2TmZuDmm0oiG2Gd4RWkj5Omyqnp8CaOuBu7m088qvok4JlHAIx3WnOsRfZ/7 59kJY0i8FCqSuscKIpJTRD8gWEJoMOjOKyPkfZayjU3Sm+pCv1Kym+AAIXCq+l+FK+nB H+Yg== X-Gm-Message-State: AOJu0Yxf3Oeca1lyfBMOeVA8y2lhFc7Q4tTmevpJTZmp1D08Ty821U0/ sqf8eKBAs8P4u0aech9uYctYvaeTIidkFm2O1XurhS356fzjk9qGjRSBJyr652Hh8hc7jKao/Ob 5e0/sOfD4mPlyqivAvY/I6GxSiWQ64aGfQFgJXRv6PDJYmvjXdhVTTOR/Kc6kASnzECBO X-Gm-Gg: ASbGncsEGDfMPQ5Ad7H49AO3i4uc0vyMnxBfOLAZgInFZeNsldfRQkLbUBg4LG/1qyw koSPxlCt/wS5KqWOe05H5HDSa1b9Ky+oyYLyVHjgjF6SjHBnf6v93svVTWa6Zzn0sseqHsKQrvi oQ0E9V5jUkvzWNykyxxC9xhkml2tWIraZtfnNo6RyjMaffqL6dqR4L09B/NpruYzCYKl83LJB51 uJTPaYzfD4P0zoUaGGnmtvLPQm+4iZkTesCGTt0XE3qrYWNdy88iKx5BwRGDm0wppamAxF8fmLf Y/sutK4A2cnXJ41YhsE0IIvgEkadLNYqoc/0dSb2XjclPRbpkP4c54eq2ZrebDGTLdOGwWwdlPe V5bmhCE3JmBvZ X-Received: by 2002:a17:90b:510b:b0:324:e682:f313 with SMTP id 98e67ed59e1d1-328156b7cf9mr13741955a91.18.1756785004667; Mon, 01 Sep 2025 20:50:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGB+Xsscm8/QIrh1rTka8uCRvr6PmqKJta9CgVia5Qpbu0BRO5cycPvn3TIZ0VdHkeWCF4loQ== X-Received: by 2002:a17:90b:510b:b0:324:e682:f313 with SMTP id 98e67ed59e1d1-328156b7cf9mr13741932a91.18.1756785004139; Mon, 01 Sep 2025 20:50:04 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com Subject: [PATCH v2 02/11] hw/hexagon: Add global register tracing Date: Mon, 1 Sep 2025 20:49:42 -0700 Message-Id: <20250902034951.1948194-3-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=Ycq95xRf c=1 sm=1 tr=0 ts=68b66976 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=w7TcP5jS4fsjDEBSHpAA:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: DCZJ38LlGq-VEx7eXpLBbf8mGuqOdp_F X-Proofpoint-ORIG-GUID: DCZJ38LlGq-VEx7eXpLBbf8mGuqOdp_F X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTAxMDEwMSBTYWx0ZWRfX55DsRUpG94hy 3z4CUZco+9nRSFxKbPtSO2/53I2Z/SBuxAJe6wkWhEpBVi1rsBj37HhEOpLkmusXts7XdsRiB7T PqyaAGuMHHFdg1WtVKbxCoqosMJB5e17IJ1hC2yx6mFOcZDwFnmKcIqTbHxJGFpSeNW4NIzZj5d 6IWIInG1QAU/UpglN8n36sBafb/RzDC/LyZgprdGzu/rSIb8YBef8e0rWA2yQJdZioWOHftrQ66 +qFIJDMmEEdG759fISmXVpqaeGvS6dlqFqbcvyzHVBS+mv9kvO6PJUYte1PvCVIFTI9QbC9Qn/7 SrzFOcdmis5Qn11PqHNbZMk2DRvIb5DKuZgoPaPSunIjVWFe+UzAKDWMlixdtly8I6XnPDTFI00 PwNtouq0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 malwarescore=0 bulkscore=0 suspectscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509010101 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756786382955124100 Signed-off-by: Brian Cain --- meson.build | 1 + hw/hexagon/hexagon_globalreg.c | 73 ++++++++++++++++++++++++++++++++++ hw/hexagon/trace-events | 3 ++ 3 files changed, 77 insertions(+) create mode 100644 hw/hexagon/trace-events diff --git a/meson.build b/meson.build index 0d42de61ae..d7e6149ab5 100644 --- a/meson.build +++ b/meson.build @@ -3669,6 +3669,7 @@ if have_system 'hw/display', 'hw/dma', 'hw/fsi', + 'hw/hexagon', 'hw/hyperv', 'hw/i2c', 'hw/i386', diff --git a/hw/hexagon/hexagon_globalreg.c b/hw/hexagon/hexagon_globalreg.c index da943f7261..fcbf2ae4b2 100644 --- a/hw/hexagon/hexagon_globalreg.c +++ b/hw/hexagon/hexagon_globalreg.c @@ -16,11 +16,82 @@ #include "target/hexagon/cpu.h" #include "target/hexagon/hex_regs.h" #include "qemu/log.h" +#include "trace/trace-hw_hexagon.h" #include "qapi/error.h" =20 #define IMMUTABLE (~0) #define INVALID_REG_VAL 0xdeadbeef =20 +static const char *hex_sreg_names[] =3D { + [HEX_SREG_SGP0] =3D "sgp0", + [HEX_SREG_SGP1] =3D "sgp1", + [HEX_SREG_STID] =3D "stid", + [HEX_SREG_ELR] =3D "elr", + [HEX_SREG_BADVA0] =3D "badva0", + [HEX_SREG_BADVA1] =3D "badva1", + [HEX_SREG_SSR] =3D "ssr", + [HEX_SREG_CCR] =3D "ccr", + [HEX_SREG_HTID] =3D "htid", + [HEX_SREG_BADVA] =3D "badva", + [HEX_SREG_IMASK] =3D "imask", + [HEX_SREG_GEVB] =3D "gevb", + [HEX_SREG_EVB] =3D "evb", + [HEX_SREG_MODECTL] =3D "modectl", + [HEX_SREG_SYSCFG] =3D "syscfg", + [HEX_SREG_IPENDAD] =3D "ipendad", + [HEX_SREG_VID] =3D "vid", + [HEX_SREG_VID1] =3D "vid1", + [HEX_SREG_BESTWAIT] =3D "bestwait", + [HEX_SREG_IEL] =3D "iel", + [HEX_SREG_SCHEDCFG] =3D "schedcfg", + [HEX_SREG_IAHL] =3D "iahl", + [HEX_SREG_CFGBASE] =3D "cfgbase", + [HEX_SREG_DIAG] =3D "diag", + [HEX_SREG_REV] =3D "rev", + [HEX_SREG_PCYCLELO] =3D "pcyclelo", + [HEX_SREG_PCYCLEHI] =3D "pcyclehi", + [HEX_SREG_ISDBST] =3D "isdbst", + [HEX_SREG_ISDBCFG0] =3D "isdbcfg0", + [HEX_SREG_ISDBCFG1] =3D "isdbcfg1", + [HEX_SREG_LIVELOCK] =3D "livelock", + [HEX_SREG_BRKPTPC0] =3D "brkptpc0", + [HEX_SREG_BRKPTCFG0] =3D "brkptcfg0", + [HEX_SREG_BRKPTPC1] =3D "brkptpc1", + [HEX_SREG_BRKPTCFG1] =3D "brkptcfg1", + [HEX_SREG_ISDBMBXIN] =3D "isdbmbxin", + [HEX_SREG_ISDBMBXOUT] =3D "isdbmbxout", + [HEX_SREG_ISDBEN] =3D "isdben", + [HEX_SREG_ISDBGPR] =3D "isdbgpr", + [HEX_SREG_PMUCNT4] =3D "pmucnt4", + [HEX_SREG_PMUCNT5] =3D "pmucnt5", + [HEX_SREG_PMUCNT6] =3D "pmucnt6", + [HEX_SREG_PMUCNT7] =3D "pmucnt7", + [HEX_SREG_PMUCNT0] =3D "pmucnt0", + [HEX_SREG_PMUCNT1] =3D "pmucnt1", + [HEX_SREG_PMUCNT2] =3D "pmucnt2", + [HEX_SREG_PMUCNT3] =3D "pmucnt3", + [HEX_SREG_PMUEVTCFG] =3D "pmuevtcfg", + [HEX_SREG_PMUSTID0] =3D "pmustid0", + [HEX_SREG_PMUEVTCFG1] =3D "pmuevtcfg1", + [HEX_SREG_PMUSTID1] =3D "pmustid1", + [HEX_SREG_TIMERLO] =3D "timerlo", + [HEX_SREG_TIMERHI] =3D "timerhi", + [HEX_SREG_PMUCFG] =3D "pmucfg", + [HEX_SREG_S59] =3D "s59", + [HEX_SREG_S60] =3D "s60", + [HEX_SREG_S61] =3D "s61", + [HEX_SREG_S62] =3D "s62", + [HEX_SREG_S63] =3D "s63", +}; + +static const char *get_sreg_name(uint32_t reg) +{ + if (reg < ARRAY_SIZE(hex_sreg_names) && hex_sreg_names[reg]) { + return hex_sreg_names[reg]; + } + return "UNKNOWN"; +} + /* Global system register mutability masks */ static const uint32_t global_sreg_immut_masks[NUM_SREGS] =3D { [HEX_SREG_EVB] =3D 0x000000ff, @@ -88,6 +159,7 @@ uint32_t hexagon_globalreg_read(HexagonCPU *cpu, uint32_= t reg) value =3D s->regs[reg]; } =20 + trace_hexagon_globalreg_read(get_sreg_name(reg), value); return value; } =20 @@ -99,6 +171,7 @@ void hexagon_globalreg_write(HexagonCPU *cpu, uint32_t r= eg, g_assert(reg < NUM_SREGS); g_assert(reg >=3D HEX_SREG_GLB_START); s->regs[reg] =3D value; + trace_hexagon_globalreg_write(get_sreg_name(reg), value); } =20 uint32_t hexagon_globalreg_masked_value(HexagonCPU *cpu, uint32_t reg, diff --git a/hw/hexagon/trace-events b/hw/hexagon/trace-events new file mode 100644 index 0000000000..6ef88d9e05 --- /dev/null +++ b/hw/hexagon/trace-events @@ -0,0 +1,3 @@ +# Hexagon global register access +hexagon_globalreg_read(const char *reg_name, uint32_t value) "reg=3D%s val= ue=3D0x%x" +hexagon_globalreg_write(const char *reg_name, uint32_t value) "reg=3D%s va= lue=3D0x%x" --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785284; cv=none; d=zohomail.com; s=zohoarc; b=l4gqhOO0UhRzcw8UnqXvmmKNukIMwqy3nFQ5oj4idDpYaPfi4tkNoTmR5sIw/0fDFMotljY+NGVn7TtI0CmIcnjB5mfWncRH2I5uSldggbKw3+p94Iuc4w2X5V9MpO8NtFBnpGpCORgqt9s82Qi2uNbM4ziEcyjm0wtc7r3H7oE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785284; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qApLnIlZX754sYloYJaLRUaEQvkkNUznqKtwxMhDgpU=; b=hV7yULfcdTyv950LR4RLmfrNXywQWPDsfG46qSphm9HOsd39xMu6ShslzlG+KZDdRbMb0vxYEa1j4SRn+NaeZW/wkNB6Dyyw/L96AUfXg6ogHNwY6+d6tnJ9c6gpD+038yIcZIiNjSVzZCiKlwo4Vwh9/bAbyk+gMrAHOhmgmDE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785284273161.22217646894478; Mon, 1 Sep 2025 20:54:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI30-0008Et-81; Mon, 01 Sep 2025 23:51:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2Q-0006fx-07 for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:32 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2M-0004wN-4m for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:29 -0400 Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822SAKQ022312 for ; Tue, 2 Sep 2025 03:50:15 GMT Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48upnp6hwj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:14 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-329dfdc23d2so401143a91.1 for ; Mon, 01 Sep 2025 20:50:14 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= qApLnIlZX754sYloYJaLRUaEQvkkNUznqKtwxMhDgpU=; b=OspjrS5tIpHeL6vv NPFbu/2pfDxbvdvEtP2ArjCGngHxmvAxeFwrWkDT3X4oGdIVf5WOvggPbUo47jDm HotLuoS2Ru4AZdrU/vc5ZJxnX2XIdb+fBIHV+vAzmlYHgAqCZ2B3VngiPIOAdeQy T1COeupnMiImLU3LG0xwnhUy81nBGWHz3h6l4pt8tB3R7yC81idufCPxpGZYaTzB qE+FvRBeHwkYiR1BBZwW61xydTNUMbBatZfxR3Vs+ehmORrfnhTRD4Q0RjMwnDYv 7VU01spfE8IttHdwLZ5syw4bo0WFvVEmcrLhaRVjdMgsmO8+duv9oL5WvMgnFb7f UUwlpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785006; x=1757389806; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qApLnIlZX754sYloYJaLRUaEQvkkNUznqKtwxMhDgpU=; b=KQFGR4yD52H99locwvQ1yK6KfnddY8isMVdubaNLjol6+T4/FRO9BNPoRyau1eQvJO Fp2y2Ihisqz4oZ9wa4kPdBGVmr9uTuzoBc5cOob0XfrKL5fuj8gyn4i92/YKJ/ec8U2F R564SvGynQu/8eLvQ7jlnMhw9huKb/okXHXPfZR9u+YG78MqslDkr0AJF/1ejBQ51K9o griqKVC/IMo39lbBzYipg19pwscoXpzFOtLPHwlztjCCd0XTxW9XTfWZtJPUZHzZ1/O6 p0ojWJUuw9wxp3ptivbBeHBxOXtK2AIP7RMHAcaHWNzXNvDJC2G7Pl2sxdGWNtW29I7y 9cUQ== X-Gm-Message-State: AOJu0Yy8Ly1o7KMkZjlRj9vPXz6j05M4Cska0NAPDPEKZ7zUGQHiZjV5 384trlDhPfSsT32qzvF/Cf5EWFXHYjNRWJGhCXVK/zzmYCSr46fU7/OTClGinqworM3nN43xbry c/vlr2S5mSetUI5qAxu7lnUBhNnKtGT6XLagILtY+nisILuX+EFoOmtaMgCf8jxF55lhf X-Gm-Gg: ASbGncurJs8eD1+Uf9J7ekZbmBk0lOrCIn/Kyia8ds3RA8tiDIvLM9TD/L5dZMlTC8c jG/zFAXswFJei0FMhp/Ug/T7CkZBhU0Lg1YhL30qN9SdDSdX6NUDuyA1DjV+r6MuHzi1thwe90z wllbRKIgaVTIbOGjEbgZ1CvDAVS7aw0syihz/UKRLWo8Cd6ENN0jMOnptZXwTgLYtiwLWPxrawI lmwPClRUhMf0MmXXH0In09Fdl5FLoQ2nnfPTBJu+mo4Q4txbiRI86clnBWnoaM3Xshax60n5w6x HsiIzEHEjpbS7LaFy9bN4lvI0p0qWP094QcoltFDBqxySpPgkEaJo5xXB6dDF87tGWESEEmnelR CJ24QY8KWn2EO X-Received: by 2002:a17:90b:3e4f:b0:327:e74e:f757 with SMTP id 98e67ed59e1d1-328156cc70amr11979539a91.30.1756785006086; Mon, 01 Sep 2025 20:50:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGsz6Joem38x7JSVb3OEWI38A4ZoqiQ36s7UvbvWgIhvb5BhPPaduvesJiWX5ziCklrGoUErg== X-Received: by 2002:a17:90b:3e4f:b0:327:e74e:f757 with SMTP id 98e67ed59e1d1-328156cc70amr11979494a91.30.1756785005394; Mon, 01 Sep 2025 20:50:05 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Brian Cain , Markus Armbruster , Mike Lambert , Sid Manning Subject: [PATCH v2 03/11] hw/hexagon: Add machine configs for sysemu Date: Mon, 1 Sep 2025 20:49:43 -0700 Message-Id: <20250902034951.1948194-4-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: sUAbk3t_pRI94N0R5h3V9sBYZxSDPNTt X-Authority-Analysis: v=2.4 cv=Jt/xrN4C c=1 sm=1 tr=0 ts=68b66976 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=20KFwNOVAAAA:8 a=EUspDBNiAAAA:8 a=2NUsffphLIBclc6jjpsA:9 a=hiJlUhq8NronkB9Q:21 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-ORIG-GUID: sUAbk3t_pRI94N0R5h3V9sBYZxSDPNTt X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAwMSBTYWx0ZWRfX8v/XCEoB+MFf DU8q+RkuATkojDUJzwlPtjP4LV2wByXhM3b5fCoMXl9NWG79k2+zB2t1d6hUw0xrFdjh8Y+1K2Q uNEvuPr3NAeu2nqWtN4srXQtDE5QPDcKsjqvDplmiR29Nc16AeOkAGo05NUBUSN2FOhiIXpuHBn I6SODxMUIHuXD3A9sbDyUK6mixM5xwfeeKkTsMcWTOff8UDuM8dHqIC/9xrjNvKlTINNAqX3wHU n6CznfZsOOeRfSsWckNEN+kdN0eWYH18XVGiafAROf8nCcWhuycwEfnYVe5rzBXak4ezcB4Q0nZ F59ORfgNWw149cDzsNJQK5L0DfCVUSzZZ5Lhp4FNMw2Grw0Vrl9P7rSFsC/cDL8czQVtekOAtql 6Qwmnnpu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 clxscore=1015 bulkscore=0 impostorscore=0 spamscore=0 phishscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300001 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785286114124100 From: Brian Cain Some header includes are modified here: these are uniquely required for basic system emulation functionality and had not been required for linux-us= er. Acked-by: Markus Armbruster Co-authored-by: Mike Lambert Co-authored-by: Sid Manning Signed-off-by: Brian Cain --- MAINTAINERS | 2 + qapi/machine.json | 4 +- include/hw/hexagon/hexagon.h | 150 ++++++++++++++++++++ target/hexagon/cpu.h | 1 + hw/hexagon/machine_cfg_v66g_1024.h.inc | 63 +++++++++ hw/hexagon/hexagon_dsp.c | 183 +++++++++++++++++++++++++ system/qdev-monitor.c | 2 +- target/hexagon/cpu.c | 1 + target/hexagon/op_helper.c | 2 +- target/hexagon/translate.c | 1 + hw/Kconfig | 1 + hw/hexagon/Kconfig | 5 + hw/hexagon/meson.build | 5 + hw/meson.build | 1 + 14 files changed, 418 insertions(+), 3 deletions(-) create mode 100644 include/hw/hexagon/hexagon.h create mode 100644 hw/hexagon/machine_cfg_v66g_1024.h.inc create mode 100644 hw/hexagon/hexagon_dsp.c create mode 100644 hw/hexagon/Kconfig create mode 100644 hw/hexagon/meson.build diff --git a/MAINTAINERS b/MAINTAINERS index bf7695658a..efc237b27b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -229,6 +229,8 @@ Hexagon TCG CPUs M: Brian Cain S: Supported F: target/hexagon/ +F: hw/hexagon/ +F: include/hw/hexagon/ X: target/hexagon/idef-parser/ X: target/hexagon/gen_idef_parser_funcs.py F: linux-user/hexagon/ diff --git a/qapi/machine.json b/qapi/machine.json index 038eab281c..67f1929a98 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -26,6 +26,8 @@ # # @avr: since 5.1 # +# @hexagon: since 10.2 +# # @loongarch64: since 7.1 # # .. note:: The resulting QMP strings can be appended to the @@ -35,7 +37,7 @@ # Since: 3.0 ## { 'enum' : 'SysEmuTarget', - 'data' : [ 'aarch64', 'alpha', 'arm', 'avr', 'hppa', 'i386', + 'data' : [ 'aarch64', 'alpha', 'arm', 'avr', 'hexagon', 'hppa', 'i386', 'loongarch64', 'm68k', 'microblaze', 'microblazeel', 'mips', = 'mips64', 'mips64el', 'mipsel', 'or1k', 'ppc', 'ppc64', 'riscv32', 'riscv64', 'rx', 's390x', 'sh4', diff --git a/include/hw/hexagon/hexagon.h b/include/hw/hexagon/hexagon.h new file mode 100644 index 0000000000..eb0c20276f --- /dev/null +++ b/include/hw/hexagon/hexagon.h @@ -0,0 +1,150 @@ +/* + * Hexagon Baseboard System emulation. + * + * Copyright (c) 2020-2024 Qualcomm Innovation Center, Inc. All Rights Res= erved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + + +#ifndef HW_HEXAGON_H +#define HW_HEXAGON_H + +#include "system/memory.h" + +struct hexagon_board_boot_info { + uint64_t ram_size; + const char *kernel_filename; + uint32_t kernel_elf_flags; +}; + +typedef enum { + unknown_rev =3D 0, + v66_rev =3D 0xa666, + v67_rev =3D 0x2667, + v68_rev =3D 0x8d68, + v69_rev =3D 0x8c69, + v71_rev =3D 0x8c71, + v73_rev =3D 0x8c73, + v73m_rev =3D 0xcc73, +} Rev_t; +#define HEXAGON_LATEST_REV v73 +#define HEXAGON_LATEST_REV_UPPER V73 + +/* + * Config table address bases represent bits [35:16]. + */ +#define HEXAGON_CFG_ADDR_BASE(addr) (((addr) >> 16) & 0x0fffff) + +#define HEXAGON_CFGSPACE_ENTRIES (128) + +typedef union { + struct { + /* Base address of L2TCM space */ + uint32_t l2tcm_base; + uint32_t reserved0; + /* Base address of subsystem space */ + uint32_t subsystem_base; + /* Base address of ETM space */ + uint32_t etm_base; + /* Base address of L2 configuration space */ + uint32_t l2cfg_base; + uint32_t reserved1; + /* Base address of L1S */ + uint32_t l1s0_base; + /* Base address of AXI2 */ + uint32_t axi2_lowaddr; + /* Base address of streamer base */ + uint32_t streamer_base; + uint32_t reserved2; + /* Base address of fast L2VIC */ + uint32_t fastl2vic_base; + /* Number of entries in JTLB */ + uint32_t jtlb_size_entries; + /* Coprocessor type */ + uint32_t coproc_present; + /* Number of extension execution contexts available */ + uint32_t ext_contexts; + /* Base address of Hexagon Vector Tightly Coupled Memory (VTCM) */ + uint32_t vtcm_base; + /* Size of VTCM (in KB) */ + uint32_t vtcm_size_kb; + /* L2 tag size */ + uint32_t l2tag_size; + /* Amount of physical L2 memory in released version */ + uint32_t l2ecomem_size; + /* Hardware threads available on the core */ + uint32_t thread_enable_mask; + /* Base address of the ECC registers */ + uint32_t eccreg_base; + /* L2 line size */ + uint32_t l2line_size; + /* Small Core processor (also implies audio extension) */ + uint32_t tiny_core; + /* Size of L2TCM */ + uint32_t l2itcm_size; + /* Base address of L2-ITCM */ + uint32_t l2itcm_base; + uint32_t reserved3; + /* DTM is present */ + uint32_t dtm_present; + /* Version of the DMA */ + uint32_t dma_version; + /* Native HVX vector length in log of bytes */ + uint32_t hvx_vec_log_length; + /* Core ID of the multi-core */ + uint32_t core_id; + /* Number of multi-core cores */ + uint32_t core_count; + uint32_t coproc2_reg0; + uint32_t coproc2_reg1; + /* Supported HVX vector length */ + uint32_t v2x_mode; + uint32_t coproc2_reg2; + uint32_t coproc2_reg3; + uint32_t coproc2_reg4; + uint32_t coproc2_reg5; + uint32_t coproc2_reg6; + uint32_t coproc2_reg7; + /* Voltage droop mitigation technique parameter */ + uint32_t acd_preset; + /* Voltage droop mitigation technique parameter */ + uint32_t mnd_preset; + /* L1 data cache size (in KB) */ + uint32_t l1d_size_kb; + /* L1 instruction cache size in (KB) */ + uint32_t l1i_size_kb; + /* L1 data cache write policy: see HexagonL1WritePolicy */ + uint32_t l1d_write_policy; + /* VTCM bank width */ + uint32_t vtcm_bank_width; + uint32_t reserved4; + uint32_t reserved5; + uint32_t reserved6; + uint32_t coproc2_cvt_mpy_size; + uint32_t consistency_domain; + uint32_t capacity_domain; + uint32_t axi3_lowaddr; + uint32_t coproc2_int8_subcolumns; + uint32_t corecfg_present; + uint32_t coproc2_fp16_acc_exp; + uint32_t AXIM2_secondary_base; + }; + uint32_t raw[HEXAGON_CFGSPACE_ENTRIES]; +} hexagon_config_table; + +typedef struct { + /* Base address of config table */ + uint32_t cfgbase; + /* Size of L2 TCM */ + uint32_t l2tcm_size; + /* Base address of L2VIC */ + uint32_t l2vic_base; + /* Size of L2VIC region */ + uint32_t l2vic_size; + /* QTimer csr base */ + uint32_t csr_base; + uint32_t qtmr_region; + hexagon_config_table cfgtable; +} hexagon_machine_config; + +#endif diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h index 89c634a09c..86fbe30dbb 100644 --- a/target/hexagon/cpu.h +++ b/target/hexagon/cpu.h @@ -196,6 +196,7 @@ struct ArchCPU { #ifndef CONFIG_USER_ONLY uint32_t num_tlbs; uint32_t l2vic_base_addr; + uint32_t hvx_contexts; uint32_t boot_addr; struct HexagonGlobalRegState *globalregs; #endif diff --git a/hw/hexagon/machine_cfg_v66g_1024.h.inc b/hw/hexagon/machine_cf= g_v66g_1024.h.inc new file mode 100644 index 0000000000..8f2a593bb8 --- /dev/null +++ b/hw/hexagon/machine_cfg_v66g_1024.h.inc @@ -0,0 +1,63 @@ + +static hexagon_machine_config v66g_1024 =3D { + .cfgbase =3D 0xd8180000, + .l2tcm_size =3D 0x00000000, + .l2vic_base =3D 0xfc910000, + .l2vic_size =3D 0x00001000, + .csr_base =3D 0xfc900000, + .qtmr_region =3D 0xfc921000, + .cfgtable =3D { + .l2tcm_base =3D 0x0000d800, + .reserved0 =3D 0x0000d400, + .subsystem_base =3D 0x0000fc90, + .etm_base =3D 0x0000d805, + .l2cfg_base =3D 0x0000d81a, + .reserved1 =3D 0x00000000, + .l1s0_base =3D 0x0000d820, + .axi2_lowaddr =3D 0x00003000, + .streamer_base =3D 0x00000000, + .reserved2 =3D 0x0000d819, + .fastl2vic_base =3D 0x0000d81e, + .jtlb_size_entries =3D 0x00000080, + .coproc_present =3D 0x00000001, + .ext_contexts =3D 0x00000004, + .vtcm_base =3D 0x0000d820, + .vtcm_size_kb =3D 0x00000100, + .l2tag_size =3D 0x00000400, + .l2ecomem_size =3D 0x00000400, + .thread_enable_mask =3D 0x0000000f, + .eccreg_base =3D 0x0000d81f, + .l2line_size =3D 0x00000080, + .tiny_core =3D 0x00000000, + .l2itcm_size =3D 0x00000000, + .l2itcm_base =3D 0x0000d820, + .reserved3 =3D 0x00000000, + .dtm_present =3D 0x00000000, + .dma_version =3D 0x00000000, + .hvx_vec_log_length =3D 0x00000080, + .core_id =3D 0x00000000, + .core_count =3D 0x00000000, + .coproc2_reg0 =3D 0x00000000, + .coproc2_reg1 =3D 0x00000000, + .v2x_mode =3D 0x00000000, + .coproc2_reg2 =3D 0x00000000, + .coproc2_reg3 =3D 0x00000000, + .coproc2_reg4 =3D 0x00000000, + .coproc2_reg5 =3D 0x00000000, + .coproc2_reg6 =3D 0x00000000, + .coproc2_reg7 =3D 0x00000000, + .acd_preset =3D 0x00000000, + .mnd_preset =3D 0x00000000, + .l1d_size_kb =3D 0x00000000, + .l1i_size_kb =3D 0x00000000, + .l1d_write_policy =3D 0x00000000, + .vtcm_bank_width =3D 0x00000000, + .reserved3 =3D 0x00000000, + .reserved4 =3D 0x00000000, + .reserved5 =3D 0x00000000, + .coproc2_cvt_mpy_size =3D 0x00000000, + .consistency_domain =3D 0x00000000, + .capacity_domain =3D 0x00000000, + .axi3_lowaddr =3D 0x00000000, + }, +}; diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c new file mode 100644 index 0000000000..d491a21a76 --- /dev/null +++ b/hw/hexagon/hexagon_dsp.c @@ -0,0 +1,183 @@ +/* + * Hexagon DSP Subsystem emulation. This represents a generic DSP + * subsystem with few peripherals, like the Compute DSP. + * + * Copyright (c) 2020-2024 Qualcomm Innovation Center, Inc. All Rights Res= erved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "system/address-spaces.h" +#include "hw/hw.h" +#include "hw/boards.h" +#include "hw/qdev-properties.h" +#include "hw/hexagon/hexagon.h" +#include "hw/hexagon/hexagon_globalreg.h" +#include "hw/loader.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/log.h" +#include "elf.h" +#include "cpu.h" +#include "include/migration/cpu.h" +#include "include/system/system.h" +#include "target/hexagon/internal.h" +#include "system/reset.h" + +#include "machine_cfg_v66g_1024.h.inc" + +static void hex_symbol_callback(const char *st_name, int st_info, + uint64_t st_value, uint64_t st_size) +{ +} + +/* Board init. */ +static struct hexagon_board_boot_info hexagon_binfo; + +static void hexagon_load_kernel(HexagonCPU *cpu) +{ + uint64_t pentry; + long kernel_size; + + kernel_size =3D load_elf_ram_sym(hexagon_binfo.kernel_filename, NULL, = NULL, + NULL, &pentry, NULL, NULL, + &hexagon_binfo.kernel_elf_flags, 0, EM_HEXAGON, 0, 0, + &address_space_memory, false, hex_symbol_callback); + + if (kernel_size <=3D 0) { + error_report("no kernel file '%s'", + hexagon_binfo.kernel_filename); + exit(1); + } + + qdev_prop_set_uint32(DEVICE(cpu), "exec-start-addr", pentry); +} + +static void hexagon_init_bootstrap(MachineState *machine, HexagonCPU *cpu) +{ + if (machine->kernel_filename) { + hexagon_load_kernel(cpu); + } +} + +static void do_cpu_reset(void *opaque) +{ + HexagonCPU *cpu =3D opaque; + CPUState *cs =3D CPU(cpu); + cpu_reset(cs); +} + +static void hexagon_common_init(MachineState *machine, Rev_t rev, + hexagon_machine_config *m_cfg) +{ + memset(&hexagon_binfo, 0, sizeof(hexagon_binfo)); + if (machine->kernel_filename) { + hexagon_binfo.ram_size =3D machine->ram_size; + hexagon_binfo.kernel_filename =3D machine->kernel_filename; + } + + machine->enable_graphics =3D 0; + + MemoryRegion *address_space =3D get_system_memory(); + + MemoryRegion *sram =3D g_new(MemoryRegion, 1); + memory_region_init_ram(sram, NULL, "ddr.ram", + machine->ram_size, &error_fatal); + memory_region_add_subregion(address_space, 0x0, sram); + + Error **errp =3D NULL; + + DeviceState *glob_regs_dev =3D qdev_new(TYPE_HEXAGON_GLOBALREG); + qdev_prop_set_uint64(glob_regs_dev, "config-table-addr", m_cfg->cfgbas= e); + qdev_prop_set_uint32(glob_regs_dev, "qtimer-base-addr", m_cfg->qtmr_re= gion); + sysbus_realize_and_unref(SYS_BUS_DEVICE(glob_regs_dev), errp); + + for (int i =3D 0; i < machine->smp.cpus; i++) { + HexagonCPU *cpu =3D HEXAGON_CPU(object_new(machine->cpu_type)); + qemu_register_reset(do_cpu_reset, cpu); + + /* + * CPU #0 is the only CPU running at boot, others must be + * explicitly enabled via start instruction. + */ + qdev_prop_set_bit(DEVICE(cpu), "start-powered-off", (i !=3D 0)); + qdev_prop_set_uint32(DEVICE(cpu), "l2vic-base-addr", m_cfg->l2vic_= base); + qdev_prop_set_uint32(DEVICE(cpu), "config-table-addr", m_cfg->cfgb= ase); + qdev_prop_set_uint32(DEVICE(cpu), "hvx-contexts", + m_cfg->cfgtable.ext_contexts); + qdev_prop_set_uint32(DEVICE(cpu), "jtlb-entries", + m_cfg->cfgtable.jtlb_size_entries); + + + if (i =3D=3D 0) { + hexagon_init_bootstrap(machine, cpu); + if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) { + return; + } + DeviceState *l2vic_dev; + l2vic_dev =3D sysbus_create_varargs("l2vic", m_cfg->l2vic_base, + /* IRQ#, Evnt#,CauseCode */ + qdev_get_gpio_in(DEVICE(cpu), 0), + qdev_get_gpio_in(DEVICE(cpu), 1), + qdev_get_gpio_in(DEVICE(cpu), 2), + qdev_get_gpio_in(DEVICE(cpu), 3), + qdev_get_gpio_in(DEVICE(cpu), 4), + qdev_get_gpio_in(DEVICE(cpu), 5), + qdev_get_gpio_in(DEVICE(cpu), 6), + qdev_get_gpio_in(DEVICE(cpu), 7), + NULL); + sysbus_mmio_map(SYS_BUS_DEVICE(l2vic_dev), 1, + m_cfg->cfgtable.fastl2vic_base << 16); + } else if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) { + return; + } + + } +} + +static void init_mc(MachineClass *mc) +{ + mc->block_default_type =3D IF_SD; + mc->default_ram_size =3D 4 * GiB; + mc->no_parallel =3D 1; + mc->no_floppy =3D 1; + mc->no_cdrom =3D 1; + mc->no_serial =3D 1; + mc->is_default =3D false; + mc->max_cpus =3D 8; +} + +/* ----------------------------------------------------------------- */ +/* Core-specific configuration settings are defined below this line. */ +/* Config table values defined in machine_configs.h.inc */ +/* ----------------------------------------------------------------- */ + +static void v66g_1024_config_init(MachineState *machine) +{ + hexagon_common_init(machine, v66_rev, &v66g_1024); +} + +static void v66g_1024_init(ObjectClass *oc, const void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + + mc->desc =3D "Hexagon V66G_1024"; + mc->init =3D v66g_1024_config_init; + init_mc(mc); + mc->is_default =3D true; + mc->default_cpu_type =3D TYPE_HEXAGON_CPU_V66; + mc->default_cpus =3D 4; +} + +static const TypeInfo hexagon_machine_types[] =3D { + { + .name =3D MACHINE_TYPE_NAME("V66G_1024"), + .parent =3D TYPE_MACHINE, + .class_init =3D v66g_1024_init, + }, +}; + +DEFINE_TYPES(hexagon_machine_types) diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c index 2ac92d0a07..4acc2d3280 100644 --- a/system/qdev-monitor.c +++ b/system/qdev-monitor.c @@ -69,7 +69,7 @@ typedef struct QDevAlias QEMU_ARCH_SPARC | \ QEMU_ARCH_XTENSA) #define QEMU_ARCH_VIRTIO_CCW (QEMU_ARCH_S390X) -#define QEMU_ARCH_VIRTIO_MMIO (QEMU_ARCH_M68K) +#define QEMU_ARCH_VIRTIO_MMIO (QEMU_ARCH_M68K | QEMU_ARCH_HEXAGON) =20 /* Please keep this table sorted by typename. */ static const QDevAlias qdev_alias_table[] =3D { diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c index 256fdc177e..ba78a04bdc 100644 --- a/target/hexagon/cpu.c +++ b/target/hexagon/cpu.c @@ -69,6 +69,7 @@ static const Property hexagon_cpu_properties[] =3D { DEFINE_PROP_UINT32("jtlb-entries", HexagonCPU, num_tlbs, MAX_TLB_ENTRI= ES), DEFINE_PROP_UINT32("l2vic-base-addr", HexagonCPU, l2vic_base_addr, 0xffffffffULL), + DEFINE_PROP_UINT32("hvx-contexts", HexagonCPU, hvx_contexts, 0), DEFINE_PROP_UINT32("exec-start-addr", HexagonCPU, boot_addr, 0xfffffff= fULL), DEFINE_PROP_LINK("global-regs", HexagonCPU, globalregs, TYPE_HEXAGON_GLOBALREG, HexagonGlobalRegState *), diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c index 1bc32769c6..fa893e480b 100644 --- a/target/hexagon/op_helper.c +++ b/target/hexagon/op_helper.c @@ -20,9 +20,9 @@ #include "accel/tcg/cpu-ldst.h" #include "accel/tcg/probe.h" #include "qemu/main-loop.h" +#include "cpu.h" #include "exec/helper-proto.h" #include "fpu/softfloat.h" -#include "cpu.h" #include "exec/cpu-interrupt.h" #include "internal.h" #include "macros.h" diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c index 38c2037c47..3e70fa29bc 100644 --- a/target/hexagon/translate.c +++ b/target/hexagon/translate.c @@ -32,6 +32,7 @@ #include "translate.h" #include "genptr.h" #include "printinsn.h" +#include "exec/target_page.h" =20 #define HELPER_H "helper.h" #include "exec/helper-info.c.inc" diff --git a/hw/Kconfig b/hw/Kconfig index 9e6c789ae7..1c3684055a 100644 --- a/hw/Kconfig +++ b/hw/Kconfig @@ -52,6 +52,7 @@ source arm/Kconfig source cpu/Kconfig source alpha/Kconfig source avr/Kconfig +source hexagon/Kconfig source hppa/Kconfig source i386/Kconfig source loongarch/Kconfig diff --git a/hw/hexagon/Kconfig b/hw/hexagon/Kconfig new file mode 100644 index 0000000000..7b9577f68f --- /dev/null +++ b/hw/hexagon/Kconfig @@ -0,0 +1,5 @@ +config HEX_DSP + bool + default y + depends on HEXAGON && TCG + imply PTIMER diff --git a/hw/hexagon/meson.build b/hw/hexagon/meson.build new file mode 100644 index 0000000000..11e71a67d5 --- /dev/null +++ b/hw/hexagon/meson.build @@ -0,0 +1,5 @@ +hexagon_ss =3D ss.source_set() +hexagon_ss.add(when: 'CONFIG_HEX_DSP', if_true: files('hexagon_dsp.c', 'he= xagon_globalreg.c')) + +hw_arch +=3D {'hexagon': hexagon_ss} + diff --git a/hw/meson.build b/hw/meson.build index 791ce21ab4..7530742e69 100644 --- a/hw/meson.build +++ b/hw/meson.build @@ -50,6 +50,7 @@ subdir('fsi') subdir('alpha') subdir('arm') subdir('avr') +subdir('hexagon') subdir('hppa') subdir('i386') subdir('loongarch') --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785722; cv=none; d=zohomail.com; s=zohoarc; b=DXaOT3d/ZG8L/mRjEXLdJM5f6d2Lk4AXz3hBI5QAJOHPMR39O7OcgblgfiGA7ooWqbAsE31u/y0LUNFcEmGTvPWx+riuGE5if3WoSu1lbOkGCCQLakf2z8OIR+WEGhfmrxlupMFYCieF9Dh+snzFT9oEGB1JGUzF1GIG6ZhxS9w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785722; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=YdvU/mxz3xVNNr/3bVkbSg1EtfkUXL/XkaPTNSCNu7I=; b=axZsg6Sk8LSzYZhB0dZWzNa/ULQ06sOcZUD4wMHAe9J0MsHiM5V9fNjIyoAuHPit9ysIL4QJDAJ2M0P9Zzmi+zBozzEUsL+TwgS8B5CIsALH3ysjjHQLjFcpaqXBFrWwLl/xX8ujbtWMpr+/R6rT99s3efKa6HGrqUMWEy8X6CY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785722202797.5044572365422; Mon, 1 Sep 2025 21:02:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2i-0007Vr-60; Mon, 01 Sep 2025 23:50:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2K-0006Tp-FX for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:26 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2F-0004vV-LO for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:22 -0400 Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822Sutq011396 for ; Tue, 2 Sep 2025 03:50:08 GMT Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48urmjedct-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:08 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-329e1e3b25bso318868a91.2 for ; Mon, 01 Sep 2025 20:50:08 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= YdvU/mxz3xVNNr/3bVkbSg1EtfkUXL/XkaPTNSCNu7I=; b=azer051lKuUyYF/y goaASAirCppoL/ru+Fu8cBa/UUa4TAIRqwYOF4ChaZnto0xtkt8RlSU8bulwj1uH Mb6BdW89aUtPvx2gLUvkQLNbBNX/39Ce4paT0TabliOXfytQ8l3eZXlxKifIO8yz 3582ECIHPs4c2OnAZhgasrSpwoUr/rJJpQ8N3jCayXGFm4TKkAxEGt/2svbK1YEB GsnpBWwEjjrfgUNHQW/nu/XXLLV0M/4T+tRpXYuKlI2bSKc8iWeQhDrECzFAyVMP z68gWMtgApaEZ5HHa1JAhHTKt4fDALNnrSX52j9gUbqXqXB6asU8EyTHobOjPEAJ fn0Yvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785007; x=1757389807; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YdvU/mxz3xVNNr/3bVkbSg1EtfkUXL/XkaPTNSCNu7I=; b=p9SWvAbFDCcouQTJz+ZsfNTA8i/hSaF8UivORXVDnk5dgnY1JEvZS97ItBwBXVcdrm UoYzRjywLjdKon6OJOqrq+CkBaO032pYOYYOhQ4XOwO1H/YOjxkU7hABjwelDVJYyhZ1 9GYW1WKt1TRR+1ZEwwjn70LQDAlc0uOSOv2MnydJovuUN4O+5ZhVk4QmKjKx/Vyef10v dT7pPhMQBIBPRhnI7Njkh4+NMY27PoYHwFDGz93y847K9yK3CGpUPLr3ZmiIFKe/zIGn LDAEvboMABHHOEjR0lX2SwVAU1afu9kO2SDGECIPeji4aw9SUYTlnyQ3mUvQKSxKCilz 1bZg== X-Gm-Message-State: AOJu0YysiBxhp3xPJSXb2DEaWUweYR+H028VGS2ZOO6FBGDvHJwMVvvP S9b64el7TB1gloRAr16op2J66Iz4RRKS+vT4UbFuHEzNxSEU1hMh6ODk1GXn5ee58KsQ790y+QZ 5G25C2FXL+DhSssxdaIo3Zdr2b1JV/xKyVP0eIAtVmuZHz57jX/0hIzXojdHSHdYJBB0X X-Gm-Gg: ASbGncs/FQVB5g/36X3QJJ9qwcMaz890fhjQKrc1nprjFoiinfRafhyu+xB84taHi1c qBs/yuakIswbMed2CyyLHPyV7reUOwFKLrfHZrh8KqkdfvXztZNNxrluav0nGi5F1vKwbwDWqX2 Pu1e+/PHHKjv/YuWYL4xnj2V/Q8wXbftqszjGN96I4WNRc8Mvn8VBKUtOSNQYBA3+Zx23Y9ybR9 S1uZDtFUZMIMG8fC7O3qmdBCdtelBL8Fd4dMuGw9YgqOqwsitq0pqYxf1lmfLhfXcbOshPMP3nF FOaZOI/GPtmiPeOKr1Niigj+pMJvgFMee+HmXdyA2O2IzCpo4GIegQcuumYk+SrJOFVCSGV8ykH mq4u0kytM70ZB X-Received: by 2002:a17:90b:5810:b0:329:e407:b53c with SMTP id 98e67ed59e1d1-329e407b781mr742903a91.5.1756785006967; Mon, 01 Sep 2025 20:50:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGdhZKEDYYS9AsjBnbzh20PX06x4xaIyzQp32JwvEuk0ly5CrSYgVW9e0FiXEveYxwUIFGsEA== X-Received: by 2002:a17:90b:5810:b0:329:e407:b53c with SMTP id 98e67ed59e1d1-329e407b781mr742879a91.5.1756785006458; Mon, 01 Sep 2025 20:50:06 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Brian Cain Subject: [PATCH v2 04/11] hw/hexagon: Add v68, sa8775-cdsp0 defs Date: Mon, 1 Sep 2025 20:49:44 -0700 Message-Id: <20250902034951.1948194-5-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=OemYDgTY c=1 sm=1 tr=0 ts=68b66970 cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=pGLkceISAAAA:8 a=EUspDBNiAAAA:8 a=Y0VZbjsYLljPqHOwCnMA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-GUID: ChLDKCXFpukq_W791OeKlhB1YtvIX3x_ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAyNCBTYWx0ZWRfX7LRr42FZkeG0 kbQ5tg4IIzG/nvVjij+atyQexMNzEL7tafqaIcGcaa8FtRlHwxOb0GTuFcQWjeB/xmBX4g9nq5t mwZyEL5KW/yoAWFvhmAadKbfYZDPULZfhcnakwnfnTRBNNqEqtNm8/tgdYZn+dzIhTDziFhlQ3I nqUCxi1IueJkJyQnp0kUS3L6yegeu60pKvby6CE4bEVf/D4zKM/vyJemRXe4OSCVc2Qd8dRKBA2 TqRgMq7GgXoUgocr0sCKqxKxV10ViSctKEq8QQpt3Y+gDMhAKAK56hylZ7x9i36f8sOGja0CqM7 DKWsga6W9FTQ1Dg1aPFvIRK6WBJFOt4ebk0UlohKORpChfKu44O9WHeQF6VpHGwQhVw0f394YeU TZm+Oogl X-Proofpoint-ORIG-GUID: ChLDKCXFpukq_W791OeKlhB1YtvIX3x_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 spamscore=0 bulkscore=0 priorityscore=1501 adultscore=0 clxscore=1015 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300024 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785723967116600 From: Brian Cain Acked-by: Taylor Simpson Signed-off-by: Brian Cain --- hw/hexagon/machine_cfg_sa8775_cdsp0.h.inc | 63 ++++++++++++++++++++++ hw/hexagon/machine_cfg_v68n_1024.h.inc | 64 +++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 hw/hexagon/machine_cfg_sa8775_cdsp0.h.inc create mode 100644 hw/hexagon/machine_cfg_v68n_1024.h.inc diff --git a/hw/hexagon/machine_cfg_sa8775_cdsp0.h.inc b/hw/hexagon/machine= _cfg_sa8775_cdsp0.h.inc new file mode 100644 index 0000000000..70b1eabfe9 --- /dev/null +++ b/hw/hexagon/machine_cfg_sa8775_cdsp0.h.inc @@ -0,0 +1,63 @@ + +static hexagon_machine_config SA8775P_cdsp0 =3D { + .cfgbase =3D 0x24000000 + 0x180000, + .l2tcm_size =3D 0x00000000, + .l2vic_base =3D 0x26300000 + 0x90000, + .l2vic_size =3D 0x00001000, + .csr_base =3D 0x26300000, + .qtmr_region =3D 0x26300000 + 0xA1000, + .cfgtable =3D { + .l2tcm_base =3D 0x00002400, + .reserved0 =3D 0x00000000, + .subsystem_base =3D 0x00002638, + .etm_base =3D 0x00002419, + .l2cfg_base =3D 0x0000241a, + .reserved1 =3D 0x0000241b, + .l1s0_base =3D 0x00002500, + .axi2_lowaddr =3D 0x00000000, + .streamer_base =3D 0x00000000, + .reserved2 =3D 0x00000000, + .fastl2vic_base =3D 0x0000241e, + .jtlb_size_entries =3D 0x00000080, + .coproc_present =3D 0x00000001, + .ext_contexts =3D 0x00000004, + .vtcm_base =3D 0x00002500, + .vtcm_size_kb =3D 0x00002000, + .l2tag_size =3D 0x00000400, + .l2ecomem_size =3D 0x00000000, + .thread_enable_mask =3D 0x0000003f, + .eccreg_base =3D 0x0000241f, + .l2line_size =3D 0x00000080, + .tiny_core =3D 0x00000000, + .l2itcm_size =3D 0x00000000, + .l2itcm_base =3D 0x00002400, + .reserved3 =3D 0x00000000, + .dtm_present =3D 0x00000000, + .dma_version =3D 0x00000003, + .hvx_vec_log_length =3D 0x00000007, + .core_id =3D 0x00000000, + .core_count =3D 0x00000000, + .coproc2_reg0 =3D 0x00000040, + .coproc2_reg1 =3D 0x00000020, + .v2x_mode =3D 0x00000001, + .coproc2_reg2 =3D 0x00000008, + .coproc2_reg3 =3D 0x00000020, + .coproc2_reg4 =3D 0x00000000, + .coproc2_reg5 =3D 0x00000002, + .coproc2_reg6 =3D 0x00000016, + .coproc2_reg7 =3D 0x00000006, + .acd_preset =3D 0x00000001, + .mnd_preset =3D 0x00000000, + .l1d_size_kb =3D 0x00000010, + .l1i_size_kb =3D 0x00000020, + .l1d_write_policy =3D 0x00000002, + .vtcm_bank_width =3D 0x00000080, + .reserved3 =3D 0x00000001, + .reserved4 =3D 0x00000000, + .reserved5 =3D 0x00000003, + .coproc2_cvt_mpy_size =3D 0x0000000a, + .consistency_domain =3D 0x000000e0, + .capacity_domain =3D 0x00000080, + .axi3_lowaddr =3D 0x00000000, + }, +}; diff --git a/hw/hexagon/machine_cfg_v68n_1024.h.inc b/hw/hexagon/machine_cf= g_v68n_1024.h.inc new file mode 100644 index 0000000000..257c133df8 --- /dev/null +++ b/hw/hexagon/machine_cfg_v68n_1024.h.inc @@ -0,0 +1,64 @@ + +static hexagon_machine_config v68n_1024 =3D { + .cfgbase =3D 0xde000000, + .l2tcm_size =3D 0x00000000, + .l2vic_base =3D 0xfc910000, + .l2vic_size =3D 0x00001000, + .csr_base =3D 0xfc900000, + .qtmr_region =3D 0xfc921000, + .cfgtable =3D { + .l2tcm_base =3D 0x0000d800, + .reserved0 =3D 0x00000000, + .subsystem_base =3D 0x0000fc90, + .etm_base =3D 0x0000d819, + .l2cfg_base =3D 0x0000d81a, + .reserved1 =3D 0x00000000, + .l1s0_base =3D 0x0000d840, + .axi2_lowaddr =3D 0x00003000, + .streamer_base =3D 0x0000d81c, + .reserved2 =3D 0x0000d81d, + .fastl2vic_base =3D 0x0000d81e, + .jtlb_size_entries =3D 0x00000080, + .coproc_present =3D 0x00000001, + .ext_contexts =3D 0x00000004, + .vtcm_base =3D 0x0000d840, + .vtcm_size_kb =3D 0x00001000, + .l2tag_size =3D 0x00000400, + .l2ecomem_size =3D 0x00000400, + .thread_enable_mask =3D 0x0000003f, + .eccreg_base =3D 0x0000d81f, + .l2line_size =3D 0x00000080, + .tiny_core =3D 0x00000000, + .l2itcm_size =3D 0x00000000, + .l2itcm_base =3D 0x0000d820, + .reserved3 =3D 0x00000000, + .dtm_present =3D 0x00000000, + .dma_version =3D 0x00000001, + .hvx_vec_log_length =3D 0x00000007, + .core_id =3D 0x00000000, + .core_count =3D 0x00000000, + .coproc2_reg0 =3D 0x00000040, + .coproc2_reg1 =3D 0x00000020, + .v2x_mode =3D 0x1f1f1f1f, + .coproc2_reg2 =3D 0x1f1f1f1f, + .coproc2_reg3 =3D 0x1f1f1f1f, + .coproc2_reg4 =3D 0x1f1f1f1f, + .coproc2_reg5 =3D 0x1f1f1f1f, + .coproc2_reg6 =3D 0x1f1f1f1f, + .coproc2_reg7 =3D 0x1f1f1f1f, + .acd_preset =3D 0x1f1f1f1f, + .mnd_preset =3D 0x1f1f1f1f, + .l1d_size_kb =3D 0x1f1f1f1f, + .l1i_size_kb =3D 0x1f1f1f1f, + .l1d_write_policy =3D 0x1f1f1f1f, + .vtcm_bank_width =3D 0x1f1f1f1f, + .reserved3 =3D 0x1f1f1f1f, + .reserved4 =3D 0x1f1f1f1f, + .reserved5 =3D 0x1f1f1f1f, + .coproc2_cvt_mpy_size =3D 0x1f1f1f1f, + .consistency_domain =3D 0x1f1f1f1f, + .capacity_domain =3D 0x1f1f1f1f, + .axi3_lowaddr =3D 0x1f1f1f1f, + }, +}; + --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785241; cv=none; d=zohomail.com; s=zohoarc; b=jwDA2yRw3CNuepjC/GxPiHi0Y+Iu9IwwL6jEcGIQpFeux8WLj7qtSTe8bNGjkFDiQT59dcrn9iJI1BNrVEtaQKrI11V+iPClRC8wHzemAXjEHr8aH7eP+mLLGAyznJnXfMBeQsrjXx3gq7JKeYcZcGByutgkwj0zm8kBG2SUjwg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785241; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=t/+RS/dILureKsj4+zFn/U26oQZlnVC8JXhx/wheCqw=; b=AoNLVp2CbNMV+HEjAwu+AXo4NTmHTh3CdvDXYpeM6yHV8HQmH/6JPQIhchcDUEj7C5aec+jx0FswfvSzjS2xC/1SxVhwQle+IOZ9a5ZQLC3pJpFAfIpbC3BPd1cuMYZraJ8e7IGgApyHTb7n3+V7Dg7JPuCO7uuqPZIzie9cbPk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785241759377.92472057854604; Mon, 1 Sep 2025 20:54:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2U-0006sC-Lq; Mon, 01 Sep 2025 23:50:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2J-0006Te-1F for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:24 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2G-0004ve-Hc for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:22 -0400 Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822SgZ2016289 for ; Tue, 2 Sep 2025 03:50:09 GMT Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48urvyxdnj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:09 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-24b0e137484so3703945ad.0 for ; Mon, 01 Sep 2025 20:50:09 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= t/+RS/dILureKsj4+zFn/U26oQZlnVC8JXhx/wheCqw=; b=BQL67BfXcRX7KVBO TsYwlPVImOOKQfKyAueCvcfomLnIeDkUUj2/Yebz/cFgEsMmaqbSDPO5lpSaZq5f 3TDbHkwgteV4WePJXtwP5CJN0T0WRleeOrd74mkBuDJZWDgj4IAyHOVsTavokD6c hz5fpAPXuCCZdOr9DIDCZq4vc/oL7FtkBGysgW0HyV1LB3WNwxs89SEswxoIzfsW hb4GdL6SfRktPcDjL7Sklhig6aOUKYeasMfiHfFfUdUW3VAFxSSf+kfn/e1lBrFv QQpJeoYUtBUbhD1yuujj5BzKzJA7wqgWHlO/iBWHNkwY8M9IXARoP+33gYmKNTjc IEdawQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785008; x=1757389808; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=t/+RS/dILureKsj4+zFn/U26oQZlnVC8JXhx/wheCqw=; b=Da+mzxaFve4SIxuXzl+Ohp8X51Su6/LYvRn5YltHmoWv1Xm3rwsxbOLFFn+vAmhIST TPREk0M8qfM1E89/rY3cgmXP/MiPPGwpb26yWkyjQtXHkPkPMb2isiJkE57EfyCGY6I2 BHZwaKP8Rtq9/SgvvLhScWfIkz/DR/1DZ//+Vr6/iZI0BqutTC6GsgqlsiKW4gQ1fTIG THXh5XAJmIxUFSRxGtsg6K3t++1+wJtUn6We+lDYsP6YV7eBBp8Tk6jSmobLsksGBUS9 YNmTGJUCRxBkSq7AIkUfvqHaqMdUe7tIIAjStj6ApREo95FKMpfUjwrl58JYgMCUWzWc ffbw== X-Gm-Message-State: AOJu0Yyry4bJwLun4eI9AZAFINBtm91G8fpg+5SGHVD+OZvzUeMnQdkE 6k7jcmoS4rqEqCTEniJbB5FvUY+0E0px6KfpcDDHz98bp13Yl+QtjsTofXgC7mQDj/CwIRfVesN YeKUjSyaXWQxVjIIVlO3hwoVUt+A2jfs27hH4Ep5Ho4TzCzG5bJ5Z4ahh3cUSXqqtuF34 X-Gm-Gg: ASbGncvEnL3jB8yd2aKjy37QLoK5x6tFVjuKFMaYRkJk8Vq5iTV1x7Kjj4UESE4AvEh b8x1PjPl/XdvaNbNX5FKbpZoCU7pKSQqj0rOP54HKFFrzWOwDGGSO5AIQTeBJo0BGO2rVFWTRYZ Dx8ZP1g/82IT6kc3r7YSCrDK9CEyqa/bPTkj712CBmIYhMX4m6qc+akfnCaGo6xBrl/yxAv/Z74 WGtBGMs+wPGPXSVaIzUhzGnCwEUc7lqcU65K4jqarjca/3bmRBY2v/OE7otP0YF6lfrrn8j7Eul igipwMhPHac6LkeYTcar+MZmuyUDXGqufMFUaj17JJJ+trWQ9ml5CxwHEaMzwP90eS/+V41acic G8aNfDe0KX/A2 X-Received: by 2002:a17:902:c952:b0:240:44a6:5027 with SMTP id d9443c01a7336-249448d6fa9mr131692235ad.15.1756785007962; Mon, 01 Sep 2025 20:50:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFqzyi589CngXXKG2iJ3O0Px5SeGGafxjLxTm8U23puJsRMaepd3vBLvbB24J1E1nGxiQ801g== X-Received: by 2002:a17:902:c952:b0:240:44a6:5027 with SMTP id d9443c01a7336-249448d6fa9mr131691845ad.15.1756785007486; Mon, 01 Sep 2025 20:50:07 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Sid Manning Subject: [PATCH v2 05/11] hw/hexagon: Add support for cfgbase Date: Mon, 1 Sep 2025 20:49:45 -0700 Message-Id: <20250902034951.1948194-6-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: wmpKYHGpxLRKamlYdmCmy-PPeNFJdkOp X-Proofpoint-ORIG-GUID: wmpKYHGpxLRKamlYdmCmy-PPeNFJdkOp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAyNyBTYWx0ZWRfX6n2kEppgXLBt 8N+SKabuGP+XetWy5+FNBM5E4Sn+mWTEcOWUszhXJFdxc2V4I9UmgLEtW1nFEWYvr/xARk4NN3j 8cncgZUPj7rF1m8s2NzLC7rXJ77m8n/v0D230f6Y0yRK259dg3PRDqkT0kZXmtIpBjRL81bkSyi To+tXn0Bk4M9EKQ+fK/RJNRVmYX6VR37QWBAjKSO8O4xVY4LI0M277M/zws71x5wWWgdCi8oify R1WxTuhbNPQ2tY1X0pFuDqILR0nmffT/8Jf1s4VX2KxGgoTEHrNy0B6wQWyjVQj6nhJcLt2wXZl Y0aRpD1u1g7jL0J6F8LstNIVa01aK/nulJC0OJAMTSPWEr6GHMUVrXs5DNaB4ZwDz5C4tE3paDo DJFty9o6 X-Authority-Analysis: v=2.4 cv=NrDRc9dJ c=1 sm=1 tr=0 ts=68b66971 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=pGLkceISAAAA:8 a=nfi2BKWVWryVphq1m2UA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 suspectscore=0 malwarescore=0 priorityscore=1501 phishscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300027 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785243812116600 From: Sid Manning Reviewed-by: Taylor Simpson Signed-off-by: Sid Manning --- hw/hexagon/hexagon_dsp.c | 10 ++++++++++ target/hexagon/cpu.c | 2 ++ 2 files changed, 12 insertions(+) diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c index d491a21a76..486dc41f5d 100644 --- a/hw/hexagon/hexagon_dsp.c +++ b/hw/hexagon/hexagon_dsp.c @@ -83,6 +83,12 @@ static void hexagon_common_init(MachineState *machine, R= ev_t rev, =20 MemoryRegion *address_space =3D get_system_memory(); =20 + MemoryRegion *config_table_rom =3D g_new(MemoryRegion, 1); + memory_region_init_rom(config_table_rom, NULL, "config_table.rom", + sizeof(m_cfg->cfgtable), &error_fatal); + memory_region_add_subregion(address_space, m_cfg->cfgbase, + config_table_rom); + MemoryRegion *sram =3D g_new(MemoryRegion, 1); memory_region_init_ram(sram, NULL, "ddr.ram", machine->ram_size, &error_fatal); @@ -136,6 +142,10 @@ static void hexagon_common_init(MachineState *machine,= Rev_t rev, } =20 } + + rom_add_blob_fixed_as("config_table.rom", &m_cfg->cfgtable, + sizeof(m_cfg->cfgtable), m_cfg->cfgbase, + &address_space_memory); } =20 static void init_mc(MachineClass *mc) diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c index ba78a04bdc..6cf9250b99 100644 --- a/target/hexagon/cpu.c +++ b/target/hexagon/cpu.c @@ -405,6 +405,8 @@ void hexagon_cpu_soft_reset(CPUHexagonState *env) } #endif =20 + +#define HEXAGON_CFG_ADDR_BASE(addr) (((addr) >> 16) & 0x0fffff) static void hexagon_cpu_reset_hold(Object *obj, ResetType type) { CPUState *cs =3D CPU(obj); --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785479; cv=none; d=zohomail.com; s=zohoarc; b=CYmTgEZGIGeQUTPFsl61CwxRL/aJpjKQE2wLeJsqiQl+By9VwiOolFMP6oY2Yilo+kwL/L76tzrMaYiWtljs2rSHS/3PaZXoUOwb/n0Ebv1K57JdHIV4nsm2FxSm/oqqXVzTtiW4+2viLNS8oj7EYTwn+b7P3g2rQR1sUQkOQ8Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785479; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Cxpn5WiUNamoyYJ5chnT6xEKV6QOQI0br86wFh+RdBg=; b=IaVSDWeT8NOlOQq7IDiexPANtbq6xK09h03hJQRDGtm7qbNLCpWQJjwFIKKh9HV4bcUFIxL/WOQ8+fr0AKWVc+cCf073f3li5l2ZXBj6w/+lB42v0vyYUwS4Kic9TCw7WbyuiTERzKT95cW9JravNiZWfKklM9kXpyHw+gtME5A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785479244773.0036547528052; Mon, 1 Sep 2025 20:57:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2X-00078w-Ku; Mon, 01 Sep 2025 23:50:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2K-0006Tt-FV for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:26 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2H-0004vw-Kk for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:24 -0400 Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822RmuA009790 for ; Tue, 2 Sep 2025 03:50:10 GMT Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48urmjedcy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:10 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-24a9de13b7eso25940285ad.0 for ; Mon, 01 Sep 2025 20:50:10 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= Cxpn5WiUNamoyYJ5chnT6xEKV6QOQI0br86wFh+RdBg=; b=Hdom5UaTM08C6kSf rXq6YlrpOVGmie6TvtnwohHqIWdKT7U1TzFo0dvlwab2mNnXdPQNTUD/lIPsKHOR S0Ihim+PfjEB2oCLS5zS4tfJm9o/twCyDn2OPAo5NV6QLGOLQyreQzZLiK8yHSjM /rjC/ngG8ONtvg+f3kHjvzbB2ByHqEWrPXlYXPFPEdq3nqxvOMi8/SXMSY+pfZbq R5CpR5878TPtUfgI0p4kqmxadnBaI2OLVfqwz2PI5q4JZ/jSYH8DTBe9osLAdlAV bAp21ey0/OVmbIigHZSCuGhouJP070F76bpXHJDxHSNgWAY2XUWMtYk6DS6h21f/ RNwRSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785009; x=1757389809; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Cxpn5WiUNamoyYJ5chnT6xEKV6QOQI0br86wFh+RdBg=; b=fewiXVEKLkWze324/iDL6IYVD+tIdkumLENOqK1xTwyiExR1Hisg8GzHYTsAOaYYYx FN8GETdqbMsf1kuGy4tAsrYJIUoTkA5LGJwD4sUDPPbhgN/df+fIdiKtHbwrKT5LoKnG ikAZOhD7sfV1F8x2o/eM03MjGLGO49IhoKOIuY7vyrhqJ4fQ/x3Gjr/iloQCGQUfE9ME BIE9UMHZTpIWwSTbISnc0duJDenZPOJds7GmMCVpVoqDckwij9dMAVV7YnYRuoRWvV0T +PJ1I1Qhr6iLgiDsGXX72MGesOBc2ukMYWcmkMg809Qr7lAnJHDuwmNuadwC8dSv/0m0 6dQA== X-Gm-Message-State: AOJu0YxsLTrxksCCeSXU5RTXXDUynI4sUK8D6yjAStSmdATri3krFarr Vau/jgVka0arOkqgUoqBYMZOtETEJjWo4hCE9tgQHto2EjXl6aIyi2ZtQcxSls5c/FP7qXti9cW rjxUhRUkgf3M2h3NtnZjlOjWnGyv7FrwOTGPmM3jnMZ0RD4po2dl6DBPXFiQfPHzOeiyu X-Gm-Gg: ASbGncttqWUqlCYMQcy//mdipeEvYXLGL1ZN6JaFpqdjw8p1xI0s+f4YGcax/o52fCd b/35d5rjlYde71NdAzRXcIOC4jC1PIlhbNNgvsGQHPWe47VHK5hyqIduC5nAfmMQDQg9pnZzg8+ JS9txi8xjB5zJzi7mVkGsQ5O48X7UK9NTNnRdRZi1WzFm85DZbrRvTzuvc6EsircTzDT6GlX2ae Q0qDYsIMBL+XJIQAjivOWXH8jtyzzlvM1bB5+jZtHZQlgPJHi3j+q7wKYIPZa4JPsPERVzkD9ya NIpV5or6B/3VZt8vFaFXqGrl2gcm6zksVhVhteEAWc8jRn8G8p6kyd8mmFtlJ+noJtMFl/TLlN0 QzQJHrUwSml0W X-Received: by 2002:a17:903:ac8:b0:248:a629:4b23 with SMTP id d9443c01a7336-24944aa310bmr140061485ad.36.1756785009028; Mon, 01 Sep 2025 20:50:09 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFUdYYCsxjUW5rIw+f3t6W/0Wd7s88TMne2S9/CLMn4X4jcftFU10InwDxNxRIBfQVmesDb7g== X-Received: by 2002:a17:903:ac8:b0:248:a629:4b23 with SMTP id d9443c01a7336-24944aa310bmr140061135ad.36.1756785008553; Mon, 01 Sep 2025 20:50:08 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Brian Cain Subject: [PATCH v2 06/11] hw/hexagon: Modify "Standalone" symbols Date: Mon, 1 Sep 2025 20:49:46 -0700 Message-Id: <20250902034951.1948194-7-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=OemYDgTY c=1 sm=1 tr=0 ts=68b66972 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=pGLkceISAAAA:8 a=EUspDBNiAAAA:8 a=QhYL57-57G4zB7GrFpIA:9 a=QEXdDO2ut3YA:10 a=uG9DUKGECoFWVXl0Dc02:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-GUID: kNaI94D7shRxJuvn54xPKw-Q1fG0gQOu X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAyNCBTYWx0ZWRfXzynhFJBnFUvM Cd5a5WG7R6ZoluYMamatsiLJwMq5uaGIOaL+PbsB473ZE+QjYJLwWMKn8hLakKEWo883xvdj4qD WSQ+Json6tcpub6POqXXGyR4G7K2XWW+hv7Hj1xXmGD/EaVnvE7CZXnUA09B2jnH7ywmRpMyKMq cHIvjl80IS6RsPrSsKzrBVvD882/iQw7BTiJ1r5QKhDBwnJgsf3LxqX2qBrod6lj/8pkJ55LZJ1 ahOwW0JRKpTD/obSviOoXuhb85QYE80RBYD39tiwAPCxEfuF59GqcGEar/al9fOZMC95JDTiSVH L/RiLCvR8e52qwlkVraJXDB+XTxWo46xUZwS3qbBbnNQ2IqWFkP8G771ZVAEZOSLH6ASBGhTy7X g33nFWTT X-Proofpoint-ORIG-GUID: kNaI94D7shRxJuvn54xPKw-Q1fG0gQOu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 spamscore=0 bulkscore=0 priorityscore=1501 adultscore=0 clxscore=1015 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300024 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785480761116601 From: Brian Cain These symbols are used by Hexagon Standalone OS to indicate whether the program should halt and wait for interrupts at startup. For QEMU, we want these programs to just continue crt0 startup through to the user program's main(). Reviewed-by: Taylor Simpson Signed-off-by: Brian Cain --- hw/hexagon/hexagon_dsp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c index 486dc41f5d..510378280e 100644 --- a/hw/hexagon/hexagon_dsp.c +++ b/hw/hexagon/hexagon_dsp.c @@ -29,9 +29,17 @@ =20 #include "machine_cfg_v66g_1024.h.inc" =20 +static hwaddr isdb_secure_flag; +static hwaddr isdb_trusted_flag; static void hex_symbol_callback(const char *st_name, int st_info, uint64_t st_value, uint64_t st_size) { + if (!g_strcmp0("isdb_secure_flag", st_name)) { + isdb_secure_flag =3D st_value; + } + if (!g_strcmp0("isdb_trusted_flag", st_name)) { + isdb_trusted_flag =3D st_value; + } } =20 /* Board init. */ @@ -60,6 +68,13 @@ static void hexagon_init_bootstrap(MachineState *machine= , HexagonCPU *cpu) { if (machine->kernel_filename) { hexagon_load_kernel(cpu); + uint32_t mem =3D 1; + if (isdb_secure_flag) { + cpu_physical_memory_write(isdb_secure_flag, &mem, sizeof(mem)); + } + if (isdb_trusted_flag) { + cpu_physical_memory_write(isdb_trusted_flag, &mem, sizeof(mem)= ); + } } } =20 --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785444; cv=none; d=zohomail.com; s=zohoarc; b=lw3QUInMuMER5hojBHFfw7o2fPCQcDQ9MmFiaNvzbOifsgzddw4oizFS4TcOTP9OG+pcyT9BrWLKRY39QsKYzlEtNqrgj0CnpdMszIkSEvvi9guRrcFvFh3AqORnsbU6h74Uot4gQ32hoXaFXnyu324QAJa8xmfzBIgy+efSabQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785444; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+JnaxFHcskS39CXDwL4DzF2dGzebaqnHGQJgk+Qg4pc=; b=HZGd4cdv4hOCaxIo5znxWlpKXlyBMP4p1x/mcTwC+wXj8mCbhepgTur0+XJ6j+mdswJpOZkHku9HdvWpMMXvgd+Rh8sxKpSDu5N0k1nQBJvIsjWCtkCOTjYX9Ridszj7mBIzj/t6Lp8tuSn8Ga8RPQmmqggNkb9j8dhiLJ6pkMM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785444302513.3836696138596; Mon, 1 Sep 2025 20:57:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2x-0007qg-N1; Mon, 01 Sep 2025 23:51:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2O-0006bB-5q for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:28 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2L-0004wF-7l for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:27 -0400 Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822TUGd027881 for ; Tue, 2 Sep 2025 03:50:14 GMT Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48uscuxeda-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:14 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-b47173afd90so6838959a12.1 for ; Mon, 01 Sep 2025 20:50:13 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= +JnaxFHcskS39CXDwL4DzF2dGzebaqnHGQJgk+Qg4pc=; b=U5RGHOh29OCZUTxB zS8AwfkU9LywYkNR57aLol9zJW9Dn2a6QWxtprUYlZNdqLeF4jwUv0/9Z/Wlm+MA BU7PiNXwMCGIgBnbHru25Wc1dC5i1msQultBvvvxlmaENAIOfepVJh7veugFAy2h EHiNlT5sPQCYhZOhKdbcsCNfRuw5DOdUfcLeBycQI5mRLO99IDVt4DAgyFZbzRZm x0AwjJEkz7nFTFMDQx2JHvbqYof2E78ycfjfIugRE5eE1U0iifNE6hqeApde7Nem xOgvpq8/Zdgwc1nR7kMZdt3Tn1/aFtrwqTKQ159isguxU7UqdqmJSEpMvcwGINc2 Zyu7Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785010; x=1757389810; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+JnaxFHcskS39CXDwL4DzF2dGzebaqnHGQJgk+Qg4pc=; b=MOoB+LGZ8LDtMcvoBhuD9LBccMtPhWu6quqQmlbQCLIxIkySHjAbqlMnNbphuu4lEW PvVl8WfU6CN5j0Z9gtbaj6jHqoBDAf86S+7SK+/+yHADber/VbhnC9lrX+D8dR4oRyKY 0pnjHWqftoqGakwWevnJqgOt4/VDVmUb5iif6F7C5liPKbRRXPzMKuc+NbOqStZUSJ4m hv4PyIUmByBiWUrk0pSCBABzA5zv9DXyhDG9We4WgZXXQal4QwyY9rrEkGqwVgdvYer2 YRkDOyEioCfFWxYYzklc9LlyIU2moIQoYahjoTl1PxezjqqhT9BccADsWmR6k/cfHGuP 6VJw== X-Gm-Message-State: AOJu0YyNG7AXGQ5nHzsl3CG4LUErQOYKhgE+RnHhrj/BoWldZnFb8NpS IflfYz6/cwNfQkMbeHaEYdG4skKtGzq7rbs4v6zoE9CQmqwCrv5hpG+7qIiUIQZgLOVJKQkeLsU ty/kla8FX59JZr72penFNq2Z2g46BSuC/UrvhrXvK2AN8d9XoiQs5cyiG31EtXqaoNlUx X-Gm-Gg: ASbGncvF+7w9VnKoPO5el0LTyKAxCFRFyceZEr+h5UlErA+fuG+6NJA+5pCRvdv0YYM hhHPk2mIb8p6ntrqI6Xb311EDfGymFaTVb/y+c51aDSk/PQV2aGj77yxZTgWoQAAt361QcPpQdb 0QSY2GbFYGRrLaaukEAn+LpiLx31IF5SVm/ZWUP8i06rOobUkr4TjCPGAnV33Lg1JYFxZf4WodG G+TXgXi8jMyyxxhUNOMPlmdVNwbxXCPnfUu+5hjoi0mRjimCWXXjvOZsXpPJCURvWoBqNziZSnS 2/28UJJlPZQK7Wg5k9wTY4af99eRZTlTzHWkE4T6Dm9q3n8ytJqMCM27NAaMApR8t7zY/7DrWDZ wVHDqPcQ0xIZE X-Received: by 2002:a05:6a20:42a3:b0:240:409:fa91 with SMTP id adf61e73a8af0-243d6e00cfemr14102184637.18.1756785009967; Mon, 01 Sep 2025 20:50:09 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFiHSHKac4tzuEGUqFWO2xwrM5tSRsZ5YncF/bawf6bERMxVnJ+SHE0KFBJ4jgXuREWUnVleA== X-Received: by 2002:a05:6a20:42a3:b0:240:409:fa91 with SMTP id adf61e73a8af0-243d6e00cfemr14102155637.18.1756785009546; Mon, 01 Sep 2025 20:50:09 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com Subject: [PATCH v2 07/11] target/hexagon: add build config for softmmu Date: Mon, 1 Sep 2025 20:49:47 -0700 Message-Id: <20250902034951.1948194-8-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAzMSBTYWx0ZWRfX4Mf1LVX2dAt9 f8Uc4Ki9UVriKfr3m9PDHG786dF1eA+//0tngU0CALVKK3T6iQ0gUKRIBQGprZMc2zVMS8ylNFP cJwlmaoIEM9UJqtYJ3uomsCywsF2wQHLjOKG0Q7FPGZa3QcMKJRJZWQsmwJrK9NqVVvfJGYQpxV yPS1cPIlzp8AsyFVmcvJavw4wMp0KhWtCIQgDNgitVRBRfSV3zZ7zar6LowOKsaiyfQo5hB+elF r367xrA9hJF0jEEF0HiMUECOpkzkUJTn8D9odNSrtWAt5mQ+Pny07IkFEt9Nc6wqH7WoBLZxZLo YaJ3Jojq52hi5ObCnLtIymXk7f4Po0bpjCk/0XJsCoiOpPfR5B70vlC7L3NlauIUKGiIeS37/np qYCcTVcV X-Authority-Analysis: v=2.4 cv=A8xsP7WG c=1 sm=1 tr=0 ts=68b66976 cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=pGLkceISAAAA:8 a=EUspDBNiAAAA:8 a=7U61yWmk6EQC0jbKVGMA:9 a=QEXdDO2ut3YA:10 a=bFCP_H2QrGi7Okbo017w:22 X-Proofpoint-ORIG-GUID: ZRtC3ky84GYAwxhmYByNWAV3Q1BzRn8w X-Proofpoint-GUID: ZRtC3ky84GYAwxhmYByNWAV3Q1BzRn8w X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 impostorscore=0 bulkscore=0 clxscore=1015 suspectscore=0 malwarescore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300031 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785446402116600 Reviewed-by: Taylor Simpson Signed-off-by: Brian Cain --- MAINTAINERS | 1 + configs/devices/hexagon-softmmu/default.mak | 7 +++++++ configs/targets/hexagon-softmmu.mak | 6 ++++++ target/hexagon/cpu.h | 4 ---- target/Kconfig | 1 + target/hexagon/Kconfig | 2 ++ target/hexagon/meson.build | 12 +++++++++++- 7 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 configs/devices/hexagon-softmmu/default.mak create mode 100644 configs/targets/hexagon-softmmu.mak create mode 100644 target/hexagon/Kconfig diff --git a/MAINTAINERS b/MAINTAINERS index efc237b27b..e19fcf9e69 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -237,6 +237,7 @@ F: linux-user/hexagon/ F: tests/tcg/hexagon/ F: disas/hexagon.c F: configs/targets/hexagon-linux-user/default.mak +F: configs/devices/hexagon-softmmu/default.mak F: docker/dockerfiles/debian-hexagon-cross.docker F: gdb-xml/hexagon*.xml F: docs/system/target-hexagon.rst diff --git a/configs/devices/hexagon-softmmu/default.mak b/configs/devices/= hexagon-softmmu/default.mak new file mode 100644 index 0000000000..08e709aea7 --- /dev/null +++ b/configs/devices/hexagon-softmmu/default.mak @@ -0,0 +1,7 @@ +# Default configuration for hexagon-softmmu + +# Uncomment the following lines to disable these optional devices: + +# Boards are selected by default, uncomment to keep out of the build. +# CONFIG_HEX_DSP=3Dy +# CONFIG_L2VIC=3Dy diff --git a/configs/targets/hexagon-softmmu.mak b/configs/targets/hexagon-= softmmu.mak new file mode 100644 index 0000000000..8c208bf468 --- /dev/null +++ b/configs/targets/hexagon-softmmu.mak @@ -0,0 +1,6 @@ +# Default configuration for hexagon-softmmu + +TARGET_ARCH=3Dhexagon +TARGET_SUPPORTS_MTTCG=3Dy +TARGET_XML_FILES=3Dgdb-xml/hexagon-core.xml gdb-xml/hexagon-hvx.xml gdb-xm= l/hexagon-sys.xml +TARGET_LONG_BITS=3D32 diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h index 86fbe30dbb..57840d2100 100644 --- a/target/hexagon/cpu.h +++ b/target/hexagon/cpu.h @@ -33,10 +33,6 @@ #include "mmvec/mmvec.h" #include "hw/registerfields.h" =20 -#ifndef CONFIG_USER_ONLY -#error "Hexagon does not support system emulation" -#endif - #ifndef CONFIG_USER_ONLY #include "reg_fields.h" typedef struct CPUHexagonTLBContext CPUHexagonTLBContext; diff --git a/target/Kconfig b/target/Kconfig index d0c7b59d9c..37781146b9 100644 --- a/target/Kconfig +++ b/target/Kconfig @@ -16,6 +16,7 @@ source sh4/Kconfig source sparc/Kconfig source tricore/Kconfig source xtensa/Kconfig +source hexagon/Kconfig =20 config TARGET_BIG_ENDIAN bool diff --git a/target/hexagon/Kconfig b/target/hexagon/Kconfig new file mode 100644 index 0000000000..7e556f3506 --- /dev/null +++ b/target/hexagon/Kconfig @@ -0,0 +1,2 @@ +config HEXAGON + bool diff --git a/target/hexagon/meson.build b/target/hexagon/meson.build index 3ec53010fa..d2b56b9e65 100644 --- a/target/hexagon/meson.build +++ b/target/hexagon/meson.build @@ -245,6 +245,7 @@ decodetree_trans_funcs_generated =3D custom_target( command: [python, files('gen_trans_funcs.py'), semantics_generated, '@= OUTPUT@'], ) hexagon_ss.add(decodetree_trans_funcs_generated) +hexagon_softmmu_ss =3D ss.source_set() =20 hexagon_ss.add(files( 'cpu.c', @@ -264,6 +265,13 @@ hexagon_ss.add(files( 'mmvec/system_ext_mmvec.c', )) =20 +hexagon_softmmu_ss.add(files( + 'hex_mmu.c', + 'hex_interrupts.c', + 'hexswi.c', + 'machine.c', +)) + # # Step 4.5 # We use flex/bison based idef-parser to generate TCG code for a lot @@ -273,7 +281,8 @@ hexagon_ss.add(files( # idef-generated-enabled-instructions # idef_parser_enabled =3D get_option('hexagon_idef_parser') -if idef_parser_enabled and 'hexagon-linux-user' in target_dirs +if idef_parser_enabled and ('hexagon-linux-user' in target_dirs or + 'hexagon-softmmu' in target_dirs) idef_parser_input_generated =3D custom_target( 'idef_parser_input.h.inc', output: 'idef_parser_input.h.inc', @@ -400,3 +409,4 @@ analyze_funcs_generated =3D custom_target( hexagon_ss.add(analyze_funcs_generated) =20 target_arch +=3D {'hexagon': hexagon_ss} +target_system_arch +=3D {'hexagon': hexagon_softmmu_ss} --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785663; cv=none; d=zohomail.com; s=zohoarc; b=Q8HQCskKVKZKs6A2Z8SlvWQta+UC5kN1Yp9YKvFm0l2NgzJb3qjCqdbgLPn1YwdtBrjiQW5wHEe8B1Zm0ESf2l2yGpTYlmDSuR5P5o5jO07vCfZZFVAFFPVAsmNX63t4rlcgSaGbNPf2+cEVLwh0TE3icvChWy30h1ALygQt3Ug= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785663; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=LsJ1LXtFQjKlVRm2VA8fsf5sAhwAw/Q3j5jrOxqGFCM=; b=PmgGZ7N9cF5FsfsGvAYaQ6GNZF2A8nX/HXsR0xn1ZeFI4GA7cvgkGIwgKsACQO7895dVHeV7dUGtDukJmZzzgtW2i323VqSeMWfB3BYA8i4hw39kI67NHnXA1ikx2g3U2j/+1j1AkvbZJ6/LK+aUqv9lebi1/cpW4azDsbHYNuE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785663061763.5031739032128; Mon, 1 Sep 2025 21:01:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2a-0007LG-II; Mon, 01 Sep 2025 23:50:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2N-0006b3-Kv for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:28 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2K-0004w9-J5 for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:27 -0400 Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822TL7O017357 for ; Tue, 2 Sep 2025 03:50:13 GMT Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48urvyxdnv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:12 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-329e375d372so274521a91.3 for ; Mon, 01 Sep 2025 20:50:12 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= LsJ1LXtFQjKlVRm2VA8fsf5sAhwAw/Q3j5jrOxqGFCM=; b=fVTA9IjHb8hZx7xt pO1p16n/AlB2jRJuw6xZGoGOlt63Ebfott0r3z6Y/aT1WPV3Jqzs3r/5Ggu7WE0x SqdlfbwiqFhehhNBDC2Ng5ljSKOVEu+0cvoxeKSPVlWdvvKOQ6xjNL4PprBYg8XR kuzr7NmKepBJglk28ap8QbzPmW8UUBMslhGLeWEfohfsZvzCeKOXZRMVYHw8KiXB tFZPvNkBACqpSIxBrEO0HYPmAjAlkcCyNl7h6SLaUfTMwNDyMvGJpaqOWiaE1M+V ORuwaa7m589kJcWWh8gXfSd0I94Nffmsk9dOD9OO1nuPiHB26Dfm/UGPlTYN6+Zw Zl4gfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785011; x=1757389811; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LsJ1LXtFQjKlVRm2VA8fsf5sAhwAw/Q3j5jrOxqGFCM=; b=LsveSSsBOQrDtsAQPJxPUnZpB2eEhbqziO5FoY00dsPXIiXcFNk28AKAhsoHvgkfYN 5QEbiKkyFcgJ2Ghk/Evu3eSo77mlvs4gcd+ye0h7rXhwoSqNRV3tttoRxwPoQVNPCfj7 G9yrtyce0t/nVjvV80IPsMy5LfLvNAMQuYZ//yrHQ+WRdNmGzfBwo+OFPHRitCj8OQN2 Kox4odA7dEho9vbWkb5McrDnnzDrebv95HVr59ERpwFZqdAf3wIpQGW6RGR0Rs2NIPWS VOseGD3vmHeJj37BNvBnaqNcn7j4P6EWQnt0eoATxEBhuT/NUWrdPujWfP0i/Zz0CsH/ LEGQ== X-Gm-Message-State: AOJu0YzKOE8Kl5G1PWKYuj68Tc1iCRgoaYpH92mKcyAiI/rReV2b53x2 UCSFVI+lLvI6db43q2v9EK/tRlV2v0r1TWJopVSfLtWaSv53VhuVVUMo4bIc4UQ2EQn5m1jozSE 54PEbCd0FD8DmqG5nyBMp3arhJZGzDgObIkRAGrhnZaFv3EEr2hbJZkbJWNzSTSRXOS/b X-Gm-Gg: ASbGncsyvJTOnoa3Wao9diBO2/fHAfSFBG3JvqFi3pKMmkgoF97lYbQFKreeyPCYoDP JMzjDo2ws1s0FK+clG39bRX7Kk/eaO9U5wrcPh3/xRb5VXU7dlmkSqYfFi/5QeEcBpl7i37KXVP GHrF2oD1wCr4mA5DuPeeJn2QueNwq6DYGN3pbckAMZFXS06HbrzOffGe+loTg+5EnT2aVCqMB0D V/q6H5StEio1k0gkDoawTnHxIrJa9bmOeDQjGzutAeDvlcLza15WUMS78kpuFwdB3cUL+jgAjK5 wL1ghG4RookY6+f/9H/99FqCBZqjIECPQFj5EEngicLx7BbDAqalqZ66068/Fv82ytekuxRVKiw cxjqIzPrLEZwO X-Received: by 2002:a17:90b:17cb:b0:327:ea30:b with SMTP id 98e67ed59e1d1-328156baa8bmr14470573a91.18.1756785011220; Mon, 01 Sep 2025 20:50:11 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFkgb+jPbjDZWShsFLpXUtyKQGDkElNkrvO1PE81LjIGgqrVU5E0iEPEcnVJ/AiJgVFYmaZLQ== X-Received: by 2002:a17:90b:17cb:b0:327:ea30:b with SMTP id 98e67ed59e1d1-328156baa8bmr14470519a91.18.1756785010564; Mon, 01 Sep 2025 20:50:10 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Brian Cain Subject: [PATCH v2 08/11] hw/hexagon: Define hexagon "virt" machine Date: Mon, 1 Sep 2025 20:49:48 -0700 Message-Id: <20250902034951.1948194-9-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: ovW6fqM6eWTY6Y7qtHcuSFioIhKXoHZJ X-Proofpoint-ORIG-GUID: ovW6fqM6eWTY6Y7qtHcuSFioIhKXoHZJ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAyNyBTYWx0ZWRfX12ztyh5P1Olx 1NFTUABAo31sf3URfk40G3YTaidPJAsVr8wpHn6iPqrfsMO8HQnt+mCfA94ggIrBdp1z73anhFb vZKoaNHUd1AIptz2A1o9OXex9FJiPy6MmWeNUNXu5mJh6GjKrOsNWKaYBlUb/wZoSzegRl/u+kW x0fSDUqoNucDuIc/bOLjmFO6gAf1Hv9Al1Fb8b8ljDNobhZCwNs2B+KIPhC3XACxSeoYea+bg1k iN4mT/fQTKXlg5qDeR70MHtRDIkjXq8fnxsX64EhExtfZRdWPZSGDclndY4t0WiJ5Mce3F1kqE2 HEY2p3DGiRZhcnYARP8Gp023l67Xp+afsYpv0oS1O1i4GCnDX1p8l7/xW/sS6A5UHh0lP6bAuOp LWVZLUiQ X-Authority-Analysis: v=2.4 cv=NrDRc9dJ c=1 sm=1 tr=0 ts=68b66974 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=EUspDBNiAAAA:8 a=6WAqP26IpYyNH_cq97EA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 suspectscore=0 malwarescore=0 priorityscore=1501 phishscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300027 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785665120116600 From: Brian Cain Signed-off-by: Brian Cain --- configs/devices/hexagon-softmmu/default.mak | 1 + configs/targets/hexagon-softmmu.mak | 1 + include/hw/hexagon/virt.h | 43 ++ hw/hexagon/virt.c | 435 ++++++++++++++++++++ hw/hexagon/Kconfig | 10 + hw/hexagon/meson.build | 2 + tests/qemu-iotests/testenv.py | 1 + 7 files changed, 493 insertions(+) create mode 100644 include/hw/hexagon/virt.h create mode 100644 hw/hexagon/virt.c diff --git a/configs/devices/hexagon-softmmu/default.mak b/configs/devices/= hexagon-softmmu/default.mak index 08e709aea7..37b4f9f323 100644 --- a/configs/devices/hexagon-softmmu/default.mak +++ b/configs/devices/hexagon-softmmu/default.mak @@ -3,5 +3,6 @@ # Uncomment the following lines to disable these optional devices: =20 # Boards are selected by default, uncomment to keep out of the build. +# CONFIG_HEX_VIRT=3Dy # CONFIG_HEX_DSP=3Dy # CONFIG_L2VIC=3Dy diff --git a/configs/targets/hexagon-softmmu.mak b/configs/targets/hexagon-= softmmu.mak index 8c208bf468..9f8fca1dc1 100644 --- a/configs/targets/hexagon-softmmu.mak +++ b/configs/targets/hexagon-softmmu.mak @@ -4,3 +4,4 @@ TARGET_ARCH=3Dhexagon TARGET_SUPPORTS_MTTCG=3Dy TARGET_XML_FILES=3Dgdb-xml/hexagon-core.xml gdb-xml/hexagon-hvx.xml gdb-xm= l/hexagon-sys.xml TARGET_LONG_BITS=3D32 +TARGET_NEED_FDT=3Dy diff --git a/include/hw/hexagon/virt.h b/include/hw/hexagon/virt.h new file mode 100644 index 0000000000..0c92fb3bb8 --- /dev/null +++ b/include/hw/hexagon/virt.h @@ -0,0 +1,43 @@ +/* + * Definitions for hexagon virt board. + * + * Copyright (c) 2024-2025 Qualcomm Innovation Center, Inc. All Rights Res= erved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_HEXAGONVIRT_H +#define HW_HEXAGONVIRT_H + +#include "hw/boards.h" +#include "target/hexagon/cpu.h" + +struct HexagonVirtMachineState { + /*< private >*/ + MachineState parent_obj; + + int fdt_size; + MemoryRegion *sys; + MemoryRegion cfgtable; + MemoryRegion ram; + MemoryRegion tcm; + MemoryRegion vtcm; + MemoryRegion bios; + DeviceState *l2vic; + Clock *apb_clk; +}; + +void hexagon_load_fdt(const struct HexagonVirtMachineState *vms); + +enum { + VIRT_UART0, + VIRT_QTMR0, + VIRT_QTMR1, + VIRT_GPT, + VIRT_MMIO, + VIRT_FDT, +}; + +#define TYPE_HEXAGON_VIRT_MACHINE MACHINE_TYPE_NAME("virt") +OBJECT_DECLARE_SIMPLE_TYPE(HexagonVirtMachineState, HEXAGON_VIRT_MACHINE) + +#endif /* HW_HEXAGONVIRT_H */ diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c new file mode 100644 index 0000000000..615fde773d --- /dev/null +++ b/hw/hexagon/virt.c @@ -0,0 +1,435 @@ +/* + * Hexagon virt emulation + * + * Copyright (c) 2024-2025 Qualcomm Innovation Center, Inc. All Rights Res= erved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/hexagon/virt.h" +#include "elf.h" +#include "hw/char/pl011.h" +#include "hw/clock.h" +#include "hw/core/sysbus-fdt.h" +#include "hw/hexagon/hexagon.h" +#include "hw/hexagon/hexagon_globalreg.h" +#include "hw/loader.h" +#include "hw/qdev-properties.h" +#include "hw/qdev-clock.h" +#include "hw/register.h" +#include "qemu/error-report.h" +#include "qemu/guest-random.h" +#include "qemu/units.h" +#include "elf.h" +#include "machine_cfg_v68n_1024.h.inc" +#include "system/address-spaces.h" +#include "system/device_tree.h" +#include "system/reset.h" +#include "system/system.h" +#include + +static const int VIRTIO_DEV_COUNT =3D 8; + +static const MemMapEntry base_memmap[] =3D { + [VIRT_UART0] =3D { 0x10000000, 0x00000200 }, + [VIRT_MMIO] =3D { 0x11000000, 0x1000000, }, + [VIRT_GPT] =3D { 0xab000000, 0x00001000 }, + [VIRT_FDT] =3D { 0x99800000, 0x00400000 }, +}; + +static const int irqmap[] =3D { + [VIRT_MMIO] =3D 18, /* ...to 18 + VIRTIO_DEV_COUNT - 1 */ + [VIRT_GPT] =3D 12, + [VIRT_UART0] =3D 15, + [VIRT_QTMR0] =3D 2, + [VIRT_QTMR1] =3D 4, +}; + + +static void create_fdt(HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + void *fdt =3D create_device_tree(&vms->fdt_size); + + if (!fdt) { + error_report("create_device_tree() failed"); + exit(1); + } + + ms->fdt =3D fdt; + + qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,hexagon-virt"); + qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2); + qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x1); + qemu_fdt_setprop_string(fdt, "/", "model", "linux,hexagon-virt"); + + qemu_fdt_setprop_string(fdt, "/", "model", "hexagon-virt,qemu"); + qemu_fdt_setprop_string(fdt, "/", "compatible", "qcom,sm8150"); + + qemu_fdt_add_subnode(fdt, "/soc"); + qemu_fdt_setprop_cell(fdt, "/soc", "#address-cells", 0x2); + qemu_fdt_setprop_cell(fdt, "/soc", "#size-cells", 0x1); + qemu_fdt_setprop(fdt, "/soc", "ranges", NULL, 0); + + qemu_fdt_add_subnode(fdt, "/chosen"); + + uint8_t rng_seed[32]; + qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); + qemu_fdt_setprop(fdt, "/chosen", "rng-seed", rng_seed, sizeof(rng_seed= )); +} + +static void fdt_add_hvx(HexagonVirtMachineState *vms, + const hexagon_machine_config *m_cfg, Error **errp) +{ + const MachineState *ms =3D MACHINE(vms); + uint32_t vtcm_size_bytes =3D m_cfg->cfgtable.vtcm_size_kb * 1024; + if (vtcm_size_bytes > 0) { + memory_region_init_ram(&vms->vtcm, NULL, "vtcm.ram", vtcm_size_byt= es, + errp); + memory_region_add_subregion(vms->sys, m_cfg->cfgtable.vtcm_base <<= 16, + &vms->vtcm); + + qemu_fdt_add_subnode(ms->fdt, "/soc/vtcm"); + qemu_fdt_setprop_string(ms->fdt, "/soc/vtcm", "compatible", + "qcom,hexagon_vtcm"); + + assert(sizeof(m_cfg->cfgtable.vtcm_base) =3D=3D sizeof(uint32_t)); + qemu_fdt_setprop_cells(ms->fdt, "/soc/vtcm", "reg", 0, + m_cfg->cfgtable.vtcm_base << 16, + vtcm_size_bytes); + } + + if (m_cfg->cfgtable.ext_contexts > 0) { + qemu_fdt_add_subnode(ms->fdt, "/soc/hvx"); + qemu_fdt_setprop_string(ms->fdt, "/soc/hvx", "compatible", + "qcom,hexagon-hvx"); + qemu_fdt_setprop_cells(ms->fdt, "/soc/hvx", "qcom,hvx-max-ctxts", + m_cfg->cfgtable.ext_contexts); + qemu_fdt_setprop_cells(ms->fdt, "/soc/hvx", "qcom,hvx-vlength", + m_cfg->cfgtable.hvx_vec_log_length); + } +} + +static int32_t irq_hvm_ic_phandle =3D -1; +static void fdt_add_hvm_pic_node(HexagonVirtMachineState *vms, + const hexagon_machine_config *m_cfg) +{ + MachineState *ms =3D MACHINE(vms); + irq_hvm_ic_phandle =3D qemu_fdt_alloc_phandle(ms->fdt); + + qemu_fdt_setprop_cell(ms->fdt, "/soc", "interrupt-parent", + irq_hvm_ic_phandle); + + qemu_fdt_add_subnode(ms->fdt, "/soc/interrupt-controller"); + qemu_fdt_setprop_cell(ms->fdt, "/soc/interrupt-controller", + "#address-cells", 2); + qemu_fdt_setprop_cell(ms->fdt, "/soc/interrupt-controller", + "#interrupt-cells", 2); + qemu_fdt_setprop_string(ms->fdt, "/soc/interrupt-controller", "compati= ble", + "qcom,h2-pic,hvm-pic"); + qemu_fdt_setprop(ms->fdt, "/soc/interrupt-controller", + "interrupt-controller", NULL, 0); + qemu_fdt_setprop_cell(ms->fdt, "/soc/interrupt-controller", "phandle", + irq_hvm_ic_phandle); + + sysbus_mmio_map(SYS_BUS_DEVICE(vms->l2vic), 1, + m_cfg->cfgtable.fastl2vic_base << 16); +} + + +static void fdt_add_gpt_node(HexagonVirtMachineState *vms) +{ + g_autofree char *name =3D NULL; + MachineState *ms =3D MACHINE(vms); + + name =3D g_strdup_printf("/soc/gpt@%" PRIx64, + (int64_t)base_memmap[VIRT_GPT].base); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", + "qcom,h2-timer,hvm-timer"); + qemu_fdt_setprop_cells(ms->fdt, name, "interrupts", irqmap[VIRT_GPT], = 0); + qemu_fdt_setprop_cells(ms->fdt, name, "reg", 0x0, + base_memmap[VIRT_GPT].base, + base_memmap[VIRT_GPT].size); +} + +static int32_t clock_phandle =3D -1; +static void fdt_add_clocks(const HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + clock_phandle =3D qemu_fdt_alloc_phandle(ms->fdt); + qemu_fdt_add_subnode(ms->fdt, "/apb-pclk"); + qemu_fdt_setprop_string(ms->fdt, "/apb-pclk", "compatible", "fixed-clo= ck"); + qemu_fdt_setprop_cell(ms->fdt, "/apb-pclk", "#clock-cells", 0x0); + qemu_fdt_setprop_cell(ms->fdt, "/apb-pclk", "clock-frequency", 2400000= 0); + qemu_fdt_setprop_string(ms->fdt, "/apb-pclk", "clock-output-names", + "clk24mhz"); + qemu_fdt_setprop_cell(ms->fdt, "/apb-pclk", "phandle", clock_phandle); +} + +static void fdt_add_uart(const HexagonVirtMachineState *vms, int uart) +{ + char *nodename; + hwaddr base =3D base_memmap[uart].base; + hwaddr size =3D base_memmap[uart].size; + assert(uart =3D=3D 0); + int irq =3D irqmap[VIRT_UART0 + uart]; + const char compat[] =3D "arm,pl011\0arm,primecell"; + const char clocknames[] =3D "uartclk\0apb_pclk"; + MachineState *ms =3D MACHINE(vms); + DeviceState *dev; + SysBusDevice *s; + + dev =3D qdev_new(TYPE_PL011); + s =3D SYS_BUS_DEVICE(dev); + qdev_prop_set_chr(dev, "chardev", serial_hd(0)); + qdev_connect_clock_in(dev, "clk", vms->apb_clk); + sysbus_realize_and_unref(s, &error_fatal); + sysbus_mmio_map(s, 0, base); + sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->l2vic, irq)); + + nodename =3D g_strdup_printf("/pl011@%" PRIx64, base); + qemu_fdt_add_subnode(ms->fdt, nodename); + + /* Note that we can't use setprop_string because of the embedded NUL */ + qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compa= t)); + qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0, base, size); + qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", 32 + irq, 0); + qemu_fdt_setprop_cells(ms->fdt, nodename, "clocks", clock_phandle, + clock_phandle); + qemu_fdt_setprop(ms->fdt, nodename, "clock-names", clocknames, + sizeof(clocknames)); + qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", + irq_hvm_ic_phandle); + + qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", nodename); + qemu_fdt_add_subnode(ms->fdt, "/aliases"); + qemu_fdt_setprop_string(ms->fdt, "/aliases", "serial0", nodename); + + g_free(nodename); +} + +static void fdt_add_cpu_nodes(const HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + qemu_fdt_add_subnode(ms->fdt, "/cpus"); + qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1); + qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0); + + /* cpu nodes */ + for (int num =3D ms->smp.cpus - 1; num >=3D 0; num--) { + char *nodename =3D g_strdup_printf("/cpus/cpu@%d", num); + qemu_fdt_add_subnode(ms->fdt, nodename); + qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu"); + qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", num); + qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", + qemu_fdt_alloc_phandle(ms->fdt)); + g_free(nodename); + } +} + + +static void fdt_add_virtio_devices(const HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + /* VirtIO MMIO devices */ + for (int i =3D 0; i < VIRTIO_DEV_COUNT; i++) { + char *nodename; + int irq =3D irqmap[VIRT_MMIO] + i; + size_t size =3D base_memmap[VIRT_MMIO].size; + hwaddr base =3D base_memmap[VIRT_MMIO].base + i * size; + + nodename =3D g_strdup_printf("/virtio_mmio@%" PRIx64, base); + qemu_fdt_add_subnode(ms->fdt, nodename); + qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "virtio,m= mio"); + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 1, + size); + qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", irq, 0); + qemu_fdt_setprop_cell(ms->fdt, nodename, "interrupt-parent", + irq_hvm_ic_phandle); + + sysbus_create_simple( + "virtio-mmio", base, + qdev_get_gpio_in(vms->l2vic, irqmap[VIRT_MMIO] + i)); + + g_free(nodename); + } +} + +static void virt_instance_init(Object *obj) +{ + HexagonVirtMachineState *vms =3D HEXAGON_VIRT_MACHINE(obj); + + create_fdt(vms); +} + +void hexagon_load_fdt(const HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + hwaddr fdt_addr =3D base_memmap[VIRT_FDT].base; + uint32_t fdtsize =3D vms->fdt_size; + + g_assert(fdtsize <=3D base_memmap[VIRT_FDT].size); + /* copy in the device tree */ + rom_add_blob_fixed_as("fdt", ms->fdt, fdtsize, fdt_addr, + &address_space_memory); + qemu_register_reset_nosnapshotload( + qemu_fdt_randomize_seeds, + rom_ptr_for_as(&address_space_memory, fdt_addr, fdtsize)); +} + +static uint64_t load_kernel(const HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + uint64_t entry =3D 0; + if (load_elf_ram_sym(ms->kernel_filename, NULL, NULL, NULL, &entry, NU= LL, + NULL, NULL, 0, EM_HEXAGON, 0, 0, &address_space_m= emory, + false, NULL) > 0) { + return entry; + } + error_report("error loading '%s'", ms->kernel_filename); + exit(1); +} + +static uint64_t load_bios(HexagonVirtMachineState *vms) +{ + MachineState *ms =3D MACHINE(vms); + uint64_t bios_addr =3D 0x0; /* Load BIOS at reset vector address 0x0 = */ + int bios_size; + + bios_size =3D load_image_targphys(ms->firmware ?: "", bios_addr, 64 * = 1024); + if (bios_size < 0) { + error_report("Could not load BIOS '%s'", ms->firmware ?: ""); + exit(1); + } + + return bios_addr; /* Return entry point at address 0x0 */ +} + +static void do_cpu_reset(void *opaque) +{ + HexagonCPU *cpu =3D opaque; + CPUState *cs =3D CPU(cpu); + cpu_reset(cs); +} + +static void virt_init(MachineState *ms) +{ + HexagonVirtMachineState *vms =3D HEXAGON_VIRT_MACHINE(ms); + Error **errp =3D NULL; + const hexagon_machine_config *m_cfg =3D &v68n_1024; + + qemu_fdt_setprop_string(ms->fdt, "/chosen", "bootargs", ms->kernel_cmd= line); + + vms->sys =3D get_system_memory(); + + /* Create APB clock for peripherals */ + vms->apb_clk =3D clock_new(OBJECT(ms), "apb-pclk"); + clock_set_hz(vms->apb_clk, 24000000); + + memory_region_init_ram(&vms->ram, NULL, "ddr.ram", ms->ram_size, errp); + memory_region_add_subregion(vms->sys, 0x0, &vms->ram); + + if (m_cfg->l2tcm_size) { + memory_region_init_ram(&vms->tcm, NULL, "tcm.ram", m_cfg->l2tcm_si= ze, + errp); + memory_region_add_subregion(vms->sys, m_cfg->cfgtable.l2tcm_base <= < 16, + &vms->tcm); + } + + memory_region_init_rom(&vms->cfgtable, NULL, "config_table.rom", + sizeof(m_cfg->cfgtable), errp); + memory_region_add_subregion(vms->sys, m_cfg->cfgbase, &vms->cfgtable); + fdt_add_hvx(vms, m_cfg, errp); + const char *cpu_model =3D ms->cpu_type; + + if (!cpu_model) { + cpu_model =3D HEXAGON_CPU_TYPE_NAME("v73"); + } + + DeviceState *gsregs_dev =3D qdev_new(TYPE_HEXAGON_GLOBALREG); + object_property_add_child(OBJECT(ms), "global-regs", OBJECT(gsregs_dev= )); + qdev_prop_set_uint64(gsregs_dev, "config-table-addr", m_cfg->cfgbase); + qdev_prop_set_uint32(gsregs_dev, "dsp-rev", v68_rev); + qdev_prop_set_uint32(gsregs_dev, "qtimer-base-addr", m_cfg->qtmr_regio= n); + sysbus_realize_and_unref(SYS_BUS_DEVICE(gsregs_dev), errp); + + HexagonCPU *cpu_0 =3D NULL; + for (int i =3D 0; i < ms->smp.cpus; i++) { + HexagonCPU *cpu =3D HEXAGON_CPU(object_new(ms->cpu_type)); + qemu_register_reset(do_cpu_reset, cpu); + + if (i =3D=3D 0) { + cpu_0 =3D cpu; + if (ms->kernel_filename) { + uint64_t entry =3D load_kernel(vms); + qdev_prop_set_uint32(DEVICE(cpu_0), "exec-start-addr", ent= ry); + } else if (ms->firmware) { + uint64_t entry =3D load_bios(vms); + qdev_prop_set_uint32(DEVICE(cpu_0), "exec-start-addr", ent= ry); + } + } + qdev_prop_set_bit(DEVICE(cpu), "start-powered-off", (i !=3D 0)); + qdev_prop_set_uint32(DEVICE(cpu), "hvx-contexts", + m_cfg->cfgtable.ext_contexts); + object_property_set_link(OBJECT(cpu), "global-regs", + OBJECT(gsregs_dev), errp); + qdev_prop_set_uint32(DEVICE(cpu), "l2vic-base-addr", m_cfg->l2vic_= base); + qdev_prop_set_uint32(DEVICE(cpu), "jtlb-entries", + m_cfg->cfgtable.jtlb_size_entries); + + if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) { + return; + } + } + vms->l2vic =3D sysbus_create_varargs( + "l2vic", m_cfg->l2vic_base, qdev_get_gpio_in(DEVICE(cpu_0), 0), + qdev_get_gpio_in(DEVICE(cpu_0), 1), qdev_get_gpio_in(DEVICE(cpu_0)= , 2), + qdev_get_gpio_in(DEVICE(cpu_0), 3), qdev_get_gpio_in(DEVICE(cpu_0)= , 4), + qdev_get_gpio_in(DEVICE(cpu_0), 5), qdev_get_gpio_in(DEVICE(cpu_0)= , 6), + qdev_get_gpio_in(DEVICE(cpu_0), 7), NULL); + + fdt_add_hvm_pic_node(vms, m_cfg); + fdt_add_virtio_devices(vms); + fdt_add_cpu_nodes(vms); + fdt_add_clocks(vms); + fdt_add_uart(vms, VIRT_UART0); + fdt_add_gpt_node(vms); + + rom_add_blob_fixed_as("config_table.rom", &m_cfg->cfgtable, + sizeof(m_cfg->cfgtable), m_cfg->cfgbase, + &address_space_memory); + + + hexagon_load_fdt(vms); +} + + +static void virt_class_init(ObjectClass *oc, const void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + + mc->init =3D virt_init; + mc->default_cpu_type =3D HEXAGON_CPU_TYPE_NAME("v73"); + mc->default_ram_size =3D 4 * GiB; + mc->max_cpus =3D 8; + mc->default_cpus =3D 8; + mc->is_default =3D false; + mc->default_kernel_irqchip_split =3D false; + mc->block_default_type =3D IF_VIRTIO; + mc->default_boot_order =3D NULL; + mc->no_cdrom =3D 1; + mc->numa_mem_supported =3D false; + mc->default_nic =3D "virtio-mmio-bus"; +} + + +static const TypeInfo virt_machine_types[] =3D { { + .name =3D TYPE_HEXAGON_VIRT_MACHINE, + .parent =3D TYPE_MACHINE, + .instance_size =3D sizeof(HexagonVirtMachineState), + .class_init =3D virt_class_init, + .instance_init =3D virt_instance_init, +} }; + +DEFINE_TYPES(virt_machine_types) diff --git a/hw/hexagon/Kconfig b/hw/hexagon/Kconfig index 7b9577f68f..dc74751d21 100644 --- a/hw/hexagon/Kconfig +++ b/hw/hexagon/Kconfig @@ -3,3 +3,13 @@ config HEX_DSP default y depends on HEXAGON && TCG imply PTIMER + +config HEX_VIRT + bool + default y + depends on HEX_DSP && FDT + select DEVICE_TREE + select VIRTIO_MMIO + select PL011 + select VIRTIO_BLK + select VIRTIO_SCSI diff --git a/hw/hexagon/meson.build b/hw/hexagon/meson.build index 11e71a67d5..4b856b9583 100644 --- a/hw/hexagon/meson.build +++ b/hw/hexagon/meson.build @@ -3,3 +3,5 @@ hexagon_ss.add(when: 'CONFIG_HEX_DSP', if_true: files('hexa= gon_dsp.c', 'hexagon_ =20 hw_arch +=3D {'hexagon': hexagon_ss} =20 +hexagon_ss.add(when: 'CONFIG_HEX_VIRT', if_true: files('virt.c', 'hexagon_= globalreg.c')) + diff --git a/tests/qemu-iotests/testenv.py b/tests/qemu-iotests/testenv.py index 6326e46b7b..b8eeed703a 100644 --- a/tests/qemu-iotests/testenv.py +++ b/tests/qemu-iotests/testenv.py @@ -239,6 +239,7 @@ def __init__(self, source_dir: str, build_dir: str, ('arm', 'virt'), ('aarch64', 'virt'), ('avr', 'mega2560'), + ('hexagon', 'virt'), ('m68k', 'virt'), ('or1k', 'virt'), ('riscv32', 'virt'), --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785469; cv=none; d=zohomail.com; s=zohoarc; b=kjZGqiZ/5jvhCLfvyQDXmODNMRuYzxOstqEwOwVVsyNyG2XNC75oPmbwu2nHnztjNjIz9BwGB9ntvViYmEtpOGSZge5XGezfgflArMhIWUOM0ag9vBR2p6Ws6cDlWxOAl+omAhFmWTM149XJE7VyKoEFmDG6jZJimV6KOCJbB6o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785469; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=S9U9Uvohu42z9l6+p73uyfEB3XHB6hDRIEdfSEWzNOk=; b=mbQtJgw2M70TYUp6Mvqb89QOvMXXhKk+pJCcQOhwgTmEazF48BaqBCGRF629WJENtB1XjhPSmMwUt8TaPf6Q6oOk0+3TfZKzoWTKSzbLs4/os3bmG+JgXhX4130o2bJ1NSWfTGN6MoxDCpuhhApWWBuryqbHkc2xESvz/JNsRGM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785469209620.5736307989876; Mon, 1 Sep 2025 20:57:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2y-0007wa-7k; Mon, 01 Sep 2025 23:51:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2N-0006b6-TF for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:28 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2M-0004wL-4O for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:27 -0400 Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822S9Y8030159 for ; Tue, 2 Sep 2025 03:50:15 GMT Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48w8wy26vf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:14 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-329ccb59ef6so732200a91.0 for ; Mon, 01 Sep 2025 20:50:14 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= S9U9Uvohu42z9l6+p73uyfEB3XHB6hDRIEdfSEWzNOk=; b=QM21zjO3IOz/Zzk+ pxkwMk7CJ5VCJ5dzSmIpxEmE+dH/5zltCxaZ3Mo3fPrjVZllO31tDDdMKUa2awTA m1hjFnddXwdPyDh27xpZ8XAS/Bhjm+FWzxCbOyKrv6UTFY0+VmSfW33HR1XbLV4w 7Ti/csGeq/jR5iM9HZ717BGJQNNATePhpbBElfX+eS4+mlgtzs4MaCzjfqhQPzpm fRkHWXLu7dgAot3kNJ6OvmhK6RkrUkhEzbNm5QE0ivVbH4OJ/Tr7U/+8tfjq9oRP JF6lrJVDPzi485Jeo/OtBEwas0XbGT6akVzmcJNuxlzZ3aan3e+0pbqXN6mYWa7V UWITQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785012; x=1757389812; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S9U9Uvohu42z9l6+p73uyfEB3XHB6hDRIEdfSEWzNOk=; b=kjLyS8PdQdH1e3OC7TlVcRzLQOB0pvcQra7FyNLgpJNRNqn95oLboEpe4sCL9ugjeT aqrI98QNO/58X4+YnhzqfslAo5mCF5jdiXzXQEVZCnnezkjiORb1nR0oEhGTHIqVp6Sy S9RzE3q17fPZufXjZB7h2+D0azQrFA2JNpqjabHIPc0tGs8744qFkNvHsASRAYZ+6HCt dOy81VrkTafTxqXC0c85iNTaG03eQeaZ+bEErzbd9agVnxK+0L9txDKhXh62xpERdpt6 sHGHPgoJPXm6EF7tPc5UpQDAlg1VSniJaNO6j+z0fdQUsoYkoTZ/zNwMwrY+Ux/bVohs hEqw== X-Gm-Message-State: AOJu0YzguUetuobUeXFg/dAlVsBh/dWcJ7tNKufnL90Tb3JL2O6OX1ke auxeyr6LDTQMosnmiaAv8ttYGSX4YFne6HMJn0HOO3GMIlSaBJXbumxVyJTxzrjoQv2azyzH2RM Wh2IIOv73/4IOX+aPHaoxJqjRpedXdzsCqMUoiGxQvuv9slCKojnWi3VGootXxPIJCM75 X-Gm-Gg: ASbGncsVSIAXaiK7wimh+5ScjXfrFXltf+m4Al5lfTRoxHqU7Dlj6c3b3LanmsPfp/b TG0kQkGHyGhM67lynk76dzRD86tWebwMbboWMXTjAbXy4p5Fd0zlyOVy41oJk01Kf3hHzIJyYFa X8Y15yAtPdmnhpbOa2wibQOQeufTDd4r9+dM8llAkQKGlVppQu3qmnvG6utkXcDV8SnEj3ZvPH4 TErjd+ileRd1m6uESXCD19mt5HK7Sy2KjcP70aF2KJWoHFk98jzwBaIysjoA7aE3Hj+mLRR1tk1 0YRCTC8SJfdCy5JPBTagDjE8m1EklM773rLSYDSo7nrD3uWTejfUzwWytnoXi5FSvWNDMDVO1NS Z3KlvLDRh1FiM X-Received: by 2002:a17:90b:2251:b0:329:e47d:f914 with SMTP id 98e67ed59e1d1-329e47dfa8emr707689a91.21.1756785012244; Mon, 01 Sep 2025 20:50:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHmcSjdWiUIxIP3jCXqgWO5cGdqCFBiKYj491pCrxQXTO/v4a2kOl8oqu0XZJXIJ54jPa7LZw== X-Received: by 2002:a17:90b:2251:b0:329:e47d:f914 with SMTP id 98e67ed59e1d1-329e47dfa8emr707646a91.21.1756785011550; Mon, 01 Sep 2025 20:50:11 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com Subject: [PATCH v2 09/11] tests/qtest: Add hexagon boot-serial-test Date: Mon, 1 Sep 2025 20:49:49 -0700 Message-Id: <20250902034951.1948194-10-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=Ycq95xRf c=1 sm=1 tr=0 ts=68b66976 cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=mx_w8yxdHMTqIFmIFlQA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-GUID: ughswJB8ijo6ZKM1W_jMnMls5naukTnZ X-Proofpoint-ORIG-GUID: ughswJB8ijo6ZKM1W_jMnMls5naukTnZ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTAxMDEwMSBTYWx0ZWRfX90B7jFRTMumH //ITCjaO59Lq3yY2MbeEEO76usfNdcy7Fj5uQBElXK2czzQj7jV+IpnsHsHIsNTdMLGBn9k7Ntm 3XCZPvB7x3nESo7gBgk+HBbHPx5Jxk2QDpRLIOzaJBS807o9E/MID1m2EDgwpjU0gNwXMmxRoXD q85nS7tPB+5yna2QcKeUh+Zi8REFUbcwPZmA2BimUCh55ieW7cj44l6nNdVBxAXgZttkWLBtO5s FDnlP+ZqnAmKLw9Cds4n0AJdo+Hm3dcyq8Y2UnVcMKnM1cwkgM1qbvvjrqxCBVlTOlgURf4v9PM B5/ej/+YarmrxxZKE8Yj75zoqfUK8dVz1DKNNgew/1VJkKEBxPWiYjo60htEiSdo+ihLgxgtaZP 7Qo+/q3B X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 malwarescore=0 bulkscore=0 suspectscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509010101 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785470233124100 Add boot-serial-test support for Hexagon architecture using the virt machine. Signed-off-by: Brian Cain --- tests/qtest/boot-serial-test.c | 8 ++++++++ tests/qtest/meson.build | 2 ++ 2 files changed, 10 insertions(+) diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c index a05d26ee99..733e0f855c 100644 --- a/tests/qtest/boot-serial-test.c +++ b/tests/qtest/boot-serial-test.c @@ -142,6 +142,13 @@ static const uint8_t kernel_stm32vldiscovery[] =3D { 0x04, 0x38, 0x01, 0x40 /* 0x40013804 =3D USART1 TXD */ }; =20 +static const uint8_t bios_hexagon[] =3D { + 0x00, 0x40, 0x00, 0x01, /* immext(#0x10000000) */ + 0x00, 0xc0, 0x00, 0x78, /* r0 =3D ##0x10000000 */ + 0x54, 0xc0, 0x00, 0x3c, /* memb(r0+#0) =3D #0x54 Write= 'T' */ + 0xf8, 0xff, 0xff, 0x59 /* jump 0x0 ; Loop back to sta= rt */ +}; + typedef struct testdef { const char *arch; /* Target architecture */ const char *machine; /* Name of the machine */ @@ -194,6 +201,7 @@ static const testdef_t tests[] =3D { { "arm", "microbit", "", "T", sizeof(kernel_nrf51), kernel_nrf51 }, { "arm", "stm32vldiscovery", "", "T", sizeof(kernel_stm32vldiscovery), kernel_stm32vldiscovery }, + { "hexagon", "virt", "", "TT", sizeof(bios_hexagon), NULL, bios_hexago= n }, =20 { NULL } }; diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 669d07c06b..4e79cd0a8f 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -284,6 +284,8 @@ qtests_riscv32 =3D \ qtests_riscv64 =3D ['riscv-csr-test'] + \ (unpack_edk2_blobs ? ['bios-tables-test'] : []) =20 +qtests_hexagon =3D ['boot-serial-test'] + qos_test_ss =3D ss.source_set() qos_test_ss.add( 'ac97-test.c', --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785201; cv=none; d=zohomail.com; s=zohoarc; b=lWhAvpiVA/QP8xlLge9lf14S4n1G0S4b4tXq4doIJa/IsuWFQy2Nj4dj7Nws1YOPMFFdIvsW4cyT8WM5uDDJTNURSMbKsUjtw2lW6h9LMe5KtiY7/y09QAC9vK8UjfoAMXTcH0liVuIvWcZicJYfYMMjMN2kv8Pb0SCRv5xV0sc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785201; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cmHumC5ToeVsNjzJmH0QFkzMTRIwHtIPnrPpsXwEdwc=; b=TLCA5nshDbLh34wIddaZ3z7yMcvyW0DTO8MyHDbCVJZK78JaYZE4axpHIcORF09dny3iYtjq6UfLZHVk96Ie2dgJRPqGO00hAkUzQMqxY64qOIQShHCEqP8S6NxqA5jep6ryq+y0M9FbGycDtbfBirW5bPNKzu1tNv444oqcDys= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785201071260.1373439911255; Mon, 1 Sep 2025 20:53:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2w-0007lF-MS; Mon, 01 Sep 2025 23:51:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2Z-0007I0-8E for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:40 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2V-0004xR-Vr for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:39 -0400 Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822S7TL030605 for ; Tue, 2 Sep 2025 03:50:24 GMT Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48ura8pc64-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:24 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-329e07f7046so418505a91.1 for ; Mon, 01 Sep 2025 20:50:24 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:content-type:date:from :in-reply-to:message-id:mime-version:references:subject:to; s= qcppdkim1; bh=cmHumC5ToeVsNjzJmH0QFkzMTRIwHtIPnrPpsXwEdwc=; b=Ts fFlGrtodT5j7QKUWnC8dRYlnvlw05SVSk1nTdWOGha1tWJUBKM0mX57T7xvSi6vF XdT4MTEAhMc5gfXoS3IJuF8MANbYDh2yEfwlPgBuK9ndoU/Zi6f6gHz1Bb2ygzZZ 7hSlQZPxe2Wkezvmmjz9A2FaPInMQu3n2fzBotGoDbvDgsJw6DOCmCKBqUrTmULF JQsSa2nXKeVytNyd2G5UVc6m8WBg20+MsfaOreMuaOWHgbjyRsw1npCs0mQqYkI/ R+xTChGgfCThwrnnd74kyUAqjtUkbyc0ZudhIp/MT0bbVZbNVg7UKxSJ0T8ZZEQa RmEuTpeO9ktM+nBUldwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785014; x=1757389814; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cmHumC5ToeVsNjzJmH0QFkzMTRIwHtIPnrPpsXwEdwc=; b=mltY0XOZBOuVsTBBNh176JFDYOErI9yfNdyd1w4fA9JsUJcntuIKsqljUBCNXm6nP5 vzDhaRbM5okMUpFoOrWC1YPqxKzDPUERP7g9NDlTfYoTZ1iHkBmkLtEtIysy7SEDcCaj IXUXo4GEd29VrOFXmACXUwWwXZqZs2hHjl3bwjmHUp9f8MP7wzX4vZ+gUedlAx0AYKmU rBzLFCUFEbyKSh5T6EmIvNBYGQ0z3ygWQiAHMrZBWznUKcFk72oauJbfULUXS9WUaLXs Nmc7SNHiQYgvXPITKBbIDX2RNm9D2Fh8j3Yo99zN06wL8G3iHre8dmn5St7v4dcFp7/S iFjw== X-Gm-Message-State: AOJu0YxyHI0zTQMEr+qAvO0Ye0vR2t1laS+0wwHBAPlfTHGb48JEzkuc KSDP8piXYEOW8EcCcb8mKeYx8qdF7wLKqp1qohH4h2tWIfBBjQbxX2uEW/z1U7Lti8uTU1QDTfo yabhl5NiN3iNvDOSJZ0PLnYmkR+jPLB1W+xYKZucgS7aHds5SDqE//BdS8O4TGieGZ5fO X-Gm-Gg: ASbGncu5G0wDhJGdaQBp/IwbitUXjroS7s8yyIOCgCGnOcu1N5R2OReHygm1BkkYvl/ OIphpyjxiVOBmRvemoqStjOKG2HgUw0QNjOggofEqyaTBRtsubkP1/dNhvlopntrEMyyymLUmjw WGEgo8W9XAK4kXf43oaydm0fPTz2sFvCNtRFtiWz9hxOKxTFGXixf/iEvgvn5sHcHum57xOv+wK y4bvxTdY763kLUg4LZJ65mZzUCIvRbAoP/rdqMeHvLGQHa8UiowJyRB/jCUJ92Qi2fRCuRMs2q3 1F1FpCy4TmQAnU86lCLZs1+hpeEJPqL6aWQ3aX2500GNAxwoguoOxJSPNXkLtCD9qk5QYmHXj4y 1xWEXut1gbPhG X-Received: by 2002:a17:90b:1d48:b0:327:75c9:bea9 with SMTP id 98e67ed59e1d1-328156b638amr14157215a91.24.1756785013513; Mon, 01 Sep 2025 20:50:13 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG+Nu6CDVOUMRAuEkmxOaeanJDzMxBaxJBahezHZyPw1MgG9KzFtMqIq3kVMuGdaIt4I9FKTA== X-Received: by 2002:a17:90b:1d48:b0:327:75c9:bea9 with SMTP id 98e67ed59e1d1-328156b638amr14157162a91.24.1756785012796; Mon, 01 Sep 2025 20:50:12 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Sid Manning , Damien Hedde , =?UTF-8?q?Tobias=20R=C3=B6hmel?= Subject: [PATCH v2 10/11] hw/timer: Add QTimer device Date: Mon, 1 Sep 2025 20:49:50 -0700 Message-Id: <20250902034951.1948194-11-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: FhVAV4T0OQMy-yLGiKP035bN6N7XkEL3 X-Proofpoint-GUID: FhVAV4T0OQMy-yLGiKP035bN6N7XkEL3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAyMCBTYWx0ZWRfXxdLP1uliTDOO QHCLTkLW7LJ8WNP1Zm+0Ir1K9wSVU/7KbRSYzjsMqTJ30VTv99IheygkLjptV13nwUQBQfi4R6r mAKKDdrQeTGiyI5Db1mDqEKnFfVeA+fbrTcCnMQTZC0Zdk+L3RdevdazT7nzDBBcjSBgTr+ybi6 QF+yd+MPwmrSCp8nTdhlwRUvLJBtYUmT+lTOqspeMaJCpdTrQdA0gFYidfBhtH6JuLB8K6PA1jI qA8GJuNAGzLzodEIMBvfI5Ll5JFZypei3g6fwRh7SSbG4Wv5xQbOALCr+MjhLH9vYtQpBoPttVt GpEYB37oXrogOdjxAkv2sRi6cKSsY9HjiQk9OddwSRAEXXarjyHaWU9mrvesfkDNOQ88ra5fpjm gn6yAxOw X-Authority-Analysis: v=2.4 cv=VNndn8PX c=1 sm=1 tr=0 ts=68b66980 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=EUspDBNiAAAA:8 a=Sf4xSIS_LemWqHAq_qwA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 clxscore=1015 adultscore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300020 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785203016124100 From: Sid Manning Note: QTimer was implemented before ARM SSE Timer was upstreamed, there may be opportunity to use that device instead. Co-authored-by: Damien Hedde Co-authored-by: Tobias R=C3=B6hmel Signed-off-by: Brian Cain --- MAINTAINERS | 2 + include/hw/timer/qct-qtimer.h | 85 ++++++ hw/hexagon/hexagon_dsp.c | 7 +- hw/hexagon/hexagon_globalreg.c | 9 +- hw/hexagon/virt.c | 22 ++ hw/timer/qct-qtimer.c | 520 +++++++++++++++++++++++++++++++++ hw/timer/meson.build | 2 + 7 files changed, 642 insertions(+), 5 deletions(-) create mode 100644 include/hw/timer/qct-qtimer.h create mode 100644 hw/timer/qct-qtimer.c diff --git a/MAINTAINERS b/MAINTAINERS index e19fcf9e69..4f7748679b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -230,7 +230,9 @@ M: Brian Cain S: Supported F: target/hexagon/ F: hw/hexagon/ +F: hw/timer/qct-qtimer.c F: include/hw/hexagon/ +F: include/hw/timer/qct-qtimer.h X: target/hexagon/idef-parser/ X: target/hexagon/gen_idef_parser_funcs.py F: linux-user/hexagon/ diff --git a/include/hw/timer/qct-qtimer.h b/include/hw/timer/qct-qtimer.h new file mode 100644 index 0000000000..90f7981ccf --- /dev/null +++ b/include/hw/timer/qct-qtimer.h @@ -0,0 +1,85 @@ +/* + * Qualcomm QCT QTimer + * + * Copyright(c) 2019-2025 Qualcomm Innovation Center, Inc. All Rights Rese= rved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef TIMER_QCT_QTIMER_H +#define TIMER_QCT_QTIMER_H + +#include "hw/ptimer.h" +#include "hw/sysbus.h" + +#define TYPE_QCT_QTIMER "qct-qtimer" +#define TYPE_QCT_HEXTIMER "qct-hextimer" +OBJECT_DECLARE_SIMPLE_TYPE(QCTQtimerState, QCT_QTIMER) +OBJECT_DECLARE_SIMPLE_TYPE(QCTHextimerState, QCT_HEXTIMER) + +struct QCTHextimerState { + QCTQtimerState *qtimer; + ptimer_state *timer; + uint64_t cntval; /* + * Physical timer compare value interrupt when cntpct= > + * cntval + */ + uint64_t cntpct; /* Physical counter */ + uint32_t control; + uint32_t cnt_ctrl; + uint32_t cntpl0acr; + uint64_t limit; + uint32_t freq; + uint32_t int_level; + qemu_irq irq; +}; + +#define QCT_QTIMER_TIMER_FRAME_ELTS (8) +#define QCT_QTIMER_TIMER_VIEW_ELTS (2) +struct QCTQtimerState { + SysBusDevice parent_obj; + + MemoryRegion iomem; + MemoryRegion view_iomem; + uint32_t secure; + struct QCTHextimerState timer[QCT_QTIMER_TIMER_FRAME_ELTS]; + uint32_t frame_id; + uint32_t freq; + uint32_t nr_frames; + uint32_t nr_views; + uint32_t cnttid; +}; + +#define QCT_QTIMER_AC_CNTFRQ (0x000) +#define QCT_QTIMER_AC_CNTSR (0x004) +#define QCT_QTIMER_AC_CNTSR_NSN_1 (1 << 0) +#define QCT_QTIMER_AC_CNTSR_NSN_2 (1 << 1) +#define QCT_QTIMER_AC_CNTSR_NSN_3 (1 << 2) +#define QCT_QTIMER_AC_CNTTID (0x08) +#define QCT_QTIMER_AC_CNTACR_0 (0x40) +#define QCT_QTIMER_AC_CNTACR_1 (0x44) +#define QCT_QTIMER_AC_CNTACR_2 (0x48) +#define QCT_QTIMER_AC_CNTACR_RWPT (1 << 5) /* R/W of CNTP_* regs */ +#define QCT_QTIMER_AC_CNTACR_RWVT (1 << 4) /* R/W of CNTV_* regs */ +#define QCT_QTIMER_AC_CNTACR_RVOFF (1 << 3) /* R/W of CNTVOFF register */ +#define QCT_QTIMER_AC_CNTACR_RFRQ (1 << 2) /* R/W of CNTFRQ register */ +#define QCT_QTIMER_AC_CNTACR_RPVCT (1 << 1) /* R/W of CNTVCT register */ +#define QCT_QTIMER_AC_CNTACR_RPCT (1 << 0) /* R/W of CNTPCT register */ +#define QCT_QTIMER_VERSION (0x0fd0) +#define QCT_QTIMER_CNTPCT_LO (0x000) +#define QCT_QTIMER_CNTPCT_HI (0x004) +#define QCT_QTIMER_CNT_FREQ (0x010) +#define QCT_QTIMER_CNTPL0ACR (0x014) +#define QCT_QTIMER_CNTPL0ACR_PL0CTEN (1 << 9) +#define QCT_QTIMER_CNTPL0ACR_PL0TVEN (1 << 8) +#define QCT_QTIMER_CNTPL0ACR_PL0VCTEN (1 << 1) +#define QCT_QTIMER_CNTPL0ACR_PL0PCTEN (1 << 0) +#define QCT_QTIMER_CNTP_CVAL_LO (0x020) +#define QCT_QTIMER_CNTP_CVAL_HI (0x024) +#define QCT_QTIMER_CNTP_TVAL (0x028) +#define QCT_QTIMER_CNTP_CTL (0x02c) +#define QCT_QTIMER_CNTP_CTL_ISTAT (1 << 2) +#define QCT_QTIMER_CNTP_CTL_INTEN (1 << 1) +#define QCT_QTIMER_CNTP_CTL_ENABLE (1 << 0) +#define QCT_QTIMER_AC_CNTACR_START 0x40 +#define QCT_QTIMER_AC_CNTACR_END 0x5C + +#endif /* TIMER_QCT_QTIMER_H */ diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c index 510378280e..e0e39fca90 100644 --- a/hw/hexagon/hexagon_dsp.c +++ b/hw/hexagon/hexagon_dsp.c @@ -3,7 +3,6 @@ * subsystem with few peripherals, like the Compute DSP. * * Copyright (c) 2020-2024 Qualcomm Innovation Center, Inc. All Rights Res= erved. - * * SPDX-License-Identifier: GPL-2.0-or-later */ =20 @@ -126,7 +125,11 @@ static void hexagon_common_init(MachineState *machine,= Rev_t rev, */ qdev_prop_set_bit(DEVICE(cpu), "start-powered-off", (i !=3D 0)); qdev_prop_set_uint32(DEVICE(cpu), "l2vic-base-addr", m_cfg->l2vic_= base); - qdev_prop_set_uint32(DEVICE(cpu), "config-table-addr", m_cfg->cfgb= ase); + if (!object_property_set_link(OBJECT(cpu), "global-regs", + OBJECT(glob_regs_dev), errp)) { + error_report("Failed to link global system registers to CPU %d= ", i); + return; + } qdev_prop_set_uint32(DEVICE(cpu), "hvx-contexts", m_cfg->cfgtable.ext_contexts); qdev_prop_set_uint32(DEVICE(cpu), "jtlb-entries", diff --git a/hw/hexagon/hexagon_globalreg.c b/hw/hexagon/hexagon_globalreg.c index fcbf2ae4b2..c94d2c4c7f 100644 --- a/hw/hexagon/hexagon_globalreg.c +++ b/hw/hexagon/hexagon_globalreg.c @@ -14,6 +14,7 @@ #include "migration/vmstate.h" #include "qom/object.h" #include "target/hexagon/cpu.h" +#include "hw/timer/qct-qtimer.h" #include "target/hexagon/hex_regs.h" #include "qemu/log.h" #include "trace/trace-hw_hexagon.h" @@ -137,9 +138,11 @@ static inline uint32_t apply_write_mask(uint32_t new_v= al, uint32_t cur_val, =20 static void read_timer(HexagonGlobalRegState *s, uint32_t *low, uint32_t *= high) { - /* Not yet implemented */ - *low =3D 0; - *high =3D 0; + const hwaddr low_addr =3D s->qtimer_base_addr + QCT_QTIMER_CNTPCT_LO; + const hwaddr high_addr =3D s->qtimer_base_addr + QCT_QTIMER_CNTPCT_HI; + + cpu_physical_memory_read(low_addr, low, sizeof(*low)); + cpu_physical_memory_read(high_addr, high, sizeof(*high)); } =20 uint32_t hexagon_globalreg_read(HexagonCPU *cpu, uint32_t reg) diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c index 615fde773d..c93d19ff89 100644 --- a/hw/hexagon/virt.c +++ b/hw/hexagon/virt.c @@ -17,6 +17,8 @@ #include "hw/qdev-properties.h" #include "hw/qdev-clock.h" #include "hw/register.h" +#include "hw/timer/qct-qtimer.h" +#include "qapi/error.h" #include "qemu/error-report.h" #include "qemu/guest-random.h" #include "qemu/units.h" @@ -256,6 +258,25 @@ static void fdt_add_virtio_devices(const HexagonVirtMa= chineState *vms) } } =20 +static void create_qtimer(HexagonVirtMachineState *vms, + const hexagon_machine_config *m_cfg) +{ + Error **errp =3D NULL; + QCTQtimerState *qtimer =3D QCT_QTIMER(qdev_new(TYPE_QCT_QTIMER)); + + object_property_set_uint(OBJECT(qtimer), "nr_frames", 2, errp); + object_property_set_uint(OBJECT(qtimer), "nr_views", 1, errp); + object_property_set_uint(OBJECT(qtimer), "cnttid", 0x111, errp); + sysbus_realize_and_unref(SYS_BUS_DEVICE(qtimer), errp); + + + sysbus_mmio_map(SYS_BUS_DEVICE(qtimer), 1, m_cfg->qtmr_region); + sysbus_connect_irq(SYS_BUS_DEVICE(qtimer), 0, + qdev_get_gpio_in(vms->l2vic, irqmap[VIRT_QTMR0])); + sysbus_connect_irq(SYS_BUS_DEVICE(qtimer), 1, + qdev_get_gpio_in(vms->l2vic, irqmap[VIRT_QTMR1])); +} + static void virt_instance_init(Object *obj) { HexagonVirtMachineState *vms =3D HEXAGON_VIRT_MACHINE(obj); @@ -395,6 +416,7 @@ static void virt_init(MachineState *ms) fdt_add_clocks(vms); fdt_add_uart(vms, VIRT_UART0); fdt_add_gpt_node(vms); + create_qtimer(vms, m_cfg); =20 rom_add_blob_fixed_as("config_table.rom", &m_cfg->cfgtable, sizeof(m_cfg->cfgtable), m_cfg->cfgbase, diff --git a/hw/timer/qct-qtimer.c b/hw/timer/qct-qtimer.c new file mode 100644 index 0000000000..bd7123264c --- /dev/null +++ b/hw/timer/qct-qtimer.c @@ -0,0 +1,520 @@ +/* + * Qualcomm QCT QTimer + * + * Copyright(c) 2019-2025 Qualcomm Innovation Center, Inc. All Rights Rese= rved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + + +#include "qemu/osdep.h" +#include "hw/irq.h" +#include "hw/qdev-properties.h" +#include "hw/timer/qct-qtimer.h" +#include "migration/vmstate.h" +#include "qapi/error.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "qemu/timer.h" + +/* Common timer implementation. */ + +#define QTIMER_MEM_SIZE_BYTES 0x1000 +#define QTIMER_MEM_REGION_SIZE_BYTES 0x1000 +#define QTIMER_DEFAULT_FREQ_HZ 19200000ULL +#define QTMR_TIMER_INDEX_MASK (0xf000) +#define HIGH_32(val) (0x0ffffffffULL & (val >> 32)) +#define LOW_32(val) (0x0ffffffffULL & val) + +/* + * QTimer version reg: + * + * 3 2 1 + * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Major | Minor | Step | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ +static unsigned int TIMER_VERSION =3D 0x20020000; + +/* + * qct_qtimer_read/write: + * if offset < 0x1000 read restricted registers: + * QCT_QTIMER_AC_CNTFREQ/CNTSR/CNTTID/CNTACR/CNTOFF_(LO/HI)/QCT_QTIMER_VER= SION + */ +static uint64_t qct_qtimer_read(void *opaque, hwaddr offset, unsigned size) +{ + QCTQtimerState *s =3D (QCTQtimerState *)opaque; + uint32_t frame =3D 0; + + switch (offset) { + case QCT_QTIMER_AC_CNTFRQ: + return s->freq; + case QCT_QTIMER_AC_CNTSR: + return s->secure; + case QCT_QTIMER_AC_CNTTID: + return s->cnttid; + case QCT_QTIMER_AC_CNTACR_START ... QCT_QTIMER_AC_CNTACR_END: + frame =3D (offset - 0x40) / 0x4; + if (frame >=3D s->nr_frames) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: QCT_QTIMER_AC_CNT: Bad offset %x\n", __func= __, + (int)offset); + return 0x0; + } + return s->timer[frame].cnt_ctrl; + case QCT_QTIMER_VERSION: + return TIMER_VERSION; + default: + qemu_log_mask(LOG_GUEST_ERROR, + "%s: QCT_QTIMER_AC_CNT: Bad offset %" PRIx32 "\n", + __func__, (int)offset); + return 0x0; + } + + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" PRIx32 "\n", __fun= c__, + (int)offset); + return 0; +} + +static void qct_qtimer_write(void *opaque, hwaddr offset, uint64_t value, + unsigned size) +{ + QCTQtimerState *s =3D (QCTQtimerState *)opaque; + uint32_t frame =3D 0; + + if (offset < 0x1000) { + switch (offset) { + case QCT_QTIMER_AC_CNTFRQ: + s->freq =3D value; + return; + case QCT_QTIMER_AC_CNTSR: + if (value > 0xFF) + qemu_log_mask(LOG_GUEST_ERROR, + "%s: QCT_QTIMER_AC_CNTSR: Bad value %x\n", + __func__, (int)value); + else + s->secure =3D value; + return; + case QCT_QTIMER_AC_CNTACR_START ... QCT_QTIMER_AC_CNTACR_END: + frame =3D (offset - QCT_QTIMER_AC_CNTACR_START) / 0x4; + if (frame >=3D s->nr_frames) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: QCT_QTIMER_AC_CNT: Bad offset %x\n", + __func__, (int)offset); + return; + } + s->timer[frame].cnt_ctrl =3D value; + return; + default: + qemu_log_mask(LOG_GUEST_ERROR, + "%s: QCT_QTIMER_AC_CNT: Bad offset %x\n", __func= __, + (int)offset); + return; + } + } else + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset %" PRIx32 "\n", __f= unc__, + (int)offset); +} + +static const MemoryRegionOps qct_qtimer_ops =3D { + .read =3D qct_qtimer_read, + .write =3D qct_qtimer_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static const VMStateDescription vmstate_qct_qtimer =3D { + .name =3D "qct-qtimer", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]){ VMSTATE_END_OF_LIST() } +}; + +static void qct_qtimer_init(Object *obj) +{ + QCTQtimerState *s =3D QCT_QTIMER(obj); + + object_property_add_uint32_ptr(obj, "secure", &s->secure, + OBJ_PROP_FLAG_READ); + object_property_add_uint32_ptr(obj, "frame_id", &s->frame_id, + OBJ_PROP_FLAG_READ); +} + +static void hex_timer_update(QCTHextimerState *s) +{ + /* Update interrupts. */ + int level =3D s->int_level && (s->control & QCT_QTIMER_CNTP_CTL_ENABLE= ); + qemu_set_irq(s->irq, level); +} + +static MemTxResult hex_timer_read(void *opaque, hwaddr offset, uint64_t *d= ata, + unsigned size, MemTxAttrs attrs) +{ + QCTQtimerState *qct_s =3D (QCTQtimerState *)opaque; + uint32_t slot_nr =3D (offset & 0xF000) >> 12; + uint32_t reg_offset =3D offset & 0xFFF; + uint32_t view =3D slot_nr % qct_s->nr_views; + uint32_t frame =3D slot_nr / qct_s->nr_views; + + if (frame >=3D qct_s->nr_frames) { + *data =3D 0; + return MEMTX_ACCESS_ERROR; + } + QCTHextimerState *s =3D &qct_s->timer[frame]; + + + /* + * This is the case where we have 2 views, but the second one is not + * implemented. + */ + if (view && !(qct_s->cnttid & (0x4 << (frame * 4)))) { + *data =3D 0; + return MEMTX_OK; + } + + switch (reg_offset) { + case (QCT_QTIMER_CNT_FREQ): /* Ticks/Second */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RFRQ)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !((s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0PCTEN) || + (s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0VCTEN))) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D s->freq; + return MEMTX_OK; + case (QCT_QTIMER_CNTP_CVAL_LO): /* TimerLoad */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D LOW_32((s->cntval)); + return MEMTX_OK; + case (QCT_QTIMER_CNTP_CVAL_HI): /* TimerLoad */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D HIGH_32((s->cntval)); + return MEMTX_OK; + case QCT_QTIMER_CNTPCT_LO: + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RPCT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0PCTEN)) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D LOW_32((s->cntpct + (ptimer_get_count(s->timer)))); + return MEMTX_OK; + case QCT_QTIMER_CNTPCT_HI: + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RPCT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0PCTEN)) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D HIGH_32((s->cntpct + (ptimer_get_count(s->timer)))); + return MEMTX_OK; + case (QCT_QTIMER_CNTP_TVAL): /* CVAL - CNTP */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D + (s->cntval - (HIGH_32((s->cntpct + (ptimer_get_count(s->timer)= ))) + + LOW_32((s->cntpct + (ptimer_get_count(s->timer))= )))); + return MEMTX_OK; + case (QCT_QTIMER_CNTP_CTL): /* TimerMIS */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + *data =3D s->int_level; + return MEMTX_OK; + case QCT_QTIMER_CNTPL0ACR: + if (view) { + *data =3D 0; + } else { + *data =3D s->cntpl0acr; + } + return MEMTX_OK; + + case QCT_QTIMER_VERSION: + *data =3D TIMER_VERSION; + return MEMTX_OK; + + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset %" PRIx32 "\n", __f= unc__, + (int)offset); + *data =3D 0; + return MEMTX_ACCESS_ERROR; + } +} + +/* + * Reset the timer limit after settings have changed. + * May only be called from inside a ptimer transaction block. + */ +static void hex_timer_recalibrate(QCTHextimerState *s, int reload) +{ + uint64_t limit; + /* Periodic. */ + limit =3D s->limit; + ptimer_set_limit(s->timer, limit, reload); +} + +static MemTxResult hex_timer_write(void *opaque, hwaddr offset, uint64_t v= alue, + unsigned size, MemTxAttrs attrs) +{ + QCTQtimerState *qct_s =3D (QCTQtimerState *)opaque; + uint32_t slot_nr =3D (offset & 0xF000) >> 12; + uint32_t reg_offset =3D offset & 0xFFF; + uint32_t view =3D slot_nr % qct_s->nr_views; + uint32_t frame =3D slot_nr / qct_s->nr_views; + + if (frame >=3D qct_s->nr_frames) { + return MEMTX_ACCESS_ERROR; + } + QCTHextimerState *s =3D &qct_s->timer[frame]; + + /* + * This is the case where we have 2 views, but the second one is not + * implemented. + */ + if (view && !(qct_s->cnttid & (0x4 << (frame * 4)))) { + return MEMTX_OK; + } + + switch (reg_offset) { + case (QCT_QTIMER_CNTP_CVAL_LO): /* TimerLoad */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + + s->int_level =3D 0; + s->cntval =3D value; + ptimer_transaction_begin(s->timer); + if (s->control & QCT_QTIMER_CNTP_CTL_ENABLE) { + /* + * Pause the timer if it is running. This may cause some + * inaccuracy due to rounding, but avoids other issues. + */ + ptimer_stop(s->timer); + } + hex_timer_recalibrate(s, 1); + if (s->control & QCT_QTIMER_CNTP_CTL_ENABLE) { + ptimer_run(s->timer, 0); + } + ptimer_transaction_commit(s->timer); + break; + case (QCT_QTIMER_CNTP_CVAL_HI): + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + break; + case (QCT_QTIMER_CNTP_CTL): /* Timer control register */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + ptimer_transaction_begin(s->timer); + if (s->control & QCT_QTIMER_CNTP_CTL_ENABLE) { + /* + * Pause the timer if it is running. This may cause some + * inaccuracy due to rounding, but avoids other issues. + */ + ptimer_stop(s->timer); + } + s->control =3D value; + hex_timer_recalibrate(s, s->control & QCT_QTIMER_CNTP_CTL_ENABLE); + ptimer_set_freq(s->timer, s->freq); + ptimer_set_period(s->timer, 1); + if (s->control & QCT_QTIMER_CNTP_CTL_ENABLE) { + ptimer_run(s->timer, 0); + } + ptimer_transaction_commit(s->timer); + break; + case (QCT_QTIMER_CNTP_TVAL): /* CVAL - CNTP */ + if (!(s->cnt_ctrl & QCT_QTIMER_AC_CNTACR_RWPT)) { + return MEMTX_ACCESS_ERROR; + } + + if (view && !(s->cntpl0acr & QCT_QTIMER_CNTPL0ACR_PL0CTEN)) { + return MEMTX_ACCESS_ERROR; + } + + ptimer_transaction_begin(s->timer); + if (s->control & QCT_QTIMER_CNTP_CTL_ENABLE) { + /* + * Pause the timer if it is running. This may cause some + * inaccuracy due to rounding, but avoids other issues. + */ + ptimer_stop(s->timer); + } + s->cntval =3D s->cntpct + value; + ptimer_set_freq(s->timer, s->freq); + ptimer_set_period(s->timer, 1); + if (s->control & QCT_QTIMER_CNTP_CTL_ENABLE) { + ptimer_run(s->timer, 0); + } + ptimer_transaction_commit(s->timer); + break; + case QCT_QTIMER_CNTPL0ACR: + if (view) { + break; + } + + s->cntpl0acr =3D value; + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset %" PRIx32 "\n", __f= unc__, + (int)offset); + return MEMTX_ACCESS_ERROR; + } + hex_timer_update(s); + return MEMTX_OK; +} + +static void hex_timer_tick(void *opaque) +{ + QCTHextimerState *s =3D (QCTHextimerState *)opaque; + if ((s->cntpct >=3D s->cntval) && (s->int_level !=3D 1)) { + s->int_level =3D 1; + hex_timer_update(s); + return; + } + s->cntpct +=3D s->limit; +} + +static const MemoryRegionOps hex_timer_ops =3D { + .read_with_attrs =3D hex_timer_read, + .write_with_attrs =3D hex_timer_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static const VMStateDescription vmstate_hex_timer =3D { + .name =3D "hex_timer", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]){ VMSTATE_UINT32(control, QCTHextimerState= ), + VMSTATE_UINT32(cnt_ctrl, QCTHextimerState), + VMSTATE_UINT64(cntpct, QCTHextimerState), + VMSTATE_UINT64(cntval, QCTHextimerState), + VMSTATE_UINT64(limit, QCTHextimerState), + VMSTATE_UINT32(int_level, QCTHextimerState= ), + VMSTATE_PTIMER(timer, QCTHextimerState), + VMSTATE_END_OF_LIST() } +}; + +static void qct_qtimer_realize(DeviceState *dev, Error **errp) +{ + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + QCTQtimerState *s =3D QCT_QTIMER(dev); + unsigned int i; + + if (s->nr_frames > QCT_QTIMER_TIMER_FRAME_ELTS) { + error_setg(errp, "nr_frames too high"); + return; + } + + if (s->nr_views > QCT_QTIMER_TIMER_VIEW_ELTS) { + error_setg(errp, "nr_views too high"); + return; + } + + memory_region_init_io(&s->iomem, OBJECT(sbd), &qct_qtimer_ops, s, "qut= imer", + QTIMER_MEM_SIZE_BYTES); + sysbus_init_mmio(sbd, &s->iomem); + + memory_region_init_io(&s->view_iomem, OBJECT(sbd), &hex_timer_ops, s, + "qutimer_views", + QTIMER_MEM_SIZE_BYTES * s->nr_frames * s->nr_vie= ws); + sysbus_init_mmio(sbd, &s->view_iomem); + + for (i =3D 0; i < s->nr_frames; i++) { + s->timer[i].limit =3D 1; + s->timer[i].control =3D QCT_QTIMER_CNTP_CTL_ENABLE; + s->timer[i].cnt_ctrl =3D + (QCT_QTIMER_AC_CNTACR_RWPT | QCT_QTIMER_AC_CNTACR_RWVT | + QCT_QTIMER_AC_CNTACR_RVOFF | QCT_QTIMER_AC_CNTACR_RFRQ | + QCT_QTIMER_AC_CNTACR_RPVCT | QCT_QTIMER_AC_CNTACR_RPCT); + s->timer[i].qtimer =3D s; + s->timer[i].freq =3D QTIMER_DEFAULT_FREQ_HZ; + + s->secure |=3D (1 << i); + + sysbus_init_irq(sbd, &(s->timer[i].irq)); + + (s->timer[i]).timer =3D + ptimer_init(hex_timer_tick, &s->timer[i], PTIMER_POLICY_LEGACY= ); + vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_hex_timer, + &s->timer[i]); + } +} + +static const Property qct_qtimer_properties[] =3D { + DEFINE_PROP_UINT32("freq", QCTQtimerState, freq, QTIMER_DEFAULT_FREQ_H= Z), + DEFINE_PROP_UINT32("nr_frames", QCTQtimerState, nr_frames, 2), + DEFINE_PROP_UINT32("nr_views", QCTQtimerState, nr_views, 1), + DEFINE_PROP_UINT32("cnttid", QCTQtimerState, cnttid, 0x11), +}; + +static void qct_qtimer_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *k =3D DEVICE_CLASS(klass); + + device_class_set_props(k, qct_qtimer_properties); + k->realize =3D qct_qtimer_realize; + k->vmsd =3D &vmstate_qct_qtimer; +} + +static const TypeInfo qct_qtimer_info =3D { + .name =3D TYPE_QCT_QTIMER, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(QCTQtimerState), + .instance_init =3D qct_qtimer_init, + .class_init =3D qct_qtimer_class_init, +}; + +static void qct_qtimer_register_types(void) +{ + type_register_static(&qct_qtimer_info); +} + +type_init(qct_qtimer_register_types) diff --git a/hw/timer/meson.build b/hw/timer/meson.build index 178321c029..69468672bc 100644 --- a/hw/timer/meson.build +++ b/hw/timer/meson.build @@ -34,3 +34,5 @@ specific_ss.add(when: 'CONFIG_IBEX', if_true: files('ibex= _timer.c')) system_ss.add(when: 'CONFIG_SIFIVE_PWM', if_true: files('sifive_pwm.c')) =20 specific_ss.add(when: 'CONFIG_AVR_TIMER16', if_true: files('avr_timer16.c'= )) + +specific_ss.add(when: 'CONFIG_HEX_DSP', if_true: files('qct-qtimer.c')) --=20 2.34.1 From nobody Sun Sep 28 16:36:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1756785298; cv=none; d=zohomail.com; s=zohoarc; b=VIdlvlxqsB1Yu4NFY9NjzMTsQ/3IGpXfNRc2f3XwQ2cbPc2KULBMeAj8AvTFuaZ6WhO4UjHKgHgwFIOSXOD7pItqgrwEDvPD+t41TEhPGkm7/zQ0JsatXmAnQXmPB9ItyJInhIIBJ8OBjcBMohV2DsOBGHMTGNQ+k3b7tAmYLXA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756785298; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UrDhPZtJLVtIKBvAx7rgg9kjRX/dlVATLOPeCcMw1ZM=; b=H/mzGZIGuz4v+HfBb8ANub2Iahw7bunGL0OvI1p/G4ldjgXRPEWuuxgHAoowRa/8kfpthuM24K1dV5RUpox/3g1yis9wA2/2+IZNd+JYv3Iohd2faQvT3FatAYGqMbnGzZtvi8MhUdH8UbWNEwibhPY5BJyf6I4j5w4Ws1Zn8hA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756785298124217.4953195124715; Mon, 1 Sep 2025 20:54:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utI2a-0007Jo-9s; Mon, 01 Sep 2025 23:50:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2R-0006sD-8B for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:33 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utI2O-0004wc-2a for qemu-devel@nongnu.org; Mon, 01 Sep 2025 23:50:31 -0400 Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5822SGBd030247 for ; Tue, 2 Sep 2025 03:50:16 GMT Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48w8wy26vp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 02 Sep 2025 03:50:16 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-3234811cab3so6086162a91.3 for ; Mon, 01 Sep 2025 20:50:16 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-327c5fc5055sm14117932a91.14.2025.09.01.20.50.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 20:50:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= UrDhPZtJLVtIKBvAx7rgg9kjRX/dlVATLOPeCcMw1ZM=; b=CUBqUyegjb8NvSy/ icEjg2qZI/XJiRd0dDh36ZXDkhTd63YwQvYghXcrILfUPl2ifPSUY8MZGug4hYys ikfBSxi7X/2d6r0E0n7BpVUjuymgSksPWpKRbs70KjwmgYq6lNShDYoHW84fiUk4 vPpV/6XJ4wDrXm3ZFsVmxrH7yDam0rqHPUmoXauW+eFMvwieod1XjgoBKEuEpRdW bFr6is2GfDVxATkSmC0svvp3WrAP8YQGv5Tbn6PtdeuSnSvOI5AhsjCl7awbGzPy k+NQPaKNfryYkehCyjPdkQKYrrFPfhRLYeqjNtu43CKocvUg/YR+ZX1eMooh38pF myb2/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756785015; x=1757389815; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UrDhPZtJLVtIKBvAx7rgg9kjRX/dlVATLOPeCcMw1ZM=; b=v3CNtlQxOKOc8/VW8BVPXWl6jTmMiicRtSCYUgOAqoPIlFZ6eC5O8T/pxHkDS5ofc6 PJLDRQ+uQqWdV5P6lqPXb+AZumZjHj7+SqmgGK3coh2sXjL4IDPavakThU1exonYCr39 oeMHTKKrmP5dZhk9QrPw77OwCjsW6EGARSD8hHWtNH4aMiJHbGHiJqJDbVC9jYK7tAu5 GhdgwErDSMm2WzB2c+IUsETdcULydvITipBcL0UqUB6+aiVVp9of/ABObEgxFcnXLPRz Fbj4KE6qU8SQGfz1tIxXHGGlSGIQESlQejzFZJhLSCWd2T4Z/CbkKKRAj1qiPirs9NLa 6e6A== X-Gm-Message-State: AOJu0YzoIc1RKkFTZjQLlA6l8zgn/jZdJy4xoE3W1xLD5ceK9LdWK6Ky yVq5bmYSi9TzDoeRpRtej34164uY1hZzy9adZ9xngO2roj1rDvjYS5M4znYHtJpwLXVkCa82O+J +H/vEmGAYTU6RKlGSWcr5d4c3ATfFA6K3mVSPhVtt5DmhwR8sISn/AoOxGjaVKwjRCuJB X-Gm-Gg: ASbGncstebyVOFfJF2vySKx4Kn5+13lI1rqwjEWt6S7nt3Yumn6GZI8YZGwxziwA1Vs WY4mMbgVZ8D4n7D8K25h3bqbB/DfGjtqBOlqlDngFkbW9/Tajr7qm2G7r5WoSSLAOVgSo/QCWbH sncEbO/MLOxK5PSa+SKFfc7Awikp4WnywOL3SBkHT+SCimsEqbDBmuQ8E67kIzs/owNcam6QHVh Rrh984n1hg5icthIHCMLDcC5E3wONDJR2bH0CbnwTtR7oMqsUNxHl6xki0Kd/n7j9vDXgWRj9YJ 6hjp96lK9mrU8t2z8yd0Dn1okHYrXt/H1ZpP2Z1o006tQo2tO5e7boPrvc/WezKgHe2M+Zekpp4 wzeBXp+tJWxdr X-Received: by 2002:a17:90b:39c5:b0:321:c567:44bf with SMTP id 98e67ed59e1d1-328156c9739mr11713943a91.29.1756785014648; Mon, 01 Sep 2025 20:50:14 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG92VJFLhBkR7mpPulYB1tmcfYbLpwynzrCX/TM9zf18n1/zGSME/PRImuNyWlOiA2pqQHUUA== X-Received: by 2002:a17:90b:39c5:b0:321:c567:44bf with SMTP id 98e67ed59e1d1-328156c9739mr11713896a91.29.1756785013910; Mon, 01 Sep 2025 20:50:13 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: brian.cain@oss.qualcomm.com, richard.henderson@linaro.org, philmd@linaro.org, matheus.bernardino@oss.qualcomm.com, ale@rev.ng, anjo@rev.ng, marco.liebel@oss.qualcomm.com, ltaylorsimpson@gmail.com, alex.bennee@linaro.org, quic_mburton@quicinc.com, sid.manning@oss.qualcomm.com, Sid Manning , Matheus Tavares Bernardino , Damien Hedde Subject: [PATCH v2 11/11] hw/intc: Add l2vic interrupt controller Date: Mon, 1 Sep 2025 20:49:51 -0700 Message-Id: <20250902034951.1948194-12-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> References: <20250902034951.1948194-1-brian.cain@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=Ycq95xRf c=1 sm=1 tr=0 ts=68b66978 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=NEAV23lmAAAA:8 a=COk6AnOGAAAA:8 a=EUspDBNiAAAA:8 a=RIXGA4eaRyz-QDbuLqUA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-GUID: NZRYkY0tU7I-4vNG1b0mb8pwjGIU904I X-Proofpoint-ORIG-GUID: NZRYkY0tU7I-4vNG1b0mb8pwjGIU904I X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTAxMDEwMSBTYWx0ZWRfX/8lEVdNhkQn3 VNoBsgRdcqA/5ycYCLoOnkFSB8R7VwDctyuGRyf0kaxMl77Qi+g8Amj3OXYi6j2n78NmiPLQT4V 8xxCgIHLtehOr9SyiLx01d9ClepKOw9KL2ku+ZLTWVPLlQdz7ipilsJ80sQSC+AuL10B6fsSZ/z IlO2ZR08AiAUsdKauFzR/9NUhAdlk7h97o0K682AitEST8gbKK6QPxeuS7aoIXAjwp8McNnOrUq nj/3um4Q+//SvWyxKd0SJeMtbUWU8q5RWSv7168qfFQzu0HVXoQ+daJIlNJiZpsrAo+5suV1GSy AZpxgipMZMmFy/x3K0RZvvewWVGD8I9r+xNmQfzODqstPSsyigzM2sPWfO4rp5ECJ0vhwqomUD8 UySpS7VB X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-02_01,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 adultscore=0 phishscore=0 malwarescore=0 bulkscore=0 suspectscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509010101 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1756785300307124100 From: Sid Manning Co-authored-by: Matheus Tavares Bernardino Co-authored-by: Damien Hedde Signed-off-by: Brian Cain --- MAINTAINERS | 2 + docs/devel/hexagon-l2vic.rst | 59 +++++ docs/devel/index-internals.rst | 1 + include/hw/intc/l2vic.h | 38 +++ hw/intc/l2vic.c | 421 +++++++++++++++++++++++++++++++++ hw/hexagon/Kconfig | 1 + hw/intc/Kconfig | 3 + hw/intc/meson.build | 2 + hw/intc/trace-events | 4 + 9 files changed, 531 insertions(+) create mode 100644 docs/devel/hexagon-l2vic.rst create mode 100644 include/hw/intc/l2vic.h create mode 100644 hw/intc/l2vic.c diff --git a/MAINTAINERS b/MAINTAINERS index 4f7748679b..228b5b672f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -233,6 +233,7 @@ F: hw/hexagon/ F: hw/timer/qct-qtimer.c F: include/hw/hexagon/ F: include/hw/timer/qct-qtimer.h +F: hw/intc/l2vic.[ch] X: target/hexagon/idef-parser/ X: target/hexagon/gen_idef_parser_funcs.py F: linux-user/hexagon/ @@ -245,6 +246,7 @@ F: gdb-xml/hexagon*.xml F: docs/system/target-hexagon.rst F: docs/system/hexagon/cdsp.rst F: docs/devel/hexagon-sys.rst +F: docs/devel/hexagon-l2vic.rst T: git https://github.com/quic/qemu.git hex-next =20 Hexagon idef-parser diff --git a/docs/devel/hexagon-l2vic.rst b/docs/devel/hexagon-l2vic.rst new file mode 100644 index 0000000000..0885636274 --- /dev/null +++ b/docs/devel/hexagon-l2vic.rst @@ -0,0 +1,59 @@ +Hexagon L2 Vectored Interrupt Controller +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + + +.. code-block:: none + + +-------+ + | | +----------------+ + | l2vic | | hexagon core | + | | | | + | +-----| | | + ------> |VID0 >------------->irq2 -\ | + ------> | | | | | + ... > | | | | | + ------> | | | | + | +-----| | / | | \ | + | ... | | | | | | | + | +-----| | t0 t1 t2 t3 ...| + ------> |VIDN | | | + ------> | | | | + ------> | | | | + ------> | | | | + | +-----| | | + | | |Global SREG File| + | State | | | + | [ ]|<=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D|=3D>[VID ] = | + | [ ]|<=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D|=3D>[VID1] = | + | [ ]| | | + | [ ]| | | + | | | | + +-------+ +----------------+ + +L2VIC/Core Integration +---------------------- + +* hexagon core supports 8 external interrupt sources +* l2vic supports 1024 input interrupts mapped among 4 output interrupts +* l2vic has four output signals: { VID0, VID1, VID2, VID3 } +* l2vic device has a bank of registers per-VID that can be used to query + the status or assert new interrupts. +* Interrupts are 'steered' to threads based on { thread priority, 'EX' sta= te, + thread interrupt mask, thread interrupt enable, global interrupt enable, + etc. }. +* Any hardware thread could conceivably handle any input interrupt, depend= ent + on state. +* The system register transfer instruction can read the VID0-VID3 values f= rom + the l2vic when reading from hexagon core system registers "VID" and "VID= 1". +* When l2vic VID0 has multiple active interrupts, it pulses the VID0 output + IRQ and stores the IRQ number for the VID0 register field. Only after t= his + interrupt is cleared can the l2vic pulse the VID0 output IRQ again and p= rovide + the next interrupt number on the VID0 register. +* The ``ciad`` instruction clears the l2vic input interrupt and un-disable= s the + core interrupt. If some/an l2vic VID0 interrupt is pending when this oc= curs, + the next interrupt should fire and any subseqeunt reads of the VID regis= ter + should reflect the newly raised interrupt. +* In QEMU, on an external interrupt or an unmasked-pending interrupt, + all vCPUs are triggered (has_work=3D=3Dtrue) and each will grab the IO l= ock + while considering the steering logic to determine whether they're the th= read + that must handle the interrupt. diff --git a/docs/devel/index-internals.rst b/docs/devel/index-internals.rst index 0471db8064..6620497595 100644 --- a/docs/devel/index-internals.rst +++ b/docs/devel/index-internals.rst @@ -15,6 +15,7 @@ Details about QEMU's various subsystems including how to = add features to them. clocks ebpf_rss hexagon-sys + hexagon-l2vic migration/index multi-process reset diff --git a/include/hw/intc/l2vic.h b/include/hw/intc/l2vic.h new file mode 100644 index 0000000000..be845e360c --- /dev/null +++ b/include/hw/intc/l2vic.h @@ -0,0 +1,38 @@ +/* + * QEMU L2VIC Interrupt Controller + * + * Copyright(c) 2020-2025 Qualcomm Innovation Center, Inc. All Rights Rese= rved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#define L2VIC_VID_GRP_0 0x0 /* Read */ +#define L2VIC_VID_GRP_1 0x4 /* Read */ +#define L2VIC_VID_GRP_2 0x8 /* Read */ +#define L2VIC_VID_GRP_3 0xC /* Read */ +#define L2VIC_VID_0 0x10 /* Read SOFTWARE DEFINED */ +#define L2VIC_VID_1 0x14 /* Read SOFTWARE DEFINED NOT YET USED */ +#define L2VIC_INT_ENABLEn 0x100 /* Read/Write */ +#define L2VIC_INT_ENABLE_CLEARn 0x180 /* Write */ +#define L2VIC_INT_ENABLE_SETn 0x200 /* Write */ +#define L2VIC_INT_TYPEn 0x280 /* Read/Write */ +#define L2VIC_INT_STATUSn 0x380 /* Read */ +#define L2VIC_INT_CLEARn 0x400 /* Write */ +#define L2VIC_SOFT_INTn 0x480 /* Write */ +#define L2VIC_INT_PENDINGn 0x500 /* Read */ +#define L2VIC_INT_GRPn_0 0x600 /* Read/Write */ +#define L2VIC_INT_GRPn_1 0x680 /* Read/Write */ +#define L2VIC_INT_GRPn_2 0x700 /* Read/Write */ +#define L2VIC_INT_GRPn_3 0x780 /* Read/Write */ + +#define L2VIC_INTERRUPT_MAX 1024 +#define L2VIC_CIAD_INSTRUCTION -1 +#define L2VIC_NO_PENDING 0xffffffff +/* + * Note about l2vic groups: + * Each interrupt to L2VIC can be configured to associate with one of + * four groups. + * Group 0 interrupts go to IRQ2 via VID 0 (SSR: 0xC2, the default) + * Group 1 interrupts go to IRQ3 via VID 1 (SSR: 0xC3) + * Group 2 interrupts go to IRQ4 via VID 2 (SSR: 0xC4) + * Group 3 interrupts go to IRQ5 via VID 3 (SSR: 0xC5) + */ diff --git a/hw/intc/l2vic.c b/hw/intc/l2vic.c new file mode 100644 index 0000000000..9753ba2d25 --- /dev/null +++ b/hw/intc/l2vic.c @@ -0,0 +1,421 @@ +/* + * QEMU L2VIC Interrupt Controller + * + * Arm PrimeCell PL190 Vector Interrupt Controller was used as a reference. + * Copyright(c) 2020-2025 Qualcomm Innovation Center, Inc. All Rights Rese= rved. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/irq.h" +#include "hw/sysbus.h" +#include "migration/vmstate.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "hw/intc/l2vic.h" +#include "trace.h" + +#define L2VICA(s, n) (s[(n) >> 2]) + +#define TYPE_L2VIC "l2vic" +OBJECT_DECLARE_SIMPLE_TYPE(L2VICState, L2VIC) + +#define SLICE_MAX (L2VIC_INTERRUPT_MAX / 32) + +typedef struct L2VICState { + SysBusDevice parent_obj; + + QemuMutex active; + MemoryRegion iomem; + MemoryRegion fast_iomem; + uint32_t level; + /* + * offset 0:vid group 0 etc, 10 bits in each group + * are used: + */ + uint32_t vid_group[4]; + uint32_t vid0; + /* Clear Status of Active Edge interrupt, not used: */ + uint32_t int_clear[SLICE_MAX] QEMU_ALIGNED(16); + /* Enable interrupt source */ + uint32_t int_enable[SLICE_MAX] QEMU_ALIGNED(16); + /* Clear (set to 0) corresponding bit in int_enable */ + uint32_t int_enable_clear; + /* Set (to 1) corresponding bit in int_enable */ + uint32_t int_enable_set; + /* Present for debugging, not used */ + uint32_t int_pending[SLICE_MAX] QEMU_ALIGNED(16); + /* Generate an interrupt */ + uint32_t int_soft; + /* Which enabled interrupt is active */ + uint32_t int_status[SLICE_MAX] QEMU_ALIGNED(16); + /* Edge or Level interrupt */ + uint32_t int_type[SLICE_MAX] QEMU_ALIGNED(16); + /* L2 interrupt group 0-3 0x600-0x7FF */ + uint32_t int_group_n0[SLICE_MAX] QEMU_ALIGNED(16); + uint32_t int_group_n1[SLICE_MAX] QEMU_ALIGNED(16); + uint32_t int_group_n2[SLICE_MAX] QEMU_ALIGNED(16); + uint32_t int_group_n3[SLICE_MAX] QEMU_ALIGNED(16); + qemu_irq irq[8]; +} L2VICState; + + +/* + * Find out if this irq is associated with a group other than + * the default group + */ +static uint32_t *get_int_group(L2VICState *s, int irq) +{ + int n =3D irq & 0x1f; + if (n < 8) { + return s->int_group_n0; + } + if (n < 16) { + return s->int_group_n1; + } + if (n < 24) { + return s->int_group_n2; + } + return s->int_group_n3; +} + +static int find_slice(int irq) +{ + return irq / 32; +} + +static int get_vid(L2VICState *s, int irq) +{ + uint32_t *group =3D get_int_group(s, irq); + uint32_t slice =3D group[find_slice(irq)]; + /* Mask with 0x7 to remove the GRP:EN bit */ + uint32_t val =3D slice >> ((irq & 0x7) * 4); + if (val & 0x8) { + return val & 0x7; + } else { + return 0; + } +} + +static inline bool vid_active(L2VICState *s) + +{ + /* scan all 1024 bits in int_status arrary */ + const int size =3D sizeof(s->int_status) * CHAR_BIT; + const int active_irq =3D find_first_bit((unsigned long *)s->int_status= , size); + return ((active_irq !=3D size)) ? true : false; +} + +static bool l2vic_update(L2VICState *s, int irq) +{ + if (vid_active(s)) { + return true; + } + + bool pending =3D test_bit(irq, (unsigned long *)s->int_pending); + bool enable =3D test_bit(irq, (unsigned long *)s->int_enable); + if (pending && enable) { + int vid =3D get_vid(s, irq); + set_bit(irq, (unsigned long *)s->int_status); + clear_bit(irq, (unsigned long *)s->int_pending); + clear_bit(irq, (unsigned long *)s->int_enable); + /* ensure the irq line goes low after going high */ + s->vid0 =3D irq; + s->vid_group[get_vid(s, irq)] =3D irq; + + /* already low: now call pulse */ + /* pulse: calls qemu_upper() and then qemu_lower()) */ + qemu_irq_pulse(s->irq[vid + 2]); + trace_l2vic_delivered(irq, vid); + return true; + } + return false; +} + +static void l2vic_update_all(L2VICState *s) +{ + for (int i =3D 0; i < L2VIC_INTERRUPT_MAX; i++) { + if (l2vic_update(s, i) =3D=3D true) { + /* once vid is active, no-one else can set it until ciad */ + return; + } + } +} + +static void l2vic_set_irq(void *opaque, int irq, int level) +{ + L2VICState *s =3D (L2VICState *)opaque; + if (level) { + qemu_mutex_lock(&s->active); + set_bit(irq, (unsigned long *)s->int_pending); + qemu_mutex_unlock(&s->active); + } + l2vic_update(s, irq); +} + +static void l2vic_write(void *opaque, hwaddr offset, uint64_t val, + unsigned size) +{ + L2VICState *s =3D (L2VICState *)opaque; + qemu_mutex_lock(&s->active); + trace_l2vic_reg_write((unsigned)offset, (uint32_t)val); + + if (offset =3D=3D L2VIC_VID_0) { + if ((int)val !=3D L2VIC_CIAD_INSTRUCTION) { + s->vid0 =3D val; + } else { + /* ciad issued: clear int_status */ + clear_bit(s->vid0, (unsigned long *)s->int_status); + } + } else if (offset >=3D L2VIC_INT_ENABLEn && + offset < (L2VIC_INT_ENABLE_CLEARn)) { + L2VICA(s->int_enable, offset - L2VIC_INT_ENABLEn) =3D val; + } else if (offset >=3D L2VIC_INT_ENABLE_CLEARn && + offset < L2VIC_INT_ENABLE_SETn) { + L2VICA(s->int_enable, offset - L2VIC_INT_ENABLE_CLEARn) &=3D ~val; + } else if (offset >=3D L2VIC_INT_ENABLE_SETn && offset < L2VIC_INT_TYP= En) { + L2VICA(s->int_enable, offset - L2VIC_INT_ENABLE_SETn) |=3D val; + } else if (offset >=3D L2VIC_INT_TYPEn && offset < L2VIC_INT_TYPEn + 0= x80) { + L2VICA(s->int_type, offset - L2VIC_INT_TYPEn) =3D val; + } else if (offset >=3D L2VIC_INT_STATUSn && offset < L2VIC_INT_CLEARn)= { + L2VICA(s->int_status, offset - L2VIC_INT_STATUSn) =3D val; + } else if (offset >=3D L2VIC_INT_CLEARn && offset < L2VIC_SOFT_INTn) { + L2VICA(s->int_clear, offset - L2VIC_INT_CLEARn) =3D val; + } else if (offset >=3D L2VIC_INT_PENDINGn && + offset < L2VIC_INT_PENDINGn + 0x80) { + L2VICA(s->int_pending, offset - L2VIC_INT_PENDINGn) =3D val; + } else if (offset >=3D L2VIC_SOFT_INTn && offset < L2VIC_INT_PENDINGn)= { + L2VICA(s->int_enable, offset - L2VIC_SOFT_INTn) |=3D val; + /* + * Need to reverse engineer the actual irq number. + */ + int irq =3D find_first_bit((unsigned long *)&val, + sizeof(s->int_enable[0]) * CHAR_BIT); + hwaddr byteoffset =3D offset - L2VIC_SOFT_INTn; + g_assert(irq !=3D sizeof(s->int_enable[0]) * CHAR_BIT); + irq +=3D byteoffset * 8; + + /* The soft-int interface only works with edge-triggered interrupt= s */ + if (test_bit(irq, (unsigned long *)s->int_type)) { + qemu_mutex_unlock(&s->active); + l2vic_set_irq(opaque, irq, 1); + qemu_mutex_lock(&s->active); + } + } else if (offset >=3D L2VIC_INT_GRPn_0 && offset < L2VIC_INT_GRPn_1) { + L2VICA(s->int_group_n0, offset - L2VIC_INT_GRPn_0) =3D val; + } else if (offset >=3D L2VIC_INT_GRPn_1 && offset < L2VIC_INT_GRPn_2) { + L2VICA(s->int_group_n1, offset - L2VIC_INT_GRPn_1) =3D val; + } else if (offset >=3D L2VIC_INT_GRPn_2 && offset < L2VIC_INT_GRPn_3) { + L2VICA(s->int_group_n2, offset - L2VIC_INT_GRPn_2) =3D val; + } else if (offset >=3D L2VIC_INT_GRPn_3 && offset < L2VIC_INT_GRPn_3 += 0x80) { + L2VICA(s->int_group_n3, offset - L2VIC_INT_GRPn_3) =3D val; + } else { + qemu_log_mask(LOG_UNIMP, + "%s: offset %" PRIx32 " unimplemented\n", __func__, + (int)offset); + } + l2vic_update_all(s); + qemu_mutex_unlock(&s->active); + return; +} + +static uint64_t l2vic_read(void *opaque, hwaddr offset, unsigned size) +{ + uint64_t value; + L2VICState *s =3D (L2VICState *)opaque; + qemu_mutex_lock(&s->active); + + if (offset =3D=3D L2VIC_VID_GRP_0) { + value =3D s->vid_group[0]; + } else if (offset =3D=3D L2VIC_VID_GRP_1) { + value =3D s->vid_group[1]; + } else if (offset =3D=3D L2VIC_VID_GRP_2) { + value =3D s->vid_group[2]; + } else if (offset =3D=3D L2VIC_VID_GRP_3) { + value =3D s->vid_group[3]; + } else if (offset =3D=3D L2VIC_VID_0) { + value =3D s->vid0; + } else if (offset >=3D L2VIC_INT_ENABLEn && + offset < L2VIC_INT_ENABLE_CLEARn) { + value =3D L2VICA(s->int_enable, offset - L2VIC_INT_ENABLEn); + } else if (offset >=3D L2VIC_INT_ENABLE_CLEARn && + offset < L2VIC_INT_ENABLE_SETn) { + value =3D 0; + } else if (offset >=3D L2VIC_INT_ENABLE_SETn && offset < L2VIC_INT_TYP= En) { + value =3D 0; + } else if (offset >=3D L2VIC_INT_TYPEn && offset < L2VIC_INT_TYPEn + 0= x80) { + value =3D L2VICA(s->int_type, offset - L2VIC_INT_TYPEn); + } else if (offset >=3D L2VIC_INT_STATUSn && offset < L2VIC_INT_CLEARn)= { + value =3D L2VICA(s->int_status, offset - L2VIC_INT_STATUSn); + } else if (offset >=3D L2VIC_INT_CLEARn && offset < L2VIC_SOFT_INTn) { + value =3D L2VICA(s->int_clear, offset - L2VIC_INT_CLEARn); + } else if (offset >=3D L2VIC_SOFT_INTn && offset < L2VIC_INT_PENDINGn)= { + value =3D 0; + } else if (offset >=3D L2VIC_INT_PENDINGn && + offset < L2VIC_INT_PENDINGn + 0x80) { + value =3D L2VICA(s->int_pending, offset - L2VIC_INT_PENDINGn); + } else if (offset >=3D L2VIC_INT_GRPn_0 && offset < L2VIC_INT_GRPn_1) { + value =3D L2VICA(s->int_group_n0, offset - L2VIC_INT_GRPn_0); + } else if (offset >=3D L2VIC_INT_GRPn_1 && offset < L2VIC_INT_GRPn_2) { + value =3D L2VICA(s->int_group_n1, offset - L2VIC_INT_GRPn_1); + } else if (offset >=3D L2VIC_INT_GRPn_2 && offset < L2VIC_INT_GRPn_3) { + value =3D L2VICA(s->int_group_n2, offset - L2VIC_INT_GRPn_2); + } else if (offset >=3D L2VIC_INT_GRPn_3 && offset < L2VIC_INT_GRPn_3 += 0x80) { + value =3D L2VICA(s->int_group_n3, offset - L2VIC_INT_GRPn_3); + } else { + value =3D 0; + qemu_log_mask(LOG_GUEST_ERROR, + "L2VIC: %s: offset 0x%" PRIx32 "\n", __func__, + (int)offset); + } + + trace_l2vic_reg_read((unsigned)offset, value); + qemu_mutex_unlock(&s->active); + + return value; +} + +static const MemoryRegionOps l2vic_ops =3D { + .read =3D l2vic_read, + .write =3D l2vic_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, + .valid.unaligned =3D false, +}; + +#define FASTL2VIC_ENABLE 0x0 +#define FASTL2VIC_DISABLE 0x1 +#define FASTL2VIC_INT 0x2 + +static void fastl2vic_write(void *opaque, hwaddr offset, uint64_t val, + unsigned size) +{ + if (offset =3D=3D 0) { + uint32_t cmd =3D (val >> 16) & 0x3; + uint32_t irq =3D val & 0x3ff; + uint32_t slice =3D (irq / 32) * 4; + val =3D 1 << (irq % 32); + + if (cmd =3D=3D FASTL2VIC_ENABLE) { + l2vic_write(opaque, L2VIC_INT_ENABLE_SETn + slice, val, size); + } else if (cmd =3D=3D FASTL2VIC_DISABLE) { + l2vic_write(opaque, L2VIC_INT_ENABLE_CLEARn + slice, val, size= ); + } else if (cmd =3D=3D FASTL2VIC_INT) { + l2vic_write(opaque, L2VIC_SOFT_INTn + slice, val, size); + } else { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid write cmd %" PRId32 "\n", + __func__, cmd); + } + return; + } + qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid write offset 0x%08" HWADDR= _PRIx + "\n", __func__, offset); +} + +static const MemoryRegionOps fastl2vic_ops =3D { + .write =3D fastl2vic_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, + .valid.unaligned =3D false, +}; + +static void l2vic_reset_hold(Object *obj, G_GNUC_UNUSED ResetType res_type) +{ + L2VICState *s =3D L2VIC(obj); + memset(s->int_clear, 0, sizeof(s->int_clear)); + memset(s->int_enable, 0, sizeof(s->int_enable)); + memset(s->int_pending, 0, sizeof(s->int_pending)); + memset(s->int_status, 0, sizeof(s->int_status)); + memset(s->int_type, 0, sizeof(s->int_type)); + memset(s->int_group_n0, 0, sizeof(s->int_group_n0)); + memset(s->int_group_n1, 0, sizeof(s->int_group_n1)); + memset(s->int_group_n2, 0, sizeof(s->int_group_n2)); + memset(s->int_group_n3, 0, sizeof(s->int_group_n3)); + s->int_soft =3D 0; + s->vid0 =3D 0; + + l2vic_update_all(s); +} + + +static void reset_irq_handler(void *opaque, int irq, int level) +{ + L2VICState *s =3D (L2VICState *)opaque; + Object *obj =3D OBJECT(opaque); + if (level) { + l2vic_reset_hold(obj, RESET_TYPE_COLD); + } + l2vic_update_all(s); +} + +static void l2vic_init(Object *obj) +{ + DeviceState *dev =3D DEVICE(obj); + L2VICState *s =3D L2VIC(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + int i; + + memory_region_init_io(&s->iomem, obj, &l2vic_ops, s, "l2vic", 0x1000); + sysbus_init_mmio(sbd, &s->iomem); + memory_region_init_io(&s->fast_iomem, obj, &fastl2vic_ops, s, "fast", + 0x10000); + sysbus_init_mmio(sbd, &s->fast_iomem); + + qdev_init_gpio_in(dev, l2vic_set_irq, L2VIC_INTERRUPT_MAX); + qdev_init_gpio_in_named(dev, reset_irq_handler, "reset", 1); + for (i =3D 0; i < 8; i++) { + sysbus_init_irq(sbd, &s->irq[i]); + } + qemu_mutex_init(&s->active); /* TODO: Remove this is an experiment */ +} + +static const VMStateDescription vmstate_l2vic =3D { + .name =3D "l2vic", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D + (VMStateField[]){ + VMSTATE_UINT32(level, L2VICState), + VMSTATE_UINT32_ARRAY(vid_group, L2VICState, 4), + VMSTATE_UINT32(vid0, L2VICState), + VMSTATE_UINT32_ARRAY(int_enable, L2VICState, SLICE_MAX), + VMSTATE_UINT32(int_enable_clear, L2VICState), + VMSTATE_UINT32(int_enable_set, L2VICState), + VMSTATE_UINT32_ARRAY(int_type, L2VICState, SLICE_MAX), + VMSTATE_UINT32_ARRAY(int_status, L2VICState, SLICE_MAX), + VMSTATE_UINT32_ARRAY(int_clear, L2VICState, SLICE_MAX), + VMSTATE_UINT32(int_soft, L2VICState), + VMSTATE_UINT32_ARRAY(int_pending, L2VICState, SLICE_MAX), + VMSTATE_UINT32_ARRAY(int_group_n0, L2VICState, SLICE_MAX), + VMSTATE_UINT32_ARRAY(int_group_n1, L2VICState, SLICE_MAX), + VMSTATE_UINT32_ARRAY(int_group_n2, L2VICState, SLICE_MAX), + VMSTATE_UINT32_ARRAY(int_group_n3, L2VICState, SLICE_MAX), + VMSTATE_END_OF_LIST() } +}; + +static void l2vic_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + dc->vmsd =3D &vmstate_l2vic; + rc->phases.hold =3D l2vic_reset_hold; +} + +static const TypeInfo l2vic_info =3D { + .name =3D TYPE_L2VIC, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(L2VICState), + .instance_init =3D l2vic_init, + .class_init =3D l2vic_class_init, +}; + +static void l2vic_register_types(void) +{ + type_register_static(&l2vic_info); +} + +type_init(l2vic_register_types) diff --git a/hw/hexagon/Kconfig b/hw/hexagon/Kconfig index dc74751d21..f51c381a12 100644 --- a/hw/hexagon/Kconfig +++ b/hw/hexagon/Kconfig @@ -3,6 +3,7 @@ config HEX_DSP default y depends on HEXAGON && TCG imply PTIMER + select L2VIC =20 config HEX_VIRT bool diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig index 7547528f2c..a5b136e2fa 100644 --- a/hw/intc/Kconfig +++ b/hw/intc/Kconfig @@ -8,6 +8,9 @@ config I8259 config PL190 bool =20 +config L2VIC + bool + config IOAPIC bool select I8259 diff --git a/hw/intc/meson.build b/hw/intc/meson.build index 3137521a4a..9a5e0b3a73 100644 --- a/hw/intc/meson.build +++ b/hw/intc/meson.build @@ -67,6 +67,8 @@ specific_ss.add(when: 'CONFIG_PSERIES', if_true: files('x= ics_spapr.c', 'spapr_xi specific_ss.add(when: 'CONFIG_XIVE', if_true: files('xive.c')) specific_ss.add(when: ['CONFIG_KVM', 'CONFIG_XIVE'], if_true: files('spapr_xive_kvm.c')) + +specific_ss.add(when: 'CONFIG_L2VIC', if_true: files('l2vic.c')) specific_ss.add(when: 'CONFIG_M68K_IRQC', if_true: files('m68k_irqc.c')) specific_ss.add(when: 'CONFIG_LOONGSON_IPI_COMMON', if_true: files('loongs= on_ipi_common.c')) specific_ss.add(when: 'CONFIG_LOONGSON_IPI', if_true: files('loongson_ipi.= c')) diff --git a/hw/intc/trace-events b/hw/intc/trace-events index 018c609ca5..327514f498 100644 --- a/hw/intc/trace-events +++ b/hw/intc/trace-events @@ -314,6 +314,10 @@ sh_intc_register(const char *s, int id, unsigned short= v, int c, int m) "%s %u - sh_intc_read(unsigned size, uint64_t offset, unsigned long val) "size %u 0= x%" PRIx64 " -> 0x%lx" sh_intc_write(unsigned size, uint64_t offset, unsigned long val) "size %u = 0x%" PRIx64 " <- 0x%lx" sh_intc_set(int id, int enable) "setting interrupt group %d to %d" +# l2vic.c +l2vic_reg_write(unsigned int addr, uint32_t value) "addr: 0x%03x value: 0x= %08"PRIx32 +l2vic_reg_read(unsigned int addr, uint32_t value) "addr: 0x%03x value: 0x%= 08"PRIx32 +l2vic_delivered(int irq, int vid) "l2vic: delivered %d (vid %d)" =20 # loongson_ipi.c loongson_ipi_read(unsigned size, uint64_t addr, uint64_t val) "size: %u ad= dr: 0x%"PRIx64 "val: 0x%"PRIx64 --=20 2.34.1