Upload Tizen:Base source
[framework/base/util-linux-ng.git] / shlibs / blkid / src / probers / silicon_raid.c
1 /*
2  * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
3  * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
4  *
5  * Inspired by libvolume_id by
6  *     Kay Sievers <kay.sievers@vrfy.org>
7  *
8  * This file may be redistributed under the terms of the
9  * GNU Lesser General Public License.
10  */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <string.h>
15 #include <errno.h>
16 #include <ctype.h>
17 #include <stdint.h>
18
19 #include "blkidP.h"
20
21 struct silicon_metadata {
22         uint8_t         unknown0[0x2E];
23         uint8_t         ascii_version[0x36 - 0x2E];
24         uint8_t         diskname[0x56 - 0x36];
25         uint8_t         unknown1[0x60 - 0x56];
26         uint32_t        magic;
27         uint32_t        unknown1a[0x6C - 0x64];
28         uint32_t        array_sectors_low;
29         uint32_t        array_sectors_high;
30         uint8_t         unknown2[0x78 - 0x74];
31         uint32_t        thisdisk_sectors;
32         uint8_t         unknown3[0x100 - 0x7C];
33         uint8_t         unknown4[0x104 - 0x100];
34         uint16_t        product_id;
35         uint16_t        vendor_id;
36         uint16_t        minor_ver;
37         uint16_t        major_ver;
38 } __attribute__((packed));
39
40 #define SILICON_MAGIC           0x2F000000
41
42
43 static int probe_silraid(blkid_probe pr, const struct blkid_idmag *mag)
44 {
45         uint64_t off;
46         struct silicon_metadata *sil;
47
48         if (pr->size < 0x10000)
49                 return -1;
50
51         off = ((pr->size / 0x200) - 1) * 0x200;
52
53         sil = (struct silicon_metadata *)
54                         blkid_probe_get_buffer(pr, off,
55                                 sizeof(struct silicon_metadata));
56         if (!sil)
57                 return -1;
58
59         if (le32_to_cpu(sil->magic) != SILICON_MAGIC)
60                 return -1;
61
62         if (blkid_probe_sprintf_version(pr, "%u.%u",
63                                 le16_to_cpu(sil->major_ver),
64                                 le16_to_cpu(sil->minor_ver)) != 0)
65                 return -1;
66
67         return 0;
68 }
69
70 const struct blkid_idinfo silraid_idinfo = {
71         .name           = "silicon_medley_raid_member",
72         .usage          = BLKID_USAGE_RAID,
73         .probefunc      = probe_silraid,
74         .magics         = BLKID_NONE_MAGIC
75 };
76
77