mirror of
https://github.com/fail0verflow/switch-coreboot.git
synced 2025-05-04 01:39:18 -04:00
renamed the phase3 etc. to stuff like phase3_scan, so you can get a rought idea what it is. The names mean more. adding pci_device and, at the same time, showing how we can get rid of the really ugly stuff that crept in. note you can specify ops in the dts, which avoids the need for hideous stuff like this: static void enable_dev(struct device *dev) { /* Set the operations if it is a special bus type */ if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) { dev->ops = &pci_domain_ops; pci_set_method(dev); } else if (dev->path.type == DEVICE_PATH_APIC_CLUSTER) { dev->ops = &cpu_bus_ops; } } So that foolishness is gone. added delay functions. Note that we have include/lib.h, and define all the functions in there, instead of in lots of fiddly includes. Brought back the enable op, once I understood it; renamed it to something that makes sense. I'll be on a plane soon, will continue to work, but at least you can see what's going on here. Signed-off-by: Ronald G. Minnich <rminnich@gmail.com> Acked-by: Ronald G. Minnich <rminnich@gmail.com> Acked-by: Stefan Reinauer <stepan@coresystems.de> git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@139 f3766cd6-281f-0410-b1cd-43a5c92072e9
71 lines
2.3 KiB
C
71 lines
2.3 KiB
C
/*
|
|
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; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
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 <arch/pciconf.h>
|
|
#include <device/pci.h>
|
|
#include <device/pci_ids.h>
|
|
#include <device/pci_ops.h>
|
|
|
|
static struct bus *get_pbus(struct device * dev)
|
|
{
|
|
struct bus *pbus = dev->bus;
|
|
while(pbus && pbus->dev && !ops_pci_bus(pbus)) {
|
|
pbus = pbus->dev->bus;
|
|
}
|
|
if (!pbus || !pbus->dev || !pbus->dev->ops || !pbus->dev->ops->ops_pci_bus) {
|
|
printk_alert("%s Cannot find pci bus operations", dev_path(dev));
|
|
die("");
|
|
for(;;);
|
|
}
|
|
return pbus;
|
|
}
|
|
|
|
uint8_t pci_read_config8(struct device * dev, unsigned where)
|
|
{
|
|
struct bus *pbus = get_pbus(dev);
|
|
return ops_pci_bus(pbus)->read8(pbus, dev->bus->secondary, dev->path.u.pci.devfn, where);
|
|
}
|
|
|
|
uint16_t pci_read_config16(struct device * dev, unsigned where)
|
|
{
|
|
struct bus *pbus = get_pbus(dev);
|
|
return ops_pci_bus(pbus)->read16(pbus, dev->bus->secondary, dev->path.u.pci.devfn, where);
|
|
}
|
|
|
|
uint32_t pci_read_config32(struct device * dev, unsigned where)
|
|
{
|
|
struct bus *pbus = get_pbus(dev);
|
|
return ops_pci_bus(pbus)->read32(pbus, dev->bus->secondary, dev->path.u.pci.devfn, where);
|
|
}
|
|
|
|
void pci_write_config8(struct device * dev, unsigned where, uint8_t val)
|
|
{
|
|
struct bus *pbus = get_pbus(dev);
|
|
ops_pci_bus(pbus)->write8(pbus, dev->bus->secondary, dev->path.u.pci.devfn, where, val);
|
|
}
|
|
|
|
void pci_write_config16(struct device * dev, unsigned where, uint16_t val)
|
|
{
|
|
struct bus *pbus = get_pbus(dev);
|
|
ops_pci_bus(pbus)->write16(pbus, dev->bus->secondary, dev->path.u.pci.devfn, where, val);
|
|
}
|
|
|
|
void pci_write_config32(struct device * dev, unsigned where, uint32_t val)
|
|
{
|
|
struct bus *pbus = get_pbus(dev);
|
|
ops_pci_bus(pbus)->write32(pbus, dev->bus->secondary, dev->path.u.pci.devfn, where, val);
|
|
}
|