Skip to content

Commit

Permalink
common: Use 64 bit writes per default
Browse files Browse the repository at this point in the history
Also have a flag to fallback to 32 bit writes.

Signed-off-by: Tokunori Ikegami <[email protected]>
  • Loading branch information
ikegami-t committed Jan 30, 2024
1 parent 244b66b commit 1b6e87c
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 8 deletions.
18 changes: 11 additions & 7 deletions common.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#define _COMMON_H

#include <string.h>
#include <stdbool.h>

#include "ccan/endian/endian.h"

Expand Down Expand Up @@ -42,14 +43,17 @@ static inline void mmio_write32(void *addr, uint32_t value)
*p = cpu_to_le32(value);
}

/* Access 64-bit registers as 2 32-bit; Some devices fail 64-bit MMIO. */
static inline void mmio_write64(void *addr, uint64_t value)
/* Access 64-bit registers as 2 32-bit if write32 flag set; Some devices fail 64-bit MMIO. */
static inline void mmio_write64(void *addr, uint64_t value, bool write32)
{
uint32_t *p = addr;
uint32_t low = value;
uint32_t high = value >> 32;
uint64_t *p = addr;

if (write32) {
mmio_write32(addr, value);
mmio_write32(addr + 1, value >> 32);
return;
}

*p = cpu_to_le32(low);
*(p + 1) = cpu_to_le32(high);
*p = cpu_to_le64(value);
}
#endif
2 changes: 1 addition & 1 deletion nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -5416,7 +5416,7 @@ static int get_register(int argc, char **argv, struct command *cmd, struct plugi
static void nvme_set_register(void *bar, int offset, uint64_t value)
{
if (nvme_is_64bit_reg(offset))
mmio_write64(bar + offset, value);
mmio_write64(bar + offset, value, false);
else
mmio_write32(bar + offset, value);
}
Expand Down

0 comments on commit 1b6e87c

Please sign in to comment.