0001
0002 #ifndef _LINUX_KDEV_T_H
0003 #define _LINUX_KDEV_T_H
0004
0005 #include <uapi/linux/kdev_t.h>
0006
0007 #define MINORBITS 20
0008 #define MINORMASK ((1U << MINORBITS) - 1)
0009
0010 #define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
0011 #define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
0012 #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
0013
0014 #define print_dev_t(buffer, dev) \
0015 sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev))
0016
0017 #define format_dev_t(buffer, dev) \
0018 ({ \
0019 sprintf(buffer, "%u:%u", MAJOR(dev), MINOR(dev)); \
0020 buffer; \
0021 })
0022
0023
0024 static __always_inline bool old_valid_dev(dev_t dev)
0025 {
0026 return MAJOR(dev) < 256 && MINOR(dev) < 256;
0027 }
0028
0029 static __always_inline u16 old_encode_dev(dev_t dev)
0030 {
0031 return (MAJOR(dev) << 8) | MINOR(dev);
0032 }
0033
0034 static __always_inline dev_t old_decode_dev(u16 val)
0035 {
0036 return MKDEV((val >> 8) & 255, val & 255);
0037 }
0038
0039 static __always_inline u32 new_encode_dev(dev_t dev)
0040 {
0041 unsigned major = MAJOR(dev);
0042 unsigned minor = MINOR(dev);
0043 return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
0044 }
0045
0046 static __always_inline dev_t new_decode_dev(u32 dev)
0047 {
0048 unsigned major = (dev & 0xfff00) >> 8;
0049 unsigned minor = (dev & 0xff) | ((dev >> 12) & 0xfff00);
0050 return MKDEV(major, minor);
0051 }
0052
0053 static __always_inline u64 huge_encode_dev(dev_t dev)
0054 {
0055 return new_encode_dev(dev);
0056 }
0057
0058 static __always_inline dev_t huge_decode_dev(u64 dev)
0059 {
0060 return new_decode_dev(dev);
0061 }
0062
0063 static __always_inline int sysv_valid_dev(dev_t dev)
0064 {
0065 return MAJOR(dev) < (1<<14) && MINOR(dev) < (1<<18);
0066 }
0067
0068 static __always_inline u32 sysv_encode_dev(dev_t dev)
0069 {
0070 return MINOR(dev) | (MAJOR(dev) << 18);
0071 }
0072
0073 static __always_inline unsigned sysv_major(u32 dev)
0074 {
0075 return (dev >> 18) & 0x3fff;
0076 }
0077
0078 static __always_inline unsigned sysv_minor(u32 dev)
0079 {
0080 return dev & 0x3ffff;
0081 }
0082
0083 #endif