From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 25494C433FE for ; Thu, 31 Mar 2022 10:12:45 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 9B3C684225; Thu, 31 Mar 2022 12:12:26 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="DBZ88SkA"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 13EAC8420C; Thu, 31 Mar 2022 12:10:16 +0200 (CEST) Received: from mail-wm1-x349.google.com (mail-wm1-x349.google.com [IPv6:2a00:1450:4864:20::349]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id D0004841FD for ; Thu, 31 Mar 2022 12:10:08 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=3AH5FYgYKBisHZJbSSNVVNSL.JVTb-IVVaSPZaZ.KLUe.KL@flex--ascull.bounces.google.com Received: by mail-wm1-x349.google.com with SMTP id i65-20020a1c3b44000000b00385c3f3defaso9290553wma.3 for ; Thu, 31 Mar 2022 03:10:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=DTkrnQJ24b9enYRVV5Q1zVXsPDEYJTU01cKpRmJcPOE=; b=DBZ88SkAhap0aXnbbprzVQjZBMIDylwSWSTuicJnV2EE5+1J9yC83hJM4hEP/MuyKD k2pm12XK7C83ECAQnGhVHq46E30+cWClX5wz6tYgqzpgsVw2jhyd+9BrroBuQgTxeEeM tismnFNW5fK1qKhmBsoBnKYKpsjDaZMleBisGD3Ryo2S6Wltku5iDqmSwyJSg3HDeA0u 5quZcVC6ARTDhhH3zzAK+lzt/CNLhD/ad+SCJQHN6gBVyynGdWqR2eqJ+nlMJoW8wnA+ N+ZD1EioAHs/kFVW6kj8VocVNp2yZxTEmHhdg4QDnuXgKsTV+NYUNUuptKcU2EDtOAQw FKtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=DTkrnQJ24b9enYRVV5Q1zVXsPDEYJTU01cKpRmJcPOE=; b=Nh6AY4e0Dws0zlyy9dBnuzBgHmrAoRHzvVuRS5g4SF7NjmRidKddirNXagNYXDhRj1 93ORumwJF225owVzWvmazHlx2gqmSSrpMvGGkRUvSIkSJ86+rFeMMHE4lpOTFLQmMkyY UlNUs4rZoZ7c34EsZlKJuUks1PDdoyeVl5rv8bGtN58fXv6D7bc6Pbg47Qi8SRQ0gQMy pkRbAeZC+QzgzJ/UFeyEcMG/kH2sN1Dk3PLWQ+UtCI62qdMByIFM7o+RwzUuChxxQ17P hA97Ms8HVFG/we2wy51QR85cPljMW74qrIKiZcZplO/7ZLxRrO27VzpVGXG7om8hxZxH d+ww== X-Gm-Message-State: AOAM5315xd5rt3jvmLjuz2zBLY/rFt5d95ed6wUbFi0M9RwpPAZ3R3e3 fXC4FhzB/g2rzG0na7rXi1xbpIcODjC8M9Ihof+wPaNpCTYVeAHi1ZrXaNeuZEQnQFY4vA0/6WX EZK/rYuDTk4/LUVmmLoTpd5m/VvlpImmesZ4wdYim+w50MFZ8vnmUkhyyH4M= X-Google-Smtp-Source: ABdhPJwV+qbOXAECVCzvQVRoRiZC174p6tLqoYkgwGUGY2vd1+ovAYJdXQFJjqOsNGeigD+Asa/XI17bmGg= X-Received: from ascull.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1510]) (user=ascull job=sendgmr) by 2002:a05:600c:1c0e:b0:38c:ae37:c1d2 with SMTP id j14-20020a05600c1c0e00b0038cae37c1d2mr4049926wms.205.1648721408373; Thu, 31 Mar 2022 03:10:08 -0700 (PDT) Date: Thu, 31 Mar 2022 10:09:43 +0000 In-Reply-To: <20220331100949.3637425-1-ascull@google.com> Message-Id: <20220331100949.3637425-6-ascull@google.com> Mime-Version: 1.0 References: <20220331100949.3637425-1-ascull@google.com> X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog Subject: [PATCH 05/11] dm: test: virtio: Test the virtio ring From: Andrew Scull To: u-boot@lists.denx.de Cc: sjg@chromium.org, bmeng.cn@gmail.com, adelva@google.com, keirf@google.com, ptosi@google.com, Andrew Scull Content-Type: text/plain; charset="UTF-8" X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean The virtio ring is the basis of virtio communication. Test its basic functionality and its resilience against corruption from the device. Signed-off-by: Andrew Scull --- test/dm/virtio.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/test/dm/virtio.c b/test/dm/virtio.c index 9a7e658cce..4cf0f56260 100644 --- a/test/dm/virtio.c +++ b/test/dm/virtio.c @@ -130,3 +130,75 @@ static int dm_test_virtio_remove(struct unit_test_state *uts) return 0; } DM_TEST(dm_test_virtio_remove, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); + +/* Test all of the virtio ring */ +static int dm_test_virtio_ring(struct unit_test_state *uts) +{ + struct udevice *bus, *dev; + struct virtio_dev_priv *uc_priv; + struct virtqueue *vq; + struct virtio_sg sg[2]; + struct virtio_sg *sgs[2]; + unsigned int len; + u8 buffer[2][32]; + + /* check probe success */ + ut_assertok(uclass_first_device(UCLASS_VIRTIO, &bus)); + ut_assertnonnull(bus); + + /* check the child virtio-rng device is bound */ + ut_assertok(device_find_first_child(bus, &dev)); + ut_assertnonnull(dev); + + /* + * fake the virtio device probe by filling in uc_priv->vdev + * which is used by virtio_find_vqs/virtio_del_vqs. + */ + uc_priv = dev_get_uclass_priv(bus); + ut_assertnonnull(uc_priv); + uc_priv->vdev = dev; + + /* prepare the scatter-gather buffer */ + sg[0].addr = buffer[0]; + sg[0].length = sizeof(buffer[0]); + sg[1].addr = buffer[1]; + sg[1].length = sizeof(buffer[1]); + sgs[0] = &sg[0]; + sgs[1] = &sg[1]; + + /* read a buffer and report written size from device */ + ut_assertok(virtio_find_vqs(dev, 1, &vq)); + ut_assertok(virtqueue_add(vq, sgs, 0, 1)); + vq->vring.used->idx = 1; + vq->vring.used->ring[0].id = 0; + vq->vring.used->ring[0].len = 0x53355885; + ut_asserteq_ptr(buffer, virtqueue_get_buf(vq, &len)); + ut_asserteq(0x53355885, len); + ut_assertok(virtio_del_vqs(dev)); + + /* rejects used descriptors that aren't a chain head */ + ut_assertok(virtio_find_vqs(dev, 1, &vq)); + ut_assertok(virtqueue_add(vq, sgs, 0, 2)); + vq->vring.used->idx = 1; + vq->vring.used->ring[0].id = 1; + vq->vring.used->ring[0].len = 0x53355885; + ut_assertnull(virtqueue_get_buf(vq, &len)); + ut_assertok(virtio_del_vqs(dev)); + + /* device changes to descriptor are ignored */ + ut_assertok(virtio_find_vqs(dev, 1, &vq)); + ut_assertok(virtqueue_add(vq, sgs, 0, 1)); + vq->vring.desc[0].addr = cpu_to_virtio64(dev, 0xbadbad11); + vq->vring.desc[0].len = cpu_to_virtio32(dev, 0x11badbad); + vq->vring.desc[0].flags = cpu_to_virtio16(dev, VRING_DESC_F_NEXT); + vq->vring.desc[0].next = cpu_to_virtio16(dev, U16_MAX); + vq->vring.used->idx = 1; + vq->vring.used->ring[0].id = 0; + vq->vring.used->ring[0].len = 6; + ut_asserteq_ptr(buffer, virtqueue_get_buf(vq, &len)); + ut_asserteq(6, len); + ut_assertok(virtio_del_vqs(dev)); + + return 0; +} +DM_TEST(dm_test_virtio_ring, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); -- 2.35.1.1094.g7c7d902a7c-goog