Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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 /* acceptable for old filesystems */
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