From nobody Sat Sep 26 23:03:44 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1787165711; cv=none; d=zohomail.com; s=zohoarc; b=U9ya6nwL+BiKL8I9c6NyOgDqgtY9FK/YJKYgAIoriy7D5tglN7rIWOV9/P7+nS0iFY86u245HI9Pz0BbCuSORXzhlUbgjexLSUeg07DX6sbPkaabBlGTX8eITQoHynRf08cVZ+42dCBrMdIEUlq7WuLAFs7PxLJc20x5eOfIKbI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787165711; 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=+OidqFmgxqDLOch1X954fO+xBtTG297VTbgXxOojjA4=; b=N5ygDecFHOR8x1zIV+JRWvmqhiLrCEQe9FBfeQgvPR+1jRxf0sY6wEaHuLr3Pcj9NvnWodepaUg8glOrb6re2Wo1KqTZrq6Mn8Zz2hsN4WKODYH3J/bmvSfLGrxv0qGYVXrk9hKv03U6rr450+NnteEKdjVdTBAdzrxcN6NTvpc= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787165711370954.6346365028929; Wed, 19 Aug 2026 11:55:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wwlQt-0005Ua-9A; Wed, 19 Aug 2026 14:54:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wwlQr-0005Ta-Hn for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:37 -0400 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wwlQo-0007NL-W4 for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:37 -0400 Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-49978908b35so9744665e9.0 for ; Wed, 19 Aug 2026 11:54:34 -0700 (PDT) Received: from lanath.. (wildly.archaic.org.uk. [81.2.115.145]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482b145c9d7sm7995048f8f.15.2026.08.19.11.54.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Aug 2026 11:54:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1787165673; x=1787770473; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+OidqFmgxqDLOch1X954fO+xBtTG297VTbgXxOojjA4=; b=kLSVHqwRMq5EX6VaPaEqhsGqD8NyEJMPOm6PxqwpgaJ2A7CAWhFDFkIDgeHbin5ZDN 5WuEfAwCByKlC9DfP2E+VpMkm8knI3jYWG/FRF5hXs/nIQF5rlNvJ7yiSwQTlG3ey0pn Rdnq6Wl9rRmYZiOe9E/aGjU/cYp4Tu9a0Ezoxy0I0KmdY5EVChwpvs4p5n11Dr7sJUaP XI5PQzWbEwcj6/SsjG+KHwWd/pFiTNJzkTyYeoDDu1WwhCaVuv33NtAZDfYdsCcCPp34 DK8IDBt5yOgrOq9+YJSHFNo5phLKgIS7Vo7Vd9vxpuDKevGyk1cTQX1RmWkvSAfs8rfi JfIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787165673; x=1787770473; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=+OidqFmgxqDLOch1X954fO+xBtTG297VTbgXxOojjA4=; b=VZH2TfmXW1uElkM9tplzIyd8o5rAq48uO8vMKrFYbcjAcz4yQuDgpqSn+d26QD24Pc x4NzN5mhju4kxtaQRyAnVOCQdPFkt90rHYWBpWWMK4sn9b3W0xsR10eCp9djkOZtN1fV 67vCPT6cwjbV0PwIxOzh/rTHgxUgNHqxkIyUhSaJAhXoODDwZkaa3Ve5Dv9yQJIdBpVe ycfF1T8U3laLKTj+K4QCQke/ytCY9RW5FIHqaN+5hLqkce1f/JTuNpyUNdgjvyTn+Kmz ljv4r6p/7pB+qawUUbIowGnX0u0JWtSQ3PI70eFu5zIKcrxxFZzjgkHGaJMTDdqE8yuN h3DQ== X-Forwarded-Encrypted: i=1; AHgh+RrzCNAq44tuUzpRq9muFLmDYRchn0e07yasDbvOjlAI+LA+4YL2jLVDwyPaumzDpBUldQOtCH8MTu8v@nongnu.org X-Gm-Message-State: AOJu0YyfpRkmZY3OBLsBDkY75FLVOCJa15E4HU2E7i3qa+3Zp/O6iOmf oLWQlZrd1bxkk8g5ovnIo3MTiM1Qr2L0Bgq4NvPxOQjxr3hAnRTrVdxWeLh3Nt61toA= X-Gm-Gg: AR+sD13Q1l3Ozuoge19dNdxLyHS/CSOWSgU3UaPDKgvtLDn53Ul+H5CJsdDFW269aHe 4TOdUogumjHrRkjRsQNN++Q/QFRqyIsO9TVU6J+2/dKa+u5oy8xB8tPAMYw7JzcNir2e8EGZAfN dlI1TESkgIs924vFp/gTgVkzrG6y9V14/sqEcdxpgmYgfGozJ7tLyuHovhzJYQXFRnB5zHFX7o3 fsPc5KxWahJLpXldzpOutZ9UeMljvxyMNn4SMck1lbIJ/0L3CkP8TZ2isS8epg/AyyP13KTo97s SNxZy8g7CWGUePQ2q/vpOWL6Xc2EgAIcb/uyDPZ6bAueKp0UxPjMaUZ7r5GiaXs90eRiLHgO8cz CZZ9kUroS3wJpTU54wbCx2zTB0ZONKb75JCigg5j+ILy1vq9fm1uuNnA4HQ9WmC+lABvjmqeL+s gQhkZHIBzlY04X3nY7RRwscLkJpTyoqeZqiZ6XilZH1HWSIw/1871wOQkRYIRhrt45qikcyA9c7 DGOdy2aDctGFChk1hQGBLUWxSZeuqY4ue735U8OvmMgC3C2al7YxLNhTvktbXP2KY60Fw== X-Received: by 2002:a05:600c:4e94:b0:499:78b3:7b36 with SMTP id 5b1f17b1804b1-499aa1b549cmr124054865e9.11.1787165673424; Wed, 19 Aug 2026 11:54:33 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Cc: Pierrick Bouvier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jan Kiszka Subject: [PATCH 1/5] tests/qtest/pflash-cfi02-test: Don't use musicpal machine for testing Date: Wed, 19 Aug 2026 19:54:26 +0100 Message-ID: <20260819185430.3467629-2-peter.maydell@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260819185430.3467629-1-peter.maydell@linaro.org> References: <20260819185430.3467629-1-peter.maydell@linaro.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32e; envelope-from=peter.maydell@linaro.org; helo=mail-wm1-x32e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @linaro.org) X-ZM-MESSAGEID: 1787165712963158500 Content-Type: text/plain; charset="utf-8" We currently use the musicpal machine for testing the pflash-cfi02 device. We'd like to remove that machine, so switch the tests to the sh4 r2d board type instead. We use r2d because it happens to have the same "2 bank" config that musicpal did. (Of our other options, xilinx-zynq-a9 has only a 1-bank setup so wouldn't allow the same range of testing, and the canon-a1100 board both doesn't support specifying a flash drive via -drive if=3Dpflash, plus it seems likely it too might be a candidate for deprecate-and-drop.) The r2d flash device is not quite the same config as the musicpal one: it has a different base address and size, and different ID values. So we need to update the test to match. Signed-off-by: Peter Maydell Acked-by: Jan Kiszka Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/meson.build | 6 +++--- tests/qtest/pflash-cfi02-test.c | 38 ++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index f7c7d06620..1f0f04e36c 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -196,7 +196,9 @@ qtests_ppc64 =3D \ (config_all_devices.has_key('CONFIG_USB_XHCI_NEC') ? ['usb-hcd-xhci-test= '] : []) + \ qtests_pci + ['migration-test', 'cpu-plug-test', 'drive_del-test'] =20 -qtests_sh4 =3D (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endia= nness-test'] : []) +qtests_sh4 =3D (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endia= nness-test'] : []) + \ + (config_all_devices.has_key('CONFIG_PFLASH_CFI02') and + config_all_devices.has_key('CONFIG_R2D') ? ['pflash-cfi02-test'] : []) qtests_sh4eb =3D (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['end= ianness-test'] : []) =20 qtests_sparc =3D ['prom-env-test', 'm48t59-test', 'boot-serial-test'] + \ @@ -243,8 +245,6 @@ qtests_arm =3D \ (config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-time= r-test'] : []) + \ (config_all_devices.has_key('CONFIG_STELLARIS') or config_all_devices.has_key('CONFIG_MPS2') ? ['cmsdk-apb-watchdog-test']= : []) + \ - (config_all_devices.has_key('CONFIG_PFLASH_CFI02') and - config_all_devices.has_key('CONFIG_MUSICPAL') ? ['pflash-cfi02-test'] := []) + \ (config_all_devices.has_key('CONFIG_ASPEED_SOC') ? qtests_aspeed : []) += \ (config_all_devices.has_key('CONFIG_NPCM7XX') ? qtests_npcm7xx : []) + \ (config_all_devices.has_key('CONFIG_GENERIC_LOADER') ? ['hexloader-test'= ] : []) + \ diff --git a/tests/qtest/pflash-cfi02-test.c b/tests/qtest/pflash-cfi02-tes= t.c index 8c073efcb4..fe630c9c16 100644 --- a/tests/qtest/pflash-cfi02-test.c +++ b/tests/qtest/pflash-cfi02-test.c @@ -11,17 +11,25 @@ #include "libqtest.h" =20 /* - * To test the pflash_cfi02 device, we run QEMU with the musicpal machine = with + * To test the pflash_cfi02 device, we run QEMU with the sh4 r2d machine w= ith * a pflash drive. This enables us to test some flash configurations, but = not * all. In particular, we're limited to a 16-bit wide flash device. */ =20 -#define MP_FLASH_SIZE_MAX (32 * 1024 * 1024) -#define BASE_ADDR (0x100000000ULL - MP_FLASH_SIZE_MAX) +/* + * These need to match the flash size and address in r2d.c. + * If the flash size changes then the sector_len[] and nb_blocs[] + * values in configuration[] below will need to be updated to match. + */ +#define BASE_ADDR 0x00000000 =20 -#define UNIFORM_FLASH_SIZE (8 * 1024 * 1024) +#define UNIFORM_FLASH_SIZE (16 * 1024 * 1024) #define UNIFORM_FLASH_SECTOR_SIZE (64 * 1024) =20 +/* These must match the id0, id1 args to pflash_cfi02_register() in r2d.c = */ +#define FLASH_ID0 0x0001 +#define FLASH_ID1 0x227E + /* Use a newtype to keep flash addresses separate from byte addresses. */ typedef struct { uint64_t addr; @@ -260,7 +268,7 @@ static void test_geometry(const void *opaque) { const FlashConfig *config =3D opaque; QTestState *qtest; - qtest =3D qtest_initf("-M musicpal" + qtest =3D qtest_initf("-M r2d" " -drive if=3Dpflash,file=3D%s,format=3Draw,copy-o= n-read=3Don" /* Device geometry properties. */ " -global driver=3Dcfi.pflash02," @@ -295,16 +303,16 @@ static void test_geometry(const void *opaque) /* Check the IDs. */ unlock(c); flash_cmd(c, UNLOCK0_ADDR, AUTOSELECT_CMD); - g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, FL= ASH_ID0)); if (c->bank_width >=3D 2) { /* - * XXX: The ID returned by the musicpal flash chip is 16 bits which + * XXX: The ID returned by the r2d flash chip is 16 bits which * wouldn't happen with an 8-bit device. It would probably be best= to * prohibit addresses larger than the device width in pflash_cfi02= .c, * but then we couldn't test smaller device widths at all. */ g_assert_cmphex(flash_query(c, FLASH_ADDR(1)), =3D=3D, - replicate(c, 0x236D)); + replicate(c, FLASH_ID1)); } reset(c); =20 @@ -436,7 +444,7 @@ static void test_geometry(const void *opaque) flash_cmd(c, FLASH_ADDR(0x5555), UNLOCK0_CMD); flash_cmd(c, FLASH_ADDR(0x2AAA), UNLOCK1_CMD); flash_cmd(c, FLASH_ADDR(0x5555), AUTOSELECT_CMD); - g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, FL= ASH_ID0)); reset(c); =20 /* @@ -580,7 +588,7 @@ static void test_cfi_in_autoselect(const void *opaque) { const FlashConfig *config =3D opaque; QTestState *qtest; - qtest =3D qtest_initf("-M musicpal" + qtest =3D qtest_initf("-M r2d" " -drive if=3Dpflash,file=3D%s,format=3Draw,copy-o= n-read=3Don", image_path); FlashConfig explicit_config =3D expand_config_defaults(config); @@ -590,7 +598,7 @@ static void test_cfi_in_autoselect(const void *opaque) /* 1. Enter autoselect. */ unlock(c); flash_cmd(c, UNLOCK0_ADDR, AUTOSELECT_CMD); - g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, FL= ASH_ID0)); =20 /* 2. Enter CFI. */ flash_cmd(c, CFI_ADDR, CFI_CMD); @@ -600,7 +608,7 @@ static void test_cfi_in_autoselect(const void *opaque) =20 /* 3. Exit CFI. */ reset(c); - g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, FL= ASH_ID0)); =20 qtest_quit(qtest); } @@ -613,7 +621,7 @@ static void cleanup(void *opaque) =20 /* * XXX: Tests are limited to bank_width =3D 2 for now because that's what - * hw/arm/musicpal.c has. + * hw/sh4/r2d.c has. */ static const FlashConfig configuration[] =3D { /* One x16 device. */ @@ -624,13 +632,13 @@ static const FlashConfig configuration[] =3D { { .bank_width =3D 2, .nb_blocs =3D { 127, 1, 2, 1 }, - .sector_len =3D { 0x10000, 0x08000, 0x02000, 0x04000 }, + .sector_len =3D { 0x20000, 0x10000, 0x04000, 0x08000 }, }, /* Nonuniform sectors (bottom boot). */ { .bank_width =3D 2, .nb_blocs =3D { 1, 2, 1, 127 }, - .sector_len =3D { 0x04000, 0x02000, 0x08000, 0x10000 }, + .sector_len =3D { 0x08000, 0x04000, 0x10000, 0x20000 }, }, }; =20 --=20 2.43.0 From nobody Sat Sep 26 23:03:44 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1787165731; cv=none; d=zohomail.com; s=zohoarc; b=FIpx1rcbYpcnYQGUI+X3LU8dZF63NIoRSM0uw6jC1Rnpu8ny77ewTflNzXIOqPGWLbwCdZ0Es3JWxexi4Ud0nSj2P0iY1vkOI7kreWFZhkCyLGgLRYFHyp0wUTmEzAOEpM89AJbSRI5K+LFH7NSniMpdfbFLIPrJGm8TaV9jPDQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787165731; 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=xy6npAxreR3WN5RNBLJXXOS1U38mC2qbi1jMTA5TtLk=; b=FAS6RJ/MzERYR7RHhl4k+bXZ8C1DNuRr8KUTsYYmy9qMP6MaJbacva9bBdprIO4ddHf6KPQeNxIEZV0zWJ3BEji4VWVKWdvfWlkId7v2QIRCYk1A3gm+XpMrkWOEf33ReD4vqKjviblwl/EoU5B2sZoPad3i1lx7ufPdlUPpTqg= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787165731307375.04381155136707; Wed, 19 Aug 2026 11:55:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wwlQu-0005Vf-RQ; Wed, 19 Aug 2026 14:54:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wwlQs-0005UK-I3 for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:38 -0400 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wwlQq-0007Na-87 for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:38 -0400 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-49978908b35so9744875e9.0 for ; Wed, 19 Aug 2026 11:54:35 -0700 (PDT) Received: from lanath.. (wildly.archaic.org.uk. [81.2.115.145]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482b145c9d7sm7995048f8f.15.2026.08.19.11.54.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Aug 2026 11:54:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1787165675; x=1787770475; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xy6npAxreR3WN5RNBLJXXOS1U38mC2qbi1jMTA5TtLk=; b=LNDAujTlAO8PBQrNjHqX26kU8pygtu/IwqUa5tPV6kUvwStTwoA1HDSSh2oz0MNsz0 HVhvDZgheScXqMViF6qimg1qnYAU8wUGkvmWO3rONyNILA8COTi2Z5bOJyEaonEv/4ci Ymq3Xj7PmQ1NzwB+glqWbtbOzeHSKUASGR2qw6056MI5MSPc5mn5J4uRzAektG7rsnrS Qcgx3hH4CuoJ6lkKv1KRjl4MjvddlfqUz6Jsh6y9ShIu9QGpxLLfo4s/gmOvZgv0rP4t Go0xYQ0ity+HeijVSCAmEd54Z0QlG5E1jaQsaS0Bi12Svu1rCppqyIpYeAFFWQWV00/j wqOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787165675; x=1787770475; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=xy6npAxreR3WN5RNBLJXXOS1U38mC2qbi1jMTA5TtLk=; b=DU/IzlYVdLrGSoy9H3goOafr49/v+Rct2HThupsWmkvvRGjU1vRkEztZjQq2WH5iz6 KEvkBh46AE9Y8ThLY5P0gdDoxuNozxuLijkBt0wm6rjpHTj4epRVYmnmsvbj/+iX5fAQ h8pqZRX6i0X6SPT/xOOvsudX0GIXhC/4zB2ESMnb/LCkS33jOkua4KIQUymuHrPF7KXX 0JKC2M8ttTiEtGuQToRLPSQn6W3T1RlqmzLj51m37YGMPT/mXBhpftHeap+ylqxVs2wz kvAtF3vVXTFnN2TvzT1cOEOwtTZHjWOBbpZzNfLhB97DOiAp0I+fSN19DYeQ/jhtecpY JYcQ== X-Forwarded-Encrypted: i=1; AHgh+RoGndlfj1/9Lm2YXmicYhfvn0R6O8Id+BRHXhGF9J5jW/tdK7108AzlHfTOq/IGcOUT48IMlB91w2r1@nongnu.org X-Gm-Message-State: AOJu0YxSi2QiVVl3kIbfzBFS4P0sk0VebwPLXAmT2HRYR+K4NIHFsDmw Kjvf9ZCLlRlrzheopAOh9bp0m7JL4nhLT1FYMahRMS39g0u9+R6p56hoK7057XkSmTE= X-Gm-Gg: AR+sD11Jnqo85Olfispe2VC8QFfC0Tqxm/gV4U1ajm7/8PI5QU06cOwpcf3tHWlIyNw VRwoIZ4LqnnpDt5rjXSNSQW0XNlThmjY6sMXo1F1p/HQ0VuAZMVAj9LMA0KMA4QPyDCfydAesVY npAyCPIIig5TDkVlU2HDlkd0x7LbI45Uf81/m7WR88QCmPL5gzQ4VlvCfyrCo/cuSf6oLFYc7WW 7HDEsgT4Kv62961IKjiCc/kmIXzca9oh3rA+zETjN+NFLhlXsK5d6UdoQd1Bh9k3MGhu/Q3KnKe CAI9Xou6xQRk2iGq576sYSCWvf5onb6iEGK37OuwRIw4sgjDR/OjsEoo4uSr9nBDGF7M3SYG/QE 3V03NVXbhmqwOzldp9IhaY/z6z6Kr9yiZvAwjfJV58p5hh74GR/S0yWFZhDPThj8N6D32ulhbCl AQLthB9F/Tx8ZOfP69/iIAwdE9GnycS+485nJ/JGDm1Vd2NVEIdMOvTFJD7PPXBtpd7xAg6S18J OOVayYzjSM9vZIYz9twJhXgtxZYaQ4W4AUBBkSXdFyfXsreUw6gNyYgDYL0oJkTEwjfFg== X-Received: by 2002:a05:600c:3596:b0:495:4749:16a7 with SMTP id 5b1f17b1804b1-499aa1e269emr122257365e9.14.1787165674692; Wed, 19 Aug 2026 11:54:34 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Cc: Pierrick Bouvier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jan Kiszka Subject: [PATCH 2/5] hw/arm: Remove spurious WM8750 dependency from Realview Kconfig Date: Wed, 19 Aug 2026 19:54:27 +0100 Message-ID: <20260819185430.3467629-3-peter.maydell@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260819185430.3467629-1-peter.maydell@linaro.org> References: <20260819185430.3467629-1-peter.maydell@linaro.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::334; envelope-from=peter.maydell@linaro.org; helo=mail-wm1-x334.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @linaro.org) X-ZM-MESSAGEID: 1787165732655158500 Content-Type: text/plain; charset="utf-8" The REALVIEW Kconfig stanza has a "select WM8750"; however the board itself doesn't actually use this i2c audio device: its audio is provided by the pl041 (which connects to an LM4549). Remove the spurious dependency. Signed-off-by: Peter Maydell Acked-by: Jan Kiszka Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson --- hw/arm/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig index 260d2f0751..5e9a0bd8dc 100644 --- a/hw/arm/Kconfig +++ b/hw/arm/Kconfig @@ -155,7 +155,6 @@ config REALVIEW select ARM11MPCORE select ARM_TIMER select VERSATILE_PCI - select WM8750 # audio codec select LSI_SCSI_PCI select PCI select PL011 # UART --=20 2.43.0 From nobody Sat Sep 26 23:03:44 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1787165752; cv=none; d=zohomail.com; s=zohoarc; b=FXoIYIw21STTFLEoHT7Ph04aEQjQYPzmLwsq2C8l+cRfn/2e+syP9VGoZHIGzKOHQpcO6/4XClTw2I8MKFbR6ACoT/5VzOD0jZv0z1UbzvQUCCRKyC7vEI6H8z+Ekjry2ACa2U6VuSGFsunPGTzKVdQJblkVGDJRWv6fZs10PBg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787165752; 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=xhoKPRJhbvAg0bcE6xTTBTksTrFpH3xMuCRK8+IitXc=; b=Nc60qS54FFDWmxvuFynD49+P1KrQVmClTxAoEC8W3/O4Io3hIBaIoCKIGHt2JG0vVQdaAO2I9FRCrZI7Xz5ZKQ20DPNS/EauhL70lGOtqt18qtplMYBsuFi7hZ1hhPhbkLljzZ0hekdcwyrXnwXCa+HxwSoj6pDWffGsimXc3Sk= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787165752765540.0554172153587; Wed, 19 Aug 2026 11:55:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wwlQy-0005XD-V2; Wed, 19 Aug 2026 14:54:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wwlQw-0005WA-V0 for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:42 -0400 Received: from mail-wm1-x335.google.com ([2a00:1450:4864:20::335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wwlQr-0007O1-Tl for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:42 -0400 Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-499b0eefa61so638095e9.2 for ; Wed, 19 Aug 2026 11:54:37 -0700 (PDT) Received: from lanath.. (wildly.archaic.org.uk. [81.2.115.145]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482b145c9d7sm7995048f8f.15.2026.08.19.11.54.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Aug 2026 11:54:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1787165676; x=1787770476; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xhoKPRJhbvAg0bcE6xTTBTksTrFpH3xMuCRK8+IitXc=; b=U7WsvTZseq4GsPeVCSIpLRin0MH6/mrYH74j2oTC/rbs0MWZ3PnGTVdM+5Md3ZqOpU gAJiM/uizOd4UjjG1NCUExB93FaxI7OHz4GVcBe/kEiX0A9alSS2OnD1B8Sm0a2WPR6Y FwKVDJeTC5Xc39umu5etcp/TNCAPeuGisG/6Q+d4opjpZElsUwv8KRA/u7kpLWsuxwQi IUqHVftINU5Jks+S6fGofSq237UUB0H781Q++/sQtWsQAv8nH+8OQ3Q+T/U8H4WcKqPw 8p3kq+hnCs/8lwOU1jYg67stf3A6ON2n8EJ5Tg0xfR3MsNXfTqrukSZqPG+AOhZ2ex8n 5wkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787165676; x=1787770476; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=xhoKPRJhbvAg0bcE6xTTBTksTrFpH3xMuCRK8+IitXc=; b=RJ7uqfxIDEseiuLXsPTdXGS5qibPHOANC0vrfUsaLutjrv5kH7I1DxscpmXteaa4YI B0saMqzCAb6Ity8Sr0wmuCYAzMhVMaB/nb1i13BW3uBW4dDMDNZIVVB+D0bauzw6s/QE dGuFFpPuYXH2Ddc5hFUcjmxfOKrv9cHnFLkmDyPyhpRry2cw7FhvMMimhASFiY6pXtOJ UCWMmJq84iy1mur8OS79ClW4DjnmsfXtdkoW2LXFBhht/AwmAq7a14UAgCBN0WXYKbPK +dXvvUfMeCsT4zG/YTGg/7wn96HUau3RAPp3nm/rA6N1gFfHbI4M7KAb+E3249hsFUZi WJPg== X-Forwarded-Encrypted: i=1; AHgh+RrdLmL9VGhufljLBBi7TFQ1V/P8oVkiMTKinB7PT377ajp5pvskIExwk4Gy1NMyqp724hbHEvqy9vwG@nongnu.org X-Gm-Message-State: AOJu0Yxwtzf6P+OTfmnnIHiezOWRoBEfw0VxXIbn6rewq9ohF+OLvThi IN8rMkbPqkei8u/e4aaqE3Tba0em4DdAXPmkwP885JOOqETK3/R67VqhABBUXlQ3oxRs6VhcEH4 f/ABf X-Gm-Gg: AR+sD11x5/vymj7oTz/oFdFgDajZ19cMUn/eHIFK1oEi0bxrcwVb56gm9M07FgFme7W BEiZAqG87Kn8dBPJZd9U0lhAxBb63ykaVBta0P6EexytXdb4UVtn31/ar2VdCTCb1DU5xTgiIbk 05IS3Q3DZnaAZPCHDp7tEla+MoIIGnGqd2U6jYfnUg6grXBYF+P/0S8UAENtQfTK3Z/6Cu0r3G0 QWCJxpYjrd7KhOubDy1aPFivjX70EuyImUWSZLkO3ua/TUR32aOVHjFWY00P16gy6gM85B+r8mg ARm+2a9oso996wpeZiB1wrayDe8vDi6oPkbikdQN/pRsS9WETMOvGyQAZLem3ygPwHRz4JsxD1j cCSKQZmoz5GMKXp8ZsBb/+syBdQCagbkAYXp0L/ombQmwjO+DyCvmZCOADdvO6VOx3mnYOt6TtJ eji7DwzCQMFC08wJF2No9q2jGQjKN42E8hIMsXlNfywjetwikIyUr8dT6VbmRVOqHMhV7+pthMS OYt/TmDsqHRnr5OjoiFrKYTeUF0IRpf23cyLtdiJcTig7LdDJFZcktS1rFk7Eqrwpb6C9Sw5xDz U2ky X-Received: by 2002:a05:600c:a42:b0:499:484a:98e7 with SMTP id 5b1f17b1804b1-499aa1ef085mr119826065e9.14.1787165676001; Wed, 19 Aug 2026 11:54:36 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Cc: Pierrick Bouvier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jan Kiszka Subject: [PATCH 3/5] hw/arm: Remove the 'musicpal' machine Date: Wed, 19 Aug 2026 19:54:28 +0100 Message-ID: <20260819185430.3467629-4-peter.maydell@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260819185430.3467629-1-peter.maydell@linaro.org> References: <20260819185430.3467629-1-peter.maydell@linaro.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::335; envelope-from=peter.maydell@linaro.org; helo=mail-wm1-x335.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @linaro.org) X-ZM-MESSAGEID: 1787165754893158500 Content-Type: text/plain; charset="utf-8" The 'musicpal' machine emulates the Freecom MusicPal, which was an "internet radio" released in the mid-2000s. The stock system used a 2.6.16 Linux kernel, but as far as I'm aware, support for the hardware was never upstreamed to the mainline kernel. There are a number of reasons for deprecating this board: * The hardware is now solidly obsolete * It was never supported in mainline Linux * The SoC is a Marvell one with no public datasheet * The only QEMU changes to it have been the usual tree wide updates and refactoring work * The only bug report we've ever had about it has been one of the usual "bug found by static analysis" kind But in fact we can just drop it immediately, because in commit 59754f85ed35 ("target/arm: Do memory type alignment check when translation disabled") in 2024 we broke the boot of the standard firmware image for this board. (The image's u-boot does a LDRH to an unaligned address, which is UNPREDICTABLE; we used to let it through, but that commit makes it take a Data Abort, so the image crashes before it boots the kernel.) Since nobody complained, we can deduce that nobody's actually using this machine. Remove the machine proper, and note this in the docs. Devices used only by this board will be removed in subsequent commits. Signed-off-by: Peter Maydell Acked-by: Jan Kiszka Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson --- MAINTAINERS | 10 - configs/devices/arm-softmmu/default.mak | 1 - docs/about/removed-features.rst | 10 + docs/system/arm/musicpal.rst | 19 - docs/system/target-arm.rst | 1 - hw/arm/Kconfig | 12 - hw/arm/meson.build | 1 - hw/arm/musicpal.c | 1388 ----------------------- 8 files changed, 10 insertions(+), 1432 deletions(-) delete mode 100644 docs/system/arm/musicpal.rst delete mode 100644 hw/arm/musicpal.c diff --git a/MAINTAINERS b/MAINTAINERS index b51f5c3e60..ac6b049399 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -993,16 +993,6 @@ S: Odd Fixes F: hw/arm/musca.c F: docs/system/arm/musca.rst =20 -Musicpal -M: Jan Kiszka -M: Peter Maydell -L: qemu-arm@nongnu.org -S: Odd Fixes -F: hw/arm/musicpal.c -F: hw/net/mv88w8618_eth.c -F: include/hw/net/mv88w8618_eth.h -F: docs/system/arm/musicpal.rst - Nuvoton NPCM7xx M: Tyrone Ting M: Hao Wu diff --git a/configs/devices/arm-softmmu/default.mak b/configs/devices/arm-= softmmu/default.mak index 71cf164511..22caa6a63e 100644 --- a/configs/devices/arm-softmmu/default.mak +++ b/configs/devices/arm-softmmu/default.mak @@ -14,7 +14,6 @@ # CONFIG_EXYNOS4=3Dn # CONFIG_INTEGRATOR=3Dn # CONFIG_FSL_IMX31=3Dn -# CONFIG_MUSICPAL=3Dn # CONFIG_MPS3R=3Dn # CONFIG_MUSCA=3Dn # CONFIG_SX1=3Dn diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.= rst index 0735b4ea1d..6a9944a0c7 100644 --- a/docs/about/removed-features.rst +++ b/docs/about/removed-features.rst @@ -1251,6 +1251,16 @@ machine they want to use to avoid confusion. Existi= ng users of the ``spike`` machine must ensure that they're setting the ``spike`` machine in the command line (``-M spike``). =20 +Arm ``musicpal`` machine (removed in 11.2) +'''''''''''''''''''''''''''''''''''''''''' + +The ``musicpal`` machine was an emulation of the Freecom MusicPal, an +"internet radio" device from the mid-2000s. This hardware was never +supported in upstream Linux, was based on a Marvell SoC with no public +documentation, and is now obsolete. We accidentally broke booting this +board in 2024, without anybody noticing; it has therefore been removed +without a deprecation period. + linux-user mode CPUs -------------------- =20 diff --git a/docs/system/arm/musicpal.rst b/docs/system/arm/musicpal.rst deleted file mode 100644 index 9de380edf8..0000000000 --- a/docs/system/arm/musicpal.rst +++ /dev/null @@ -1,19 +0,0 @@ -Freecom MusicPal (``musicpal``) -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D - -The Freecom MusicPal internet radio emulation includes the following -elements: - -- Marvell MV88W8618 Arm core. - -- 32 MB RAM, 256 KB SRAM, 8 MB flash. - -- Up to 2 16550 UARTs - -- MV88W8xx8 Ethernet controller - -- MV88W8618 audio controller, WM8750 CODEC and mixer - -- 128x64 display with brightness control - -- 2 buttons, 2 navigation wheels with button function diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst index e34492402f..260cd7e4d6 100644 --- a/docs/system/target-arm.rst +++ b/docs/system/target-arm.rst @@ -87,7 +87,6 @@ Board-specific documentation arm/cubieboard arm/emcraft-sf2 arm/exynos - arm/musicpal arm/kzm arm/nrf arm/nuvoton diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig index 5e9a0bd8dc..57db2a2fdf 100644 --- a/hw/arm/Kconfig +++ b/hw/arm/Kconfig @@ -103,18 +103,6 @@ config MUSCA config MARVELL_88W8618 bool =20 -config MUSICPAL - bool - default y - depends on TCG && ARM - select OR_IRQ - select BITBANG_I2C - select MARVELL_88W8618 - select PTIMER - select PFLASH_CFI02 - select SERIAL_MM - select WM8750 - config NETDUINO2 bool default y diff --git a/hw/arm/meson.build b/hw/arm/meson.build index 8ee5307a91..78acb04c8b 100644 --- a/hw/arm/meson.build +++ b/hw/arm/meson.build @@ -6,7 +6,6 @@ arm_common_ss.add(when: 'CONFIG_EMCRAFT_SF2', if_true: file= s('msf2-som.c')) arm_common_ss.add(when: 'CONFIG_INTEGRATOR', if_true: files('integratorcp.= c')) arm_common_ss.add(when: 'CONFIG_MICROBIT', if_true: files('microbit.c')) arm_common_ss.add(when: 'CONFIG_MPS3R', if_true: files('mps3r.c')) -arm_common_ss.add(when: 'CONFIG_MUSICPAL', if_true: [files('musicpal.c')]) arm_common_ss.add(when: 'CONFIG_NETDUINOPLUS2', if_true: files('netduinopl= us2.c')) arm_common_ss.add(when: 'CONFIG_OLIMEX_STM32_H405', if_true: files('olimex= -stm32-h405.c')) arm_common_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx.c', 'npc= m7xx_boards.c')) diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c deleted file mode 100644 index 69e83bdd97..0000000000 --- a/hw/arm/musicpal.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* - * Marvell MV88W8618 / Freecom MusicPal emulation. - * - * Copyright (c) 2008 Jan Kiszka - * - * This code is licensed under the GNU GPL v2. - * - * Contributions after 2012-01-13 are licensed under the terms of the - * GNU GPL, version 2 or (at your option) any later version. - */ - -#include "qemu/osdep.h" -#include "qemu/units.h" -#include "qapi/error.h" -#include "hw/core/sysbus.h" -#include "migration/vmstate.h" -#include "hw/arm/boot.h" -#include "hw/arm/machines-qom.h" -#include "net/net.h" -#include "system/system.h" -#include "hw/core/boards.h" -#include "hw/char/serial-mm.h" -#include "qemu/timer.h" -#include "hw/core/ptimer.h" -#include "hw/core/qdev-properties.h" -#include "hw/block/flash.h" -#include "standard-headers/linux/input-event-codes.h" -#include "ui/console.h" -#include "hw/i2c/i2c.h" -#include "hw/i2c/bitbang_i2c.h" -#include "hw/core/irq.h" -#include "hw/core/or-irq.h" -#include "hw/audio/wm8750.h" -#include "system/block-backend.h" -#include "system/runstate.h" -#include "system/dma.h" -#include "ui/pixel_ops.h" -#include "qemu/cutils.h" -#include "qom/object.h" -#include "hw/net/mv88w8618_eth.h" -#include "qemu/error-report.h" -#include "target/arm/cpu-qom.h" - -#define MP_MISC_BASE 0x80002000 -#define MP_MISC_SIZE 0x00001000 - -#define MP_ETH_BASE 0x80008000 - -#define MP_WLAN_BASE 0x8000C000 -#define MP_WLAN_SIZE 0x00000800 - -#define MP_UART1_BASE 0x8000C840 -#define MP_UART2_BASE 0x8000C940 - -#define MP_GPIO_BASE 0x8000D000 -#define MP_GPIO_SIZE 0x00001000 - -#define MP_FLASHCFG_BASE 0x90006000 -#define MP_FLASHCFG_SIZE 0x00001000 - -#define MP_AUDIO_BASE 0x90007000 - -#define MP_PIC_BASE 0x90008000 -#define MP_PIC_SIZE 0x00001000 - -#define MP_PIT_BASE 0x90009000 -#define MP_PIT_SIZE 0x00001000 - -#define MP_LCD_BASE 0x9000c000 -#define MP_LCD_SIZE 0x00001000 - -#define MP_SRAM_BASE 0xC0000000 -#define MP_SRAM_SIZE 0x00020000 - -#define MP_RAM_DEFAULT_SIZE 32*1024*1024 -#define MP_FLASH_SIZE_MAX 32*1024*1024 - -#define MP_TIMER1_IRQ 4 -#define MP_TIMER2_IRQ 5 -#define MP_TIMER3_IRQ 6 -#define MP_TIMER4_IRQ 7 -#define MP_EHCI_IRQ 8 -#define MP_ETH_IRQ 9 -#define MP_UART_SHARED_IRQ 11 -#define MP_GPIO_IRQ 12 -#define MP_RTC_IRQ 28 -#define MP_AUDIO_IRQ 30 - -/* Wolfson 8750 I2C address */ -#define MP_WM_ADDR 0x1A - -/* LCD register offsets */ -#define MP_LCD_IRQCTRL 0x180 -#define MP_LCD_IRQSTAT 0x184 -#define MP_LCD_SPICTRL 0x1ac -#define MP_LCD_INST 0x1bc -#define MP_LCD_DATA 0x1c0 - -/* Mode magics */ -#define MP_LCD_SPI_DATA 0x00100011 -#define MP_LCD_SPI_CMD 0x00104011 -#define MP_LCD_SPI_INVALID 0x00000000 - -/* Commands */ -#define MP_LCD_INST_SETPAGE0 0xB0 -/* ... */ -#define MP_LCD_INST_SETPAGE7 0xB7 - -#define MP_LCD_TEXTCOLOR 0xe0e0ff /* RRGGBB */ - -#define TYPE_MUSICPAL_LCD "musicpal_lcd" -OBJECT_DECLARE_SIMPLE_TYPE(musicpal_lcd_state, MUSICPAL_LCD) - -struct musicpal_lcd_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - MemoryRegion iomem; - uint32_t brightness; - uint32_t mode; - uint32_t irqctrl; - uint32_t page; - uint32_t page_off; - QemuConsole *con; - uint8_t video_ram[128*64/8]; -}; - -static uint8_t scale_lcd_color(musicpal_lcd_state *s, uint8_t col) -{ - switch (s->brightness) { - case 7: - return col; - case 0: - return 0; - default: - return (col * s->brightness) / 7; - } -} - -static inline void set_lcd_pixel32(musicpal_lcd_state *s, - int x, int y, uint32_t col) -{ - int dx, dy; - DisplaySurface *surface =3D qemu_console_surface(s->con); - uint32_t *pixel =3D - &((uint32_t *) surface_data(surface))[(y * 128 * 3 + x) * 3]; - - for (dy =3D 0; dy < 3; dy++, pixel +=3D 127 * 3) { - for (dx =3D 0; dx < 3; dx++, pixel++) { - *pixel =3D col; - } - } -} - -static bool lcd_refresh(void *opaque) -{ - musicpal_lcd_state *s =3D opaque; - int x, y, col; - - col =3D rgb_to_pixel32(scale_lcd_color(s, (MP_LCD_TEXTCOLOR >> 16) & 0= xff), - scale_lcd_color(s, (MP_LCD_TEXTCOLOR >> 8) & 0xff= ), - scale_lcd_color(s, MP_LCD_TEXTCOLOR & 0xff)); - for (x =3D 0; x < 128; x++) { - for (y =3D 0; y < 64; y++) { - if (s->video_ram[x + (y / 8) * 128] & (1 << (y % 8))) { - set_lcd_pixel32(s, x, y, col); - } else { - set_lcd_pixel32(s, x, y, 0); - } - } - } - - qemu_console_update(s->con, 0, 0, 128*3, 64*3); - return true; -} - -static void lcd_invalidate(void *opaque) -{ -} - -static void musicpal_lcd_gpio_brightness_in(void *opaque, int irq, int lev= el) -{ - musicpal_lcd_state *s =3D opaque; - s->brightness &=3D ~(1 << irq); - s->brightness |=3D level << irq; -} - -static uint64_t musicpal_lcd_read(void *opaque, hwaddr offset, - unsigned size) -{ - musicpal_lcd_state *s =3D opaque; - - switch (offset) { - case MP_LCD_IRQCTRL: - return s->irqctrl; - - default: - return 0; - } -} - -static void musicpal_lcd_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - musicpal_lcd_state *s =3D opaque; - - switch (offset) { - case MP_LCD_IRQCTRL: - s->irqctrl =3D value; - break; - - case MP_LCD_SPICTRL: - if (value =3D=3D MP_LCD_SPI_DATA || value =3D=3D MP_LCD_SPI_CMD) { - s->mode =3D value; - } else { - s->mode =3D MP_LCD_SPI_INVALID; - } - break; - - case MP_LCD_INST: - if (value >=3D MP_LCD_INST_SETPAGE0 && value <=3D MP_LCD_INST_SETP= AGE7) { - s->page =3D value - MP_LCD_INST_SETPAGE0; - s->page_off =3D 0; - } - break; - - case MP_LCD_DATA: - if (s->mode =3D=3D MP_LCD_SPI_CMD) { - if (value >=3D MP_LCD_INST_SETPAGE0 && - value <=3D MP_LCD_INST_SETPAGE7) { - s->page =3D value - MP_LCD_INST_SETPAGE0; - s->page_off =3D 0; - } - } else if (s->mode =3D=3D MP_LCD_SPI_DATA) { - s->video_ram[s->page*128 + s->page_off] =3D value; - s->page_off =3D (s->page_off + 1) & 127; - } - break; - } -} - -static const MemoryRegionOps musicpal_lcd_ops =3D { - .read =3D musicpal_lcd_read, - .write =3D musicpal_lcd_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static const GraphicHwOps musicpal_gfx_ops =3D { - .invalidate =3D lcd_invalidate, - .gfx_update =3D lcd_refresh, -}; - -static void musicpal_lcd_realize(DeviceState *dev, Error **errp) -{ - musicpal_lcd_state *s =3D MUSICPAL_LCD(dev); - s->con =3D qemu_graphic_console_create(dev, 0, &musicpal_gfx_ops, s); - qemu_console_resize(s->con, 128 * 3, 64 * 3); -} - -static void musicpal_lcd_init(Object *obj) -{ - SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); - DeviceState *dev =3D DEVICE(sbd); - musicpal_lcd_state *s =3D MUSICPAL_LCD(dev); - - s->brightness =3D 7; - - memory_region_init_io(&s->iomem, obj, &musicpal_lcd_ops, s, - "musicpal-lcd", MP_LCD_SIZE); - sysbus_init_mmio(sbd, &s->iomem); - - qdev_init_gpio_in(dev, musicpal_lcd_gpio_brightness_in, 3); -} - -static const VMStateDescription musicpal_lcd_vmsd =3D { - .name =3D "musicpal_lcd", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(brightness, musicpal_lcd_state), - VMSTATE_UINT32(mode, musicpal_lcd_state), - VMSTATE_UINT32(irqctrl, musicpal_lcd_state), - VMSTATE_UINT32(page, musicpal_lcd_state), - VMSTATE_UINT32(page_off, musicpal_lcd_state), - VMSTATE_BUFFER(video_ram, musicpal_lcd_state), - VMSTATE_END_OF_LIST() - } -}; - -static void musicpal_lcd_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - dc->vmsd =3D &musicpal_lcd_vmsd; - dc->realize =3D musicpal_lcd_realize; -} - -static const TypeInfo musicpal_lcd_info =3D { - .name =3D TYPE_MUSICPAL_LCD, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(musicpal_lcd_state), - .instance_init =3D musicpal_lcd_init, - .class_init =3D musicpal_lcd_class_init, -}; - -/* PIC register offsets */ -#define MP_PIC_STATUS 0x00 -#define MP_PIC_ENABLE_SET 0x08 -#define MP_PIC_ENABLE_CLR 0x0C - -#define TYPE_MV88W8618_PIC "mv88w8618_pic" -OBJECT_DECLARE_SIMPLE_TYPE(mv88w8618_pic_state, MV88W8618_PIC) - -struct mv88w8618_pic_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - MemoryRegion iomem; - uint32_t level; - uint32_t enabled; - qemu_irq parent_irq; -}; - -static void mv88w8618_pic_update(mv88w8618_pic_state *s) -{ - qemu_set_irq(s->parent_irq, (s->level & s->enabled)); -} - -static void mv88w8618_pic_set_irq(void *opaque, int irq, int level) -{ - mv88w8618_pic_state *s =3D opaque; - - if (level) { - s->level |=3D 1 << irq; - } else { - s->level &=3D ~(1 << irq); - } - mv88w8618_pic_update(s); -} - -static uint64_t mv88w8618_pic_read(void *opaque, hwaddr offset, - unsigned size) -{ - mv88w8618_pic_state *s =3D opaque; - - switch (offset) { - case MP_PIC_STATUS: - return s->level & s->enabled; - - default: - return 0; - } -} - -static void mv88w8618_pic_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - mv88w8618_pic_state *s =3D opaque; - - switch (offset) { - case MP_PIC_ENABLE_SET: - s->enabled |=3D value; - break; - - case MP_PIC_ENABLE_CLR: - s->enabled &=3D ~value; - s->level &=3D ~value; - break; - } - mv88w8618_pic_update(s); -} - -static void mv88w8618_pic_reset(DeviceState *d) -{ - mv88w8618_pic_state *s =3D MV88W8618_PIC(d); - - s->level =3D 0; - s->enabled =3D 0; -} - -static const MemoryRegionOps mv88w8618_pic_ops =3D { - .read =3D mv88w8618_pic_read, - .write =3D mv88w8618_pic_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void mv88w8618_pic_init(Object *obj) -{ - SysBusDevice *dev =3D SYS_BUS_DEVICE(obj); - mv88w8618_pic_state *s =3D MV88W8618_PIC(dev); - - qdev_init_gpio_in(DEVICE(dev), mv88w8618_pic_set_irq, 32); - sysbus_init_irq(dev, &s->parent_irq); - memory_region_init_io(&s->iomem, obj, &mv88w8618_pic_ops, s, - "musicpal-pic", MP_PIC_SIZE); - sysbus_init_mmio(dev, &s->iomem); -} - -static const VMStateDescription mv88w8618_pic_vmsd =3D { - .name =3D "mv88w8618_pic", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(level, mv88w8618_pic_state), - VMSTATE_UINT32(enabled, mv88w8618_pic_state), - VMSTATE_END_OF_LIST() - } -}; - -static void mv88w8618_pic_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - device_class_set_legacy_reset(dc, mv88w8618_pic_reset); - dc->vmsd =3D &mv88w8618_pic_vmsd; -} - -static const TypeInfo mv88w8618_pic_info =3D { - .name =3D TYPE_MV88W8618_PIC, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(mv88w8618_pic_state), - .instance_init =3D mv88w8618_pic_init, - .class_init =3D mv88w8618_pic_class_init, -}; - -/* PIT register offsets */ -#define MP_PIT_TIMER1_LENGTH 0x00 -/* ... */ -#define MP_PIT_TIMER4_LENGTH 0x0C -#define MP_PIT_CONTROL 0x10 -#define MP_PIT_TIMER1_VALUE 0x14 -/* ... */ -#define MP_PIT_TIMER4_VALUE 0x20 -#define MP_BOARD_RESET 0x34 - -/* Magic board reset value (probably some watchdog behind it) */ -#define MP_BOARD_RESET_MAGIC 0x10000 - -typedef struct mv88w8618_timer_state { - ptimer_state *ptimer; - uint32_t limit; - int freq; - qemu_irq irq; -} mv88w8618_timer_state; - -#define TYPE_MV88W8618_PIT "mv88w8618_pit" -OBJECT_DECLARE_SIMPLE_TYPE(mv88w8618_pit_state, MV88W8618_PIT) - -struct mv88w8618_pit_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - MemoryRegion iomem; - mv88w8618_timer_state timer[4]; -}; - -static void mv88w8618_timer_tick(void *opaque) -{ - mv88w8618_timer_state *s =3D opaque; - - qemu_irq_raise(s->irq); -} - -static void mv88w8618_timer_init(SysBusDevice *dev, mv88w8618_timer_state = *s, - uint32_t freq) -{ - sysbus_init_irq(dev, &s->irq); - s->freq =3D freq; - - s->ptimer =3D ptimer_init(mv88w8618_timer_tick, s, PTIMER_POLICY_LEGAC= Y); -} - -static uint64_t mv88w8618_pit_read(void *opaque, hwaddr offset, - unsigned size) -{ - mv88w8618_pit_state *s =3D opaque; - mv88w8618_timer_state *t; - - switch (offset) { - case MP_PIT_TIMER1_VALUE ... MP_PIT_TIMER4_VALUE: - t =3D &s->timer[(offset-MP_PIT_TIMER1_VALUE) >> 2]; - return ptimer_get_count(t->ptimer); - - default: - return 0; - } -} - -static void mv88w8618_pit_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - mv88w8618_pit_state *s =3D opaque; - mv88w8618_timer_state *t; - int i; - - switch (offset) { - case MP_PIT_TIMER1_LENGTH ... MP_PIT_TIMER4_LENGTH: - t =3D &s->timer[offset >> 2]; - t->limit =3D value; - ptimer_transaction_begin(t->ptimer); - if (t->limit > 0) { - ptimer_set_limit(t->ptimer, t->limit, 1); - } else { - ptimer_stop(t->ptimer); - } - ptimer_transaction_commit(t->ptimer); - break; - - case MP_PIT_CONTROL: - for (i =3D 0; i < 4; i++) { - t =3D &s->timer[i]; - ptimer_transaction_begin(t->ptimer); - if (value & 0xf && t->limit > 0) { - ptimer_set_limit(t->ptimer, t->limit, 0); - ptimer_set_freq(t->ptimer, t->freq); - ptimer_run(t->ptimer, 0); - } else { - ptimer_stop(t->ptimer); - } - ptimer_transaction_commit(t->ptimer); - value >>=3D 4; - } - break; - - case MP_BOARD_RESET: - if (value =3D=3D MP_BOARD_RESET_MAGIC) { - qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); - } - break; - } -} - -static void mv88w8618_pit_reset(DeviceState *d) -{ - mv88w8618_pit_state *s =3D MV88W8618_PIT(d); - int i; - - for (i =3D 0; i < 4; i++) { - mv88w8618_timer_state *t =3D &s->timer[i]; - ptimer_transaction_begin(t->ptimer); - ptimer_stop(t->ptimer); - ptimer_transaction_commit(t->ptimer); - t->limit =3D 0; - } -} - -static const MemoryRegionOps mv88w8618_pit_ops =3D { - .read =3D mv88w8618_pit_read, - .write =3D mv88w8618_pit_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void mv88w8618_pit_init(Object *obj) -{ - SysBusDevice *dev =3D SYS_BUS_DEVICE(obj); - mv88w8618_pit_state *s =3D MV88W8618_PIT(dev); - int i; - - /* Letting them all run at 1 MHz is likely just a pragmatic - * simplification. */ - for (i =3D 0; i < 4; i++) { - mv88w8618_timer_init(dev, &s->timer[i], 1000000); - } - - memory_region_init_io(&s->iomem, obj, &mv88w8618_pit_ops, s, - "musicpal-pit", MP_PIT_SIZE); - sysbus_init_mmio(dev, &s->iomem); -} - -static void mv88w8618_pit_finalize(Object *obj) -{ - SysBusDevice *dev =3D SYS_BUS_DEVICE(obj); - mv88w8618_pit_state *s =3D MV88W8618_PIT(dev); - int i; - - for (i =3D 0; i < 4; i++) { - ptimer_free(s->timer[i].ptimer); - } -} - -static const VMStateDescription mv88w8618_timer_vmsd =3D { - .name =3D "timer", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_PTIMER(ptimer, mv88w8618_timer_state), - VMSTATE_UINT32(limit, mv88w8618_timer_state), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription mv88w8618_pit_vmsd =3D { - .name =3D "mv88w8618_pit", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_STRUCT_ARRAY(timer, mv88w8618_pit_state, 4, 1, - mv88w8618_timer_vmsd, mv88w8618_timer_state), - VMSTATE_END_OF_LIST() - } -}; - -static void mv88w8618_pit_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - device_class_set_legacy_reset(dc, mv88w8618_pit_reset); - dc->vmsd =3D &mv88w8618_pit_vmsd; -} - -static const TypeInfo mv88w8618_pit_info =3D { - .name =3D TYPE_MV88W8618_PIT, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(mv88w8618_pit_state), - .instance_init =3D mv88w8618_pit_init, - .instance_finalize =3D mv88w8618_pit_finalize, - .class_init =3D mv88w8618_pit_class_init, -}; - -/* Flash config register offsets */ -#define MP_FLASHCFG_CFGR0 0x04 - -#define TYPE_MV88W8618_FLASHCFG "mv88w8618_flashcfg" -OBJECT_DECLARE_SIMPLE_TYPE(mv88w8618_flashcfg_state, MV88W8618_FLASHCFG) - -struct mv88w8618_flashcfg_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - MemoryRegion iomem; - uint32_t cfgr0; -}; - -static uint64_t mv88w8618_flashcfg_read(void *opaque, - hwaddr offset, - unsigned size) -{ - mv88w8618_flashcfg_state *s =3D opaque; - - switch (offset) { - case MP_FLASHCFG_CFGR0: - return s->cfgr0; - - default: - return 0; - } -} - -static void mv88w8618_flashcfg_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - mv88w8618_flashcfg_state *s =3D opaque; - - switch (offset) { - case MP_FLASHCFG_CFGR0: - s->cfgr0 =3D value; - break; - } -} - -static const MemoryRegionOps mv88w8618_flashcfg_ops =3D { - .read =3D mv88w8618_flashcfg_read, - .write =3D mv88w8618_flashcfg_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void mv88w8618_flashcfg_init(Object *obj) -{ - SysBusDevice *dev =3D SYS_BUS_DEVICE(obj); - mv88w8618_flashcfg_state *s =3D MV88W8618_FLASHCFG(dev); - - s->cfgr0 =3D 0xfffe4285; /* Default as set by U-Boot for 8 MB flash */ - memory_region_init_io(&s->iomem, obj, &mv88w8618_flashcfg_ops, s, - "musicpal-flashcfg", MP_FLASHCFG_SIZE); - sysbus_init_mmio(dev, &s->iomem); -} - -static const VMStateDescription mv88w8618_flashcfg_vmsd =3D { - .name =3D "mv88w8618_flashcfg", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(cfgr0, mv88w8618_flashcfg_state), - VMSTATE_END_OF_LIST() - } -}; - -static void mv88w8618_flashcfg_class_init(ObjectClass *klass, const void *= data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - dc->vmsd =3D &mv88w8618_flashcfg_vmsd; -} - -static const TypeInfo mv88w8618_flashcfg_info =3D { - .name =3D TYPE_MV88W8618_FLASHCFG, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(mv88w8618_flashcfg_state), - .instance_init =3D mv88w8618_flashcfg_init, - .class_init =3D mv88w8618_flashcfg_class_init, -}; - -/* Misc register offsets */ -#define MP_MISC_BOARD_REVISION 0x18 - -#define MP_BOARD_REVISION 0x31 - -struct MusicPalMiscState { - SysBusDevice parent_obj; - MemoryRegion iomem; -}; - -#define TYPE_MUSICPAL_MISC "musicpal-misc" -OBJECT_DECLARE_SIMPLE_TYPE(MusicPalMiscState, MUSICPAL_MISC) - -static uint64_t musicpal_misc_read(void *opaque, hwaddr offset, - unsigned size) -{ - switch (offset) { - case MP_MISC_BOARD_REVISION: - return MP_BOARD_REVISION; - - default: - return 0; - } -} - -static void musicpal_misc_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ -} - -static const MemoryRegionOps musicpal_misc_ops =3D { - .read =3D musicpal_misc_read, - .write =3D musicpal_misc_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void musicpal_misc_init(Object *obj) -{ - SysBusDevice *sd =3D SYS_BUS_DEVICE(obj); - MusicPalMiscState *s =3D MUSICPAL_MISC(obj); - - memory_region_init_io(&s->iomem, OBJECT(s), &musicpal_misc_ops, NULL, - "musicpal-misc", MP_MISC_SIZE); - sysbus_init_mmio(sd, &s->iomem); -} - -static const TypeInfo musicpal_misc_info =3D { - .name =3D TYPE_MUSICPAL_MISC, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_init =3D musicpal_misc_init, - .instance_size =3D sizeof(MusicPalMiscState), -}; - -/* WLAN register offsets */ -#define MP_WLAN_MAGIC1 0x11c -#define MP_WLAN_MAGIC2 0x124 - -static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, - unsigned size) -{ - switch (offset) { - /* Workaround to allow loading the binary-only wlandrv.ko crap - * from the original Freecom firmware. */ - case MP_WLAN_MAGIC1: - return ~3; - case MP_WLAN_MAGIC2: - return -1; - - default: - return 0; - } -} - -static void mv88w8618_wlan_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ -} - -static const MemoryRegionOps mv88w8618_wlan_ops =3D { - .read =3D mv88w8618_wlan_read, - .write =3Dmv88w8618_wlan_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void mv88w8618_wlan_realize(DeviceState *dev, Error **errp) -{ - MemoryRegion *iomem =3D g_new(MemoryRegion, 1); - - memory_region_init_io(iomem, OBJECT(dev), &mv88w8618_wlan_ops, NULL, - "musicpal-wlan", MP_WLAN_SIZE); - sysbus_init_mmio(SYS_BUS_DEVICE(dev), iomem); -} - -/* GPIO register offsets */ -#define MP_GPIO_OE_LO 0x008 -#define MP_GPIO_OUT_LO 0x00c -#define MP_GPIO_IN_LO 0x010 -#define MP_GPIO_IER_LO 0x014 -#define MP_GPIO_IMR_LO 0x018 -#define MP_GPIO_ISR_LO 0x020 -#define MP_GPIO_OE_HI 0x508 -#define MP_GPIO_OUT_HI 0x50c -#define MP_GPIO_IN_HI 0x510 -#define MP_GPIO_IER_HI 0x514 -#define MP_GPIO_IMR_HI 0x518 -#define MP_GPIO_ISR_HI 0x520 - -/* GPIO bits & masks */ -#define MP_GPIO_LCD_BRIGHTNESS 0x00070000 -#define MP_GPIO_I2C_DATA_BIT 29 -#define MP_GPIO_I2C_CLOCK_BIT 30 - -/* LCD brightness bits in GPIO_OE_HI */ -#define MP_OE_LCD_BRIGHTNESS 0x0007 - -#define TYPE_MUSICPAL_GPIO "musicpal_gpio" -OBJECT_DECLARE_SIMPLE_TYPE(musicpal_gpio_state, MUSICPAL_GPIO) - -struct musicpal_gpio_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - MemoryRegion iomem; - uint32_t lcd_brightness; - uint32_t out_state; - uint32_t in_state; - uint32_t ier; - uint32_t imr; - uint32_t isr; - qemu_irq irq; - qemu_irq out[5]; /* 3 brightness out + 2 lcd (data and clock ) */ -}; - -static void musicpal_gpio_brightness_update(musicpal_gpio_state *s) { - int i; - uint32_t brightness; - - /* compute brightness ratio */ - switch (s->lcd_brightness) { - case 0x00000007: - brightness =3D 0; - break; - - case 0x00020000: - brightness =3D 1; - break; - - case 0x00020001: - brightness =3D 2; - break; - - case 0x00040000: - brightness =3D 3; - break; - - case 0x00010006: - brightness =3D 4; - break; - - case 0x00020005: - brightness =3D 5; - break; - - case 0x00040003: - brightness =3D 6; - break; - - case 0x00030004: - default: - brightness =3D 7; - } - - /* set lcd brightness GPIOs */ - for (i =3D 0; i <=3D 2; i++) { - qemu_set_irq(s->out[i], (brightness >> i) & 1); - } -} - -static void musicpal_gpio_pin_event(void *opaque, int pin, int level) -{ - musicpal_gpio_state *s =3D opaque; - uint32_t mask =3D 1 << pin; - uint32_t delta =3D level << pin; - uint32_t old =3D s->in_state & mask; - - s->in_state &=3D ~mask; - s->in_state |=3D delta; - - if ((old ^ delta) && - ((level && (s->imr & mask)) || (!level && (s->ier & mask)))) { - s->isr =3D mask; - qemu_irq_raise(s->irq); - } -} - -static uint64_t musicpal_gpio_read(void *opaque, hwaddr offset, - unsigned size) -{ - musicpal_gpio_state *s =3D opaque; - - switch (offset) { - case MP_GPIO_OE_HI: /* used for LCD brightness control */ - return s->lcd_brightness & MP_OE_LCD_BRIGHTNESS; - - case MP_GPIO_OUT_LO: - return s->out_state & 0xFFFF; - case MP_GPIO_OUT_HI: - return s->out_state >> 16; - - case MP_GPIO_IN_LO: - return s->in_state & 0xFFFF; - case MP_GPIO_IN_HI: - return s->in_state >> 16; - - case MP_GPIO_IER_LO: - return s->ier & 0xFFFF; - case MP_GPIO_IER_HI: - return s->ier >> 16; - - case MP_GPIO_IMR_LO: - return s->imr & 0xFFFF; - case MP_GPIO_IMR_HI: - return s->imr >> 16; - - case MP_GPIO_ISR_LO: - return s->isr & 0xFFFF; - case MP_GPIO_ISR_HI: - return s->isr >> 16; - - default: - return 0; - } -} - -static void musicpal_gpio_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - musicpal_gpio_state *s =3D opaque; - switch (offset) { - case MP_GPIO_OE_HI: /* used for LCD brightness control */ - s->lcd_brightness =3D (s->lcd_brightness & MP_GPIO_LCD_BRIGHTNESS)= | - (value & MP_OE_LCD_BRIGHTNESS); - musicpal_gpio_brightness_update(s); - break; - - case MP_GPIO_OUT_LO: - s->out_state =3D (s->out_state & 0xFFFF0000) | (value & 0xFFFF); - break; - case MP_GPIO_OUT_HI: - s->out_state =3D (s->out_state & 0xFFFF) | (value << 16); - s->lcd_brightness =3D (s->lcd_brightness & 0xFFFF) | - (s->out_state & MP_GPIO_LCD_BRIGHTNESS); - musicpal_gpio_brightness_update(s); - qemu_set_irq(s->out[3], (s->out_state >> MP_GPIO_I2C_DATA_BIT) & 1= ); - qemu_set_irq(s->out[4], (s->out_state >> MP_GPIO_I2C_CLOCK_BIT) & = 1); - break; - - case MP_GPIO_IER_LO: - s->ier =3D (s->ier & 0xFFFF0000) | (value & 0xFFFF); - break; - case MP_GPIO_IER_HI: - s->ier =3D (s->ier & 0xFFFF) | (value << 16); - break; - - case MP_GPIO_IMR_LO: - s->imr =3D (s->imr & 0xFFFF0000) | (value & 0xFFFF); - break; - case MP_GPIO_IMR_HI: - s->imr =3D (s->imr & 0xFFFF) | (value << 16); - break; - } -} - -static const MemoryRegionOps musicpal_gpio_ops =3D { - .read =3D musicpal_gpio_read, - .write =3D musicpal_gpio_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void musicpal_gpio_reset(DeviceState *d) -{ - musicpal_gpio_state *s =3D MUSICPAL_GPIO(d); - - s->lcd_brightness =3D 0; - s->out_state =3D 0; - s->in_state =3D 0xffffffff; - s->ier =3D 0; - s->imr =3D 0; - s->isr =3D 0; -} - -static void musicpal_gpio_init(Object *obj) -{ - SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); - DeviceState *dev =3D DEVICE(sbd); - musicpal_gpio_state *s =3D MUSICPAL_GPIO(dev); - - sysbus_init_irq(sbd, &s->irq); - - memory_region_init_io(&s->iomem, obj, &musicpal_gpio_ops, s, - "musicpal-gpio", MP_GPIO_SIZE); - sysbus_init_mmio(sbd, &s->iomem); - - qdev_init_gpio_out(dev, s->out, ARRAY_SIZE(s->out)); - - qdev_init_gpio_in(dev, musicpal_gpio_pin_event, 32); -} - -static const VMStateDescription musicpal_gpio_vmsd =3D { - .name =3D "musicpal_gpio", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(lcd_brightness, musicpal_gpio_state), - VMSTATE_UINT32(out_state, musicpal_gpio_state), - VMSTATE_UINT32(in_state, musicpal_gpio_state), - VMSTATE_UINT32(ier, musicpal_gpio_state), - VMSTATE_UINT32(imr, musicpal_gpio_state), - VMSTATE_UINT32(isr, musicpal_gpio_state), - VMSTATE_END_OF_LIST() - } -}; - -static void musicpal_gpio_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - device_class_set_legacy_reset(dc, musicpal_gpio_reset); - dc->vmsd =3D &musicpal_gpio_vmsd; -} - -static const TypeInfo musicpal_gpio_info =3D { - .name =3D TYPE_MUSICPAL_GPIO, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(musicpal_gpio_state), - .instance_init =3D musicpal_gpio_init, - .class_init =3D musicpal_gpio_class_init, -}; - -/* Keyboard codes & masks */ -#define MP_KEY_WHEEL_VOL (1 << 0) -#define MP_KEY_WHEEL_VOL_INV (1 << 1) -#define MP_KEY_WHEEL_NAV (1 << 2) -#define MP_KEY_WHEEL_NAV_INV (1 << 3) -#define MP_KEY_BTN_FAVORITS (1 << 4) -#define MP_KEY_BTN_MENU (1 << 5) -#define MP_KEY_BTN_VOLUME (1 << 6) -#define MP_KEY_BTN_NAVIGATION (1 << 7) - -#define TYPE_MUSICPAL_KEY "musicpal_key" -OBJECT_DECLARE_SIMPLE_TYPE(musicpal_key_state, MUSICPAL_KEY) - -struct musicpal_key_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - QemuInputHandlerState *hs; - uint32_t pressed_keys; - qemu_irq out[8]; -}; - -static void musicpal_key_event(DeviceState *dev, QemuConsole *src, - QemuInputEvent *evt) -{ - musicpal_key_state *s =3D MUSICPAL_KEY(dev); - uint32_t event =3D 0; - int i; - - switch (evt->key.key) { - case KEY_UP: - event =3D MP_KEY_WHEEL_NAV | MP_KEY_WHEEL_NAV_INV; - break; - - case KEY_DOWN: - event =3D MP_KEY_WHEEL_NAV; - break; - - case KEY_LEFT: - event =3D MP_KEY_WHEEL_VOL | MP_KEY_WHEEL_VOL_INV; - break; - - case KEY_RIGHT: - event =3D MP_KEY_WHEEL_VOL; - break; - - case KEY_F: - event =3D MP_KEY_BTN_FAVORITS; - break; - - case KEY_TAB: - event =3D MP_KEY_BTN_VOLUME; - break; - - case KEY_ENTER: - event =3D MP_KEY_BTN_NAVIGATION; - break; - - case KEY_M: - event =3D MP_KEY_BTN_MENU; - break; - } - - /* - * We allow repeated wheel-events when the arrow keys are held down, - * but do not repeat already-pressed buttons for the other key inputs. - */ - if (!(event & (MP_KEY_WHEEL_NAV | MP_KEY_WHEEL_VOL))) { - if (evt->key.down && (s->pressed_keys & event)) { - event =3D 0; - } - } - - if (event) { - /* Raise GPIO pin first if repeating a key */ - if (evt->key.down && (s->pressed_keys & event)) { - for (i =3D 0; i <=3D 7; i++) { - if (event & (1 << i)) { - qemu_set_irq(s->out[i], 1); - } - } - } - for (i =3D 0; i <=3D 7; i++) { - if (event & (1 << i)) { - qemu_set_irq(s->out[i], !evt->key.down); - } - } - if (evt->key.down) { - s->pressed_keys |=3D event; - } else { - s->pressed_keys &=3D ~event; - } - } -} - -static void musicpal_key_init(Object *obj) -{ - SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); - DeviceState *dev =3D DEVICE(sbd); - musicpal_key_state *s =3D MUSICPAL_KEY(dev); - - s->pressed_keys =3D 0; - - qdev_init_gpio_out(dev, s->out, ARRAY_SIZE(s->out)); -} - -static const QemuInputHandler musicpal_key_handler =3D { - .name =3D "musicpal_key", - .mask =3D INPUT_EVENT_MASK_KEY, - .event =3D musicpal_key_event, -}; - -static void musicpal_key_realize(DeviceState *dev, Error **errp) -{ - musicpal_key_state *s =3D MUSICPAL_KEY(dev); - - s->hs =3D qemu_input_handler_register(dev, &musicpal_key_handler); -} - -static void musicpal_key_unrealize(DeviceState *dev) -{ - musicpal_key_state *s =3D MUSICPAL_KEY(dev); - - g_clear_pointer(&s->hs, qemu_input_handler_unregister); -} - -static const VMStateDescription musicpal_key_vmsd =3D { - .name =3D "musicpal_key", - .version_id =3D 2, - .minimum_version_id =3D 2, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(pressed_keys, musicpal_key_state), - VMSTATE_END_OF_LIST() - } -}; - -static void musicpal_key_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - dc->vmsd =3D &musicpal_key_vmsd; - dc->realize =3D musicpal_key_realize; - dc->unrealize =3D musicpal_key_unrealize; -} - -static const TypeInfo musicpal_key_info =3D { - .name =3D TYPE_MUSICPAL_KEY, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(musicpal_key_state), - .instance_init =3D musicpal_key_init, - .class_init =3D musicpal_key_class_init, -}; - -#define FLASH_SECTOR_SIZE (64 * KiB) - -static struct arm_boot_info musicpal_binfo =3D { - .loader_start =3D 0x0, - .board_id =3D 0x20e, -}; - -static void musicpal_init(MachineState *machine) -{ - ARMCPU *cpu; - DeviceState *dev; - DeviceState *pic; - DeviceState *uart_orgate; - DeviceState *i2c_dev; - DeviceState *lcd_dev; - DeviceState *key_dev; - I2CSlave *wm8750_dev; - SysBusDevice *s; - I2CBus *i2c; - int i; - unsigned long flash_size; - DriveInfo *dinfo; - MachineClass *mc =3D MACHINE_GET_CLASS(machine); - MemoryRegion *address_space_mem =3D get_system_memory(); - MemoryRegion *sram =3D g_new(MemoryRegion, 1); - - /* For now we use a fixed - the original - RAM size */ - if (machine->ram_size !=3D mc->default_ram_size) { - char *sz =3D size_to_str(mc->default_ram_size); - error_report("Invalid RAM size, should be %s", sz); - g_free(sz); - exit(EXIT_FAILURE); - } - - cpu =3D ARM_CPU(cpu_create(machine->cpu_type)); - - memory_region_add_subregion(address_space_mem, 0, machine->ram); - - memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE, - &error_fatal); - memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram); - - pic =3D sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE, - qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ)); - sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE, - qdev_get_gpio_in(pic, MP_TIMER1_IRQ), - qdev_get_gpio_in(pic, MP_TIMER2_IRQ), - qdev_get_gpio_in(pic, MP_TIMER3_IRQ), - qdev_get_gpio_in(pic, MP_TIMER4_IRQ), NULL); - - /* Logically OR both UART IRQs together */ - uart_orgate =3D qdev_new(TYPE_OR_IRQ); - object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fa= tal); - qdev_realize_and_unref(uart_orgate, NULL, &error_fatal); - qdev_connect_gpio_out(uart_orgate, 0, - qdev_get_gpio_in(pic, MP_UART_SHARED_IRQ)); - - serial_mm_init(address_space_mem, MP_UART1_BASE, 2, - qdev_get_gpio_in(uart_orgate, 0), - 1825000, serial_hd(0), DEVICE_NATIVE_ENDIAN); - serial_mm_init(address_space_mem, MP_UART2_BASE, 2, - qdev_get_gpio_in(uart_orgate, 1), - 1825000, serial_hd(1), DEVICE_NATIVE_ENDIAN); - - /* Register flash */ - dinfo =3D drive_get(IF_PFLASH, 0, 0); - if (dinfo) { - BlockBackend *blk =3D blk_by_legacy_dinfo(dinfo); - - flash_size =3D blk_getlength(blk); - if (flash_size !=3D 8 * MiB && flash_size !=3D 16 * MiB && - flash_size !=3D 32 * MiB) { - error_report("Invalid flash image size"); - exit(1); - } - - /* - * The original U-Boot accesses the flash at 0xFE000000 instead of - * 0xFF800000 (if there is 8 MB flash). So remap flash access if t= he - * image is smaller than 32 MB. - */ - pflash_cfi02_register(0x100000000ULL - MP_FLASH_SIZE_MAX, - "musicpal.flash", flash_size, - blk, FLASH_SECTOR_SIZE, - MP_FLASH_SIZE_MAX / flash_size, - 2, 0x00BF, 0x236D, 0x0000, 0x0000, - 0x5555, 0x2AAA, 0); - } - sysbus_create_simple(TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL); - - dev =3D qdev_new(TYPE_MV88W8618_ETH); - qemu_configure_nic_device(dev, true, "mv88w8618"); - object_property_set_link(OBJECT(dev), "dma-memory", - OBJECT(get_system_memory()), &error_fatal); - sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); - sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, MP_ETH_BASE); - sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, - qdev_get_gpio_in(pic, MP_ETH_IRQ)); - - sysbus_create_simple("mv88w8618_wlan", MP_WLAN_BASE, NULL); - - sysbus_create_simple(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL); - - dev =3D sysbus_create_simple(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE, - qdev_get_gpio_in(pic, MP_GPIO_IRQ)); - i2c_dev =3D sysbus_create_simple(TYPE_GPIO_I2C, -1, NULL); - i2c =3D (I2CBus *)qdev_get_child_bus(i2c_dev, "i2c"); - - lcd_dev =3D sysbus_create_simple(TYPE_MUSICPAL_LCD, MP_LCD_BASE, NULL); - key_dev =3D sysbus_create_simple(TYPE_MUSICPAL_KEY, -1, NULL); - - /* I2C read data */ - qdev_connect_gpio_out(i2c_dev, 0, - qdev_get_gpio_in(dev, MP_GPIO_I2C_DATA_BIT)); - /* I2C data */ - qdev_connect_gpio_out(dev, 3, qdev_get_gpio_in(i2c_dev, 0)); - /* I2C clock */ - qdev_connect_gpio_out(dev, 4, qdev_get_gpio_in(i2c_dev, 1)); - - for (i =3D 0; i < 3; i++) { - qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(lcd_dev, i)); - } - for (i =3D 0; i < 4; i++) { - qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 8)); - } - for (i =3D 4; i < 8; i++) { - qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 15)); - } - - wm8750_dev =3D i2c_slave_new(TYPE_WM8750, MP_WM_ADDR); - if (machine->audiodev) { - qdev_prop_set_string(DEVICE(wm8750_dev), "audiodev", machine->audi= odev); - } - i2c_slave_realize_and_unref(wm8750_dev, i2c, &error_abort); - - dev =3D qdev_new(TYPE_MV88W8618_AUDIO); - s =3D SYS_BUS_DEVICE(dev); - object_property_set_link(OBJECT(dev), "wm8750", OBJECT(wm8750_dev), - NULL); - sysbus_realize_and_unref(s, &error_fatal); - sysbus_mmio_map(s, 0, MP_AUDIO_BASE); - sysbus_connect_irq(s, 0, qdev_get_gpio_in(pic, MP_AUDIO_IRQ)); - - musicpal_binfo.ram_size =3D MP_RAM_DEFAULT_SIZE; - arm_load_kernel(cpu, machine, &musicpal_binfo); -} - -static void musicpal_machine_init(MachineClass *mc) -{ - mc->desc =3D "Marvell 88w8618 / MusicPal (ARM926EJ-S)"; - mc->init =3D musicpal_init; - mc->ignore_memory_transaction_failures =3D true; - mc->default_cpu_type =3D ARM_CPU_TYPE_NAME("arm926"); - mc->default_ram_size =3D MP_RAM_DEFAULT_SIZE; - mc->default_ram_id =3D "musicpal.ram"; - - machine_add_audiodev_property(mc); -} - -DEFINE_MACHINE_ARM("musicpal", musicpal_machine_init) - -static void mv88w8618_wlan_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - dc->realize =3D mv88w8618_wlan_realize; -} - -static const TypeInfo mv88w8618_wlan_info =3D { - .name =3D "mv88w8618_wlan", - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(SysBusDevice), - .class_init =3D mv88w8618_wlan_class_init, -}; - -static void musicpal_register_types(void) -{ - type_register_static(&mv88w8618_pic_info); - type_register_static(&mv88w8618_pit_info); - type_register_static(&mv88w8618_flashcfg_info); - type_register_static(&mv88w8618_wlan_info); - type_register_static(&musicpal_lcd_info); - type_register_static(&musicpal_gpio_info); - type_register_static(&musicpal_key_info); - type_register_static(&musicpal_misc_info); -} - -type_init(musicpal_register_types) --=20 2.43.0 From nobody Sat Sep 26 23:03:44 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1787165759; cv=none; d=zohomail.com; s=zohoarc; b=f/mv8SIOF8YrSGRJbsjaW9rvo06FsAizGHu8baMzoVuIb+2ZKMEXJflxQ3icgKFJnPVBUQMECqBglnXUXx1evAh0NDvf5WEu/ET+x3q01M+PHtAVE/WB3rsDE1jWdxcu2ag6JxrH4GsRlkc9q3R4VzKhXzPfsTQ1apEmBOdq7Pw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787165759; 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=nShee/GFbyI/dru/UKtIfcWXyAXKPIKvCG8tIe7n+sE=; b=CIWHhNtKv+4SYY2Ptj+UjkPgWtySj8dBV8hqzXM2TYnuXYVTYdZn8RTiUxjPE0FzpKVx36lqaAh64u7x23qkXj2PjlSXixWCoRS2F1b92FBDFL6hmrBMgtrtLkndPHhFnrkiWlevqB4kQwRcGPrl/Rd2u58nNusjg0bqDU4DmpI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787165759205590.3025997120482; Wed, 19 Aug 2026 11:55:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wwlQx-0005WN-8H; Wed, 19 Aug 2026 14:54:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wwlQv-0005Vv-Tu for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:41 -0400 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wwlQs-0007OP-Kn for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:41 -0400 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-47f633e6058so1106427f8f.0 for ; Wed, 19 Aug 2026 11:54:38 -0700 (PDT) Received: from lanath.. (wildly.archaic.org.uk. [81.2.115.145]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482b145c9d7sm7995048f8f.15.2026.08.19.11.54.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Aug 2026 11:54:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1787165677; x=1787770477; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=nShee/GFbyI/dru/UKtIfcWXyAXKPIKvCG8tIe7n+sE=; b=gNlcPNu/i0DHSovybdpu8CV15Y4Fu/yQ5eNbhd/oDiJTekK4yDDBla4OwM5U4QKs2H YinC1g6Zpjf7yojGC/bWeotn9knxBE1uC7ha6j4S81tG9tXSGZNR9U+uaLVKSjq7cu8e KTxPm7nixQe9mvDX8a9OZ4pX2TKym06mD/kgMqk43eO4uqYWIdxgxgwR7vIepD8/Zt36 6ycfnn3n9ZgXi9xdrtiENn1mVSJ72qOPR0O1QKEJKCZaJpSEnh6i3J6ZC7f69CnXffaf +XWEGC9WCk3aMfVDNFdfUrCQDOx4F1ze3aaJg4QyofB8fo+1cxHpx1NgG0shgMr6tDpY dzEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787165677; x=1787770477; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=nShee/GFbyI/dru/UKtIfcWXyAXKPIKvCG8tIe7n+sE=; b=gofeQKvIO4kRgSOsL+Ju9J9NWufsmSdTSPZzGXOk74eoO6hkRF/2Q+yB5YQYXmGFlH TbhpM/G5VD6djG6QURW5NcXIfn6tpZUobxd5K8yL29HeLovYcX677KUIkG8Imex4Ld8z uoXzzSL3ljCEsZmyNRfQxoE68NBAs7I3znzZEQrlyVSX9rTtLcsCG+0Bv2oMP/X3Ofqg vk7opwWTzVhGyQh2jg3fKm0lyWFX49GHkU/+yoYb8NbyfTpujuqJPZkJpUAhLCvWIJiu hQ2E6Bez2zNKwdWvb755wVZbb4sXf/qqKZkcY2TNVT4oqqie8g6Za4fNhOietKwwMn4j ZUgg== X-Forwarded-Encrypted: i=1; AHgh+RrF0xULMgSCeo2XOs6MOHM1ZSHoyRwDS+qWlqgBzXeYloKD4I3rmAOwEuabW2ZHVy3bf8HlcBocCxCa@nongnu.org X-Gm-Message-State: AFuF++lnUgpgkEEKT9ANM3stahN9pJ0E9WVFk2tuXwFrqcFd4M0rF7cx +Z+Ujiyy6zUWDxgHgRC3agmY/fyPI/LGlExKlcW44AOtZgqJiUVZIoknVjerwPy2E0c= X-Gm-Gg: AR+sD13ReEVnXpgVfaUnop9t8pRLtZs8Smvka0AWs2xusUVVH1DXTiYnXVeL1KUdbyT VR2jz5czVMwQGUZEy+/Tf4uk5HmB6J04FSuLOXLtWJgDfcO/Tr/PhDKpkU/8CFZ2kVEICbnlP55 56FcfKbF76twvtyStUzlz6Yju4iwYQ4Yuzq2qn5DM1z1945YPqHZ0xiyCu5AtWEKhh6RWAlDnCF TSYDKCvo9XCTZMHGMzUWwHBMHPOMuXGAu6h7sge+tr0JAN//qn0glF7kbdX2PwJtJ55mzJ/n/VJ V0ATNLGCOVHtQsdNG1I03DRWGiZVq3Gf8Ax3wOEILbIu2JQIoM554MC5dFcTMzLqctekV/WTkeg 1mfoFqeO+T5itxvZLo+9r+ahZ8AAGYgwkdKfPSIK2vglHWlNgnAvIjFTZ/iTHCmRTYnhPS5aIsr kVq8PPuk4g+k4/9SoyIrfxf1eTxOnh7CO8ScgyICQUgu1z5QiZ2NYmeq0eFBWsZW12fvH2PH+6C mnZjQDOnEAs027l5Pi6jjMJOiF22mKJP4Iu2AnTRe9B/8mY7WPnmUsvQkAnkd6CIowUiGQiViA= X-Received: by 2002:a05:6000:40cc:b0:482:af8a:4359 with SMTP id ffacd0b85a97d-482b1fd3a7amr11092980f8f.12.1787165676962; Wed, 19 Aug 2026 11:54:36 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Cc: Pierrick Bouvier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jan Kiszka Subject: [PATCH 4/5] hw: Remove Marvell 88W8618 devices Date: Wed, 19 Aug 2026 19:54:29 +0100 Message-ID: <20260819185430.3467629-5-peter.maydell@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260819185430.3467629-1-peter.maydell@linaro.org> References: <20260819185430.3467629-1-peter.maydell@linaro.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42d; envelope-from=peter.maydell@linaro.org; helo=mail-wr1-x42d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @linaro.org) X-ZM-MESSAGEID: 1787165760804158500 Content-Type: text/plain; charset="utf-8" The mv88w8618 ethernet and audio devices were used only by the now-removed musicpal machine, so can also be deleted. Signed-off-by: Peter Maydell Acked-by: Jan Kiszka Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson --- hw/arm/Kconfig | 3 - hw/audio/marvell_88w8618.c | 315 -------------------------- hw/audio/meson.build | 1 - hw/net/meson.build | 1 - hw/net/mv88w8618_eth.c | 403 --------------------------------- include/hw/net/mv88w8618_eth.h | 13 -- 6 files changed, 736 deletions(-) delete mode 100644 hw/audio/marvell_88w8618.c delete mode 100644 hw/net/mv88w8618_eth.c delete mode 100644 include/hw/net/mv88w8618_eth.h diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig index 57db2a2fdf..5db7ce057f 100644 --- a/hw/arm/Kconfig +++ b/hw/arm/Kconfig @@ -100,9 +100,6 @@ config MUSCA select SPLIT_IRQ select UNIMP =20 -config MARVELL_88W8618 - bool - config NETDUINO2 bool default y diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c deleted file mode 100644 index 061d076dad..0000000000 --- a/hw/audio/marvell_88w8618.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Marvell 88w8618 audio emulation extracted from - * Marvell MV88w8618 / Freecom MusicPal emulation. - * - * Copyright (c) 2008 Jan Kiszka - * - * This code is licensed under the GNU GPL v2. - * - * Contributions after 2012-01-13 are licensed under the terms of the - * GNU GPL, version 2 or (at your option) any later version. - */ - -#include "qemu/osdep.h" -#include "hw/core/sysbus.h" -#include "exec/cpu-common.h" -#include "migration/vmstate.h" -#include "hw/core/irq.h" -#include "hw/core/qdev-properties.h" -#include "hw/audio/wm8750.h" -#include "qemu/audio.h" -#include "qapi/error.h" -#include "qemu/module.h" -#include "qom/object.h" -#include "system/physmem.h" - -#define MP_AUDIO_SIZE 0x00001000 - -/* Audio register offsets */ -#define MP_AUDIO_PLAYBACK_MODE 0x00 -#define MP_AUDIO_CLOCK_DIV 0x18 -#define MP_AUDIO_IRQ_STATUS 0x20 -#define MP_AUDIO_IRQ_ENABLE 0x24 -#define MP_AUDIO_TX_START_LO 0x28 -#define MP_AUDIO_TX_THRESHOLD 0x2C -#define MP_AUDIO_TX_STATUS 0x38 -#define MP_AUDIO_TX_START_HI 0x40 - -/* Status register and IRQ enable bits */ -#define MP_AUDIO_TX_HALF (1 << 6) -#define MP_AUDIO_TX_FULL (1 << 7) - -/* Playback mode bits */ -#define MP_AUDIO_16BIT_SAMPLE (1 << 0) -#define MP_AUDIO_PLAYBACK_EN (1 << 7) -#define MP_AUDIO_CLOCK_24MHZ (1 << 9) -#define MP_AUDIO_MONO (1 << 14) - -OBJECT_DECLARE_SIMPLE_TYPE(mv88w8618_audio_state, MV88W8618_AUDIO) - -struct mv88w8618_audio_state { - SysBusDevice parent_obj; - - MemoryRegion iomem; - qemu_irq irq; - uint32_t playback_mode; - uint32_t status; - uint32_t irq_enable; - uint32_t phys_buf; - uint32_t target_buffer; - uint32_t threshold; - uint32_t play_pos; - uint32_t last_free; - uint32_t clock_div; - void *wm; -}; - -static void mv88w8618_audio_callback(void *opaque, int free_out, int free_= in) -{ - mv88w8618_audio_state *s =3D opaque; - int16_t *codec_buffer; - QEMU_UNINITIALIZED int8_t buf[4096]; - int8_t *mem_buffer; - int pos, block_size; - - if (!(s->playback_mode & MP_AUDIO_PLAYBACK_EN)) { - return; - } - if (s->playback_mode & MP_AUDIO_16BIT_SAMPLE) { - free_out <<=3D 1; - } - if (!(s->playback_mode & MP_AUDIO_MONO)) { - free_out <<=3D 1; - } - block_size =3D s->threshold / 2; - if (free_out - s->last_free < block_size) { - return; - } - if (block_size > 4096) { - return; - } - physical_memory_read(s->target_buffer + s->play_pos, buf, block_size); - mem_buffer =3D buf; - if (s->playback_mode & MP_AUDIO_16BIT_SAMPLE) { - if (s->playback_mode & MP_AUDIO_MONO) { - codec_buffer =3D wm8750_dac_buffer(s->wm, block_size >> 1); - for (pos =3D 0; pos < block_size; pos +=3D 2) { - *codec_buffer++ =3D *(int16_t *)mem_buffer; - *codec_buffer++ =3D *(int16_t *)mem_buffer; - mem_buffer +=3D 2; - } - } else { - memcpy(wm8750_dac_buffer(s->wm, block_size >> 2), - (uint32_t *)mem_buffer, block_size); - } - } else { - if (s->playback_mode & MP_AUDIO_MONO) { - codec_buffer =3D wm8750_dac_buffer(s->wm, block_size); - for (pos =3D 0; pos < block_size; pos++) { - *codec_buffer++ =3D cpu_to_le16(256 * *mem_buffer); - *codec_buffer++ =3D cpu_to_le16(256 * *mem_buffer++); - } - } else { - codec_buffer =3D wm8750_dac_buffer(s->wm, block_size >> 1); - for (pos =3D 0; pos < block_size; pos +=3D 2) { - *codec_buffer++ =3D cpu_to_le16(256 * *mem_buffer++); - *codec_buffer++ =3D cpu_to_le16(256 * *mem_buffer++); - } - } - } - wm8750_dac_commit(s->wm); - - s->last_free =3D free_out - block_size; - - if (s->play_pos =3D=3D 0) { - s->status |=3D MP_AUDIO_TX_HALF; - s->play_pos =3D block_size; - } else { - s->status |=3D MP_AUDIO_TX_FULL; - s->play_pos =3D 0; - } - - if (s->status & s->irq_enable) { - qemu_irq_raise(s->irq); - } -} - -static void mv88w8618_audio_clock_update(mv88w8618_audio_state *s) -{ - int rate; - - if (s->playback_mode & MP_AUDIO_CLOCK_24MHZ) { - rate =3D 24576000 / 64; /* 24.576MHz */ - } else { - rate =3D 11289600 / 64; /* 11.2896MHz */ - } - rate /=3D ((s->clock_div >> 8) & 0xff) + 1; - - wm8750_set_bclk_in(s->wm, rate); -} - -static uint64_t mv88w8618_audio_read(void *opaque, hwaddr offset, - unsigned size) -{ - mv88w8618_audio_state *s =3D opaque; - - switch (offset) { - case MP_AUDIO_PLAYBACK_MODE: - return s->playback_mode; - - case MP_AUDIO_CLOCK_DIV: - return s->clock_div; - - case MP_AUDIO_IRQ_STATUS: - return s->status; - - case MP_AUDIO_IRQ_ENABLE: - return s->irq_enable; - - case MP_AUDIO_TX_STATUS: - return s->play_pos >> 2; - - default: - return 0; - } -} - -static void mv88w8618_audio_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - mv88w8618_audio_state *s =3D opaque; - - switch (offset) { - case MP_AUDIO_PLAYBACK_MODE: - if (value & MP_AUDIO_PLAYBACK_EN && - !(s->playback_mode & MP_AUDIO_PLAYBACK_EN)) { - s->status =3D 0; - s->last_free =3D 0; - s->play_pos =3D 0; - } - s->playback_mode =3D value; - mv88w8618_audio_clock_update(s); - break; - - case MP_AUDIO_CLOCK_DIV: - s->clock_div =3D value; - s->last_free =3D 0; - s->play_pos =3D 0; - mv88w8618_audio_clock_update(s); - break; - - case MP_AUDIO_IRQ_STATUS: - s->status &=3D ~value; - break; - - case MP_AUDIO_IRQ_ENABLE: - s->irq_enable =3D value; - if (s->status & s->irq_enable) { - qemu_irq_raise(s->irq); - } - break; - - case MP_AUDIO_TX_START_LO: - s->phys_buf =3D (s->phys_buf & 0xFFFF0000) | (value & 0xFFFF); - s->target_buffer =3D s->phys_buf; - s->play_pos =3D 0; - s->last_free =3D 0; - break; - - case MP_AUDIO_TX_THRESHOLD: - s->threshold =3D (value + 1) * 4; - break; - - case MP_AUDIO_TX_START_HI: - s->phys_buf =3D (s->phys_buf & 0xFFFF) | (value << 16); - s->target_buffer =3D s->phys_buf; - s->play_pos =3D 0; - s->last_free =3D 0; - break; - } -} - -static void mv88w8618_audio_reset(DeviceState *d) -{ - mv88w8618_audio_state *s =3D MV88W8618_AUDIO(d); - - s->playback_mode =3D 0; - s->status =3D 0; - s->irq_enable =3D 0; - s->clock_div =3D 0; - s->threshold =3D 0; - s->phys_buf =3D 0; -} - -static const MemoryRegionOps mv88w8618_audio_ops =3D { - .read =3D mv88w8618_audio_read, - .write =3D mv88w8618_audio_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void mv88w8618_audio_init(Object *obj) -{ - SysBusDevice *dev =3D SYS_BUS_DEVICE(obj); - mv88w8618_audio_state *s =3D MV88W8618_AUDIO(dev); - - sysbus_init_irq(dev, &s->irq); - - memory_region_init_io(&s->iomem, obj, &mv88w8618_audio_ops, s, - "audio", MP_AUDIO_SIZE); - sysbus_init_mmio(dev, &s->iomem); - - object_property_add_link(OBJECT(dev), "wm8750", TYPE_WM8750, - (Object **) &s->wm, - qdev_prop_allow_set_link_before_realize, - 0); -} - -static void mv88w8618_audio_realize(DeviceState *dev, Error **errp) -{ - mv88w8618_audio_state *s =3D MV88W8618_AUDIO(dev); - - wm8750_data_req_set(s->wm, mv88w8618_audio_callback, s); -} - -static const VMStateDescription mv88w8618_audio_vmsd =3D { - .name =3D "mv88w8618_audio", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(playback_mode, mv88w8618_audio_state), - VMSTATE_UINT32(status, mv88w8618_audio_state), - VMSTATE_UINT32(irq_enable, mv88w8618_audio_state), - VMSTATE_UINT32(phys_buf, mv88w8618_audio_state), - VMSTATE_UINT32(target_buffer, mv88w8618_audio_state), - VMSTATE_UINT32(threshold, mv88w8618_audio_state), - VMSTATE_UINT32(play_pos, mv88w8618_audio_state), - VMSTATE_UINT32(last_free, mv88w8618_audio_state), - VMSTATE_UINT32(clock_div, mv88w8618_audio_state), - VMSTATE_END_OF_LIST() - } -}; - -static void mv88w8618_audio_class_init(ObjectClass *klass, const void *dat= a) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - dc->realize =3D mv88w8618_audio_realize; - device_class_set_legacy_reset(dc, mv88w8618_audio_reset); - dc->vmsd =3D &mv88w8618_audio_vmsd; - dc->user_creatable =3D false; -} - -static const TypeInfo mv88w8618_audio_info =3D { - .name =3D TYPE_MV88W8618_AUDIO, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(mv88w8618_audio_state), - .instance_init =3D mv88w8618_audio_init, - .class_init =3D mv88w8618_audio_class_init, -}; - -static void mv88w8618_register_types(void) -{ - type_register_static(&mv88w8618_audio_info); -} - -type_init(mv88w8618_register_types) diff --git a/hw/audio/meson.build b/hw/audio/meson.build index 2154cbdb57..c977679e23 100644 --- a/hw/audio/meson.build +++ b/hw/audio/meson.build @@ -7,7 +7,6 @@ system_ss.add(when: 'CONFIG_CS4231A', if_true: files('cs423= 1a.c')) system_ss.add(when: 'CONFIG_ES1370', if_true: files('es1370.c')) system_ss.add(when: 'CONFIG_GUS', if_true: files('gus.c', 'gusemu_hal.c', = 'gusemu_mixer.c')) system_ss.add(when: 'CONFIG_HDA', if_true: files('intel-hda.c', 'hda-codec= .c')) -system_ss.add(when: 'CONFIG_MARVELL_88W8618', if_true: files('marvell_88w8= 618.c')) system_ss.add(when: 'CONFIG_PCSPK', if_true: files('pcspk.c')) system_ss.add(when: 'CONFIG_PL041', if_true: files('pl041.c', 'lm4549.c')) system_ss.add(when: 'CONFIG_SB16', if_true: files('sb16.c')) diff --git a/hw/net/meson.build b/hw/net/meson.build index 84f142df22..b4c95b58fa 100644 --- a/hw/net/meson.build +++ b/hw/net/meson.build @@ -27,7 +27,6 @@ system_ss.add(when: 'CONFIG_ALLWINNER_EMAC', if_true: fil= es('allwinner_emac.c')) system_ss.add(when: 'CONFIG_ALLWINNER_SUN8I_EMAC', if_true: files('allwinn= er-sun8i-emac.c')) system_ss.add(when: 'CONFIG_IMX_FEC', if_true: files('imx_fec.c')) system_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-emac.c')) -system_ss.add(when: 'CONFIG_MARVELL_88W8618', if_true: files('mv88w8618_et= h.c')) =20 system_ss.add(when: 'CONFIG_CADENCE', if_true: files('cadence_gem.c')) system_ss.add(when: 'CONFIG_STELLARIS_ENET', if_true: files('stellaris_ene= t.c')) diff --git a/hw/net/mv88w8618_eth.c b/hw/net/mv88w8618_eth.c deleted file mode 100644 index 1fcfbe912e..0000000000 --- a/hw/net/mv88w8618_eth.c +++ /dev/null @@ -1,403 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Marvell MV88W8618 / Freecom MusicPal emulation. - * - * Copyright (c) 2008 Jan Kiszka - */ - -#include "qemu/osdep.h" -#include "qapi/error.h" -#include "hw/core/qdev-properties.h" -#include "hw/core/sysbus.h" -#include "hw/core/irq.h" -#include "hw/net/mv88w8618_eth.h" -#include "migration/vmstate.h" -#include "system/dma.h" -#include "net/net.h" - -#define MP_ETH_SIZE 0x00001000 - -/* Ethernet register offsets */ -#define MP_ETH_SMIR 0x010 -#define MP_ETH_PCXR 0x408 -#define MP_ETH_SDCMR 0x448 -#define MP_ETH_ICR 0x450 -#define MP_ETH_IMR 0x458 -#define MP_ETH_FRDP0 0x480 -#define MP_ETH_FRDP1 0x484 -#define MP_ETH_FRDP2 0x488 -#define MP_ETH_FRDP3 0x48C -#define MP_ETH_CRDP0 0x4A0 -#define MP_ETH_CRDP1 0x4A4 -#define MP_ETH_CRDP2 0x4A8 -#define MP_ETH_CRDP3 0x4AC -#define MP_ETH_CTDP0 0x4E0 -#define MP_ETH_CTDP1 0x4E4 - -/* MII PHY access */ -#define MP_ETH_SMIR_DATA 0x0000FFFF -#define MP_ETH_SMIR_ADDR 0x03FF0000 -#define MP_ETH_SMIR_OPCODE (1 << 26) /* Read value */ -#define MP_ETH_SMIR_RDVALID (1 << 27) - -/* PHY registers */ -#define MP_ETH_PHY1_BMSR 0x00210000 -#define MP_ETH_PHY1_PHYSID1 0x00410000 -#define MP_ETH_PHY1_PHYSID2 0x00610000 - -#define MP_PHY_BMSR_LINK 0x0004 -#define MP_PHY_BMSR_AUTONEG 0x0008 - -#define MP_PHY_88E3015 0x01410E20 - -/* TX descriptor status */ -#define MP_ETH_TX_OWN (1U << 31) - -/* RX descriptor status */ -#define MP_ETH_RX_OWN (1U << 31) - -/* Interrupt cause/mask bits */ -#define MP_ETH_IRQ_RX_BIT 0 -#define MP_ETH_IRQ_RX (1 << MP_ETH_IRQ_RX_BIT) -#define MP_ETH_IRQ_TXHI_BIT 2 -#define MP_ETH_IRQ_TXLO_BIT 3 - -/* Port config bits */ -#define MP_ETH_PCXR_2BSM_BIT 28 /* 2-byte incoming suffix */ - -/* SDMA command bits */ -#define MP_ETH_CMD_TXHI (1 << 23) -#define MP_ETH_CMD_TXLO (1 << 22) - -typedef struct mv88w8618_tx_desc { - uint32_t cmdstat; - uint16_t res; - uint16_t bytes; - uint32_t buffer; - uint32_t next; -} mv88w8618_tx_desc; - -typedef struct mv88w8618_rx_desc { - uint32_t cmdstat; - uint16_t bytes; - uint16_t buffer_size; - uint32_t buffer; - uint32_t next; -} mv88w8618_rx_desc; - -OBJECT_DECLARE_SIMPLE_TYPE(mv88w8618_eth_state, MV88W8618_ETH) - -struct mv88w8618_eth_state { - /*< private >*/ - SysBusDevice parent_obj; - /*< public >*/ - - MemoryRegion iomem; - qemu_irq irq; - MemoryRegion *dma_mr; - AddressSpace dma_as; - uint32_t smir; - uint32_t icr; - uint32_t imr; - int mmio_index; - uint32_t vlan_header; - uint32_t tx_queue[2]; - uint32_t rx_queue[4]; - uint32_t frx_queue[4]; - uint32_t cur_rx[4]; - NICState *nic; - NICConf conf; -}; - -static void eth_rx_desc_put(AddressSpace *dma_as, uint32_t addr, - mv88w8618_rx_desc *desc) -{ - cpu_to_le32s(&desc->cmdstat); - cpu_to_le16s(&desc->bytes); - cpu_to_le16s(&desc->buffer_size); - cpu_to_le32s(&desc->buffer); - cpu_to_le32s(&desc->next); - dma_memory_write(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECI= FIED); -} - -static void eth_rx_desc_get(AddressSpace *dma_as, uint32_t addr, - mv88w8618_rx_desc *desc) -{ - dma_memory_read(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECIF= IED); - le32_to_cpus(&desc->cmdstat); - le16_to_cpus(&desc->bytes); - le16_to_cpus(&desc->buffer_size); - le32_to_cpus(&desc->buffer); - le32_to_cpus(&desc->next); -} - -static ssize_t eth_receive(NetClientState *nc, const uint8_t *buf, size_t = size) -{ - mv88w8618_eth_state *s =3D qemu_get_nic_opaque(nc); - uint32_t desc_addr; - mv88w8618_rx_desc desc; - int i; - - for (i =3D 0; i < 4; i++) { - desc_addr =3D s->cur_rx[i]; - if (!desc_addr) { - continue; - } - do { - eth_rx_desc_get(&s->dma_as, desc_addr, &desc); - if ((desc.cmdstat & MP_ETH_RX_OWN) && desc.buffer_size >=3D si= ze) { - dma_memory_write(&s->dma_as, desc.buffer + s->vlan_header, - buf, size, MEMTXATTRS_UNSPECIFIED); - desc.bytes =3D size + s->vlan_header; - desc.cmdstat &=3D ~MP_ETH_RX_OWN; - s->cur_rx[i] =3D desc.next; - - s->icr |=3D MP_ETH_IRQ_RX; - if (s->icr & s->imr) { - qemu_irq_raise(s->irq); - } - eth_rx_desc_put(&s->dma_as, desc_addr, &desc); - return size; - } - desc_addr =3D desc.next; - } while (desc_addr !=3D s->rx_queue[i]); - } - return size; -} - -static void eth_tx_desc_put(AddressSpace *dma_as, uint32_t addr, - mv88w8618_tx_desc *desc) -{ - cpu_to_le32s(&desc->cmdstat); - cpu_to_le16s(&desc->res); - cpu_to_le16s(&desc->bytes); - cpu_to_le32s(&desc->buffer); - cpu_to_le32s(&desc->next); - dma_memory_write(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECI= FIED); -} - -static void eth_tx_desc_get(AddressSpace *dma_as, uint32_t addr, - mv88w8618_tx_desc *desc) -{ - dma_memory_read(dma_as, addr, desc, sizeof(*desc), MEMTXATTRS_UNSPECIF= IED); - le32_to_cpus(&desc->cmdstat); - le16_to_cpus(&desc->res); - le16_to_cpus(&desc->bytes); - le32_to_cpus(&desc->buffer); - le32_to_cpus(&desc->next); -} - -static void eth_send(mv88w8618_eth_state *s, int queue_index) -{ - uint32_t desc_addr =3D s->tx_queue[queue_index]; - mv88w8618_tx_desc desc; - uint32_t next_desc; - uint8_t buf[2048]; - int len; - - do { - eth_tx_desc_get(&s->dma_as, desc_addr, &desc); - next_desc =3D desc.next; - if (desc.cmdstat & MP_ETH_TX_OWN) { - len =3D desc.bytes; - if (len < 2048) { - dma_memory_read(&s->dma_as, desc.buffer, buf, len, - MEMTXATTRS_UNSPECIFIED); - qemu_send_packet(qemu_get_queue(s->nic), buf, len); - } - desc.cmdstat &=3D ~MP_ETH_TX_OWN; - s->icr |=3D 1 << (MP_ETH_IRQ_TXLO_BIT - queue_index); - eth_tx_desc_put(&s->dma_as, desc_addr, &desc); - } - desc_addr =3D next_desc; - } while (desc_addr !=3D s->tx_queue[queue_index]); -} - -static uint64_t mv88w8618_eth_read(void *opaque, hwaddr offset, - unsigned size) -{ - mv88w8618_eth_state *s =3D opaque; - - switch (offset) { - case MP_ETH_SMIR: - if (s->smir & MP_ETH_SMIR_OPCODE) { - switch (s->smir & MP_ETH_SMIR_ADDR) { - case MP_ETH_PHY1_BMSR: - return MP_PHY_BMSR_LINK | MP_PHY_BMSR_AUTONEG | - MP_ETH_SMIR_RDVALID; - case MP_ETH_PHY1_PHYSID1: - return (MP_PHY_88E3015 >> 16) | MP_ETH_SMIR_RDVALID; - case MP_ETH_PHY1_PHYSID2: - return (MP_PHY_88E3015 & 0xFFFF) | MP_ETH_SMIR_RDVALID; - default: - return MP_ETH_SMIR_RDVALID; - } - } - return 0; - - case MP_ETH_ICR: - return s->icr; - - case MP_ETH_IMR: - return s->imr; - - case MP_ETH_FRDP0 ... MP_ETH_FRDP3: - return s->frx_queue[(offset - MP_ETH_FRDP0) / 4]; - - case MP_ETH_CRDP0 ... MP_ETH_CRDP3: - return s->rx_queue[(offset - MP_ETH_CRDP0) / 4]; - - case MP_ETH_CTDP0 ... MP_ETH_CTDP1: - return s->tx_queue[(offset - MP_ETH_CTDP0) / 4]; - - default: - return 0; - } -} - -static void mv88w8618_eth_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) -{ - mv88w8618_eth_state *s =3D opaque; - - switch (offset) { - case MP_ETH_SMIR: - s->smir =3D value; - break; - - case MP_ETH_PCXR: - s->vlan_header =3D ((value >> MP_ETH_PCXR_2BSM_BIT) & 1) * 2; - break; - - case MP_ETH_SDCMR: - if (value & MP_ETH_CMD_TXHI) { - eth_send(s, 1); - } - if (value & MP_ETH_CMD_TXLO) { - eth_send(s, 0); - } - if (value & (MP_ETH_CMD_TXHI | MP_ETH_CMD_TXLO) && s->icr & s->imr= ) { - qemu_irq_raise(s->irq); - } - break; - - case MP_ETH_ICR: - s->icr &=3D value; - break; - - case MP_ETH_IMR: - s->imr =3D value; - if (s->icr & s->imr) { - qemu_irq_raise(s->irq); - } - break; - - case MP_ETH_FRDP0 ... MP_ETH_FRDP3: - s->frx_queue[(offset - MP_ETH_FRDP0) / 4] =3D value; - break; - - case MP_ETH_CRDP0 ... MP_ETH_CRDP3: - s->rx_queue[(offset - MP_ETH_CRDP0) / 4] =3D - s->cur_rx[(offset - MP_ETH_CRDP0) / 4] =3D value; - break; - - case MP_ETH_CTDP0 ... MP_ETH_CTDP1: - s->tx_queue[(offset - MP_ETH_CTDP0) / 4] =3D value; - break; - } -} - -static const MemoryRegionOps mv88w8618_eth_ops =3D { - .read =3D mv88w8618_eth_read, - .write =3D mv88w8618_eth_write, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static void eth_cleanup(NetClientState *nc) -{ - mv88w8618_eth_state *s =3D qemu_get_nic_opaque(nc); - - s->nic =3D NULL; -} - -static NetClientInfo net_mv88w8618_info =3D { - .type =3D NET_CLIENT_DRIVER_NIC, - .size =3D sizeof(NICState), - .receive =3D eth_receive, - .cleanup =3D eth_cleanup, -}; - -static void mv88w8618_eth_init(Object *obj) -{ - SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); - DeviceState *dev =3D DEVICE(sbd); - mv88w8618_eth_state *s =3D MV88W8618_ETH(dev); - - sysbus_init_irq(sbd, &s->irq); - memory_region_init_io(&s->iomem, obj, &mv88w8618_eth_ops, s, - "mv88w8618-eth", MP_ETH_SIZE); - sysbus_init_mmio(sbd, &s->iomem); -} - -static void mv88w8618_eth_realize(DeviceState *dev, Error **errp) -{ - mv88w8618_eth_state *s =3D MV88W8618_ETH(dev); - - if (!s->dma_mr) { - error_setg(errp, TYPE_MV88W8618_ETH " 'dma-memory' link not set"); - return; - } - - address_space_init(&s->dma_as, s->dma_mr, "emac-dma"); - s->nic =3D qemu_new_nic(&net_mv88w8618_info, &s->conf, - object_get_typename(OBJECT(dev)), dev->id, - &dev->mem_reentrancy_guard, s); -} - -static const VMStateDescription mv88w8618_eth_vmsd =3D { - .name =3D "mv88w8618_eth", - .version_id =3D 1, - .minimum_version_id =3D 1, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT32(smir, mv88w8618_eth_state), - VMSTATE_UINT32(icr, mv88w8618_eth_state), - VMSTATE_UINT32(imr, mv88w8618_eth_state), - VMSTATE_UINT32(vlan_header, mv88w8618_eth_state), - VMSTATE_UINT32_ARRAY(tx_queue, mv88w8618_eth_state, 2), - VMSTATE_UINT32_ARRAY(rx_queue, mv88w8618_eth_state, 4), - VMSTATE_UINT32_ARRAY(frx_queue, mv88w8618_eth_state, 4), - VMSTATE_UINT32_ARRAY(cur_rx, mv88w8618_eth_state, 4), - VMSTATE_END_OF_LIST() - } -}; - -static const Property mv88w8618_eth_properties[] =3D { - DEFINE_NIC_PROPERTIES(mv88w8618_eth_state, conf), - DEFINE_PROP_LINK("dma-memory", mv88w8618_eth_state, dma_mr, - TYPE_MEMORY_REGION, MemoryRegion *), -}; - -static void mv88w8618_eth_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - - dc->vmsd =3D &mv88w8618_eth_vmsd; - device_class_set_props(dc, mv88w8618_eth_properties); - dc->realize =3D mv88w8618_eth_realize; -} - -static const TypeInfo mv88w8618_eth_info =3D { - .name =3D TYPE_MV88W8618_ETH, - .parent =3D TYPE_SYS_BUS_DEVICE, - .instance_size =3D sizeof(mv88w8618_eth_state), - .instance_init =3D mv88w8618_eth_init, - .class_init =3D mv88w8618_eth_class_init, -}; - -static void musicpal_register_types(void) -{ - type_register_static(&mv88w8618_eth_info); -} - -type_init(musicpal_register_types) - diff --git a/include/hw/net/mv88w8618_eth.h b/include/hw/net/mv88w8618_eth.h deleted file mode 100644 index 41074940ec..0000000000 --- a/include/hw/net/mv88w8618_eth.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Marvell MV88W8618 / Freecom MusicPal emulation. - * - * Copyright (c) 2008-2021 QEMU contributors - */ - -#ifndef HW_NET_MV88W8618_ETH_H -#define HW_NET_MV88W8618_ETH_H - -#define TYPE_MV88W8618_ETH "mv88w8618_eth" - -#endif --=20 2.43.0 From nobody Sat Sep 26 23:03:44 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1787165762; cv=none; d=zohomail.com; s=zohoarc; b=S6V0vAYr8Ok+nnK+6Yvpe//1K5IlI73E2WMX6S/YR7FhvSnLFW77JOiiXxFaCVs6TjZWAT8LyeF9R7/aRgh5qpv7IS+UXNeMgESEMQ66AWUCBakozux+6+1A0QStRcnjc9RpKsYbN71a/WWZf8eGTaE3LOTNQht9qTXHwUqSqMw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787165762; 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=mA2wcSEXhUkc3GYoxmkPuW9aFHH1LOLuuUwN+rY+npc=; b=enQyYUQi4Kmd1MQXtULO7M3ARtCL6juRU34W97iG3eF6HenykUejGBm8HkNJXjDOXvE91PZgyq7CRioT1xulZ8gJZ9k2xUaNBRWrjtSiYQI9em+vE5XcvWt0G1DeN/QnuVQBR3N/9WWwunbTbUmxlO7owc61IWuPbrpE09WSZiE= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787165762603455.5521348008932; Wed, 19 Aug 2026 11:56:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wwlR0-0005YE-EQ; Wed, 19 Aug 2026 14:54:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wwlQz-0005XE-2S for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:45 -0400 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wwlQt-0007P5-Kj for qemu-devel@nongnu.org; Wed, 19 Aug 2026 14:54:44 -0400 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-47fecbb7000so745995f8f.2 for ; Wed, 19 Aug 2026 11:54:39 -0700 (PDT) Received: from lanath.. (wildly.archaic.org.uk. [81.2.115.145]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482b145c9d7sm7995048f8f.15.2026.08.19.11.54.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Aug 2026 11:54:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1787165678; x=1787770478; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mA2wcSEXhUkc3GYoxmkPuW9aFHH1LOLuuUwN+rY+npc=; b=ThZZRXggIggTxeHTm2L/GrqeSL6aYI5cZ3TPU/f1yH8EE0ADH9SAzpSlwzBKIhj8K/ Ahevmrl1Er0KpEueW71FSOUzd7+w3OA7E6X3yRWMUA02wTstKxv8XBvZ3ohZnSpfMLYC 8sojr497Zx3pKo4fzUJAAaodDhEzOi8E5pgY0J7y9HNwEZOy03L5TixWPkKA1DB4jPqB ntcaCgHmRO7bfcZNqCo0TmvoyIsMGmrYVkrAlsqB+PagS5ChK9Gdn7PkxN2IGFj85p2a bmaNaLNUUPomp3gZCR8yeMbTSuH+cwy0EKMWLPuQZTmD2n56NHYvMpbKf0+JQpToxHmt 0Zww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787165678; x=1787770478; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=mA2wcSEXhUkc3GYoxmkPuW9aFHH1LOLuuUwN+rY+npc=; b=WcXZTU/tbykVyfV6RATyfmljW+cKL/A+ZKPYP/CjsrwaHMTidjkHfNWzcvXuYWtC2V a4daHh6kAvtp0PBhpn9zwoZIKN068ffYWiAOdozbnY6VOwcSBmhsUfpvo93XETm5DIHl ujwWGhQxsYfBBkhi7NQqlJZwy/RXQI4QEfuiuEdm63jmWaDgpnCCb+6+s5P0w3XDfFEI ieECprRWifC9SpmlV3ayhJwE+VN2Fb/QfkmzPvvpab/v8qKoKZoUwysE6zeK96SJUW3o 2b0uX8rvzhHvR5zBuLkgSXe2iI25Dx5iLKqXAYvtvbXhb1aK/dUkd70cRbsqD8NBpPwq EFSg== X-Forwarded-Encrypted: i=1; AHgh+RoE79W1eq+OumBeeJa0fm/sHPrgN7x0MsBGvB5RxUOUrS6N+I7AOeHNV4iCNsSb7z9ncQcnnxWkikis@nongnu.org X-Gm-Message-State: AFuF++nnvUYIV097PXoP94SaFeURa9PS9NWJQWIZTruMFV+2ZJUfWhmG 5xjxIB6kecRMCssuKcvVAZCB7htLNBjSPzcrx3EVNN9Ml7Iy88qz4bsEhjLwkFJtn3iu+ZyA9Q8 K3Coy X-Gm-Gg: AR+sD12F62cDOr1SxyqeaRvsof5jTRlrv3Zjhb+iIEvJwFAjcfmbYfhsu6Z11xz3AyP CLSoiJRZIimvJhJkwhUSqDOn1HzZAaap0/Exhx2bbFYuxmIuXqYP06teGQEMPXvIxzV/rBJ9yMH RPvRuy3mo9ECS42zakzHYu1FwNqgpep/bCyCGHizwKdW3/ZTZPKmRLenwIM/SeNCQBTgMDpWJvx 39gJOUMeEbnRx1BW5M16Z2EmOOl4Yxi8REmLb//pDuu2dPUIP1kFc2tHTkd7CdUY6sg0JuWHwea g/J0dybl809ahUxPx9GthcBtiU5Hgh40Z31Wwxprg8uDe0zTe8d/yoE+8xCrnfp40pnXd7IfYS8 0h27u2L4lw58X3LWWWiWMB9I62KUtKyJj/+d9fGqv7HoaK0+X2G1DEyPCcS3Kn3wjPy0QjmO8k7 I5XO+kBzywQCPfDCQPwhGVkgFej7DXKAX/ZK0/lQqZZDnZrhc3DUkDRIfQFSIdHMvwROXH5BBzN NPBc/ijXLfHRuzQp9m745kTwVB3nddPuwPrzWs9vJg7h6oaiSzOUwBaxhQsgogrDdDkNA== X-Received: by 2002:adf:e19e:0:b0:481:3124:c71f with SMTP id ffacd0b85a97d-482b1fe1a07mr14169367f8f.17.1787165677969; Wed, 19 Aug 2026 11:54:37 -0700 (PDT) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Cc: Pierrick Bouvier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jan Kiszka Subject: [PATCH 5/5] hw/audio: Remove wm8750 I2C audio device Date: Wed, 19 Aug 2026 19:54:30 +0100 Message-ID: <20260819185430.3467629-6-peter.maydell@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260819185430.3467629-1-peter.maydell@linaro.org> References: <20260819185430.3467629-1-peter.maydell@linaro.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::435; envelope-from=peter.maydell@linaro.org; helo=mail-wr1-x435.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @linaro.org) X-ZM-MESSAGEID: 1787165764955158500 Content-Type: text/plain; charset="utf-8" The wm8750 audio I2C device was used only by the audio device on the SoC used in the now-removed musicpal machine. Since it has no users, we can delete it entirely. Although the wm8750 is an I2C device that could technically have been created on the command line, it isn't possible to do this usefully because the device only works when C code calls functions like wm8750_data_req_set() and wm8750_dac_buffer(). This resolves the problem noted in issue #4135 that there's a buffer overflow in the interaction between the marvell_88w8618 audio device and the wm8750, by removing the offending code entirely. Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4135 Signed-off-by: Peter Maydell Acked-by: Jan Kiszka Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson --- hw/audio/Kconfig | 4 - hw/audio/meson.build | 1 - hw/audio/wm8750.c | 738 -------------------------------------- include/hw/audio/wm8750.h | 30 -- 4 files changed, 773 deletions(-) delete mode 100644 hw/audio/wm8750.c delete mode 100644 include/hw/audio/wm8750.h diff --git a/hw/audio/Kconfig b/hw/audio/Kconfig index daf060e1be..ed93fa2698 100644 --- a/hw/audio/Kconfig +++ b/hw/audio/Kconfig @@ -38,10 +38,6 @@ config PCSPK default y depends on I8254 =20 -config WM8750 - bool - depends on I2C - config PL041 bool =20 diff --git a/hw/audio/meson.build b/hw/audio/meson.build index c977679e23..3312bcec10 100644 --- a/hw/audio/meson.build +++ b/hw/audio/meson.build @@ -11,6 +11,5 @@ system_ss.add(when: 'CONFIG_PCSPK', if_true: files('pcspk= .c')) system_ss.add(when: 'CONFIG_PL041', if_true: files('pl041.c', 'lm4549.c')) system_ss.add(when: 'CONFIG_SB16', if_true: files('sb16.c')) system_ss.add(when: 'CONFIG_VT82C686', if_true: files('via-ac97.c')) -system_ss.add(when: 'CONFIG_WM8750', if_true: files('wm8750.c')) system_ss.add(when: ['CONFIG_VIRTIO_SND', 'CONFIG_VIRTIO'], if_true: files= ('virtio-snd.c')) system_ss.add(when: ['CONFIG_VIRTIO_SND', 'CONFIG_VIRTIO', 'CONFIG_VIRTIO_= PCI'], if_true: files('virtio-snd-pci.c')) diff --git a/hw/audio/wm8750.c b/hw/audio/wm8750.c deleted file mode 100644 index e2507b0269..0000000000 --- a/hw/audio/wm8750.c +++ /dev/null @@ -1,738 +0,0 @@ -/* - * WM8750 audio CODEC. - * - * Copyright (c) 2006 Openedhand Ltd. - * Written by Andrzej Zaborowski - * - * This file is licensed under GNU GPL. - */ - -#include "qemu/osdep.h" -#include "hw/i2c/i2c.h" -#include "migration/vmstate.h" -#include "qemu/module.h" -#include "hw/audio/wm8750.h" -#include "qemu/audio.h" -#include "qom/object.h" - -#define IN_PORT_N 3 -#define OUT_PORT_N 3 - -#define CODEC "wm8750" - -typedef struct { - int adc; - int adc_hz; - int dac; - int dac_hz; -} WMRate; - -OBJECT_DECLARE_SIMPLE_TYPE(WM8750State, WM8750) - -struct WM8750State { - I2CSlave parent_obj; - - uint8_t i2c_data[2]; - int i2c_len; - AudioBackend *audio_be; - SWVoiceIn *adc_voice[IN_PORT_N]; - SWVoiceOut *dac_voice[OUT_PORT_N]; - int enable; - void (*data_req)(void *, int, int); - void *opaque; - uint8_t data_in[4096]; - uint8_t data_out[4096]; - int idx_in, req_in; - int idx_out, req_out; - - SWVoiceOut **out[2]; - uint8_t outvol[7], outmute[2]; - SWVoiceIn **in[2]; - uint8_t invol[4], inmute[2]; - - uint8_t diff[2], pol, ds, monomix[2], alc, mute; - uint8_t path[4], mpath[2], power, format; - const WMRate *rate; - uint8_t rate_vmstate; - int adc_hz, dac_hz, ext_adc_hz, ext_dac_hz, master; -}; - -/* pow(10.0, -i / 20.0) * 255, i =3D 0..42 */ -static const uint8_t wm8750_vol_db_table[] =3D { - 255, 227, 203, 181, 161, 143, 128, 114, 102, 90, 81, 72, 64, 57, 51, 4= 5, - 40, 36, 32, 29, 26, 23, 20, 18, 16, 14, 13, 11, 10, 9, 8, 7, 6, 6, 5, = 5, - 4, 4, 3, 3, 3, 2, 2 -}; - -#define WM8750_OUTVOL_TRANSFORM(x) wm8750_vol_db_table[(0x7f - x) / 3] -#define WM8750_INVOL_TRANSFORM(x) (x << 2) - -static inline void wm8750_in_load(WM8750State *s) -{ - if (s->idx_in + s->req_in <=3D sizeof(s->data_in)) - return; - s->idx_in =3D MAX(0, (int) sizeof(s->data_in) - s->req_in); - audio_be_read(s->audio_be, *s->in[0], s->data_in + s->idx_in, - sizeof(s->data_in) - s->idx_in); -} - -static inline void wm8750_out_flush(WM8750State *s) -{ - int sent =3D 0; - while (sent < s->idx_out) - sent +=3D audio_be_write(s->audio_be, *s->out[0], - s->data_out + sent, s->idx_out - sent) - ?: s->idx_out; - s->idx_out =3D 0; -} - -static void wm8750_audio_in_cb(void *opaque, int avail_b) -{ - WM8750State *s =3D (WM8750State *) opaque; - s->req_in =3D avail_b; - s->data_req(s->opaque, s->req_out >> 2, avail_b >> 2); -} - -static void wm8750_audio_out_cb(void *opaque, int free_b) -{ - WM8750State *s =3D (WM8750State *) opaque; - - if (s->idx_out >=3D free_b) { - s->idx_out =3D free_b; - s->req_out =3D 0; - wm8750_out_flush(s); - } else - s->req_out =3D free_b - s->idx_out; - - s->data_req(s->opaque, s->req_out >> 2, s->req_in >> 2); -} - -static const WMRate wm_rate_table[] =3D { - { 256, 48000, 256, 48000 }, /* SR: 00000 */ - { 384, 48000, 384, 48000 }, /* SR: 00001 */ - { 256, 48000, 1536, 8000 }, /* SR: 00010 */ - { 384, 48000, 2304, 8000 }, /* SR: 00011 */ - { 1536, 8000, 256, 48000 }, /* SR: 00100 */ - { 2304, 8000, 384, 48000 }, /* SR: 00101 */ - { 1536, 8000, 1536, 8000 }, /* SR: 00110 */ - { 2304, 8000, 2304, 8000 }, /* SR: 00111 */ - { 1024, 12000, 1024, 12000 }, /* SR: 01000 */ - { 1526, 12000, 1536, 12000 }, /* SR: 01001 */ - { 768, 16000, 768, 16000 }, /* SR: 01010 */ - { 1152, 16000, 1152, 16000 }, /* SR: 01011 */ - { 384, 32000, 384, 32000 }, /* SR: 01100 */ - { 576, 32000, 576, 32000 }, /* SR: 01101 */ - { 128, 96000, 128, 96000 }, /* SR: 01110 */ - { 192, 96000, 192, 96000 }, /* SR: 01111 */ - { 256, 44100, 256, 44100 }, /* SR: 10000 */ - { 384, 44100, 384, 44100 }, /* SR: 10001 */ - { 256, 44100, 1408, 8018 }, /* SR: 10010 */ - { 384, 44100, 2112, 8018 }, /* SR: 10011 */ - { 1408, 8018, 256, 44100 }, /* SR: 10100 */ - { 2112, 8018, 384, 44100 }, /* SR: 10101 */ - { 1408, 8018, 1408, 8018 }, /* SR: 10110 */ - { 2112, 8018, 2112, 8018 }, /* SR: 10111 */ - { 1024, 11025, 1024, 11025 }, /* SR: 11000 */ - { 1536, 11025, 1536, 11025 }, /* SR: 11001 */ - { 512, 22050, 512, 22050 }, /* SR: 11010 */ - { 768, 22050, 768, 22050 }, /* SR: 11011 */ - { 512, 24000, 512, 24000 }, /* SR: 11100 */ - { 768, 24000, 768, 24000 }, /* SR: 11101 */ - { 128, 88200, 128, 88200 }, /* SR: 11110 */ - { 192, 88200, 192, 88200 }, /* SR: 11111 */ -}; - -static void wm8750_vol_update(WM8750State *s) -{ - /* FIXME: multiply all volumes by s->invol[2], s->invol[3] */ - - audio_be_set_volume_in_lr(s->audio_be, s->adc_voice[0], s->mute, - s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]), - s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1])= ); - audio_be_set_volume_in_lr(s->audio_be, s->adc_voice[1], s->mute, - s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]), - s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1])= ); - audio_be_set_volume_in_lr(s->audio_be, s->adc_voice[2], s->mute, - s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]), - s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1])= ); - - /* FIXME: multiply all volumes by s->outvol[0], s->outvol[1] */ - - /* Speaker: LOUT2VOL ROUT2VOL */ - audio_be_set_volume_out_lr(s->audio_be, s->dac_voice[0], s->mute, - s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[= 4]), - s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[= 5])); - - /* Headphone: LOUT1VOL ROUT1VOL */ - audio_be_set_volume_out_lr(s->audio_be, s->dac_voice[1], s->mute, - s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[= 2]), - s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[= 3])); - - /* MONOOUT: MONOVOL MONOVOL */ - audio_be_set_volume_out_lr(s->audio_be, s->dac_voice[2], s->mute, - s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[= 6]), - s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[= 6])); -} - -static void wm8750_set_format(WM8750State *s) -{ - int i; - struct audsettings in_fmt; - struct audsettings out_fmt; - - wm8750_out_flush(s); - - if (s->in[0] && *s->in[0]) - audio_be_set_active_in(s->audio_be, *s->in[0], 0); - if (s->out[0] && *s->out[0]) - audio_be_set_active_out(s->audio_be, *s->out[0], 0); - - for (i =3D 0; i < IN_PORT_N; i ++) - if (s->adc_voice[i]) { - audio_be_close_in(s->audio_be, s->adc_voice[i]); - s->adc_voice[i] =3D NULL; - } - for (i =3D 0; i < OUT_PORT_N; i ++) - if (s->dac_voice[i]) { - audio_be_close_out(s->audio_be, s->dac_voice[i]); - s->dac_voice[i] =3D NULL; - } - - if (!s->enable) - return; - - /* Setup input */ - in_fmt.big_endian =3D false; - in_fmt.nchannels =3D 2; - in_fmt.freq =3D s->adc_hz; - in_fmt.fmt =3D AUDIO_FORMAT_S16; - - s->adc_voice[0] =3D audio_be_open_in(s->audio_be, s->adc_voice[0], - CODEC ".input1", s, wm8750_audio_in_cb, &in_fmt); - s->adc_voice[1] =3D audio_be_open_in(s->audio_be, s->adc_voice[1], - CODEC ".input2", s, wm8750_audio_in_cb, &in_fmt); - s->adc_voice[2] =3D audio_be_open_in(s->audio_be, s->adc_voice[2], - CODEC ".input3", s, wm8750_audio_in_cb, &in_fmt); - - /* Setup output */ - out_fmt.big_endian =3D false; - out_fmt.nchannels =3D 2; - out_fmt.freq =3D s->dac_hz; - out_fmt.fmt =3D AUDIO_FORMAT_S16; - - s->dac_voice[0] =3D audio_be_open_out(s->audio_be, s->dac_voice[0], - CODEC ".speaker", s, wm8750_audio_out_cb, &out_fmt); - s->dac_voice[1] =3D audio_be_open_out(s->audio_be, s->dac_voice[1], - CODEC ".headphone", s, wm8750_audio_out_cb, &out_fmt); - /* MONOMIX is also in stereo for simplicity */ - s->dac_voice[2] =3D audio_be_open_out(s->audio_be, s->dac_voice[2], - CODEC ".monomix", s, wm8750_audio_out_cb, &out_fmt); - /* no sense emulating OUT3 which is a mix of other outputs */ - - wm8750_vol_update(s); - - /* We should connect the left and right channels to their - * respective inputs/outputs but we have completely no need - * for mixing or combining paths to different ports, so we - * connect both channels to where the left channel is routed. */ - if (s->in[0] && *s->in[0]) - audio_be_set_active_in(s->audio_be, *s->in[0], 1); - if (s->out[0] && *s->out[0]) - audio_be_set_active_out(s->audio_be, *s->out[0], 1); -} - -static void wm8750_clk_update(WM8750State *s, int ext) -{ - if (s->master || !s->ext_dac_hz) - s->dac_hz =3D s->rate->dac_hz; - else - s->dac_hz =3D s->ext_dac_hz; - - if (s->master || !s->ext_adc_hz) - s->adc_hz =3D s->rate->adc_hz; - else - s->adc_hz =3D s->ext_adc_hz; - - if (s->master || (!s->ext_dac_hz && !s->ext_adc_hz)) { - if (!ext) - wm8750_set_format(s); - } else { - if (ext) - wm8750_set_format(s); - } -} - -static void wm8750_reset(I2CSlave *i2c) -{ - WM8750State *s =3D WM8750(i2c); - - s->rate =3D &wm_rate_table[0]; - s->enable =3D 0; - wm8750_clk_update(s, 1); - s->diff[0] =3D 0; - s->diff[1] =3D 0; - s->ds =3D 0; - s->alc =3D 0; - s->in[0] =3D &s->adc_voice[0]; - s->invol[0] =3D 0x17; - s->invol[1] =3D 0x17; - s->invol[2] =3D 0xc3; - s->invol[3] =3D 0xc3; - s->out[0] =3D &s->dac_voice[0]; - s->outvol[0] =3D 0xff; - s->outvol[1] =3D 0xff; - s->outvol[2] =3D 0x79; - s->outvol[3] =3D 0x79; - s->outvol[4] =3D 0x79; - s->outvol[5] =3D 0x79; - s->outvol[6] =3D 0x79; - s->inmute[0] =3D 0; - s->inmute[1] =3D 0; - s->outmute[0] =3D 0; - s->outmute[1] =3D 0; - s->mute =3D 1; - s->path[0] =3D 0; - s->path[1] =3D 0; - s->path[2] =3D 0; - s->path[3] =3D 0; - s->mpath[0] =3D 0; - s->mpath[1] =3D 0; - s->format =3D 0x0a; - s->idx_in =3D sizeof(s->data_in); - s->req_in =3D 0; - s->idx_out =3D 0; - s->req_out =3D 0; - wm8750_vol_update(s); - s->i2c_len =3D 0; -} - -static int wm8750_event(I2CSlave *i2c, enum i2c_event event) -{ - WM8750State *s =3D WM8750(i2c); - - switch (event) { - case I2C_START_SEND: - s->i2c_len =3D 0; - break; - case I2C_FINISH: -#ifdef VERBOSE - if (s->i2c_len < 2) - printf("%s: message too short (%i bytes)\n", - __func__, s->i2c_len); -#endif - break; - default: - break; - } - - return 0; -} - -#define WM8750_LINVOL 0x00 -#define WM8750_RINVOL 0x01 -#define WM8750_LOUT1V 0x02 -#define WM8750_ROUT1V 0x03 -#define WM8750_ADCDAC 0x05 -#define WM8750_IFACE 0x07 -#define WM8750_SRATE 0x08 -#define WM8750_LDAC 0x0a -#define WM8750_RDAC 0x0b -#define WM8750_BASS 0x0c -#define WM8750_TREBLE 0x0d -#define WM8750_RESET 0x0f -#define WM8750_3D 0x10 -#define WM8750_ALC1 0x11 -#define WM8750_ALC2 0x12 -#define WM8750_ALC3 0x13 -#define WM8750_NGATE 0x14 -#define WM8750_LADC 0x15 -#define WM8750_RADC 0x16 -#define WM8750_ADCTL1 0x17 -#define WM8750_ADCTL2 0x18 -#define WM8750_PWR1 0x19 -#define WM8750_PWR2 0x1a -#define WM8750_ADCTL3 0x1b -#define WM8750_ADCIN 0x1f -#define WM8750_LADCIN 0x20 -#define WM8750_RADCIN 0x21 -#define WM8750_LOUTM1 0x22 -#define WM8750_LOUTM2 0x23 -#define WM8750_ROUTM1 0x24 -#define WM8750_ROUTM2 0x25 -#define WM8750_MOUTM1 0x26 -#define WM8750_MOUTM2 0x27 -#define WM8750_LOUT2V 0x28 -#define WM8750_ROUT2V 0x29 -#define WM8750_MOUTV 0x2a - -static int wm8750_tx(I2CSlave *i2c, uint8_t data) -{ - WM8750State *s =3D WM8750(i2c); - uint8_t cmd; - uint16_t value; - - if (s->i2c_len >=3D 2) { -#ifdef VERBOSE - printf("%s: long message (%i bytes)\n", __func__, s->i2c_len); -#endif - return 1; - } - s->i2c_data[s->i2c_len ++] =3D data; - if (s->i2c_len !=3D 2) - return 0; - - cmd =3D s->i2c_data[0] >> 1; - value =3D ((s->i2c_data[0] << 8) | s->i2c_data[1]) & 0x1ff; - - switch (cmd) { - case WM8750_LADCIN: /* ADC Signal Path Control (Left) */ - s->diff[0] =3D (((value >> 6) & 3) =3D=3D 3); /* LINSEL */ - if (s->diff[0]) - s->in[0] =3D &s->adc_voice[0 + s->ds * 1]; - else - s->in[0] =3D &s->adc_voice[((value >> 6) & 3) * 1 + 0]; - break; - - case WM8750_RADCIN: /* ADC Signal Path Control (Right) */ - s->diff[1] =3D (((value >> 6) & 3) =3D=3D 3); /* RINSEL */ - if (s->diff[1]) - s->in[1] =3D &s->adc_voice[0 + s->ds * 1]; - else - s->in[1] =3D &s->adc_voice[((value >> 6) & 3) * 1 + 0]; - break; - - case WM8750_ADCIN: /* ADC Input Mode */ - s->ds =3D (value >> 8) & 1; /* DS */ - if (s->diff[0]) - s->in[0] =3D &s->adc_voice[0 + s->ds * 1]; - if (s->diff[1]) - s->in[1] =3D &s->adc_voice[0 + s->ds * 1]; - s->monomix[0] =3D (value >> 6) & 3; /* MONOMIX */ - break; - - case WM8750_ADCTL1: /* Additional Control (1) */ - s->monomix[1] =3D (value >> 1) & 1; /* DMONOMIX */ - break; - - case WM8750_PWR1: /* Power Management (1) */ - s->enable =3D ((value >> 6) & 7) =3D=3D 3; /* VMIDSEL, VREF */ - wm8750_set_format(s); - break; - - case WM8750_LINVOL: /* Left Channel PGA */ - s->invol[0] =3D value & 0x3f; /* LINVOL */ - s->inmute[0] =3D (value >> 7) & 1; /* LINMUTE */ - wm8750_vol_update(s); - break; - - case WM8750_RINVOL: /* Right Channel PGA */ - s->invol[1] =3D value & 0x3f; /* RINVOL */ - s->inmute[1] =3D (value >> 7) & 1; /* RINMUTE */ - wm8750_vol_update(s); - break; - - case WM8750_ADCDAC: /* ADC and DAC Control */ - s->pol =3D (value >> 5) & 3; /* ADCPOL */ - s->mute =3D (value >> 3) & 1; /* DACMU */ - wm8750_vol_update(s); - break; - - case WM8750_ADCTL3: /* Additional Control (3) */ - break; - - case WM8750_LADC: /* Left ADC Digital Volume */ - s->invol[2] =3D value & 0xff; /* LADCVOL */ - wm8750_vol_update(s); - break; - - case WM8750_RADC: /* Right ADC Digital Volume */ - s->invol[3] =3D value & 0xff; /* RADCVOL */ - wm8750_vol_update(s); - break; - - case WM8750_ALC1: /* ALC Control (1) */ - s->alc =3D (value >> 7) & 3; /* ALCSEL */ - break; - - case WM8750_NGATE: /* Noise Gate Control */ - case WM8750_3D: /* 3D enhance */ - break; - - case WM8750_LDAC: /* Left Channel Digital Volume */ - s->outvol[0] =3D value & 0xff; /* LDACVOL */ - wm8750_vol_update(s); - break; - - case WM8750_RDAC: /* Right Channel Digital Volume */ - s->outvol[1] =3D value & 0xff; /* RDACVOL */ - wm8750_vol_update(s); - break; - - case WM8750_BASS: /* Bass Control */ - break; - - case WM8750_LOUTM1: /* Left Mixer Control (1) */ - s->path[0] =3D (value >> 8) & 1; /* LD2LO */ - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_LOUTM2: /* Left Mixer Control (2) */ - s->path[1] =3D (value >> 8) & 1; /* RD2LO */ - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_ROUTM1: /* Right Mixer Control (1) */ - s->path[2] =3D (value >> 8) & 1; /* LD2RO */ - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_ROUTM2: /* Right Mixer Control (2) */ - s->path[3] =3D (value >> 8) & 1; /* RD2RO */ - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_MOUTM1: /* Mono Mixer Control (1) */ - s->mpath[0] =3D (value >> 8) & 1; /* LD2MO */ - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_MOUTM2: /* Mono Mixer Control (2) */ - s->mpath[1] =3D (value >> 8) & 1; /* RD2MO */ - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_LOUT1V: /* LOUT1 Volume */ - s->outvol[2] =3D value & 0x7f; /* LOUT1VOL */ - wm8750_vol_update(s); - break; - - case WM8750_LOUT2V: /* LOUT2 Volume */ - s->outvol[4] =3D value & 0x7f; /* LOUT2VOL */ - wm8750_vol_update(s); - break; - - case WM8750_ROUT1V: /* ROUT1 Volume */ - s->outvol[3] =3D value & 0x7f; /* ROUT1VOL */ - wm8750_vol_update(s); - break; - - case WM8750_ROUT2V: /* ROUT2 Volume */ - s->outvol[5] =3D value & 0x7f; /* ROUT2VOL */ - wm8750_vol_update(s); - break; - - case WM8750_MOUTV: /* MONOOUT Volume */ - s->outvol[6] =3D value & 0x7f; /* MONOOUTVOL */ - wm8750_vol_update(s); - break; - - case WM8750_ADCTL2: /* Additional Control (2) */ - break; - - case WM8750_PWR2: /* Power Management (2) */ - s->power =3D value & 0x7e; - /* TODO: mute/unmute respective paths */ - wm8750_vol_update(s); - break; - - case WM8750_IFACE: /* Digital Audio Interface Format */ - s->format =3D value; - s->master =3D (value >> 6) & 1; /* MS */ - wm8750_clk_update(s, s->master); - break; - - case WM8750_SRATE: /* Clocking and Sample Rate Control */ - s->rate =3D &wm_rate_table[(value >> 1) & 0x1f]; - wm8750_clk_update(s, 0); - break; - - case WM8750_RESET: /* Reset */ - wm8750_reset(I2C_SLAVE(s)); - break; - -#ifdef VERBOSE - default: - printf("%s: unknown register %02x\n", __func__, cmd); -#endif - } - - return 0; -} - -static uint8_t wm8750_rx(I2CSlave *i2c) -{ - return 0x00; -} - -static int wm8750_pre_save(void *opaque) -{ - WM8750State *s =3D opaque; - - s->rate_vmstate =3D s->rate - wm_rate_table; - - return 0; -} - -static int wm8750_post_load(void *opaque, int version_id) -{ - WM8750State *s =3D opaque; - - s->rate =3D &wm_rate_table[s->rate_vmstate & 0x1f]; - return 0; -} - -static const VMStateDescription vmstate_wm8750 =3D { - .name =3D CODEC, - .version_id =3D 0, - .minimum_version_id =3D 0, - .pre_save =3D wm8750_pre_save, - .post_load =3D wm8750_post_load, - .fields =3D (const VMStateField[]) { - VMSTATE_UINT8_ARRAY(i2c_data, WM8750State, 2), - VMSTATE_INT32(i2c_len, WM8750State), - VMSTATE_INT32(enable, WM8750State), - VMSTATE_INT32(idx_in, WM8750State), - VMSTATE_INT32(req_in, WM8750State), - VMSTATE_INT32(idx_out, WM8750State), - VMSTATE_INT32(req_out, WM8750State), - VMSTATE_UINT8_ARRAY(outvol, WM8750State, 7), - VMSTATE_UINT8_ARRAY(outmute, WM8750State, 2), - VMSTATE_UINT8_ARRAY(invol, WM8750State, 4), - VMSTATE_UINT8_ARRAY(inmute, WM8750State, 2), - VMSTATE_UINT8_ARRAY(diff, WM8750State, 2), - VMSTATE_UINT8(pol, WM8750State), - VMSTATE_UINT8(ds, WM8750State), - VMSTATE_UINT8_ARRAY(monomix, WM8750State, 2), - VMSTATE_UINT8(alc, WM8750State), - VMSTATE_UINT8(mute, WM8750State), - VMSTATE_UINT8_ARRAY(path, WM8750State, 4), - VMSTATE_UINT8_ARRAY(mpath, WM8750State, 2), - VMSTATE_UINT8(format, WM8750State), - VMSTATE_UINT8(power, WM8750State), - VMSTATE_UINT8(rate_vmstate, WM8750State), - VMSTATE_I2C_SLAVE(parent_obj, WM8750State), - VMSTATE_END_OF_LIST() - } -}; - -static void wm8750_realize(DeviceState *dev, Error **errp) -{ - WM8750State *s =3D WM8750(dev); - - if (!audio_be_check(&s->audio_be, errp)) { - return; - } - - wm8750_reset(I2C_SLAVE(s)); -} - -#if 0 -static void wm8750_fini(I2CSlave *i2c) -{ - WM8750State *s =3D WM8750(i2c); - - wm8750_reset(I2C_SLAVE(s)); - g_free(s); -} -#endif - -void wm8750_data_req_set(DeviceState *dev, data_req_cb *data_req, void *op= aque) -{ - WM8750State *s =3D WM8750(dev); - - s->data_req =3D data_req; - s->opaque =3D opaque; -} - -void wm8750_dac_dat(void *opaque, uint32_t sample) -{ - WM8750State *s =3D (WM8750State *) opaque; - - *(uint32_t *) &s->data_out[s->idx_out] =3D sample; - s->req_out -=3D 4; - s->idx_out +=3D 4; - if (s->idx_out >=3D sizeof(s->data_out) || s->req_out <=3D 0) - wm8750_out_flush(s); -} - -void *wm8750_dac_buffer(void *opaque, int samples) -{ - WM8750State *s =3D (WM8750State *) opaque; - /* XXX: Should check if there are samples free samples availabl= e */ - void *ret =3D s->data_out + s->idx_out; - - s->idx_out +=3D samples << 2; - s->req_out -=3D samples << 2; - return ret; -} - -void wm8750_dac_commit(void *opaque) -{ - WM8750State *s =3D (WM8750State *) opaque; - - wm8750_out_flush(s); -} - -uint32_t wm8750_adc_dat(void *opaque) -{ - WM8750State *s =3D (WM8750State *) opaque; - uint32_t *data; - - if (s->idx_in >=3D sizeof(s->data_in)) { - wm8750_in_load(s); - if (s->idx_in >=3D sizeof(s->data_in)) { - return 0x80008000; /* silence in AUDIO_FORMAT_S16 sample forma= t */ - } - } - - data =3D (uint32_t *) &s->data_in[s->idx_in]; - s->req_in -=3D 4; - s->idx_in +=3D 4; - return *data; -} - -void wm8750_set_bclk_in(void *opaque, int new_hz) -{ - WM8750State *s =3D (WM8750State *) opaque; - - s->ext_adc_hz =3D new_hz; - s->ext_dac_hz =3D new_hz; - wm8750_clk_update(s, 1); -} - -static const Property wm8750_properties[] =3D { - DEFINE_AUDIO_PROPERTIES(WM8750State, audio_be), -}; - -static void wm8750_class_init(ObjectClass *klass, const void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - I2CSlaveClass *sc =3D I2C_SLAVE_CLASS(klass); - - dc->realize =3D wm8750_realize; - sc->event =3D wm8750_event; - sc->recv =3D wm8750_rx; - sc->send =3D wm8750_tx; - dc->vmsd =3D &vmstate_wm8750; - device_class_set_props(dc, wm8750_properties); -} - -static const TypeInfo wm8750_info =3D { - .name =3D TYPE_WM8750, - .parent =3D TYPE_I2C_SLAVE, - .instance_size =3D sizeof(WM8750State), - .class_init =3D wm8750_class_init, -}; - -static void wm8750_register_types(void) -{ - type_register_static(&wm8750_info); -} - -type_init(wm8750_register_types) diff --git a/include/hw/audio/wm8750.h b/include/hw/audio/wm8750.h deleted file mode 100644 index f7bafd5e38..0000000000 --- a/include/hw/audio/wm8750.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2 or later, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License f= or - * more details. - * - * You should have received a copy of the GNU General Public License along= with - * this program. If not, see . - */ -#ifndef HW_DAC_WM8750_H -#define HW_DAC_WM8750_H - - -#define TYPE_WM8750 "wm8750" -#define TYPE_MV88W8618_AUDIO "mv88w8618_audio" - -typedef void data_req_cb(void *opaque, int free_out, int free_in); - -void wm8750_data_req_set(DeviceState *dev, data_req_cb *data_req, void *op= aque); -void wm8750_dac_dat(void *opaque, uint32_t sample); -uint32_t wm8750_adc_dat(void *opaque); -void *wm8750_dac_buffer(void *opaque, int samples); -void wm8750_dac_commit(void *opaque); -void wm8750_set_bclk_in(void *opaque, int new_hz); - -#endif --=20 2.43.0