560a1521ae
All NVIDIA Tegra devices use a special partition table format for the internal storage partitioning. Most of Tegra devices have GPT partition in addition to TegraPT, but some older Android consumer-grade devices do not or GPT is placed in a wrong sector, and thus, the TegraPT is needed in order to support these devices properly by the upstream kernel. This patch adds support for NVIDIA Tegra Partition Table format that is used at least by all NVIDIA Tegra20 and Tegra30 devices. Tested-by: Nils Östlund <nils@naltan.com> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
71 lines
2.1 KiB
C
71 lines
2.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <linux/pagemap.h>
|
|
#include <linux/blkdev.h>
|
|
#include "../blk.h"
|
|
|
|
/*
|
|
* add_gd_partition adds a partitions details to the devices partition
|
|
* description.
|
|
*/
|
|
struct parsed_partitions {
|
|
struct gendisk *disk;
|
|
char name[BDEVNAME_SIZE];
|
|
struct {
|
|
sector_t from;
|
|
sector_t size;
|
|
int flags;
|
|
bool has_info;
|
|
struct partition_meta_info info;
|
|
} *parts;
|
|
int next;
|
|
int limit;
|
|
bool access_beyond_eod;
|
|
char *pp_buf;
|
|
};
|
|
|
|
typedef struct {
|
|
struct folio *v;
|
|
} Sector;
|
|
|
|
void *read_part_sector(struct parsed_partitions *state, sector_t n, Sector *p);
|
|
static inline void put_dev_sector(Sector p)
|
|
{
|
|
folio_put(p.v);
|
|
}
|
|
|
|
static inline void
|
|
put_partition(struct parsed_partitions *p, int n, sector_t from, sector_t size)
|
|
{
|
|
if (n < p->limit) {
|
|
char tmp[1 + BDEVNAME_SIZE + 10 + 1];
|
|
|
|
p->parts[n].from = from;
|
|
p->parts[n].size = size;
|
|
snprintf(tmp, sizeof(tmp), " %s%d", p->name, n);
|
|
strlcat(p->pp_buf, tmp, PAGE_SIZE);
|
|
}
|
|
}
|
|
|
|
/* detection routines go here in alphabetical order: */
|
|
int adfspart_check_ADFS(struct parsed_partitions *state);
|
|
int adfspart_check_CUMANA(struct parsed_partitions *state);
|
|
int adfspart_check_EESOX(struct parsed_partitions *state);
|
|
int adfspart_check_ICS(struct parsed_partitions *state);
|
|
int adfspart_check_POWERTEC(struct parsed_partitions *state);
|
|
int aix_partition(struct parsed_partitions *state);
|
|
int amiga_partition(struct parsed_partitions *state);
|
|
int atari_partition(struct parsed_partitions *state);
|
|
int cmdline_partition(struct parsed_partitions *state);
|
|
int efi_partition(struct parsed_partitions *state);
|
|
int ibm_partition(struct parsed_partitions *);
|
|
int karma_partition(struct parsed_partitions *state);
|
|
int ldm_partition(struct parsed_partitions *state);
|
|
int mac_partition(struct parsed_partitions *state);
|
|
int msdos_partition(struct parsed_partitions *state);
|
|
int osf_partition(struct parsed_partitions *state);
|
|
int sgi_partition(struct parsed_partitions *state);
|
|
int sun_partition(struct parsed_partitions *state);
|
|
int sysv68_partition(struct parsed_partitions *state);
|
|
int tegra_partition(struct parsed_partitions *state);
|
|
int ultrix_partition(struct parsed_partitions *state);
|