mirror of
https://github.com/ps5-linux/ps5-linux-tools.git
synced 2026-07-15 21:42:26 +00:00
Fix M.2 performance by aligning lba.
This commit is contained in:
30
m2_init.c
30
m2_init.c
@@ -21,8 +21,10 @@
|
|||||||
#define GPT_PRIMARY_PARTITION_TABLE_LBA 1
|
#define GPT_PRIMARY_PARTITION_TABLE_LBA 1
|
||||||
|
|
||||||
#define GPT_ENTRY_NUMBERS 32
|
#define GPT_ENTRY_NUMBERS 32
|
||||||
|
#define GPT_ENTRY_SIZE 128
|
||||||
|
#define GPT_ARRAY_SECTORS ((GPT_ENTRY_NUMBERS * GPT_ENTRY_SIZE) / SECTOR_SIZE)
|
||||||
#define GPT_RESERVED_SECTORS \
|
#define GPT_RESERVED_SECTORS \
|
||||||
(GPT_PRIMARY_PARTITION_TABLE_LBA + GPT_ENTRY_NUMBERS)
|
(GPT_PRIMARY_PARTITION_TABLE_LBA + GPT_ARRAY_SECTORS)
|
||||||
|
|
||||||
#define UUID_SIZE 16
|
#define UUID_SIZE 16
|
||||||
|
|
||||||
@@ -116,7 +118,8 @@ int main(int argc, char *argv[]) {
|
|||||||
uint64_t total_sectors = bytes / SECTOR_SIZE;
|
uint64_t total_sectors = bytes / SECTOR_SIZE;
|
||||||
uint64_t lastlba = total_sectors - 1 - PS5_M2_PART44_LBA_OFFSET;
|
uint64_t lastlba = total_sectors - 1 - PS5_M2_PART44_LBA_OFFSET;
|
||||||
uint64_t first_usable_lba = PS5_M2_MBR_LBA + GPT_RESERVED_SECTORS + 1;
|
uint64_t first_usable_lba = PS5_M2_MBR_LBA + GPT_RESERVED_SECTORS + 1;
|
||||||
uint64_t last_usable_lba = lastlba - GPT_RESERVED_SECTORS;
|
uint64_t last_usable_lba = lastlba - GPT_ARRAY_SECTORS - 1;
|
||||||
|
uint64_t size_in_lba = lastlba - PS5_M2_MBR_LBA;
|
||||||
|
|
||||||
printf("Disk Info:\n");
|
printf("Disk Info:\n");
|
||||||
printf(" Total Bytes: %" PRIu64 "\n", bytes);
|
printf(" Total Bytes: %" PRIu64 "\n", bytes);
|
||||||
@@ -132,19 +135,20 @@ int main(int argc, char *argv[]) {
|
|||||||
mbr.partition_record[0].os_type = EFI_PMBR_OSTYPE_EFI_GPT;
|
mbr.partition_record[0].os_type = EFI_PMBR_OSTYPE_EFI_GPT;
|
||||||
mbr.partition_record[0].starting_lba =
|
mbr.partition_record[0].starting_lba =
|
||||||
PS5_M2_MBR_LBA + GPT_PRIMARY_PARTITION_TABLE_LBA;
|
PS5_M2_MBR_LBA + GPT_PRIMARY_PARTITION_TABLE_LBA;
|
||||||
mbr.partition_record[0].size_in_lba = lastlba - PS5_M2_MBR_LBA;
|
mbr.partition_record[0].size_in_lba =
|
||||||
|
(size_in_lba > 0xffffffff) ? 0xffffffff : (uint32_t)size_in_lba;
|
||||||
|
|
||||||
printf("\nMBR Info:\n");
|
printf("\nMBR Info:\n");
|
||||||
printf(" MBR Start LBA: %u\n", mbr.partition_record[0].starting_lba);
|
printf(" MBR Start LBA: %u\n", mbr.partition_record[0].starting_lba);
|
||||||
printf(" MBR Size (LBA): %u\n", mbr.partition_record[0].size_in_lba);
|
printf(" MBR Size (LBA): %u\n", mbr.partition_record[0].size_in_lba);
|
||||||
|
|
||||||
uint8_t entries[SECTOR_SIZE * GPT_ENTRY_NUMBERS] = {};
|
uint8_t entries[SECTOR_SIZE * GPT_ARRAY_SECTORS] = {};
|
||||||
gpt_entry *pte = (gpt_entry *)entries;
|
gpt_entry *pte = (gpt_entry *)entries;
|
||||||
|
|
||||||
pte[0].partition_type_guid = PARTITION_LINUX_FILE_SYSTEM_DATA_GUID;
|
pte[0].partition_type_guid = PARTITION_LINUX_FILE_SYSTEM_DATA_GUID;
|
||||||
memset(pte[0].unique_partition_guid.b, 0x41, UUID_SIZE);
|
memset(pte[0].unique_partition_guid.b, 0x41, UUID_SIZE);
|
||||||
pte[0].starting_lba = first_usable_lba;
|
pte[0].starting_lba = ((first_usable_lba + 2047) / 2048) * 2048;
|
||||||
pte[0].ending_lba = last_usable_lba;
|
pte[0].ending_lba = ((last_usable_lba + 1) / 2048) * 2048 - 1;
|
||||||
|
|
||||||
uint8_t gpt_sector[SECTOR_SIZE] = {};
|
uint8_t gpt_sector[SECTOR_SIZE] = {};
|
||||||
gpt_header *gpt = (gpt_header *)gpt_sector;
|
gpt_header *gpt = (gpt_header *)gpt_sector;
|
||||||
@@ -157,8 +161,8 @@ int main(int argc, char *argv[]) {
|
|||||||
gpt->last_usable_lba = last_usable_lba;
|
gpt->last_usable_lba = last_usable_lba;
|
||||||
gpt->partition_entry_lba =
|
gpt->partition_entry_lba =
|
||||||
PS5_M2_MBR_LBA + GPT_PRIMARY_PARTITION_TABLE_LBA + 1;
|
PS5_M2_MBR_LBA + GPT_PRIMARY_PARTITION_TABLE_LBA + 1;
|
||||||
gpt->num_partition_entries = sizeof(entries) / sizeof(gpt_entry);
|
gpt->num_partition_entries = GPT_ENTRY_NUMBERS;
|
||||||
gpt->sizeof_partition_entry = sizeof(gpt_entry);
|
gpt->sizeof_partition_entry = GPT_ENTRY_SIZE;
|
||||||
memset(gpt->disk_guid.b, 0x42, UUID_SIZE);
|
memset(gpt->disk_guid.b, 0x42, UUID_SIZE);
|
||||||
|
|
||||||
gpt->partition_entry_array_crc32 = crc32(0L, entries, sizeof(entries));
|
gpt->partition_entry_array_crc32 = crc32(0L, entries, sizeof(entries));
|
||||||
@@ -196,7 +200,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
gpt->my_lba = lastlba;
|
gpt->my_lba = lastlba;
|
||||||
gpt->alternate_lba = PS5_M2_MBR_LBA + GPT_PRIMARY_PARTITION_TABLE_LBA;
|
gpt->alternate_lba = PS5_M2_MBR_LBA + GPT_PRIMARY_PARTITION_TABLE_LBA;
|
||||||
gpt->partition_entry_lba = lastlba - GPT_ENTRY_NUMBERS;
|
gpt->partition_entry_lba = lastlba - GPT_ARRAY_SECTORS;
|
||||||
gpt->header_crc32 = 0;
|
gpt->header_crc32 = 0;
|
||||||
gpt->header_crc32 = crc32(0L, (uint8_t *)gpt, gpt->header_size);
|
gpt->header_crc32 = crc32(0L, (uint8_t *)gpt, gpt->header_size);
|
||||||
|
|
||||||
@@ -205,7 +209,7 @@ int main(int argc, char *argv[]) {
|
|||||||
printf(" Partition Entry LBA: %" PRIu64 "\n", gpt->partition_entry_lba);
|
printf(" Partition Entry LBA: %" PRIu64 "\n", gpt->partition_entry_lba);
|
||||||
|
|
||||||
// Write alternate gpt.
|
// Write alternate gpt.
|
||||||
if (lseek(fd, (off_t)(lastlba - GPT_ENTRY_NUMBERS) * SECTOR_SIZE, SEEK_SET) ==
|
if (lseek(fd, (off_t)(lastlba - GPT_ARRAY_SECTORS) * SECTOR_SIZE, SEEK_SET) ==
|
||||||
(off_t)-1) {
|
(off_t)-1) {
|
||||||
perror("lseek");
|
perror("lseek");
|
||||||
close(fd);
|
close(fd);
|
||||||
@@ -227,6 +231,12 @@ int main(int argc, char *argv[]) {
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fsync(fd) == -1) {
|
||||||
|
perror("fsync");
|
||||||
|
close(fd);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
printf("\nSuccessfully added Linux partition to m2.\n");
|
printf("\nSuccessfully added Linux partition to m2.\n");
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|||||||
Reference in New Issue
Block a user