* [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB
@ 2020-06-25 15:48 Philippe Mathieu-Daudé
2020-06-25 18:23 ` Klaus Jensen
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-25 15:48 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, qemu-block, Klaus Jensen, Max Reitz, Keith Busch,
Maxim Levitsky, Philippe Mathieu-Daudé
Simplify the NVMe emulated device by aligning the I/O BAR to 4 KiB.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
include/block/nvme.h | 3 +++
hw/block/nvme.c | 5 ++---
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/include/block/nvme.h b/include/block/nvme.h
index 1720ee1d51..6d87c9c146 100644
--- a/include/block/nvme.h
+++ b/include/block/nvme.h
@@ -22,6 +22,8 @@ typedef struct NvmeBar {
uint32_t pmrebs;
uint32_t pmrswtp;
uint32_t pmrmsc;
+ uint32_t reserved[58];
+ uint8_t cmd_set_specfic[0x100];
} NvmeBar;
enum NvmeCapShift {
@@ -879,6 +881,7 @@ enum NvmeIdNsDps {
static inline void _nvme_check_size(void)
{
+ QEMU_BUILD_BUG_ON(sizeof(NvmeBar) != 4096);
QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) != 4);
QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) != 16);
QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) != 16);
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 1aee042d4c..1938891e50 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -55,7 +55,6 @@
#include "nvme.h"
#define NVME_MAX_IOQPAIRS 0xffff
-#define NVME_REG_SIZE 0x1000
#define NVME_DB_SIZE 4
#define NVME_CMB_BIR 2
#define NVME_PMR_BIR 2
@@ -1322,7 +1321,7 @@ static void nvme_mmio_write(void *opaque, hwaddr addr, uint64_t data,
NvmeCtrl *n = (NvmeCtrl *)opaque;
if (addr < sizeof(n->bar)) {
nvme_write_bar(n, addr, data, size);
- } else if (addr >= 0x1000) {
+ } else {
nvme_process_db(n, addr, data);
}
}
@@ -1416,7 +1415,7 @@ static void nvme_init_state(NvmeCtrl *n)
{
n->num_namespaces = 1;
/* add one to max_ioqpairs to account for the admin queue pair */
- n->reg_size = pow2ceil(NVME_REG_SIZE +
+ n->reg_size = pow2ceil(sizeof(NvmeBar) +
2 * (n->params.max_ioqpairs + 1) * NVME_DB_SIZE);
n->namespaces = g_new0(NvmeNamespace, n->num_namespaces);
n->sq = g_new0(NvmeSQueue *, n->params.max_ioqpairs + 1);
--
2.21.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB
2020-06-25 15:48 [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB Philippe Mathieu-Daudé
@ 2020-06-25 18:23 ` Klaus Jensen
2020-06-30 8:35 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 5+ messages in thread
From: Klaus Jensen @ 2020-06-25 18:23 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Kevin Wolf, qemu-block, Klaus Jensen, qemu-devel, Max Reitz,
Keith Busch
On Jun 25 17:48, Philippe Mathieu-Daudé wrote:
> Simplify the NVMe emulated device by aligning the I/O BAR to 4 KiB.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> include/block/nvme.h | 3 +++
> hw/block/nvme.c | 5 ++---
> 2 files changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/include/block/nvme.h b/include/block/nvme.h
> index 1720ee1d51..6d87c9c146 100644
> --- a/include/block/nvme.h
> +++ b/include/block/nvme.h
> @@ -22,6 +22,8 @@ typedef struct NvmeBar {
> uint32_t pmrebs;
> uint32_t pmrswtp;
> uint32_t pmrmsc;
> + uint32_t reserved[58];
> + uint8_t cmd_set_specfic[0x100];
> } NvmeBar;
This ends up as a freak mix of v1.3 and v1.4 specs. Since we already
have the PMR stuff in there, I think it makes more sense to align with
v1.4 and remove the reserved bytes.
Otherwise, LGTM.
Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB
2020-06-25 18:23 ` Klaus Jensen
@ 2020-06-30 8:35 ` Philippe Mathieu-Daudé
2020-06-30 8:46 ` Klaus Jensen
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-30 8:35 UTC (permalink / raw)
To: Klaus Jensen
Cc: Kevin Wolf, qemu-block, Klaus Jensen, qemu-devel, Max Reitz,
Keith Busch
Hi Klaus,
On 6/25/20 8:23 PM, Klaus Jensen wrote:
> On Jun 25 17:48, Philippe Mathieu-Daudé wrote:
>> Simplify the NVMe emulated device by aligning the I/O BAR to 4 KiB.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>> ---
>> include/block/nvme.h | 3 +++
>> hw/block/nvme.c | 5 ++---
>> 2 files changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/block/nvme.h b/include/block/nvme.h
>> index 1720ee1d51..6d87c9c146 100644
>> --- a/include/block/nvme.h
>> +++ b/include/block/nvme.h
>> @@ -22,6 +22,8 @@ typedef struct NvmeBar {
>> uint32_t pmrebs;
>> uint32_t pmrswtp;
>> uint32_t pmrmsc;
>> + uint32_t reserved[58];
>> + uint8_t cmd_set_specfic[0x100];
>> } NvmeBar;
>
> This ends up as a freak mix of v1.3 and v1.4 specs. Since we already
> have the PMR stuff in there, I think it makes more sense to align with
> v1.4 and remove the reserved bytes.
I'm sorry but I don't understand what you'd prefer, removing the
cmd_set_specfic[] for v1.3 and instead use this?
uint32_t pmrmsc;
+ uint32_t reserved[122];
} NvmeBar;
Or this?
uint32_t pmrmsc;
+ uint8_t reserved[488];
} NvmeBar;
>
> Otherwise, LGTM.
>
> Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB
2020-06-30 8:35 ` Philippe Mathieu-Daudé
@ 2020-06-30 8:46 ` Klaus Jensen
2020-06-30 9:39 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 5+ messages in thread
From: Klaus Jensen @ 2020-06-30 8:46 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Kevin Wolf, qemu-block, Klaus Jensen, qemu-devel, Max Reitz,
Keith Busch
On Jun 30 10:35, Philippe Mathieu-Daudé wrote:
> Hi Klaus,
>
> On 6/25/20 8:23 PM, Klaus Jensen wrote:
> > On Jun 25 17:48, Philippe Mathieu-Daudé wrote:
> >> Simplify the NVMe emulated device by aligning the I/O BAR to 4 KiB.
> >>
> >> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> >> ---
> >> include/block/nvme.h | 3 +++
> >> hw/block/nvme.c | 5 ++---
> >> 2 files changed, 5 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/include/block/nvme.h b/include/block/nvme.h
> >> index 1720ee1d51..6d87c9c146 100644
> >> --- a/include/block/nvme.h
> >> +++ b/include/block/nvme.h
> >> @@ -22,6 +22,8 @@ typedef struct NvmeBar {
> >> uint32_t pmrebs;
> >> uint32_t pmrswtp;
> >> uint32_t pmrmsc;
> >> + uint32_t reserved[58];
> >> + uint8_t cmd_set_specfic[0x100];
> >> } NvmeBar;
> >
> > This ends up as a freak mix of v1.3 and v1.4 specs. Since we already
> > have the PMR stuff in there, I think it makes more sense to align with
> > v1.4 and remove the reserved bytes.
>
> I'm sorry but I don't understand what you'd prefer, removing the
> cmd_set_specfic[] for v1.3 and instead use this?
>
> uint32_t pmrmsc;
> + uint32_t reserved[122];
> } NvmeBar;
>
> Or this?
>
> uint32_t pmrmsc;
> + uint8_t reserved[488];
> } NvmeBar;
>
Yes, the second one.
But it should be 484 bytes reserved and the bug is in the pmrmsc field
that should be uint64_t. Can you fix that as well? :)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB
2020-06-30 8:46 ` Klaus Jensen
@ 2020-06-30 9:39 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-30 9:39 UTC (permalink / raw)
To: Klaus Jensen
Cc: Kevin Wolf, qemu-block, Klaus Jensen, qemu-devel, Max Reitz,
Keith Busch
On 6/30/20 10:46 AM, Klaus Jensen wrote:
> On Jun 30 10:35, Philippe Mathieu-Daudé wrote:
>> Hi Klaus,
>>
>> On 6/25/20 8:23 PM, Klaus Jensen wrote:
>>> On Jun 25 17:48, Philippe Mathieu-Daudé wrote:
>>>> Simplify the NVMe emulated device by aligning the I/O BAR to 4 KiB.
>>>>
>>>> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>>>> ---
>>>> include/block/nvme.h | 3 +++
>>>> hw/block/nvme.c | 5 ++---
>>>> 2 files changed, 5 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/include/block/nvme.h b/include/block/nvme.h
>>>> index 1720ee1d51..6d87c9c146 100644
>>>> --- a/include/block/nvme.h
>>>> +++ b/include/block/nvme.h
>>>> @@ -22,6 +22,8 @@ typedef struct NvmeBar {
>>>> uint32_t pmrebs;
>>>> uint32_t pmrswtp;
>>>> uint32_t pmrmsc;
>>>> + uint32_t reserved[58];
>>>> + uint8_t cmd_set_specfic[0x100];
>>>> } NvmeBar;
>>>
>>> This ends up as a freak mix of v1.3 and v1.4 specs. Since we already
>>> have the PMR stuff in there, I think it makes more sense to align with
>>> v1.4 and remove the reserved bytes.
>>
>> I'm sorry but I don't understand what you'd prefer, removing the
>> cmd_set_specfic[] for v1.3 and instead use this?
>>
>> uint32_t pmrmsc;
>> + uint32_t reserved[122];
>> } NvmeBar;
>>
>> Or this?
>>
>> uint32_t pmrmsc;
>> + uint8_t reserved[488];
>> } NvmeBar;
>>
>
> Yes, the second one.
>
> But it should be 484 bytes reserved and the bug is in the pmrmsc field
> that should be uint64_t. Can you fix that as well? :)
>
Ah this is what you did in "hw/block/nvme: add NVMe 1.4 specific fields"
https://www.mail-archive.com/qemu-devel@nongnu.org/msg717891.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-06-30 9:40 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-25 15:48 [PATCH] hw/block/nvme: Align I/O BAR to 4 KiB Philippe Mathieu-Daudé
2020-06-25 18:23 ` Klaus Jensen
2020-06-30 8:35 ` Philippe Mathieu-Daudé
2020-06-30 8:46 ` Klaus Jensen
2020-06-30 9:39 ` Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).