From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.groups.io with SMTP id smtpd.web12.37153.1629194133017809818 for ; Tue, 17 Aug 2021 02:55:33 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=NhACFqSz; spf=pass (domain: redhat.com, ip: 170.10.133.124, mailfrom: philmd@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1629194132; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ue5bdKHTWL7+odwUkg21gPikHlIv8NeWUkO+hIL1gF0=; b=NhACFqSzta3fdcUYP5ibleI1TzN8r+upXpHd3lWQNmJxWqSVaS0qbVo0hJ1qpC19Cr58Rk IPb9KlapGFsJUAcvSWgf3YlgkP+53VpiHyCfVP/MqVe9K8puo11g1bZdMEE47f2aijq95j NVE/IM8+xXlobIAGyMQ98JkSCUy8MAQ= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-320-0C4AywruOgmfaQlDyMX70A-1; Tue, 17 Aug 2021 05:55:31 -0400 X-MC-Unique: 0C4AywruOgmfaQlDyMX70A-1 Received: by mail-wm1-f70.google.com with SMTP id e21-20020a05600c4b95b029025b007a168dso779685wmp.4 for ; Tue, 17 Aug 2021 02:55:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Ue5bdKHTWL7+odwUkg21gPikHlIv8NeWUkO+hIL1gF0=; b=Dzic0iOPT54pLrnfd6j0pfxAeV+io98bvPuTHhLNW8p6Zq4qT0UNUNd0kBijJoR5jr Q8lBUICHhL/EgMp4VYeibWVacDir8qT3/I2+xPodeM0CLoClLEa6rWnXWW0dRrewg4K8 DMBIGq+EvbClxDcxAcQMaZELcDBErnhHeiWN0XsHRV/T3CNB/r2ZcSvtBECWb3+LFLz6 DEAGiCSBBbodpGlk9V5Z6MSUJrpJTIX0OcuVWxcgyis7f+iEQ4dPhutraxPLiXPbtwMq XSNGOcaJEoA31wB/y5EG244ZmiBV7WGlkCJ6roNOSYgREJoinxIzKQCoyjdtIcA0Y3N8 kl9g== X-Gm-Message-State: AOAM532P66ut7uZtCcv1N9sbSoS5Abidk57IUsMPX6w/I1j5rj7txyyB WiHez7B/f9n2R/O8rAjeK1q0DSTrMTwhZV4jSmT+Krmqp4ks+0FVnHaLCVKDtCpcB+KvIsqTMti GiABvJyknoUOO69MzEc9h9Icd3Jbvx6tJdOqDyN06Py9qcLE4BBSQ0zeaYmB7yzY= X-Received: by 2002:a1c:f206:: with SMTP id s6mr2367093wmc.102.1629194129513; Tue, 17 Aug 2021 02:55:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwo/q4Fc9xidnqTx0nFjKSS4ighZYrJ8BdnoZsNJvhvU7Ue+IK/1NMAo7bC995wj7dpIpniNw== X-Received: by 2002:a1c:f206:: with SMTP id s6mr2367073wmc.102.1629194129209; Tue, 17 Aug 2021 02:55:29 -0700 (PDT) Return-Path: Received: from [192.168.1.36] (163.red-83-52-55.dynamicip.rima-tde.net. [83.52.55.163]) by smtp.gmail.com with ESMTPSA id d9sm1795452wrw.26.2021.08.17.02.55.28 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 17 Aug 2021 02:55:28 -0700 (PDT) Subject: Re: [PATCH v3 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support. To: Gerd Hoffmann , devel@edk2.groups.io References: <20210817092329.808150-1-kraxel@redhat.com> <20210817092329.808150-3-kraxel@redhat.com> From: =?UTF-8?B?UGhpbGlwcGUgTWF0aGlldS1EYXVkw6k=?= Message-ID: Date: Tue, 17 Aug 2021 11:55:27 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <20210817092329.808150-3-kraxel@redhat.com> Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=philmd@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Hi Gerd, On 8/17/21 11:23 AM, Gerd Hoffmann wrote: > Add support for virtio 1.0 to the mmio transport. virtio 0.9.5 uses > page size, page frame number and a fixed layout for the ring. virtio > 1.0 uses the physical addresses for base address, used bits and > available bits instead. > > The ring layout is not changed, so a 0.9.5 compatible layout is used in > both 0.9.5 and 1.0 mode to to keep the code differences as small as > possible. > > Signed-off-by: Gerd Hoffmann > Reviewed-by: Philippe Mathieu-Daude > --- > .../VirtioMmioDeviceLib/VirtioMmioDevice.h | 4 +++ > .../VirtioMmioDeviceLib/VirtioMmioDevice.c | 17 +++++++--- > .../VirtioMmioDeviceFunctions.c | 31 +++++++++++++++++-- > 3 files changed, 45 insertions(+), 7 deletions(-) > > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > index ab53b90d51c9..0c2f99633c46 100644 > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > @@ -23,9 +23,13 @@ > #include > > #define VIRTIO_MMIO_DEVICE_SIGNATURE SIGNATURE_32 ('V', 'M', 'I', 'O') > +#define VIRTIO_MMIO_DEVICE_VERSION_0_95 1 After looking at the next patch, I wonder if it wouldn't be simpler to add/use VIRTIO_MMIO_DEVICE_VERSION_0_95 in a preliminary patch (2/5), returning EFI_UNSUPPORTED when not v0.95. Next patch (3/5) add QueueNum for v0.95 (returning EFI_UNSUPPORTED for != v0.95) Then finally (4/5) add v1.00. Current 4/4 becomes 5/5. > +#define VIRTIO_MMIO_DEVICE_VERSION_1_00 2 So remove from this patch, > > typedef struct { > UINT32 Signature; > + UINT32 Version; > VIRTIO_DEVICE_PROTOCOL VirtioDevice; > PHYSICAL_ADDRESS BaseAddress; > } VIRTIO_MMIO_DEVICE; > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > index 6dbbba008c75..a97ef9352d0f 100644 > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > @@ -58,7 +58,6 @@ VirtioMmioInit ( > ) > { > UINT32 MagicValue; > - UINT32 Version; > > // > // Initialize VirtIo Mmio Device > @@ -66,7 +65,6 @@ VirtioMmioInit ( > CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate, > sizeof (VIRTIO_DEVICE_PROTOCOL)); > Device->BaseAddress = BaseAddress; > - Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); > Device->VirtioDevice.SubSystemDeviceId = > MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID); > > @@ -78,8 +76,19 @@ VirtioMmioInit ( > return EFI_UNSUPPORTED; > } > > - Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); > - if (Version != 1) { > + Device->Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); > + switch (Device->Version) { > + case VIRTIO_MMIO_DEVICE_VERSION_0_95: > + DEBUG ((DEBUG_INFO, "%a virtio 0.9.5, id %d\n", __FUNCTION__, > + Device->VirtioDevice.SubSystemDeviceId)); > + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); > + break; Remove from here <-- > + case VIRTIO_MMIO_DEVICE_VERSION_1_00: > + DEBUG ((DEBUG_INFO, "%a virtio 1.0, id %d\n", __FUNCTION__, > + Device->VirtioDevice.SubSystemDeviceId)); > + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0); > + break; --> to here (moved to 4/5). > + default: > return EFI_UNSUPPORTED; > } > > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > index b0d75fb1dd24..a0ee8e5f3c86 100644 > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > @@ -151,7 +151,9 @@ VirtioMmioSetPageSize ( > > Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); > > - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, PageSize); > + if (Device->Version == VIRTIO_MMIO_DEVICE_VERSION_0_95) { > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, PageSize); else EFI_UNSUPPORTED > + } > > return EFI_SUCCESS; > } > @@ -181,13 +183,36 @@ VirtioMmioSetQueueAddress ( > ) > { > VIRTIO_MMIO_DEVICE *Device; > + UINT64 Address; > > ASSERT (RingBaseShift == 0); > > Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); > > - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, > - (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); > + if (Device->Version == VIRTIO_MMIO_DEVICE_VERSION_0_95) { > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, > + (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); > + } else { EFI_UNSUPPORTED for now, > + Address = (UINT64)Ring->Base; > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO, > + (UINT32)Address); > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI, > + (UINT32)RShiftU64(Address, 32)); > + > + Address = (UINT64)Ring->Avail.Flags; > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO, > + (UINT32)Address); > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI, > + (UINT32)RShiftU64(Address, 32)); > + > + Address = (UINT64)Ring->Used.Flags; > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO, > + (UINT32)Address); > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI, > + (UINT32)RShiftU64(Address, 32)); > + > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1); ^ this moved to 4/5. > + } > > return EFI_SUCCESS; > } >