/*
 * Copyright (C) 2008 RuggedCom, Inc.
 * Richard Retanubun <RichardRetanubun@RuggedCom.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

/*
 * See also linux/fs/partitions/efi.h
 *
 * EFI GUID Partition Table
 * Per Intel EFI Specification v1.02
 * http://developer.intel.com/technology/efi/efi.htm
*/

#include <linux/compiler.h>

#include <efi.h>

#ifndef _DISK_PART_EFI_H
#define _DISK_PART_EFI_H

#define MSDOS_MBR_SIGNATURE 0xAA55
#define EFI_PMBR_OSTYPE_EFI 0xEF
#define EFI_PMBR_OSTYPE_EFI_GPT 0xEE

#define GPT_HEADER_SIGNATURE 0x5452415020494645ULL
#define GPT_HEADER_REVISION_V1 0x00010000
#define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL
#define GPT_ENTRY_NAME "gpt"
#define GPT_ENTRY_NUMBERS		128
#define GPT_ENTRY_SIZE			128

#define PARTITION_SYSTEM_GUID \
	EFI_GUID( 0xC12A7328, 0xF81F, 0x11d2, \
		0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B)
#define LEGACY_MBR_PARTITION_GUID \
	EFI_GUID( 0x024DEE41, 0x33E7, 0x11d3, \
		0x9D, 0x69, 0x00, 0x08, 0xC7, 0x81, 0xF3, 0x9F)
#define PARTITION_MSFT_RESERVED_GUID \
	EFI_GUID( 0xE3C9E316, 0x0B5C, 0x4DB8, \
		0x81, 0x7D, 0xF9, 0x2D, 0xF0, 0x02, 0x15, 0xAE)
#define PARTITION_BASIC_DATA_GUID \
	EFI_GUID( 0xEBD0A0A2, 0xB9E5, 0x4433, \
		0x87, 0xC0, 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7)
#define PARTITION_LINUX_FILE_SYSTEM_DATA_GUID \
	EFI_GUID(0x0FC63DAF, 0x8483, 0x4772, \
		0x8E, 0x79, 0x3D, 0x69, 0xD8, 0x47, 0x7D, 0xE4)
#define PARTITION_LINUX_RAID_GUID \
	EFI_GUID( 0xa19d880f, 0x05fc, 0x4d3b, \
		0xa0, 0x06, 0x74, 0x3f, 0x0f, 0x84, 0x91, 0x1e)
#define PARTITION_LINUX_SWAP_GUID \
	EFI_GUID( 0x0657fd6d, 0xa4ab, 0x43c4, \
		0x84, 0xe5, 0x09, 0x33, 0xc8, 0x4b, 0x4f, 0x4f)
#define PARTITION_LINUX_LVM_GUID \
	EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \
		0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28)
#define PARTITION_LINUX_DEFAULT_GUID \
	EFI_GUID(0x0FC63DAF, 0x8483, 0x4772, \
		0x8E, 0x79, 0x3D, 0x69, 0xD8, 0x47, 0x7D, 0xE4)
#define PARTITION_ANDROID_BOOTLOADER_GUID \
	EFI_GUID(0x2568845D, 0x2332, 0x4675, \
		0xBC, 0x39, 0x8F, 0xA5, 0xA4, 0x74, 0x8D, 0x15)
#define PARTITION_ANDROID_BOOTLOADER2_GUID \
	EFI_GUID(0x114EAFFE, 0x1552, 0x4022, \
		0xB2, 0x6E, 0x9B, 0x05, 0x36, 0x04, 0xCF, 0x84)
#define PARTITION_ANDROID_RECOVERY_GUID \
	EFI_GUID(0x4177C722, 0x9E92, 0x4AAB, \
		0x86, 0x44, 0x43, 0x50, 0x2B, 0xFD, 0x55, 0x06)
#define PARTITION_ANDROID_MISC_GUID \
	EFI_GUID(0xEF32A33B, 0xA409, 0x486C, \
		0x91, 0X41, 0x9F, 0xFB, 0x71, 0x1F, 0x62, 0x66)
#define PARTITION_ANDROID_METADATA_GUID\
	EFI_GUID(0x20AC26BE, 0x20B7, 0x11E3, \
		0x84, 0xC5, 0x6C, 0xFD, 0xB9, 0x47, 0x11, 0xE9)
#define PARTITION_ANDROID_SYSTEM_GUID \
	EFI_GUID(0x38F428E6, 0xD326, 0x425D, \
		0x91, 0x40, 0x6E, 0x0E, 0xA1, 0x33, 0x64, 0x7C)
#define PARTITION_ANDROID_CACHE_GUID \
	EFI_GUID(0xA893EF21, 0xE428, 0x470A, \
		0x9E, 0x55, 0x06, 0x68, 0xFD, 0x91, 0xA2, 0xD9)
#define PARTITION_ANDROID_DATA_GUID \
	EFI_GUID(0xDC76DDA9, 0x5AC1, 0x491C, \
		0xAF, 0x42, 0xA8, 0x25, 0x91, 0x58, 0x0C, 0x0D)
#define PARTITION_ANDROID_PERSISTENT_GUID \
	EFI_GUID(0xEBC597D0, 0x2053, 0x4B15, \
		0x8B, 0x64, 0xE0, 0xAA, 0xC7, 0x5F, 0x4D, 0xB1)
