162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/fs/ufs/swab.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 1997, 1998 Francois-Rene Rideau <fare@tunes.org>
662306a36Sopenharmony_ci * Copyright (C) 1998 Jakub Jelinek <jj@ultra.linux.cz>
762306a36Sopenharmony_ci * Copyright (C) 2001 Christoph Hellwig <hch@infradead.org>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef _UFS_SWAB_H
1162306a36Sopenharmony_ci#define _UFS_SWAB_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci * Notes:
1562306a36Sopenharmony_ci *    HERE WE ASSUME EITHER BIG OR LITTLE ENDIAN UFSes
1662306a36Sopenharmony_ci *    in case there are ufs implementations that have strange bytesexes,
1762306a36Sopenharmony_ci *    you'll need to modify code here as well as in ufs_super.c and ufs_fs.h
1862306a36Sopenharmony_ci *    to support them.
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cienum {
2262306a36Sopenharmony_ci	BYTESEX_LE,
2362306a36Sopenharmony_ci	BYTESEX_BE
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic inline u64
2762306a36Sopenharmony_cifs64_to_cpu(struct super_block *sbp, __fs64 n)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
3062306a36Sopenharmony_ci		return le64_to_cpu((__force __le64)n);
3162306a36Sopenharmony_ci	else
3262306a36Sopenharmony_ci		return be64_to_cpu((__force __be64)n);
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic inline __fs64
3662306a36Sopenharmony_cicpu_to_fs64(struct super_block *sbp, u64 n)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
3962306a36Sopenharmony_ci		return (__force __fs64)cpu_to_le64(n);
4062306a36Sopenharmony_ci	else
4162306a36Sopenharmony_ci		return (__force __fs64)cpu_to_be64(n);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline u32
4562306a36Sopenharmony_cifs32_to_cpu(struct super_block *sbp, __fs32 n)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
4862306a36Sopenharmony_ci		return le32_to_cpu((__force __le32)n);
4962306a36Sopenharmony_ci	else
5062306a36Sopenharmony_ci		return be32_to_cpu((__force __be32)n);
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline __fs32
5462306a36Sopenharmony_cicpu_to_fs32(struct super_block *sbp, u32 n)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
5762306a36Sopenharmony_ci		return (__force __fs32)cpu_to_le32(n);
5862306a36Sopenharmony_ci	else
5962306a36Sopenharmony_ci		return (__force __fs32)cpu_to_be32(n);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline void
6362306a36Sopenharmony_cifs32_add(struct super_block *sbp, __fs32 *n, int d)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
6662306a36Sopenharmony_ci		le32_add_cpu((__le32 *)n, d);
6762306a36Sopenharmony_ci	else
6862306a36Sopenharmony_ci		be32_add_cpu((__be32 *)n, d);
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic inline void
7262306a36Sopenharmony_cifs32_sub(struct super_block *sbp, __fs32 *n, int d)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
7562306a36Sopenharmony_ci		le32_add_cpu((__le32 *)n, -d);
7662306a36Sopenharmony_ci	else
7762306a36Sopenharmony_ci		be32_add_cpu((__be32 *)n, -d);
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic inline u16
8162306a36Sopenharmony_cifs16_to_cpu(struct super_block *sbp, __fs16 n)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
8462306a36Sopenharmony_ci		return le16_to_cpu((__force __le16)n);
8562306a36Sopenharmony_ci	else
8662306a36Sopenharmony_ci		return be16_to_cpu((__force __be16)n);
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistatic inline __fs16
9062306a36Sopenharmony_cicpu_to_fs16(struct super_block *sbp, u16 n)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
9362306a36Sopenharmony_ci		return (__force __fs16)cpu_to_le16(n);
9462306a36Sopenharmony_ci	else
9562306a36Sopenharmony_ci		return (__force __fs16)cpu_to_be16(n);
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic inline void
9962306a36Sopenharmony_cifs16_add(struct super_block *sbp, __fs16 *n, int d)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
10262306a36Sopenharmony_ci		le16_add_cpu((__le16 *)n, d);
10362306a36Sopenharmony_ci	else
10462306a36Sopenharmony_ci		be16_add_cpu((__be16 *)n, d);
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic inline void
10862306a36Sopenharmony_cifs16_sub(struct super_block *sbp, __fs16 *n, int d)
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE)
11162306a36Sopenharmony_ci		le16_add_cpu((__le16 *)n, -d);
11262306a36Sopenharmony_ci	else
11362306a36Sopenharmony_ci		be16_add_cpu((__be16 *)n, -d);
11462306a36Sopenharmony_ci}
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#endif /* _UFS_SWAB_H */
117