From nobody Sun Feb 8 22:05:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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=fail(p=none dis=none) header.from=eik.bme.hu Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1736975824747232.70406688077708; Wed, 15 Jan 2025 13:17:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYAk6-0001hx-DN; Wed, 15 Jan 2025 16:16:02 -0500 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 1tYAjy-0001hV-Ey; Wed, 15 Jan 2025 16:16:00 -0500 Received: from zero.eik.bme.hu ([2001:738:2001:2001::2001]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYAjv-0005mI-JT; Wed, 15 Jan 2025 16:15:53 -0500 Received: from zero.eik.bme.hu (localhost [127.0.0.1]) by zero.eik.bme.hu (Postfix) with ESMTP id 2A4264E6030; Wed, 15 Jan 2025 22:15:46 +0100 (CET) Received: from zero.eik.bme.hu ([127.0.0.1]) by zero.eik.bme.hu (zero.eik.bme.hu [127.0.0.1]) (amavisd-new, port 10028) with ESMTP id M3uXok7s9sUD; Wed, 15 Jan 2025 22:15:44 +0100 (CET) Received: by zero.eik.bme.hu (Postfix, from userid 432) id 307124E602F; Wed, 15 Jan 2025 22:15:44 +0100 (CET) X-Virus-Scanned: amavisd-new at eik.bme.hu From: BALATON Zoltan Subject: [PATCH] hw/ppc/e500: Partial implementation of local access window registers To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org Cc: Bernhard Beschow Message-Id: <20250115211544.307124E602F@zero.eik.bme.hu> Date: Wed, 15 Jan 2025 22:15:44 +0100 (CET) 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=2001:738:2001:2001::2001; envelope-from=balaton@eik.bme.hu; helo=zero.eik.bme.hu X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, 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-ZM-MESSAGEID: 1736975830410019000 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This allows guests to set the CCSR base address. Also store and return values of the local access window registers but their functionality isn't implemented. Signed-off-by: BALATON Zoltan --- hw/ppc/e500-ccsr.h | 4 +++ hw/ppc/e500.c | 79 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/hw/ppc/e500-ccsr.h b/hw/ppc/e500-ccsr.h index 249c17be3b..cfbf96e181 100644 --- a/hw/ppc/e500-ccsr.h +++ b/hw/ppc/e500-ccsr.h @@ -4,12 +4,16 @@ #include "hw/sysbus.h" #include "qom/object.h" =20 +#define NR_LAWS 12 + struct PPCE500CCSRState { /*< private >*/ SysBusDevice parent; /*< public >*/ =20 MemoryRegion ccsr_space; + + uint32_t law_regs[NR_LAWS * 2]; }; =20 #define TYPE_CCSR "e500-ccsr" diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 64f8c766b4..376cb4cb37 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -43,6 +43,7 @@ #include "qemu/host-utils.h" #include "qemu/option.h" #include "hw/pci-host/ppce500.h" +#include "qemu/log.h" #include "qemu/error-report.h" #include "hw/platform-bus.h" #include "hw/net/fsl_etsec/etsec.h" @@ -1331,11 +1332,83 @@ void ppce500_init(MachineState *machine) boot_info->dt_size =3D dt_size; } =20 +static int law_idx(hwaddr addr) +{ + int idx; + + addr -=3D 0xc08; + idx =3D 2 * ((addr >> 5) & 0xf); + if (addr & 8) { + idx++; + } + assert(idx < 2 * NR_LAWS); + return idx; +} + +static uint64_t law_read(void *opaque, hwaddr addr, unsigned size) +{ + PPCE500CCSRState *s =3D opaque; + uint64_t val =3D 0; + + switch (addr) { + case 0: + val =3D s->ccsr_space.addr >> 12; + break; + case 0xc08 ... 0xd70: + val =3D s->law_regs[law_idx(addr)]; + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "Invalid local access register read" + "0x%" HWADDR_PRIx "\n", addr); + } + return val; +} + +static void law_write(void *opaque, hwaddr addr, uint64_t val, unsigned si= ze) +{ + PPCE500CCSRState *s =3D opaque; + + switch (addr) { + case 0: + val &=3D 0xffff00; + memory_region_set_address(&s->ccsr_space, val << 12); + break; + case 0xc08 ... 0xd70: + { + int idx =3D law_idx(addr); + + qemu_log_mask(LOG_UNIMP, "Unimplemented local access register writ= e" + "0x%" HWADDR_PRIx " <- 0x%" PRIx64 "\n", addr, val); + val &=3D (idx & 1) ? 0x80f0003f : 0xffffff; + s->law_regs[idx] =3D val; + break; + } + default: + qemu_log_mask(LOG_GUEST_ERROR, "Invalid local access register writ= e" + "0x%" HWADDR_PRIx "\n", addr); + } +} + +static const MemoryRegionOps law_ops =3D { + .read =3D law_read, + .write =3D law_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + static void e500_ccsr_initfn(Object *obj) { - PPCE500CCSRState *ccsr =3D CCSR(obj); - memory_region_init(&ccsr->ccsr_space, obj, "e500-ccsr", - MPC8544_CCSRBAR_SIZE); + PPCE500CCSRState *s =3D CCSR(obj); + MemoryRegion *mr; + + memory_region_init(&s->ccsr_space, obj, "e500-ccsr", MPC8544_CCSRBAR_S= IZE); + + mr =3D g_new(MemoryRegion, 1); + memory_region_init_io(mr, obj, &law_ops, s, "local-access", 4096); + memory_region_add_subregion(&s->ccsr_space, 0, mr); } =20 static const TypeInfo e500_ccsr_info =3D { --=20 2.30.9