#define PARTITION_ANDROID_VENDOR_GUID \
	EFI_GUID(0xC5A0AEEC, 0x13EA, 0x11E5, \
		0xA1, 0xB1, 0x00, 0x1E, 0x67, 0xCA, 0x0C, 0x3C)
#define PARTITION_ANDROID_CONFIG_GUID \
	EFI_GUID(0xBD59408B, 0x4514, 0x490D, \
		0xBF, 0x12, 0x98, 0x78, 0xD9, 0x63, 0xF3, 0x78)
#define PARTITION_ANDROID_FACTORY_GUID \
	EFI_GUID(0x8F68CC74, 0xC5E5, 0x48DA, \
		0xBE, 0x01, 0xA0, 0xC8, 0xC1, 0x5E, 0x9C, 0x80)
#define PARTITION_ANDROID_FACTORY_ALT_GUID \
	EFI_GUID(0x9FDAA6EF, 0x4B3F, 0x40D2, \
		0xBA, 0x8D, 0xBF, 0xF1, 0x6B, 0xFB, 0x88, 0x78)
#define PARTITION_ANDROID_FASTBOOT_GUID \
	EFI_GUID(0x767941D0, 0x2085, 0x11E3, \
		0xAD, 0x3B, 0x6C, 0xFD, 0xB9, 0x47, 0x11, 0xE9)
#define PARTITION_ANDROID_TERTIARY_GUID \
	EFI_GUID(0x767941D0, 0x2085, 0x11E3, \
		0xAD, 0x3B, 0x6C, 0xFD, 0xB9, 0x47, 0x11, 0xE9)
#define PARTITION_ANDROID_OEM_GUID \
	EFI_GUID(0xAC6D7924, 0xEB71, 0x4DF8, \
		0xB4, 0x8D, 0xE2, 0x67, 0xB2, 0x71, 0x48, 0xFF)

/* linux/include/efi.h */
typedef u16 efi_char16_t;

/* based on linux/include/genhd.h */
struct partition {
	u8 boot_ind;		/* 0x80 - active */
	u8 head;		/* starting head */
	u8 sector;		/* starting sector */
	u8 cyl;			/* starting cylinder */
	u8 sys_ind;		/* What partition type */
	u8 end_head;		/* end head */
	u8 end_sector;		/* end sector */
	u8 end_cyl;		/* end cylinder */
	__le32 start_sect;	/* starting sector counting from 0 */
	__le32 nr_sects;	/* nr of sectors in partition */
} __packed;

/* based on linux/fs/partitions/efi.h */
typedef struct _gpt_header {
	__le64 signature;
	__le32 revision;
	__le32 header_size;
	__le32 header_crc32;
	__le32 reserved1;
	__le64 my_lba;
	__le64 alternate_lba;
	__le64 first_usable_lba;
	__le64 last_usable_lba;
	efi_guid_t disk_guid;
	__le64 partition_entry_lba;
	__le32 num_partition_entries;
	__le32 sizeof_partition_entry;
	__le32 partition_entry_array_crc32;
} __packed gpt_header;
int gpt_restore(block_dev_desc_t *dev_desc, char *str_disk_guid,
		disk_partition_t *partitions, const int parts_count);


typedef union _gpt_entry_attributes {
	struct {
		u64 required_to_function:1;
		u64 no_block_io_protocol:1;
		u64 legacy_bios_bootable:1;
		u64 reserved:45;
		u64 type_guid_specific:16;
	} fields;
	unsigned long long raw;
} __packed gpt_entry_attributes;

#define PARTNAME_SZ	(72 / sizeof(efi_char16_t))
typedef struct _gpt_entry {
	efi_guid_t partition_type_guid;
	efi_guid_t unique_partition_guid;
	__le64 starting_lba;
	__le64 ending_lba;
	gpt_entry_attributes attributes;
	efi_char16_t partition_name[PARTNAME_SZ];
} __packed gpt_entry;

typedef struct _legacy_mbr {
	u8 boot_code[440];
	__le32 unique_mbr_signature;
	__le16 unknown;
	struct partition partition_record[4];
	__le16 signature;
} __packed legacy_mbr;

#endif	/* _DISK_PART_EFI_H */

int pmbr_part_valid(struct partition *part);
int is_pmbr_valid(legacy_mbr * mbr);
int is_gpt_valid(block_dev_desc_t *dev_desc, u64 lba,
			gpt_header *pgpt_head, gpt_entry **pgpt_pte);
gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
				gpt_header * pgpt_head);
int is_pte_valid(gpt_entry * pte);

/* GPT partition type GUIDs in string format.
 *
 * The Firmware SDK provides these in binary format but this codebase expects
 * them as strings. This creates a bit of duplication, we may want to move code
 * over to the Firmware SDK format at some point, but is fine for now.
 */
#define GPT_DURABLE_NAME	"durable"
#define GPT_DURABLE_TYPE_GUID_STR	"d9fd4535-106c-4cec-8d37-dfc020ca87cb"
#define GPT_DURABLE_BOOT_TYPE_GUID_STR	"a409e16b-78aa-4acc-995c-302352621a41"
#define GPT_FACTORY_TYPE_GUID_STR	"f95d940e-caba-4578-9b93-bb6c90f29d3e"
#define GPT_FACTORY_BOOT_TYPE_GUID_STR	"10b8dbaa-d2bf-42a9-98c6-a7c5db3701e7"
#define GPT_VBMETA_ABR_TYPE_GUID_STR	"421a8bfc-85d9-4d85-acda-b64eec0133e9"
