]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - platform-intel.h
Merge branch 'master' into devel-3.2
[thirdparty/mdadm.git] / platform-intel.h
index c1264825d930af4bd375971f5cfb33486db7be40..908843618de969bfc86120cecada0513a9d9c389 100644 (file)
@@ -17,6 +17,7 @@
  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  */
 #include <asm/types.h>
+#include <strings.h>
 
 /* The IMSM OROM Version Table definition */
 struct imsm_orom {
@@ -78,6 +79,91 @@ struct imsm_orom {
        __u32 reserved2;
 } __attribute__((packed));
 
+static inline int imsm_orom_has_raid0(const struct imsm_orom *orom)
+{
+       return !!(orom->rlc & IMSM_OROM_RLC_RAID0);
+}
+static inline int imsm_orom_has_raid1(const struct imsm_orom *orom)
+{
+       return !!(orom->rlc & IMSM_OROM_RLC_RAID1);
+}
+static inline int imsm_orom_has_raid1e(const struct imsm_orom *orom)
+{
+       return !!(orom->rlc & IMSM_OROM_RLC_RAID1E);
+}
+static inline int imsm_orom_has_raid10(const struct imsm_orom *orom)
+{
+       return !!(orom->rlc & IMSM_OROM_RLC_RAID10);
+}
+static inline int imsm_orom_has_raid5(const struct imsm_orom *orom)
+{
+       return !!(orom->rlc & IMSM_OROM_RLC_RAID5);
+}
+
+/**
+ * imsm_orom_has_chunk - check if the orom supports the given chunk size
+ * @orom: orom pointer from find_imsm_orom
+ * @chunk: chunk size in kibibytes
+ */
+static inline int imsm_orom_has_chunk(const struct imsm_orom *orom, int chunk)
+{
+       int fs = ffs(chunk);
+
+       if (!fs)
+               return 0;
+       fs--; /* bit num to bit index */
+       return !!(orom->sss & (1 << (fs - 1)));
+}
+
+/**
+ * fls - find last (most-significant) bit set
+ * @x: the word to search
+ * The funciton is borrowed from Linux kernel code
+ * include/asm-generic/bitops/fls.h
+ */
+static inline int fls(int x)
+{
+       int r = 32;
+
+       if (!x)
+               return 0;
+       if (!(x & 0xffff0000u)) {
+               x <<= 16;
+               r -= 16;
+       }
+       if (!(x & 0xff000000u)) {
+               x <<= 8;
+               r -= 8;
+       }
+       if (!(x & 0xf0000000u)) {
+               x <<= 4;
+               r -= 4;
+       }
+       if (!(x & 0xc0000000u)) {
+               x <<= 2;
+               r -= 2;
+       }
+       if (!(x & 0x80000000u)) {
+               x <<= 1;
+               r -= 1;
+       }
+       return r;
+}
+
+/**
+ * imsm_orom_default_chunk - return the largest chunk size supported via orom
+ * @orom: orom pointer from find_imsm_orom
+ */
+static inline int imsm_orom_default_chunk(const struct imsm_orom *orom)
+{
+       int fs = fls(orom->sss);
+
+       if (!fs)
+               return 0;
+
+       return min(512, (1 << fs));
+}
+
 struct sys_dev {
        char *path;
        struct sys_dev *next;