d7bc23ac8e
When the southcluster pci devices are listed in the devicetree add the ability to perform the proper disabling sequence for turning off devices. This only turns off the pci device interface as well as put the device into D3Hot. It is not yet known how to put the TXE device into D3Hot so it's currently not possible to disable that device. Also, expose the southcluster_enable_dev() function so that other devices can call this if they require doing specific things before disabling the device. The southcluster_enable_dev() is only called on devices found in the devicetree and if they currently have no ops associated with them. BUG=chrome-os-partner:22871 BRANCH=None TEST=Built and booted through depthcharge. Interrogated output to ensure devices were being properly disabled. Change-Id: I537ddcb9379907af2fe012948542b6150a8bf7c5 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/174644 Reviewed-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: http://review.coreboot.org/4911 Tested-by: build bot (Jenkins) Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
95 lines
2.7 KiB
C
95 lines
2.7 KiB
C
/*
|
|
* This file is part of the coreboot project.
|
|
*
|
|
* Copyright (C) 2013 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <console/console.h>
|
|
#include <device/device.h>
|
|
#include <device/pci.h>
|
|
#include <arch/pci_ops.h>
|
|
|
|
#include <baytrail/pci_devs.h>
|
|
#include <baytrail/ramstage.h>
|
|
#include "chip.h"
|
|
|
|
static void pci_domain_set_resources(device_t dev)
|
|
{
|
|
assign_resources(dev->link_list);
|
|
}
|
|
|
|
static struct device_operations pci_domain_ops = {
|
|
.read_resources = pci_domain_read_resources,
|
|
.set_resources = pci_domain_set_resources,
|
|
.enable_resources = NULL,
|
|
.init = NULL,
|
|
.scan_bus = pci_domain_scan_bus,
|
|
.ops_pci_bus = pci_bus_default_ops,
|
|
};
|
|
|
|
static void cpu_bus_noop(device_t dev) { }
|
|
|
|
static struct device_operations cpu_bus_ops = {
|
|
.read_resources = cpu_bus_noop,
|
|
.set_resources = cpu_bus_noop,
|
|
.enable_resources = cpu_bus_noop,
|
|
.init = baytrail_init_cpus,
|
|
.scan_bus = NULL,
|
|
};
|
|
|
|
|
|
static void enable_dev(device_t dev)
|
|
{
|
|
/* Set the operations if it is a special bus type */
|
|
if (dev->path.type == DEVICE_PATH_DOMAIN) {
|
|
dev->ops = &pci_domain_ops;
|
|
} else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
|
|
dev->ops = &cpu_bus_ops;
|
|
} else if (dev->path.type == DEVICE_PATH_PCI) {
|
|
/* Handle south cluster enablement. */
|
|
if (PCI_SLOT(dev->path.pci.devfn) > GFX_DEV &&
|
|
(dev->ops == NULL || dev->ops->enable == NULL)) {
|
|
southcluster_enable_dev(dev);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Called at BS_DEV_INIT_CHIPS time -- very early. Just after BS_PRE_DEVICE. */
|
|
static void soc_init(void *chip_info)
|
|
{
|
|
baytrail_init_pre_device();
|
|
}
|
|
|
|
struct chip_operations soc_intel_baytrail_ops = {
|
|
CHIP_NAME("Intel BayTrail SoC")
|
|
.enable_dev = enable_dev,
|
|
.init = soc_init,
|
|
};
|
|
|
|
static void pci_set_subsystem(device_t dev, unsigned vendor, unsigned device)
|
|
{
|
|
if (!vendor || !device) {
|
|
pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
|
|
pci_read_config32(dev, PCI_VENDOR_ID));
|
|
} else {
|
|
pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
|
|
((device & 0xffff) << 16) | (vendor & 0xffff));
|
|
}
|
|
}
|
|
|
|
struct pci_operations soc_pci_ops = {
|
|
.set_subsystem = &pci_set_subsystem,
|
|
};
|