From 6f6ae06eb30d4710cd86a1782326702afa18a8f6 Mon Sep 17 00:00:00 2001 From: Corentin Chary Date: Sat, 26 Nov 2011 11:00:11 +0100 Subject: [PATCH] samsung-laptop: dump model and version informations We still need to figure out exactly what each of different fields represent, but they contain at least model and version informations. Signed-off-by: Corentin Chary Acked-by: Greg Kroah-Hartman Signed-off-by: Matthew Garrett --- drivers/platform/x86/samsung-laptop.c | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index 431f7dc2f22..b41c7b4f9c7 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c @@ -303,6 +303,7 @@ struct samsung_laptop_debug { struct debugfs_blob_wrapper f0000_wrapper; struct debugfs_blob_wrapper data_wrapper; + struct debugfs_blob_wrapper sdiag_wrapper; }; struct samsung_laptop; @@ -337,6 +338,8 @@ struct samsung_laptop { bool handle_backlight; bool has_stepping_quirk; + + char sdiag[64]; }; @@ -1164,6 +1167,9 @@ static int samsung_debugfs_init(struct samsung_laptop *samsung) samsung->debug.data_wrapper.data = &samsung->debug.data; samsung->debug.data_wrapper.size = sizeof(samsung->debug.data); + samsung->debug.sdiag_wrapper.data = samsung->sdiag; + samsung->debug.sdiag_wrapper.size = strlen(samsung->sdiag); + dent = debugfs_create_u16("command", S_IRUGO | S_IWUSR, samsung->debug.root, &samsung->debug.command); if (!dent) @@ -1207,6 +1213,12 @@ static int samsung_debugfs_init(struct samsung_laptop *samsung) if (!dent) goto error_debugfs; + dent = debugfs_create_blob("sdiag", S_IRUGO | S_IWUSR, + samsung->debug.root, + &samsung->debug.sdiag_wrapper); + if (!dent) + goto error_debugfs; + return 0; error_debugfs: @@ -1259,6 +1271,34 @@ static __init void samsung_sabi_infos(struct samsung_laptop *samsung, int loca, printk(KERN_DEBUG " SABI pointer = 0x%08x\n", ifaceP); } +static void __init samsung_sabi_diag(struct samsung_laptop *samsung) +{ + int loca = find_signature(samsung->f0000_segment, "SDiaG@"); + int i; + + if (loca == 0xffff) + return ; + + /* Example: + * Ident: @SDiaG@686XX-N90X3A/966-SEC-07HL-S90X3A + * + * Product name: 90X3A + * BIOS Version: 07HL + */ + loca += 1; + for (i = 0; loca < 0xffff && i < sizeof(samsung->sdiag) - 1; loca++) { + char temp = readb(samsung->f0000_segment + loca); + + if (isalnum(temp) || temp == '/' || temp == '-') + samsung->sdiag[i++] = temp; + else + break ; + } + + if (debug && samsung->sdiag[0]) + pr_info("sdiag: %s", samsung->sdiag); +} + static int __init samsung_sabi_init(struct samsung_laptop *samsung) { const struct sabi_config *config = NULL; @@ -1276,6 +1316,8 @@ static int __init samsung_sabi_init(struct samsung_laptop *samsung) goto exit; } + samsung_sabi_diag(samsung); + /* Try to find one of the signatures in memory to find the header */ for (i = 0; sabi_configs[i].test_string != 0; ++i) { samsung->config = &sabi_configs[i]; -- 2.39.5