Major changes: 1. Separate resource allocation into: A. Read Resources B. Avoid fixed resources (constrain limits) C. Allocate resources D. Set resources Usage notes: Resources which have IORESOURCE_FIXED set in the flags constrain the placement of other resources. All fixed resources will end up outside (above or below) the allocated resources. Domains usually start with base = 0 and limit = 2^address_bits - 1. I've added an IOAPIC to all platforms so that the old limit of 0xfec00000 is still there for resources. Some platforms may want to change that, but I didn't want to break anyone's board. Resources are allocated in a single block for memory and another for I/O. Currently the resource allocator doesn't support holes. Signed-off-by: Myles Watson <mylesgw@gmail.com> Acked-by: Ronald G. Minnich <rminnich@gmail.com> Acked-by: Patrick Georgi <patrick.georgi@coresystems.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4394 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
/*
|
|
* Initialisation of the PCI bridge .
|
|
*/
|
|
|
|
#include <arch/io.h>
|
|
#include <device/pci.h>
|
|
#include <device/pci_ids.h>
|
|
#include <console/console.h>
|
|
|
|
static void ram_resource(device_t dev, unsigned long index,
|
|
unsigned long basek, unsigned long sizek)
|
|
{
|
|
struct resource *resource;
|
|
|
|
if (!sizek) {
|
|
return;
|
|
}
|
|
resource = new_resource(dev, index);
|
|
resource->base = ((resource_t)basek) << 10;
|
|
resource->size = ((resource_t)sizek) << 10;
|
|
resource->flags = IORESOURCE_MEM | IORESOURCE_CACHEABLE | \
|
|
IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED;
|
|
}
|
|
|
|
static void pci_domain_set_resources(device_t dev)
|
|
{
|
|
int idx = 3; /* who knows? */
|
|
|
|
ram_resource(dev, idx, 0, CONFIG_EMBEDDED_RAM_SIZE>>10);
|
|
assign_resources(&dev->link[0]);
|
|
}
|
|
|
|
struct device_operations pci_domain_ops = {
|
|
.read_resources = pci_domain_read_resources,
|
|
.set_resources = pci_domain_set_resources,
|
|
.enable_resources = enable_childrens_resources,
|
|
.init = 0,
|
|
.scan_bus = pci_domain_scan_bus,
|
|
.ops_pci_bus = &pci_ppc_conf1
|
|
};
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
struct chip_operations cpu_ppc_ppc4xx_ops = {
|
|
CHIP_NAME("PPC 4XX CPU")
|
|
.enable_dev = enable_dev,
|
|
};
|