diff --git a/arch/mips/include/asm/mach-ps2/rom.h b/arch/mips/include/asm/mach-ps2/rom.h index 4dce2370e83d0c..559b6146c11eb6 100644 --- a/arch/mips/include/asm/mach-ps2/rom.h +++ b/arch/mips/include/asm/mach-ps2/rom.h @@ -113,6 +113,40 @@ extern struct rom_dir rom1_dir; /* ROM1 directory (DVD) */ ssize_t rom_read_file(const struct rom_dir dir, const char *name, void *buffer, size_t size, loff_t offset); +/** + * struct rom_ver - ROM version + * @number: ROM version number + * @region: ROM region with 'J' for Japan, 'E' for Europe, 'C' for China, + * and 'A' or 'H' for the USA + * @unknown: unknown member + * @date: date ROM was created + * @date.year: year ROM was created + * @date.month: month ROM was created + * @date.day: day ROM was created + * + * A ROM version is considered to be invalid if @number is zero, in which + * case all members are zero except @region and @unknown that are ``'-'``. + */ +struct rom_ver { + int number; + char region; + char unknown; + struct { + int year; + int month; + int day; + } date; +}; + +/** + * rom_version - read the ROMVER file in ROM0 + * + * Context: any + * Return: ROM version; or, if reading failed, all members zeroed except + * @region and @unknown that are set to ``'-'`` + */ +struct rom_ver rom_version(void); + /* The ROM functions below are mainly for internal use. */ /** diff --git a/arch/mips/ps2/rom.c b/arch/mips/ps2/rom.c index 985fafad44d5ea..bce8a5e1ca90d8 100644 --- a/arch/mips/ps2/rom.c +++ b/arch/mips/ps2/rom.c @@ -215,6 +215,20 @@ ssize_t rom_read_file(const struct rom_dir dir, } EXPORT_SYMBOL_GPL(rom_read_file); +struct rom_ver rom_version(void) +{ + struct rom_ver v = { }; + char buffer[20] = { }; + ssize_t r = rom_read_file(rom0_dir, "ROMVER", + buffer, sizeof(buffer) - 1, 0); + + return r > 0 && sscanf(buffer, "%4x%c%c%4d%2d%2d", + &v.number, &v.region, &v.unknown, + &v.date.year, &v.date.month, &v.date.day) == 6 ? + v : (struct rom_ver) { .region = '-', .unknown = '-' }; +} +EXPORT_SYMBOL_GPL(rom_version); + /** * find_reset_string - find the offset to the ``"RESET"`` string, if it exists * @rom: ROM to search in @@ -422,7 +436,7 @@ static int __init ps2_rom_init(void) rom1_dir = rom_dir_init("rom1", ROM1_BASE, ROM1_SIZE); v = rom_version(); - pr_info("rom0: Version %04d %c %c %04d-%02d-%02d\n", + pr_info("rom0: Version %04x %c %c %04d-%02d-%02d\n", v.number, v.region, v.unknown, v.date.year, v.date.month, v.date.day);