From nobody Fri Oct 25 19:25:05 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=1614897056; cv=none; d=zohomail.com; s=zohoarc; b=YBCV6ATPokv0qhapkTASz0Z311ejS6v4N0ZXHGL1Nwg+CV1szyoY+JAzYTMKOXAQBs5RvgtfiDcjMo5rqRBPMaEmN8ff++LKilHDAZiqWjE22IbTdt2/c28JS/emhexM45zmtRlAr76RKckVop0EguG90NIp//VRSGDDndvDHfs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614897056; h=Content-Transfer-Encoding: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=0xU9c33iBbAT2slaZyeLOFiCxn3jqj+iva1LIUOL7ss=; b=Zbci9F7qSKHWgJBqBuZeUDO16ndg+dyNao691lHCvydHu/3aec43iTFbJz4uCzMq4dR0MNgNv7ZiqNrT+YT75274bexx48bC4iM7Z7/otQfjfORGWnopL/4BH7E6NOGqzKHpWTYO/Xq3Br/scs5taO5OPHtM9ByPEpxOX7Zk6fA= 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 1614897056306789.995887816841; Thu, 4 Mar 2021 14:30:56 -0800 (PST) Received: from localhost ([::1]:35828 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lHwUg-0008MR-99 for importer@patchew.org; Thu, 04 Mar 2021 17:30:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54196) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lHwFS-0002dO-BP for qemu-devel@nongnu.org; Thu, 04 Mar 2021 17:15:12 -0500 Received: from mail.ilande.co.uk ([2001:41c9:1:41f::167]:40324 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lHwFQ-00070O-24 for qemu-devel@nongnu.org; Thu, 04 Mar 2021 17:15:09 -0500 Received: from host86-148-34-47.range86-148.btcentralplus.com ([86.148.34.47] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lHwF9-0008MJ-O8; Thu, 04 Mar 2021 22:14:56 +0000 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, pbonzini@redhat.com, fam@euphon.net, laurent@vivier.eu Date: Thu, 4 Mar 2021 22:11:03 +0000 Message-Id: <20210304221103.6369-43-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210304221103.6369-1-mark.cave-ayland@ilande.co.uk> References: <20210304221103.6369-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.148.34.47 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH v3 42/42] esp: add support for unaligned accesses X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) 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=2001:41c9:1:41f::167; envelope-from=mark.cave-ayland@ilande.co.uk; helo=mail.default.ilande.uk0.bigv.io 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, 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" When the MacOS toolbox ROM transfers data from a target device to an unalig= ned memory address, the first/last byte of a 16-bit transfer needs to be handled separately. This means that the first byte is preloaded into the FIFO before the transfer, or the last byte remains in the FIFO after the transfer. The result of this is that the PDMA routines must be updated so that the FI= FO is loaded/unloaded if the last 16-bit word is used (rather than the last by= te) and any remaining byte from a FIFO wraparound is handled correctly. Signed-off-by: Mark Cave-Ayland Reviewed-by: Laurent Vivier --- hw/scsi/esp.c | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index f828e70865..507ab363bc 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -498,11 +498,22 @@ static void do_dma_pdma_cb(ESPState *s) =20 if (to_device) { /* Copy FIFO data to device */ - len =3D MIN(fifo8_num_used(&s->fifo), ESP_FIFO_SZ); + len =3D MIN(s->async_len, ESP_FIFO_SZ); + len =3D MIN(len, fifo8_num_used(&s->fifo)); memcpy(s->async_buf, fifo8_pop_buf(&s->fifo, len, &n), len); - s->async_buf +=3D len; - s->async_len -=3D len; - s->ti_size +=3D len; + s->async_buf +=3D n; + s->async_len -=3D n; + s->ti_size +=3D n; + + if (n < len) { + /* Unaligned accesses can cause FIFO wraparound */ + len =3D len - n; + memcpy(s->async_buf, fifo8_pop_buf(&s->fifo, len, &n), len); + s->async_buf +=3D n; + s->async_len -=3D n; + s->ti_size +=3D n; + } + if (s->async_len =3D=3D 0) { scsi_req_continue(s->current_req); return; @@ -526,12 +537,18 @@ static void do_dma_pdma_cb(ESPState *s) =20 if (esp_get_tc(s) !=3D 0) { /* Copy device data to FIFO */ - len =3D MIN(s->async_len, fifo8_num_free(&s->fifo)); + len =3D MIN(s->async_len, esp_get_tc(s)); + len =3D MIN(len, fifo8_num_free(&s->fifo)); fifo8_push_all(&s->fifo, s->async_buf, len); s->async_buf +=3D len; s->async_len -=3D len; s->ti_size -=3D len; esp_set_tc(s, esp_get_tc(s) - len); + + if (esp_get_tc(s) =3D=3D 0) { + /* Indicate transfer to FIFO is complete */ + s->rregs[ESP_RSTAT] |=3D STAT_TC; + } return; } =20 @@ -606,12 +623,29 @@ static void esp_do_dma(ESPState *s) if (s->dma_memory_write) { s->dma_memory_write(s->dma_opaque, s->async_buf, len); } else { + /* Adjust TC for any leftover data in the FIFO */ + if (!fifo8_is_empty(&s->fifo)) { + esp_set_tc(s, esp_get_tc(s) - fifo8_num_used(&s->fifo)); + } + /* Copy device data to FIFO */ len =3D MIN(len, fifo8_num_free(&s->fifo)); fifo8_push_all(&s->fifo, s->async_buf, len); s->async_buf +=3D len; s->async_len -=3D len; s->ti_size -=3D len; + + /* + * MacOS toolbox uses a TI length of 16 bytes for all commands= , so + * commands shorter than this must be padded accordingly + */ + if (len < esp_get_tc(s) && esp_get_tc(s) <=3D ESP_FIFO_SZ) { + while (fifo8_num_used(&s->fifo) < ESP_FIFO_SZ) { + esp_fifo_push(s, 0); + len++; + } + } + esp_set_tc(s, esp_get_tc(s) - len); s->pdma_cb =3D do_dma_pdma_cb; esp_raise_drq(s); @@ -1160,7 +1194,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwadd= r addr, break; } dmalen =3D esp_get_tc(s); - if (dmalen =3D=3D 0 || fifo8_is_full(&s->fifo)) { + if (dmalen =3D=3D 0 || fifo8_num_free(&s->fifo) < 2) { s->pdma_cb(s); } } @@ -1183,7 +1217,7 @@ static uint64_t sysbus_esp_pdma_read(void *opaque, hw= addr addr, val =3D (val << 8) | esp_pdma_read(s); break; } - if (fifo8_is_empty(&s->fifo)) { + if (fifo8_num_used(&s->fifo) < 2) { s->pdma_cb(s); } return val; --=20 2.20.1