mirror of
https://github.com/lingble/meta-tegra.git
synced 2025-11-02 05:17:52 +00:00
tegra-helper-scripts: update nvflashxmlparse for partition alignment
- Handle <align_boundary> elements in the XML file - Compute the start position of the first partition based on the size of the partition table(s) and alignment Signed-off-by: Matt Madison <matt@madison.systems>
This commit is contained in:
@@ -30,15 +30,19 @@ def validate_guid(guid):
|
|||||||
return guid
|
return guid
|
||||||
|
|
||||||
class Partition(object):
|
class Partition(object):
|
||||||
def __init__(self, element, sector_size, partnum=None):
|
def __init__(self, element, sector_size, partnum=None, bootdev=False):
|
||||||
self.name = element.get('name')
|
self.name = element.get('name')
|
||||||
self.type = element.get('type')
|
self.type = element.get('type')
|
||||||
self.id = element.get('id', (None if self.is_partition_table() else partnum))
|
self.id = element.get('id', (None if self.is_partition_table() else partnum))
|
||||||
self.oem_sign = element.get('oemsign', 'false') == 'true'
|
self.oem_sign = element.get('oemsign', 'false') == 'true'
|
||||||
guid = element.find('unique_guid')
|
guid = element.find('unique_guid')
|
||||||
self.partguid = "" if guid is None else validate_guid(guid.text.strip())
|
self.partguid = "" if guid is None else validate_guid(guid.text.strip())
|
||||||
|
alignment = element.find('align_boundary')
|
||||||
|
self.alignment = "" if alignment is None else str(int(alignment.text.strip(), base=0))
|
||||||
startloc = element.find('start_location')
|
startloc = element.find('start_location')
|
||||||
self.start_location = "" if startloc is None else str(int(startloc.text.strip(), base=0))
|
self.start_location = "" if startloc is None else str(int(startloc.text.strip(), base=0))
|
||||||
|
if self.start_location and not bootdev:
|
||||||
|
self.start_location = str((int(self.start_location) + sector_size - 1) // sector_size)
|
||||||
aa = element.find('allocation_attribute')
|
aa = element.find('allocation_attribute')
|
||||||
if aa is None:
|
if aa is None:
|
||||||
self.alloc_attr = 0
|
self.alloc_attr = 0
|
||||||
@@ -62,20 +66,52 @@ class Partition(object):
|
|||||||
return (self.alloc_attr & 0x800) == 0x800
|
return (self.alloc_attr & 0x800) == 0x800
|
||||||
def is_partition_table(self):
|
def is_partition_table(self):
|
||||||
return self.type in ['GP1', 'GPT', 'protective_master_boot_record', 'primary_gpt', 'secondary_gpt']
|
return self.type in ['GP1', 'GPT', 'protective_master_boot_record', 'primary_gpt', 'secondary_gpt']
|
||||||
|
def update_start_location(self, cursize, sector_size):
|
||||||
|
default_start = cursize * sector_size
|
||||||
|
if self.alignment:
|
||||||
|
alignment = int(self.alignment)
|
||||||
|
default_start = alignment * ((default_start + alignment - 1) // alignment)
|
||||||
|
# If there's a start location specified in the XML, use it,
|
||||||
|
# but check to make sure it's an offset at or after the current size.
|
||||||
|
# If there's no start location specified, set it.
|
||||||
|
if self.start_location:
|
||||||
|
if int(self.start_location) < default_start // sector_size:
|
||||||
|
raise RuntimeError("partition {} has invalid start location setting".format(self.name))
|
||||||
|
else:
|
||||||
|
self.start_location = str(default_start // sector_size)
|
||||||
|
|
||||||
class Device(object):
|
class Device(object):
|
||||||
def __init__(self, element):
|
def __init__(self, element, devcount):
|
||||||
self.type = element.get('type')
|
self.type = element.get('type')
|
||||||
self.instance = element.get('instance')
|
self.instance = element.get('instance')
|
||||||
self.sector_size = int(element.get('sector_size', '512'), 0)
|
self.sector_size = int(element.get('sector_size', '512'), 0)
|
||||||
self.num_sectors = int(element.get('num_sectors', '0'), 0)
|
self.num_sectors = int(element.get('num_sectors', '0'), 0)
|
||||||
self.partitions = []
|
self.partitions = []
|
||||||
|
self.is_boot_device = self.type in ['sdmmc_boot', 'spi'] or (self.type == 'sdmmc' and devcount == 0)
|
||||||
nextpart = 1
|
nextpart = 1
|
||||||
for partnode in element.findall('./partition'):
|
for partnode in element.findall('./partition'):
|
||||||
part = Partition(partnode, self.sector_size, partnum=nextpart)
|
part = Partition(partnode, self.sector_size, partnum=nextpart, bootdev=self.is_boot_device)
|
||||||
self.partitions.append(part)
|
self.partitions.append(part)
|
||||||
if not part.is_partition_table():
|
if not part.is_partition_table():
|
||||||
nextpart = int(part.id) + 1
|
nextpart = int(part.id) + 1
|
||||||
|
self.parttable_size = 0
|
||||||
|
|
||||||
|
# Boot device does not need any partition adjustments
|
||||||
|
# for partition table size
|
||||||
|
if self.is_boot_device:
|
||||||
|
return
|
||||||
|
|
||||||
|
for n, part in enumerate(self.partitions):
|
||||||
|
if not part.is_partition_table():
|
||||||
|
# Set the start location for the first partition after the
|
||||||
|
# partition table
|
||||||
|
part.update_start_location(self.parttable_size, self.sector_size)
|
||||||
|
break
|
||||||
|
# Two partition tables (MBR + GPT) at the front is OK. More than that
|
||||||
|
# is broken, or at least something we don't know how to handle
|
||||||
|
if n > 2:
|
||||||
|
raise RuntimeError("more than 2 partition table entries found on device")
|
||||||
|
self.parttable_size += part.size;
|
||||||
|
|
||||||
class PartitionLayout(object):
|
class PartitionLayout(object):
|
||||||
def __init__(self, configfile):
|
def __init__(self, configfile):
|
||||||
@@ -88,7 +124,7 @@ class PartitionLayout(object):
|
|||||||
self.devtypes = []
|
self.devtypes = []
|
||||||
self.device_count = 0
|
self.device_count = 0
|
||||||
for devnode in tree.findall('./device'):
|
for devnode in tree.findall('./device'):
|
||||||
dev = Device(devnode)
|
dev = Device(devnode, self.device_count)
|
||||||
if dev.type == 'sdmmc':
|
if dev.type == 'sdmmc':
|
||||||
dev.type = 'sdmmc_boot' if self.device_count == 0 else 'sdmmc_user'
|
dev.type = 'sdmmc_boot' if self.device_count == 0 else 'sdmmc_user'
|
||||||
if dev.type in self.devices:
|
if dev.type in self.devices:
|
||||||
|
|||||||
Reference in New Issue
Block a user