blob: 1666fc5528f6f3474262dd3e33ba474befb0bdba [file] [log] [blame]
Aaron Durbinf6933a62012-10-30 09:09:39 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2012 The Chromium OS Authors. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Aaron Durbinf6933a62012-10-30 09:09:39 -050014 */
15
16#include <string.h>
Kyösti Mälkki16455892014-04-28 23:41:06 +030017#include <bootmode.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050018#include <arch/io.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050019#include <device/device.h>
20#include <device/pci.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050021#include <southbridge/intel/lynxpoint/pch.h>
Patrick Rudolph273a8dc2016-02-06 18:07:59 +010022#include <southbridge/intel/common/gpio.h>
Aaron Durbinb0f81512016-07-25 21:31:41 -050023#include <vendorcode/google/chromeos/chromeos.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050024
25#ifndef __PRE_RAM__
26#include <boot/coreboot_tables.h>
Aaron Durbinf6933a62012-10-30 09:09:39 -050027
28#define GPIO_COUNT 6
Aaron Durbinf6933a62012-10-30 09:09:39 -050029
30void fill_lb_gpios(struct lb_gpios *gpios)
31{
32 device_t dev = dev_find_slot(0, PCI_DEVFN(0x1f,0));
33 u16 gpio_base = pci_read_config32(dev, GPIOBASE) & 0xfffe;
34
35 if (!gpio_base)
36 return;
37
Aaron Durbin0160d762012-12-13 16:51:41 -060038 u32 gp_lvl = inl(gpio_base + GP_LVL);
39 u32 gp_lvl2 = inl(gpio_base + GP_LVL2);
40 u32 gp_lvl3 = inl(gpio_base + GP_LVL3);
Aaron Durbinf6933a62012-10-30 09:09:39 -050041
42 gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio));
43 gpios->count = GPIO_COUNT;
44
Aaron Durbin0160d762012-12-13 16:51:41 -060045 /* Write Protect: GPIO22 */
46 gpios->gpios[0].port = 0;
Aaron Durbinf6933a62012-10-30 09:09:39 -050047 gpios->gpios[0].polarity = ACTIVE_LOW;
Aaron Durbin0160d762012-12-13 16:51:41 -060048 gpios->gpios[0].value = (gp_lvl >> 22) & 1;
Aaron Durbinf6933a62012-10-30 09:09:39 -050049 strncpy((char *)gpios->gpios[0].name,"write protect",
50 GPIO_MAX_NAME_LENGTH);
51
Aaron Durbin0160d762012-12-13 16:51:41 -060052 /* Recovery: GPIO69 - SV_DETECT - J8E3 (silkscreen: J8E2) */
53 gpios->gpios[1].port = 69;
54 gpios->gpios[1].polarity = ACTIVE_HIGH;
55 gpios->gpios[1].value = (gp_lvl3 >> (69-64)) & 1;
Aaron Durbinf6933a62012-10-30 09:09:39 -050056 strncpy((char *)gpios->gpios[1].name,"recovery", GPIO_MAX_NAME_LENGTH);
57
Aaron Durbin0160d762012-12-13 16:51:41 -060058 /* Developer: GPIO48 - BIOS_RESP - J8E4 (silkscreen: J8E3) */
59 gpios->gpios[2].port = 48;
Aaron Durbinf6933a62012-10-30 09:09:39 -050060 gpios->gpios[2].polarity = ACTIVE_LOW;
Aaron Durbin0160d762012-12-13 16:51:41 -060061 gpios->gpios[2].value = (gp_lvl2 >> (48-32)) & 1;
Aaron Durbinf6933a62012-10-30 09:09:39 -050062 strncpy((char *)gpios->gpios[2].name,"developer", GPIO_MAX_NAME_LENGTH);
63
64 /* Hard code the lid switch GPIO to open. */
65 gpios->gpios[3].port = -1;
66 gpios->gpios[3].polarity = ACTIVE_HIGH;
67 gpios->gpios[3].value = 1;
68 strncpy((char *)gpios->gpios[3].name,"lid", GPIO_MAX_NAME_LENGTH);
69
70 /* Power Button */
71 gpios->gpios[4].port = -1;
72 gpios->gpios[4].polarity = ACTIVE_HIGH;
73 gpios->gpios[4].value = 0;
74 strncpy((char *)gpios->gpios[4].name,"power", GPIO_MAX_NAME_LENGTH);
75
76 /* Did we load the VGA option ROM? */
77 gpios->gpios[5].port = -1;
78 gpios->gpios[5].polarity = ACTIVE_HIGH;
Kyösti Mälkkiab56b3b2013-11-28 16:44:51 +020079 gpios->gpios[5].value = gfx_get_init_done();
Aaron Durbinf6933a62012-10-30 09:09:39 -050080 strncpy((char *)gpios->gpios[5].name,"oprom", GPIO_MAX_NAME_LENGTH);
81}
82#endif
83
84int get_developer_mode_switch(void)
85{
Aaron Durbin0160d762012-12-13 16:51:41 -060086 /*
87 * Developer: GPIO48, Connected to J8E4, however the silkscreen says
88 * J8E3. The jumper is active low.
89 */
Patrick Rudolph273a8dc2016-02-06 18:07:59 +010090 return !get_gpio(48);
Aaron Durbinf6933a62012-10-30 09:09:39 -050091}
92
93int get_recovery_mode_switch(void)
94{
Aaron Durbin0160d762012-12-13 16:51:41 -060095 /*
96 * Recovery: GPIO69, Connected to J8E3, however the silkscreen says
97 * J8E2. The jump is active high.
98 */
Patrick Rudolph273a8dc2016-02-06 18:07:59 +010099 return get_gpio(69);
Aaron Durbinf6933a62012-10-30 09:09:39 -0500100}
101
Aaron Durbin0df4de92013-03-01 17:38:59 -0600102int get_write_protect_state(void)
103{
104 return 0;
105}
Aaron Durbinb0f81512016-07-25 21:31:41 -0500106
107static const struct cros_gpio cros_gpios[] = {
108 CROS_GPIO_REC_AH(69, CROS_GPIO_DEVICE_NAME),
109 CROS_GPIO_DEV_AL(48, CROS_GPIO_DEVICE_NAME),
110 CROS_GPIO_WP_AL(22, CROS_GPIO_DEVICE_NAME),
111};
112
113void mainboard_chromeos_acpi_generate(void)
114{
115 chromeos_acpi_gpio_generate(cros_gpios, ARRAY_SIZE(cros_gpios));
116}