From nobody Thu Apr 25 16:14:55 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 ARC-Seal: i=1; a=rsa-sha256; t=1620020224; cv=none; d=zohomail.com; s=zohoarc; b=ZVvCGdH/m56/w8NSCubQCpVudAOMR0eH6C6j2zgw3lxpJFoS9bARG2pWf+H9kBlrbYtYWR7tyWQN0gW8fn8dNofLB7Tmyvj1kc6t/ofJh2C4HG4+jc8zxScQVtOPAeNm77ujEU+vx63GcrdrJCNvS6mgSNuHGVwTuPjXFmUzB1E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1620020224; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=kYeBep1V/1sa6p1/JVFhHbWoOT3IB4pr+XoP4FFuFRs=; b=inqt01YocYPF/mSU9QG3FRnSZQiJPtvLlPei0nUDhoq3WiqoZuYtPUK9ezdr8LhLyEo3580qtyRIJApuogjq1nFY2IlUXvZ0DY05SF2zvC0ERksC3rtxwFa/HYZcTX5/Ojlg6In38GxMdNIcYpD40yaNpPnKSS1nt+sxMRQoRgA= ARC-Authentication-Results: i=1; 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 1620020224155225.49998725282774; Sun, 2 May 2021 22:37:04 -0700 (PDT) Received: from localhost ([::1]:43828 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ldRGR-0002pe-47 for importer@patchew.org; Mon, 03 May 2021 01:37:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58082) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ldR6j-0005BB-PU; Mon, 03 May 2021 01:27:03 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:37286) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ldR6f-0006FM-U8; Mon, 03 May 2021 01:27:00 -0400 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 1435FX5W070374; Mon, 3 May 2021 01:26:21 -0400 Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 38aav4g561-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 03 May 2021 01:26:20 -0400 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.0.43/8.16.0.43) with SMTP id 1435JC1V025560; Mon, 3 May 2021 05:26:18 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma03ams.nl.ibm.com with ESMTP id 388xm8ggwb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 03 May 2021 05:26:18 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 1435QGSn27263404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 3 May 2021 05:26:16 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 529DFA4053; Mon, 3 May 2021 05:26:16 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 14ABEA4040; Mon, 3 May 2021 05:26:16 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Mon, 3 May 2021 05:26:16 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.40.192]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 64AF922007C; Mon, 3 May 2021 07:26:15 +0200 (CEST) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Subject: [PULL 13/18] aspeed/smc: Add extra controls to request DMA Date: Mon, 3 May 2021 07:25:55 +0200 Message-Id: <20210503052600.290483-14-clg@kaod.org> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20210503052600.290483-1-clg@kaod.org> References: <20210503052600.290483-1-clg@kaod.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: CwvlTDaQNaeaOAbZDi3qwq0hKWe6R2_t X-Proofpoint-GUID: CwvlTDaQNaeaOAbZDi3qwq0hKWe6R2_t X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391, 18.0.761 definitions=2021-05-03_02:2021-04-30, 2021-05-03 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 adultscore=0 mlxscore=0 impostorscore=0 phishscore=0 priorityscore=1501 mlxlogscore=999 spamscore=0 malwarescore=0 clxscore=1034 suspectscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104060000 definitions=main-2105030033 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: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com 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_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: Chin-Ting Kuo , qemu-arm@nongnu.org, Joel Stanley , qemu-devel@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The AST2600 SPI controllers have a set of bits to request/grant DMA access. Add a new SMC feature for these controllers and use it to check access to the DMA registers. Cc: Chin-Ting Kuo Signed-off-by: C=C3=A9dric Le Goater Reviewed-by: Joel Stanley Message-Id: <20210407171637.777743-16-clg@kaod.org> Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 1 + hw/ssi/aspeed_smc.c | 74 +++++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 07879fd1c4a7..cdaf165300b6 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -55,6 +55,7 @@ typedef struct AspeedSMCController { 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; =20 typedef struct AspeedSMCFlash { diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 4521bbd4864e..189b35637c77 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -127,6 +127,8 @@ =20 /* DMA Control/Status Register */ #define R_DMA_CTRL (0x80 / 4) +#define DMA_CTRL_REQUEST (1 << 31) +#define DMA_CTRL_GRANT (1 << 30) #define DMA_CTRL_DELAY_MASK 0xf #define DMA_CTRL_DELAY_SHIFT 8 #define DMA_CTRL_FREQ_MASK 0xf @@ -228,6 +230,7 @@ static uint32_t aspeed_smc_segment_to_reg(const AspeedS= MCState *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); =20 /* * AST2600 definitions @@ -257,7 +260,10 @@ static uint32_t aspeed_2600_smc_segment_to_reg(const A= speedSMCState *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); + #define ASPEED_SMC_FEATURE_DMA 0x1 +#define ASPEED_SMC_FEATURE_DMA_GRANT 0x2 =20 static inline bool aspeed_smc_has_dma(const AspeedSMCState *s) { @@ -281,6 +287,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -299,6 +306,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -315,6 +323,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -333,6 +342,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -349,6 +359,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -365,6 +376,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -383,6 +395,7 @@ static const AspeedSMCController controllers[] =3D { .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, @@ -395,12 +408,14 @@ static const AspeedSMCController controllers[] =3D { .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, + .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, @@ -413,12 +428,14 @@ static const AspeedSMCController controllers[] =3D { .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, + .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, }, }; =20 @@ -1240,7 +1257,7 @@ static void aspeed_smc_dma_done(AspeedSMCState *s) } } =20 -static void aspeed_smc_dma_ctrl(AspeedSMCState *s, uint64_t dma_ctrl) +static void aspeed_smc_dma_ctrl(AspeedSMCState *s, uint32_t dma_ctrl) { if (!(dma_ctrl & DMA_CTRL_ENABLE)) { s->regs[R_DMA_CTRL] =3D dma_ctrl; @@ -1265,6 +1282,46 @@ static void aspeed_smc_dma_ctrl(AspeedSMCState *s, u= int64_t dma_ctrl) aspeed_smc_dma_done(s); } =20 +static inline bool aspeed_smc_dma_granted(AspeedSMCState *s) +{ + if (!(s->ctrl->features & ASPEED_SMC_FEATURE_DMA_GRANT)) { + return true; + } + + if (!(s->regs[R_DMA_CTRL] & DMA_CTRL_GRANT)) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA not granted\n", __func__); + return false; + } + + return true; +} + +static void aspeed_2600_smc_dma_ctrl(AspeedSMCState *s, uint32_t dma_ctrl) +{ + /* Preserve DMA bits */ + dma_ctrl |=3D s->regs[R_DMA_CTRL] & (DMA_CTRL_REQUEST | DMA_CTRL_GRANT= ); + + if (dma_ctrl =3D=3D 0xAEED0000) { + /* automatically grant request */ + s->regs[R_DMA_CTRL] |=3D (DMA_CTRL_REQUEST | DMA_CTRL_GRANT); + return; + } + + /* clear request */ + if (dma_ctrl =3D=3D 0xDEEA0000) { + s->regs[R_DMA_CTRL] &=3D ~(DMA_CTRL_REQUEST | DMA_CTRL_GRANT); + return; + } + + if (!aspeed_smc_dma_granted(s)) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA not granted\n", __func__); + return; + } + + aspeed_smc_dma_ctrl(s, dma_ctrl); + s->regs[R_DMA_CTRL] &=3D ~(DMA_CTRL_REQUEST | DMA_CTRL_GRANT); +} + static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data, unsigned int size) { @@ -1297,12 +1354,15 @@ static void aspeed_smc_write(void *opaque, hwaddr a= ddr, uint64_t data, } 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) { - aspeed_smc_dma_ctrl(s, value); - } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_DRAM_ADDR) { + s->ctrl->dma_ctrl(s, value); + } else if (aspeed_smc_has_dma(s) && 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) { + } else if (aspeed_smc_has_dma(s) && 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) { + } else if (aspeed_smc_has_dma(s) && addr =3D=3D R_DMA_LEN && + aspeed_smc_dma_granted(s)) { s->regs[addr] =3D DMA_LENGTH(value); } else { qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\= n", --=20 2.26.3