remove trailing whitespace
[coreboot.git] / src / mainboard / getac / p470 / mainboard_smi.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2008-2009 coresystems GmbH
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; version 2 of
9  * the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
19  * MA 02110-1301 USA
20  */
21
22 #include <arch/io.h>
23 #include <arch/romcc_io.h>
24 #include <console/console.h>
25 #include <cpu/x86/smm.h>
26 #include "southbridge/intel/i82801gx/i82801gx.h"
27 #include "southbridge/intel/i82801gx/nvs.h"
28 #include <ec/acpi/ec.h>
29 #include "ec_oem.c"
30
31 #define MAX_LCD_BRIGHTNESS 0xd8
32
33 /* The southbridge SMI handler checks whether gnvs has a
34  * valid pointer before calling the trap handler
35  */
36 extern global_nvs_t *gnvs;
37
38 int mainboard_io_trap_handler(int smif)
39 {
40         u8 reg8;
41         u32 reg32;
42
43         switch (smif) {
44         case 0x2b:
45                 printk(BIOS_DEBUG, "CPU power state switch\n");
46                 // TODO, move to CPU handler?
47                 break;
48         case 0x3d:
49                 printk(BIOS_DEBUG, "Enable C-State SMM coordination\n");
50                 // TODO, move to CPU handler?
51                 break;
52         case 0x46:
53                 printk(BIOS_DEBUG, "S3 DTS SMI (completely re-enable DTS)\n");
54                 // TODO, move to CPU handler?
55                 break;
56         case 0x47:
57                 printk(BIOS_DEBUG, "S4 DTS SMI (Update NVS DTS temperature)\n");
58                 // TODO, move to CPU handler?
59                 break;
60         case 0xc0:
61                 printk(BIOS_DEBUG, "Disable RF\n");
62                 // TODO
63                 break;
64         case 0xd0:
65                 printk(BIOS_DEBUG, "ACBS LAN Power on\n");
66                 // TODO
67                 break;
68         case 0xd1:
69                 printk(BIOS_DEBUG, "ACBS LAN Power off\n");
70                 // TODO
71                 break;
72         case 0xd2:
73                 printk(BIOS_DEBUG, "Check AC status\n");
74                 // TODO
75                 break;
76         case 0xd3:
77                 printk(BIOS_DEBUG, "Enable Bluetooth\n");
78                 // TODO
79                 break;
80         case 0xd4:
81                 printk(BIOS_DEBUG, "Disable Bluetooth\n");
82                 // TODO
83                 break;
84         case 0xd5:
85                 printk(BIOS_DEBUG, "Set Brightness\n");
86                 reg8 = gnvs->brtl;
87                 printk(BIOS_DEBUG, "brtl: %x\n", reg8);
88                 ec_write(0x17, reg8);
89                 break;
90         case 0xd6:
91                 printk(BIOS_DEBUG, "Get Brightness\n");
92                 reg8 = ec_read(0x17);
93                 printk(BIOS_DEBUG, "brtl: %x\n", reg8);
94                 gnvs->brtl = reg8;
95                 break;
96         case 0xd7:
97                 printk(BIOS_DEBUG, "Get ECO mode status\n");
98                 // TODO
99                 break;
100         case 0xd8:
101                 printk(BIOS_DEBUG, "Get sunlight readable status\n");
102                 // TODO
103                 break;
104         case 0xd9:
105                 printk(BIOS_DEBUG, "Get docking connection\n");
106                 // TODO
107                 break;
108         case 0xda:
109                 printk(BIOS_DEBUG, "Power off docking\n");
110                 // TODO
111                 break;
112         case 0xdc:
113                 printk(BIOS_DEBUG, "EC: Turn on LED on ECO enable\n");
114                 // TODO
115                 break;
116         case 0xdd:
117                 printk(BIOS_DEBUG, "EC: Turn off LED on ECO disable\n");
118                 // TODO
119                 break;
120         case 0xde:
121                 printk(BIOS_DEBUG, "LAN power off\n");
122                 reg32 = inl(DEFAULT_GPIOBASE + GP_LVL);
123                 reg32 |= (1 << 24);                     // Disable LAN Power
124                 outl(reg32, DEFAULT_GPIOBASE + GP_LVL);
125                 break;
126         case 0xdf:
127                 printk(BIOS_DEBUG, "RF enable\n");
128                 // TODO
129                 break;
130         case 0xe0:
131                 printk(BIOS_DEBUG, "Get RTC wake flag\n");
132                 // TODO
133                 break;
134         case 0xe1:
135                 printk(BIOS_DEBUG, "Hotkey function\n");
136                 // TODO
137                 break;
138         case 0xe3:
139                 printk(BIOS_DEBUG, "ECO disable\n");
140                 // TODO
141                 break;
142         default:
143                 return 0;
144         }
145
146         /* gnvs->smif:
147          *   On success, the IO Trap Handler returns 0
148          *   On failure, the IO Trap Handler returns a value != 0
149          */
150         gnvs->smif = 0;
151         return 1;
152 }
153
154 static void mainboard_smi_hotkey(u8 hotkey)
155 {
156         u8 reg8;
157
158         switch (hotkey) {
159         case 0x3b: break; // Fn+F1
160         case 0x3c: break; // Fn+F2
161         case 0x3d: break; // Fn+F3
162         case 0x3e: break; // Fn+F4
163         case 0x3f: break; // Fn+F5
164         case 0x40:        // Fn+F6 (Decrease Display Brightness)
165                    reg8 = ec_read(0x17);
166                    reg8 = (reg8 > 8) ? (reg8 - 8) : 0;
167                    ec_write(0x17, reg8);
168                    return;
169         case 0x41:        // Fn+F7 (Increase Display Brightness)
170                    reg8 = ec_read(0x17);
171                    reg8 += 8;
172                    reg8 = (reg8 >= MAX_LCD_BRIGHTNESS) ? MAX_LCD_BRIGHTNESS : reg8;
173                    ec_write(0x17, reg8);
174                    return;
175         case 0x42: break; // Fn+F8
176         case 0x43: break; // Fn+F9
177         case 0x44: break; // Fn+F10
178         case 0x57: break; // Fn+F11
179         case 0x58: break; // Fn+F12
180         }
181         printk(BIOS_DEBUG, "EC hotkey: %02x\n", hotkey);
182 }
183
184 void mainboard_smi_gpi(u16 gpi_sts)
185 {
186         u8 source, hotkey;
187         send_ec_oem_command(0x5c);
188         source = recv_ec_oem_data();
189
190         switch (source) {
191         case 0:
192                 // Some kind of ACK?
193                 break;
194         case 1:
195                 send_ec_oem_command(0x59);
196                 hotkey = recv_ec_oem_data();
197                 mainboard_smi_hotkey(hotkey);
198                 break;
199         default:
200                 printk(BIOS_DEBUG, "EC SMI source: %02x\n", source);
201         }
202 }
203