This source file includes following definitions.
- gsmi_buf_alloc
- gsmi_buf_free
- gsmi_exec
- gsmi_get_variable
- gsmi_get_next_variable
- gsmi_set_variable
- eventlog_write
- gsmi_clear_eventlog_store
- gsmi_clear_config_store
- gsmi_shutdown_reason
- gsmi_reboot_callback
- gsmi_die_callback
- gsmi_panic_callback
- local_hash_64
- hash_oem_table_id
- gsmi_system_valid
- gsmi_log_s0ix_info
- gsmi_log_s0ix_suspend
- gsmi_log_s0ix_resume
- gsmi_platform_driver_probe
- gsmi_init
- gsmi_exit
1
2
3
4
5
6
7
8
9
10
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/types.h>
14 #include <linux/device.h>
15 #include <linux/platform_device.h>
16 #include <linux/errno.h>
17 #include <linux/string.h>
18 #include <linux/spinlock.h>
19 #include <linux/dma-mapping.h>
20 #include <linux/dmapool.h>
21 #include <linux/fs.h>
22 #include <linux/slab.h>
23 #include <linux/ioctl.h>
24 #include <linux/acpi.h>
25 #include <linux/io.h>
26 #include <linux/uaccess.h>
27 #include <linux/dmi.h>
28 #include <linux/kdebug.h>
29 #include <linux/reboot.h>
30 #include <linux/efi.h>
31 #include <linux/module.h>
32 #include <linux/ucs2_string.h>
33 #include <linux/suspend.h>
34
35 #define GSMI_SHUTDOWN_CLEAN 0
36
37 #define GSMI_SHUTDOWN_NMIWDT 1
38 #define GSMI_SHUTDOWN_PANIC 2
39 #define GSMI_SHUTDOWN_OOPS 3
40 #define GSMI_SHUTDOWN_DIE 4
41 #define GSMI_SHUTDOWN_MCE 5
42 #define GSMI_SHUTDOWN_SOFTWDT 6
43 #define GSMI_SHUTDOWN_MBE 7
44 #define GSMI_SHUTDOWN_TRIPLE 8
45
46 #define DRIVER_VERSION "1.0"
47 #define GSMI_GUID_SIZE 16
48 #define GSMI_BUF_SIZE 1024
49 #define GSMI_BUF_ALIGN sizeof(u64)
50 #define GSMI_CALLBACK 0xef
51
52
53 #define GSMI_SUCCESS 0x00
54 #define GSMI_UNSUPPORTED2 0x03
55 #define GSMI_LOG_FULL 0x0b
56 #define GSMI_VAR_NOT_FOUND 0x0e
57 #define GSMI_HANDSHAKE_SPIN 0x7d
58 #define GSMI_HANDSHAKE_CF 0x7e
59 #define GSMI_HANDSHAKE_NONE 0x7f
60 #define GSMI_INVALID_PARAMETER 0x82
61 #define GSMI_UNSUPPORTED 0x83
62 #define GSMI_BUFFER_TOO_SMALL 0x85
63 #define GSMI_NOT_READY 0x86
64 #define GSMI_DEVICE_ERROR 0x87
65 #define GSMI_NOT_FOUND 0x8e
66
67 #define QUIRKY_BOARD_HASH 0x78a30a50
68
69
70 #define GSMI_CMD_GET_NVRAM_VAR 0x01
71 #define GSMI_CMD_GET_NEXT_VAR 0x02
72 #define GSMI_CMD_SET_NVRAM_VAR 0x03
73 #define GSMI_CMD_SET_EVENT_LOG 0x08
74 #define GSMI_CMD_CLEAR_EVENT_LOG 0x09
75 #define GSMI_CMD_LOG_S0IX_SUSPEND 0x0a
76 #define GSMI_CMD_LOG_S0IX_RESUME 0x0b
77 #define GSMI_CMD_CLEAR_CONFIG 0x20
78 #define GSMI_CMD_HANDSHAKE_TYPE 0xC1
79
80
81 #define GSMI_LOG_ENTRY_TYPE_KERNEL 0xDEAD
82
83
84 struct gsmi_buf {
85 u8 *start;
86 size_t length;
87 dma_addr_t handle;
88 u32 address;
89 };
90
91 static struct gsmi_device {
92 struct platform_device *pdev;
93 struct gsmi_buf *name_buf;
94 struct gsmi_buf *data_buf;
95 struct gsmi_buf *param_buf;
96 spinlock_t lock;
97 u16 smi_cmd;
98 int handshake_type;
99 struct dma_pool *dma_pool;
100 } gsmi_dev;
101
102
103 struct gsmi_nvram_var_param {
104 efi_guid_t guid;
105 u32 name_ptr;
106 u32 attributes;
107 u32 data_len;
108 u32 data_ptr;
109 } __packed;
110
111 struct gsmi_get_next_var_param {
112 u8 guid[GSMI_GUID_SIZE];
113 u32 name_ptr;
114 u32 name_len;
115 } __packed;
116
117 struct gsmi_set_eventlog_param {
118 u32 data_ptr;
119 u32 data_len;
120 u32 type;
121 } __packed;
122
123
124 struct gsmi_log_entry_type_1 {
125 u16 type;
126 u32 instance;
127 } __packed;
128
129
130
131
132
133 #define GSMI_DEFAULT_SPINCOUNT 0x10000
134 static unsigned int spincount = GSMI_DEFAULT_SPINCOUNT;
135 module_param(spincount, uint, 0600);
136 MODULE_PARM_DESC(spincount,
137 "The number of loop iterations to use when using the spin handshake.");
138
139
140
141
142
143
144
145 static bool s0ix_logging_enable;
146 module_param(s0ix_logging_enable, bool, 0600);
147
148 static struct gsmi_buf *gsmi_buf_alloc(void)
149 {
150 struct gsmi_buf *smibuf;
151
152 smibuf = kzalloc(sizeof(*smibuf), GFP_KERNEL);
153 if (!smibuf) {
154 printk(KERN_ERR "gsmi: out of memory\n");
155 return NULL;
156 }
157
158
159 smibuf->start = dma_pool_alloc(gsmi_dev.dma_pool, GFP_KERNEL,
160 &smibuf->handle);
161 if (!smibuf->start) {
162 printk(KERN_ERR "gsmi: failed to allocate name buffer\n");
163 kfree(smibuf);
164 return NULL;
165 }
166
167
168 smibuf->length = GSMI_BUF_SIZE;
169 smibuf->address = (u32)virt_to_phys(smibuf->start);
170
171 return smibuf;
172 }
173
174 static void gsmi_buf_free(struct gsmi_buf *smibuf)
175 {
176 if (smibuf) {
177 if (smibuf->start)
178 dma_pool_free(gsmi_dev.dma_pool, smibuf->start,
179 smibuf->handle);
180 kfree(smibuf);
181 }
182 }
183
184
185
186
187
188 static int gsmi_exec(u8 func, u8 sub)
189 {
190 u16 cmd = (sub << 8) | func;
191 u16 result = 0;
192 int rc = 0;
193
194
195
196
197
198
199
200
201
202 if (gsmi_dev.handshake_type == GSMI_HANDSHAKE_CF) {
203
204
205
206
207
208
209
210 asm volatile (
211 "stc\n"
212 "outb %%al, %%dx\n"
213 "1: jc 1b\n"
214 : "=a" (result)
215 : "0" (cmd),
216 "d" (gsmi_dev.smi_cmd),
217 "b" (gsmi_dev.param_buf->address)
218 : "memory", "cc"
219 );
220 } else if (gsmi_dev.handshake_type == GSMI_HANDSHAKE_SPIN) {
221
222
223
224
225 asm volatile (
226 "outb %%al, %%dx\n"
227 "1: loop 1b\n"
228 : "=a" (result)
229 : "0" (cmd),
230 "d" (gsmi_dev.smi_cmd),
231 "b" (gsmi_dev.param_buf->address),
232 "c" (spincount)
233 : "memory", "cc"
234 );
235 } else {
236
237
238
239
240
241 asm volatile (
242 "outb %%al, %%dx\n\t"
243 : "=a" (result)
244 : "0" (cmd),
245 "d" (gsmi_dev.smi_cmd),
246 "b" (gsmi_dev.param_buf->address)
247 : "memory", "cc"
248 );
249 }
250
251
252 switch (result) {
253 case GSMI_SUCCESS:
254 break;
255 case GSMI_VAR_NOT_FOUND:
256
257 rc = 1;
258 break;
259 case GSMI_INVALID_PARAMETER:
260 printk(KERN_ERR "gsmi: exec 0x%04x: Invalid parameter\n", cmd);
261 rc = -EINVAL;
262 break;
263 case GSMI_BUFFER_TOO_SMALL:
264 printk(KERN_ERR "gsmi: exec 0x%04x: Buffer too small\n", cmd);
265 rc = -ENOMEM;
266 break;
267 case GSMI_UNSUPPORTED:
268 case GSMI_UNSUPPORTED2:
269 if (sub != GSMI_CMD_HANDSHAKE_TYPE)
270 printk(KERN_ERR "gsmi: exec 0x%04x: Not supported\n",
271 cmd);
272 rc = -ENOSYS;
273 break;
274 case GSMI_NOT_READY:
275 printk(KERN_ERR "gsmi: exec 0x%04x: Not ready\n", cmd);
276 rc = -EBUSY;
277 break;
278 case GSMI_DEVICE_ERROR:
279 printk(KERN_ERR "gsmi: exec 0x%04x: Device error\n", cmd);
280 rc = -EFAULT;
281 break;
282 case GSMI_NOT_FOUND:
283 printk(KERN_ERR "gsmi: exec 0x%04x: Data not found\n", cmd);
284 rc = -ENOENT;
285 break;
286 case GSMI_LOG_FULL:
287 printk(KERN_ERR "gsmi: exec 0x%04x: Log full\n", cmd);
288 rc = -ENOSPC;
289 break;
290 case GSMI_HANDSHAKE_CF:
291 case GSMI_HANDSHAKE_SPIN:
292 case GSMI_HANDSHAKE_NONE:
293 rc = result;
294 break;
295 default:
296 printk(KERN_ERR "gsmi: exec 0x%04x: Unknown error 0x%04x\n",
297 cmd, result);
298 rc = -ENXIO;
299 }
300
301 return rc;
302 }
303
304 #ifdef CONFIG_EFI_VARS
305
306 static struct efivars efivars;
307
308 static efi_status_t gsmi_get_variable(efi_char16_t *name,
309 efi_guid_t *vendor, u32 *attr,
310 unsigned long *data_size,
311 void *data)
312 {
313 struct gsmi_nvram_var_param param = {
314 .name_ptr = gsmi_dev.name_buf->address,
315 .data_ptr = gsmi_dev.data_buf->address,
316 .data_len = (u32)*data_size,
317 };
318 efi_status_t ret = EFI_SUCCESS;
319 unsigned long flags;
320 size_t name_len = ucs2_strnlen(name, GSMI_BUF_SIZE / 2);
321 int rc;
322
323 if (name_len >= GSMI_BUF_SIZE / 2)
324 return EFI_BAD_BUFFER_SIZE;
325
326 spin_lock_irqsave(&gsmi_dev.lock, flags);
327
328
329 memcpy(¶m.guid, vendor, sizeof(param.guid));
330
331
332 memset(gsmi_dev.name_buf->start, 0, gsmi_dev.name_buf->length);
333 memcpy(gsmi_dev.name_buf->start, name, name_len * 2);
334
335
336 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length);
337
338
339 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
340 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param));
341
342 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_GET_NVRAM_VAR);
343 if (rc < 0) {
344 printk(KERN_ERR "gsmi: Get Variable failed\n");
345 ret = EFI_LOAD_ERROR;
346 } else if (rc == 1) {
347
348 ret = EFI_NOT_FOUND;
349 } else {
350
351 memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param));
352
353
354 *data_size = min_t(unsigned long, *data_size,
355 gsmi_dev.data_buf->length);
356 *data_size = min_t(unsigned long, *data_size, param.data_len);
357
358
359 memcpy(data, gsmi_dev.data_buf->start, *data_size);
360
361
362 *attr = EFI_VARIABLE_NON_VOLATILE |
363 EFI_VARIABLE_BOOTSERVICE_ACCESS |
364 EFI_VARIABLE_RUNTIME_ACCESS;
365 }
366
367 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
368
369 return ret;
370 }
371
372 static efi_status_t gsmi_get_next_variable(unsigned long *name_size,
373 efi_char16_t *name,
374 efi_guid_t *vendor)
375 {
376 struct gsmi_get_next_var_param param = {
377 .name_ptr = gsmi_dev.name_buf->address,
378 .name_len = gsmi_dev.name_buf->length,
379 };
380 efi_status_t ret = EFI_SUCCESS;
381 int rc;
382 unsigned long flags;
383
384
385 if (*name_size != GSMI_BUF_SIZE)
386 return EFI_BAD_BUFFER_SIZE;
387
388
389 if (ucs2_strnlen(name, GSMI_BUF_SIZE / 2) == GSMI_BUF_SIZE / 2)
390 return EFI_INVALID_PARAMETER;
391
392 spin_lock_irqsave(&gsmi_dev.lock, flags);
393
394
395 memcpy(¶m.guid, vendor, sizeof(param.guid));
396
397
398 memcpy(gsmi_dev.name_buf->start, name, *name_size);
399
400
401 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
402 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param));
403
404 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_GET_NEXT_VAR);
405 if (rc < 0) {
406 printk(KERN_ERR "gsmi: Get Next Variable Name failed\n");
407 ret = EFI_LOAD_ERROR;
408 } else if (rc == 1) {
409
410 ret = EFI_NOT_FOUND;
411 } else {
412
413 memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param));
414
415
416 memcpy(name, gsmi_dev.name_buf->start, GSMI_BUF_SIZE);
417 *name_size = ucs2_strnlen(name, GSMI_BUF_SIZE / 2) * 2;
418
419
420 memcpy(vendor, ¶m.guid, sizeof(param.guid));
421 ret = EFI_SUCCESS;
422 }
423
424 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
425
426 return ret;
427 }
428
429 static efi_status_t gsmi_set_variable(efi_char16_t *name,
430 efi_guid_t *vendor,
431 u32 attr,
432 unsigned long data_size,
433 void *data)
434 {
435 struct gsmi_nvram_var_param param = {
436 .name_ptr = gsmi_dev.name_buf->address,
437 .data_ptr = gsmi_dev.data_buf->address,
438 .data_len = (u32)data_size,
439 .attributes = EFI_VARIABLE_NON_VOLATILE |
440 EFI_VARIABLE_BOOTSERVICE_ACCESS |
441 EFI_VARIABLE_RUNTIME_ACCESS,
442 };
443 size_t name_len = ucs2_strnlen(name, GSMI_BUF_SIZE / 2);
444 efi_status_t ret = EFI_SUCCESS;
445 int rc;
446 unsigned long flags;
447
448 if (name_len >= GSMI_BUF_SIZE / 2)
449 return EFI_BAD_BUFFER_SIZE;
450
451 spin_lock_irqsave(&gsmi_dev.lock, flags);
452
453
454 memcpy(¶m.guid, vendor, sizeof(param.guid));
455
456
457 memset(gsmi_dev.name_buf->start, 0, gsmi_dev.name_buf->length);
458 memcpy(gsmi_dev.name_buf->start, name, name_len * 2);
459
460
461 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length);
462 memcpy(gsmi_dev.data_buf->start, data, data_size);
463
464
465 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
466 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param));
467
468 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_SET_NVRAM_VAR);
469 if (rc < 0) {
470 printk(KERN_ERR "gsmi: Set Variable failed\n");
471 ret = EFI_INVALID_PARAMETER;
472 }
473
474 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
475
476 return ret;
477 }
478
479 static const struct efivar_operations efivar_ops = {
480 .get_variable = gsmi_get_variable,
481 .set_variable = gsmi_set_variable,
482 .get_next_variable = gsmi_get_next_variable,
483 };
484
485 #endif
486
487 static ssize_t eventlog_write(struct file *filp, struct kobject *kobj,
488 struct bin_attribute *bin_attr,
489 char *buf, loff_t pos, size_t count)
490 {
491 struct gsmi_set_eventlog_param param = {
492 .data_ptr = gsmi_dev.data_buf->address,
493 };
494 int rc = 0;
495 unsigned long flags;
496
497
498 if (count < sizeof(u32))
499 return -EINVAL;
500 param.type = *(u32 *)buf;
501 buf += sizeof(u32);
502
503
504 if ((count - sizeof(u32)) > gsmi_dev.data_buf->length)
505 return -EINVAL;
506 param.data_len = count - sizeof(u32);
507
508 spin_lock_irqsave(&gsmi_dev.lock, flags);
509
510
511 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length);
512 memcpy(gsmi_dev.data_buf->start, buf, param.data_len);
513
514
515 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
516 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param));
517
518 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_SET_EVENT_LOG);
519 if (rc < 0)
520 printk(KERN_ERR "gsmi: Set Event Log failed\n");
521
522 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
523
524 return (rc == 0) ? count : rc;
525
526 }
527
528 static struct bin_attribute eventlog_bin_attr = {
529 .attr = {.name = "append_to_eventlog", .mode = 0200},
530 .write = eventlog_write,
531 };
532
533 static ssize_t gsmi_clear_eventlog_store(struct kobject *kobj,
534 struct kobj_attribute *attr,
535 const char *buf, size_t count)
536 {
537 int rc;
538 unsigned long flags;
539 unsigned long val;
540 struct {
541 u32 percentage;
542 u32 data_type;
543 } param;
544
545 rc = kstrtoul(buf, 0, &val);
546 if (rc)
547 return rc;
548
549
550
551
552
553 if (val > 100)
554 return -EINVAL;
555
556
557 param.percentage = val;
558 param.data_type = 0;
559
560 spin_lock_irqsave(&gsmi_dev.lock, flags);
561
562
563 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
564 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param));
565
566 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_CLEAR_EVENT_LOG);
567
568 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
569
570 if (rc)
571 return rc;
572 return count;
573 }
574
575 static struct kobj_attribute gsmi_clear_eventlog_attr = {
576 .attr = {.name = "clear_eventlog", .mode = 0200},
577 .store = gsmi_clear_eventlog_store,
578 };
579
580 static ssize_t gsmi_clear_config_store(struct kobject *kobj,
581 struct kobj_attribute *attr,
582 const char *buf, size_t count)
583 {
584 int rc;
585 unsigned long flags;
586
587 spin_lock_irqsave(&gsmi_dev.lock, flags);
588
589
590 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
591
592 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_CLEAR_CONFIG);
593
594 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
595
596 if (rc)
597 return rc;
598 return count;
599 }
600
601 static struct kobj_attribute gsmi_clear_config_attr = {
602 .attr = {.name = "clear_config", .mode = 0200},
603 .store = gsmi_clear_config_store,
604 };
605
606 static const struct attribute *gsmi_attrs[] = {
607 &gsmi_clear_config_attr.attr,
608 &gsmi_clear_eventlog_attr.attr,
609 NULL,
610 };
611
612 static int gsmi_shutdown_reason(int reason)
613 {
614 struct gsmi_log_entry_type_1 entry = {
615 .type = GSMI_LOG_ENTRY_TYPE_KERNEL,
616 .instance = reason,
617 };
618 struct gsmi_set_eventlog_param param = {
619 .data_len = sizeof(entry),
620 .type = 1,
621 };
622 static int saved_reason;
623 int rc = 0;
624 unsigned long flags;
625
626
627 if (saved_reason & (1 << reason))
628 return 0;
629
630 spin_lock_irqsave(&gsmi_dev.lock, flags);
631
632 saved_reason |= (1 << reason);
633
634
635 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length);
636 memcpy(gsmi_dev.data_buf->start, &entry, sizeof(entry));
637
638
639 param.data_ptr = gsmi_dev.data_buf->address;
640 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
641 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param));
642
643 rc = gsmi_exec(GSMI_CALLBACK, GSMI_CMD_SET_EVENT_LOG);
644
645 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
646
647 if (rc < 0)
648 printk(KERN_ERR "gsmi: Log Shutdown Reason failed\n");
649 else
650 printk(KERN_EMERG "gsmi: Log Shutdown Reason 0x%02x\n",
651 reason);
652
653 return rc;
654 }
655
656 static int gsmi_reboot_callback(struct notifier_block *nb,
657 unsigned long reason, void *arg)
658 {
659 gsmi_shutdown_reason(GSMI_SHUTDOWN_CLEAN);
660 return NOTIFY_DONE;
661 }
662
663 static struct notifier_block gsmi_reboot_notifier = {
664 .notifier_call = gsmi_reboot_callback
665 };
666
667 static int gsmi_die_callback(struct notifier_block *nb,
668 unsigned long reason, void *arg)
669 {
670 if (reason == DIE_OOPS)
671 gsmi_shutdown_reason(GSMI_SHUTDOWN_OOPS);
672 return NOTIFY_DONE;
673 }
674
675 static struct notifier_block gsmi_die_notifier = {
676 .notifier_call = gsmi_die_callback
677 };
678
679 static int gsmi_panic_callback(struct notifier_block *nb,
680 unsigned long reason, void *arg)
681 {
682 gsmi_shutdown_reason(GSMI_SHUTDOWN_PANIC);
683 return NOTIFY_DONE;
684 }
685
686 static struct notifier_block gsmi_panic_notifier = {
687 .notifier_call = gsmi_panic_callback,
688 };
689
690
691
692
693
694
695
696
697
698
699 static u64 __init local_hash_64(u64 val, unsigned bits)
700 {
701 u64 hash = val;
702
703
704 u64 n = hash;
705 n <<= 18;
706 hash -= n;
707 n <<= 33;
708 hash -= n;
709 n <<= 3;
710 hash += n;
711 n <<= 3;
712 hash -= n;
713 n <<= 4;
714 hash += n;
715 n <<= 2;
716 hash += n;
717
718
719 return hash >> (64 - bits);
720 }
721
722 static u32 __init hash_oem_table_id(char s[8])
723 {
724 u64 input;
725 memcpy(&input, s, 8);
726 return local_hash_64(input, 32);
727 }
728
729 static const struct dmi_system_id gsmi_dmi_table[] __initconst = {
730 {
731 .ident = "Google Board",
732 .matches = {
733 DMI_MATCH(DMI_BOARD_VENDOR, "Google, Inc."),
734 },
735 },
736 {
737 .ident = "Coreboot Firmware",
738 .matches = {
739 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
740 },
741 },
742 {}
743 };
744 MODULE_DEVICE_TABLE(dmi, gsmi_dmi_table);
745
746 static __init int gsmi_system_valid(void)
747 {
748 u32 hash;
749
750 if (!dmi_check_system(gsmi_dmi_table))
751 return -ENODEV;
752
753
754
755
756
757
758
759
760
761 if (!strncmp(acpi_gbl_FADT.header.oem_table_id, "FACP", 4)) {
762 printk(KERN_INFO "gsmi: Board is too old\n");
763 return -ENODEV;
764 }
765
766
767 hash = hash_oem_table_id(acpi_gbl_FADT.header.oem_table_id);
768 if (hash == QUIRKY_BOARD_HASH) {
769 const char *bios_ver = dmi_get_system_info(DMI_BIOS_VERSION);
770 if (strncmp(bios_ver, "1.0", 3) == 0) {
771 pr_info("gsmi: disabled on this board's BIOS %s\n",
772 bios_ver);
773 return -ENODEV;
774 }
775 }
776
777
778 if (acpi_gbl_FADT.smi_command == 0) {
779 pr_info("gsmi: missing smi_command\n");
780 return -ENODEV;
781 }
782
783
784 return 0;
785 }
786
787 static struct kobject *gsmi_kobj;
788
789 static const struct platform_device_info gsmi_dev_info = {
790 .name = "gsmi",
791 .id = -1,
792
793 .dma_mask = DMA_BIT_MASK(32),
794 };
795
796 #ifdef CONFIG_PM
797 static void gsmi_log_s0ix_info(u8 cmd)
798 {
799 unsigned long flags;
800
801
802
803
804
805 if (!s0ix_logging_enable)
806 return;
807
808 spin_lock_irqsave(&gsmi_dev.lock, flags);
809
810 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length);
811
812 gsmi_exec(GSMI_CALLBACK, cmd);
813
814 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
815 }
816
817 static int gsmi_log_s0ix_suspend(struct device *dev)
818 {
819
820
821
822
823 if (!pm_suspend_via_firmware())
824 gsmi_log_s0ix_info(GSMI_CMD_LOG_S0IX_SUSPEND);
825
826
827
828
829
830 return 0;
831 }
832
833 static int gsmi_log_s0ix_resume(struct device *dev)
834 {
835
836
837
838
839 if (!pm_resume_via_firmware())
840 gsmi_log_s0ix_info(GSMI_CMD_LOG_S0IX_RESUME);
841
842
843
844
845
846 return 0;
847 }
848
849 static const struct dev_pm_ops gsmi_pm_ops = {
850 .suspend_noirq = gsmi_log_s0ix_suspend,
851 .resume_noirq = gsmi_log_s0ix_resume,
852 };
853
854 static int gsmi_platform_driver_probe(struct platform_device *dev)
855 {
856 return 0;
857 }
858
859 static struct platform_driver gsmi_driver_info = {
860 .driver = {
861 .name = "gsmi",
862 .pm = &gsmi_pm_ops,
863 },
864 .probe = gsmi_platform_driver_probe,
865 };
866 #endif
867
868 static __init int gsmi_init(void)
869 {
870 unsigned long flags;
871 int ret;
872
873 ret = gsmi_system_valid();
874 if (ret)
875 return ret;
876
877 gsmi_dev.smi_cmd = acpi_gbl_FADT.smi_command;
878
879 #ifdef CONFIG_PM
880 ret = platform_driver_register(&gsmi_driver_info);
881 if (unlikely(ret)) {
882 printk(KERN_ERR "gsmi: unable to register platform driver\n");
883 return ret;
884 }
885 #endif
886
887
888 gsmi_dev.pdev = platform_device_register_full(&gsmi_dev_info);
889 if (IS_ERR(gsmi_dev.pdev)) {
890 printk(KERN_ERR "gsmi: unable to register platform device\n");
891 return PTR_ERR(gsmi_dev.pdev);
892 }
893
894
895 spin_lock_init(&gsmi_dev.lock);
896
897 ret = -ENOMEM;
898 gsmi_dev.dma_pool = dma_pool_create("gsmi", &gsmi_dev.pdev->dev,
899 GSMI_BUF_SIZE, GSMI_BUF_ALIGN, 0);
900 if (!gsmi_dev.dma_pool)
901 goto out_err;
902
903
904
905
906
907 gsmi_dev.name_buf = gsmi_buf_alloc();
908 if (!gsmi_dev.name_buf) {
909 printk(KERN_ERR "gsmi: failed to allocate name buffer\n");
910 goto out_err;
911 }
912
913 gsmi_dev.data_buf = gsmi_buf_alloc();
914 if (!gsmi_dev.data_buf) {
915 printk(KERN_ERR "gsmi: failed to allocate data buffer\n");
916 goto out_err;
917 }
918
919 gsmi_dev.param_buf = gsmi_buf_alloc();
920 if (!gsmi_dev.param_buf) {
921 printk(KERN_ERR "gsmi: failed to allocate param buffer\n");
922 goto out_err;
923 }
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953 spin_lock_irqsave(&gsmi_dev.lock, flags);
954 gsmi_dev.handshake_type = GSMI_HANDSHAKE_SPIN;
955 gsmi_dev.handshake_type =
956 gsmi_exec(GSMI_CALLBACK, GSMI_CMD_HANDSHAKE_TYPE);
957 if (gsmi_dev.handshake_type == -ENOSYS)
958 gsmi_dev.handshake_type = GSMI_HANDSHAKE_NONE;
959 spin_unlock_irqrestore(&gsmi_dev.lock, flags);
960
961
962 if (gsmi_dev.handshake_type == -ENXIO) {
963 printk(KERN_INFO "gsmi version " DRIVER_VERSION
964 " failed to load\n");
965 ret = -ENODEV;
966 goto out_err;
967 }
968
969
970 ret = -ENOMEM;
971 gsmi_kobj = kobject_create_and_add("gsmi", firmware_kobj);
972 if (!gsmi_kobj) {
973 printk(KERN_INFO "gsmi: Failed to create firmware kobj\n");
974 goto out_err;
975 }
976
977
978 ret = sysfs_create_bin_file(gsmi_kobj, &eventlog_bin_attr);
979 if (ret) {
980 printk(KERN_INFO "gsmi: Failed to setup eventlog");
981 goto out_err;
982 }
983
984
985 ret = sysfs_create_files(gsmi_kobj, gsmi_attrs);
986 if (ret) {
987 printk(KERN_INFO "gsmi: Failed to add attrs");
988 goto out_remove_bin_file;
989 }
990
991 #ifdef CONFIG_EFI_VARS
992 ret = efivars_register(&efivars, &efivar_ops, gsmi_kobj);
993 if (ret) {
994 printk(KERN_INFO "gsmi: Failed to register efivars\n");
995 sysfs_remove_files(gsmi_kobj, gsmi_attrs);
996 goto out_remove_bin_file;
997 }
998 #endif
999
1000 register_reboot_notifier(&gsmi_reboot_notifier);
1001 register_die_notifier(&gsmi_die_notifier);
1002 atomic_notifier_chain_register(&panic_notifier_list,
1003 &gsmi_panic_notifier);
1004
1005 printk(KERN_INFO "gsmi version " DRIVER_VERSION " loaded\n");
1006
1007 return 0;
1008
1009 out_remove_bin_file:
1010 sysfs_remove_bin_file(gsmi_kobj, &eventlog_bin_attr);
1011 out_err:
1012 kobject_put(gsmi_kobj);
1013 gsmi_buf_free(gsmi_dev.param_buf);
1014 gsmi_buf_free(gsmi_dev.data_buf);
1015 gsmi_buf_free(gsmi_dev.name_buf);
1016 dma_pool_destroy(gsmi_dev.dma_pool);
1017 platform_device_unregister(gsmi_dev.pdev);
1018 pr_info("gsmi: failed to load: %d\n", ret);
1019 return ret;
1020 }
1021
1022 static void __exit gsmi_exit(void)
1023 {
1024 unregister_reboot_notifier(&gsmi_reboot_notifier);
1025 unregister_die_notifier(&gsmi_die_notifier);
1026 atomic_notifier_chain_unregister(&panic_notifier_list,
1027 &gsmi_panic_notifier);
1028 #ifdef CONFIG_EFI_VARS
1029 efivars_unregister(&efivars);
1030 #endif
1031
1032 sysfs_remove_files(gsmi_kobj, gsmi_attrs);
1033 sysfs_remove_bin_file(gsmi_kobj, &eventlog_bin_attr);
1034 kobject_put(gsmi_kobj);
1035 gsmi_buf_free(gsmi_dev.param_buf);
1036 gsmi_buf_free(gsmi_dev.data_buf);
1037 gsmi_buf_free(gsmi_dev.name_buf);
1038 dma_pool_destroy(gsmi_dev.dma_pool);
1039 platform_device_unregister(gsmi_dev.pdev);
1040 }
1041
1042 module_init(gsmi_init);
1043 module_exit(gsmi_exit);
1044
1045 MODULE_AUTHOR("Google, Inc.");
1046 MODULE_LICENSE("GPL");