From nobody Wed Jan 7 09:26:47 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=1767239901; cv=none; d=zohomail.com; s=zohoarc; b=BfEld4xx97IzW4/dLDzbeQxEFWcZPR6s10h3UzeAFt1fXhLH2XJH/y0BSNDu8bR/SQzgFvumTIL6L+fCFEqnKEe8zmNW8QdGYMh7f7huVw6SWtUMiYHwaEfJvj7AWJZTuVQYWwcJjRfXok9l62epJbHUfS3LRvakIA7n8Vxw+7s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239901; 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=UBMhpECL7fJYtSjBb4yOdqcIHAavnh9XXEqdzRKmpM8=; b=Xnd5fSV0gofHqE/SwVXgoXw3D6xlQdExgCeo/yLMCa/CSe3DFWJXgmO2mKptfCs+xmcPxhbcidLQCKBwW7Ow7XrM7BnXTdjx7MfBI5p3boGeb2qmGosv1eUm9JMiNOYnT3JsbOz71jk8zwdu6XFJyZoin0DeeeLsZs22y1GZ+vI= 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 1767239900964608.4836195256637; Wed, 31 Dec 2025 19:58:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9ob-0002GC-3r; Wed, 31 Dec 2025 22:57:33 -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 1vb9oZ-0002Eg-02 for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:31 -0500 Received: from fout-b3-smtp.messagingengine.com ([202.12.124.146]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oX-0003iE-Hs for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:30 -0500 Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailfout.stl.internal (Postfix) with ESMTP id D42191D0004E; Wed, 31 Dec 2025 22:57:28 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Wed, 31 Dec 2025 22:57:28 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:27 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id dd9c2156; Thu, 1 Jan 2026 03:57:26 +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=1767239848; x= 1767326248; bh=UBMhpECL7fJYtSjBb4yOdqcIHAavnh9XXEqdzRKmpM8=; b=f DhzxabgMQljySU3Ewke3W28WMi+r6xyr2MA3DUPWigDTsbshW3mplCcxWTi3lzO8 /OMAI7vOmyk406Puwvvxz57gXLMwh8f2eisWu/wqU3aa6GgDw14wLoqZ8OfnQlyn 3beouCALMkxawIaUMfAZetlK6GZCfL+kQJncKZQRL9SGCeJ2RDxPiI+X2A7b8MwJ lOGJi0RBE/MZb0/4dASCgV1OS8waPHGBvLDfdH6++Jd1HbKJfr4FnPomjm/ygVJk WdbL7kS02+9O51TiIHr0dcioi1o/gSTxiUT6BcS29EI55+3cRclfjxmY1Pdv12IH 1uTulnkTNhJm29RzxxBvQ== 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=1767239848; x=1767326248; bh=U BMhpECL7fJYtSjBb4yOdqcIHAavnh9XXEqdzRKmpM8=; b=wKR4nLvadHXvCm5vI ssUXNnoyZyYYrCeiB8u1tSaFodVxGKkzyZJzu/UfVNn2RqFQ8+RgOTsLBbaXzCJN dtWSkDbOXMQcxeWp83ovH6lNNXGHd0CNKVt+uVVopFGubBNGAg5JJOw8F1mRF+J9 oygHPRhjBiqI7KQWBxuO9RmpogMrMAafgwykodEgd4iLslXaNFE4BYEu3FZ1p1En 0msNg8cWwJQ7Dy+mqRPibtKIFaB9xJZhSFto2z8aTc2NS8pBrzQSvLHLIpsP4YGW 8+TKsFYCnNfkkB27O1JuR87CxwBWrz5OKxdwWhktgg0iLOdEUX+TVw/dkVnQNFyy B4Fgg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejiecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtth hopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhopegsrghlrghtohhn 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 v2 1/7] ati-vga: Extract ati_reg_write() from ati_mm_write() Date: Wed, 31 Dec 2025 22:55:49 -0500 Message-ID: <20260101035555.1300511-2-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.146; envelope-from=chad@jablonski.xyz; helo=fout-b3-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: 1767239903371158500 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 Reviewed-by: BALATON Zoltan --- 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 e9c3ad2cd1..33f8e211dc 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -530,14 +530,9 @@ static inline void ati_reg_write_offs(uint32_t *reg, i= nt offs, } } =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; @@ -550,10 +545,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: @@ -942,6 +937,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 f5a47b82b0..ea1a8bceab 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -105,5 +105,7 @@ struct ATIVGAState { const char *ati_reg_name(int num); =20 void ati_2d_blt(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:26:47 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=1767239898; cv=none; d=zohomail.com; s=zohoarc; b=nsUZik5VCxctLy1wFZmHSFNOm16Y2VyoCQXntn65KBz9OlP5ROBlhrEH8Oz2MpHeZLq8Nd3yfyMOTOCleNkXHbiqcdlUKeCgUnl0bL6SFIIB2OrgCBfl7XBPp0iFX+Vh5NT06uGbuky8WTqVVWnSjVx185uXNwedMTzJdz96ajM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239898; 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=1/oQvf+7oFxMlLhS7xldh1B7Xf0xiDTcW0n9KdiVD7A=; b=X4rDgBfvyn/lFhZLk0MwfsjuXD/40dI3cx8NaTuG4vwS8+zZsu90kyDdp4ps9a/90tga8TEEGdX2TtcErCkk8J2bVC+xiPOPqX18RtAemYD38O5YCwt7oJc9E634UXMTPyoYuZoZ4vhNujnmzNPbd8JEjxo1iV6dpe4mRArvrfc= 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 1767239898401353.63500120845026; Wed, 31 Dec 2025 19:58:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9ob-0002Gc-Ug; Wed, 31 Dec 2025 22:57: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 1vb9oa-0002FU-8X for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from fhigh-b3-smtp.messagingengine.com ([202.12.124.154]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oY-0003iI-8X for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfhigh.stl.internal (Postfix) with ESMTP id 5E5707A008F; Wed, 31 Dec 2025 22:57:29 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Wed, 31 Dec 2025 22:57:29 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:28 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id cf25ce26; Thu, 1 Jan 2026 03:57:26 +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=1767239849; x= 1767326249; bh=1/oQvf+7oFxMlLhS7xldh1B7Xf0xiDTcW0n9KdiVD7A=; b=A dBLFivlpcUhXnCSG15WQE5B466tPty38JrMrbWDEYJGOXO4OEo2/7tljD9xS4DZX lsh/Jjeg2JhTY6qeZDnHMx+A0zuN4MWdsJeOyaLy6cSfrml9pZt+gTT2fChjEXvL rHbx1+pxWVIKeC3swfbczSKQNx7RTDscghKY/EvmO9WlCVYoErkEDlQupz7g/sQh qPuWMQhIihGegJa7ovp8BfM5QpMJV81kDL4jHoywZWehLXg9ifArctKLuOdlPOzV x08vbnMT0DytpoTvM0UHRThyCbE+CieyizoHjiAdokOfVtNFr4W1qDhDd488ZMzw 7bMOLR+UbQkw5jdjH0/Og== 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=1767239849; x=1767326249; bh=1 /oQvf+7oFxMlLhS7xldh1B7Xf0xiDTcW0n9KdiVD7A=; b=riugsOYB8ukZCRFUl rsaX2T7b3eW5dnUpaVIUYWnutVcZWdfnl163l2GZxw08F6sXhb6yMOtYNY1X9PGv W0brtfTBSVxnP1aXPw45cue5tSXeEOzhd+ef3+zWtdfdnBGgairElY7v5puI2i6R s1+wrCSKy0CnxqCDY+PM3r2mbbT2zlB8P3kBHxaL4wPWnUZxM7d0EhjeeqGzA7Re 2+ZBXZIGgySwfcZpHm7hd+OhEJmpQZwBsy62TVPirl3w6JHeCYYnYWmjImOYqGFV AbdY0ZB3qKI1OP4IFp9sN0msmWa0927w2pg4LyuaRBKu/0a4BccGnINExBhQOFKv 8zNyQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejiecutefuodetggdotefrod 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 v2 2/7] ati-vga: Implement CCE/PM4 microcode register handling Date: Wed, 31 Dec 2025 22:55:50 -0500 Message-ID: <20260101035555.1300511-3-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.154; envelope-from=chad@jablonski.xyz; helo=fhigh-b3-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: 1767239900489158500 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 33f8e211dc..e291926470 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -510,6 +510,31 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,= unsigned int size) case DEFAULT_SC_BOTTOM_RIGHT: val =3D s->regs.default_sc_bottom_right; 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; } @@ -932,6 +957,28 @@ void ati_reg_write(ATIVGAState *s, hwaddr addr, case DEFAULT_SC_BOTTOM_RIGHT: s->regs.default_sc_bottom_right =3D data & 0x3fff3fff; 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 ea1a8bceab..ed6307151b 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -14,6 +14,7 @@ #include "hw/i2c/bitbang_i2c.h" #include "vga_int.h" #include "qom/object.h" +#include "ati_cce.h" =20 /*#define DEBUG_ATI*/ =20 @@ -100,6 +101,7 @@ struct ATIVGAState { MemoryRegion io; MemoryRegion mm; ATIVGARegs regs; + ATICCEState cce; }; =20 const char *ati_reg_name(int num); --=20 2.51.2 From nobody Wed Jan 7 09:26:47 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=1767239901; cv=none; d=zohomail.com; s=zohoarc; b=dDIx136FUfUXddCqX4Ii5B5BUhxUe+uvuCn6e/P2EYSpYCQ/YmV1zU+uqzWEB2W+jgwc8yFjF8iVvCgM2kv5j1HvrCiytAHgdTRO3acOnrhHraiNyUxYR6Qw5IXAPBMtzip9kltDeCsDex5Vr4eVJ9l+jSRPSDdBDo1Oumzaum0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239901; 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=ygHQ47XsQ65iTRBvZyvIraYIcSs8DRfSbeQqPcnxVz8=; b=h4cuXcJCWz1oVagBigG5JtW8tP9A2mUvvgwAla00MPD/qV9lBoVTNt3GpQxolQ0oRdxcInWQ3zwjRjzPJz4i4QZWUqMdp9CPEmHZFbIVZlkg1AtkogbOmbQpOMVkhh6DW+WIMpyIGmoXvy7ResI8wnQjMwMhpx2BQhkzbLhxDbY= 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 1767239901037993.688255917421; Wed, 31 Dec 2025 19:58:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9ob-0002Gb-Tr; Wed, 31 Dec 2025 22:57:33 -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 1vb9oa-0002FS-61 for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from fhigh-b3-smtp.messagingengine.com ([202.12.124.154]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oY-0003iJ-8d for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:31 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfhigh.stl.internal (Postfix) with ESMTP id 7DA3C7A0098; Wed, 31 Dec 2025 22:57:29 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Wed, 31 Dec 2025 22:57:29 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:29 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 034ab7b5; Thu, 1 Jan 2026 03:57:26 +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=1767239849; x= 1767326249; bh=ygHQ47XsQ65iTRBvZyvIraYIcSs8DRfSbeQqPcnxVz8=; b=W ueyv8XMY1jTMf0Bi7j8XZ3B2sauu5gO1rmLDvoqG4snuG/XEWAKywY2WPquyniVv Ht71rJjQWOGNsHOfp4bF2K6blNsmqGdx95SAoyxkqFXYrnX39L57Q1aJxTmljn+z D8FITXZejPzCj9YaYQtFLTyFliYOZa81VayX2w58B/9g6y1V90zAuFtS2oSyOHtg LpDN0+qyVRxnuhFeX/W//RGIGvQFWDcKDphCXNTcisGDvMQSwOKa55eqrdrgBKCd 6C96Q2hLOBuehEf7TVG6/A1Baug3C+t8P8j7EVFvfgsIh7AHxXsqucrvR31bAR1R wAETXEuQ3tY99C6UvEavA== 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=1767239849; x=1767326249; bh=y gHQ47XsQ65iTRBvZyvIraYIcSs8DRfSbeQqPcnxVz8=; b=d7e476DuIRTfbjoLl Vmi8t0B/kZPQogk4eFTeLFxtPOxfX+4YOkeMWT2NYfyZw6zRjDCiexvljmV7ru+J Ox/MFb/bUlzrGK9hx9/HEPircZCftMPOsybBRL7+7506ORpj8ZcZrh+q8UVkvh8P f7apoyje8XhYZeDwLfMnqPsi86brUnWT/vXcUzJTYZCz/LKjKlrG92k3rC0HBud2 oyRzhhWvF33kYC38VWrmJW5CpDSjdOyTYn0ZVtlb5rBRhOvx/yNQY/tFRWpN9x/M D8D5qXnIWMzoHGM/waFG9zc+4kgT0fnS+dADFmzOIOICplL3t7w9tJZc9auAuXAL fU//A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejiecutefuodetggdotefrod 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 v2 3/7] ati-vga: Implement PM4_BUFFER_CNTL register Date: Wed, 31 Dec 2025 22:55:51 -0500 Message-ID: <20260101035555.1300511-4-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.154; envelope-from=chad@jablonski.xyz; helo=fhigh-b3-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: 1767239903321158500 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 e291926470..a4bef92efd 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -535,6 +535,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; } @@ -979,6 +984,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 d7127748ff..4d1ccc1434 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -378,7 +378,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:26:47 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=1767239902; cv=none; d=zohomail.com; s=zohoarc; b=fMfHh8yTx9FbMIo4ztR2Ep8zbWDSP0huxRbPF8ix0E8GOGcyU4izOberFzqRHQGm/RdE8Xc4WUPFKDnZ9SnwFhizvGcEqvAW3CZfPJyKxsfKG8v2QtC4PmplYJP+QgTmsZYf309dPPJU/rU2shI+vxCVIFjHgaiFGBXCy9tiEG8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239902; 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=6fyzSOGF3J3sK3rUPNRf+S64qCJyfcyRpDCjhsebDvs=; b=PXRlnxPB7lKtd99hemBHQMdXeH/D5B43IWcVrtodzj7l62diJOYXZmWzQvuvE6rBhDnfI4LsXRExmHCeKwS4OCsuq90xj4AtbguF9k52ssIcHFf02R47m8qkZMVCySVDGH7W+vzjP7rfNW1I4hy66MeLQaNcUmyFgwJdej1gIy4= 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 1767239902412604.9992545476217; Wed, 31 Dec 2025 19:58:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9oc-0002IF-Nc; Wed, 31 Dec 2025 22:57: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 1vb9oa-0002FV-CP for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from fout-b3-smtp.messagingengine.com ([202.12.124.146]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oZ-0003iS-0C for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.stl.internal (Postfix) with ESMTP id 4A16E1D00094; Wed, 31 Dec 2025 22:57:30 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Wed, 31 Dec 2025 22:57:30 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:29 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 2840daa6; Thu, 1 Jan 2026 03:57:26 +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=1767239849; x= 1767326249; bh=6fyzSOGF3J3sK3rUPNRf+S64qCJyfcyRpDCjhsebDvs=; b=Y NkBd40JKw+70LE3XWWKf494p6cvTe715Pkkj8xPuNivXAnzBXNalbWJ3faTQ1Fc1 kLf7zBHNdTrMmmKN0JEV6sg7iErnaBa4RE7O/Ayb8ri78aW9gUP1V0c9ts3w6wuT L5oyr2uNplozBsGpEuExQBnhSDIyAAobfs5RoP1iFc5tBfYcNsQZM7xQlu6dB50u kK7PTvygG5LNvkuGiu7vQbqj1x+p5S3y/rKcWiG0QlboLvlRAGgT9bBQqcqpg6vr hmsfJBmvGCjqE6ku5AjsnO0t8D2bhO0q/C0A4Er27xWD/bTjJA/LRu3jkIzP8pf1 pVjXUOGT9iIIkOUUD1qdA== 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=1767239849; x=1767326249; bh=6 fyzSOGF3J3sK3rUPNRf+S64qCJyfcyRpDCjhsebDvs=; b=O3CRWK5wVrnoWDVDe 6lC5kvaNGYOdd1oxResMHvubqmwNoUt+WNdwcNi8c98dEx0a7DmAbQ6ALjhop3VZ tT9YC/J5hrk++S0Ni6qrYA5PhNPazqrZLJ9kRYzN+OmVwtMJ5Y8AXFzpaM2nFcaT q2q0g+h55CiCAxJJnSF/510YGC+UD2woR5HFa15q4W8un+s18wKP1KxzDnzxYc1G n3Teqi8XqEY+MX5G2a44cbTaeQp92amloOJxHb1A4X6r+oUsxkxBFEkWrJhJxQQI lKea3tG5bIwS5RJOPy+kOw8+N34lWfUTs/O6VNN4go2DPARkQF6cz/hB70iXdquG eDt5A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejiecutefuodetggdotefrod 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 v2 4/7] ati-vga: Implement PM4_MICRO_CNTL register Date: Wed, 31 Dec 2025 22:55:52 -0500 Message-ID: <20260101035555.1300511-5-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.146; envelope-from=chad@jablonski.xyz; helo=fout-b3-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: 1767239903349158500 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 a4bef92efd..5f52739d33 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -540,6 +540,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; } @@ -990,6 +993,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 4d1ccc1434..d7118449f5 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -392,6 +392,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:26:47 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=1767239901; cv=none; d=zohomail.com; s=zohoarc; b=bgguKdb0/T4I5i4oCsnWTgH1jia7D8JhMZ0vo8mWhQEvoye2WKe+CkdZ7syDdCrhBfaaRG0yBIC1TxKI4bQHTxMYbcpOPuWDsbseAGBHgQNVoANG00zq3+fsQIG31ROk52GmNmj1qPcmiGHe2n5JWQfZvSoHm+OQ51WmltqRb5I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239901; 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=hhCxBBfxOrYOITzX/tlTroKcI6UtxO3/vBGN1IhYhP4=; b=Lmeag7vdz8XSwMqs16WCm8+O659fn4afExRST7dR40oQgH9GD2d1bv/HmjfME70WcUorp6atkQhWepW85KOHerV0jJDZ0EabT4+4xKHRsfgZyqySDP9VsXVx3TxhBZvaKjj2xq8SSAq6BePuM9YvswvDYZzO1FnqlFztmdx4cnY= 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 1767239901146768.935998591523; Wed, 31 Dec 2025 19:58:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9oe-0002JQ-Pn; Wed, 31 Dec 2025 22:57: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 1vb9oa-0002FW-Ft for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from fout-b3-smtp.messagingengine.com ([202.12.124.146]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oZ-0003iU-3M for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:32 -0500 Received: from phl-compute-10.internal (phl-compute-10.internal [10.202.2.50]) by mailfout.stl.internal (Postfix) with ESMTP id 50CE11D00095; Wed, 31 Dec 2025 22:57:30 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-10.internal (MEProxy); Wed, 31 Dec 2025 22:57:30 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:29 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id c49f72b4; Thu, 1 Jan 2026 03:57:26 +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=1767239850; x= 1767326250; bh=hhCxBBfxOrYOITzX/tlTroKcI6UtxO3/vBGN1IhYhP4=; b=X WmQ/Z6b1uTBkL2SZEh8shrcVwOtWdvQad/C1DMqXDgY7DHUNalfyVmgwbrzWLuCC pMxvgUpWhN0QG1NKRnsTazBU6nzileGVsC4vtMeKnsofFPynrM4gCbtBiMMUCLtV ZAtcUEH38VqF23ostCMA5W5GGL7fchpbEErOiWHIvKDRlhPrM1F0XbB3z6gm7WHk jRaDcf430z0ElxFF0XLlItJe16iyQWiW4HAwHdJX8SUsuj8bhL/RUbkFXSPTYjHD DtRANcRQa2JaE+jJ1TotzwPN09fyUPyWckS/+thz2825difE01VqIEM5kPv9mH4K QDcr3zQ546kgZMGEUtLrA== 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=1767239850; x=1767326250; bh=h hCxBBfxOrYOITzX/tlTroKcI6UtxO3/vBGN1IhYhP4=; b=njFJrYRMU2GP5fuLP 7Ox84IdbwgIJIj4RgkkL/E/p0d57sEO0DiRy6yiblWgKyrJnvYGRHJF0bOQYK4D6 b8gFnKHA5wuqOTlU4ajMRHRpK3mSCanf6sSoA5wh1+GtxZNSdpIwIoUaiPWOLK7Y yZFxM/1wFt+3TxE8ZIcjA4BzvsoE9fJNwt9oUj5DYReO/eTMXfTXmr7lrZ0znire mqZUzdGz/tXgEnVoeSeVkJHQKsoCURiztQMMCRQU10kgQrc0E2c66HOOr1uXsD4/ 6kfgNVzQEgwbfxEV6i0L5YRGKQGv/r5EeEyUfqgZrDu+AIVxoD8A3pQEvGANJlW6 LjJ6Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejhecutefuodetggdotefrod 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 v2 5/7] ati-vga: Disable GUI engine MMIO writes when CCE enabled Date: Wed, 31 Dec 2025 22:55:53 -0500 Message-ID: <20260101035555.1300511-6-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.146; envelope-from=chad@jablonski.xyz; helo=fout-b3-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: 1767239903339158500 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 5f52739d33..29a89b3f80 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -1011,6 +1011,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:26:47 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=1767239900; cv=none; d=zohomail.com; s=zohoarc; b=loSxZOiaVciz2dn6+4Rd5QNJnn+/5Lld3+1cFCOVnY65NpUy6VOwQt2dispIS+h4Ge5EddffeQsDrywWrvy3YQHN4HOlZPoukXvAkC3Mkd3BYIiQsp7Ye9grGiZL2fNIsJB2yPcJuoupd/4i1qE4FA897N25VxVpFc/g7lQKoVM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239900; 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=EkI0gdrEWlcSXoQ6b50KWdouVYdjK0ERFZcdI/3S9yo=; b=R0LRiNYlmD7CnH+eztc5/tdec100m/Ext7EhfEWjxTtS+luVm0ZEHGWrOjaEDdn9iKvW/6hyT9P/rsC/6SLk+uYCMqyHkhNUt/8V1nyHweWi/4Z0jLw9JXWMIB/hpkhdWlXBeYvNs8000LZL7qPYDI3BfAUrWohILk2UlczLc6Q= 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 1767239900564806.7452988112032; Wed, 31 Dec 2025 19:58:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9oe-0002JP-Pl; Wed, 31 Dec 2025 22:57: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 1vb9oc-0002H5-0T for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:34 -0500 Received: from fhigh-b3-smtp.messagingengine.com ([202.12.124.154]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oZ-0003il-KL for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:33 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfhigh.stl.internal (Postfix) with ESMTP id EBAC77A009D; Wed, 31 Dec 2025 22:57:30 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Wed, 31 Dec 2025 22:57:31 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:30 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id fa10c085; Thu, 1 Jan 2026 03:57:26 +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=1767239850; x= 1767326250; bh=EkI0gdrEWlcSXoQ6b50KWdouVYdjK0ERFZcdI/3S9yo=; b=V 1HTEToHoyGUucUhoKmor3FwLJ1HjurtBL3oqh4rdCTQkwdjQH0bP0fy6J2TmDeKv VxHrEe0cCPUg5mseXxiFoH72UCXNwGP5BdSLDyYEi+coFUKQ2qJK7Ndv0hQhoA8W pd7kC0r5X11QspsSUaZ7QVS7PZX9q+8nnBF0NnBATcFXknY3nfVsO/NOlkFUA4sI 2zKfRdHZJyOtrhEPlxuH2954inEphw66eVuY3T9ZU4JPYrVYcd2+TFVVcfwbc7IB ipxba3zb86JD23QQXy0N/bSY47cmcKbd4XGqU0m1Szt+WX/xm1Mcev/87DZUstbf pXVJbcD7iOTiWFoOkbZ1Q== 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=1767239850; x=1767326250; bh=E kI0gdrEWlcSXoQ6b50KWdouVYdjK0ERFZcdI/3S9yo=; b=EDZE8q3p09N0mVN18 FulOc019Y1znIZrCIfZetrzdubIb8b+hMIShNdnTDJSI8yd+u2yBXBr9+1tCaUZ+ RBwaWUshREp52xRiCmbi+Nz1rYhLskZ+ixBNHJKgPlR5w/lbaecO+0hloCoWTI6Y gJWxdwiLY9lbtqTdl+mrSlkyrpzpTExP8iAZUJiTVrjZBtMTSoeGpsGWKQQd8c78 aUv3dsXXhrOIlZcidWTzdw5l2DRMpU1WwfuBRDBrV98V0nB5tFWdqan3+Mty17M8 VO9a46x7uYTw4dwcNB3IX4u1As42sSjHWIYZCnNXD2WD5FYXm9GWc7QtF1hyJcyn EKWWA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejiecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecufghrlhcuvffnffculdejtddmnecujfgurhephffvvefuff fkofgjfhgggfestdekredtredttdenucfhrhhomhepvehhrgguucflrggslhhonhhskhhi uceotghhrggusehjrggslhhonhhskhhirdighiiiqeenucggtffrrghtthgvrhhnpefgie etjefhleehfeeiteejgfeljeffhfeuffdvudeijefgueeuuedvvdekjefhleenucevlhhu shhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegthhgrugesjhgrsg hlohhnshhkihdrgiihiidpnhgspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhht pdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtth hopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhopegsrghlrghtohhn 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 v2 6/7] ati-vga: Process Type-0/1/2 CCE packets via PIO Date: Wed, 31 Dec 2025 22:55:54 -0500 Message-ID: <20260101035555.1300511-7-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.154; envelope-from=chad@jablonski.xyz; helo=fhigh-b3-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: 1767239903408158500 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 29a89b3f80..9edde2b0bc 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -997,6 +997,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:26:47 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=1767239901; cv=none; d=zohomail.com; s=zohoarc; b=L5+9Z2Xe+WvHrxz8qtCoAFgSPtByRgt7KzvHxUuh3j5IDOVGRpaSwPulcranpjEpWJgGqFcnDULRDJPuZucMclhSyLd7ORnggj4HfmWB4HVXSJ6sPNVYg9Pz0yvIpGlbQ/Yi1EQrcpnvxqBqSJGXm5lggJmWlQAvvGQm7sVleZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767239901; 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=yjXSxmtpN9TGkc9lFU0SWd9L+aID59ZDAA8OnbgXGpE=; b=E0jwjI40ZA/tFToh4iOdDgTHcGAE1GX2zVGppF+rShI2LFRFqBusPTgk8i4+CqF+Lz8n8/qvNHpbgdXrikdBcqimoBIsIhGW42GlLv2n9NN5y2qDgARXd/DnXDu1Z4ikbRSTuAEQi8Y7Zw46wbIQZUHZ8Y7HMo3h9C96g7Kv6iU= 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 1767239900952876.4421751293623; Wed, 31 Dec 2025 19:58:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vb9of-0002Jx-Ew; Wed, 31 Dec 2025 22:57: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 1vb9ob-0002Ga-GM for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:33 -0500 Received: from fhigh-b3-smtp.messagingengine.com ([202.12.124.154]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vb9oZ-0003io-SX for qemu-devel@nongnu.org; Wed, 31 Dec 2025 22:57:33 -0500 Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfhigh.stl.internal (Postfix) with ESMTP id F11A57A00A2; Wed, 31 Dec 2025 22:57:30 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-06.internal (MEProxy); Wed, 31 Dec 2025 22:57:31 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 31 Dec 2025 22:57:30 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id ec59e503; Thu, 1 Jan 2026 03:57:26 +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=1767239850; x= 1767326250; bh=yjXSxmtpN9TGkc9lFU0SWd9L+aID59ZDAA8OnbgXGpE=; b=b /W5lD8NTFTTPcTCpGUMqcz/BnVdUCowIE51L9NtXpisR09LFjLTZHyBkd3tOgZeG w20YMUK4TakeV1Lk4SdFAGQpuJYkze5lPphZewvMJvA9OOCcQeelMNZA0iWAxVY8 iNVOGuJSiJtp0Pvqiyu/mSD1l4vHeaoJ7IWozc7OZH8b49NLXbax50LuRQyMaXhh QoFPZEQsS/gFJbeRfXhS5AUWKWja06u893lW3PmV0fBECqN46K8WsICoXIAlHVZW YLRxoW7EDRL0ak8bWnYkwJ1XTfohe6KP9438ksLHSXMHDIy0vGNuyrKFIME79E32 srYqakMFv55xWPLyDOy1A== 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=1767239850; x=1767326250; bh=y jXSxmtpN9TGkc9lFU0SWd9L+aID59ZDAA8OnbgXGpE=; b=WZB52VEyFolwjkKS8 7tZHVX3+WtmEDVv5nhPteXXq9oh/yu2nc1YmVXTwJt/c7F4XVZew0dzk4DSDpDQU hzlGAUWcM1bv/W0HQRurGLBp2na8Gy3as/sCMf0cjKokhW4wBuTduz6H16ATxzVs F1Zdl9a7J1e7e/LXdawNvPNPysnew8r2+H4sUh55mTx5jDrL8iW0ZoHk9Ir3hGUW Jri7KgpkljI6MV2a/EU1n1iO1Zhx8Ib+NPhugfuowjh7nMA02Q0xclExBSojfk0A QcvgUKnlJZIF+z48taHafvo0nhwWFnyDQY4M4GhSKZyZipeG28HtGnMXRwcMmS9v 5mSHg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdekgeejiecutefuodetggdotefrod 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 v2 7/7] ati-vga: Implement PM4_STAT register and common flags Date: Wed, 31 Dec 2025 22:55:55 -0500 Message-ID: <20260101035555.1300511-8-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260101035555.1300511-1-chad@jablonski.xyz> References: <20260101035555.1300511-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=202.12.124.154; envelope-from=chad@jablonski.xyz; helo=fhigh-b3-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: 1767239903342158500 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 9edde2b0bc..3f31a76b72 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; @@ -543,6 +553,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 d7118449f5..841019ac7b 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -280,6 +280,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