1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * fs/partitions/karma.c 4*4882a593Smuzhiyun * Rio Karma partition info. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2006 Bob Copeland (me@bobcopeland.com) 7*4882a593Smuzhiyun * based on osf.c 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include "check.h" 11*4882a593Smuzhiyun #include <linux/compiler.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define KARMA_LABEL_MAGIC 0xAB56 14*4882a593Smuzhiyun karma_partition(struct parsed_partitions * state)15*4882a593Smuzhiyunint karma_partition(struct parsed_partitions *state) 16*4882a593Smuzhiyun { 17*4882a593Smuzhiyun int i; 18*4882a593Smuzhiyun int slot = 1; 19*4882a593Smuzhiyun Sector sect; 20*4882a593Smuzhiyun unsigned char *data; 21*4882a593Smuzhiyun struct disklabel { 22*4882a593Smuzhiyun u8 d_reserved[270]; 23*4882a593Smuzhiyun struct d_partition { 24*4882a593Smuzhiyun __le32 p_res; 25*4882a593Smuzhiyun u8 p_fstype; 26*4882a593Smuzhiyun u8 p_res2[3]; 27*4882a593Smuzhiyun __le32 p_offset; 28*4882a593Smuzhiyun __le32 p_size; 29*4882a593Smuzhiyun } d_partitions[2]; 30*4882a593Smuzhiyun u8 d_blank[208]; 31*4882a593Smuzhiyun __le16 d_magic; 32*4882a593Smuzhiyun } __packed *label; 33*4882a593Smuzhiyun struct d_partition *p; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun data = read_part_sector(state, 0, §); 36*4882a593Smuzhiyun if (!data) 37*4882a593Smuzhiyun return -1; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun label = (struct disklabel *)data; 40*4882a593Smuzhiyun if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) { 41*4882a593Smuzhiyun put_dev_sector(sect); 42*4882a593Smuzhiyun return 0; 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun p = label->d_partitions; 46*4882a593Smuzhiyun for (i = 0 ; i < 2; i++, p++) { 47*4882a593Smuzhiyun if (slot == state->limit) 48*4882a593Smuzhiyun break; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) { 51*4882a593Smuzhiyun put_partition(state, slot, le32_to_cpu(p->p_offset), 52*4882a593Smuzhiyun le32_to_cpu(p->p_size)); 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun slot++; 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun strlcat(state->pp_buf, "\n", PAGE_SIZE); 57*4882a593Smuzhiyun put_dev_sector(sect); 58*4882a593Smuzhiyun return 1; 59*4882a593Smuzhiyun } 60*4882a593Smuzhiyun 61