2015-06-05 18:53:43 +02:00
|
|
|
/*
|
|
|
|
* This file is part of the coreboot project.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2014 Google Inc.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; version 2 of the License.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
2019-03-01 12:43:02 +01:00
|
|
|
#include <device/pci_ops.h>
|
2015-06-05 18:53:43 +02:00
|
|
|
#include <device/device.h>
|
|
|
|
#include <device/pci.h>
|
|
|
|
#include <vendorcode/google/chromeos/chromeos.h>
|
|
|
|
#include <ec/google/chromeec/ec.h>
|
|
|
|
#include <soc/gpio.h>
|
|
|
|
#include <soc/sata.h>
|
2017-03-17 22:14:14 +01:00
|
|
|
#include "onboard.h"
|
2015-06-05 18:53:43 +02:00
|
|
|
|
|
|
|
#define GPIO_SPI_WP 58
|
|
|
|
#define GPIO_REC_MODE 12
|
|
|
|
|
|
|
|
#define FLAG_SPI_WP 0
|
|
|
|
#define FLAG_REC_MODE 1
|
|
|
|
|
2019-03-14 22:47:33 +01:00
|
|
|
#if ENV_RAMSTAGE
|
2015-06-05 18:53:43 +02:00
|
|
|
#include <boot/coreboot_tables.h>
|
|
|
|
|
|
|
|
void fill_lb_gpios(struct lb_gpios *gpios)
|
|
|
|
{
|
chromeos: Simplify fill_lb_gpios even further
A long time ago many Chrome OS boards had pages full of duplicated
boilerplate code for the fill_lb_gpios() function, and we spent a lot of
time bikeshedding a proper solution that passes a table of lb_gpio
structs which can be concisely written with a static struct initializer
in http://crosreview.com/234648. Unfortunately we never really finished
that patch and in the mean time a different solution using the
fill_lb_gpio() helper got standardized onto most boards.
Still, that solution is not quite as clean and concise as the one we had
already designed, and it also wasn't applied consistently to all recent
boards (causing more boards with bad code to get added afterwards). This
patch switches all boards newer than Link to the better solution and
also adds some nicer debug output for the GPIOs while I'm there.
If more boards need to be converted from fill_lb_gpio() to this model
later (e.g. from a branch), it's quite easy to do with:
s/fill_lb_gpio(gpio++,\n\?\s*\([^,]*\),\n\?\s*\([^,]*\),\n\?\s*\([^,]*\),\n\?\s*\([^,]*\));/\t{\1, \2, \4, \3},/
Based on a patch by Furquan Shaikh <furquan@google.com>.
BUG=None
BRANCH=None
TEST=Booted on Oak. Ran abuild -x.
Change-Id: I449974d1c75c8ed187f5e10935495b2f03725811
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/14226
Tested-by: build bot (Jenkins)
Reviewed-by: David Hendricks <dhendrix@chromium.org>
2016-04-01 02:27:05 +02:00
|
|
|
struct lb_gpio chromeos_gpios[] = {
|
|
|
|
{GPIO_SPI_WP, ACTIVE_HIGH,
|
|
|
|
get_gpio(GPIO_SPI_WP), "write protect"},
|
|
|
|
{GPIO_REC_MODE, ACTIVE_LOW,
|
|
|
|
get_recovery_mode_switch(), "recovery"},
|
|
|
|
{-1, ACTIVE_HIGH, 1, "lid"},
|
|
|
|
{-1, ACTIVE_HIGH, 0, "power"},
|
|
|
|
{-1, ACTIVE_HIGH, gfx_get_init_done(), "oprom"},
|
|
|
|
};
|
|
|
|
lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios));
|
2015-06-05 18:53:43 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int get_write_protect_state(void)
|
|
|
|
{
|
2018-06-21 14:04:51 +02:00
|
|
|
#ifdef __SIMPLE_DEVICE__
|
|
|
|
pci_devfn_t dev = PCI_DEV(0, 0x1f, 2);
|
2015-06-05 18:53:43 +02:00
|
|
|
#else
|
2018-06-21 14:04:51 +02:00
|
|
|
struct device *dev = pcidev_on_root(0x1f, 2);
|
2015-06-05 18:53:43 +02:00
|
|
|
#endif
|
|
|
|
return (pci_read_config32(dev, SATA_SP) >> FLAG_SPI_WP) & 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int get_recovery_mode_switch(void)
|
|
|
|
{
|
2018-06-21 14:04:51 +02:00
|
|
|
#ifdef __SIMPLE_DEVICE__
|
|
|
|
pci_devfn_t dev = PCI_DEV(0, 0x1f, 2);
|
2015-06-05 18:53:43 +02:00
|
|
|
#else
|
2018-06-21 14:04:51 +02:00
|
|
|
struct device *dev = pcidev_on_root(0x1f, 2);
|
2015-06-05 18:53:43 +02:00
|
|
|
#endif
|
|
|
|
return (pci_read_config32(dev, SATA_SP) >> FLAG_REC_MODE) & 1;
|
|
|
|
}
|
|
|
|
|
2018-06-21 16:23:19 +02:00
|
|
|
void init_bootmode_straps(void)
|
2015-06-05 18:53:43 +02:00
|
|
|
{
|
|
|
|
u32 flags = 0;
|
2018-06-21 14:04:51 +02:00
|
|
|
#ifdef __SIMPLE_DEVICE__
|
|
|
|
pci_devfn_t dev = PCI_DEV(0, 0x1f, 2);
|
|
|
|
#else
|
|
|
|
struct device *dev = pcidev_on_root(0x1f, 2);
|
|
|
|
#endif
|
2015-06-05 18:53:43 +02:00
|
|
|
|
|
|
|
/* Write Protect: GPIO58 = GPIO_SPI_WP, active high */
|
|
|
|
if (get_gpio(GPIO_SPI_WP))
|
|
|
|
flags |= (1 << FLAG_SPI_WP);
|
|
|
|
|
|
|
|
/* Recovery: GPIO12 = RECOVERY_L, active low */
|
|
|
|
if (!get_gpio(GPIO_REC_MODE))
|
|
|
|
flags |= (1 << FLAG_REC_MODE);
|
|
|
|
|
|
|
|
/* Developer: Virtual */
|
|
|
|
|
2018-06-21 14:04:51 +02:00
|
|
|
pci_write_config32(dev, SATA_SP, flags);
|
2015-06-05 18:53:43 +02:00
|
|
|
}
|
2016-07-26 04:31:41 +02:00
|
|
|
|
|
|
|
static const struct cros_gpio cros_gpios[] = {
|
|
|
|
CROS_GPIO_REC_AL(GPIO_REC_MODE, CROS_GPIO_DEVICE_NAME),
|
|
|
|
CROS_GPIO_WP_AH(GPIO_SPI_WP, CROS_GPIO_DEVICE_NAME),
|
|
|
|
};
|
|
|
|
|
|
|
|
void mainboard_chromeos_acpi_generate(void)
|
|
|
|
{
|
|
|
|
chromeos_acpi_gpio_generate(cros_gpios, ARRAY_SIZE(cros_gpios));
|
|
|
|
}
|