Commit a04a1bed authored by Dave Jones's avatar Dave Jones

[PATCH] EFI GUID partition table support.

EFI GUID partition table support from Matt Domsch
parent 42616be0
...@@ -17,6 +17,7 @@ restrictions referred to are that the relevant option is valid if: ...@@ -17,6 +17,7 @@ restrictions referred to are that the relevant option is valid if:
CD Appropriate CD support is enabled. CD Appropriate CD support is enabled.
DEVFS devfs support is enabled. DEVFS devfs support is enabled.
DRM Direct Rendering Management support is enabled. DRM Direct Rendering Management support is enabled.
EFI EFI Partitioning (GPT) is enabled
EIDE EIDE/ATAPI support is enabled. EIDE EIDE/ATAPI support is enabled.
FB The frame buffer device is enabled. FB The frame buffer device is enabled.
HW Appropriate hardware is enabled. HW Appropriate hardware is enabled.
...@@ -219,6 +220,9 @@ running once the system is up. ...@@ -219,6 +220,9 @@ running once the system is up.
gdth= [HW,SCSI] gdth= [HW,SCSI]
gpt [EFI] Forces disk with valid GPT signature but
invalid Protective MBR to be treated as GPT.
gscd= [HW,CD] gscd= [HW,CD]
gus= [HW,SOUND] gus= [HW,SOUND]
......
...@@ -115,6 +115,11 @@ CONFIG_SGI_PARTITION ...@@ -115,6 +115,11 @@ CONFIG_SGI_PARTITION
Say Y here if you would like to be able to read the hard disk Say Y here if you would like to be able to read the hard disk
partition table format used by SGI machines. partition table format used by SGI machines.
CONFIG_EFI_PARTITION
Say Y here if you would like to use hard disks under Linux which
were partitioned using EFI GPT. Presently only useful on the
IA-64 platform.
CONFIG_ULTRIX_PARTITION CONFIG_ULTRIX_PARTITION
Say Y here if you would like to be able to read the hard disk Say Y here if you would like to be able to read the hard disk
partition table format used by DEC (now Compaq) Ultrix machines. partition table format used by DEC (now Compaq) Ultrix machines.
......
...@@ -32,6 +32,7 @@ if [ "$CONFIG_PARTITION_ADVANCED" = "y" ]; then ...@@ -32,6 +32,7 @@ if [ "$CONFIG_PARTITION_ADVANCED" = "y" ]; then
bool ' SGI partition support' CONFIG_SGI_PARTITION bool ' SGI partition support' CONFIG_SGI_PARTITION
bool ' Ultrix partition table support' CONFIG_ULTRIX_PARTITION bool ' Ultrix partition table support' CONFIG_ULTRIX_PARTITION
bool ' Sun partition tables support' CONFIG_SUN_PARTITION bool ' Sun partition tables support' CONFIG_SUN_PARTITION
bool ' EFI GUID Partition support' CONFIG_EFI_PARTITION
else else
if [ "$ARCH" = "alpha" ]; then if [ "$ARCH" = "alpha" ]; then
define_bool CONFIG_OSF_PARTITION y define_bool CONFIG_OSF_PARTITION y
......
...@@ -24,6 +24,7 @@ obj-$(CONFIG_SGI_PARTITION) += sgi.o ...@@ -24,6 +24,7 @@ obj-$(CONFIG_SGI_PARTITION) += sgi.o
obj-$(CONFIG_SUN_PARTITION) += sun.o obj-$(CONFIG_SUN_PARTITION) += sun.o
obj-$(CONFIG_ULTRIX_PARTITION) += ultrix.o obj-$(CONFIG_ULTRIX_PARTITION) += ultrix.o
obj-$(CONFIG_IBM_PARTITION) += ibm.o obj-$(CONFIG_IBM_PARTITION) += ibm.o
obj-$(CONFIG_EFI_PARTITION) += efi.o
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "sun.h" #include "sun.h"
#include "ibm.h" #include "ibm.h"
#include "ultrix.h" #include "ultrix.h"
#include "efi.h"
int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/ int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/
...@@ -43,6 +44,9 @@ static int (*check_part[])(struct gendisk *hd, struct block_device *bdev, ...@@ -43,6 +44,9 @@ static int (*check_part[])(struct gendisk *hd, struct block_device *bdev,
#ifdef CONFIG_ACORN_PARTITION #ifdef CONFIG_ACORN_PARTITION
acorn_partition, acorn_partition,
#endif #endif
#ifdef CONFIG_EFI_PARTITION
efi_partition, /* this must come before msdos */
#endif
#ifdef CONFIG_LDM_PARTITION #ifdef CONFIG_LDM_PARTITION
ldm_partition, /* this must come before msdos */ ldm_partition, /* this must come before msdos */
#endif #endif
......
This diff is collapsed.
/************************************************************
* EFI GUID Partition Table
* Per Intel EFI Specification v1.02
* http://developer.intel.com/technology/efi/efi.htm
*
* By Matt Domsch <Matt_Domsch@dell.com> Fri Sep 22 22:15:56 CDT 2000
* Copyright 2000,2001 Dell Computer Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
************************************************************/
#ifndef FS_PART_EFI_H_INCLUDED
#define FS_PART_EFI_H_INCLUDED
#include <linux/types.h>
#include <linux/config.h>
#include <linux/fs.h>
#include <linux/genhd.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/string.h>
#include <linux/blk.h>
/*
* Yes, specifying asm-ia64 is ugly, but this lets it build on
* other platforms too, until efi.h moves to include/linux.
*/
#include <asm-ia64/efi.h>
#define MSDOS_MBR_SIGNATURE 0xaa55
#define EFI_PMBR_OSTYPE_EFI 0xEF
#define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
#define GPT_BLOCK_SIZE 512
#define GPT_HEADER_SIGNATURE 0x5452415020494645L
#define GPT_HEADER_REVISION_V1 0x00010000
#define GPT_PRIMARY_PARTITION_TABLE_LBA 1
#define UNUSED_ENTRY_GUID \
((efi_guid_t) { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }})
#define PARTITION_SYSTEM_GUID \
((efi_guid_t) { 0xC12A7328, 0xF81F, 0x11d2, { 0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B }})
#define LEGACY_MBR_PARTITION_GUID \
((efi_guid_t) { 0x024DEE41, 0x33E7, 0x11d3, { 0x9D, 0x69, 0x00, 0x08, 0xC7, 0x81, 0xF3, 0x9F }})
#define PARTITION_MSFT_RESERVED_GUID \
((efi_guid_t) { 0xE3C9E316, 0x0B5C, 0x4DB8, { 0x81, 0x7D, 0xF9, 0x2D, 0xF0, 0x02, 0x15, 0xAE }})
#define PARTITION_BASIC_DATA_GUID \
((efi_guid_t) { 0xEBD0A0A2, 0xB9E5, 0x4433, { 0x87, 0xC0, 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7 }})
#define PARTITION_LINUX_RAID_GUID \
((efi_guid_t) { 0xa19d880f, 0x05fc, 0x4d3b, { 0xa0, 0x06, 0x74, 0x3f, 0x0f, 0x84, 0x91, 0x1e }})
#define PARTITION_LINUX_SWAP_GUID \
((efi_guid_t) { 0x0657fd6d, 0xa4ab, 0x43c4, { 0x84, 0xe5, 0x09, 0x33, 0xc8, 0x4b, 0x4f, 0x4f }})
#define PARTITION_LINUX_LVM_GUID \
((efi_guid_t) { 0xe6d6d379, 0xf507, 0x44c2, { 0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28 }})
typedef struct _gpt_header {
u64 signature;
u32 revision;
u32 header_size;
u32 header_crc32;
u32 reserved1;
u64 my_lba;
u64 alternate_lba;
u64 first_usable_lba;
u64 last_usable_lba;
efi_guid_t disk_guid;
u64 partition_entry_lba;
u32 num_partition_entries;
u32 sizeof_partition_entry;
u32 partition_entry_array_crc32;
u8 reserved2[GPT_BLOCK_SIZE - 92];
} __attribute__ ((packed)) gpt_header;
typedef struct _gpt_entry_attributes {
u64 required_to_function:1;
u64 reserved:47;
u64 type_guid_specific:16;
} __attribute__ ((packed)) gpt_entry_attributes;
typedef struct _gpt_entry {
efi_guid_t partition_type_guid;
efi_guid_t unique_partition_guid;
u64 starting_lba;
u64 ending_lba;
gpt_entry_attributes attributes;
efi_char16_t partition_name[72 / sizeof (efi_char16_t)];
} __attribute__ ((packed)) gpt_entry;
typedef struct _legacy_mbr {
u8 boot_code[440];
u32 unique_mbr_signature;
u16 unknown;
struct partition partition_record[4];
u16 signature;
} __attribute__ ((packed)) legacy_mbr;
/* Functions */
extern int
efi_partition(struct gendisk *hd, struct block_device *bdev,
unsigned long first_sector, int first_part_minor);
#endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* --------------------------------------------------------------------------
* Local variables:
* c-indent-level: 4
* c-brace-imaginary-offset: 0
* c-brace-offset: -4
* c-argdecl-indent: 4
* c-label-offset: -4
* c-continued-statement-offset: 4
* c-continued-brace-offset: 0
* indent-tabs-mode: nil
* tab-width: 8
* End:
*/
...@@ -41,6 +41,7 @@ EXPORT_SYMBOL(ide_xlate_1024_hook); ...@@ -41,6 +41,7 @@ EXPORT_SYMBOL(ide_xlate_1024_hook);
#include "check.h" #include "check.h"
#include "msdos.h" #include "msdos.h"
#include "efi.h"
#if CONFIG_BLK_DEV_MD #if CONFIG_BLK_DEV_MD
extern void md_autodetect_dev(kdev_t dev); extern void md_autodetect_dev(kdev_t dev);
...@@ -536,6 +537,16 @@ int msdos_partition(struct gendisk *hd, struct block_device *bdev, ...@@ -536,6 +537,16 @@ int msdos_partition(struct gendisk *hd, struct block_device *bdev,
return 0; return 0;
} }
p = (struct partition *) (data + 0x1be); p = (struct partition *) (data + 0x1be);
#ifdef CONFIG_EFI_PARTITION
for (i=1 ; i<=4 ; i++,p++) {
/* If this is an EFI GPT disk, msdos should ignore it. */
if (SYS_IND(p) == EFI_PMBR_OSTYPE_EFI_GPT) {
put_dev_sector(sect);
return 0;
}
}
p = (struct partition *) (data + 0x1be);
#endif
/* /*
* Look for partitions in two passes: * Look for partitions in two passes:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment