Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Jan 2021 19:13:31 +0000
From:      Jessica Clarke <jrtc27@freebsd.org>
To:        Chuck Tuffli <chuck@FreeBSD.org>
Cc:        "src-committers@freebsd.org" <src-committers@FreeBSD.org>, "dev-commits-src-all@freebsd.org" <dev-commits-src-all@FreeBSD.org>, "dev-commits-src-main@freebsd.org" <dev-commits-src-main@FreeBSD.org>
Subject:   Re: git: 6733401935f8 - main - nvmecontrol: add device self-test op and log page
Message-ID:  <74314BD0-A0F8-481A-93A0-28FB83CB2717@freebsd.org>
In-Reply-To: <202101081729.108HTG7j066884@gitrepo.freebsd.org>
References:  <202101081729.108HTG7j066884@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 8 Jan 2021, at 17:29, Chuck Tuffli <chuck@FreeBSD.org> wrote:
> diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h
> index 3c159b1fd0fc..67d02ba73fd8 100644
> --- a/sys/dev/nvme/nvme.h
> +++ b/sys/dev/nvme/nvme.h
> @@ -1396,6 +1396,28 @@ struct nvme_command_effects_page {
> _Static_assert(sizeof(struct nvme_command_effects_page) =3D=3D 4096,
>     "bad size for nvme_command_effects_page");
>=20
> +struct nvme_device_self_test_page {
> +	uint8_t			curr_operation;
> +	uint8_t			curr_compl;
> +	uint8_t			rsvd2[2];
> +	struct {
> +		uint8_t		status;
> +		uint8_t		segment_num;
> +		uint8_t		valid_diag_info;
> +		uint8_t		rsvd3;
> +		uint64_t	poh;
> +		uint32_t	nsid;
> +		/* Define as an array to simplify alignment issues */
> +		uint8_t		failing_lba[8];
> +		uint8_t		status_code_type;
> +		uint8_t		status_code;
> +		uint8_t		vendor_specific[2];
> +	} __packed result[20];
> +} __packed __aligned(4);
> +
> +_Static_assert(sizeof(struct nvme_device_self_test_page) =3D=3D 564,
> +    "bad size for nvme_device_self_test_page");
> +
> struct nvme_res_notification_page {
> 	uint64_t		log_page_count;
> 	uint8_t			log_page_type;
> @@ -2016,4 +2038,21 @@ void	nvme_resv_status_ext_swapbytes(struct =
nvme_resv_status_ext *s __unused,
> #endif
> }
>=20
> +static inline void
> +nvme_device_self_test_swapbytes(struct nvme_device_self_test_page *s =
__unused)
> +{
> +#if _BYTE_ORDER !=3D _LITTLE_ENDIAN
> +	uint64_t failing_lba;
> +	uint32_t r;
> +
> +	for (r =3D 0; r < 20; r++) {
> +		s->result[r].poh =3D le64toh(s->result[r].poh);
> +		s->result[r].nsid =3D le32toh(s->result[r].nsid);
> +		/* Unaligned 64-bit loads fail on some architectures */
> +		memcpy(&failing_lba, s->result[r].failing_lba, =
sizeof(failing_lba));
> +		failing_lba =3D le64toh(failing_lba);
> +		memcpy(s->result[r].failing_lba, &failing_lba, =
sizeof(failing_lba));
> +	}
> +#endif
> +}
> #endif /* __NVME_H__ */

Hi,
This broke powerpc and powerpc64:

In file included from ioctl.c:33:
In file included from /home/jrtc27/src/sys/./cam/scsi/scsi_pass.h:35:
In file included from /home/jrtc27/src/sys/cam/cam_ccb.h:46:
In file included from /home/jrtc27/src/sys/cam/nvme/nvme_all.h:33:
/home/jrtc27/src/sys/dev/nvme/nvme.h:2052:3: error: implicitly declaring =
library function 'memcpy' with type 'void *(void *, const void *, =
unsigned long)' [-Werror,-Wimplicit-function-declaration]
                memcpy(&failing_lba, s->result[r].failing_lba, =
sizeof(failing_lba));
                ^
/home/jrtc27/src/sys/dev/nvme/nvme.h:2052:3: note: include the header =
<string.h> or explicitly provide a declaration for 'memcpy'
1 error generated.
--- ioctl.o ---
*** [ioctl.o] Error code 1

make[7]: stopped in /home/jrtc27/src/lib/libsysdecode
1 error

Jess




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?74314BD0-A0F8-481A-93A0-28FB83CB2717>