From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 163215532689614.132290745276578; Mon, 20 Sep 2021 09:28:46 -0700 (PDT) Received: from localhost ([::1]:59522 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSM9t-0006cZ-LU for importer@patchew.org; Mon, 20 Sep 2021 12:28:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38006) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4f-0005pF-MD for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:22 -0400 Received: from 6.mo548.mail-out.ovh.net ([188.165.58.48]:53485) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4Y-0004Ay-PS for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:21 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.109.146.59]) by mo548.mail-out.ovh.net (Postfix) with ESMTPS id 1362620368; Mon, 20 Sep 2021 16:23:12 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:10 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G0052dd609b7-64c2-4a11-b010-309c826dc833, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 01/12] aspeed/smc: Add watchdog Control/Status Registers Date: Mon, 20 Sep 2021 18:22:58 +0200 Message-ID: <20210920162309.1091711-2-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: be3cb23c-aee0-4719-b80d-b7e5ec769d27 X-Ovh-Tracer-Id: 13073668244358728553 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=188.165.58.48; envelope-from=clg@kaod.org; helo=6.mo548.mail-out.ovh.net X-Spam_score_int: 0 X-Spam_score: -0.0 X-Spam_bar: / X-Spam_report: (-0.0 / 5.0 requ) RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , qemu-devel@nongnu.org, qemu-arm@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Peter Delevoryas , Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155328465100001 The Aspeed SoCs have a dual boot function for firmware fail-over recovery. The system auto-reboots from the second flash if the main flash does not boot sucessfully within a certain amount of time. This function is called alternate boot (ABR) in the FMC controllers. On AST2400/AST2500, ABR is enabled by hardware strapping in SCU70 to enable the 2nd watchdog timer, on AST2600, through register SCU510. If the boot on the the main flash succeeds, the firmware should disable the 2nd watchdog timer. If not, the BMC is reset and the CE0 and CE1 mappings are swapped to restart the BMC from the 2nd flash. On the AST2600, the ABR registers controlling the 2nd watchdog timer were moved from the watchdog register to the FMC controller and the FMC model should be able to control WDT2 through its own register set. This requires more work. For now, add dummy read/write handlers to let the FW disable the 2nd watchdog without error. Reviewed-by: Peter Delevoryas Reported-by: Peter Delevoryas Signed-off-by: C=C3=A9dric Le Goater --- hw/ssi/aspeed_smc.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 331a2c544635..715f85007d5e 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -124,6 +124,13 @@ /* SPI dummy cycle data */ #define R_DUMMY_DATA (0x54 / 4) =20 +/* FMC_WDT2 Control/Status Register for Alternate Boot (AST2600) */ +#define R_FMC_WDT2_CTRL (0x64 / 4) +#define FMC_WDT2_CTRL_ALT_BOOT_MODE BIT(6) /* O: 2 chips 1: 1 chip */ +#define FMC_WDT2_CTRL_SINGLE_BOOT_MODE BIT(5) +#define FMC_WDT2_CTRL_BOOT_SOURCE BIT(4) /* O: primary 1: alternate= */ +#define FMC_WDT2_CTRL_EN BIT(0) + /* DMA Control/Status Register */ #define R_DMA_CTRL (0x80 / 4) #define DMA_CTRL_REQUEST (1 << 31) @@ -263,12 +270,18 @@ static void aspeed_2600_smc_dma_ctrl(AspeedSMCState *= s, uint32_t value); =20 #define ASPEED_SMC_FEATURE_DMA 0x1 #define ASPEED_SMC_FEATURE_DMA_GRANT 0x2 +#define ASPEED_SMC_FEATURE_WDT_CONTROL 0x4 =20 static inline bool aspeed_smc_has_dma(const AspeedSMCState *s) { return !!(s->ctrl->features & ASPEED_SMC_FEATURE_DMA); } =20 +static inline bool aspeed_smc_has_wdt_control(const AspeedSMCState *s) +{ + return !!(s->ctrl->features & ASPEED_SMC_FEATURE_WDT_CONTROL); +} + static const AspeedSMCController controllers[] =3D { { .name =3D "aspeed.smc-ast2400", @@ -388,7 +401,8 @@ static const AspeedSMCController controllers[] =3D { .segments =3D aspeed_segments_ast2600_fmc, .flash_window_base =3D ASPEED26_SOC_FMC_FLASH_BASE, .flash_window_size =3D 0x10000000, - .features =3D ASPEED_SMC_FEATURE_DMA, + .features =3D ASPEED_SMC_FEATURE_DMA | + ASPEED_SMC_FEATURE_WDT_CONTROL, .dma_flash_mask =3D 0x0FFFFFFC, .dma_dram_mask =3D 0x3FFFFFFC, .nregs =3D ASPEED_SMC_R_MAX, @@ -1019,6 +1033,7 @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr = addr, unsigned int size) addr =3D=3D R_CE_CMD_CTRL || addr =3D=3D R_INTR_CTRL || addr =3D=3D R_DUMMY_DATA || + (aspeed_smc_has_wdt_control(s) && addr =3D=3D R_FMC_WDT2_CTRL) || (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_CTRL) || (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_FLASH_ADDR) || (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_DRAM_ADDR) || @@ -1350,6 +1365,8 @@ static void aspeed_smc_write(void *opaque, hwaddr add= r, uint64_t data, s->regs[addr] =3D value & 0xff; } else if (addr =3D=3D R_DUMMY_DATA) { s->regs[addr] =3D value & 0xff; + } else if (aspeed_smc_has_wdt_control(s) && addr =3D=3D R_FMC_WDT2_CTR= L) { + s->regs[addr] =3D value & FMC_WDT2_CTRL_EN; } else if (addr =3D=3D R_INTR_CTRL) { s->regs[addr] =3D value; } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_CTRL) { --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155356346333.8307844503198; Mon, 20 Sep 2021 09:29:16 -0700 (PDT) Received: from localhost ([::1]:60424 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMAN-0007Cm-9X for importer@patchew.org; Mon, 20 Sep 2021 12:29:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38042) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4g-0005pI-OM for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:22 -0400 Received: from 8.mo548.mail-out.ovh.net ([46.105.45.231]:38255) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4Y-0004B1-Sa for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:22 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.109.146.59]) by mo548.mail-out.ovh.net (Postfix) with ESMTPS id 3B7B7207D8; Mon, 20 Sep 2021 16:23:12 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:11 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G005f75b5eae-513d-4ba4-8081-d9c26ab96ffb, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 02/12] aspeed/smc: Introduce aspeed_smc_error() helper Date: Mon, 20 Sep 2021 18:22:59 +0200 Message-ID: <20210920162309.1091711-3-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 5019d851-d7c8-41f2-9bf6-a2443dd74961 X-Ovh-Tracer-Id: 13073668243715820326 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=46.105.45.231; envelope-from=clg@kaod.org; helo=8.mo548.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155358926100003 It unifies the errors reported by the Aspeed SMC model and also removes some use of ctrl->name which will help us for the next patches. Signed-off-by: C=C3=A9dric Le Goater --- hw/ssi/aspeed_smc.c | 97 +++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 52 deletions(-) diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 715f85007d5e..def1cb4c74c0 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -513,6 +513,9 @@ static void aspeed_2600_smc_reg_to_segment(const Aspeed= SMCState *s, } } =20 +#define aspeed_smc_error(fmt, ...) \ + qemu_log_mask(LOG_GUEST_ERROR, "%s: " fmt "\n", __func__, ## __VA_ARGS= __) + static bool aspeed_smc_flash_overlap(const AspeedSMCState *s, const AspeedSegments *new, int cs) @@ -529,11 +532,11 @@ static bool aspeed_smc_flash_overlap(const AspeedSMCS= tate *s, =20 if (new->addr + new->size > seg.addr && new->addr < seg.addr + seg.size) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: new segment CS%d [ 0x%" - HWADDR_PRIx" - 0x%"HWADDR_PRIx" ] overlaps with " - "CS%d [ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n", - s->ctrl->name, cs, new->addr, new->addr + new->s= ize, - i, seg.addr, seg.addr + seg.size); + aspeed_smc_error("new segment CS%d [ 0x%" + HWADDR_PRIx" - 0x%"HWADDR_PRIx" ] overlaps wi= th " + "CS%d [ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]= ", + cs, new->addr, new->addr + new->size, + i, seg.addr, seg.addr + seg.size); return true; } } @@ -568,9 +571,8 @@ static void aspeed_smc_flash_set_segment(AspeedSMCState= *s, int cs, =20 /* The start address of CS0 is read-only */ if (cs =3D=3D 0 && seg.addr !=3D s->ctrl->flash_window_base) { - qemu_log_mask(LOG_GUEST_ERROR, - "%s: Tried to change CS0 start address to 0x%" - HWADDR_PRIx "\n", s->ctrl->name, seg.addr); + aspeed_smc_error("Tried to change CS0 start address to 0x%" + HWADDR_PRIx, seg.addr); seg.addr =3D s->ctrl->flash_window_base; new =3D s->ctrl->segment_to_reg(s, &seg); } @@ -584,9 +586,8 @@ static void aspeed_smc_flash_set_segment(AspeedSMCState= *s, int cs, cs =3D=3D s->ctrl->max_peripherals && seg.addr + seg.size !=3D s->ctrl->segments[cs].addr + s->ctrl->segments[cs].size) { - qemu_log_mask(LOG_GUEST_ERROR, - "%s: Tried to change CS%d end address to 0x%" - HWADDR_PRIx "\n", s->ctrl->name, cs, seg.addr + seg.= size); + aspeed_smc_error("Tried to change CS%d end address to 0x%" + HWADDR_PRIx, cs, seg.addr + seg.size); seg.size =3D s->ctrl->segments[cs].addr + s->ctrl->segments[cs].si= ze - seg.addr; new =3D s->ctrl->segment_to_reg(s, &seg); @@ -596,17 +597,17 @@ static void aspeed_smc_flash_set_segment(AspeedSMCSta= te *s, int cs, if (seg.size && (seg.addr + seg.size <=3D s->ctrl->flash_window_base || seg.addr > s->ctrl->flash_window_base + s->ctrl->flash_window_siz= e)) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: new segment for CS%d is invali= d : " - "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n", - s->ctrl->name, cs, seg.addr, seg.addr + seg.size); + aspeed_smc_error("new segment for CS%d is invalid : " + "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]", + cs, seg.addr, seg.addr + seg.size); return; } =20 /* Check start address vs. alignment */ if (seg.size && !QEMU_IS_ALIGNED(seg.addr, seg.size)) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: new segment for CS%d is not " - "aligned : [ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n= ", - s->ctrl->name, cs, seg.addr, seg.addr + seg.size); + aspeed_smc_error("new segment for CS%d is not " + "aligned : [ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" = ]", + cs, seg.addr, seg.addr + seg.size); } =20 /* And segments should not overlap (in the specs) */ @@ -619,16 +620,15 @@ static void aspeed_smc_flash_set_segment(AspeedSMCSta= te *s, int cs, static uint64_t aspeed_smc_flash_default_read(void *opaque, hwaddr addr, unsigned size) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: To 0x%" HWADDR_PRIx " of size %u" - PRIx64 "\n", __func__, addr, size); + aspeed_smc_error("To 0x%" HWADDR_PRIx " of size %u" PRIx64, addr, size= ); return 0; } =20 static void aspeed_smc_flash_default_write(void *opaque, hwaddr addr, uint64_t data, unsigned size) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: To 0x%" HWADDR_PRIx " of size %u: = 0x%" - PRIx64 "\n", __func__, addr, size, data); + aspeed_smc_error("To 0x%" HWADDR_PRIx " of size %u: 0x%" PRIx64, + addr, size, data); } =20 static const MemoryRegionOps aspeed_smc_flash_default_ops =3D { @@ -671,8 +671,8 @@ static inline int aspeed_smc_flash_cmd(const AspeedSMCF= lash *fl) } =20 if (!cmd) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: no command defined for mode %d= \n", - __func__, aspeed_smc_flash_mode(fl)); + aspeed_smc_error("no command defined for mode %d", + aspeed_smc_flash_mode(fl)); } =20 return cmd; @@ -716,11 +716,9 @@ static uint32_t aspeed_smc_check_segment_addr(const As= peedSMCFlash *fl, =20 s->ctrl->reg_to_segment(s, s->regs[R_SEG_ADDR0 + fl->id], &seg); if ((addr % seg.size) !=3D addr) { - qemu_log_mask(LOG_GUEST_ERROR, - "%s: invalid address 0x%08x for CS%d segment : " - "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]\n", - s->ctrl->name, addr, fl->id, seg.addr, - seg.addr + seg.size); + aspeed_smc_error("invalid address 0x%08x for CS%d segment : " + "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]", + addr, fl->id, seg.addr, seg.addr + seg.size); addr %=3D seg.size; } =20 @@ -796,8 +794,7 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwa= ddr addr, unsigned size) aspeed_smc_flash_unselect(fl); break; default: - qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid flash mode %d\n", - __func__, aspeed_smc_flash_mode(fl)); + aspeed_smc_error("invalid flash mode %d", aspeed_smc_flash_mode(fl= )); } =20 trace_aspeed_smc_flash_read(fl->id, addr, size, ret, @@ -914,8 +911,7 @@ static void aspeed_smc_flash_write(void *opaque, hwaddr= addr, uint64_t data, aspeed_smc_flash_mode(fl)); =20 if (!aspeed_smc_is_writable(fl)) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: flash is not writable at 0x%" - HWADDR_PRIx "\n", __func__, addr); + aspeed_smc_error("flash is not writable at 0x%" HWADDR_PRIx, addr); return; } =20 @@ -940,8 +936,7 @@ static void aspeed_smc_flash_write(void *opaque, hwaddr= addr, uint64_t data, aspeed_smc_flash_unselect(fl); break; default: - qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid flash mode %d\n", - __func__, aspeed_smc_flash_mode(fl)); + aspeed_smc_error("invalid flash mode %d", aspeed_smc_flash_mode(fl= )); } } =20 @@ -1067,7 +1062,7 @@ static uint8_t aspeed_smc_hclk_divisor(uint8_t hclk_m= ask) } } =20 - qemu_log_mask(LOG_GUEST_ERROR, "invalid HCLK mask %x", hclk_mask); + aspeed_smc_error("invalid HCLK mask %x", hclk_mask); return 0; } =20 @@ -1147,8 +1142,7 @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s) uint32_t data; =20 if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) { - qemu_log_mask(LOG_GUEST_ERROR, - "%s: invalid direction for DMA checksum\n", __func_= _); + aspeed_smc_error("invalid direction for DMA checksum"); return; } =20 @@ -1160,8 +1154,8 @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s) data =3D address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_AD= DR], MEMTXATTRS_UNSPECIFIED, &result); if (result !=3D MEMTX_OK) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash read failed @%08x\n", - __func__, s->regs[R_DMA_FLASH_ADDR]); + aspeed_smc_error("Flash read failed @%08x", + s->regs[R_DMA_FLASH_ADDR]); return; } trace_aspeed_smc_dma_checksum(s->regs[R_DMA_FLASH_ADDR], data); @@ -1196,32 +1190,32 @@ static void aspeed_smc_dma_rw(AspeedSMCState *s) data =3D address_space_ldl_le(&s->dram_as, s->regs[R_DMA_DRAM_= ADDR], MEMTXATTRS_UNSPECIFIED, &result); if (result !=3D MEMTX_OK) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM read failed @%08x= \n", - __func__, s->regs[R_DMA_DRAM_ADDR]); + aspeed_smc_error("DRAM read failed @%08x", + s->regs[R_DMA_DRAM_ADDR]); return; } =20 address_space_stl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR], data, MEMTXATTRS_UNSPECIFIED, &result); if (result !=3D MEMTX_OK) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash write failed @%0= 8x\n", - __func__, s->regs[R_DMA_FLASH_ADDR]); + aspeed_smc_error("Flash write failed @%08x", + s->regs[R_DMA_FLASH_ADDR]); return; } } else { data =3D address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLAS= H_ADDR], MEMTXATTRS_UNSPECIFIED, &result); if (result !=3D MEMTX_OK) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash read failed @%08= x\n", - __func__, s->regs[R_DMA_FLASH_ADDR]); + aspeed_smc_error("Flash read failed @%08x", + s->regs[R_DMA_FLASH_ADDR]); return; } =20 address_space_stl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR], data, MEMTXATTRS_UNSPECIFIED, &result); if (result !=3D MEMTX_OK) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM write failed @%08= x\n", - __func__, s->regs[R_DMA_DRAM_ADDR]); + aspeed_smc_error("DRAM write failed @%08x", + s->regs[R_DMA_DRAM_ADDR]); return; } } @@ -1281,7 +1275,7 @@ static void aspeed_smc_dma_ctrl(AspeedSMCState *s, ui= nt32_t dma_ctrl) } =20 if (aspeed_smc_dma_in_progress(s)) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA in progress\n", __func__); + aspeed_smc_error("DMA in progress !"); return; } =20 @@ -1303,7 +1297,7 @@ static inline bool aspeed_smc_dma_granted(AspeedSMCSt= ate *s) } =20 if (!(s->regs[R_DMA_CTRL] & DMA_CTRL_GRANT)) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA not granted\n", __func__); + aspeed_smc_error("DMA not granted"); return false; } =20 @@ -1328,7 +1322,7 @@ static void aspeed_2600_smc_dma_ctrl(AspeedSMCState *= s, uint32_t dma_ctrl) } =20 if (!aspeed_smc_dma_granted(s)) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA not granted\n", __func__); + aspeed_smc_error("DMA not granted"); return; } =20 @@ -1434,8 +1428,7 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) =20 /* Enforce some real HW limits */ if (s->num_cs > s->ctrl->max_peripherals) { - qemu_log_mask(LOG_GUEST_ERROR, "%s: num_cs cannot exceed: %d\n", - __func__, s->ctrl->max_peripherals); + aspeed_smc_error("num_cs cannot exceed: %d", s->ctrl->max_peripher= als); s->num_cs =3D s->ctrl->max_peripherals; } =20 --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155578197353.4892534589113; Mon, 20 Sep 2021 09:32:58 -0700 (PDT) Received: from localhost ([::1]:40700 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMDw-0004Zl-Q5 for importer@patchew.org; Mon, 20 Sep 2021 12:32:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38050) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4h-0005qF-Ve for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:23 -0400 Received: from 9.mo548.mail-out.ovh.net ([46.105.48.137]:36131) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4Y-0004B3-Sa for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:22 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.109.146.59]) by mo548.mail-out.ovh.net (Postfix) with ESMTPS id 5FD722090D; Mon, 20 Sep 2021 16:23:12 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:11 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G00528233694-7470-4f32-b11a-305535cef115, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 03/12] aspeed/smc: Stop using the model name for the memory regions Date: Mon, 20 Sep 2021 18:23:00 +0200 Message-ID: <20210920162309.1091711-4-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: e8c2023c-d6d4-4809-9084-0729c4bde326 X-Ovh-Tracer-Id: 13073949721913887526 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=46.105.48.137; envelope-from=clg@kaod.org; helo=9.mo548.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155579709100001 There is no real reason to use this name. It's simply nice to have in the monitor output but it's a burden for the following patch which removes the AspeedSMCController structure describing the controller. Signed-off-by: C=C3=A9dric Le Goater --- hw/ssi/aspeed_smc.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index def1cb4c74c0..612040493cf1 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -1392,20 +1392,15 @@ static const MemoryRegionOps aspeed_smc_ops =3D { */ static void aspeed_smc_dma_setup(AspeedSMCState *s, Error **errp) { - char *name; - if (!s->dram_mr) { error_setg(errp, TYPE_ASPEED_SMC ": 'dram' link not set"); return; } =20 - name =3D g_strdup_printf("%s-dma-flash", s->ctrl->name); - address_space_init(&s->flash_as, &s->mmio_flash, name); - g_free(name); - - name =3D g_strdup_printf("%s-dma-dram", s->ctrl->name); - address_space_init(&s->dram_as, s->dram_mr, name); - g_free(name); + address_space_init(&s->flash_as, &s->mmio_flash, + TYPE_ASPEED_SMC ".dma-flash"); + address_space_init(&s->dram_as, s->dram_mr, + TYPE_ASPEED_SMC ".dma-dram"); } =20 static void aspeed_smc_realize(DeviceState *dev, Error **errp) @@ -1446,7 +1441,7 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) =20 /* The memory region for the controller registers */ memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_ops, s, - s->ctrl->name, s->ctrl->nregs * 4); + TYPE_ASPEED_SMC, s->ctrl->nregs * 4); sysbus_init_mmio(sbd, &s->mmio); =20 /* @@ -1454,12 +1449,12 @@ static void aspeed_smc_realize(DeviceState *dev, Er= ror **errp) * window in which the flash modules are mapped. The size and * address depends on the SoC model and controller type. */ - snprintf(name, sizeof(name), "%s.flash", s->ctrl->name); - memory_region_init_io(&s->mmio_flash, OBJECT(s), - &aspeed_smc_flash_default_ops, s, name, + &aspeed_smc_flash_default_ops, s, + TYPE_ASPEED_SMC ".flash", s->ctrl->flash_window_size); - memory_region_init_alias(&s->mmio_flash_alias, OBJECT(s), name, + memory_region_init_alias(&s->mmio_flash_alias, OBJECT(s), + TYPE_ASPEED_SMC ".flash", &s->mmio_flash, 0, s->ctrl->flash_window_size= ); sysbus_init_mmio(sbd, &s->mmio_flash_alias); =20 @@ -1475,7 +1470,7 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) for (i =3D 0; i < s->ctrl->max_peripherals; ++i) { AspeedSMCFlash *fl =3D &s->flashes[i]; =20 - snprintf(name, sizeof(name), "%s.%d", s->ctrl->name, i); + snprintf(name, sizeof(name), TYPE_ASPEED_SMC ".flash.%d", i); =20 fl->id =3D i; fl->controller =3D s; --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16321553712631008.1629863720914; Mon, 20 Sep 2021 09:29:31 -0700 (PDT) Received: from localhost ([::1]:33272 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMAc-0007wU-5U for importer@patchew.org; Mon, 20 Sep 2021 12:29:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38148) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4m-0005wA-CV for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:29 -0400 Received: from 10.mo552.mail-out.ovh.net ([87.98.187.244]:55395) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4Z-0004BO-H3 for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:28 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.1.249]) by mo552.mail-out.ovh.net (Postfix) with ESMTPS id C99872139A; Mon, 20 Sep 2021 16:23:12 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:12 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G0053bbea3a4-aee0-41c9-80b1-e968e246179d, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 04/12] aspeed/smc: Drop AspeedSMCController structure Date: Mon, 20 Sep 2021 18:23:01 +0200 Message-ID: <20210920162309.1091711-5-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 91a70db3-71d3-4f93-a276-727e800ca80a X-Ovh-Tracer-Id: 13073949721652661030 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=87.98.187.244; envelope-from=clg@kaod.org; helo=10.mo552.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155372845100001 The characteristics of the Aspeed controllers are described in a AspeedSMCController structure which is redundant with the AspeedSMCClass. Move all attributes under the class and adapt the code to use class attributes instead. This is a large change but it is functionally equivalent. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 64 ++- hw/arm/aspeed_ast2600.c | 4 +- hw/arm/aspeed_soc.c | 4 +- hw/ssi/aspeed_smc.c | 861 ++++++++++++++++++++---------------- 4 files changed, 511 insertions(+), 422 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index cdaf165300b6..0ea536a44c3a 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -29,35 +29,7 @@ #include "hw/sysbus.h" #include "qom/object.h" =20 -typedef struct AspeedSegments { - hwaddr addr; - uint32_t size; -} AspeedSegments; - struct AspeedSMCState; -typedef struct AspeedSMCController { - const char *name; - uint8_t r_conf; - uint8_t r_ce_ctrl; - uint8_t r_ctrl0; - uint8_t r_timings; - uint8_t nregs_timings; - uint8_t conf_enable_w0; - uint8_t max_peripherals; - const AspeedSegments *segments; - hwaddr flash_window_base; - uint32_t flash_window_size; - uint32_t features; - hwaddr dma_flash_mask; - hwaddr dma_dram_mask; - uint32_t nregs; - uint32_t (*segment_to_reg)(const struct AspeedSMCState *s, - const AspeedSegments *seg); - void (*reg_to_segment)(const struct AspeedSMCState *s, uint32_t reg, - AspeedSegments *seg); - void (*dma_ctrl)(struct AspeedSMCState *s, uint32_t value); -} AspeedSMCController; - typedef struct AspeedSMCFlash { struct AspeedSMCState *controller; =20 @@ -71,18 +43,11 @@ typedef struct AspeedSMCFlash { #define TYPE_ASPEED_SMC "aspeed.smc" OBJECT_DECLARE_TYPE(AspeedSMCState, AspeedSMCClass, ASPEED_SMC) =20 -struct AspeedSMCClass { - SysBusDevice parent_obj; - const AspeedSMCController *ctrl; -}; - #define ASPEED_SMC_R_MAX (0x100 / 4) =20 struct AspeedSMCState { SysBusDevice parent_obj; =20 - const AspeedSMCController *ctrl; - MemoryRegion mmio; MemoryRegion mmio_flash; MemoryRegion mmio_flash_alias; @@ -115,4 +80,33 @@ struct AspeedSMCState { uint8_t snoop_dummies; }; =20 +typedef struct AspeedSegments { + hwaddr addr; + uint32_t size; +} AspeedSegments; + +struct AspeedSMCClass { + SysBusDeviceClass parent_obj; + + uint8_t r_conf; + uint8_t r_ce_ctrl; + uint8_t r_ctrl0; + uint8_t r_timings; + uint8_t nregs_timings; + uint8_t conf_enable_w0; + uint8_t max_peripherals; + const AspeedSegments *segments; + hwaddr flash_window_base; + uint32_t flash_window_size; + uint32_t features; + hwaddr dma_flash_mask; + hwaddr dma_dram_mask; + uint32_t nregs; + uint32_t (*segment_to_reg)(const AspeedSMCState *s, + const AspeedSegments *seg); + void (*reg_to_segment)(const AspeedSMCState *s, uint32_t reg, + AspeedSegments *seg); + void (*dma_ctrl)(AspeedSMCState *s, uint32_t value); +}; + #endif /* ASPEED_SMC_H */ diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c index 9d70e8e060c6..c69f27dff62a 100644 --- a/hw/arm/aspeed_ast2600.c +++ b/hw/arm/aspeed_ast2600.c @@ -352,7 +352,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev= , Error **errp) } sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_DEV_FMC]= ); sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1, - s->fmc.ctrl->flash_window_base); + ASPEED_SMC_GET_CLASS(&s->fmc)->flash_window_base); sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0, aspeed_soc_get_irq(s, ASPEED_DEV_FMC)); =20 @@ -367,7 +367,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev= , Error **errp) sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, sc->memmap[ASPEED_DEV_SPI1 + i]); sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1, - s->spi[i].ctrl->flash_window_base); + ASPEED_SMC_GET_CLASS(&s->spi[i])->flash_window_bas= e); } =20 /* EHCI */ diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index ed84502e238a..4f013dd5cd9c 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -310,7 +310,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error = **errp) } sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_DEV_FMC]= ); sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1, - s->fmc.ctrl->flash_window_base); + ASPEED_SMC_GET_CLASS(&s->fmc)->flash_window_base); sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0, aspeed_soc_get_irq(s, ASPEED_DEV_FMC)); =20 @@ -323,7 +323,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error = **errp) sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, sc->memmap[ASPEED_DEV_SPI1 + i]); sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1, - s->spi[i].ctrl->flash_window_base); + ASPEED_SMC_GET_CLASS(&s->spi[i])->flash_window_bas= e); } =20 /* EHCI */ diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 612040493cf1..5466be631719 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -169,11 +169,6 @@ #define ASPEED_SMC_R_SPI_MAX (0x20 / 4) #define ASPEED_SMC_R_SMC_MAX (0x20 / 4) =20 -#define ASPEED_SOC_SMC_FLASH_BASE 0x10000000 -#define ASPEED_SOC_FMC_FLASH_BASE 0x20000000 -#define ASPEED_SOC_SPI_FLASH_BASE 0x30000000 -#define ASPEED_SOC_SPI2_FLASH_BASE 0x38000000 - /* * DMA DRAM addresses should be 4 bytes aligned and the valid address * range is 0x40000000 - 0x5FFFFFFF (AST2400) @@ -186,8 +181,8 @@ * 0: 4 bytes * 0x7FFFFF: 32M bytes */ -#define DMA_DRAM_ADDR(s, val) ((val) & (s)->ctrl->dma_dram_mask) -#define DMA_FLASH_ADDR(s, val) ((val) & (s)->ctrl->dma_flash_mask) +#define DMA_DRAM_ADDR(asc, val) ((val) & (asc)->dma_dram_mask) +#define DMA_FLASH_ADDR(asc, val) ((val) & (asc)->dma_flash_mask) #define DMA_LENGTH(val) ((val) & 0x01FFFFFC) =20 /* Flash opcodes. */ @@ -201,316 +196,25 @@ * controller. These can be changed when board is initialized with the * Segment Address Registers. */ -static const AspeedSegments aspeed_segments_legacy[] =3D { - { 0x10000000, 32 * 1024 * 1024 }, -}; - -static const AspeedSegments aspeed_segments_fmc[] =3D { - { 0x20000000, 64 * 1024 * 1024 }, /* start address is readonly */ - { 0x24000000, 32 * 1024 * 1024 }, - { 0x26000000, 32 * 1024 * 1024 }, - { 0x28000000, 32 * 1024 * 1024 }, - { 0x2A000000, 32 * 1024 * 1024 } -}; - -static const AspeedSegments aspeed_segments_spi[] =3D { - { 0x30000000, 64 * 1024 * 1024 }, -}; - -static const AspeedSegments aspeed_segments_ast2500_fmc[] =3D { - { 0x20000000, 128 * 1024 * 1024 }, /* start address is readonly */ - { 0x28000000, 32 * 1024 * 1024 }, - { 0x2A000000, 32 * 1024 * 1024 }, -}; - -static const AspeedSegments aspeed_segments_ast2500_spi1[] =3D { - { 0x30000000, 32 * 1024 * 1024 }, /* start address is readonly */ - { 0x32000000, 96 * 1024 * 1024 }, /* end address is readonly */ -}; - -static const AspeedSegments aspeed_segments_ast2500_spi2[] =3D { - { 0x38000000, 32 * 1024 * 1024 }, /* start address is readonly */ - { 0x3A000000, 96 * 1024 * 1024 }, /* end address is readonly */ -}; -static uint32_t aspeed_smc_segment_to_reg(const AspeedSMCState *s, - const AspeedSegments *seg); -static void aspeed_smc_reg_to_segment(const AspeedSMCState *s, uint32_t re= g, - AspeedSegments *seg); -static void aspeed_smc_dma_ctrl(AspeedSMCState *s, uint32_t value); - -/* - * AST2600 definitions - */ -#define ASPEED26_SOC_FMC_FLASH_BASE 0x20000000 -#define ASPEED26_SOC_SPI_FLASH_BASE 0x30000000 -#define ASPEED26_SOC_SPI2_FLASH_BASE 0x50000000 - -static const AspeedSegments aspeed_segments_ast2600_fmc[] =3D { - { 0x0, 128 * MiB }, /* start address is readonly */ - { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kerne= l */ - { 0x0, 0 }, /* disabled */ -}; - -static const AspeedSegments aspeed_segments_ast2600_spi1[] =3D { - { 0x0, 128 * MiB }, /* start address is readonly */ - { 0x0, 0 }, /* disabled */ -}; - -static const AspeedSegments aspeed_segments_ast2600_spi2[] =3D { - { 0x0, 128 * MiB }, /* start address is readonly */ - { 0x0, 0 }, /* disabled */ - { 0x0, 0 }, /* disabled */ -}; - -static uint32_t aspeed_2600_smc_segment_to_reg(const AspeedSMCState *s, - const AspeedSegments *seg); -static void aspeed_2600_smc_reg_to_segment(const AspeedSMCState *s, - uint32_t reg, AspeedSegments *s= eg); -static void aspeed_2600_smc_dma_ctrl(AspeedSMCState *s, uint32_t value); +static const AspeedSegments aspeed_2400_fmc_segments[]; +static const AspeedSegments aspeed_2400_spi1_segments[]; +static const AspeedSegments aspeed_2500_fmc_segments[]; +static const AspeedSegments aspeed_2500_spi1_segments[]; +static const AspeedSegments aspeed_2500_spi2_segments[]; +static const AspeedSegments aspeed_2600_fmc_segments[]; =20 #define ASPEED_SMC_FEATURE_DMA 0x1 #define ASPEED_SMC_FEATURE_DMA_GRANT 0x2 #define ASPEED_SMC_FEATURE_WDT_CONTROL 0x4 =20 -static inline bool aspeed_smc_has_dma(const AspeedSMCState *s) -{ - return !!(s->ctrl->features & ASPEED_SMC_FEATURE_DMA); -} - -static inline bool aspeed_smc_has_wdt_control(const AspeedSMCState *s) -{ - return !!(s->ctrl->features & ASPEED_SMC_FEATURE_WDT_CONTROL); -} - -static const AspeedSMCController controllers[] =3D { - { - .name =3D "aspeed.smc-ast2400", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 1, - .segments =3D aspeed_segments_legacy, - .flash_window_base =3D ASPEED_SOC_SMC_FLASH_BASE, - .flash_window_size =3D 0x6000000, - .features =3D 0x0, - .nregs =3D ASPEED_SMC_R_SMC_MAX, - .segment_to_reg =3D aspeed_smc_segment_to_reg, - .reg_to_segment =3D aspeed_smc_reg_to_segment, - .dma_ctrl =3D aspeed_smc_dma_ctrl, - }, { - .name =3D "aspeed.fmc-ast2400", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 5, - .segments =3D aspeed_segments_fmc, - .flash_window_base =3D ASPEED_SOC_FMC_FLASH_BASE, - .flash_window_size =3D 0x10000000, - .features =3D ASPEED_SMC_FEATURE_DMA, - .dma_flash_mask =3D 0x0FFFFFFC, - .dma_dram_mask =3D 0x1FFFFFFC, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_smc_segment_to_reg, - .reg_to_segment =3D aspeed_smc_reg_to_segment, - .dma_ctrl =3D aspeed_smc_dma_ctrl, - }, { - .name =3D "aspeed.spi1-ast2400", - .r_conf =3D R_SPI_CONF, - .r_ce_ctrl =3D 0xff, - .r_ctrl0 =3D R_SPI_CTRL0, - .r_timings =3D R_SPI_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D SPI_CONF_ENABLE_W0, - .max_peripherals =3D 1, - .segments =3D aspeed_segments_spi, - .flash_window_base =3D ASPEED_SOC_SPI_FLASH_BASE, - .flash_window_size =3D 0x10000000, - .features =3D 0x0, - .nregs =3D ASPEED_SMC_R_SPI_MAX, - .segment_to_reg =3D aspeed_smc_segment_to_reg, - .reg_to_segment =3D aspeed_smc_reg_to_segment, - .dma_ctrl =3D aspeed_smc_dma_ctrl, - }, { - .name =3D "aspeed.fmc-ast2500", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 3, - .segments =3D aspeed_segments_ast2500_fmc, - .flash_window_base =3D ASPEED_SOC_FMC_FLASH_BASE, - .flash_window_size =3D 0x10000000, - .features =3D ASPEED_SMC_FEATURE_DMA, - .dma_flash_mask =3D 0x0FFFFFFC, - .dma_dram_mask =3D 0x3FFFFFFC, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_smc_segment_to_reg, - .reg_to_segment =3D aspeed_smc_reg_to_segment, - .dma_ctrl =3D aspeed_smc_dma_ctrl, - }, { - .name =3D "aspeed.spi1-ast2500", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 2, - .segments =3D aspeed_segments_ast2500_spi1, - .flash_window_base =3D ASPEED_SOC_SPI_FLASH_BASE, - .flash_window_size =3D 0x8000000, - .features =3D 0x0, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_smc_segment_to_reg, - .reg_to_segment =3D aspeed_smc_reg_to_segment, - .dma_ctrl =3D aspeed_smc_dma_ctrl, - }, { - .name =3D "aspeed.spi2-ast2500", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 2, - .segments =3D aspeed_segments_ast2500_spi2, - .flash_window_base =3D ASPEED_SOC_SPI2_FLASH_BASE, - .flash_window_size =3D 0x8000000, - .features =3D 0x0, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_smc_segment_to_reg, - .reg_to_segment =3D aspeed_smc_reg_to_segment, - .dma_ctrl =3D aspeed_smc_dma_ctrl, - }, { - .name =3D "aspeed.fmc-ast2600", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 1, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 3, - .segments =3D aspeed_segments_ast2600_fmc, - .flash_window_base =3D ASPEED26_SOC_FMC_FLASH_BASE, - .flash_window_size =3D 0x10000000, - .features =3D ASPEED_SMC_FEATURE_DMA | - ASPEED_SMC_FEATURE_WDT_CONTROL, - .dma_flash_mask =3D 0x0FFFFFFC, - .dma_dram_mask =3D 0x3FFFFFFC, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_2600_smc_segment_to_reg, - .reg_to_segment =3D aspeed_2600_smc_reg_to_segment, - .dma_ctrl =3D aspeed_2600_smc_dma_ctrl, - }, { - .name =3D "aspeed.spi1-ast2600", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 2, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 2, - .segments =3D aspeed_segments_ast2600_spi1, - .flash_window_base =3D ASPEED26_SOC_SPI_FLASH_BASE, - .flash_window_size =3D 0x10000000, - .features =3D ASPEED_SMC_FEATURE_DMA | - ASPEED_SMC_FEATURE_DMA_GRANT, - .dma_flash_mask =3D 0x0FFFFFFC, - .dma_dram_mask =3D 0x3FFFFFFC, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_2600_smc_segment_to_reg, - .reg_to_segment =3D aspeed_2600_smc_reg_to_segment, - .dma_ctrl =3D aspeed_2600_smc_dma_ctrl, - }, { - .name =3D "aspeed.spi2-ast2600", - .r_conf =3D R_CONF, - .r_ce_ctrl =3D R_CE_CTRL, - .r_ctrl0 =3D R_CTRL0, - .r_timings =3D R_TIMINGS, - .nregs_timings =3D 3, - .conf_enable_w0 =3D CONF_ENABLE_W0, - .max_peripherals =3D 3, - .segments =3D aspeed_segments_ast2600_spi2, - .flash_window_base =3D ASPEED26_SOC_SPI2_FLASH_BASE, - .flash_window_size =3D 0x10000000, - .features =3D ASPEED_SMC_FEATURE_DMA | - ASPEED_SMC_FEATURE_DMA_GRANT, - .dma_flash_mask =3D 0x0FFFFFFC, - .dma_dram_mask =3D 0x3FFFFFFC, - .nregs =3D ASPEED_SMC_R_MAX, - .segment_to_reg =3D aspeed_2600_smc_segment_to_reg, - .reg_to_segment =3D aspeed_2600_smc_reg_to_segment, - .dma_ctrl =3D aspeed_2600_smc_dma_ctrl, - }, -}; - -/* - * The Segment Registers of the AST2400 and AST2500 have a 8MB - * unit. The address range of a flash SPI peripheral is encoded with - * absolute addresses which should be part of the overall controller - * window. - */ -static uint32_t aspeed_smc_segment_to_reg(const AspeedSMCState *s, - const AspeedSegments *seg) -{ - uint32_t reg =3D 0; - reg |=3D ((seg->addr >> 23) & SEG_START_MASK) << SEG_START_SHIFT; - reg |=3D (((seg->addr + seg->size) >> 23) & SEG_END_MASK) << SEG_END_S= HIFT; - return reg; -} - -static void aspeed_smc_reg_to_segment(const AspeedSMCState *s, - uint32_t reg, AspeedSegments *seg) -{ - seg->addr =3D ((reg >> SEG_START_SHIFT) & SEG_START_MASK) << 23; - seg->size =3D (((reg >> SEG_END_SHIFT) & SEG_END_MASK) << 23) - seg->a= ddr; -} - -/* - * The Segment Registers of the AST2600 have a 1MB unit. The address - * range of a flash SPI peripheral is encoded with offsets in the overall - * controller window. The previous SoC AST2400 and AST2500 used - * absolute addresses. Only bits [27:20] are relevant and the end - * address is an upper bound limit. - */ -#define AST2600_SEG_ADDR_MASK 0x0ff00000 - -static uint32_t aspeed_2600_smc_segment_to_reg(const AspeedSMCState *s, - const AspeedSegments *seg) +static inline bool aspeed_smc_has_dma(const AspeedSMCClass *asc) { - uint32_t reg =3D 0; - - /* Disabled segments have a nil register */ - if (!seg->size) { - return 0; - } - - reg |=3D (seg->addr & AST2600_SEG_ADDR_MASK) >> 16; /* start offset */ - reg |=3D (seg->addr + seg->size - 1) & AST2600_SEG_ADDR_MASK; /* end o= ffset */ - return reg; + return !!(asc->features & ASPEED_SMC_FEATURE_DMA); } =20 -static void aspeed_2600_smc_reg_to_segment(const AspeedSMCState *s, - uint32_t reg, AspeedSegments *s= eg) +static inline bool aspeed_smc_has_wdt_control(const AspeedSMCClass *asc) { - uint32_t start_offset =3D (reg << 16) & AST2600_SEG_ADDR_MASK; - uint32_t end_offset =3D reg & AST2600_SEG_ADDR_MASK; - - if (reg) { - seg->addr =3D s->ctrl->flash_window_base + start_offset; - seg->size =3D end_offset + MiB - start_offset; - } else { - seg->addr =3D s->ctrl->flash_window_base; - seg->size =3D 0; - } + return !!(asc->features & ASPEED_SMC_FEATURE_WDT_CONTROL); } =20 #define aspeed_smc_error(fmt, ...) \ @@ -520,15 +224,16 @@ static bool aspeed_smc_flash_overlap(const AspeedSMCS= tate *s, const AspeedSegments *new, int cs) { + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); AspeedSegments seg; int i; =20 - for (i =3D 0; i < s->ctrl->max_peripherals; i++) { + for (i =3D 0; i < asc->max_peripherals; i++) { if (i =3D=3D cs) { continue; } =20 - s->ctrl->reg_to_segment(s, s->regs[R_SEG_ADDR0 + i], &seg); + asc->reg_to_segment(s, s->regs[R_SEG_ADDR0 + i], &seg); =20 if (new->addr + new->size > seg.addr && new->addr < seg.addr + seg.size) { @@ -546,14 +251,15 @@ static bool aspeed_smc_flash_overlap(const AspeedSMCS= tate *s, static void aspeed_smc_flash_set_segment_region(AspeedSMCState *s, int cs, uint64_t regval) { + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); AspeedSMCFlash *fl =3D &s->flashes[cs]; AspeedSegments seg; =20 - s->ctrl->reg_to_segment(s, regval, &seg); + asc->reg_to_segment(s, regval, &seg); =20 memory_region_transaction_begin(); memory_region_set_size(&fl->mmio, seg.size); - memory_region_set_address(&fl->mmio, seg.addr - s->ctrl->flash_window_= base); + memory_region_set_address(&fl->mmio, seg.addr - asc->flash_window_base= ); memory_region_set_enabled(&fl->mmio, !!seg.size); memory_region_transaction_commit(); =20 @@ -563,40 +269,41 @@ static void aspeed_smc_flash_set_segment_region(Aspee= dSMCState *s, int cs, static void aspeed_smc_flash_set_segment(AspeedSMCState *s, int cs, uint64_t new) { + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); AspeedSegments seg; =20 - s->ctrl->reg_to_segment(s, new, &seg); + asc->reg_to_segment(s, new, &seg); =20 trace_aspeed_smc_flash_set_segment(cs, new, seg.addr, seg.addr + seg.s= ize); =20 /* The start address of CS0 is read-only */ - if (cs =3D=3D 0 && seg.addr !=3D s->ctrl->flash_window_base) { + if (cs =3D=3D 0 && seg.addr !=3D asc->flash_window_base) { aspeed_smc_error("Tried to change CS0 start address to 0x%" HWADDR_PRIx, seg.addr); - seg.addr =3D s->ctrl->flash_window_base; - new =3D s->ctrl->segment_to_reg(s, &seg); + seg.addr =3D asc->flash_window_base; + new =3D asc->segment_to_reg(s, &seg); } =20 /* * The end address of the AST2500 spi controllers is also * read-only. */ - if ((s->ctrl->segments =3D=3D aspeed_segments_ast2500_spi1 || - s->ctrl->segments =3D=3D aspeed_segments_ast2500_spi2) && - cs =3D=3D s->ctrl->max_peripherals && - seg.addr + seg.size !=3D s->ctrl->segments[cs].addr + - s->ctrl->segments[cs].size) { + if ((asc->segments =3D=3D aspeed_2500_spi1_segments || + asc->segments =3D=3D aspeed_2500_spi2_segments) && + cs =3D=3D asc->max_peripherals && + seg.addr + seg.size !=3D asc->segments[cs].addr + + asc->segments[cs].size) { aspeed_smc_error("Tried to change CS%d end address to 0x%" HWADDR_PRIx, cs, seg.addr + seg.size); - seg.size =3D s->ctrl->segments[cs].addr + s->ctrl->segments[cs].si= ze - + seg.size =3D asc->segments[cs].addr + asc->segments[cs].size - seg.addr; - new =3D s->ctrl->segment_to_reg(s, &seg); + new =3D asc->segment_to_reg(s, &seg); } =20 /* Keep the segment in the overall flash window */ if (seg.size && - (seg.addr + seg.size <=3D s->ctrl->flash_window_base || - seg.addr > s->ctrl->flash_window_base + s->ctrl->flash_window_siz= e)) { + (seg.addr + seg.size <=3D asc->flash_window_base || + seg.addr > asc->flash_window_base + asc->flash_window_size)) { aspeed_smc_error("new segment for CS%d is invalid : " "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]", cs, seg.addr, seg.addr + seg.size); @@ -681,8 +388,9 @@ static inline int aspeed_smc_flash_cmd(const AspeedSMCF= lash *fl) static inline int aspeed_smc_flash_is_4byte(const AspeedSMCFlash *fl) { const AspeedSMCState *s =3D fl->controller; + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); =20 - if (s->ctrl->segments =3D=3D aspeed_segments_spi) { + if (asc->segments =3D=3D aspeed_2400_spi1_segments) { return s->regs[s->r_ctrl0] & CTRL_AST2400_SPI_4BYTE; } else { return s->regs[s->r_ce_ctrl] & (1 << (CTRL_EXTENDED0 + fl->id)); @@ -712,9 +420,10 @@ static uint32_t aspeed_smc_check_segment_addr(const As= peedSMCFlash *fl, uint32_t addr) { const AspeedSMCState *s =3D fl->controller; + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); AspeedSegments seg; =20 - s->ctrl->reg_to_segment(s, s->regs[R_SEG_ADDR0 + fl->id], &seg); + asc->reg_to_segment(s, s->regs[R_SEG_ADDR0 + fl->id], &seg); if ((addr % seg.size) !=3D addr) { aspeed_smc_error("invalid address 0x%08x for CS%d segment : " "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]", @@ -974,6 +683,7 @@ static void aspeed_smc_flash_update_ctrl(AspeedSMCFlash= *fl, uint32_t value) static void aspeed_smc_reset(DeviceState *d) { AspeedSMCState *s =3D ASPEED_SMC(d); + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); int i; =20 memset(s->regs, 0, sizeof s->regs); @@ -985,13 +695,13 @@ static void aspeed_smc_reset(DeviceState *d) } =20 /* setup the default segment register values and regions for all */ - for (i =3D 0; i < s->ctrl->max_peripherals; ++i) { + for (i =3D 0; i < asc->max_peripherals; ++i) { aspeed_smc_flash_set_segment_region(s, i, - s->ctrl->segment_to_reg(s, &s->ctrl->segments[i])); + asc->segment_to_reg(s, &asc->segments[i])); } =20 /* HW strapping flash type for the AST2600 controllers */ - if (s->ctrl->segments =3D=3D aspeed_segments_ast2600_fmc) { + if (asc->segments =3D=3D aspeed_2600_fmc_segments) { /* flash type is fixed to SPI for all */ s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0); s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1); @@ -999,7 +709,7 @@ static void aspeed_smc_reset(DeviceState *d) } =20 /* HW strapping flash type for FMC controllers */ - if (s->ctrl->segments =3D=3D aspeed_segments_ast2500_fmc) { + if (asc->segments =3D=3D aspeed_2500_fmc_segments) { /* flash type is fixed to SPI for CE0 and CE1 */ s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0); s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1); @@ -1007,7 +717,7 @@ static void aspeed_smc_reset(DeviceState *d) =20 /* HW strapping for AST2400 FMC controllers (SCU70). Let's use the * configuration of the palmetto-bmc machine */ - if (s->ctrl->segments =3D=3D aspeed_segments_fmc) { + if (asc->segments =3D=3D aspeed_2400_fmc_segments) { s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0); } =20 @@ -1018,25 +728,26 @@ static void aspeed_smc_reset(DeviceState *d) static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int si= ze) { AspeedSMCState *s =3D ASPEED_SMC(opaque); + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(opaque); =20 addr >>=3D 2; =20 if (addr =3D=3D s->r_conf || (addr >=3D s->r_timings && - addr < s->r_timings + s->ctrl->nregs_timings) || + addr < s->r_timings + asc->nregs_timings) || addr =3D=3D s->r_ce_ctrl || addr =3D=3D R_CE_CMD_CTRL || addr =3D=3D R_INTR_CTRL || addr =3D=3D R_DUMMY_DATA || - (aspeed_smc_has_wdt_control(s) && addr =3D=3D R_FMC_WDT2_CTRL) || - (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_CTRL) || - (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_FLASH_ADDR) || - (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_DRAM_ADDR) || - (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_LEN) || - (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_CHECKSUM) || + (aspeed_smc_has_wdt_control(asc) && addr =3D=3D R_FMC_WDT2_CTRL) || + (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_CTRL) || + (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_FLASH_ADDR) || + (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_DRAM_ADDR) || + (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_LEN) || + (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_CHECKSUM) || (addr >=3D R_SEG_ADDR0 && - addr < R_SEG_ADDR0 + s->ctrl->max_peripherals) || - (addr >=3D s->r_ctrl0 && addr < s->r_ctrl0 + s->ctrl->max_peripher= als)) { + addr < R_SEG_ADDR0 + asc->max_peripherals) || + (addr >=3D s->r_ctrl0 && addr < s->r_ctrl0 + asc->max_peripherals)= ) { =20 trace_aspeed_smc_read(addr, size, s->regs[addr]); =20 @@ -1292,7 +1003,9 @@ static void aspeed_smc_dma_ctrl(AspeedSMCState *s, ui= nt32_t dma_ctrl) =20 static inline bool aspeed_smc_dma_granted(AspeedSMCState *s) { - if (!(s->ctrl->features & ASPEED_SMC_FEATURE_DMA_GRANT)) { + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); + + if (!(asc->features & ASPEED_SMC_FEATURE_DMA_GRANT)) { return true; } =20 @@ -1334,6 +1047,7 @@ static void aspeed_smc_write(void *opaque, hwaddr add= r, uint64_t data, unsigned int size) { AspeedSMCState *s =3D ASPEED_SMC(opaque); + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); uint32_t value =3D data; =20 addr >>=3D 2; @@ -1342,14 +1056,14 @@ static void aspeed_smc_write(void *opaque, hwaddr a= ddr, uint64_t data, =20 if (addr =3D=3D s->r_conf || (addr >=3D s->r_timings && - addr < s->r_timings + s->ctrl->nregs_timings) || + addr < s->r_timings + asc->nregs_timings) || addr =3D=3D s->r_ce_ctrl) { s->regs[addr] =3D value; } else if (addr >=3D s->r_ctrl0 && addr < s->r_ctrl0 + s->num_cs) { int cs =3D addr - s->r_ctrl0; aspeed_smc_flash_update_ctrl(&s->flashes[cs], value); } else if (addr >=3D R_SEG_ADDR0 && - addr < R_SEG_ADDR0 + s->ctrl->max_peripherals) { + addr < R_SEG_ADDR0 + asc->max_peripherals) { int cs =3D addr - R_SEG_ADDR0; =20 if (value !=3D s->regs[R_SEG_ADDR0 + cs]) { @@ -1359,19 +1073,19 @@ static void aspeed_smc_write(void *opaque, hwaddr a= ddr, uint64_t data, s->regs[addr] =3D value & 0xff; } else if (addr =3D=3D R_DUMMY_DATA) { s->regs[addr] =3D value & 0xff; - } else if (aspeed_smc_has_wdt_control(s) && addr =3D=3D R_FMC_WDT2_CTR= L) { + } else if (aspeed_smc_has_wdt_control(asc) && addr =3D=3D R_FMC_WDT2_C= TRL) { s->regs[addr] =3D value & FMC_WDT2_CTRL_EN; } else if (addr =3D=3D R_INTR_CTRL) { s->regs[addr] =3D value; - } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_CTRL) { - s->ctrl->dma_ctrl(s, value); - } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_DRAM_ADDR && + } else if (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_CTRL) { + asc->dma_ctrl(s, value); + } else if (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_DRAM_ADDR && aspeed_smc_dma_granted(s)) { - s->regs[addr] =3D DMA_DRAM_ADDR(s, value); - } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_FLASH_ADDR && + s->regs[addr] =3D DMA_DRAM_ADDR(asc, value); + } else if (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_FLASH_ADDR && aspeed_smc_dma_granted(s)) { - s->regs[addr] =3D DMA_FLASH_ADDR(s, value); - } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_LEN && + s->regs[addr] =3D DMA_FLASH_ADDR(asc, value); + } else if (aspeed_smc_has_dma(asc) && addr =3D=3D R_DMA_LEN && aspeed_smc_dma_granted(s)) { s->regs[addr] =3D DMA_LENGTH(value); } else { @@ -1407,24 +1121,22 @@ static void aspeed_smc_realize(DeviceState *dev, Er= ror **errp) { SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); AspeedSMCState *s =3D ASPEED_SMC(dev); - AspeedSMCClass *mc =3D ASPEED_SMC_GET_CLASS(s); + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); int i; char name[32]; hwaddr offset =3D 0; =20 - s->ctrl =3D mc->ctrl; - /* keep a copy under AspeedSMCState to speed up accesses */ - s->r_conf =3D s->ctrl->r_conf; - s->r_ce_ctrl =3D s->ctrl->r_ce_ctrl; - s->r_ctrl0 =3D s->ctrl->r_ctrl0; - s->r_timings =3D s->ctrl->r_timings; - s->conf_enable_w0 =3D s->ctrl->conf_enable_w0; + s->r_conf =3D asc->r_conf; + s->r_ce_ctrl =3D asc->r_ce_ctrl; + s->r_ctrl0 =3D asc->r_ctrl0; + s->r_timings =3D asc->r_timings; + s->conf_enable_w0 =3D asc->conf_enable_w0; =20 /* Enforce some real HW limits */ - if (s->num_cs > s->ctrl->max_peripherals) { - aspeed_smc_error("num_cs cannot exceed: %d", s->ctrl->max_peripher= als); - s->num_cs =3D s->ctrl->max_peripherals; + if (s->num_cs > asc->max_peripherals) { + aspeed_smc_error("num_cs cannot exceed: %d", asc->max_peripherals); + s->num_cs =3D asc->max_peripherals; } =20 /* DMA irq. Keep it first for the initialization in the SoC */ @@ -1441,7 +1153,7 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) =20 /* The memory region for the controller registers */ memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_ops, s, - TYPE_ASPEED_SMC, s->ctrl->nregs * 4); + TYPE_ASPEED_SMC, asc->nregs * 4); sysbus_init_mmio(sbd, &s->mmio); =20 /* @@ -1452,13 +1164,13 @@ static void aspeed_smc_realize(DeviceState *dev, Er= ror **errp) memory_region_init_io(&s->mmio_flash, OBJECT(s), &aspeed_smc_flash_default_ops, s, TYPE_ASPEED_SMC ".flash", - s->ctrl->flash_window_size); + asc->flash_window_size); memory_region_init_alias(&s->mmio_flash_alias, OBJECT(s), TYPE_ASPEED_SMC ".flash", - &s->mmio_flash, 0, s->ctrl->flash_window_size= ); + &s->mmio_flash, 0, asc->flash_window_size); sysbus_init_mmio(sbd, &s->mmio_flash_alias); =20 - s->flashes =3D g_new0(AspeedSMCFlash, s->ctrl->max_peripherals); + s->flashes =3D g_new0(AspeedSMCFlash, asc->max_peripherals); =20 /* * Let's create a sub memory region for each possible peripheral. All @@ -1467,14 +1179,14 @@ static void aspeed_smc_realize(DeviceState *dev, Er= ror **errp) * module behind to handle the memory accesses. This depends on * the board configuration. */ - for (i =3D 0; i < s->ctrl->max_peripherals; ++i) { + for (i =3D 0; i < asc->max_peripherals; ++i) { AspeedSMCFlash *fl =3D &s->flashes[i]; =20 snprintf(name, sizeof(name), TYPE_ASPEED_SMC ".flash.%d", i); =20 fl->id =3D i; fl->controller =3D s; - fl->size =3D s->ctrl->segments[i].size; + fl->size =3D asc->segments[i].size; memory_region_init_io(&fl->mmio, OBJECT(s), &aspeed_smc_flash_ops, fl, name, fl->size); memory_region_add_subregion(&s->mmio_flash, offset, &fl->mmio); @@ -1482,7 +1194,7 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) } =20 /* DMA support */ - if (aspeed_smc_has_dma(s)) { + if (aspeed_smc_has_dma(asc)) { aspeed_smc_dma_setup(s, errp); } } @@ -1510,13 +1222,11 @@ static Property aspeed_smc_properties[] =3D { static void aspeed_smc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - AspeedSMCClass *mc =3D ASPEED_SMC_CLASS(klass); =20 dc->realize =3D aspeed_smc_realize; dc->reset =3D aspeed_smc_reset; device_class_set_props(dc, aspeed_smc_properties); dc->vmsd =3D &vmstate_aspeed_smc; - mc->ctrl =3D data; } =20 static const TypeInfo aspeed_smc_info =3D { @@ -1524,23 +1234,408 @@ static const TypeInfo aspeed_smc_info =3D { .parent =3D TYPE_SYS_BUS_DEVICE, .instance_size =3D sizeof(AspeedSMCState), .class_size =3D sizeof(AspeedSMCClass), + .class_init =3D aspeed_smc_class_init, .abstract =3D true, }; =20 -static void aspeed_smc_register_types(void) + +/* + * The Segment Registers of the AST2400 and AST2500 have a 8MB + * unit. The address range of a flash SPI peripheral is encoded with + * absolute addresses which should be part of the overall controller + * window. + */ +static uint32_t aspeed_smc_segment_to_reg(const AspeedSMCState *s, + const AspeedSegments *seg) { - int i; + uint32_t reg =3D 0; + reg |=3D ((seg->addr >> 23) & SEG_START_MASK) << SEG_START_SHIFT; + reg |=3D (((seg->addr + seg->size) >> 23) & SEG_END_MASK) << SEG_END_S= HIFT; + return reg; +} =20 - type_register_static(&aspeed_smc_info); - for (i =3D 0; i < ARRAY_SIZE(controllers); ++i) { - TypeInfo ti =3D { - .name =3D controllers[i].name, - .parent =3D TYPE_ASPEED_SMC, - .class_init =3D aspeed_smc_class_init, - .class_data =3D (void *)&controllers[i], - }; - type_register(&ti); +static void aspeed_smc_reg_to_segment(const AspeedSMCState *s, + uint32_t reg, AspeedSegments *seg) +{ + seg->addr =3D ((reg >> SEG_START_SHIFT) & SEG_START_MASK) << 23; + seg->size =3D (((reg >> SEG_END_SHIFT) & SEG_END_MASK) << 23) - seg->a= ddr; +} + +static const AspeedSegments aspeed_2400_smc_segments[] =3D { + { 0x10000000, 32 * MiB }, +}; + +static void aspeed_2400_smc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2400 SMC Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 1; + asc->segments =3D aspeed_2400_smc_segments; + asc->flash_window_base =3D 0x10000000; + asc->flash_window_size =3D 0x6000000; + asc->features =3D 0x0; + asc->nregs =3D ASPEED_SMC_R_SMC_MAX; + asc->segment_to_reg =3D aspeed_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2400_smc_info =3D { + .name =3D "aspeed.smc-ast2400", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2400_smc_class_init, +}; + +static const AspeedSegments aspeed_2400_fmc_segments[] =3D { + { 0x20000000, 64 * MiB }, /* start address is readonly */ + { 0x24000000, 32 * MiB }, + { 0x26000000, 32 * MiB }, + { 0x28000000, 32 * MiB }, + { 0x2A000000, 32 * MiB } +}; + +static void aspeed_2400_fmc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2400 FMC Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 5; + asc->segments =3D aspeed_2400_fmc_segments; + asc->flash_window_base =3D 0x20000000; + asc->flash_window_size =3D 0x10000000; + asc->features =3D ASPEED_SMC_FEATURE_DMA; + asc->dma_flash_mask =3D 0x0FFFFFFC; + asc->dma_dram_mask =3D 0x1FFFFFFC; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2400_fmc_info =3D { + .name =3D "aspeed.fmc-ast2400", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2400_fmc_class_init, +}; + +static const AspeedSegments aspeed_2400_spi1_segments[] =3D { + { 0x30000000, 64 * MiB }, +}; + +static void aspeed_2400_spi1_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2400 SPI1 Controller"; + asc->r_conf =3D R_SPI_CONF; + asc->r_ce_ctrl =3D 0xff; + asc->r_ctrl0 =3D R_SPI_CTRL0; + asc->r_timings =3D R_SPI_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D SPI_CONF_ENABLE_W0; + asc->max_peripherals =3D 1; + asc->segments =3D aspeed_2400_spi1_segments; + asc->flash_window_base =3D 0x30000000; + asc->flash_window_size =3D 0x10000000; + asc->features =3D 0x0; + asc->nregs =3D ASPEED_SMC_R_SPI_MAX; + asc->segment_to_reg =3D aspeed_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2400_spi1_info =3D { + .name =3D "aspeed.spi1-ast2400", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2400_spi1_class_init, +}; + +static const AspeedSegments aspeed_2500_fmc_segments[] =3D { + { 0x20000000, 128 * MiB }, /* start address is readonly */ + { 0x28000000, 32 * MiB }, + { 0x2A000000, 32 * MiB }, +}; + +static void aspeed_2500_fmc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2600 FMC Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 3; + asc->segments =3D aspeed_2500_fmc_segments; + asc->flash_window_base =3D 0x20000000; + asc->flash_window_size =3D 0x10000000; + asc->features =3D ASPEED_SMC_FEATURE_DMA; + asc->dma_flash_mask =3D 0x0FFFFFFC; + asc->dma_dram_mask =3D 0x3FFFFFFC; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2500_fmc_info =3D { + .name =3D "aspeed.fmc-ast2500", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2500_fmc_class_init, +}; + +static const AspeedSegments aspeed_2500_spi1_segments[] =3D { + { 0x30000000, 32 * MiB }, /* start address is readonly */ + { 0x32000000, 96 * MiB }, /* end address is readonly */ +}; + +static void aspeed_2500_spi1_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2600 SPI1 Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 2; + asc->segments =3D aspeed_2500_spi1_segments; + asc->flash_window_base =3D 0x30000000; + asc->flash_window_size =3D 0x8000000; + asc->features =3D 0x0; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2500_spi1_info =3D { + .name =3D "aspeed.spi1-ast2500", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2500_spi1_class_init, +}; + +static const AspeedSegments aspeed_2500_spi2_segments[] =3D { + { 0x38000000, 32 * MiB }, /* start address is readonly */ + { 0x3A000000, 96 * MiB }, /* end address is readonly */ +}; + +static void aspeed_2500_spi2_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2600 SPI2 Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 2; + asc->segments =3D aspeed_2500_spi2_segments; + asc->flash_window_base =3D 0x38000000; + asc->flash_window_size =3D 0x8000000; + asc->features =3D 0x0; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2500_spi2_info =3D { + .name =3D "aspeed.spi2-ast2500", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2500_spi2_class_init, +}; + +/* + * The Segment Registers of the AST2600 have a 1MB unit. The address + * range of a flash SPI peripheral is encoded with offsets in the overall + * controller window. The previous SoC AST2400 and AST2500 used + * absolute addresses. Only bits [27:20] are relevant and the end + * address is an upper bound limit. + */ +#define AST2600_SEG_ADDR_MASK 0x0ff00000 + +static uint32_t aspeed_2600_smc_segment_to_reg(const AspeedSMCState *s, + const AspeedSegments *seg) +{ + uint32_t reg =3D 0; + + /* Disabled segments have a nil register */ + if (!seg->size) { + return 0; + } + + reg |=3D (seg->addr & AST2600_SEG_ADDR_MASK) >> 16; /* start offset */ + reg |=3D (seg->addr + seg->size - 1) & AST2600_SEG_ADDR_MASK; /* end o= ffset */ + return reg; +} + +static void aspeed_2600_smc_reg_to_segment(const AspeedSMCState *s, + uint32_t reg, AspeedSegments *s= eg) +{ + uint32_t start_offset =3D (reg << 16) & AST2600_SEG_ADDR_MASK; + uint32_t end_offset =3D reg & AST2600_SEG_ADDR_MASK; + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); + + if (reg) { + seg->addr =3D asc->flash_window_base + start_offset; + seg->size =3D end_offset + MiB - start_offset; + } else { + seg->addr =3D asc->flash_window_base; + seg->size =3D 0; } } =20 +static const AspeedSegments aspeed_2600_fmc_segments[] =3D { + { 0x0, 128 * MiB }, /* start address is readonly */ + { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kerne= l */ + { 0x0, 0 }, /* disabled */ +}; + +static void aspeed_2600_fmc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2600 FMC Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 1; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 3; + asc->segments =3D aspeed_2600_fmc_segments; + asc->flash_window_base =3D 0x20000000; + asc->flash_window_size =3D 0x10000000; + asc->features =3D ASPEED_SMC_FEATURE_DMA | + ASPEED_SMC_FEATURE_WDT_CONTROL; + asc->dma_flash_mask =3D 0x0FFFFFFC; + asc->dma_dram_mask =3D 0x3FFFFFFC; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_2600_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_2600_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_2600_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2600_fmc_info =3D { + .name =3D "aspeed.fmc-ast2600", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2600_fmc_class_init, +}; + +static const AspeedSegments aspeed_2600_spi1_segments[] =3D { + { 0x0, 128 * MiB }, /* start address is readonly */ + { 0x0, 0 }, /* disabled */ +}; + +static void aspeed_2600_spi1_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2600 SPI1 Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 2; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 2; + asc->segments =3D aspeed_2600_spi1_segments; + asc->flash_window_base =3D 0x30000000; + asc->flash_window_size =3D 0x10000000; + asc->features =3D ASPEED_SMC_FEATURE_DMA | + ASPEED_SMC_FEATURE_DMA_GRANT; + asc->dma_flash_mask =3D 0x0FFFFFFC; + asc->dma_dram_mask =3D 0x3FFFFFFC; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_2600_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_2600_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_2600_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2600_spi1_info =3D { + .name =3D "aspeed.spi1-ast2600", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2600_spi1_class_init, +}; + +static const AspeedSegments aspeed_2600_spi2_segments[] =3D { + { 0x0, 128 * MiB }, /* start address is readonly */ + { 0x0, 0 }, /* disabled */ + { 0x0, 0 }, /* disabled */ +}; + +static void aspeed_2600_spi2_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSMCClass *asc =3D ASPEED_SMC_CLASS(klass); + + dc->desc =3D "Aspeed 2600 SPI2 Controller"; + asc->r_conf =3D R_CONF; + asc->r_ce_ctrl =3D R_CE_CTRL; + asc->r_ctrl0 =3D R_CTRL0; + asc->r_timings =3D R_TIMINGS; + asc->nregs_timings =3D 3; + asc->conf_enable_w0 =3D CONF_ENABLE_W0; + asc->max_peripherals =3D 3; + asc->segments =3D aspeed_2600_spi2_segments; + asc->flash_window_base =3D 0x50000000; + asc->flash_window_size =3D 0x10000000; + asc->features =3D ASPEED_SMC_FEATURE_DMA | + ASPEED_SMC_FEATURE_DMA_GRANT; + asc->dma_flash_mask =3D 0x0FFFFFFC; + asc->dma_dram_mask =3D 0x3FFFFFFC; + asc->nregs =3D ASPEED_SMC_R_MAX; + asc->segment_to_reg =3D aspeed_2600_smc_segment_to_reg; + asc->reg_to_segment =3D aspeed_2600_smc_reg_to_segment; + asc->dma_ctrl =3D aspeed_2600_smc_dma_ctrl; +} + +static const TypeInfo aspeed_2600_spi2_info =3D { + .name =3D "aspeed.spi2-ast2600", + .parent =3D TYPE_ASPEED_SMC, + .class_init =3D aspeed_2600_spi2_class_init, +}; + +static void aspeed_smc_register_types(void) +{ + type_register_static(&aspeed_smc_info); + type_register_static(&aspeed_2400_smc_info); + type_register_static(&aspeed_2400_fmc_info); + type_register_static(&aspeed_2400_spi1_info); + type_register_static(&aspeed_2500_fmc_info); + type_register_static(&aspeed_2500_spi1_info); + type_register_static(&aspeed_2500_spi2_info); + type_register_static(&aspeed_2600_fmc_info); + type_register_static(&aspeed_2600_spi1_info); + type_register_static(&aspeed_2600_spi2_info); +} + type_init(aspeed_smc_register_types) --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155595709248.93147256368843; Mon, 20 Sep 2021 09:33:15 -0700 (PDT) Received: from localhost ([::1]:42112 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMED-0005Vd-L2 for importer@patchew.org; Mon, 20 Sep 2021 12:33:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38052) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4i-0005qh-8d for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:24 -0400 Received: from 7.mo552.mail-out.ovh.net ([188.165.59.253]:39737) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4Z-0004BP-Aw for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:22 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.1.249]) by mo552.mail-out.ovh.net (Postfix) with ESMTPS id ABE242137B; Mon, 20 Sep 2021 16:23:13 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:12 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G005a54649a1-781e-46ce-bb71-77e61d2df4a1, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 05/12] aspeed/smc: Remove the 'flash' attribute from AspeedSMCFlash Date: Mon, 20 Sep 2021 18:23:02 +0200 Message-ID: <20210920162309.1091711-6-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 05f2b684-835e-4125-b4a7-0f3918864506 X-Ovh-Tracer-Id: 13074231196256734057 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=188.165.59.253; envelope-from=clg@kaod.org; helo=7.mo552.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, qemu-arm@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155597309100001 There is no need to keep a reference of the flash qdev in the AspeedSMCFlash state: the SPI bus takes ownership and will release its resources. Remove AspeedSMCFlash::flash. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 1 - hw/arm/aspeed.c | 11 +++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 0ea536a44c3a..f32f66f9a838 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -37,7 +37,6 @@ typedef struct AspeedSMCFlash { uint32_t size; =20 MemoryRegion mmio; - DeviceState *flash; } AspeedSMCFlash; =20 #define TYPE_ASPEED_SMC "aspeed.smc" diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index ba5f1dc5af78..854413594d9e 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -274,18 +274,17 @@ static void aspeed_board_init_flashes(AspeedSMCState = *s, int i ; =20 for (i =3D 0; i < s->num_cs; ++i) { - AspeedSMCFlash *fl =3D &s->flashes[i]; DriveInfo *dinfo =3D drive_get_next(IF_MTD); qemu_irq cs_line; + DeviceState *dev; =20 - fl->flash =3D qdev_new(flashtype); + dev =3D qdev_new(flashtype); if (dinfo) { - qdev_prop_set_drive(fl->flash, "drive", - blk_by_legacy_dinfo(dinfo)); + qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); } - qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal); + qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); =20 - cs_line =3D qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0); + cs_line =3D qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0); sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line); } } --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 163215537263442.28054853176775; Mon, 20 Sep 2021 09:29:32 -0700 (PDT) Received: from localhost ([::1]:33574 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMAd-00088p-L6 for importer@patchew.org; Mon, 20 Sep 2021 12:29:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38058) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4h-0005rQ-KE for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:23 -0400 Received: from 7.mo552.mail-out.ovh.net ([188.165.59.253]:56647) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4Z-0004BV-Bi for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:23 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.1.249]) by mo552.mail-out.ovh.net (Postfix) with ESMTPS id C23C521105; Mon, 20 Sep 2021 16:23:13 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:13 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G00590717bd4-180c-44fb-8f52-d5f1a4ed08fa, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 06/12] aspeed/smc: Remove the 'size' attribute from AspeedSMCFlash Date: Mon, 20 Sep 2021 18:23:03 +0200 Message-ID: <20210920162309.1091711-7-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 06b2bcb9-70d4-45cd-a79a-798bb240de83 X-Ovh-Tracer-Id: 13074231196813462377 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=188.165.59.253; envelope-from=clg@kaod.org; helo=7.mo552.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, qemu-arm@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155374982100001 AspeedSMCFlash::size is only used to compute the initial size of the boot_rom region. Not very useful, so directly call memory_region_size() instead. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 1 - hw/arm/aspeed.c | 7 ++++--- hw/ssi/aspeed_smc.c | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index f32f66f9a838..097bb6aaf5f8 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -34,7 +34,6 @@ typedef struct AspeedSMCFlash { struct AspeedSMCState *controller; =20 uint8_t id; - uint32_t size; =20 MemoryRegion mmio; } AspeedSMCFlash; diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index 854413594d9e..f5916e81262e 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -376,6 +376,7 @@ static void aspeed_machine_init(MachineState *machine) if (drive0) { AspeedSMCFlash *fl =3D &bmc->soc.fmc.flashes[0]; MemoryRegion *boot_rom =3D g_new(MemoryRegion, 1); + uint64_t size =3D memory_region_size(&fl->mmio); =20 /* * create a ROM region using the default mapping window size of @@ -385,15 +386,15 @@ static void aspeed_machine_init(MachineState *machine) */ if (ASPEED_MACHINE(machine)->mmio_exec) { memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom", - &fl->mmio, 0, fl->size); + &fl->mmio, 0, size); memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, boot_rom); } else { memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", - fl->size, &error_abort); + size, &error_abort); memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, boot_rom); - write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort); + write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort); } } =20 diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 5466be631719..3e4221311a6d 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -1186,11 +1186,10 @@ static void aspeed_smc_realize(DeviceState *dev, Er= ror **errp) =20 fl->id =3D i; fl->controller =3D s; - fl->size =3D asc->segments[i].size; memory_region_init_io(&fl->mmio, OBJECT(s), &aspeed_smc_flash_ops, - fl, name, fl->size); + fl, name, asc->segments[i].size); memory_region_add_subregion(&s->mmio_flash, offset, &fl->mmio); - offset +=3D fl->size; + offset +=3D asc->segments[i].size; } =20 /* DMA support */ --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155579005619.1909775809148; Mon, 20 Sep 2021 09:32:59 -0700 (PDT) Received: from localhost ([::1]:40706 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMDx-0004aJ-HJ for importer@patchew.org; Mon, 20 Sep 2021 12:32:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38118) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4l-0005uz-At for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:27 -0400 Received: from 10.mo552.mail-out.ovh.net ([87.98.187.244]:56415) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4d-0004Bg-FP for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:27 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.109.146.192]) by mo552.mail-out.ovh.net (Postfix) with ESMTPS id 2B2E1213B0; Mon, 20 Sep 2021 16:23:14 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:13 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G005adb3a144-8670-4a23-b90c-a67901b758a0, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 07/12] aspeed/smc: Rename AspeedSMCFlash 'id' to 'cs' Date: Mon, 20 Sep 2021 18:23:04 +0200 Message-ID: <20210920162309.1091711-8-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 2bcbb34e-da4f-4bdc-950c-6a3026f73f6d X-Ovh-Tracer-Id: 13074231194286984041 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=87.98.187.244; envelope-from=clg@kaod.org; helo=10.mo552.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, qemu-arm@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155581196100003 'cs' is a more appropriate name to index SPI flash devices. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 2 +- hw/ssi/aspeed_smc.c | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 097bb6aaf5f8..40b6926b3e02 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -33,7 +33,7 @@ struct AspeedSMCState; typedef struct AspeedSMCFlash { struct AspeedSMCState *controller; =20 - uint8_t id; + uint8_t cs; =20 MemoryRegion mmio; } AspeedSMCFlash; diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 3e4221311a6d..643cde832396 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -352,20 +352,20 @@ static inline int aspeed_smc_flash_mode(const AspeedS= MCFlash *fl) { const AspeedSMCState *s =3D fl->controller; =20 - return s->regs[s->r_ctrl0 + fl->id] & CTRL_CMD_MODE_MASK; + return s->regs[s->r_ctrl0 + fl->cs] & CTRL_CMD_MODE_MASK; } =20 static inline bool aspeed_smc_is_writable(const AspeedSMCFlash *fl) { const AspeedSMCState *s =3D fl->controller; =20 - return s->regs[s->r_conf] & (1 << (s->conf_enable_w0 + fl->id)); + return s->regs[s->r_conf] & (1 << (s->conf_enable_w0 + fl->cs)); } =20 static inline int aspeed_smc_flash_cmd(const AspeedSMCFlash *fl) { const AspeedSMCState *s =3D fl->controller; - int cmd =3D (s->regs[s->r_ctrl0 + fl->id] >> CTRL_CMD_SHIFT) & CTRL_CM= D_MASK; + int cmd =3D (s->regs[s->r_ctrl0 + fl->cs] >> CTRL_CMD_SHIFT) & CTRL_CM= D_MASK; =20 /* * In read mode, the default SPI command is READ (0x3). In other @@ -393,7 +393,7 @@ static inline int aspeed_smc_flash_is_4byte(const Aspee= dSMCFlash *fl) if (asc->segments =3D=3D aspeed_2400_spi1_segments) { return s->regs[s->r_ctrl0] & CTRL_AST2400_SPI_4BYTE; } else { - return s->regs[s->r_ce_ctrl] & (1 << (CTRL_EXTENDED0 + fl->id)); + return s->regs[s->r_ce_ctrl] & (1 << (CTRL_EXTENDED0 + fl->cs)); } } =20 @@ -401,9 +401,9 @@ static void aspeed_smc_flash_do_select(AspeedSMCFlash *= fl, bool unselect) { AspeedSMCState *s =3D fl->controller; =20 - trace_aspeed_smc_flash_select(fl->id, unselect ? "un" : ""); + trace_aspeed_smc_flash_select(fl->cs, unselect ? "un" : ""); =20 - qemu_set_irq(s->cs_lines[fl->id], unselect); + qemu_set_irq(s->cs_lines[fl->cs], unselect); } =20 static void aspeed_smc_flash_select(AspeedSMCFlash *fl) @@ -423,11 +423,11 @@ static uint32_t aspeed_smc_check_segment_addr(const A= speedSMCFlash *fl, AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); AspeedSegments seg; =20 - asc->reg_to_segment(s, s->regs[R_SEG_ADDR0 + fl->id], &seg); + asc->reg_to_segment(s, s->regs[R_SEG_ADDR0 + fl->cs], &seg); if ((addr % seg.size) !=3D addr) { aspeed_smc_error("invalid address 0x%08x for CS%d segment : " "[ 0x%"HWADDR_PRIx" - 0x%"HWADDR_PRIx" ]", - addr, fl->id, seg.addr, seg.addr + seg.size); + addr, fl->cs, seg.addr, seg.addr + seg.size); addr %=3D seg.size; } =20 @@ -437,7 +437,7 @@ static uint32_t aspeed_smc_check_segment_addr(const Asp= eedSMCFlash *fl, static int aspeed_smc_flash_dummies(const AspeedSMCFlash *fl) { const AspeedSMCState *s =3D fl->controller; - uint32_t r_ctrl0 =3D s->regs[s->r_ctrl0 + fl->id]; + uint32_t r_ctrl0 =3D s->regs[s->r_ctrl0 + fl->cs]; uint32_t dummy_high =3D (r_ctrl0 >> CTRL_DUMMY_HIGH_SHIFT) & 0x1; uint32_t dummy_low =3D (r_ctrl0 >> CTRL_DUMMY_LOW_SHIFT) & 0x3; uint32_t dummies =3D ((dummy_high << 2) | dummy_low) * 8; @@ -506,7 +506,7 @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwa= ddr addr, unsigned size) aspeed_smc_error("invalid flash mode %d", aspeed_smc_flash_mode(fl= )); } =20 - trace_aspeed_smc_flash_read(fl->id, addr, size, ret, + trace_aspeed_smc_flash_read(fl->cs, addr, size, ret, aspeed_smc_flash_mode(fl)); return ret; } @@ -563,7 +563,7 @@ static bool aspeed_smc_do_snoop(AspeedSMCFlash *fl, ui= nt64_t data, AspeedSMCState *s =3D fl->controller; uint8_t addr_width =3D aspeed_smc_flash_is_4byte(fl) ? 4 : 3; =20 - trace_aspeed_smc_do_snoop(fl->id, s->snoop_index, s->snoop_dummies, + trace_aspeed_smc_do_snoop(fl->cs, s->snoop_index, s->snoop_dummies, (uint8_t) data & 0xff); =20 if (s->snoop_index =3D=3D SNOOP_OFF) { @@ -616,7 +616,7 @@ static void aspeed_smc_flash_write(void *opaque, hwaddr= addr, uint64_t data, AspeedSMCState *s =3D fl->controller; int i; =20 - trace_aspeed_smc_flash_write(fl->id, addr, size, data, + trace_aspeed_smc_flash_write(fl->cs, addr, size, data, aspeed_smc_flash_mode(fl)); =20 if (!aspeed_smc_is_writable(fl)) { @@ -668,12 +668,12 @@ static void aspeed_smc_flash_update_ctrl(AspeedSMCFla= sh *fl, uint32_t value) unselect =3D (value & CTRL_CMD_MODE_MASK) !=3D CTRL_USERMODE; =20 /* A change of CTRL_CE_STOP_ACTIVE from 0 to 1, unselects the CS */ - if (!(s->regs[s->r_ctrl0 + fl->id] & CTRL_CE_STOP_ACTIVE) && + if (!(s->regs[s->r_ctrl0 + fl->cs] & CTRL_CE_STOP_ACTIVE) && value & CTRL_CE_STOP_ACTIVE) { unselect =3D true; } =20 - s->regs[s->r_ctrl0 + fl->id] =3D value; + s->regs[s->r_ctrl0 + fl->cs] =3D value; =20 s->snoop_index =3D unselect ? SNOOP_OFF : SNOOP_START; =20 @@ -1184,7 +1184,7 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) =20 snprintf(name, sizeof(name), TYPE_ASPEED_SMC ".flash.%d", i); =20 - fl->id =3D i; + fl->cs =3D i; fl->controller =3D s; memory_region_init_io(&fl->mmio, OBJECT(s), &aspeed_smc_flash_ops, fl, name, asc->segments[i].size); --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155834556109.9576477386255; Mon, 20 Sep 2021 09:37:14 -0700 (PDT) Received: from localhost ([::1]:50776 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMI5-0002xh-G3 for importer@patchew.org; Mon, 20 Sep 2021 12:37:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38176) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4n-0005xL-PY for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:31 -0400 Received: from smtpout2.3005.mail-out.ovh.net ([46.105.54.81]:47975) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4e-0004EM-TN for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:29 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.4.35]) by mo3005.mail-out.ovh.net (Postfix) with ESMTPS id 978FF13EB74; Mon, 20 Sep 2021 16:23:14 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:14 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G005443192fb-46cc-46b1-80d7-f42416cfffd5, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 08/12] aspeed/smc: QOMify AspeedSMCFlash Date: Mon, 20 Sep 2021 18:23:05 +0200 Message-ID: <20210920162309.1091711-9-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 4030b99e-b178-4fba-91bb-cc0f443a69fb X-Ovh-Tracer-Id: 13074512671625087849 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=46.105.54.81; envelope-from=clg@kaod.org; helo=smtpout2.3005.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, qemu-arm@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155835559100001 AspeedSMCFlash is a small structure representing the AHB memory window through which the contents of a flash device can be accessed with MMIOs. Introduce an AspeedSMCFlash SysBusDevice model and attach the associated memory region to the newly instantiated objects. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 13 +++++-- hw/ssi/aspeed_smc.c | 76 +++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 12 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 40b6926b3e02..ee943228b96f 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -30,18 +30,23 @@ #include "qom/object.h" =20 struct AspeedSMCState; -typedef struct AspeedSMCFlash { - struct AspeedSMCState *controller; =20 +#define TYPE_ASPEED_SMC_FLASH "aspeed.smc.flash" +OBJECT_DECLARE_SIMPLE_TYPE(AspeedSMCFlash, ASPEED_SMC_FLASH) +struct AspeedSMCFlash { + SysBusDevice parent_obj; + + struct AspeedSMCState *controller; uint8_t cs; =20 MemoryRegion mmio; -} AspeedSMCFlash; +}; =20 #define TYPE_ASPEED_SMC "aspeed.smc" OBJECT_DECLARE_TYPE(AspeedSMCState, AspeedSMCClass, ASPEED_SMC) =20 #define ASPEED_SMC_R_MAX (0x100 / 4) +#define ASPEED_SMC_CS_MAX 5 =20 struct AspeedSMCState { SysBusDevice parent_obj; @@ -72,7 +77,7 @@ struct AspeedSMCState { MemoryRegion *dram_mr; AddressSpace dram_as; =20 - AspeedSMCFlash *flashes; + AspeedSMCFlash flashes[ASPEED_SMC_CS_MAX]; =20 uint8_t snoop_index; uint8_t snoop_dummies; diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 643cde832396..c534e9bf87ee 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -1101,6 +1101,18 @@ static const MemoryRegionOps aspeed_smc_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 +static void aspeed_smc_instance_init(Object *obj) +{ + AspeedSMCState *s =3D ASPEED_SMC(obj); + AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); + int i; + + for (i =3D 0; i < asc->max_peripherals; i++) { + object_initialize_child(obj, "flash[*]", &s->flashes[i], + TYPE_ASPEED_SMC_FLASH); + } +} + /* * Initialize the custom address spaces for DMAs */ @@ -1123,7 +1135,6 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) AspeedSMCState *s =3D ASPEED_SMC(dev); AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); int i; - char name[32]; hwaddr offset =3D 0; =20 /* keep a copy under AspeedSMCState to speed up accesses */ @@ -1170,8 +1181,6 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) &s->mmio_flash, 0, asc->flash_window_size); sysbus_init_mmio(sbd, &s->mmio_flash_alias); =20 - s->flashes =3D g_new0(AspeedSMCFlash, asc->max_peripherals); - /* * Let's create a sub memory region for each possible peripheral. All * have a configurable memory segment in the overall flash mapping @@ -1182,12 +1191,17 @@ static void aspeed_smc_realize(DeviceState *dev, Er= ror **errp) for (i =3D 0; i < asc->max_peripherals; ++i) { AspeedSMCFlash *fl =3D &s->flashes[i]; =20 - snprintf(name, sizeof(name), TYPE_ASPEED_SMC ".flash.%d", i); + if (!object_property_set_link(OBJECT(fl), "controller", OBJECT(s), + errp)) { + return; + } + if (!object_property_set_uint(OBJECT(fl), "cs", i, errp)) { + return; + } + if (!sysbus_realize(SYS_BUS_DEVICE(fl), errp)) { + return; + } =20 - fl->cs =3D i; - fl->controller =3D s; - memory_region_init_io(&fl->mmio, OBJECT(s), &aspeed_smc_flash_ops, - fl, name, asc->segments[i].size); memory_region_add_subregion(&s->mmio_flash, offset, &fl->mmio); offset +=3D asc->segments[i].size; } @@ -1231,12 +1245,57 @@ static void aspeed_smc_class_init(ObjectClass *klas= s, void *data) static const TypeInfo aspeed_smc_info =3D { .name =3D TYPE_ASPEED_SMC, .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_init =3D aspeed_smc_instance_init, .instance_size =3D sizeof(AspeedSMCState), .class_size =3D sizeof(AspeedSMCClass), .class_init =3D aspeed_smc_class_init, .abstract =3D true, }; =20 +static void aspeed_smc_flash_realize(DeviceState *dev, Error **errp) +{ + AspeedSMCFlash *s =3D ASPEED_SMC_FLASH(dev); + AspeedSMCClass *asc; + g_autofree char *name =3D g_strdup_printf(TYPE_ASPEED_SMC_FLASH ".%d",= s->cs); + + if (!s->controller) { + error_setg(errp, TYPE_ASPEED_SMC_FLASH ": 'controller' link not se= t"); + return; + } + + asc =3D ASPEED_SMC_GET_CLASS(s->controller); + + /* + * Use the default segment value to size the memory region. This + * can be changed by FW at runtime. + */ + memory_region_init_io(&s->mmio, OBJECT(s), &aspeed_smc_flash_ops, + s, name, asc->segments[s->cs].size); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio); +} + +static Property aspeed_smc_flash_properties[] =3D { + DEFINE_PROP_UINT8("cs", AspeedSMCFlash, cs, 0), + DEFINE_PROP_LINK("controller", AspeedSMCFlash, controller, TYPE_ASPEED= _SMC, + AspeedSMCState *), + DEFINE_PROP_END_OF_LIST(), +}; + +static void aspeed_smc_flash_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->desc =3D "Aspeed SMC Flash device region"; + dc->realize =3D aspeed_smc_flash_realize; + device_class_set_props(dc, aspeed_smc_flash_properties); +} + +static const TypeInfo aspeed_smc_flash_info =3D { + .name =3D TYPE_ASPEED_SMC_FLASH, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(AspeedSMCFlash), + .class_init =3D aspeed_smc_flash_class_init, +}; =20 /* * The Segment Registers of the AST2400 and AST2500 have a 8MB @@ -1625,6 +1684,7 @@ static const TypeInfo aspeed_2600_spi2_info =3D { =20 static void aspeed_smc_register_types(void) { + type_register_static(&aspeed_smc_flash_info); type_register_static(&aspeed_smc_info); type_register_static(&aspeed_2400_smc_info); type_register_static(&aspeed_2400_fmc_info); --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155597490850.8079735288909; Mon, 20 Sep 2021 09:33:17 -0700 (PDT) Received: from localhost ([::1]:42192 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMEG-0005YS-H3 for importer@patchew.org; Mon, 20 Sep 2021 12:33:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38178) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4n-0005xM-Q6 for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:31 -0400 Received: from smtpout2.3005.mail-out.ovh.net ([46.105.54.81]:45917) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4e-0004EN-Th for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:29 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.4.35]) by mo3005.mail-out.ovh.net (Postfix) with ESMTPS id 7F74C13ECEE; Mon, 20 Sep 2021 16:23:15 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:14 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G0054674aa11-8963-4cbe-8d7c-77a3068bc233, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 09/12] aspeed/smc: Add default reset values Date: Mon, 20 Sep 2021 18:23:06 +0200 Message-ID: <20210920162309.1091711-10-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 57a89890-66ce-4aac-9a31-0945ccc3f0ef X-Ovh-Tracer-Id: 13074512669166373670 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=46.105.54.81; envelope-from=clg@kaod.org; helo=smtpout2.3005.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155598957100003 This simplifies the reset handler and has the benefit to remove some "bad" use of the segments array as an identifier of the controller model. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 1 + hw/ssi/aspeed_smc.c | 52 +++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index ee943228b96f..a1ca0e65c405 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -98,6 +98,7 @@ struct AspeedSMCClass { uint8_t nregs_timings; uint8_t conf_enable_w0; uint8_t max_peripherals; + const uint32_t *resets; const AspeedSegments *segments; hwaddr flash_window_base; uint32_t flash_window_size; diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index c534e9bf87ee..8cc7ccf45591 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -196,12 +196,9 @@ * controller. These can be changed when board is initialized with the * Segment Address Registers. */ -static const AspeedSegments aspeed_2400_fmc_segments[]; static const AspeedSegments aspeed_2400_spi1_segments[]; -static const AspeedSegments aspeed_2500_fmc_segments[]; static const AspeedSegments aspeed_2500_spi1_segments[]; static const AspeedSegments aspeed_2500_spi2_segments[]; -static const AspeedSegments aspeed_2600_fmc_segments[]; =20 #define ASPEED_SMC_FEATURE_DMA 0x1 #define ASPEED_SMC_FEATURE_DMA_GRANT 0x2 @@ -686,7 +683,11 @@ static void aspeed_smc_reset(DeviceState *d) AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); int i; =20 - memset(s->regs, 0, sizeof s->regs); + if (asc->resets) { + memcpy(s->regs, asc->resets, sizeof s->regs); + } else { + memset(s->regs, 0, sizeof s->regs); + } =20 /* Unselect all peripherals */ for (i =3D 0; i < s->num_cs; ++i) { @@ -700,27 +701,6 @@ static void aspeed_smc_reset(DeviceState *d) asc->segment_to_reg(s, &asc->segments[i])); } =20 - /* HW strapping flash type for the AST2600 controllers */ - if (asc->segments =3D=3D aspeed_2600_fmc_segments) { - /* flash type is fixed to SPI for all */ - s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0); - s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1); - s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE2); - } - - /* HW strapping flash type for FMC controllers */ - if (asc->segments =3D=3D aspeed_2500_fmc_segments) { - /* flash type is fixed to SPI for CE0 and CE1 */ - s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0); - s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1); - } - - /* HW strapping for AST2400 FMC controllers (SCU70). Let's use the - * configuration of the palmetto-bmc machine */ - if (asc->segments =3D=3D aspeed_2400_fmc_segments) { - s->regs[s->r_conf] |=3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0); - } - s->snoop_index =3D SNOOP_OFF; s->snoop_dummies =3D 0; } @@ -1352,6 +1332,14 @@ static const TypeInfo aspeed_2400_smc_info =3D { .class_init =3D aspeed_2400_smc_class_init, }; =20 +static const uint32_t aspeed_2400_fmc_resets[ASPEED_SMC_R_MAX] =3D { + /* + * CE0 and CE1 types are HW strapped in SCU70. Do it here to + * simplify the model. + */ + [R_CONF] =3D CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0, +}; + static const AspeedSegments aspeed_2400_fmc_segments[] =3D { { 0x20000000, 64 * MiB }, /* start address is readonly */ { 0x24000000, 32 * MiB }, @@ -1374,6 +1362,7 @@ static void aspeed_2400_fmc_class_init(ObjectClass *k= lass, void *data) asc->conf_enable_w0 =3D CONF_ENABLE_W0; asc->max_peripherals =3D 5; asc->segments =3D aspeed_2400_fmc_segments; + asc->resets =3D aspeed_2400_fmc_resets; asc->flash_window_base =3D 0x20000000; asc->flash_window_size =3D 0x10000000; asc->features =3D ASPEED_SMC_FEATURE_DMA; @@ -1424,6 +1413,11 @@ static const TypeInfo aspeed_2400_spi1_info =3D { .class_init =3D aspeed_2400_spi1_class_init, }; =20 +static const uint32_t aspeed_2500_fmc_resets[ASPEED_SMC_R_MAX] =3D { + [R_CONF] =3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0 | + CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1), +}; + static const AspeedSegments aspeed_2500_fmc_segments[] =3D { { 0x20000000, 128 * MiB }, /* start address is readonly */ { 0x28000000, 32 * MiB }, @@ -1444,6 +1438,7 @@ static void aspeed_2500_fmc_class_init(ObjectClass *k= lass, void *data) asc->conf_enable_w0 =3D CONF_ENABLE_W0; asc->max_peripherals =3D 3; asc->segments =3D aspeed_2500_fmc_segments; + asc->resets =3D aspeed_2500_fmc_resets; asc->flash_window_base =3D 0x20000000; asc->flash_window_size =3D 0x10000000; asc->features =3D ASPEED_SMC_FEATURE_DMA; @@ -1569,6 +1564,12 @@ static void aspeed_2600_smc_reg_to_segment(const Asp= eedSMCState *s, } } =20 +static const uint32_t aspeed_2600_fmc_resets[ASPEED_SMC_R_MAX] =3D { + [R_CONF] =3D (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0 | + CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1 | + CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE2), +}; + static const AspeedSegments aspeed_2600_fmc_segments[] =3D { { 0x0, 128 * MiB }, /* start address is readonly */ { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kerne= l */ @@ -1589,6 +1590,7 @@ static void aspeed_2600_fmc_class_init(ObjectClass *k= lass, void *data) asc->conf_enable_w0 =3D CONF_ENABLE_W0; asc->max_peripherals =3D 3; asc->segments =3D aspeed_2600_fmc_segments; + asc->resets =3D aspeed_2600_fmc_resets; asc->flash_window_base =3D 0x20000000; asc->flash_window_size =3D 0x10000000; asc->features =3D ASPEED_SMC_FEATURE_DMA | --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16321560612761006.2911728198642; Mon, 20 Sep 2021 09:41:01 -0700 (PDT) Received: from localhost ([::1]:32846 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMLj-0001O8-2k for importer@patchew.org; Mon, 20 Sep 2021 12:41:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38244) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4z-0006EQ-9p for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:41 -0400 Received: from smtpout2.3005.mail-out.ovh.net ([46.105.54.81]:37055) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4e-0004EO-Tv for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:41 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.4.35]) by mo3005.mail-out.ovh.net (Postfix) with ESMTPS id 8EE8013EDFF; Mon, 20 Sep 2021 16:23:15 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:14 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G005bdcf5976-2a8c-4d3e-849c-13f91bc14225, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 10/12] aspeed/smc: Introduce a new addr_width() class handler Date: Mon, 20 Sep 2021 18:23:07 +0200 Message-ID: <20210920162309.1091711-11-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: f9f8964c-7c25-40d0-9e3b-b925acb796c9 X-Ovh-Tracer-Id: 13074794144289491750 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=46.105.54.81; envelope-from=clg@kaod.org; helo=smtpout2.3005.mail-out.ovh.net X-Spam_score_int: 0 X-Spam_score: -0.0 X-Spam_bar: / X-Spam_report: (-0.0 / 5.0 requ) RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632156061765100001 The AST2400 SPI controller has a transitional HW interface and it stores the address width currently in use in a different register than all the other SMC controllers. It needs special handling when working in 4B mode. Make it clear through a class handler. This also removes another use of the segments array. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 1 + hw/ssi/aspeed_smc.c | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index a1ca0e65c405..8dc81294988e 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -111,6 +111,7 @@ struct AspeedSMCClass { void (*reg_to_segment)(const AspeedSMCState *s, uint32_t reg, AspeedSegments *seg); void (*dma_ctrl)(AspeedSMCState *s, uint32_t value); + int (*addr_width)(const AspeedSMCState *s); }; =20 #endif /* ASPEED_SMC_H */ diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 8cc7ccf45591..7129341c129e 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -196,7 +196,6 @@ * controller. These can be changed when board is initialized with the * Segment Address Registers. */ -static const AspeedSegments aspeed_2400_spi1_segments[]; static const AspeedSegments aspeed_2500_spi1_segments[]; static const AspeedSegments aspeed_2500_spi2_segments[]; =20 @@ -382,15 +381,15 @@ static inline int aspeed_smc_flash_cmd(const AspeedSM= CFlash *fl) return cmd; } =20 -static inline int aspeed_smc_flash_is_4byte(const AspeedSMCFlash *fl) +static inline int aspeed_smc_flash_addr_width(const AspeedSMCFlash *fl) { const AspeedSMCState *s =3D fl->controller; AspeedSMCClass *asc =3D ASPEED_SMC_GET_CLASS(s); =20 - if (asc->segments =3D=3D aspeed_2400_spi1_segments) { - return s->regs[s->r_ctrl0] & CTRL_AST2400_SPI_4BYTE; + if (asc->addr_width) { + return asc->addr_width(s); } else { - return s->regs[s->r_ce_ctrl] & (1 << (CTRL_EXTENDED0 + fl->cs)); + return s->regs[s->r_ce_ctrl] & (1 << (CTRL_EXTENDED0 + fl->cs)) ? = 4 : 3; } } =20 @@ -450,7 +449,7 @@ static void aspeed_smc_flash_setup(AspeedSMCFlash *fl, = uint32_t addr) { const AspeedSMCState *s =3D fl->controller; uint8_t cmd =3D aspeed_smc_flash_cmd(fl); - int i =3D aspeed_smc_flash_is_4byte(fl) ? 4 : 3; + int i =3D aspeed_smc_flash_addr_width(fl); =20 /* Flash access can not exceed CS segment */ addr =3D aspeed_smc_check_segment_addr(fl, addr); @@ -558,7 +557,7 @@ static bool aspeed_smc_do_snoop(AspeedSMCFlash *fl, ui= nt64_t data, unsigned size) { AspeedSMCState *s =3D fl->controller; - uint8_t addr_width =3D aspeed_smc_flash_is_4byte(fl) ? 4 : 3; + uint8_t addr_width =3D aspeed_smc_flash_addr_width(fl); =20 trace_aspeed_smc_do_snoop(fl->cs, s->snoop_index, s->snoop_dummies, (uint8_t) data & 0xff); @@ -1384,6 +1383,11 @@ static const AspeedSegments aspeed_2400_spi1_segment= s[] =3D { { 0x30000000, 64 * MiB }, }; =20 +static int aspeed_2400_spi1_addr_width(const AspeedSMCState *s) +{ + return s->regs[R_SPI_CTRL0] & CTRL_AST2400_SPI_4BYTE ? 4 : 3; +} + static void aspeed_2400_spi1_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -1405,6 +1409,7 @@ static void aspeed_2400_spi1_class_init(ObjectClass *= klass, void *data) asc->segment_to_reg =3D aspeed_smc_segment_to_reg; asc->reg_to_segment =3D aspeed_smc_reg_to_segment; asc->dma_ctrl =3D aspeed_smc_dma_ctrl; + asc->addr_width =3D aspeed_2400_spi1_addr_width; } =20 static const TypeInfo aspeed_2400_spi1_info =3D { --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155197514407.19709147866445; Mon, 20 Sep 2021 09:26:37 -0700 (PDT) Received: from localhost ([::1]:51424 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSM7o-00018L-8H for importer@patchew.org; Mon, 20 Sep 2021 12:26:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38106) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4l-0005tz-1y for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:27 -0400 Received: from 1.mo552.mail-out.ovh.net ([178.32.96.117]:58401) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4e-0004ER-VO for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:26 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.109.138.252]) by mo552.mail-out.ovh.net (Postfix) with ESMTPS id B84D521002; Mon, 20 Sep 2021 16:23:15 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:15 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G00516d1b409-dc89-4d3a-aa92-6fd9c6c2b84e, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 11/12] aspeed/smc: Remove unused attribute 'irqline' Date: Mon, 20 Sep 2021 18:23:08 +0200 Message-ID: <20210920162309.1091711-12-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 4e08bec1-14e8-4254-b483-640116865735 X-Ovh-Tracer-Id: 13074794144856509222 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgepgeenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.32.96.117; envelope-from=clg@kaod.org; helo=1.mo552.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155199526100001 Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 8dc81294988e..75bc793bd269 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -56,7 +56,6 @@ struct AspeedSMCState { MemoryRegion mmio_flash_alias; =20 qemu_irq irq; - int irqline; =20 uint32_t num_cs; qemu_irq *cs_lines; --=20 2.31.1 From nobody Sat Apr 27 22:41:39 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1632155794837503.82689921157623; Mon, 20 Sep 2021 09:36:34 -0700 (PDT) Received: from localhost ([::1]:49118 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSMHR-0001nm-S1 for importer@patchew.org; Mon, 20 Sep 2021 12:36:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38184) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4o-0005xS-9z for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:31 -0400 Received: from 4.mo548.mail-out.ovh.net ([188.165.42.229]:39467) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSM4e-0004EX-Tl for qemu-devel@nongnu.org; Mon, 20 Sep 2021 12:23:30 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.108.20.52]) by mo548.mail-out.ovh.net (Postfix) with ESMTPS id 3DE5C205EA; Mon, 20 Sep 2021 16:23:16 +0000 (UTC) Received: from kaod.org (37.59.142.103) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Mon, 20 Sep 2021 18:23:15 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-103G0059e716f3c-7193-431f-bf92-978e885daf3c, C584E5EC745A9DFF7B561FC81DF43D5934FDEC9F) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PATCH v2 12/12] aspeed/i2c: QOMify AspeedI2CBus Date: Mon, 20 Sep 2021 18:23:09 +0200 Message-ID: <20210920162309.1091711-13-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920162309.1091711-1-clg@kaod.org> References: <20210920162309.1091711-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.103] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: 6ee967a0-98cf-462d-9ebd-efaaf79427ed X-Ovh-Tracer-Id: 13075075618866301734 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvtddrudeivddgleelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrddutdefnecuvehluhhsthgvrhfuihiivgepfeenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=188.165.42.229; envelope-from=clg@kaod.org; helo=4.mo548.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1632155796715100001 Introduce an AspeedI2CBus SysBusDevice model and attach the associated memory region and IRQ to the newly instantiated objects. Before this change, the I2C bus IRQs were all attached to the SysBusDevice model of the I2C controller. Adapt the AST2600 SoC realize routine to take into account this change. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/i2c/aspeed_i2c.h | 8 ++- hw/arm/aspeed_ast2600.c | 7 +-- hw/i2c/aspeed_i2c.c | 101 +++++++++++++++++++++++++++++------- 3 files changed, 91 insertions(+), 25 deletions(-) diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h index 565f83306624..4b9be09274c7 100644 --- a/include/hw/i2c/aspeed_i2c.h +++ b/include/hw/i2c/aspeed_i2c.h @@ -36,7 +36,11 @@ OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPE= ED_I2C) =20 struct AspeedI2CState; =20 -typedef struct AspeedI2CBus { +#define TYPE_ASPEED_I2C_BUS "aspeed.i2c.bus" +OBJECT_DECLARE_SIMPLE_TYPE(AspeedI2CBus, ASPEED_I2C_BUS) +struct AspeedI2CBus { + SysBusDevice parent_obj; + struct AspeedI2CState *controller; =20 MemoryRegion mr; @@ -54,7 +58,7 @@ typedef struct AspeedI2CBus { uint32_t pool_ctrl; uint32_t dma_addr; uint32_t dma_len; -} AspeedI2CBus; +}; =20 struct AspeedI2CState { SysBusDevice parent_obj; diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c index c69f27dff62a..a70e4c48a73c 100644 --- a/hw/arm/aspeed_ast2600.c +++ b/hw/arm/aspeed_ast2600.c @@ -337,11 +337,8 @@ static void aspeed_soc_ast2600_realize(DeviceState *de= v, Error **errp) for (i =3D 0; i < ASPEED_I2C_GET_CLASS(&s->i2c)->num_busses; i++) { qemu_irq irq =3D qdev_get_gpio_in(DEVICE(&s->a7mpcore), sc->irqmap[ASPEED_DEV_I2C] + i); - /* - * The AST2600 SoC has one IRQ per I2C bus. Skip the common - * IRQ (AST2400 and AST2500) and connect all bussses. - */ - sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c), i + 1, irq); + /* The AST2600 I2C controller has one IRQ per bus. */ + sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c.busses[i]), 0, irq); } =20 /* FMC, The number of CS is set at the board level */ diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c index 8d276d9ed391..03a4f5a91010 100644 --- a/hw/i2c/aspeed_i2c.c +++ b/hw/i2c/aspeed_i2c.c @@ -740,20 +740,20 @@ static const VMStateDescription aspeed_i2c_vmstate = =3D { =20 static void aspeed_i2c_reset(DeviceState *dev) { - int i; AspeedI2CState *s =3D ASPEED_I2C(dev); - AspeedI2CClass *aic =3D ASPEED_I2C_GET_CLASS(s); =20 s->intr_status =3D 0; +} + +static void aspeed_i2c_instance_init(Object *obj) +{ + AspeedI2CState *s =3D ASPEED_I2C(obj); + AspeedI2CClass *aic =3D ASPEED_I2C_GET_CLASS(s); + int i; =20 for (i =3D 0; i < aic->num_busses; i++) { - s->busses[i].intr_ctrl =3D 0; - s->busses[i].intr_status =3D 0; - s->busses[i].cmd =3D 0; - s->busses[i].buf =3D 0; - s->busses[i].dma_addr =3D 0; - s->busses[i].dma_len =3D 0; - i2c_end_transfer(s->busses[i].bus); + object_initialize_child(obj, "bus[*]", &s->busses[i], + TYPE_ASPEED_I2C_BUS); } } =20 @@ -791,17 +791,21 @@ static void aspeed_i2c_realize(DeviceState *dev, Erro= r **errp) sysbus_init_mmio(sbd, &s->iomem); =20 for (i =3D 0; i < aic->num_busses; i++) { - char name[32]; + Object *bus =3D OBJECT(&s->busses[i]); int offset =3D i < aic->gap ? 1 : 5; =20 - sysbus_init_irq(sbd, &s->busses[i].irq); - snprintf(name, sizeof(name), "aspeed.i2c.%d", i); - s->busses[i].controller =3D s; - s->busses[i].id =3D i; - s->busses[i].bus =3D i2c_init_bus(dev, name); - memory_region_init_io(&s->busses[i].mr, OBJECT(dev), - &aspeed_i2c_bus_ops, &s->busses[i], name, - aic->reg_size); + if (!object_property_set_link(bus, "controller", OBJECT(s), errp))= { + return; + } + + if (!object_property_set_uint(bus, "bus-id", i, errp)) { + return; + } + + if (!sysbus_realize(SYS_BUS_DEVICE(bus), errp)) { + return; + } + memory_region_add_subregion(&s->iomem, aic->reg_size * (i + offset= ), &s->busses[i].mr); } @@ -841,12 +845,72 @@ static void aspeed_i2c_class_init(ObjectClass *klass,= void *data) static const TypeInfo aspeed_i2c_info =3D { .name =3D TYPE_ASPEED_I2C, .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_init =3D aspeed_i2c_instance_init, .instance_size =3D sizeof(AspeedI2CState), .class_init =3D aspeed_i2c_class_init, .class_size =3D sizeof(AspeedI2CClass), .abstract =3D true, }; =20 +static void aspeed_i2c_bus_reset(DeviceState *dev) +{ + AspeedI2CBus *s =3D ASPEED_I2C_BUS(dev); + + s->intr_ctrl =3D 0; + s->intr_status =3D 0; + s->cmd =3D 0; + s->buf =3D 0; + s->dma_addr =3D 0; + s->dma_len =3D 0; + i2c_end_transfer(s->bus); +} + +static void aspeed_i2c_bus_realize(DeviceState *dev, Error **errp) +{ + AspeedI2CBus *s =3D ASPEED_I2C_BUS(dev); + AspeedI2CClass *aic; + g_autofree char *name =3D g_strdup_printf(TYPE_ASPEED_I2C_BUS ".%d", s= ->id); + + if (!s->controller) { + error_setg(errp, TYPE_ASPEED_I2C_BUS ": 'controller' link not set"= ); + return; + } + + aic =3D ASPEED_I2C_GET_CLASS(s->controller); + + sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq); + + s->bus =3D i2c_init_bus(dev, name); + + memory_region_init_io(&s->mr, OBJECT(s), &aspeed_i2c_bus_ops, + s, name, aic->reg_size); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mr); +} + +static Property aspeed_i2c_bus_properties[] =3D { + DEFINE_PROP_UINT8("bus-id", AspeedI2CBus, id, 0), + DEFINE_PROP_LINK("controller", AspeedI2CBus, controller, TYPE_ASPEED_I= 2C, + AspeedI2CState *), + DEFINE_PROP_END_OF_LIST(), +}; + +static void aspeed_i2c_bus_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->desc =3D "Aspeed I2C Bus"; + dc->realize =3D aspeed_i2c_bus_realize; + dc->reset =3D aspeed_i2c_bus_reset; + device_class_set_props(dc, aspeed_i2c_bus_properties); +} + +static const TypeInfo aspeed_i2c_bus_info =3D { + .name =3D TYPE_ASPEED_I2C_BUS, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(AspeedI2CBus), + .class_init =3D aspeed_i2c_bus_class_init, +}; + static qemu_irq aspeed_2400_i2c_bus_get_irq(AspeedI2CBus *bus) { return bus->controller->irq; @@ -951,6 +1015,7 @@ static const TypeInfo aspeed_2600_i2c_info =3D { =20 static void aspeed_i2c_register_types(void) { + type_register_static(&aspeed_i2c_bus_info); type_register_static(&aspeed_i2c_info); type_register_static(&aspeed_2400_i2c_info); type_register_static(&aspeed_2500_i2c_info); --=20 2.31.1