summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/Makefile.inc2
-rw-r--r--src/lib/cbfs.c59
-rw-r--r--src/mainboard/lenovo/x60/acpi/ec.asl23
-rw-r--r--src/mainboard/lenovo/x60/acpi/video.asl4
-rw-r--r--src/mainboard/lenovo/x60/cmos.layout1
-rw-r--r--src/mainboard/lenovo/x60/mainboard_smi.c25
-rw-r--r--src/mainboard/lenovo/x60/smi.h1
-rw-r--r--src/pc80/Makefile.inc1
8 files changed, 85 insertions, 31 deletions
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 38171615ac..54935cabad 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -36,7 +36,7 @@ ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c
driver-$(CONFIG_CONSOLE_NE2K) += ne2k.c
-smm-y += memcpy.c
+smm-y += memcpy.c cbfs.c memset.c memcmp.c
smm-$(CONFIG_CONSOLE_SERIAL8250) += uart8250.c
smm-$(CONFIG_CONSOLE_SERIAL8250MEM) += uart8250mem.c
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 690033e6b0..7cfa3e2a40 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -25,34 +25,6 @@
#include <arch/byteorder.h>
-/**
- * Decompression wrapper for CBFS
- * @param algo
- * @param src
- * @param dst
- * @param len
- * @return 0 on success, -1 on failure
- */
-static int cbfs_decompress(int algo, void *src, void *dst, int len)
-{
- switch(algo) {
- case CBFS_COMPRESS_NONE:
- memcpy(dst, src, len);
- return 0;
-
- case CBFS_COMPRESS_LZMA:
- if (!ulzma(src, dst)) {
- printk(BIOS_ERR, "CBFS: LZMA decompression failed!\n");
- return -1;
- }
- return 0;
-
- default:
- printk(BIOS_INFO, "CBFS: Unknown compression type %d\n", algo);
- return -1;
- }
-}
-
static int cbfs_check_magic(struct cbfs_file *file)
{
return !strcmp(file->magic, CBFS_FILE_MAGIC) ? 1 : 0;
@@ -132,6 +104,7 @@ void *cbfs_find_file(const char *name, int type)
return (void *) CBFS_SUBHEADER(file);
}
+#ifndef __SMM__
static inline int tohex4(unsigned int c)
{
return (c<=9)?(c+'0'):(c-10+'a');
@@ -145,6 +118,34 @@ static void tohex16(unsigned int val, char* dest)
dest[3]=tohex4(val & 0xf);
}
+/**
+ * Decompression wrapper for CBFS
+ * @param algo
+ * @param src
+ * @param dst
+ * @param len
+ * @return 0 on success, -1 on failure
+ */
+static int cbfs_decompress(int algo, void *src, void *dst, int len)
+{
+ switch(algo) {
+ case CBFS_COMPRESS_NONE:
+ memcpy(dst, src, len);
+ return 0;
+
+ case CBFS_COMPRESS_LZMA:
+ if (!ulzma(src, dst)) {
+ printk(BIOS_ERR, "CBFS: LZMA decompression failed!\n");
+ return -1;
+ }
+ return 0;
+ default:
+ printk(BIOS_INFO, "CBFS: Unknown compression type %d\n", algo);
+ return -1;
+ }
+}
+
+
void *cbfs_load_optionrom(u16 vendor, u16 device, void * dest)
{
char name[17]="pciXXXX,XXXX.rom";
@@ -246,4 +247,4 @@ int run_address(void *f)
v = f;
return v();
}
-
+#endif
diff --git a/src/mainboard/lenovo/x60/acpi/ec.asl b/src/mainboard/lenovo/x60/acpi/ec.asl
index c3569e8c41..5c04339725 100644
--- a/src/mainboard/lenovo/x60/acpi/ec.asl
+++ b/src/mainboard/lenovo/x60/acpi/ec.asl
@@ -1 +1,24 @@
#include <ec/lenovo/h8/acpi/ec.asl>
+
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ /* Volume down */
+ Method(_Q1C, 0, NotSerialized)
+ {
+ Trap(SMI_SAVE_CMOS)
+ }
+
+ /* Volume up */
+ Method(_Q1D, 0, NotSerialized)
+ {
+ Trap(SMI_SAVE_CMOS)
+ }
+
+ /* Mute key pressed */
+ Method(_Q1E, 0, NotSerialized)
+ {
+ Trap(SMI_SAVE_CMOS)
+ }
+
+
+}
diff --git a/src/mainboard/lenovo/x60/acpi/video.asl b/src/mainboard/lenovo/x60/acpi/video.asl
index c2f9dfb459..b38d82b6a5 100644
--- a/src/mainboard/lenovo/x60/acpi/video.asl
+++ b/src/mainboard/lenovo/x60/acpi/video.asl
@@ -19,6 +19,8 @@
* MA 02110-1301 USA
*/
+#include "smi.h"
+
Device (DSPC)
{
Name (_ADR, 0x00020001)
@@ -36,6 +38,7 @@ Device (DSPC)
{
Subtract(Local0, 16, Local0)
Store(Local0, BRTC)
+ Trap(SMI_SAVE_CMOS)
}
}
@@ -46,6 +49,7 @@ Device (DSPC)
{
Add (Local0, 16, Local0)
Store(Local0, BRTC)
+ Trap(SMI_SAVE_CMOS)
}
}
}
diff --git a/src/mainboard/lenovo/x60/cmos.layout b/src/mainboard/lenovo/x60/cmos.layout
index 1875e599e6..a1575137c7 100644
--- a/src/mainboard/lenovo/x60/cmos.layout
+++ b/src/mainboard/lenovo/x60/cmos.layout
@@ -108,6 +108,7 @@ entries
1052 4 r 0 C1DRT1
1064 8 h 0 volume
+1072 8 h 0 tft_brightness
# -----------------------------------------------------------------
enumerations
diff --git a/src/mainboard/lenovo/x60/mainboard_smi.c b/src/mainboard/lenovo/x60/mainboard_smi.c
index d13055ee70..769432f618 100644
--- a/src/mainboard/lenovo/x60/mainboard_smi.c
+++ b/src/mainboard/lenovo/x60/mainboard_smi.c
@@ -25,6 +25,8 @@
#include <cpu/x86/smm.h>
#include "southbridge/intel/i82801gx/nvs.h"
#include <ec/acpi/ec.h>
+#include <pc80/mc146818rtc.h>
+#include <ec/lenovo/h8/h8.h>
#include "dock.h"
#include "smi.h"
@@ -38,7 +40,25 @@ static void mainboard_smm_init(void)
printk(BIOS_DEBUG, "initializing SMI\n");
/* Enable 0x1600/0x1600 register pair */
ec_set_bit(0x00, 0x05);
- ec_set_ports(0x1604, 0x1600);
+}
+
+static void mainboard_smi_save_cmos(void)
+{
+ u8 val;
+ u8 tmp70, tmp72, tmpcf8;
+
+ tmp70 = inb(0x70);
+ tmp72 = inb(0x72);
+ tmpcf8 = inl(0xcf8);
+
+ val = pci_read_config8(PCI_DEV(0, 2, 1), 0xf4);
+ set_option("tft_brightness", &val);
+ val = ec_read(H8_VOLUME_CONTROL);
+ set_option("volume", &val);
+
+ outb(tmp70, 0x70);
+ outb(tmp72, 0x72);
+ outb(tmpcf8, 0xcf8);
}
int mainboard_io_trap_handler(int smif)
@@ -67,6 +87,9 @@ int mainboard_io_trap_handler(int smif)
ec_write(0x0c, 0x08);
break;
+ case SMI_SAVE_CMOS:
+ mainboard_smi_save_cmos();
+ break;
default:
return 0;
}
diff --git a/src/mainboard/lenovo/x60/smi.h b/src/mainboard/lenovo/x60/smi.h
index 6eb840256a..ad096b9cb9 100644
--- a/src/mainboard/lenovo/x60/smi.h
+++ b/src/mainboard/lenovo/x60/smi.h
@@ -3,5 +3,6 @@
#define SMI_DOCK_CONNECT 0x01
#define SMI_DOCK_DISCONNECT 0x02
+#define SMI_SAVE_CMOS 0x03
#endif
diff --git a/src/pc80/Makefile.inc b/src/pc80/Makefile.inc
index 0bc57b2ced..4f126f681d 100644
--- a/src/pc80/Makefile.inc
+++ b/src/pc80/Makefile.inc
@@ -11,3 +11,4 @@ cbfs-files-$(CONFIG_HAVE_CMOS_DEFAULT) += cmos.default
cmos.default-file = $(CONFIG_CMOS_DEFAULT_FILE)
cmos.default-type = 0xaa
+smm-y += mc146818rtc.c