From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216170; cv=none; d=zohomail.com; s=zohoarc; b=Y4+JxAdFMCYeCATsL0aig5z40gA97eDShDHobc1lmqfjNVG4tokJeDPZCviN+CqD1QKowoWmNGYYm1kJMcQVN02qOrs64a1YHV3z+Vlp6E7dLqUaiLyRbfrl2ORNDVwxTpIOsfnMEKN3vRCT+977PbHCRwSrTk0AjREfa4LR/E0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216170; h=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=6hqbZpbBF/BQ05RXAOo3PKo8SSusZSrKFNQcMWc2oeY=; b=lsGHs5Gz3dVOiSF00s8bLa1yp5UYqzM7y6pKb7GFlSk5No1+Dbt4bl1AR6lS0G8+uusJAHIhlVY8yTKgBCkPnG5R81ukyhlMrB9w9sQ4SoRw3PFKgIQbuRsG1yuZdGhnAjq+Rqmc1EaLIoHYFjGLK7BGK37HptThzflztC2ygJY= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216170269399.9357365255639; Wed, 31 Dec 2025 13:22:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dR-0000rL-K7; Wed, 31 Dec 2025 16:21:37 -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 1vb3dK-0000or-02 for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:30 -0500 Received: from fhigh-a8-smtp.messagingengine.com ([103.168.172.159]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dI-0003hi-1C for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:29 -0500 Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id A812F140004B; Wed, 31 Dec 2025 16:21:25 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Wed, 31 Dec 2025 16:21:25 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:25 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 9e5a9f7a; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216085; x= 1767302485; bh=6hqbZpbBF/BQ05RXAOo3PKo8SSusZSrKFNQcMWc2oeY=; b=M DFeID48JNiV94+uTPZxrSTpEd6b2Sq+PiwhGs9/JU2wmNOL13v6w7LJo7Txn9Rhu cZLlrXBIsiro6PEg/NgnmvvMvNcFPjG19kXQPvFpmess5Fe5WTPMyqEMLhBjzTUx 4VKzrgg03T4Jgjew+5xak1Vd6i726YRrmrvCQSHsfPdTAzbX3ILyIu+W11S1jWI0 yCB/aYubZZgtsN3YtAdlHaXPVdynX+jx5I0dA2RMVNs01zy1c/TT/WwxRXEgI6nH aeieVvSGHwpP4mY5e4q4FMvjzqQlHS/8WGFiSBdJZM4gwbEADHGKXglL4x5SlKLK L5t3xshDXZAc9/wHz6YiA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216085; x=1767302485; bh=6 hqbZpbBF/BQ05RXAOo3PKo8SSusZSrKFNQcMWc2oeY=; b=XmVTGtU45gEl796AY l7PfkzFLtwLCuqAewkLmPSY6j8ZK5wII0vtTKsdMiu2LynnI2EN7MgN12/OBOlHA zqE91l6qZ5qbsDzeK0cSV36SAfyuigbdKyR95ihG22HhwdyykZY7b4B6hpkw0AqI 4HGycjLcfYQ7C66ApRRo1b+pSO+M04picFeibXJe1/6U7Xpy5bpOkJgU2cqz4DII 6BbQDqH3VtHgd3C6iVhR50xwJkW2sbKYNaQUu6yFwu5KlYnuLNrfLwEZxvXCpiuu 0vAsCgINBX/a6NIDQtD4qRAVN9qGcwSUiuJlAQD00C85n96o8uvWpyJlhWPb3iXh iPIFg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeliecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheptghhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepsg grlhgrthhonhesvghikhdrsghmvgdrhhhupdhrtghpthhtohepqhgvmhhuqdguvghvvghl sehnohhnghhnuhdrohhrgh X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 1/7] ati-vga: Extract ati_reg_write() from ati_mm_write() Date: Wed, 31 Dec 2025 16:21:01 -0500 Message-ID: <20251231212107.1020964-2-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.159; envelope-from=chad@jablonski.xyz; helo=fhigh-a8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216170879158500 Content-Type: text/plain; charset="utf-8" Move register write logic into its own function. This is in preparation for CCE engine support for register writes. MMIO writes will have their own distinct policy that doesn't apply to writes made by the CCE engine. Note: Because of the recursion in the MM_DATA handler the calls to ati_mm_write needed to be changed to ati_reg_write. This means that tracing output changes slightly for MM_DATA writes. Otherwise, this is purely a refactor and does not change behavior. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 25 ++++++++++++++++--------- hw/display/ati_int.h | 2 ++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index 049da69175..f9be5b302c 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -562,14 +562,9 @@ static void ati_host_data_reset(ATIHostDataState *hd) hd->col =3D 0; } =20 -static void ati_mm_write(void *opaque, hwaddr addr, - uint64_t data, unsigned int size) +void ati_reg_write(ATIVGAState *s, hwaddr addr, + uint64_t data, unsigned int size) { - ATIVGAState *s =3D opaque; - - if (addr < CUR_OFFSET || addr > CUR_CLR1 || ATI_DEBUG_HW_CURSOR) { - trace_ati_mm_write(size, addr, ati_reg_name(addr & ~3ULL), data); - } switch (addr) { case MM_INDEX: s->regs.mm_index =3D data & ~3; @@ -582,10 +577,10 @@ static void ati_mm_write(void *opaque, hwaddr addr, stn_le_p(s->vga.vram_ptr + idx, size, data); } } else if (s->regs.mm_index > MM_DATA + 3) { - ati_mm_write(s, s->regs.mm_index + addr - MM_DATA, data, size); + ati_reg_write(s, s->regs.mm_index + addr - MM_DATA, data, size= ); } else { qemu_log_mask(LOG_GUEST_ERROR, - "ati_mm_write: mm_index too small: %u\n", s->regs.mm_index= ); + "ati_reg_write: mm_index too small: %u\n", s->regs.mm_inde= x); } break; case BIOS_0_SCRATCH ... BUS_CNTL - 1: @@ -1062,6 +1057,18 @@ static void ati_mm_write(void *opaque, hwaddr addr, } } =20 + +static void ati_mm_write(void *opaque, hwaddr addr, + uint64_t data, unsigned int size) +{ + ATIVGAState *s =3D opaque; + + if (addr < CUR_OFFSET || addr > CUR_CLR1 || ATI_DEBUG_HW_CURSOR) { + trace_ati_mm_write(size, addr, ati_reg_name(addr & ~3ULL), data); + } + ati_reg_write(s, addr, data, size); +} + static const MemoryRegionOps ati_mm_ops =3D { .read =3D ati_mm_read, .write =3D ati_mm_write, diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index f38f6a43d7..3ee891c888 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -129,5 +129,7 @@ const char *ati_reg_name(int num); =20 void ati_2d_blt(ATIVGAState *s); void ati_flush_host_data(ATIVGAState *s); +void ati_reg_write(ATIVGAState *s, hwaddr addr, + uint64_t data, unsigned int size); =20 #endif /* ATI_INT_H */ --=20 2.51.2 From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216182; cv=none; d=zohomail.com; s=zohoarc; b=MIHtaeJKC/vITZ2ILnft7qKaRrMTQfkxW8NlyBFTU0oH1LDStIQN4KhJwmjqWOQ8aWHp+yRTBmoNl5SN3jUq9S4Cm03JJAnwS36KW9gVthfRJy5mdMBTVB6yrFYFjOqyHCep4RrrvHUIa0t59C6W2iYW0GM1Sw7kEmrYJ3/a08M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216182; h=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=OI8WnzWIVeXiJRW3YtmlUBe4/95BHsFFTDuGNHEnk4U=; b=eLSmBBKe9szsCtf1nU+3kjoy9h/PBzjEyRMtVANz5e0PrSKC+4uqpg2M2ZwcY/I7pooLrQh32wzpmhGZlNFauP7lFquIChmqXPUdd4MitMm3YEOaWfu54eIcecRbuJhABoLGoiJTJmJWhKZgl2Bm93cdG3EYrbsLUaqe81DGICo= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216182363395.7918983007994; Wed, 31 Dec 2025 13:23:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dR-0000rN-W3; Wed, 31 Dec 2025 16:21:38 -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 1vb3dL-0000pg-9a for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:33 -0500 Received: from fhigh-a8-smtp.messagingengine.com ([103.168.172.159]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dI-0003ht-RY for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:31 -0500 Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 178BE140004A; Wed, 31 Dec 2025 16:21:27 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Wed, 31 Dec 2025 16:21:27 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:26 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 84d6c871; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216087; x= 1767302487; bh=OI8WnzWIVeXiJRW3YtmlUBe4/95BHsFFTDuGNHEnk4U=; b=X BfH0m6HhPjRO5R8WDQM2f/bzGZAU2bcZxEljb09LZAhNjB7k2Z/yni4WFbDwNVL7 fMZnohtwa1QsJhMQgrSgms8GYJdfqG6b+IoePynuQb3LBKgfKijlOn/CUkK7GnKz V6DDCpO8xQUenQx5gw/Xt0VLOYXUeDru1AD+Q+m7YTFDWghnC1dQ3GjPiWGGMkmR QyWacrUvhloKhsfTv91K3jtAbg+ED7QEGepZhs+DFPD2gbVKZ3TFSycT4fxR2YKu Tt9+E1bEZmjPfnQYFDZy/PijIwFUobfb4Wuh90jpiV1gY4PLj2QG+KrCx3mcnbpf dohEH1LXVJDfFmRfIe6sg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216087; x=1767302487; bh=O I8WnzWIVeXiJRW3YtmlUBe4/95BHsFFTDuGNHEnk4U=; b=TdcWRQEBs1OmlGkKl EH14P7ee+ZHirUl+XYiBt9WU5FCSzMO4/nC/D5cmL+zhygatqRQIVlknRwJESH0b C0LGvP1dUvjvZq7NiEBu0tlad8GjFZbVgcfz3tJ5RqDzUWvh4XOzd8312EC3Thmh J+q0njP9jSX/LFNwVmgLtMU4UQIRyUj7NYSXwnm7sAVc9rsMPT34hLNc7cgauwss T0tELvCTbM9lNQGY0/nRYqH8FoJ1alwlYhYE/7uxKVvz51EAoHtIW1WFuepxKC8D /e1jwY9PfzrqFcptpkeQ1A66ZC1gf4AI2n8y8JBgRREx3h//gqLonE9A9PM7dRGX g0hUQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeliecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedunecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtth hopegsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhopegthhgrugesjhgr sghlohhnshhkihdrgiihii X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 2/7] ati-vga: Implement CCE/PM4 microcode register handling Date: Wed, 31 Dec 2025 16:21:02 -0500 Message-ID: <20251231212107.1020964-3-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.159; envelope-from=chad@jablonski.xyz; helo=fhigh-a8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216183248158500 Content-Type: text/plain; charset="utf-8" Implement registers used for loading and reading microcode for the CCE engine. Loading the microcode is the first step for any driver implementing CCE. Reading, while not used by drivers is very helpful for any reverse engineering and testing work. The microcode is currently stored but not used. This lays the groundwork for future RE work on the microcode. There's some quirky behavior around microcode reads that isn't documented elsewhere. There appear to be two internal pointers, one for reading and one for writing that can get out of sync. Comments in the code expand on this. Tested and validated against a Rage 128 Pro Ultra (PCI 1002:5446). Signed-off-by: Chad Jablonski --- hw/display/ati.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ hw/display/ati_cce.h | 26 ++++++++++++++++++++++++ hw/display/ati_int.h | 2 ++ 3 files changed, 75 insertions(+) create mode 100644 hw/display/ati_cce.h diff --git a/hw/display/ati.c b/hw/display/ati.c index f9be5b302c..bac0ceaa79 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -535,6 +535,31 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,= unsigned int size) qemu_log_mask(LOG_GUEST_ERROR, "Read from write-only register 0x%x\n", (unsigned)ad= dr); break; + case PM4_MICROCODE_ADDR: + val =3D s->cce.microcode.addr; + break; + case PM4_MICROCODE_RADDR: + val =3D 0; + break; + case PM4_MICROCODE_DATAH: + val =3D (s->cce.microcode.microcode[s->cce.microcode.raddr] >> 32)= & + 0xffffffff; + break; + case PM4_MICROCODE_DATAL: + val =3D s->cce.microcode.microcode[s->cce.microcode.raddr] & 0xfff= fffff; + s->cce.microcode.addr +=3D 1; + /* + * The write address (addr) is always copied into the + * read address (raddr) after a DATAL read. This leads + * to surprising behavior when the PM4_MICROCODE_ADDR + * instead of the PM4_MICROCODE_RADDR register is set to + * a value just before a read. The first read after this + * will reflect the previous raddr before incrementing and + * re-syncing with addr. This is expected and observed on + * the hardware. + */ + s->cce.microcode.raddr =3D s->cce.microcode.addr; + break; default: break; } @@ -1052,6 +1077,28 @@ void ati_reg_write(ATIVGAState *s, hwaddr addr, ati_flush_host_data(s); ati_host_data_reset(&s->host_data); break; + case PM4_MICROCODE_ADDR: + s->cce.microcode.addr =3D data; + break; + case PM4_MICROCODE_RADDR: + s->cce.microcode.raddr =3D data; + s->cce.microcode.addr =3D data; + break; + case PM4_MICROCODE_DATAH: { + uint64_t curr =3D s->cce.microcode.microcode[s->cce.microcode.addr= ]; + uint64_t low =3D curr & 0xffffffff; + uint64_t high =3D (data & 0x1f) << 32; + s->cce.microcode.microcode[s->cce.microcode.addr] =3D high | low; + break; + } + case PM4_MICROCODE_DATAL: { + uint64_t curr =3D s->cce.microcode.microcode[s->cce.microcode.addr= ]; + uint64_t low =3D data & 0xffffffff; + uint64_t high =3D curr & (0xffffffffull << 32); + s->cce.microcode.microcode[s->cce.microcode.addr] =3D high | low; + s->cce.microcode.addr +=3D 1; + break; + } default: break; } diff --git a/hw/display/ati_cce.h b/hw/display/ati_cce.h new file mode 100644 index 0000000000..f2ef1345de --- /dev/null +++ b/hw/display/ati_cce.h @@ -0,0 +1,26 @@ +/* + * QEMU ATI SVGA emulation + * CCE engine functions + * + * Copyright (c) 2025 Chad Jablonski + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef ATI_CCE_H +#define ATI_CCE_H + +#include "qemu/osdep.h" +#include "qemu/log.h" + +typedef struct ATIPM4MicrocodeState { + uint8_t addr; + uint8_t raddr; + uint64_t microcode[256]; +} ATIPM4MicrocodeState; + +typedef struct ATICCEState { + ATIPM4MicrocodeState microcode; +} ATICCEState; + +#endif /* ATI_CCE_H */ diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index 3ee891c888..416275ae0d 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -16,6 +16,7 @@ #include "vga_int.h" #include "qom/object.h" #include "qemu/units.h" +#include "ati_cce.h" =20 /*#define DEBUG_ATI*/ =20 @@ -123,6 +124,7 @@ struct ATIVGAState { MemoryRegion mm; ATIVGARegs regs; ATIHostDataState host_data; + ATICCEState cce; }; =20 const char *ati_reg_name(int num); --=20 2.51.2 From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216142; cv=none; d=zohomail.com; s=zohoarc; b=JKUWNhw59jOTShp4QnhqhjQIGrwOjrAjjD5vKgnLu2SJSdj4w0W60o3eDbn7l0Mcw5T+C7k1mf19zfpPlhML4i22PKEZdC9FShUY+a2/ufJ2ma1jljlf3Uw9CcrRzSAAfYHyS7sxp1n/45lKn7BdoGfVawamyZ7T1HwZukbXrZw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216142; h=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=UJM3F3BQuLVendrDWJtrPOsf6gS3z8el+Rf/CxbEnE8=; b=Ef4Fb2QrNGlpnEh4QMMh53DyW7CBjBzvgN0q4xrAGG+oJ0/UK8MS6TlJ/IVZSe6wJg6/pZ1UGmw9/3Zjsp8sro7hD9C3tMTdum5C7ciVFrqWTtp6k+5e7KjXVdVhPaaaQdmGJYo+y+yx7RLKHiwnoRqqOfBOFUfvnOqSXzVfc4g= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216141936487.64436594936785; Wed, 31 Dec 2025 13:22:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dN-0000pW-PK; Wed, 31 Dec 2025 16:21:34 -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 1vb3dJ-0000oT-Pl for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:29 -0500 Received: from fhigh-a8-smtp.messagingengine.com ([103.168.172.159]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dI-0003hz-2v for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:29 -0500 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfhigh.phl.internal (Postfix) with ESMTP id A63A31400046; Wed, 31 Dec 2025 16:21:27 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-02.internal (MEProxy); Wed, 31 Dec 2025 16:21:27 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:27 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id aa83430f; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216087; x= 1767302487; bh=UJM3F3BQuLVendrDWJtrPOsf6gS3z8el+Rf/CxbEnE8=; b=C EbglSYWQvBG1Va33ktSfnfLKndwTu0P5lFmNtFAG9+Ye8UPaMzfMP/4OSBi2Ycr1 u9R8rGbkoozaUOJcoP0LnzZcd8kxKVagvruqxsfJua7L3ZRQjY7Nx/rRe/fKW4f8 fqemBeY/BjseB7y8sqzvsDlnqHcrCG6Ei+wEcd6vIkVaqQuB+bHC4k7fPl2nAE0c UnPcYMcejnNFNG3PnFzfBKUtOQoGyhVzMn3Z9oDWleWC3MfZrXlXOpK/5Pi/GxeB IHvWmwePS+McioLBXLtCaCHGRqyGjZYJofhdx7Cb7aMUsRwBvyrUZeiKyx2l9+jP E76vpvkJYNWofrpM4SsFA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216087; x=1767302487; bh=U JM3F3BQuLVendrDWJtrPOsf6gS3z8el+Rf/CxbEnE8=; b=uDfROu74H9fmSV4B8 Bs13oApRUGh4ylyH8uoeBsKbn2pCBaqwAeZBY5hqXLZOFquktSHY5dBtiSZOCVAL GlZTjoswLkD+mfgBEcvKbX/RIW3jefhq34TyoujzHTyz5KsynHFfIvXy+U4OcUcU LnvvZH3001FTfWdqFAzGSLlOeuflZnP4UXovvisGOLHIrcW60LZydIkOg8jXFuaE Ki2qiv/BqoG5GnsynYK9ICVKK50SLzfgxMxD+q9B8NdqLXj/jD57AEF1/UcFlPWr Rx90u45WP7kr2DjljYsZGeHu+KMysv799Zqbd4kkFQKA9zPt4Rbf5KH87O+Tijby 8tJXw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeljecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheptghhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepqh gvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtthhopegsrghlrghtohhn segvihhkrdgsmhgvrdhhuh X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 3/7] ati-vga: Implement PM4_BUFFER_CNTL register Date: Wed, 31 Dec 2025 16:21:03 -0500 Message-ID: <20251231212107.1020964-4-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.159; envelope-from=chad@jablonski.xyz; helo=fhigh-a8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216143887158500 Content-Type: text/plain; charset="utf-8" The PM4_BUFFER_CNTL register is used to set up the CCE FIFO. These are straightforward reads and writes. Future CCE patches make use of this state. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 11 +++++++++++ hw/display/ati_cce.h | 4 ++++ hw/display/ati_regs.h | 12 ++++++++++++ 3 files changed, 27 insertions(+) diff --git a/hw/display/ati.c b/hw/display/ati.c index bac0ceaa79..f8e1fe2861 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -560,6 +560,11 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,= unsigned int size) */ s->cce.microcode.raddr =3D s->cce.microcode.addr; break; + case PM4_BUFFER_CNTL: + val =3D ((s->cce.buffer_mode & 0xf) << 28) | + (s->cce.no_update << 27) | + (s->cce.buffer_size_l2qw & 0x7ffffff); + break; default: break; } @@ -1099,6 +1104,12 @@ void ati_reg_write(ATIVGAState *s, hwaddr addr, s->cce.microcode.addr +=3D 1; break; } + case PM4_BUFFER_CNTL: { + s->cce.buffer_size_l2qw =3D data & 0x7ffffff; + s->cce.no_update =3D (data >> 27) & 1; + s->cce.buffer_mode =3D (data >> 28) & 0xf; + break; + } default: break; } diff --git a/hw/display/ati_cce.h b/hw/display/ati_cce.h index f2ef1345de..25a2430c60 100644 --- a/hw/display/ati_cce.h +++ b/hw/display/ati_cce.h @@ -21,6 +21,10 @@ typedef struct ATIPM4MicrocodeState { =20 typedef struct ATICCEState { ATIPM4MicrocodeState microcode; + /* BufferCntl */ + uint32_t buffer_size_l2qw; + bool no_update; + uint8_t buffer_mode; } ATICCEState; =20 #endif /* ATI_CCE_H */ diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 8f3335817f..94b7ed0d37 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -387,7 +387,19 @@ #define PC_BUSY 0x80000000 =20 #define BUS_MASTER_DIS 0x00000040 + + +/* PM4_BUFFER_CNTL buffer mode bit constants */ #define PM4_BUFFER_CNTL_NONPM4 0x00000000 +#define PM4_BUFFER_CNTL_192PIO 0x00000001 +#define PM4_BUFFER_CNTL_192BM 0x00000002 +#define PM4_BUFFER_CNTL_128PIO_64INDBM 0x00000003 +#define PM4_BUFFER_CNTL_128BM_64INDBM 0x00000004 +#define PM4_BUFFER_CNTL_64PIO_128INDBM 0x00000005 +#define PM4_BUFFER_CNTL_64BM_128INDBM 0x00000006 +#define PM4_BUFFER_CNTL_64PIO_64VCBM_64INDBM 0x00000007 +#define PM4_BUFFER_CNTL_64BM_64VCBM_64INDBM 0x00000008 +#define PM4_BUFFER_CNTL_64PIO_64VCPIO_64INPIO 0x0000000f =20 /* DP_DATATYPE bit constants */ #define DST_8BPP 0x00000002 --=20 2.51.2 From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216148; cv=none; d=zohomail.com; s=zohoarc; b=PnowKh2WPekdNx0F5luEo2XASEsQoRoymFAYo490aww1DKnq5AwBb6ir/9FOzI76zkmfcr5bG0cl5BaQU8P9qH6TIQ4MxJoYDh/AcuKmxbWBKbCNTP1jNRPcuzBhK7rx5lY1ArqbV0gLBRP6FFQcbRHWuT3bjoFSMAkmcEphdM0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216148; h=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=DVEcA6/vb4PpKi3BScNtdzOM0zTGfMYeT/9Yf5tvYMA=; b=V17D3R52h+BRUQQhouLYAkWUH16x3HdDScHw3e+VFywYMoCW/0Y3ZkVai6jY3OomsgAxauVh+OL4LwRZpI17tLkqh+4OyOkLsbCqKfCpb7VJgFUGC2Ij+hrTTkToDnTmUdiddSNnbJKC48pA7NlvAEb5CpkJw6vpb605NUVQN+I= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216147744275.4076179534941; Wed, 31 Dec 2025 13:22:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dS-0000rT-HA; Wed, 31 Dec 2025 16:21:38 -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 1vb3dL-0000pX-3S for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:32 -0500 Received: from fout-a7-smtp.messagingengine.com ([103.168.172.150]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dJ-0003i3-2t for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:30 -0500 Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.phl.internal (Postfix) with ESMTP id 11480EC0201; Wed, 31 Dec 2025 16:21:28 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-06.internal (MEProxy); Wed, 31 Dec 2025 16:21:28 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:27 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 4ced2b79; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216088; x= 1767302488; bh=DVEcA6/vb4PpKi3BScNtdzOM0zTGfMYeT/9Yf5tvYMA=; b=K U5UexAeZYspw30e65UuKaiAIIrPYPtzsupMNxYyH9bifejQjxK9Byypphbd+Ls2P 7TMoot8qtC8DAzstbfUGBkd5mfDYSc60qJgsA9/Rt0aubMmmkDbJ7EzQfCe84ZGv myROLzOSRv4I63Loiyq+AT5pOStdjEmxV79ym3TA39Qao5Q1g0ZyjYKy8WZ4Xe14 gvkImqlJBz/BKOGrSSVLzPVLfCqOcMYmD5ju6Hb/4kfgOt70wKP+p3qWiEX/FPGz 7TdNIATl5TPANGycpGUyR6RRK4m/7fC+CKdOnjs3S0CbsgaJXMhWThLPwy5HzkeP MgHbOq07cynWvBx34vzyg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216088; x=1767302488; bh=D VEcA6/vb4PpKi3BScNtdzOM0zTGfMYeT/9Yf5tvYMA=; b=iGRjUnju+Zf2i9b9n Kt/sClJsdAvDwVOfwC2wS9XY+gXwxx5Frey/f59LQYAuSW21fE8ala4rBJ+ABizj bVYJL2qrRy09o4WcZR2FsBBa9NkH+pzbecB6SEOUwMpwWg3dP1BFGj5lFxhsRvGU r/IVVMEp8wwcR8Oizr772btGU9j6P25MTvo3aAPDyBT/47xOOGLwGD1lYb3P8lbI yZFbrF6bKHiTc+ZkWU3eVxlMbYuSkTrd189TimKlt5L7hGbyCjEZOIQQmUAXyvKO Z14/YwZUfsSLHIQ+pgmfKthe/zE14/4+J+9ctu8F+PcX69qppwuY3pY9GPwId5CM 2acYw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeljecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtohepsggrlhgrthhonhesvghikhdrsghmvgdrhhhupdhrtghpthhtoheptg hhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepqhgvmhhuqdguvghvvghl sehnohhnghhnuhdrohhrgh X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 4/7] ati-vga: Implement PM4_MICRO_CNTL register Date: Wed, 31 Dec 2025 16:21:04 -0500 Message-ID: <20251231212107.1020964-5-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.150; envelope-from=chad@jablonski.xyz; helo=fout-a7-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216166955158500 Content-Type: text/plain; charset="utf-8" The PM4_MICRO_CNTL register has a single flag that is used by drivers to enable processing of CCE commands from the CCE FIFO. Reverse engineering uncovered additional debug fields, many of which have an unclear purpose. They have been omitted for now but could be added if needed. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 7 +++++++ hw/display/ati_cce.h | 2 ++ hw/display/ati_regs.h | 3 +++ 3 files changed, 12 insertions(+) diff --git a/hw/display/ati.c b/hw/display/ati.c index f8e1fe2861..a9fe0cd0d2 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -565,6 +565,9 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, = unsigned int size) (s->cce.no_update << 27) | (s->cce.buffer_size_l2qw & 0x7ffffff); break; + case PM4_MICRO_CNTL: + val =3D s->cce.freerun ? PM4_MICRO_FREERUN : 0; + break; default: break; } @@ -1110,6 +1113,10 @@ void ati_reg_write(ATIVGAState *s, hwaddr addr, s->cce.buffer_mode =3D (data >> 28) & 0xf; break; } + case PM4_MICRO_CNTL: { + s->cce.freerun =3D data & PM4_MICRO_FREERUN; + break; + } default: break; } diff --git a/hw/display/ati_cce.h b/hw/display/ati_cce.h index 25a2430c60..a6a9aa87c4 100644 --- a/hw/display/ati_cce.h +++ b/hw/display/ati_cce.h @@ -21,6 +21,8 @@ typedef struct ATIPM4MicrocodeState { =20 typedef struct ATICCEState { ATIPM4MicrocodeState microcode; + /* MicroCntl */ + bool freerun; /* BufferCntl */ uint32_t buffer_size_l2qw; bool no_update; diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 94b7ed0d37..190b99184c 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -401,6 +401,9 @@ #define PM4_BUFFER_CNTL_64BM_64VCBM_64INDBM 0x00000008 #define PM4_BUFFER_CNTL_64PIO_64VCPIO_64INPIO 0x0000000f =20 +/* PM4_MICRO_CNTL bit constants */ +#define PM4_MICRO_FREERUN 0x40000000 + /* DP_DATATYPE bit constants */ #define DST_8BPP 0x00000002 #define DST_15BPP 0x00000003 --=20 2.51.2 From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216154; cv=none; d=zohomail.com; s=zohoarc; b=bPLnaOUmERbww0muECf+CzSSgSjnHWpZT3azYGl+0ismv7LUJYL5cQYwD3RqUE+64AGVQpWgFMDV5heQsr8oO9eiDPfS3LnW4A/sezsmb69/oGmFCQrv8YSv/QNG11CN91jILc5nt3dBY7Tk+m/1re/n8s99U3DygLEki3nImO4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216154; h=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=cOlZAnkN9sjN1QjjKuf1SyOn+m2Ro1DZ/qaGUkQOMhA=; b=dtWYiR9c2sb3xoFwUj1H4Wq+50IFAotH88mPw11psehkEvVxGIsRYqkxkfZJkifeQE30uZjaLmiHLiX/ahuajhKKOXLt8QAVH0bVu/CiVQGGz+AQV+a/yN/64dQw/6eHz8nH346rjRPDpqzZMxlvR3DWQtviBxq4LSI6AM0gq3Y= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216154774940.9360579637145; Wed, 31 Dec 2025 13:22:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dQ-0000qv-9o; Wed, 31 Dec 2025 16:21:36 -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 1vb3dL-0000pV-10 for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:31 -0500 Received: from fhigh-a8-smtp.messagingengine.com ([103.168.172.159]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dJ-0003iM-Bb for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:30 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfhigh.phl.internal (Postfix) with ESMTP id 834A8140004E; Wed, 31 Dec 2025 16:21:28 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Wed, 31 Dec 2025 16:21:28 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:28 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id e5a7cc78; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216088; x= 1767302488; bh=cOlZAnkN9sjN1QjjKuf1SyOn+m2Ro1DZ/qaGUkQOMhA=; b=G MlGuaa6RkpLWtt3faOl1tSsLsgt15c0RicDoVjOBWBoPn/jT5uPgmtILwojyGkeC HINU35PDLwLqdjRhCWVHL1An12vUpcNAPxR0Va4AMYPpl4qhxbcT4bT6RrhzXwMj t5u+5em0ZDHISrlJJoUpzy9S4+1/hDLeQAVxhs1y+7mLfGMse/ahvuJxrc5aNBhM QqmN5v5I0Lu2pbfAMhYo8asvjp9TekHGzAUNcX8HcVEbmfY1wO8xoBRuJtLOOO+K T8U40AalSTdj7ctPkz4WN3xq2iaXlTdixpzswZMxb4BSrHm68f2zxvAavyyudbzL lrOI14VULg/vMAFK6uz0A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216088; x=1767302488; bh=c OlZAnkN9sjN1QjjKuf1SyOn+m2Ro1DZ/qaGUkQOMhA=; b=KAHtoD4oUPQm/XLZa +kMazKdvvtG8iGQ9COt7e8G0vwflzxvEkIKWksvDM3UJGRNix8KMgOqtc9nrPs+c DMWHv1w3beE1elq5FyFHMAZVzztO8Lwh128OgYsOaSIK//CLt7ZMRe4GFF87aHJ6 yQSw8fbMobj9ebQIgPzOWAelutp+lELuDVNTnzS7gANEx8DVvZOdx69DUW3qNJJL 73V3CQULqQ2xLAypYJijIlZxnGXzD0NtFi//0oUYwTbpVG1MX24jOI5iXuiAfK4q tysNVbUwC3i4q0veKEh3i4yyyPidPe+Dz9w2gqky+jOehE0t4qNx3DV0QOPEUbfy 7U4Qw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeljecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtth hopegsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhopegthhgrugesjhgr sghlohhnshhkihdrgiihii X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 5/7] ati-vga: Disable GUI engine MMIO writes when CCE enabled Date: Wed, 31 Dec 2025 16:21:05 -0500 Message-ID: <20251231212107.1020964-6-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.159; envelope-from=chad@jablonski.xyz; helo=fhigh-a8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216157019158500 Content-Type: text/plain; charset="utf-8" When the CCE engine is enabled, real hardware ignores any MMIO writes to GUI registers (0x1400-0x1fff range). Writes made by the CCE engine are not affected by this. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/display/ati.c b/hw/display/ati.c index a9fe0cd0d2..82450c0331 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -1131,6 +1131,13 @@ static void ati_mm_write(void *opaque, hwaddr addr, if (addr < CUR_OFFSET || addr > CUR_CLR1 || ATI_DEBUG_HW_CURSOR) { trace_ati_mm_write(size, addr, ati_reg_name(addr & ~3ULL), data); } + if (addr >=3D 0x1400 && addr <=3D 0x1fff && s->cce.buffer_mode !=3D 0)= { + qemu_log_mask(LOG_GUEST_ERROR, + "ati_mm_write: wrote 0x%lx to gui register 0x%lx while cce eng= ine enabled, ignored.\n", + data, addr); + return; + } + ati_reg_write(s, addr, data, size); } =20 --=20 2.51.2 From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216182; cv=none; d=zohomail.com; s=zohoarc; b=CnfzBzlgJRJyYUARZri7lRNXjwx+Oa/eaOjJqqErmCagR3GUpIvmezhPYcnHwLKoiCB3FewbTYZKcIr4P13Okad48h/iDhylL8QkdxaQS7TJKXOeT9GaK7j5XrppCkidg1BYlmnE9IyFom7q2/hzI9El2tKPnEWBWFwf1VuvxdI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216182; h=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=fs9rAZ/AhrU9g45k3TdURM/8EJPv83Sv6QlvOcQQhzo=; b=G9wcQ72Rpcc5WPJi78TiI24vzjGnREhrQTejm46iTIppznoIAwbMm/crdKLlK6G82EzPH+Y+EHGT9X0ZRIXkLCEyedDhSeRkS5zDI55pE1iaqBw+DSsaG9J+lyzbhAHrpD/9uAnsYR4wOqVaUgrAGdOqDDb44cB793/OgG66604= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216182021239.1559780361174; Wed, 31 Dec 2025 13:23:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dR-0000r2-4A; Wed, 31 Dec 2025 16:21:37 -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 1vb3dL-0000ph-Jq for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:33 -0500 Received: from fout-a7-smtp.messagingengine.com ([103.168.172.150]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dJ-0003iX-Cm for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:31 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.phl.internal (Postfix) with ESMTP id E9681EC0203; Wed, 31 Dec 2025 16:21:28 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Wed, 31 Dec 2025 16:21:28 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:28 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 2d71946b; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216088; x= 1767302488; bh=fs9rAZ/AhrU9g45k3TdURM/8EJPv83Sv6QlvOcQQhzo=; b=i jxJPCt4dZwmKpKzwBmZ6Ssg3ioiIka0jWWrRicbqNSP0hizg2mkJbA2sx5mtcINv cUsdZc0pw7MRJdPzCKFCpV3wTpnb/pPZHXZ+SrLBdjCp4pF4s0P7W6z8B6XjOL1S wTwzzuMMfgKNXPL13yXz/lO/QZ7zd4IAYxo+2ixQeRx6akvItr5El1/P1/LzrKVo WIZOLF5dYps14ciOthmKVzvaMSgqjyInQ/YrpnUiLfCcIbRuWpAmwQkCJXXtWHD3 wSBoJT/EOF3i+sHN+SgkoUITjMpr+GtUyLEO4pAabiDJwooogzc7CETnJokYePcz ngCZfuNoAhjy+EdQEHYlg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216088; x=1767302488; bh=f s9rAZ/AhrU9g45k3TdURM/8EJPv83Sv6QlvOcQQhzo=; b=CE51D0kvcy9LbuDBp 4rSNhpxjeG+E1RacxqMqLca6gIm6l4/7HRl1ImpUjoDJHODjDxNaL0FnH7HkaLAO yfefHq7lDeEaufkBl8hUMtxciuNKbcuH3Zwzww27HY6dVtO8rHjNaSXhsrdDS97s LCLQjvOX4284y4PZlFKFduH+x/cttq85uqVuQVv17eC/hJyk9ALckz1FtbfMO7F5 pl+pWkkd9tGYAkALQUI5J8GxYt33txbpIHdO5924SupGfVCMyJYZk2zmAXY2do95 VpYBzInzlyZ5oydQ+Er+ooHs4TCfRVqxKcshYyGR1MSXlDBcBmOxYqrafn4JnPvm EOAFw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeljecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheptghhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepqh gvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtthhopegsrghlrghtohhn segvihhkrdgsmhgvrdhhuh X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 6/7] ati-vga: Process Type-0/1/2 CCE packets via PIO Date: Wed, 31 Dec 2025 16:21:06 -0500 Message-ID: <20251231212107.1020964-7-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.150; envelope-from=chad@jablonski.xyz; helo=fout-a7-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216183305158500 Content-Type: text/plain; charset="utf-8" While drivers use bus mastering modes, PIO is the simplest place to start. This implements the PM4_FIFO_DATA_EVEN/ODD registers. Writing to these registers in sequence places packets into the CCE FIFO directly without need for a ring buffer. This enables testing of the CCE packet processing itself. Ring buffer registers will follow in a future patch. Type-0 and Type-1 packets write to registers. Type-2 packets are NOPs. Type-3 packet headers are parsed but only logged as of now. Hardware testing and poking at the microcode suggests that Type-0/1/2 packets may be implemented in hardware and not the microcode. Type-3, however, definitely depends on the microcode. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 10 +++ hw/display/ati_cce.c | 156 ++++++++++++++++++++++++++++++++++++++++ hw/display/ati_cce.h | 56 +++++++++++++++ hw/display/meson.build | 2 +- hw/display/trace-events | 9 +++ 5 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 hw/display/ati_cce.c diff --git a/hw/display/ati.c b/hw/display/ati.c index 82450c0331..e7ba202bbd 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -1117,6 +1117,16 @@ void ati_reg_write(ATIVGAState *s, hwaddr addr, s->cce.freerun =3D data & PM4_MICRO_FREERUN; break; } + case PM4_FIFO_DATA_EVEN: + /* fall through */ + case PM4_FIFO_DATA_ODD: + /* + * Real hardware does seem to behave differently when the even/odd + * sequence is not strictly adhered to but it's difficult to deter= mine + * exactly what is happenning. So for now we treat them the same. + */ + ati_cce_receive_data(s, data); + break; default: break; } diff --git a/hw/display/ati_cce.c b/hw/display/ati_cce.c new file mode 100644 index 0000000000..62a88a54df --- /dev/null +++ b/hw/display/ati_cce.c @@ -0,0 +1,156 @@ +/* + * QEMU ATI SVGA emulation + * CCE engine functions + * + * Copyright (c) 2025 Chad Jablonski + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" +#include "ati_regs.h" +#include "ati_int.h" +#include "trace.h" + +static inline uint32_t +ati_cce_data_packets_remaining(const ATIPM4PacketState *p) +{ + switch (p->type) { + case ATI_CCE_TYPE0: + return p->t0.count - p->dwords_processed; + case ATI_CCE_TYPE1: + return 2 - p->dwords_processed; + case ATI_CCE_TYPE2: + return 0; + case ATI_CCE_TYPE3: + return p->t3.count - p->dwords_processed; + default: + /* This should never happen, type is 2-bits wide */ + return 0; + } +} + +static void +ati_cce_parse_packet_header(ATIPM4PacketState *p, uint32_t header) +{ + p->dwords_processed =3D 0; + p->type =3D (header & ATI_CCE_TYPE_MASK) >> ATI_CCE_TYPE_SHIFT; + switch (p->type) { + case ATI_CCE_TYPE0: { + ATIPM4Type0Header t0 =3D { + /* Packet stores base_reg as word offset, convert to byte offs= et */ + .base_reg =3D ((header & ATI_CCE_TYPE0_BASE_REG_MASK) >> + ATI_CCE_TYPE0_BASE_REG_SHIFT) << 2, + /* Packet stores count as n-1, convert to actual count */ + .count =3D ((header & ATI_CCE_TYPE0_COUNT_MASK) >> + ATI_CCE_TYPE0_COUNT_SHIFT) + 1, + .one_reg_wr =3D header & ATI_CCE_TYPE0_ONE_REG_WR, + }; + p->t0 =3D t0; + trace_ati_cce_packet_type0(t0.base_reg, t0.count, t0.one_reg_wr); + break; + } + case ATI_CCE_TYPE1: { + ATIPM4Type1Header t1 =3D { + /* Packet stores reg0 as word offset, convert to byte offset */ + .reg0 =3D ((header & ATI_CCE_TYPE1_REG0_MASK) >> + ATI_CCE_TYPE1_REG0_SHIFT) << 2, + /* Packet stores reg1 as word offset, convert to byte offset */ + .reg1 =3D ((header & ATI_CCE_TYPE1_REG1_MASK) >> + ATI_CCE_TYPE1_REG1_SHIFT) << 2, + }; + p->t1 =3D t1; + trace_ati_cce_packet_type1(t1.reg0, t1.reg1); + break; + } + case ATI_CCE_TYPE2: { + /* Type-2 is a no-op, it has no header state */ + trace_ati_cce_packet_type2(); + break; + } + case ATI_CCE_TYPE3: { + ATIPM4Type3Header t3 =3D { + .opcode =3D (header & ATI_CCE_TYPE3_OPCODE_MASK) >> + ATI_CCE_TYPE3_OPCODE_SHIFT, + /* Packet stores count as n-1, convert to actual count */ + .count =3D ((header & ATI_CCE_TYPE3_COUNT_MASK) >> + ATI_CCE_TYPE3_COUNT_SHIFT) + 1, + }; + p->t3 =3D t3; + trace_ati_cce_packet_type3(t3.opcode, t3.count); + break; + } + default: + /* This should never happen, type is 2-bits wide */ + break; + } +} + +static void +ati_cce_process_type0_data(ATIVGAState *s, uint32_t data) +{ + ATIPM4PacketState *p =3D &s->cce.cur_packet; + uint32_t offset =3D p->t0.one_reg_wr ? 0 : + (p->dwords_processed * sizeof(uint32_t)); + uint32_t reg =3D p->t0.base_reg + offset; + trace_ati_cce_packet_type0_data(p->dwords_processed, reg, data); + ati_reg_write(s, reg, data, sizeof(uint32_t)); +} + +static void +ati_cce_process_type1_data(ATIVGAState *s, uint32_t data) +{ + ATIPM4PacketState *p =3D &s->cce.cur_packet; + uint32_t reg =3D p->dwords_processed =3D=3D 0 ? p->t1.reg0 : p->t1.reg= 1; + trace_ati_cce_packet_type1_data(p->dwords_processed, reg, data); + ati_reg_write(s, reg, data, sizeof(uint32_t)); +} + +static void +ati_cce_process_type3_data(ATIVGAState *s, uint32_t data) +{ + ATIPM4PacketState *p =3D &s->cce.cur_packet; + uint32_t opcode =3D p->t3.opcode; + qemu_log_mask(LOG_UNIMP, "Type-3 CCE packets not yet implemented\n"); + trace_ati_cce_packet_type3_data(p->dwords_processed, opcode, data); +} + +static void +ati_cce_process_packet_data(ATIVGAState *s, uint32_t data) +{ + ATIPM4PacketState *p =3D &s->cce.cur_packet; + switch (p->type) { + case ATI_CCE_TYPE0: { + ati_cce_process_type0_data(s, data); + p->dwords_processed +=3D 1; + break; + } + case ATI_CCE_TYPE1: { + ati_cce_process_type1_data(s, data); + p->dwords_processed +=3D 1; + break; + } + case ATI_CCE_TYPE2: + /* Type-2 packets have no data, we should never end up here */ + break; + case ATI_CCE_TYPE3: { + ati_cce_process_type3_data(s, data); + p->dwords_processed +=3D 1; + break; + } + default: + /* This should never happen, type is 2-bits wide */ + break; + } +} + +void +ati_cce_receive_data(ATIVGAState *s, uint32_t data) +{ + uint32_t remaining =3D ati_cce_data_packets_remaining(&s->cce.cur_pack= et); + if (remaining =3D=3D 0) { + /* We're ready to start processing a new packet header */ + ati_cce_parse_packet_header(&s->cce.cur_packet, data); + return; + } + ati_cce_process_packet_data(s, data); +} diff --git a/hw/display/ati_cce.h b/hw/display/ati_cce.h index a6a9aa87c4..b6ad21f47e 100644 --- a/hw/display/ati_cce.h +++ b/hw/display/ati_cce.h @@ -13,6 +13,60 @@ #include "qemu/osdep.h" #include "qemu/log.h" =20 +typedef struct ATIVGAState ATIVGAState; + +#define ATI_CCE_TYPE_MASK 0xc0000000 +#define ATI_CCE_TYPE_SHIFT 30 + +#define ATI_CCE_TYPE0 0 +#define ATI_CCE_TYPE0_BASE_REG_MASK 0x00007fff +#define ATI_CCE_TYPE0_BASE_REG_SHIFT 0 +#define ATI_CCE_TYPE0_ONE_REG_WR 0x00008000 +#define ATI_CCE_TYPE0_COUNT_MASK 0x3fff0000 +#define ATI_CCE_TYPE0_COUNT_SHIFT 16 + +#define ATI_CCE_TYPE1 1 +#define ATI_CCE_TYPE1_REG0_MASK 0x000007ff +#define ATI_CCE_TYPE1_REG0_SHIFT 0 +#define ATI_CCE_TYPE1_REG1_MASK 0x003ff800 +#define ATI_CCE_TYPE1_REG1_SHIFT 11 + +#define ATI_CCE_TYPE2 2 + +#define ATI_CCE_TYPE3 3 +#define ATI_CCE_TYPE3_OPCODE_MASK 0x0000ff00 +#define ATI_CCE_TYPE3_OPCODE_SHIFT 8 +#define ATI_CCE_TYPE3_COUNT_MASK 0x3fff0000 +#define ATI_CCE_TYPE3_COUNT_SHIFT 16 + +typedef struct ATIPM4Type0Header { + uint32_t base_reg; + uint16_t count; + bool one_reg_wr; +} ATIPM4Type0Header; + +typedef struct ATIPM4Type1Header { + uint32_t reg0; + uint32_t reg1; +} ATIPM4Type1Header; + +/* Type-2 headers are a no-op and have no state */ + +typedef struct ATIPM4Type3Header { + uint8_t opcode; + uint16_t count; +} ATIPM4Type3Header; + +typedef struct ATIPM4PacketState { + uint8_t type; + uint16_t dwords_processed; + union { + ATIPM4Type0Header t0; + ATIPM4Type1Header t1; + ATIPM4Type3Header t3; + }; +} ATIPM4PacketState; + typedef struct ATIPM4MicrocodeState { uint8_t addr; uint8_t raddr; @@ -23,10 +77,12 @@ typedef struct ATICCEState { ATIPM4MicrocodeState microcode; /* MicroCntl */ bool freerun; + ATIPM4PacketState cur_packet; /* BufferCntl */ uint32_t buffer_size_l2qw; bool no_update; uint8_t buffer_mode; } ATICCEState; =20 +void ati_cce_receive_data(ATIVGAState *s, uint32_t data); #endif /* ATI_CCE_H */ diff --git a/hw/display/meson.build b/hw/display/meson.build index 90e6c041bd..136d014746 100644 --- a/hw/display/meson.build +++ b/hw/display/meson.build @@ -59,7 +59,7 @@ system_ss.add(when: 'CONFIG_XLNX_DISPLAYPORT', if_true: f= iles('xlnx_dp.c')) =20 system_ss.add(when: 'CONFIG_ARTIST', if_true: files('artist.c')) =20 -system_ss.add(when: 'CONFIG_ATI_VGA', if_true: [files('ati.c', 'ati_2d.c',= 'ati_dbg.c'), pixman]) +system_ss.add(when: 'CONFIG_ATI_VGA', if_true: [files('ati.c', 'ati_2d.c',= 'ati_dbg.c', 'ati_cce.c'), pixman]) =20 system_ss.add(when: [pvg, 'CONFIG_MAC_PVG_PCI'], if_true: [files('appl= e-gfx.m', 'apple-gfx-pci.m')]) system_ss.add(when: [pvg, 'CONFIG_MAC_PVG_MMIO'], if_true: [files('appl= e-gfx.m', 'apple-gfx-mmio.m')]) diff --git a/hw/display/trace-events b/hw/display/trace-events index e323a82cff..d3c7ca1467 100644 --- a/hw/display/trace-events +++ b/hw/display/trace-events @@ -147,6 +147,15 @@ sii9022_switch_mode(const char *mode) "mode: %s" ati_mm_read(unsigned int size, uint64_t addr, const char *name, uint64_t v= al) "%u 0x%"PRIx64 " %s -> 0x%"PRIx64 ati_mm_write(unsigned int size, uint64_t addr, const char *name, uint64_t = val) "%u 0x%"PRIx64 " %s <- 0x%"PRIx64 =20 +# ati_cce.c +ati_cce_packet_type0(uint32_t base_reg, uint32_t count, bool one_reg_wr) "= base_reg=3D0x%x count=3D%u one_reg_wr=3D%u" +ati_cce_packet_type0_data(uint32_t data_idx, uint32_t reg, uint32_t data) = "data_idx=3D%u reg=3D0x%x data=3D0x%x" +ati_cce_packet_type1(uint32_t reg0, uint32_t reg1) "reg0=3D0x%x reg1=3D0x%= x" +ati_cce_packet_type1_data(uint32_t data_idx, uint32_t reg, uint32_t data) = "data_idx=3D%u reg=3D0x%x data=3D0x%x" +ati_cce_packet_type2(void) "" +ati_cce_packet_type3(uint8_t opcode, uint32_t count) "opcode=3D0x%x count= =3D%u" +ati_cce_packet_type3_data(uint32_t data_idx, uint8_t opcode, uint32_t data= ) "data_idx=3D%u opcode=3D0x%x data=3D%u" + # artist.c artist_reg_read(unsigned int size, uint64_t addr, const char *name, uint64= _t val) "%u 0x%"PRIx64 "%s -> 0x%08"PRIx64 artist_reg_write(unsigned int size, uint64_t addr, const char *name, uint6= 4_t val) "%u 0x%"PRIx64 "%s <- 0x%08"PRIx64 --=20 2.51.2 From nobody Wed Jan 7 09:28:20 2026 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=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1767216174; cv=none; d=zohomail.com; s=zohoarc; b=h6hI017aYYpCJdmQA7t1J3qx1oKHVtsdgaT58LSUuy0RWTNZQ9xo0KyPwpLEZU1dEBgSpU0WJGPLzKvdaJpqM6+nI/l1a6YwDJQEu5j0lI9lt2HXH+PR7ODRZPtuh0wr2xl1j4TyG69BBsVNRTaqLSlMYdrDpCawCsahA2JDJZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767216174; h=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=YaJUwb0+s40bHZM8eVhuyyzKRNSc6aDi5Spk934ExLc=; b=WDSJsx11fFlnTtIkhqaueuSiHW00LN20reLDFERh/53uYrWDo6wu9K2BKLibxW8dTXr24qXRK3Lr6yr1ZMZjEXzgati4wpSTJnmC699aZQizuVIpQJxv5z0K+EtcU/D1JGK6sk30g1rO5sUVZO0qVdcP4uPMK6wxA+07A+mL09w= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1767216174848306.99636292618027; Wed, 31 Dec 2025 13:22:54 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb3dR-0000r3-4q; Wed, 31 Dec 2025 16:21:37 -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 1vb3dM-0000pj-5H for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:33 -0500 Received: from fout-a7-smtp.messagingengine.com ([103.168.172.150]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb3dJ-0003il-Px for qemu-devel@nongnu.org; Wed, 31 Dec 2025 16:21:31 -0500 Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.phl.internal (Postfix) with ESMTP id 561E8EC0244; Wed, 31 Dec 2025 16:21:29 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-06.internal (MEProxy); Wed, 31 Dec 2025 16:21:29 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 16:21:28 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id afa1f1f2; Wed, 31 Dec 2025 21:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1767216089; x= 1767302489; bh=YaJUwb0+s40bHZM8eVhuyyzKRNSc6aDi5Spk934ExLc=; b=l 357cHzOi/DySGddjx1mn9IdCCL1JXanxmCyspHjfshmbXq7upOE8Qy2ddqMkDJ0C WYKU8GwPNW/TeU6kSfU0x3zsx8uyWUgRHZhUQa4p3ZctRixdVC+3tmG/zR0FQM9v 5whUB5fU5povWcvQc9vWCpE5d4GRtoni6Uhhmr0qrJys1zdfS41Rc8hsRUsmf6J2 NkWCM7Rv6sl1fh1osfhdVz/HBOvDsbmLe+4vFB9Ni0/jRb0O/QElS3ygN2z9CalV mja/yOFsjzbOsZU6J3uwCL//IzGwq4bnBtKBbOElA46t5jyVdV5WHhmYbjBi0fgh IMGTc0qrj0iZae6QH6rtA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1767216089; x=1767302489; bh=Y aJUwb0+s40bHZM8eVhuyyzKRNSc6aDi5Spk934ExLc=; b=HHqRy6y0yUkpT0v/6 bA0ege0OV0kyx0dpf7pAa3TssC3Awvy0JltfXk4Ay35cFiOWanzvBWxW3Owm0KKE xqqat2G4rzgjYmarPtyS3HnNgtifSDC8vH0xnah5hU/9saQLRBzCKZSSvnVyv4PN WWy3u7g9LvyLRokT7pte0EGQZKNfE5JTdNMBdwt7s1/HaY0LY5gIaf17ySCNs0X7 XoQqk2sHen9zlfMpHEmsD819s/6oZWOTk9yFX+swN1AyAeTp/mSAdK5qjDcBvel9 KprH6JKnARpKVILeFvGwRxWEVW8R87n5RToAJkk6QaJYh8oMfRLGgXIncauJHVX6 HkWKw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekfeeljecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheptghhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepqh gvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtthhopegsrghlrghtohhn segvihhkrdgsmhgvrdhhuh X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH 7/7] ati-vga: Implement PM4_STAT register and common flags Date: Wed, 31 Dec 2025 16:21:07 -0500 Message-ID: <20251231212107.1020964-8-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251231212107.1020964-1-chad@jablonski.xyz> References: <20251231212107.1020964-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 (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=103.168.172.150; envelope-from=chad@jablonski.xyz; helo=fout-a7-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498, PDS_OTHER_BAD_TLD=1.997, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=no 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 @jablonski.xyz) X-ZM-MESSAGEID: 1767216177209158500 Content-Type: text/plain; charset="utf-8" The PM4_STAT register largely mirrors the flags of the GUI_STAT register. The exception is that the low bits of PM4_STAT reflect the remaining slots in the CCE FIFO instead of the GUI FIFO. This implements a very incomplete set of common flags (MICRO_BUSY and GUI_ACTIVE) and the PM4_STAT register. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 16 +++++++++++++++- hw/display/ati_cce.c | 38 ++++++++++++++++++++++++++++++++++++++ hw/display/ati_cce.h | 3 +++ hw/display/ati_regs.h | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index e7ba202bbd..df3b727b27 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -276,6 +276,16 @@ static inline uint64_t ati_reg_read_offs(uint32_t reg,= int offs, } } =20 +static uint32_t ati_common_stat(ATIVGAState *s) +{ + /* TODO: This is _very_ naive. It will evolve. */ + uint32_t micro_busy =3D ati_cce_micro_busy(&s->cce.cur_packet) ? + MICRO_BUSY : 0; + /* GUI_ACTIVE is the OR of all other status flags */ + uint32_t gui_active =3D micro_busy ? GUI_ACTIVE : 0; + return gui_active | micro_busy; +} + static uint64_t ati_mm_read(void *opaque, hwaddr addr, unsigned int size) { ATIVGAState *s =3D opaque; @@ -383,7 +393,7 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, = unsigned int size) break; case RBBM_STATUS: case GUI_STAT: - val =3D 64; /* free CMDFIFO entries */ + val =3D ati_common_stat(s) | 64; /* free CMDFIFO entries */ break; case CRTC_H_TOTAL_DISP: val =3D s->regs.crtc_h_total_disp; @@ -568,6 +578,10 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,= unsigned int size) case PM4_MICRO_CNTL: val =3D s->cce.freerun ? PM4_MICRO_FREERUN : 0; break; + case PM4_STAT: { + val =3D ati_common_stat(s) | ati_cce_fifo_cnt(&s->cce); + break; + } default: break; } diff --git a/hw/display/ati_cce.c b/hw/display/ati_cce.c index 62a88a54df..3d35b0e857 100644 --- a/hw/display/ati_cce.c +++ b/hw/display/ati_cce.c @@ -11,6 +11,24 @@ #include "ati_int.h" #include "trace.h" =20 +static uint32_t +ati_cce_fifo_max(uint8_t mode) +{ + switch (mode) { + case PM4_BUFFER_CNTL_NONPM4...PM4_BUFFER_CNTL_192BM: + return 192; + case PM4_BUFFER_CNTL_128PIO_64INDBM...PM4_BUFFER_CNTL_128BM_64INDBM: + return 128; + case PM4_BUFFER_CNTL_64PIO_128INDBM...PM4_BUFFER_CNTL_64PIO_64VCBM_64I= NDBM: + /* fall through */ + case PM4_BUFFER_CNTL_64PIO_64VCPIO_64INPIO: + return 64; + default: + /* Undocumented but testing shows this returns 192 otherwise */ + return 192; + } +} + static inline uint32_t ati_cce_data_packets_remaining(const ATIPM4PacketState *p) { @@ -154,3 +172,23 @@ ati_cce_receive_data(ATIVGAState *s, uint32_t data) } ati_cce_process_packet_data(s, data); } + +bool +ati_cce_micro_busy(const ATIPM4PacketState *p) +{ + uint32_t remaining =3D ati_cce_data_packets_remaining(p); + if (remaining > 0) { + return true; + } + return false; +} + +uint32_t +ati_cce_fifo_cnt(const ATICCEState *c) +{ + /* + * This should return the available slots. Given that commands are + * processed immediately this returns the fifo max for now. + */ + return ati_cce_fifo_max(c->buffer_mode); +} diff --git a/hw/display/ati_cce.h b/hw/display/ati_cce.h index b6ad21f47e..12aede6ecc 100644 --- a/hw/display/ati_cce.h +++ b/hw/display/ati_cce.h @@ -85,4 +85,7 @@ typedef struct ATICCEState { } ATICCEState; =20 void ati_cce_receive_data(ATIVGAState *s, uint32_t data); +bool ati_cce_micro_busy(const ATIPM4PacketState *p); +uint32_t ati_cce_fifo_cnt(const ATICCEState *c); + #endif /* ATI_CCE_H */ diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 190b99184c..66f7e3f518 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -289,6 +289,7 @@ =20 /* CONSTANTS */ #define GUI_ACTIVE 0x80000000 +#define MICRO_BUSY 0x00020000 #define ENGINE_IDLE 0x0 =20 #define PLL_WR_EN 0x00000080 --=20 2.51.2