Re: [coreboot] [v2] r4394 - in trunk/coreboot-v2/src: cpu/amd/sc520cpu/emulation/qemu-x86 cpu/ppc/ppc4xx devices include/devicenorthbridge/amd/amdfam10 northbridge/amd/amdk8northbridge/amd/gx1 northbridge/amd/gx2 northbridge/amd/lxnorthbridge/ibm/cpc710 n
This patch makes my AMD fam10 board not work (K8 works). The resource
can not be allocated correctly.
Zheng
-----Original Message-----
From: coreboot-bounces@coreboot.org
[mailto:coreboot-bounces@coreboot.org] On Behalf Of svn@coreboot.org
Sent: Friday, July 03, 2009 2:56 AM
To: coreboot@coreboot.org
Subject: [coreboot] [v2] r4394 - in trunk/coreboot-v2/src:
cpu/amd/sc520cpu/emulation/qemu-x86 cpu/ppc/ppc4xx devices
include/devicenorthbridge/amd/amdfam10
northbridge/amd/amdk8northbridge/amd/gx1 northbridge/amd/gx2
northbridge/amd/lxnorthbridge/ibm/cpc710 north
Author: myles
Date: 2009-07-02 20:56:24 +0200 (Thu, 02 Jul 2009)
New Revision: 4394
Modified:
trunk/coreboot-v2/src/cpu/amd/sc520/sc520.c
trunk/coreboot-v2/src/cpu/emulation/qemu-x86/northbridge.c
trunk/coreboot-v2/src/cpu/ppc/ppc4xx/pci_domain.c
trunk/coreboot-v2/src/devices/cardbus_device.c
trunk/coreboot-v2/src/devices/device.c
trunk/coreboot-v2/src/devices/device_util.c
trunk/coreboot-v2/src/devices/pci_device.c
trunk/coreboot-v2/src/devices/root_device.c
trunk/coreboot-v2/src/include/device/device.h
trunk/coreboot-v2/src/include/device/resource.h
trunk/coreboot-v2/src/northbridge/amd/amdfam10/northbridge.c
trunk/coreboot-v2/src/northbridge/amd/amdk8/misc_control.c
trunk/coreboot-v2/src/northbridge/amd/amdk8/northbridge.c
trunk/coreboot-v2/src/northbridge/amd/gx1/northbridge.c
trunk/coreboot-v2/src/northbridge/amd/gx2/northbridge.c
trunk/coreboot-v2/src/northbridge/amd/lx/northbridge.c
trunk/coreboot-v2/src/northbridge/ibm/cpc710/cpc710_northbridge.c
trunk/coreboot-v2/src/northbridge/ibm/cpc925/cpc925_northbridge.c
trunk/coreboot-v2/src/northbridge/intel/e7501/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/e7520/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/e7525/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i3100/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i440bx/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i82810/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i82830/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i855gme/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i855pm/northbridge.c
trunk/coreboot-v2/src/northbridge/intel/i945/northbridge.c
trunk/coreboot-v2/src/northbridge/motorola/mpc107/mpc107_northbridge.c
trunk/coreboot-v2/src/northbridge/via/cn400/northbridge.c
trunk/coreboot-v2/src/northbridge/via/cn700/northbridge.c
trunk/coreboot-v2/src/northbridge/via/cx700/cx700_lpc.c
trunk/coreboot-v2/src/northbridge/via/cx700/northbridge.c
trunk/coreboot-v2/src/northbridge/via/vt8601/northbridge.c
trunk/coreboot-v2/src/northbridge/via/vt8623/northbridge.c
trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c
trunk/coreboot-v2/src/southbridge/amd/amd8111/amd8111_lpc.c
trunk/coreboot-v2/src/southbridge/amd/amd8131/amd8131_bridge.c
trunk/coreboot-v2/src/southbridge/amd/amd8132/amd8132_bridge.c
trunk/coreboot-v2/src/southbridge/amd/cs5530/cs5530_isa.c
trunk/coreboot-v2/src/southbridge/amd/cs5535/cs5535.c
trunk/coreboot-v2/src/southbridge/amd/cs5536/cs5536.c
trunk/coreboot-v2/src/southbridge/amd/sb600/sb600_lpc.c
trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_lpc.c
trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_sb_pci_main.c
trunk/coreboot-v2/src/southbridge/intel/esb6300/esb6300_lpc.c
trunk/coreboot-v2/src/southbridge/intel/i3100/i3100_lpc.c
trunk/coreboot-v2/src/southbridge/intel/i82371eb/i82371eb_isa.c
trunk/coreboot-v2/src/southbridge/intel/i82801ca/i82801ca_lpc.c
trunk/coreboot-v2/src/southbridge/intel/i82801dbm/i82801dbm_lpc.c
trunk/coreboot-v2/src/southbridge/intel/i82801er/i82801er_lpc.c
trunk/coreboot-v2/src/southbridge/intel/i82801gx/i82801gx_lpc.c
trunk/coreboot-v2/src/southbridge/intel/i82801xx/i82801xx_lpc.c
trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_lpc.c
trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_pci.c
trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_lpc.c
trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_pci.c
trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c
trunk/coreboot-v2/src/southbridge/sis/sis966/sis966_lpc.c
trunk/coreboot-v2/src/southbridge/via/vt8231/vt8231_lpc.c
trunk/coreboot-v2/src/southbridge/via/vt8235/vt8235_lpc.c
trunk/coreboot-v2/src/southbridge/winbond/w83c553/w83c553f.c
Log:
Move the v3 resource allocator to v2.
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>
Modified: trunk/coreboot-v2/src/cpu/amd/sc520/sc520.c
===================================================================
--- trunk/coreboot-v2/src/cpu/amd/sc520/sc520.c 2009-07-02 18:27:02 UTC
(rev 4393)
+++ trunk/coreboot-v2/src/cpu/amd/sc520/sc520.c 2009-07-02 18:56:24 UTC
(rev 4394)
@@ -62,9 +62,27 @@
}
+static void sc520_read_resources(device_t dev)
+{
+ struct resource* res;
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
+
static struct device_operations cpu_operations = {
- .read_resources = pci_dev_read_resources,
+ .read_resources = sc520_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = sc520_enable_resources,
.init = cpu_init,
@@ -78,25 +96,6 @@
.device = 0x3000
};
-
-
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
- printk_spew("%s\n", __func__);
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -184,14 +183,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- printk_spew("%s\n", __func__);
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
-
#if 0
void sc520_enable_resources(device_t dev) {
@@ -219,7 +210,7 @@
* If enable_resources is set to the generic enable_resources
* function the whole thing will hang in an endless loop on
* the ts5300. If this is really needed on another platform,
- * something is conceptionally wrong.
+ * something is conceptually wrong.
*/
.enable_resources = 0, //enable_resources,
.init = 0,
Modified: trunk/coreboot-v2/src/cpu/emulation/qemu-x86/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/cpu/emulation/qemu-x86/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/cpu/emulation/qemu-x86/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -9,23 +9,6 @@
#include "chip.h"
#include "northbridge.h"
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -70,7 +53,7 @@
extern uint64_t high_tables_base, high_tables_size;
#endif
-static void pci_domain_set_resources(device_t dev)
+static void cpu_pci_domain_set_resources(device_t dev)
{
static const uint8_t ramregs[] = {
0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x56, 0x57
@@ -127,15 +110,34 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
+static void cpu_pci_domain_read_resources(struct device *dev)
{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
+ struct resource *res;
+
+ pci_domain_read_resources(dev);
+
+ /* Reserve space for the IOAPIC. This should be in the
Southbridge,
+ * but I couldn't tell which device to put it in. */
+ res = new_resource(dev, 2);
+ res->base = 0xfec00000UL;
+ res->size = 0x100000UL;
+ res->limit = 0xffffffffUL;
+ res->flags = IORESOURCE_MEM | IORESOURCE_FIXED |
IORESOURCE_STORED |
+ IORESOURCE_ASSIGNED;
+
+ /* Reserve space for the LAPIC. There's one in every processor,
but
+ * the space only needs to be reserved once, so we do it here.
*/
+ res = new_resource(dev, 3);
+ res->base = 0xfee00000UL;
+ res->size = 0x10000UL;
+ res->limit = 0xffffffffUL;
+ res->flags = IORESOURCE_MEM | IORESOURCE_FIXED |
IORESOURCE_STORED |
+ IORESOURCE_ASSIGNED;
}
static struct device_operations pci_domain_ops = {
- .read_resources = pci_domain_read_resources,
- .set_resources = pci_domain_set_resources,
+ .read_resources = cpu_pci_domain_read_resources,
+ .set_resources = cpu_pci_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
.scan_bus = pci_domain_scan_bus,
Modified: trunk/coreboot-v2/src/cpu/ppc/ppc4xx/pci_domain.c
===================================================================
--- trunk/coreboot-v2/src/cpu/ppc/ppc4xx/pci_domain.c 2009-07-02
18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/cpu/ppc/ppc4xx/pci_domain.c 2009-07-02
18:56:24 UTC (rev 4394)
@@ -7,27 +7,6 @@
#include <device/pci_ids.h>
#include <console/console.h>
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
Modified: trunk/coreboot-v2/src/devices/cardbus_device.c
===================================================================
--- trunk/coreboot-v2/src/devices/cardbus_device.c 2009-07-02
18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/devices/cardbus_device.c 2009-07-02
18:56:24 UTC (rev 4394)
@@ -77,8 +77,6 @@
resource = find_resource(dev, index);
if (resource) {
min_size = resource->size;
- compute_allocate_resource(&dev->link[0], resource,
- resource->flags, resource->flags);
/* Allways allocate at least the miniumum size to a
* cardbus bridge in case a new card is plugged in.
*/
Modified: trunk/coreboot-v2/src/devices/device.c
===================================================================
--- trunk/coreboot-v2/src/devices/device.c 2009-07-02 18:27:02 UTC
(rev 4393)
+++ trunk/coreboot-v2/src/devices/device.c 2009-07-02 18:56:24 UTC
(rev 4394)
@@ -12,6 +12,7 @@
* Copyright (C) 2005-2006 Tyan
* (Written by Yinghai Lu <yhlu@tyan.com> for Tyan)
* Copyright (C) 2005-2006 Stefan Reinauer <stepan@openbios.org>
+ * Copyright (C) 2009 Myles Watson <mylesgw@gmail.com>
*/
/*
@@ -43,12 +44,6 @@
/** Pointer to the last device */
extern struct device **last_dev_p;
-/** The upper limit of MEM resource of the devices.
- * Reserve 20M for the system */
-#define DEVICE_MEM_HIGH 0xFEBFFFFFUL
-/** The lower limit of IO resource of the devices.
- * Reserve 4k for ISA/Legacy devices */
-#define DEVICE_IO_START 0x1000
/**
* @brief Allocate a new device structure.
@@ -71,25 +66,25 @@
spin_lock(&dev_lock);
- /* Find the last child of our parent */
- for(child = parent->children; child && child->sibling; ) {
+ /* Find the last child of our parent. */
+ for (child = parent->children; child && child->sibling; /* */ )
{
child = child->sibling;
}
dev = malloc(sizeof(*dev));
- if (dev == 0) {
+ if (dev == 0)
die("DEV: out of memory.\n");
- }
+
memset(dev, 0, sizeof(*dev));
memcpy(&dev->path, path, sizeof(*path));
- /* Initialize the back pointers in the link fields */
- for(link = 0; link < MAX_LINKS; link++) {
- dev->link[link].dev = dev;
+ /* Initialize the back pointers in the link fields. */
+ for (link = 0; link < MAX_LINKS; link++) {
+ dev->link[link].dev = dev;
dev->link[link].link = link;
}
- /* By default devices are enabled */
+ /* By default devices are enabled. */
dev->enabled = 1;
/* Add the new device to the list of children of the bus. */
@@ -132,64 +127,46 @@
{
struct device *curdev;
- printk_spew("%s read_resources bus %d link: %d\n",
- dev_path(bus->dev), bus->secondary, bus->link);
+ printk_spew("%s %s bus %x link: %d\n", dev_path(bus->dev),
__func__,
+ bus->secondary, bus->link);
- /* Walk through all of the devices and find which resources they
need. */
- for(curdev = bus->children; curdev; curdev = curdev->sibling) {
- unsigned links;
+ /* Walk through all devices and find which resources they need.
*/
+ for (curdev = bus->children; curdev; curdev = curdev->sibling) {
int i;
- if (curdev->have_resources) {
- continue;
- }
if (!curdev->enabled) {
continue;
}
if (!curdev->ops || !curdev->ops->read_resources) {
printk_err("%s missing read_resources\n",
- dev_path(curdev));
+ dev_path(curdev));
continue;
}
curdev->ops->read_resources(curdev);
- curdev->have_resources = 1;
- /* Read in subtractive resources behind the current
device */
- links = 0;
- for(i = 0; i < curdev->resources; i++) {
- struct resource *resource;
- unsigned link;
- resource = &curdev->resource[i];
- if (!(resource->flags & IORESOURCE_SUBTRACTIVE))
- continue;
- link =
IOINDEX_SUBTRACTIVE_LINK(resource->index);
- if (link > MAX_LINKS) {
- printk_err("%s subtractive index on
link: %d\n",
- dev_path(curdev), link);
- continue;
- }
- if (!(links & (1 << link))) {
- links |= (1 << link);
- read_resources(&curdev->link[link]);
- }
- }
+
+ /* Read in the resources behind the current device's
links. */
+ for (i = 0; i < curdev->links; i++)
+ read_resources(&curdev->link[i]);
}
printk_spew("%s read_resources bus %d link: %d done\n",
- dev_path(bus->dev), bus->secondary, bus->link);
+ dev_path(bus->dev), bus->secondary, bus->link);
}
struct pick_largest_state {
struct resource *last;
- struct device *result_dev;
+ struct device *result_dev;
struct resource *result;
int seen_last;
};
-static void pick_largest_resource(void *gp,
- struct device *dev, struct resource *resource)
+static void pick_largest_resource(void *gp, struct device *dev,
+ struct resource *resource)
{
struct pick_largest_state *state = gp;
struct resource *last;
+
last = state->last;
- /* Be certain to pick the successor to last */
+
+ /* Be certain to pick the successor to last. */
if (resource == last) {
state->seen_last = 1;
return;
@@ -206,21 +183,22 @@
if (!state->result ||
(state->result->align < resource->align) ||
((state->result->align == resource->align) &&
- (state->result->size < resource->size)))
- {
+ (state->result->size < resource->size))) {
state->result_dev = dev;
state->result = resource;
}
}
-static struct device *largest_resource(struct bus *bus, struct resource
**result_res,
- unsigned long type_mask, unsigned long type)
+static struct device *largest_resource(struct bus *bus,
+ struct resource **result_res,
+ unsigned long type_mask,
+ unsigned long type)
{
struct pick_largest_state state;
state.last = *result_res;
- state.result_dev = 0;
- state.result = 0;
+ state.result_dev = NULL;
+ state.result = NULL;
state.seen_last = 0;
search_bus_resources(bus, type_mask, type,
pick_largest_resource,
@@ -233,144 +211,136 @@
/* Compute allocate resources is the guts of the resource allocator.
*
* The problem.
- * - Allocate resources locations for every device.
+ * - Allocate resource locations for every device.
* - Don't overlap, and follow the rules of bridges.
* - Don't overlap with resources in fixed locations.
* - Be efficient so we don't have ugly strategies.
*
* The strategy.
* - Devices that have fixed addresses are the minority so don't
- * worry about them too much. Instead only use part of the address
- * space for devices with programmable addresses. This easily
handles
+ * worry about them too much. Instead only use part of the address
+ * space for devices with programmable addresses. This easily handles
* everything except bridges.
*
- * - PCI devices are required to have thier sizes and their alignments
- * equal. In this case an optimal solution to the packing problem
- * exists. Allocate all devices from highest alignment to least
- * alignment or vice versa. Use this.
+ * - PCI devices are required to have their sizes and their alignments
+ * equal. In this case an optimal solution to the packing problem
+ * exists. Allocate all devices from highest alignment to least
+ * alignment or vice versa. Use this.
*
- * - So we can handle more than PCI run two allocation passes on
- * bridges. The first to see how large the resources are behind
- * the bridge, and what their alignment requirements are. The
- * second to assign a safe address to the devices behind the
- * bridge. This allows me to treat a bridge as just a device with
- * a couple of resources, and not need to special case it in the
- * allocator. Also this allows handling of other types of bridges.
+ * - So we can handle more than PCI run two allocation passes on
bridges. The
+ * first to see how large the resources are behind the bridge, and
what
+ * their alignment requirements are. The second to assign a safe
address to
+ * the devices behind the bridge. This allows us to treat a bridge as
just
+ * a device with a couple of resources, and not need to special case
it in
+ * the allocator. Also this allows handling of other types of
bridges.
*
*/
-
-void compute_allocate_resource(
- struct bus *bus,
- struct resource *bridge,
- unsigned long type_mask,
- unsigned long type)
+void compute_resources(struct bus *bus, struct resource *bridge,
+ unsigned long type_mask, unsigned long type)
{
struct device *dev;
struct resource *resource;
resource_t base;
- unsigned long align, min_align;
- min_align = 0;
- base = bridge->base;
+ base = round(bridge->base, bridge->align);
- printk_spew("%s compute_allocate_resource %s: base: %08Lx size:
%08Lx align: %d gran: %d\n",
- dev_path(bus->dev),
- (bridge->flags & IORESOURCE_IO)? "io":
- (bridge->flags & IORESOURCE_PREFETCH)? "prefmem" :
"mem",
- base, bridge->size, bridge->align, bridge->gran);
+ printk_spew( "%s %s_%s: base: %llx size: %llx align: %d gran: %d
limit: %llx\n",
+ dev_path(bus->dev), __func__,
+ (type & IORESOURCE_IO) ? "io" : (type &
IORESOURCE_PREFETCH) ?
+ "prefmem" : "mem",
+ base, bridge->size, bridge->align, bridge->gran,
bridge->limit);
- /* We want different minimum alignments for different kinds of
- * resources. These minimums are not device type specific
- * but resource type specific.
- */
- if (bridge->flags & IORESOURCE_IO) {
- min_align = log2(DEVICE_IO_ALIGN);
- }
- if (bridge->flags & IORESOURCE_MEM) {
- min_align = log2(DEVICE_MEM_ALIGN);
- }
+ /* For each child which is a bridge, compute_resource_needs. */
+ for (dev = bus->children; dev; dev = dev->sibling) {
+ unsigned i;
+ struct resource *child_bridge;
- /* Make certain I have read in all of the resources */
- read_resources(bus);
+ if (!dev->links)
+ continue;
- /* Remember I haven't found anything yet. */
- resource = 0;
+ /* Find the resources with matching type flags. */
+ for (i = 0; i < dev->resources; i++) {
+ unsigned link;
+ child_bridge = &dev->resource[i];
- /* Walk through all the devices on the current bus and
- * compute the addresses.
- */
- while((dev = largest_resource(bus, &resource, type_mask, type)))
{
- resource_t size;
- /* Do NOT I repeat do not ignore resources which have
zero size.
- * If they need to be ignored dev->read_resources should
not even
- * return them. Some resources must be set even when
they have
- * no size. PCI bridge resources are a good example of
this.
- */
- /* Make certain we are dealing with a good minimum size
*/
- size = resource->size;
- align = resource->align;
- if (align < min_align) {
- align = min_align;
- }
+ if (!(child_bridge->flags & IORESOURCE_BRIDGE)
||
+ (child_bridge->flags & type_mask) != type)
+ continue;
- /* Propagate the resource alignment to the bridge
register */
- if (align > bridge->align) {
- bridge->align = align;
+ /* Split prefetchable memory if combined. Many
domains
+ * use the same address space for prefetchable
memory
+ * and non-prefetchable memory. Bridges below
them
+ * need it separated. Add the PREFETCH flag to
the
+ * type_mask and type.
+ */
+ link = IOINDEX_LINK(child_bridge->index);
+ compute_resources(&dev->link[link],
child_bridge,
+ type_mask |
IORESOURCE_PREFETCH,
+ type | (child_bridge->flags &
+ IORESOURCE_PREFETCH));
}
+ }
- if (resource->flags & IORESOURCE_FIXED) {
+ /* Remember we haven't found anything yet. */
+ resource = NULL;
+
+ /* Walk through all the resources on the current bus and compute
the
+ * amount of address space taken by them. Take granularity and
+ * alignment into account.
+ */
+ while ((dev = largest_resource(bus, &resource, type_mask,
type))) {
+
+ /* Size 0 resources can be skipped. */
+ if (!resource->size) {
continue;
}
- /* Propogate the resource limit to the bridge register
*/
+ /* Propagate the resource alignment to the bridge
resource. */
+ if (resource->align > bridge->align) {
+ bridge->align = resource->align;
+ }
+
+ /* Propagate the resource limit to the bridge register.
*/
if (bridge->limit > resource->limit) {
bridge->limit = resource->limit;
}
-#warning This heuristic should be replaced by real devices with fixed
resources.
- /* Artificially deny limits between DEVICE_MEM_HIGH and
0xffffffff */
- if ((bridge->limit > DEVICE_MEM_HIGH) && (bridge->limit
<= 0xffffffff)) {
- bridge->limit = DEVICE_MEM_HIGH;
+
+ /* Warn if it looks like APICs aren't declared. */
+ if ((resource->limit == 0xffffffff) &&
+ (resource->flags & IORESOURCE_ASSIGNED)) {
+ printk_err("Resource limit looks wrong! (no
APIC?)\n");
+ printk_err("%s %02lx limit %08Lx\n",
dev_path(dev),
+ resource->index, resource->limit);
}
if (resource->flags & IORESOURCE_IO) {
- /* Don't allow potential aliases over the
- * legacy pci expansion card addresses.
- * The legacy pci decodes only 10 bits,
- * uses 100h - 3ffh. Therefor, only 0 - ff
- * can be used out of each 400h block of io
- * space.
+ /* Don't allow potential aliases over the legacy
PCI
+ * expansion card addresses. The legacy PCI
decodes
+ * only 10 bits, uses 0x100 - 0x3ff. Therefore,
only
+ * 0x00 - 0xff can be used out of each 0x400
block of
+ * I/O space.
*/
if ((base & 0x300) != 0) {
base = (base & ~0x3ff) + 0x400;
}
- /* Don't allow allocations in the VGA IO range.
+ /* Don't allow allocations in the VGA I/O range.
* PCI has special cases for that.
*/
else if ((base >= 0x3b0) && (base <= 0x3df)) {
base = 0x3e0;
}
}
- if (((round(base, align) + size) -1) <= resource->limit)
{
- /* base must be aligned to size */
- base = round(base, align);
- resource->base = base;
- resource->flags |= IORESOURCE_ASSIGNED;
- resource->flags &= ~IORESOURCE_STORED;
- base += size;
+ /* Base must be aligned. */
+ base = round(base, resource->align);
+ resource->base = base;
+ base += resource->size;
- printk_spew("%s %02lx * [0x%08Lx - 0x%08Lx]
%s\n",
- dev_path(dev),
- resource->index,
- resource->base,
- resource->base + resource->size - 1,
- (resource->flags & IORESOURCE_IO)? "io":
- (resource->flags & IORESOURCE_PREFETCH)?
"prefmem": "mem");
- }
-#if CONFIG_PCIE_CONFIGSPACE_HOLE
-#warning Handle PCIe hole differently...
- if (base >= 0xf0000000 && base < 0xf4000000) {
- base = 0xf4000000;
- }
-#endif
+ printk_spew("%s %02lx * [0x%llx - 0x%llx] %s\n",
+ dev_path(dev), resource->index,
+ resource->base,
+ resource->base + resource->size - 1,
+ (resource->flags & IORESOURCE_IO) ? "io" :
+ (resource->flags & IORESOURCE_PREFETCH) ?
+ "prefmem" : "mem");
}
/* A pci bridge resource does not need to be a power
* of two size, but it does have a minimum granularity.
@@ -378,23 +348,327 @@
* know not to place something else at an address postitively
* decoded by the bridge.
*/
- bridge->size = round(base, bridge->gran) - bridge->base;
+ bridge->size = round(base, bridge->gran) -
+ round(bridge->base, bridge->align);
- printk_spew("%s compute_allocate_resource %s: base: %08Lx size:
%08Lx align: %d gran: %d done\n",
- dev_path(bus->dev),
- (bridge->flags & IORESOURCE_IO)? "io":
- (bridge->flags & IORESOURCE_PREFETCH)? "prefmem" :
"mem",
- base, bridge->size, bridge->align, bridge->gran);
+ printk_spew("%s %s_%s: base: %llx size: %llx align: %d gran: %d
limit: %llx done\n",
+ dev_path(bus->dev), __func__,
+ (bridge->flags & IORESOURCE_IO) ? "io" :
+ (bridge->flags & IORESOURCE_PREFETCH) ? "prefmem"
: "mem",
+ base, bridge->size, bridge->align, bridge->gran,
bridge->limit);
}
+/**
+ * This function is the second part of the resource allocator.
+ *
+ * The problem.
+ * - Allocate resource locations for every device.
+ * - Don't overlap, and follow the rules of bridges.
+ * - Don't overlap with resources in fixed locations.
+ * - Be efficient so we don't have ugly strategies.
+ *
+ * The strategy.
+ * - Devices that have fixed addresses are the minority so don't
+ * worry about them too much. Instead only use part of the address
+ * space for devices with programmable addresses. This easily handles
+ * everything except bridges.
+ *
+ * - PCI devices are required to have their sizes and their alignments
+ * equal. In this case an optimal solution to the packing problem
+ * exists. Allocate all devices from highest alignment to least
+ * alignment or vice versa. Use this.
+ *
+ * - So we can handle more than PCI run two allocation passes on
bridges. The
+ * first to see how large the resources are behind the bridge, and
what
+ * their alignment requirements are. The second to assign a safe
address to
+ * the devices behind the bridge. This allows us to treat a bridge as
just
+ * a device with a couple of resources, and not need to special case
it in
+ * the allocator. Also this allows handling of other types of
bridges.
+ *
+ * - This function assigns the resources a value.
+ *
+ * @param bus The bus we are traversing.
+ * @param bridge The bridge resource which must contain the bus'
resources.
+ * @param type_mask This value gets anded with the resource type.
+ * @param type This value must match the result of the and.
+ */
+void allocate_resources(struct bus *bus, struct resource *bridge,
+ unsigned long type_mask, unsigned long type)
+{
+ struct device *dev;
+ struct resource *resource;
+ resource_t base;
+ base = bridge->base;
+
+ printk_spew("%s %s_%s: base:%llx size:%llx align:%d gran:%d
limit:%llx\n",
+ dev_path(bus->dev), __func__,
+ (type & IORESOURCE_IO) ? "io" : (type &
IORESOURCE_PREFETCH) ?
+ "prefmem" : "mem",
+ base, bridge->size, bridge->align, bridge->gran,
bridge->limit);
+
+ /* Remember we haven't found anything yet. */
+ resource = NULL;
+
+ /* Walk through all the resources on the current bus and
allocate them
+ * address space.
+ */
+ while ((dev = largest_resource(bus, &resource, type_mask,
type))) {
+
+ /* Propagate the bridge limit to the resource register.
*/
+ if (resource->limit > bridge->limit) {
+ resource->limit = bridge->limit;
+ }
+
+ /* Size 0 resources can be skipped. */
+ if (!resource->size) {
+ /* Set the base to limit so it doesn't confuse
tolm. */
+ resource->base = resource->limit;
+ resource->flags |= IORESOURCE_ASSIGNED;
+ continue;
+ }
+
+ if (resource->flags & IORESOURCE_IO) {
+ /* Don't allow potential aliases over the legacy
PCI
+ * expansion card addresses. The legacy PCI
decodes
+ * only 10 bits, uses 0x100 - 0x3ff. Therefore,
only
+ * 0x00 - 0xff can be used out of each 0x400
block of
+ * I/O space.
+ */
+ if ((base & 0x300) != 0) {
+ base = (base & ~0x3ff) + 0x400;
+ }
+ /* Don't allow allocations in the VGA I/O range.
+ * PCI has special cases for that.
+ */
+ else if ((base >= 0x3b0) && (base <= 0x3df)) {
+ base = 0x3e0;
+ }
+ }
+
+ if ((round(base, resource->align) + resource->size - 1)
<=
+ resource->limit) {
+ /* Base must be aligned. */
+ base = round(base, resource->align);
+ resource->base = base;
+ resource->flags |= IORESOURCE_ASSIGNED;
+ resource->flags &= ~IORESOURCE_STORED;
+ base += resource->size;
+ } else {
+ printk_err("!! Resource didn't fit !!\n");
+ printk_err(" aligned base %llx size %llx limit
%llx\n",
+ round(base, resource->align),
resource->size,
+ resource->limit);
+ printk_err(" %llx needs to be <= %llx
(limit)\n",
+ (round(base, resource->align) +
+ resource->size) - 1, resource->limit);
+ printk_err(" %s%s %02lx * [0x%llx - 0x%llx]
%s\n",
+ (resource->
+ flags & IORESOURCE_ASSIGNED) ?
"Assigned: " :
+ "", dev_path(dev), resource->index,
+ resource->base,
+ resource->base + resource->size - 1,
+ (resource->
+ flags & IORESOURCE_IO) ? "io" :
(resource->
+ flags &
+
IORESOURCE_PREFETCH)
+ ? "prefmem" : "mem");
+ }
+
+ printk_spew("%s%s %02lx * [0x%llx - 0x%llx] %s\n",
+ (resource->flags & IORESOURCE_ASSIGNED) ?
"Assigned: "
+ : "",
+ dev_path(dev), resource->index, resource->base,
+ resource->size ? resource->base + resource->size
- 1 :
+ resource->base,
+ (resource->flags & IORESOURCE_IO) ? "io" :
+ (resource->flags & IORESOURCE_PREFETCH) ?
"prefmem" :
+ "mem");
+ }
+ /* A PCI bridge resource does not need to be a power of two
size, but
+ * it does have a minimum granularity. Round the size up to that
+ * minimum granularity so we know not to place something else at
an
+ * address positively decoded by the bridge.
+ */
+
+ bridge->flags |= IORESOURCE_ASSIGNED;
+
+ printk_spew("%s %s_%s: next_base: %llx size: %llx align: %d
gran: %d done\n",
+ dev_path(bus->dev), __func__,
+ (type & IORESOURCE_IO) ? "io" : (type &
IORESOURCE_PREFETCH) ?
+ "prefmem" : "mem",
+ base, bridge->size, bridge->align, bridge->gran);
+
+ /* For each child which is a bridge, allocate_resources. */
+ for (dev = bus->children; dev; dev = dev->sibling) {
+ unsigned i;
+ struct resource *child_bridge;
+
+ if (!dev->links)
+ continue;
+
+ /* Find the resources with matching type flags. */
+ for (i = 0; i < dev->resources; i++) {
+ unsigned link;
+ child_bridge = &dev->resource[i];
+
+ if (!(child_bridge->flags & IORESOURCE_BRIDGE)
||
+ (child_bridge->flags & type_mask) != type)
+ continue;
+
+ /* Split prefetchable memory if combined. Many
domains
+ * use the same address space for prefetchable
memory
+ * and non-prefetchable memory. Bridges below
them
+ * need it separated. Add the PREFETCH flag to
the
+ * type_mask and type.
+ */
+ link = IOINDEX_LINK(child_bridge->index);
+ allocate_resources(&dev->link[link],
child_bridge,
+ type_mask |
IORESOURCE_PREFETCH,
+ type | (child_bridge->flags &
+
IORESOURCE_PREFETCH));
+ }
+ }
+}
+
+#if CONFIG_PCI_64BIT_PREF_MEM == 1
+ #define MEM_MASK (IORESOURCE_PREFETCH | IORESOURCE_MEM)
+#else
+ #define MEM_MASK (IORESOURCE_MEM)
+#endif
+#define IO_MASK (IORESOURCE_IO)
+#define PREF_TYPE (IORESOURCE_PREFETCH | IORESOURCE_MEM)
+#define MEM_TYPE (IORESOURCE_MEM)
+#define IO_TYPE (IORESOURCE_IO)
+
+struct constraints {
+ struct resource pref, io, mem;
+};
+
+static void constrain_resources(struct device *dev, struct constraints*
limits)
+{
+ struct device *child;
+ struct resource *res;
+ struct resource *lim;
+ int i;
+
+ printk_spew("%s: %s\n", __func__, dev_path(dev));
+
+ /* Constrain limits based on the fixed resources of this device.
*/
+ for (i = 0; i < dev->resources; i++) {
+ res = &dev->resource[i];
+ if (!(res->flags & IORESOURCE_FIXED))
+ continue;
+
+ /* PREFETCH, MEM, or I/O - skip any others. */
+ if ((res->flags & MEM_MASK) == PREF_TYPE)
+ lim = &limits->pref;
+ else if ((res->flags & MEM_MASK) == MEM_TYPE)
+ lim = &limits->mem;
+ else if ((res->flags & IO_MASK) == IO_TYPE)
+ lim = &limits->io;
+ else
+ continue;
+
+ /* Is it already outside the limits? */
+ if (res->size && (((res->base + res->size -1) <
lim->base) ||
+ (res->base > lim->limit)))
+ continue;
+
+ /* Choose to be above or below fixed resources. This
+ * check is signed so that "negative" amounts of space
+ * are handled correctly.
+ */
+ if ((signed long long)(lim->limit - (res->base +
res->size -1)) >
+ (signed long long)(res->base - lim->base))
+ lim->base = res->base + res->size;
+ else
+ lim->limit = res->base -1;
+ }
+
+ /* Descend into every enabled child and look for fixed
resources. */
+ for (i = 0; i < dev->links; i++)
+ for (child = dev->link[i].children; child;
+ child = child->sibling)
+ if (child->enabled)
+ constrain_resources(child, limits);
+}
+
+static void avoid_fixed_resources(struct device *dev)
+{
+ struct constraints limits;
+ struct resource *res;
+ int i;
+
+ printk_spew("%s: %s\n", __func__, dev_path(dev));
+ /* Initialize constraints to maximum size. */
+
+ limits.pref.base = 0;
+ limits.pref.limit = 0xffffffffffffffffULL;
+ limits.io.base = 0;
+ limits.io.limit = 0xffffffffffffffffULL;
+ limits.mem.base = 0;
+ limits.mem.limit = 0xffffffffffffffffULL;
+
+ /* Constrain the limits to dev's initial resources. */
+ for (i = 0; i < dev->resources; i++) {
+ res = &dev->resource[i];
+ if ((res->flags & IORESOURCE_FIXED))
+ continue;
+ printk_spew("%s:@%s %02lx limit %08Lx\n", __func__,
+ dev_path(dev), res->index, res->limit);
+ if ((res->flags & MEM_MASK) == PREF_TYPE &&
+ (res->limit < limits.pref.limit))
+ limits.pref.limit = res->limit;
+ if ((res->flags & MEM_MASK) == MEM_TYPE &&
+ (res->limit < limits.mem.limit))
+ limits.mem.limit = res->limit;
+ if ((res->flags & IO_MASK) == IO_TYPE &&
+ (res->limit < limits.io.limit))
+ limits.io.limit = res->limit;
+ }
+
+ /* Look through the tree for fixed resources and update the
limits. */
+ constrain_resources(dev, &limits);
+
+ /* Update dev's resources with new limits. */
+ for (i = 0; i < dev->resources; i++) {
+ struct resource *lim;
+ res = &dev->resource[i];
+
+ if ((res->flags & IORESOURCE_FIXED))
+ continue;
+
+ /* PREFETCH, MEM, or I/O - skip any others. */
+ if ((res->flags & MEM_MASK) == PREF_TYPE)
+ lim = &limits.pref;
+ else if ((res->flags & MEM_MASK) == MEM_TYPE)
+ lim = &limits.mem;
+ else if ((res->flags & IO_MASK) == IO_TYPE)
+ lim = &limits.io;
+ else
+ continue;
+
+ printk_spew("%s2: %s@%02lx limit %08Lx\n", __func__,
+ dev_path(dev), res->index, res->limit);
+ printk_spew("\tlim->base %08Lx lim->limit %08Lx\n",
+ lim->base, lim->limit);
+
+ /* Is the resource outside the limits? */
+ if (lim->base > res->base)
+ res->base = lim->base;
+ if (res->limit > lim->limit)
+ res->limit = lim->limit;
+ }
+}
+
#if CONFIG_CONSOLE_VGA == 1
device_t vga_pri = 0;
static void allocate_vga_resource(void)
{
#warning "FIXME modify allocate_vga_resource so it is less pci
centric!"
-#warning "This function knows to much about PCI stuff, it should be
just a ietrator/visitor."
+#warning "This function knows too much about PCI stuff, it should be
just a iterator/visitor."
- /* FIXME handle the VGA pallette snooping */
+ /* FIXME: Handle the VGA palette snooping. */
struct device *dev, *vga, *vga_onboard, *vga_first, *vga_last;
struct bus *bus;
bus = 0;
@@ -402,66 +676,63 @@
vga_onboard = 0;
vga_first = 0;
vga_last = 0;
- for(dev = all_devices; dev; dev = dev->next) {
- if (!dev->enabled) continue;
+ for (dev = all_devices; dev; dev = dev->next) {
+ if (!dev->enabled)
+ continue;
if (((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) &&
- ((dev->class >> 8) != PCI_CLASS_DISPLAY_OTHER))
- {
- if (!vga_first) {
- if (dev->on_mainboard) {
- vga_onboard = dev;
- } else {
- vga_first = dev;
- }
- } else {
- if (dev->on_mainboard) {
- vga_onboard = dev;
- } else {
- vga_last = dev;
- }
- }
+ ((dev->class >> 8) != PCI_CLASS_DISPLAY_OTHER)) {
+ if (!vga_first) {
+ if (dev->on_mainboard) {
+ vga_onboard = dev;
+ } else {
+ vga_first = dev;
+ }
+ } else {
+ if (dev->on_mainboard) {
+ vga_onboard = dev;
+ } else {
+ vga_last = dev;
+ }
+ }
- /* It isn't safe to enable other VGA cards */
+ /* It isn't safe to enable other VGA cards. */
dev->command &= ~(PCI_COMMAND_MEMORY |
PCI_COMMAND_IO);
}
}
- vga = vga_last;
+ vga = vga_last;
- if(!vga) {
- vga = vga_first;
- }
-
+ if (!vga) {
+ vga = vga_first;
+ }
#if CONFIG_CONSOLE_VGA_ONBOARD_AT_FIRST == 1
- if (vga_onboard) // will use on board vga as pri
+ if (vga_onboard) // Will use on board VGA as pri.
#else
- if (!vga) // will use last add on adapter as pri
+ if (!vga) // Will use last add on adapter as pri.
#endif
- {
- vga = vga_onboard;
- }
+ {
+ vga = vga_onboard;
+ }
-
if (vga) {
- /* vga is first add on card or the only onboard vga */
+ /* VGA is first add on card or the only onboard VGA. */
printk_debug("Allocating VGA resource %s\n",
dev_path(vga));
- /* All legacy VGA cards have MEM & I/O space registers
*/
+ /* All legacy VGA cards have MEM & I/O space registers.
*/
vga->command |= (PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
vga_pri = vga;
bus = vga->bus;
}
- /* Now walk up the bridges setting the VGA enable */
- while(bus) {
+ /* Now walk up the bridges setting the VGA enable. */
+ while (bus) {
printk_debug("Setting PCI_BRIDGE_CTL_VGA for bridge
%s\n",
dev_path(bus->dev));
bus->bridge_ctrl |= PCI_BRIDGE_CTL_VGA;
- bus = (bus == bus->dev->bus)? 0 : bus->dev->bus;
+ bus = (bus == bus->dev->bus) ? 0 : bus->dev->bus;
}
}
#endif
-
/**
* @brief Assign the computed resources to the devices on the bus.
*
@@ -480,21 +751,21 @@
struct device *curdev;
printk_spew("%s assign_resources, bus %d link: %d\n",
- dev_path(bus->dev), bus->secondary, bus->link);
+ dev_path(bus->dev), bus->secondary, bus->link);
- for(curdev = bus->children; curdev; curdev = curdev->sibling) {
+ for (curdev = bus->children; curdev; curdev = curdev->sibling) {
if (!curdev->enabled || !curdev->resources) {
continue;
}
if (!curdev->ops || !curdev->ops->set_resources) {
printk_err("%s missing set_resources\n",
- dev_path(curdev));
+ dev_path(curdev));
continue;
}
curdev->ops->set_resources(curdev);
}
printk_spew("%s assign_resources, bus %d link: %d\n",
- dev_path(bus->dev), bus->secondary, bus->link);
+ dev_path(bus->dev), bus->secondary, bus->link);
}
/**
@@ -539,8 +810,7 @@
*/
int reset_bus(struct bus *bus)
{
- if (bus && bus->dev && bus->dev->ops &&
bus->dev->ops->reset_bus)
- {
+ if (bus && bus->dev && bus->dev->ops &&
bus->dev->ops->reset_bus) {
bus->dev->ops->reset_bus(bus);
bus->reset_needed = 0;
return 1;
@@ -551,37 +821,34 @@
/**
* @brief Scan for devices on a bus.
*
- * If there are bridges on the bus, recursively scan the buses behind
the bridges.
- * If the setting up and tuning of the bus causes a reset to be
required,
- * reset the bus and scan it again.
+ * If there are bridges on the bus, recursively scan the buses behind
the
+ * bridges. If the setting up and tuning of the bus causes a reset to
be
+ * required, reset the bus and scan it again.
*
- * @param bus pointer to the bus device
- * @param max current bus number
- *
- * @return The maximum bus number found, after scanning all subordinate
busses
+ * @param busdev Pointer to the bus device.
+ * @param max Current bus number.
+ * @return The maximum bus number found, after scanning all subordinate
buses.
*/
-unsigned int scan_bus(device_t bus, unsigned int max)
+unsigned int scan_bus(struct device *busdev, unsigned int max)
{
unsigned int new_max;
int do_scan_bus;
- if ( !bus ||
- !bus->enabled ||
- !bus->ops ||
- !bus->ops->scan_bus)
- {
+ if (!busdev || !busdev->enabled || !busdev->ops ||
+ !busdev->ops->scan_bus) {
return max;
}
+
do_scan_bus = 1;
- while(do_scan_bus) {
+ while (do_scan_bus) {
int link;
- new_max = bus->ops->scan_bus(bus, max);
+ new_max = busdev->ops->scan_bus(busdev, max);
do_scan_bus = 0;
- for(link = 0; link < bus->links; link++) {
- if (bus->link[link].reset_needed) {
- if (reset_bus(&bus->link[link])) {
+ for (link = 0; link < busdev->links; link++) {
+ if (busdev->link[link].reset_needed) {
+ if (reset_bus(&busdev->link[link])) {
do_scan_bus = 1;
} else {
- bus->bus->reset_needed = 1;
+ busdev->bus->reset_needed = 1;
}
}
}
@@ -589,7 +856,6 @@
return new_max;
}
-
/**
* @brief Determine the existence of devices and extend the device
tree.
*
@@ -619,7 +885,7 @@
printk_info("Enumerating buses...\n");
root = &dev_root;
- show_all_devs(BIOS_DEBUG, "Before Phase 3.");
+ show_all_devs(BIOS_DEBUG, "Before Device Enumeration.");
printk_debug("Compare with tree...\n");
show_devs_tree(root, BIOS_DEBUG, 0, 0);
@@ -643,66 +909,115 @@
* requried by each device. In the second pass, the resources ranges
are
* relocated to their final position and stored to the hardware.
*
- * I/O resources start at DEVICE_IO_START and grow upward. MEM
resources start
- * at DEVICE_MEM_HIGH and grow downward.
+ * I/O resources grow upward. MEM resources grow downward.
*
* Since the assignment is hierarchical we set the values into the
dev_root
* struct.
*/
void dev_configure(void)
{
- struct resource *io, *mem;
+ struct resource *res;
struct device *root;
+ struct device *child;
+ int i;
printk_info("Allocating resources...\n");
root = &dev_root;
- print_resource_tree(root, BIOS_DEBUG, "Original.");
+ /* Each domain should create resources which contain the entire
address
+ * space for IO, MEM, and PREFMEM resources in the domain. The
+ * allocation of device resources will be done from this address
space.
+ */
- if (!root->ops || !root->ops->read_resources) {
- printk_err("dev_root missing read_resources\n");
- return;
- }
- if (!root->ops || !root->ops->set_resources) {
- printk_err("dev_root missing set_resources\n");
- return;
- }
+ /* Read the resources for the entire tree. */
printk_info("Reading resources...\n");
- root->ops->read_resources(root);
+ read_resources(&root->link[0]);
printk_info("Done reading resources.\n");
print_resource_tree(root, BIOS_DEBUG, "After reading.");
- /* Get the resources */
- io = &root->resource[0];
- mem = &root->resource[1];
- /* Make certain the io devices are allocated somewhere safe. */
- io->base = DEVICE_IO_START;
- io->flags |= IORESOURCE_ASSIGNED;
- io->flags &= ~IORESOURCE_STORED;
- /* Now reallocate the pci resources memory with the
- * highest addresses I can manage.
+ /* Compute resources for all domains. */
+ for (child = root->link[0].children; child; child =
child->sibling) {
+ if (!(child->path.type == DEVICE_PATH_PCI_DOMAIN))
+ continue;
+ for (i = 0; i < child->resources; i++) {
+ res = &child->resource[i];
+ if (res->flags & IORESOURCE_FIXED)
+ continue;
+ if (res->flags & IORESOURCE_PREFETCH) {
+ compute_resources(&child->link[0],
+ res, MEM_MASK,
PREF_TYPE);
+ continue;
+ }
+ if (res->flags & IORESOURCE_MEM) {
+ compute_resources(&child->link[0],
+ res, MEM_MASK, MEM_TYPE);
+ continue;
+ }
+ if (res->flags & IORESOURCE_IO) {
+ compute_resources(&child->link[0],
+ res, IO_MASK, IO_TYPE);
+ continue;
+ }
+ }
+ }
+
+ /* For all domains. */
+ for (child = root->link[0].children; child;
child=child->sibling)
+ if (child->path.type == DEVICE_PATH_PCI_DOMAIN)
+ avoid_fixed_resources(child);
+
+ /* Now we need to adjust the resources. MEM resources need to
start at
+ * the highest address managable.
*/
- mem->base = resource_max(&root->resource[1]);
- mem->flags |= IORESOURCE_ASSIGNED;
- mem->flags &= ~IORESOURCE_STORED;
+ for (child = root->link[0].children; child; child =
child->sibling) {
+ if (child->path.type != DEVICE_PATH_PCI_DOMAIN)
+ continue;
+ for (i = 0; i < child->resources; i++) {
+ res = &child->resource[i];
+ if (!(res->flags & IORESOURCE_MEM) ||
+ res->flags & IORESOURCE_FIXED)
+ continue;
+ res->base = resource_max(res);
+ }
+ }
#if CONFIG_CONSOLE_VGA == 1
- /* Allocate the VGA I/O resource.. */
+ /* Allocate the VGA I/O resource. */
allocate_vga_resource();
print_resource_tree(root, BIOS_DEBUG, "After VGA.");
#endif
/* Store the computed resource allocations into device registers
... */
printk_info("Setting resources...\n");
- root->ops->set_resources(root);
+ for (child = root->link[0].children; child; child =
child->sibling) {
+ if (!(child->path.type == DEVICE_PATH_PCI_DOMAIN))
+ continue;
+ for (i = 0; i < child->resources; i++) {
+ res = &child->resource[i];
+ if (res->flags & IORESOURCE_FIXED)
+ continue;
+ if (res->flags & IORESOURCE_PREFETCH) {
+ allocate_resources(&child->link[0],
+ res, MEM_MASK,
PREF_TYPE);
+ continue;
+ }
+ if (res->flags & IORESOURCE_MEM) {
+ allocate_resources(&child->link[0],
+ res, MEM_MASK, MEM_TYPE);
+ continue;
+ }
+ if (res->flags & IORESOURCE_IO) {
+ allocate_resources(&child->link[0],
+ res, IO_MASK, IO_TYPE);
+ continue;
+ }
+ }
+ }
+ assign_resources(&root->link[0]);
printk_info("Done setting resources.\n");
-#if 0
- mem->flags |= IORESOURCE_STORED;
- report_resource_stored(root, mem, "");
-#endif
print_resource_tree(root, BIOS_DEBUG, "After assigning
values.");
printk_info("Done allocating resources.\n");
@@ -736,13 +1051,13 @@
struct device *dev;
printk_info("Initializing devices...\n");
- for(dev = all_devices; dev; dev = dev->next) {
+ for (dev = all_devices; dev; dev = dev->next) {
if (dev->enabled && !dev->initialized &&
- dev->ops && dev->ops->init)
- {
+ dev->ops && dev->ops->init) {
if (dev->path.type == DEVICE_PATH_I2C) {
- printk_debug("smbus: %s[%d]->",
- dev_path(dev->bus->dev),
dev->bus->link);
+ printk_debug("smbus: %s[%d]->",
+ dev_path(dev->bus->dev),
+ dev->bus->link);
}
printk_debug("%s init\n", dev_path(dev));
dev->initialized = 1;
@@ -752,4 +1067,3 @@
printk_info("Devices initialized\n");
show_all_devs(BIOS_DEBUG, "After init.");
}
-
Modified: trunk/coreboot-v2/src/devices/device_util.c
===================================================================
--- trunk/coreboot-v2/src/devices/device_util.c 2009-07-02 18:27:02 UTC
(rev 4393)
+++ trunk/coreboot-v2/src/devices/device_util.c 2009-07-02 18:56:24 UTC
(rev 4394)
@@ -487,7 +487,7 @@
for(curdev = bus->children; curdev; curdev = curdev->sibling) {
int i;
/* Ignore disabled devices */
- if (!curdev->have_resources) continue;
+ if (!curdev->enabled) continue;
for(i = 0; i < curdev->resources; i++) {
struct resource *resource =
&curdev->resource[i];
/* If it isn't the right kind of resource ignore
it */
@@ -514,7 +514,7 @@
for(curdev = all_devices; curdev; curdev = curdev->next) {
int i;
/* Ignore disabled devices */
- if (!curdev->have_resources) continue;
+ if (!curdev->enabled) continue;
for(i = 0; i < curdev->resources; i++) {
struct resource *resource =
&curdev->resource[i];
/* If it isn't the right kind of resource ignore
it */
Modified: trunk/coreboot-v2/src/devices/pci_device.c
===================================================================
--- trunk/coreboot-v2/src/devices/pci_device.c 2009-07-02 18:27:02 UTC
(rev 4393)
+++ trunk/coreboot-v2/src/devices/pci_device.c 2009-07-02 18:56:24 UTC
(rev 4394)
@@ -15,12 +15,12 @@
*/
/*
- * PCI Bus Services, see include/linux/pci.h for further
explanation.
+ * PCI Bus Services, see include/linux/pci.h for further explanation.
*
- * Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter,
- * David Mosberger-Tang
+ * Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter,
+ * David Mosberger-Tang
*
- * Copyright 1997 -- 1999 Martin Mares
<mj@atrey.karlin.mff.cuni.cz>
+ * Copyright 1997 -- 1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
*/
#include <console/console.h>
@@ -51,9 +51,9 @@
#include <device/cardbus.h>
#endif
-uint8_t pci_moving_config8(struct device *dev, unsigned reg)
+u8 pci_moving_config8(struct device *dev, unsigned int reg)
{
- uint8_t value, ones, zeroes;
+ u8 value, ones, zeroes;
value = pci_read_config8(dev, reg);
pci_write_config8(dev, reg, 0xff);
@@ -67,9 +67,9 @@
return ones ^ zeroes;
}
-uint16_t pci_moving_config16(struct device *dev, unsigned reg)
+u16 pci_moving_config16(struct device * dev, unsigned int reg)
{
- uint16_t value, ones, zeroes;
+ u16 value, ones, zeroes;
value = pci_read_config16(dev, reg);
pci_write_config16(dev, reg, 0xffff);
@@ -83,9 +83,9 @@
return ones ^ zeroes;
}
-uint32_t pci_moving_config32(struct device *dev, unsigned reg)
+u32 pci_moving_config32(struct device * dev, unsigned int reg)
{
- uint32_t value, ones, zeroes;
+ u32 value, ones, zeroes;
value = pci_read_config32(dev, reg);
pci_write_config32(dev, reg, 0xffffffff);
@@ -99,7 +99,16 @@
return ones ^ zeroes;
}
-unsigned pci_find_next_capability(device_t dev, unsigned cap, unsigned
last)
+/**
+ * Given a device, a capability type, and a last position, return the
next
+ * matching capability. Always start at the head of the list.
+ *
+ * @param dev Pointer to the device structure.
+ * @param cap_type PCI_CAP_LIST_ID of the PCI capability we're looking
for.
+ * @param last Location of the PCI capability register to start from.
+ */
+unsigned pci_find_next_capability(struct device *dev, unsigned cap,
+ unsigned last)
{
unsigned pos;
unsigned status;
@@ -109,7 +118,7 @@
if (!(status & PCI_STATUS_CAP_LIST)) {
return 0;
}
- switch(dev->hdr_type & 0x7f) {
+ switch (dev->hdr_type & 0x7f) {
case PCI_HEADER_TYPE_NORMAL:
case PCI_HEADER_TYPE_BRIDGE:
pos = PCI_CAPABILITY_LIST;
@@ -121,11 +130,12 @@
return 0;
}
pos = pci_read_config8(dev, pos);
- while(reps-- && (pos >= 0x40)) { /* loop through the linked
list */
+ while (reps-- && (pos >= 0x40)) { /* Loop through the
linked list. */
int this_cap;
pos &= ~3;
this_cap = pci_read_config8(dev, pos + PCI_CAP_LIST_ID);
- printk_spew("Capability: 0x%02x @ 0x%02x\n", cap, pos);
+ printk_spew("Capability: type 0x%02x @ 0x%02x\n",
this_cap,
+ pos);
if (this_cap == 0xff) {
break;
}
@@ -140,64 +150,71 @@
return 0;
}
+/**
+ * Given a device, and a capability type, return the next matching
+ * capability. Always start at the head of the list.
+ *
+ * @param dev Pointer to the device structure.
+ * @param cap_type PCI_CAP_LIST_ID of the PCI capability we're looking
for.
+ */
unsigned pci_find_capability(device_t dev, unsigned cap)
{
return pci_find_next_capability(dev, cap, 0);
-
}
-/** Given a device and register, read the size of the BAR for that
register.
- * @param dev Pointer to the device structure
- * @param resource Pointer to the resource structure
- * @param index Address of the pci configuration register
+/**
+ * Given a device and register, read the size of the BAR for that
register.
+ *
+ * @param dev Pointer to the device structure.
+ * @param index Address of the PCI configuration register.
*/
struct resource *pci_get_resource(struct device *dev, unsigned long
index)
{
struct resource *resource;
unsigned long value, attr;
- resource_t moving, limit;
+ resource_t moving, limit;
- /* Initialize the resources to nothing */
+ /* Initialize the resources to nothing. */
resource = new_resource(dev, index);
- /* Get the initial value */
+ /* Get the initial value. */
value = pci_read_config32(dev, index);
- /* See which bits move */
+ /* See which bits move. */
moving = pci_moving_config32(dev, index);
- /* Initialize attr to the bits that do not move */
+ /* Initialize attr to the bits that do not move. */
attr = value & ~moving;
- /* If it is a 64bit resource look at the high half as well */
+ /* If it is a 64bit resource look at the high half as well. */
if (((attr & PCI_BASE_ADDRESS_SPACE_IO) == 0) &&
- ((attr & PCI_BASE_ADDRESS_MEM_LIMIT_MASK) ==
PCI_BASE_ADDRESS_MEM_LIMIT_64))
- {
- /* Find the high bits that move */
- moving |= ((resource_t)pci_moving_config32(dev, index +
4)) << 32;
+ ((attr & PCI_BASE_ADDRESS_MEM_LIMIT_MASK) ==
+ PCI_BASE_ADDRESS_MEM_LIMIT_64)) {
+ /* Find the high bits that move. */
+ moving |=
+ ((resource_t) pci_moving_config32(dev, index + 4))
<< 32;
}
/* Find the resource constraints.
- *
* Start by finding the bits that move. From there:
* - Size is the least significant bit of the bits that move.
* - Limit is all of the bits that move plus all of the lower
bits.
- * See PCI Spec 6.2.5.1 ...
+ * See PCI Spec 6.2.5.1.
*/
limit = 0;
if (moving) {
resource->size = 1;
resource->align = resource->gran = 0;
- while(!(moving & resource->size)) {
+ while (!(moving & resource->size)) {
resource->size <<= 1;
resource->align += 1;
- resource->gran += 1;
+ resource->gran += 1;
}
resource->limit = limit = moving | (resource->size - 1);
}
- /*
- * some broken hardware has read-only registers that do not
+
+ /* Some broken hardware has read-only registers that do not
* really size correctly.
- * Example: the acer m7229 has BARs 1-4 normally read-only.
+ * Example: the Acer M7229 has BARs 1-4 normally read-only.
* so BAR1 at offset 0x10 reads 0x1f1. If you size that register
* by writing 0xffffffff to it, it will read back as 0x1f1 -- a
* violation of the spec.
@@ -207,21 +224,19 @@
*/
if (moving == 0) {
if (value != 0) {
- printk_debug(
- "%s register %02lx(%08lx), read-only
ignoring it\n",
- dev_path(dev), index, value);
+ printk_debug
+ ("%s register %02lx(%08lx), read-only
ignoring it\n",
+ dev_path(dev), index, value);
}
resource->flags = 0;
- }
- else if (attr & PCI_BASE_ADDRESS_SPACE_IO) {
- /* An I/O mapped base address */
+ } else if (attr & PCI_BASE_ADDRESS_SPACE_IO) {
+ /* An I/O mapped base address. */
attr &= PCI_BASE_ADDRESS_IO_ATTR_MASK;
resource->flags |= IORESOURCE_IO;
- /* I don't want to deal with 32bit I/O resources */
+ /* I don't want to deal with 32bit I/O resources. */
resource->limit = 0xffff;
- }
- else {
- /* A Memory mapped base address */
+ } else {
+ /* A Memory mapped base address. */
attr &= PCI_BASE_ADDRESS_MEM_ATTR_MASK;
resource->flags |= IORESOURCE_MEM;
if (attr & PCI_BASE_ADDRESS_MEM_PREFETCH) {
@@ -229,73 +244,65 @@
}
attr &= PCI_BASE_ADDRESS_MEM_LIMIT_MASK;
if (attr == PCI_BASE_ADDRESS_MEM_LIMIT_32) {
- /* 32bit limit */
+ /* 32bit limit. */
resource->limit = 0xffffffffUL;
- }
- else if (attr == PCI_BASE_ADDRESS_MEM_LIMIT_1M) {
- /* 1MB limit */
+ } else if (attr == PCI_BASE_ADDRESS_MEM_LIMIT_1M) {
+ /* 1MB limit. */
resource->limit = 0x000fffffUL;
- }
- else if (attr == PCI_BASE_ADDRESS_MEM_LIMIT_64) {
- /* 64bit limit */
+ } else if (attr == PCI_BASE_ADDRESS_MEM_LIMIT_64) {
+ /* 64bit limit. */
resource->limit = 0xffffffffffffffffULL;
resource->flags |= IORESOURCE_PCI64;
- }
- else {
- /* Invalid value */
+ } else {
+ /* Invalid value. */
+ printk_err("Broken BAR with value %lx\n", attr);
+ printk_err(" on dev %s at index %02lx\n",
+ dev_path(dev), index);
resource->flags = 0;
}
}
- /* Don't let the limit exceed which bits can move */
+ /* Don't let the limit exceed which bits can move. */
if (resource->limit > limit) {
resource->limit = limit;
}
-#if 0
- if (resource->flags) {
- printk_debug("%s %02x ->",
- dev_path(dev), resource->index);
- printk_debug(" value: 0x%08Lx zeroes: 0x%08Lx ones:
0x%08Lx attr: %08lx\n",
- value, zeroes, ones, attr);
- printk_debug(
- "%s %02x -> size: 0x%08Lx max: 0x%08Lx %s\n ",
- dev_path(dev),
- resource->index,
- resource->size, resource->limit,
- resource_type(resource));
- }
-#endif
return resource;
}
+/**
+ * Given a device and an index, read the size of the BAR for that
register.
+ *
+ * @param dev Pointer to the device structure.
+ * @param index Address of the PCI configuration register.
+ */
static void pci_get_rom_resource(struct device *dev, unsigned long
index)
{
struct resource *resource;
unsigned long value;
- resource_t moving;
+ resource_t moving;
- if ((dev->on_mainboard) && (dev->rom_address == 0)) {
- //skip it if rom_address is not set in MB Config.lb
- return;
- }
+ if ((dev->on_mainboard) && (dev->rom_address == 0)) {
+ /* Skip it if rom_address is not set in the MB
Config.lb. */
+ return;
+ }
- /* Initialize the resources to nothing */
+ /* Initialize the resources to nothing. */
resource = new_resource(dev, index);
- /* Get the initial value */
+ /* Get the initial value. */
value = pci_read_config32(dev, index);
- /* See which bits move */
+ /* See which bits move. */
moving = pci_moving_config32(dev, index);
- /* clear the Enable bit */
+
+ /* Clear the Enable bit. */
moving = moving & ~PCI_ROM_ADDRESS_ENABLE;
/* Find the resource constraints.
- *
* Start by finding the bits that move. From there:
* - Size is the least significant bit of the bits that move.
* - Limit is all of the bits that move plus all of the lower
bits.
- * See PCI Spec 6.2.5.1 ...
+ * See PCI Spec 6.2.5.1.
*/
if (moving) {
resource->size = 1;
@@ -303,59 +310,57 @@
while (!(moving & resource->size)) {
resource->size <<= 1;
resource->align += 1;
- resource->gran += 1;
+ resource->gran += 1;
}
resource->limit = moving | (resource->size - 1);
- }
-
- if (moving == 0) {
+ resource->flags |= IORESOURCE_MEM | IORESOURCE_READONLY;
+ } else {
if (value != 0) {
- printk_debug("%s register %02lx(%08lx),
read-only ignoring it\n",
- dev_path(dev), index, value);
+ printk_debug
+ ("%s register %02lx(%08lx), read-only
ignoring it\n",
+ dev_path(dev), index, value);
}
resource->flags = 0;
- } else {
- resource->flags |= IORESOURCE_MEM | IORESOURCE_READONLY;
}
- /* for on board device with embedded ROM image, the ROM image is
at
+ /* For on board device with embedded ROM image, the ROM image is
at
* fixed address specified in the Config.lb, the
dev->rom_address is
* inited by driver_pci_onboard_ops::enable_dev() */
if ((dev->on_mainboard) && (dev->rom_address != 0)) {
- resource->base = dev->rom_address;
+ resource->base = dev->rom_address;
resource->flags |= IORESOURCE_MEM | IORESOURCE_READONLY
|
- IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
}
compact_resources(dev);
}
-/** Read the base address registers for a given device.
- * @param dev Pointer to the dev structure
- * @param howmany How many registers to read (6 for device, 2 for
bridge)
+/**
+ * Read the base address registers for a given device.
+ *
+ * @param dev Pointer to the dev structure.
+ * @param howmany How many registers to read (6 for device, 2 for
bridge).
*/
static void pci_read_bases(struct device *dev, unsigned int howmany)
{
unsigned long index;
- for(index = PCI_BASE_ADDRESS_0; (index < PCI_BASE_ADDRESS_0 +
(howmany << 2)); ) {
+ for (index = PCI_BASE_ADDRESS_0;
+ (index < PCI_BASE_ADDRESS_0 + (howmany << 2));) {
struct resource *resource;
resource = pci_get_resource(dev, index);
- index += (resource->flags & IORESOURCE_PCI64)?8:4;
+ index += (resource->flags & IORESOURCE_PCI64) ? 8 : 4;
}
compact_resources(dev);
}
-static void pci_set_resource(struct device *dev, struct resource
*resource);
-
-static void pci_record_bridge_resource(
- struct device *dev, resource_t moving,
- unsigned index, unsigned long mask, unsigned long type)
+static void pci_record_bridge_resource(struct device *dev, resource_t
moving,
+ unsigned index, unsigned long
type)
{
- /* Initiliaze the constraints on the current bus */
+ /* Initialize the constraints on the current bus. */
struct resource *resource;
- resource = 0;
+ resource = NULL;
if (moving) {
unsigned long gran;
resource_t step;
@@ -363,29 +368,15 @@
resource->size = 0;
gran = 0;
step = 1;
- while((moving & step) == 0) {
+ while ((moving & step) == 0) {
gran += 1;
step <<= 1;
}
resource->gran = gran;
resource->align = gran;
resource->limit = moving | (step - 1);
- resource->flags = type | IORESOURCE_PCI_BRIDGE;
- compute_allocate_resource(&dev->link[0], resource, mask,
type);
- /* If there is nothing behind the resource,
- * clear it and forget it.
- */
- if (resource->size == 0) {
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
- resource->base = moving;
-#else
- resource->base = moving & 0xffffffff;
-#endif
- resource->flags |= IORESOURCE_ASSIGNED;
- resource->flags &= ~IORESOURCE_STORED;
- pci_set_resource(dev, resource);
- resource->flags = 0;
- }
+ resource->flags = type | IORESOURCE_PCI_BRIDGE |
+ IORESOURCE_BRIDGE;
}
return;
}
@@ -394,47 +385,48 @@
{
resource_t moving_base, moving_limit, moving;
- /* See if the bridge I/O resources are implemented */
- moving_base = ((uint32_t)pci_moving_config8(dev, PCI_IO_BASE))
<< 8;
- moving_base |= ((uint32_t)pci_moving_config16(dev,
PCI_IO_BASE_UPPER16)) << 16;
+ /* See if the bridge I/O resources are implemented. */
+ moving_base = ((u32) pci_moving_config8(dev, PCI_IO_BASE)) << 8;
+ moving_base |=
+ ((u32) pci_moving_config16(dev, PCI_IO_BASE_UPPER16)) << 16;
- moving_limit = ((uint32_t)pci_moving_config8(dev, PCI_IO_LIMIT))
<< 8;
- moving_limit |= ((uint32_t)pci_moving_config16(dev,
PCI_IO_LIMIT_UPPER16)) << 16;
+ moving_limit = ((u32) pci_moving_config8(dev, PCI_IO_LIMIT)) <<
8;
+ moving_limit |=
+ ((u32) pci_moving_config16(dev, PCI_IO_LIMIT_UPPER16)) <<
16;
moving = moving_base & moving_limit;
- /* Initialize the io space constraints on the current bus */
- pci_record_bridge_resource(
- dev, moving, PCI_IO_BASE,
- IORESOURCE_IO, IORESOURCE_IO);
+ /* Initialize the I/O space constraints on the current bus. */
+ pci_record_bridge_resource(dev, moving, PCI_IO_BASE,
IORESOURCE_IO);
+ /* See if the bridge prefmem resources are implemented. */
+ moving_base =
+ ((resource_t) pci_moving_config16(dev,
PCI_PREF_MEMORY_BASE)) << 16;
+ moving_base |=
+ ((resource_t) pci_moving_config32(dev,
PCI_PREF_BASE_UPPER32)) <<
+ 32;
- /* See if the bridge prefmem resources are implemented */
- moving_base = ((resource_t)pci_moving_config16(dev,
PCI_PREF_MEMORY_BASE)) << 16;
- moving_base |= ((resource_t)pci_moving_config32(dev,
PCI_PREF_BASE_UPPER32)) << 32;
+ moving_limit =
+ ((resource_t) pci_moving_config16(dev,
PCI_PREF_MEMORY_LIMIT)) <<
+ 16;
+ moving_limit |=
+ ((resource_t) pci_moving_config32(dev,
PCI_PREF_LIMIT_UPPER32)) <<
+ 32;
- moving_limit = ((resource_t)pci_moving_config16(dev,
PCI_PREF_MEMORY_LIMIT)) << 16;
- moving_limit |= ((resource_t)pci_moving_config32(dev,
PCI_PREF_LIMIT_UPPER32)) << 32;
-
moving = moving_base & moving_limit;
- /* Initiliaze the prefetchable memory constraints on the current
bus */
- pci_record_bridge_resource(
- dev, moving, PCI_PREF_MEMORY_BASE,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM | IORESOURCE_PREFETCH);
+ /* Initialize the prefetchable memory constraints on the current
bus. */
+ pci_record_bridge_resource(dev, moving, PCI_PREF_MEMORY_BASE,
+ IORESOURCE_MEM |
IORESOURCE_PREFETCH);
+ /* See if the bridge mem resources are implemented. */
+ moving_base = ((u32) pci_moving_config16(dev, PCI_MEMORY_BASE))
<< 16;
+ moving_limit = ((u32) pci_moving_config16(dev,
PCI_MEMORY_LIMIT)) << 16;
- /* See if the bridge mem resources are implemented */
- moving_base = ((uint32_t)pci_moving_config16(dev,
PCI_MEMORY_BASE)) << 16;
- moving_limit = ((uint32_t)pci_moving_config16(dev,
PCI_MEMORY_LIMIT)) << 16;
-
moving = moving_base & moving_limit;
- /* Initialize the memory resources on the current bus */
- pci_record_bridge_resource(
- dev, moving, PCI_MEMORY_BASE,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
+ /* Initialize the memory resources on the current bus. */
+ pci_record_bridge_resource(dev, moving, PCI_MEMORY_BASE,
+ IORESOURCE_MEM);
compact_resources(dev);
}
@@ -452,34 +444,50 @@
pci_get_rom_resource(dev, PCI_ROM_ADDRESS1);
}
+void pci_domain_read_resources(struct device *dev)
+{
+ struct resource *res;
+
+ /* Initialize the system-wide I/O space constraints. */
+ res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED;
+
+ /* Initialize the system-wide memory resources constraints. */
+ res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
+ res->limit = 0xffffffffULL;
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED;
+}
+
static void pci_set_resource(struct device *dev, struct resource
*resource)
{
resource_t base, end;
- /* Make certain the resource has actually been set */
+ /* Make certain the resource has actually been assigned a value.
*/
if (!(resource->flags & IORESOURCE_ASSIGNED)) {
- printk_err("ERROR: %s %02lx %s size: 0x%010Lx not
assigned\n",
- dev_path(dev), resource->index,
- resource_type(resource),
- resource->size);
+ printk_err("ERROR: %s %02lx %s size: 0x%010llx not
assigned\n",
+ dev_path(dev), resource->index,
+ resource_type(resource), resource->size);
return;
}
- /* If I have already stored this resource don't worry about it
*/
+ /* If I have already stored this resource don't worry about it.
*/
if (resource->flags & IORESOURCE_STORED) {
return;
}
- /* If the resources is substractive don't worry about it */
+ /* If the resource is subtractive don't worry about it. */
if (resource->flags & IORESOURCE_SUBTRACTIVE) {
return;
}
- /* Only handle PCI memory and IO resources for now */
- if (!(resource->flags & (IORESOURCE_MEM |IORESOURCE_IO)))
+ /* Only handle PCI memory and I/O resources for now. */
+ if (!(resource->flags & (IORESOURCE_MEM | IORESOURCE_IO)))
return;
- /* Enable the resources in the command register */
+ /* Enable the resources in the command register. */
if (resource->size) {
if (resource->flags & IORESOURCE_MEM) {
dev->command |= PCI_COMMAND_MEMORY;
@@ -491,19 +499,29 @@
dev->command |= PCI_COMMAND_MASTER;
}
}
- /* Get the base address */
+ /* Get the base address. */
base = resource->base;
- /* Get the end */
+ /* Get the end. */
end = resource_end(resource);
- /* Now store the resource */
+ /* Now store the resource. */
resource->flags |= IORESOURCE_STORED;
+
+ /* PCI Bridges have no enable bit. They are disabled if the
base of
+ * the range is greater than the limit. If the size is zero,
disable
+ * by setting the base = limit and end = limit - 2^gran.
+ */
+ if (resource->size == 0 && (resource->flags &
IORESOURCE_PCI_BRIDGE)) {
+ base = resource->limit;
+ end = resource->limit - (1 << resource->gran);
+ resource->base = base;
+ }
+
if (!(resource->flags & IORESOURCE_PCI_BRIDGE)) {
unsigned long base_lo, base_hi;
- /*
- * some chipsets allow us to set/clear the IO bit.
- * (e.g. VIA 82c686a.) So set it to be safe)
+ /* Some chipsets allow us to set/clear the I/O bit
+ * (e.g. VIA 82c686a). So set it to be safe.
*/
base_lo = base & 0xffffffff;
base_hi = (base >> 32) & 0xffffffff;
@@ -514,39 +532,27 @@
if (resource->flags & IORESOURCE_PCI64) {
pci_write_config32(dev, resource->index + 4,
base_hi);
}
- }
- else if (resource->index == PCI_IO_BASE) {
- /* set the IO ranges */
- compute_allocate_resource(&dev->link[0], resource,
- IORESOURCE_IO, IORESOURCE_IO);
- pci_write_config8(dev, PCI_IO_BASE, base >> 8);
+ } else if (resource->index == PCI_IO_BASE) {
+ /* Set the I/O ranges. */
+ pci_write_config8(dev, PCI_IO_BASE, base >> 8);
pci_write_config16(dev, PCI_IO_BASE_UPPER16, base >>
16);
- pci_write_config8(dev, PCI_IO_LIMIT, end >> 8);
+ pci_write_config8(dev, PCI_IO_LIMIT, end >> 8);
pci_write_config16(dev, PCI_IO_LIMIT_UPPER16, end >>
16);
- }
- else if (resource->index == PCI_MEMORY_BASE) {
- /* set the memory range */
- compute_allocate_resource(&dev->link[0], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
+ } else if (resource->index == PCI_MEMORY_BASE) {
+ /* Set the memory range. */
pci_write_config16(dev, PCI_MEMORY_BASE, base >> 16);
pci_write_config16(dev, PCI_MEMORY_LIMIT, end >> 16);
- }
- else if (resource->index == PCI_PREF_MEMORY_BASE) {
- /* set the prefetchable memory range */
- compute_allocate_resource(&dev->link[0], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM | IORESOURCE_PREFETCH);
+ } else if (resource->index == PCI_PREF_MEMORY_BASE) {
+ /* Set the prefetchable memory range. */
pci_write_config16(dev, PCI_PREF_MEMORY_BASE, base >>
16);
pci_write_config32(dev, PCI_PREF_BASE_UPPER32, base >>
32);
pci_write_config16(dev, PCI_PREF_MEMORY_LIMIT, end >>
16);
pci_write_config32(dev, PCI_PREF_LIMIT_UPPER32, end >>
32);
- }
- else {
- /* Don't let me think I stored the resource */
+ } else {
+ /* Don't let me think I stored the resource. */
resource->flags &= ~IORESOURCE_STORED;
printk_err("ERROR: invalid resource->index %lx\n",
- resource->index);
+ resource->index);
}
report_resource_stored(dev, resource, "");
return;
@@ -556,14 +562,14 @@
{
struct resource *resource, *last;
unsigned link;
- uint8_t line;
+ u8 line;
last = &dev->resource[dev->resources];
- for(resource = &dev->resource[0]; resource < last; resource++) {
+ for (resource = &dev->resource[0]; resource < last; resource++)
{
pci_set_resource(dev, resource);
}
- for(link = 0; link < dev->links; link++) {
+ for (link = 0; link < dev->links; link++) {
struct bus *bus;
bus = &dev->link[link];
if (bus->children) {
@@ -571,60 +577,64 @@
}
}
- /* set a default latency timer */
+ /* Set a default latency timer. */
pci_write_config8(dev, PCI_LATENCY_TIMER, 0x40);
- /* set a default secondary latency timer */
+ /* Set a default secondary latency timer. */
if ((dev->hdr_type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) {
pci_write_config8(dev, PCI_SEC_LATENCY_TIMER, 0x40);
}
- /* zero the irq settings */
+ /* Zero the IRQ settings. */
line = pci_read_config8(dev, PCI_INTERRUPT_PIN);
if (line) {
pci_write_config8(dev, PCI_INTERRUPT_LINE, 0);
}
- /* set the cache line size, so far 64 bytes is good for everyone
*/
+ /* Set the cache line size, so far 64 bytes is good for
everyone. */
pci_write_config8(dev, PCI_CACHE_LINE_SIZE, 64 >> 2);
}
void pci_dev_enable_resources(struct device *dev)
{
const struct pci_operations *ops;
- uint16_t command;
+ u16 command;
- /* Set the subsystem vendor and device id for mainboard devices
*/
+ /* Set the subsystem vendor and device id for mainboard devices.
*/
ops = ops_pci(dev);
if (dev->on_mainboard && ops && ops->set_subsystem) {
printk_debug("%s subsystem <- %02x/%02x\n",
- dev_path(dev),
- CONFIG_MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
- CONFIG_MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
+ dev_path(dev),
+ CONFIG_MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
+ CONFIG_MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
ops->set_subsystem(dev,
- CONFIG_MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
- CONFIG_MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
+
CONFIG_MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
+
CONFIG_MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
}
command = pci_read_config16(dev, PCI_COMMAND);
command |= dev->command;
+ /* v3 has
+ * command |= (PCI_COMMAND_PARITY + PCI_COMMAND_SERR); // Error
check.
+ */
printk_debug("%s cmd <- %02x\n", dev_path(dev), command);
pci_write_config16(dev, PCI_COMMAND, command);
}
void pci_bus_enable_resources(struct device *dev)
{
- uint16_t ctrl;
- /* enable IO in command register if there is VGA card
- * connected with (even it does not claim IO resource) */
+ u16 ctrl;
+
+ /* Enable I/O in command register if there is VGA card
+ * connected with (even it does not claim I/O resource).
+ */
if (dev->link[0].bridge_ctrl & PCI_BRIDGE_CTL_VGA)
dev->command |= PCI_COMMAND_IO;
ctrl = pci_read_config16(dev, PCI_BRIDGE_CONTROL);
ctrl |= dev->link[0].bridge_ctrl;
- ctrl |= (PCI_BRIDGE_CTL_PARITY + PCI_BRIDGE_CTL_SERR); /* error
check */
+ ctrl |= (PCI_BRIDGE_CTL_PARITY + PCI_BRIDGE_CTL_SERR); /* Error
check. */
printk_debug("%s bridge ctrl <- %04x\n", dev_path(dev), ctrl);
pci_write_config16(dev, PCI_BRIDGE_CONTROL, ctrl);
pci_dev_enable_resources(dev);
-
enable_childrens_resources(dev);
}
@@ -640,17 +650,17 @@
delay(1);
}
-void pci_dev_set_subsystem(device_t dev, unsigned vendor, unsigned
device)
+void pci_dev_set_subsystem(struct device *dev, unsigned vendor,
unsigned device)
{
pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
- ((device & 0xffff) << 16) | (vendor & 0xffff));
+ ((device & 0xffff) << 16) | (vendor &
0xffff));
}
/** default handler: only runs the relevant pci bios. */
void pci_dev_init(struct device *dev)
{
#if CONFIG_PCI_ROM_RUN == 1 || CONFIG_VGA_ROM_RUN == 1
- void run_bios(struct device * dev, unsigned long addr);
+ void run_bios(struct device *dev, unsigned long addr);
struct rom_header *rom, *ram;
#if CONFIG_PCI_ROM_RUN != 1
@@ -658,7 +668,7 @@
* is set but CONFIG_PCI_ROM_RUN is not. In this case we skip
* all other option ROM types.
*/
- if ((dev->class>>8)!=PCI_CLASS_DISPLAY_VGA)
+ if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
return;
#endif
@@ -685,13 +695,13 @@
};
struct device_operations default_pci_ops_dev = {
- .read_resources = pci_dev_read_resources,
- .set_resources = pci_dev_set_resources,
+ .read_resources = pci_dev_read_resources,
+ .set_resources = pci_dev_set_resources,
.enable_resources = pci_dev_enable_resources,
- .init = pci_dev_init,
- .scan_bus = 0,
- .enable = 0,
- .ops_pci = &pci_dev_ops_pci,
+ .init = pci_dev_init,
+ .scan_bus = 0,
+ .enable = 0,
+ .ops_pci = &pci_dev_ops_pci,
};
/** Default device operations for PCI bridges */
@@ -700,32 +710,29 @@
};
struct device_operations default_pci_ops_bus = {
- .read_resources = pci_bus_read_resources,
- .set_resources = pci_dev_set_resources,
+ .read_resources = pci_bus_read_resources,
+ .set_resources = pci_dev_set_resources,
.enable_resources = pci_bus_enable_resources,
- .init = 0,
- .scan_bus = pci_scan_bridge,
- .enable = 0,
- .reset_bus = pci_bus_reset,
- .ops_pci = &pci_bus_ops_pci,
+ .init = 0,
+ .scan_bus = pci_scan_bridge,
+ .enable = 0,
+ .reset_bus = pci_bus_reset,
+ .ops_pci = &pci_bus_ops_pci,
};
/**
* @brief Detect the type of downstream bridge
*
- * This function is a heuristic to detect which type
- * of bus is downstream of a pci to pci bridge. This
- * functions by looking for various capability blocks
- * to figure out the type of downstream bridge. PCI-X
- * PCI-E, and Hypertransport all seem to have appropriate
- * capabilities.
+ * This function is a heuristic to detect which type of bus is
downstream
+ * of a PCI-to-PCI bridge. This functions by looking for various
capability
+ * blocks to figure out the type of downstream bridge. PCI-X, PCI-E,
and
+ * Hypertransport all seem to have appropriate capabilities.
*
* When only a PCI-Express capability is found the type
* is examined to see which type of bridge we have.
*
- * @param dev
- *
- * @return appropriate bridge operations
+ * @param dev Pointer to the device structure of the bridge.
+ * @return Appropriate bridge operations.
*/
static struct device_operations *get_pci_bridge_ops(device_t dev)
{
@@ -743,13 +750,13 @@
#endif
#if CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT == 1
pos = 0;
- while((pos = pci_find_next_capability(dev, PCI_CAP_ID_HT, pos)))
{
+ while ((pos = pci_find_next_capability(dev, PCI_CAP_ID_HT,
pos))) {
unsigned flags;
flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS);
if ((flags >> 13) == 1) {
/* Host or Secondary Interface */
printk_debug("%s subbordinate bus
Hypertransport\n",
- dev_path(dev));
+ dev_path(dev));
return &default_ht_ops_bus;
}
}
@@ -759,16 +766,15 @@
if (pos) {
unsigned flags;
flags = pci_read_config16(dev, pos + PCI_EXP_FLAGS);
- switch((flags & PCI_EXP_FLAGS_TYPE) >> 4) {
+ switch ((flags & PCI_EXP_FLAGS_TYPE) >> 4) {
case PCI_EXP_TYPE_ROOT_PORT:
case PCI_EXP_TYPE_UPSTREAM:
case PCI_EXP_TYPE_DOWNSTREAM:
printk_debug("%s subbordinate bus PCI
Express\n",
- dev_path(dev));
+ dev_path(dev));
return &default_pciexp_ops_bus;
case PCI_EXP_TYPE_PCI_BRIDGE:
- printk_debug("%s subbordinate PCI\n",
- dev_path(dev));
+ printk_debug("%s subbordinate PCI\n",
dev_path(dev));
return &default_pci_ops_bus;
default:
break;
@@ -779,11 +785,10 @@
}
/**
- * @brief Set up PCI device operation
+ * Set up PCI device operation. Check if it already has a driver. If
not, use
+ * find_device_operations, or set to a default based on type.
*
- *
- * @param dev
- *
+ * @param dev Pointer to the device whose pci_ops you want to set.
* @see pci_drivers
*/
static void set_pci_ops(struct device *dev)
@@ -794,23 +799,22 @@
}
/* Look through the list of setup drivers and find one for
- * this pci device
+ * this PCI device.
*/
- for(driver = &pci_drivers[0]; driver != &epci_drivers[0];
driver++) {
+ for (driver = &pci_drivers[0]; driver != &epci_drivers[0];
driver++) {
if ((driver->vendor == dev->vendor) &&
- (driver->device == dev->device))
- {
+ (driver->device == dev->device)) {
dev->ops = driver->ops;
printk_spew("%s [%04x/%04x] %sops\n",
- dev_path(dev),
- driver->vendor, driver->device,
- (driver->ops->scan_bus?"bus ":""));
+ dev_path(dev),
+ driver->vendor, driver->device,
+ (driver->ops->scan_bus ? "bus " :
""));
return;
}
}
/* If I don't have a specific driver use the default operations
*/
- switch(dev->hdr_type & 0x7f) { /* header type */
+ switch (dev->hdr_type & 0x7f) { /* header type */
case PCI_HEADER_TYPE_NORMAL: /* standard header */
if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)
goto bad;
@@ -827,20 +831,18 @@
break;
#endif
default:
- bad:
+ bad:
if (dev->enabled) {
printk_err("%s [%04x/%04x/%06x] has unknown
header "
- "type %02x, ignoring.\n",
- dev_path(dev),
- dev->vendor, dev->device,
- dev->class >> 8, dev->hdr_type);
+ "type %02x, ignoring.\n",
+ dev_path(dev),
+ dev->vendor, dev->device,
+ dev->class >> 8, dev->hdr_type);
}
}
return;
}
-
-
/**
* @brief See if we have already allocated a device structure for a
given devfn.
*
@@ -848,42 +850,43 @@
* device structure correspond to the devfn, if present. This function
also
* removes the device structure from the linked list.
*
- * @param list the device structure list
- * @param devfn a device/function number
+ * @param list The device structure list.
+ * @param devfn A device/function number.
*
- * @return pointer to the device structure found or null of we have not
+ * @return Pointer to the device structure found or NULL if we have not
* allocated a device for this devfn yet.
*/
static struct device *pci_scan_get_dev(struct device **list, unsigned
int devfn)
{
struct device *dev;
dev = 0;
- for(; *list; list = &(*list)->sibling) {
+ for (; *list; list = &(*list)->sibling) {
if ((*list)->path.type != DEVICE_PATH_PCI) {
printk_err("child %s not a pci device\n",
- dev_path(*list));
+ dev_path(*list));
continue;
}
if ((*list)->path.pci.devfn == devfn) {
- /* Unlink from the list */
+ /* Unlink from the list. */
dev = *list;
*list = (*list)->sibling;
- dev->sibling = 0;
+ dev->sibling = NULL;
break;
}
}
- /* Just like alloc_dev add the device to the list of device on
the bus.
- * When the list of devices was formed we removed all of the
parents
- * children, and now we are interleaving static and dynamic
devices in
- * order on the bus.
+
+ /* Just like alloc_dev() add the device to the list of devices
on the
+ * bus. When the list of devices was formed we removed all of
the
+ * parents children, and now we are interleaving static and
dynamic
+ * devices in order on the bus.
*/
if (dev) {
- device_t child;
- /* Find the last child of our parent */
- for(child = dev->bus->children; child && child->sibling;
) {
+ struct device *child;
+ /* Find the last child of our parent. */
+ for (child = dev->bus->children; child &&
child->sibling;) {
child = child->sibling;
}
- /* Place the device on the list of children of it's
parent. */
+ /* Place the device on the list of children of its
parent. */
if (child) {
child->sibling = dev;
} else {
@@ -897,7 +900,8 @@
/**
* @brief Scan a PCI bus.
*
- * Determine the existence of a given PCI device.
+ * Determine the existence of a given PCI device. Allocate a new struct
device
+ * if dev==NULL was passed in and the device exists in hardware.
*
* @param bus pointer to the bus structure
* @param devfn to look at
@@ -905,107 +909,94 @@
* @return The device structure for hte device (if found)
* or the NULL if no device is found.
*/
-device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
+device_t pci_probe_dev(device_t dev, struct bus * bus, unsigned devfn)
{
- uint32_t id, class;
- uint8_t hdr_type;
+ u32 id, class;
+ u8 hdr_type;
- /* Detect if a device is present */
+ /* Detect if a device is present. */
if (!dev) {
struct device dummy;
- dummy.bus = bus;
- dummy.path.type = DEVICE_PATH_PCI;
+ dummy.bus = bus;
+ dummy.path.type = DEVICE_PATH_PCI;
dummy.path.pci.devfn = devfn;
id = pci_read_config32(&dummy, PCI_VENDOR_ID);
- /* Have we found somthing?
+ /* Have we found something?
* Some broken boards return 0 if a slot is empty.
*/
- if ( (id == 0xffffffff) || (id == 0x00000000) ||
- (id == 0x0000ffff) || (id == 0xffff0000))
- {
+ if ((id == 0xffffffff) || (id == 0x00000000) ||
+ (id == 0x0000ffff) || (id == 0xffff0000)) {
printk_spew("%s, bad id 0x%x\n",
dev_path(&dummy), id);
return NULL;
}
dev = alloc_dev(bus, &dummy.path);
- }
- else {
- /* Enable/disable the device. Once we have
- * found the device specific operations this
- * operations we will disable the device with
- * those as well.
+ } else {
+ /* Enable/disable the device. Once we have found the
device-
+ * specific operations this operations we will disable
the
+ * device with those as well.
*
* This is geared toward devices that have subfunctions
* that do not show up by default.
*
* If a device is a stuff option on the motherboard
- * it may be absent and enable_dev must cope.
- *
+ * it may be absent and enable_dev() must cope.
*/
- /* Run the magice enable sequence for the device */
+ /* Run the magic enable sequence for the device. */
if (dev->chip_ops && dev->chip_ops->enable_dev) {
dev->chip_ops->enable_dev(dev);
}
- /* Now read the vendor and device id */
+ /* Now read the vendor and device ID. */
id = pci_read_config32(dev, PCI_VENDOR_ID);
-
- /* If the device does not have a pci id disable it.
- * Possibly this is because we have already disabled
- * the device. But this also handles optional devices
- * that may not always show up.
+ /* If the device does not have a PCI ID disable it.
Possibly
+ * this is because we have already disabled the device.
But
+ * this also handles optional devices that may not
always
+ * show up.
*/
/* If the chain is fully enumerated quit */
- if ( (id == 0xffffffff) || (id == 0x00000000) ||
- (id == 0x0000ffff) || (id == 0xffff0000))
- {
+ if ((id == 0xffffffff) || (id == 0x00000000) ||
+ (id == 0x0000ffff) || (id == 0xffff0000)) {
if (dev->enabled) {
printk_info("Disabling static device:
%s\n",
- dev_path(dev));
+ dev_path(dev));
dev->enabled = 0;
}
return dev;
}
}
- /* Read the rest of the pci configuration information */
+ /* Read the rest of the PCI configuration information. */
hdr_type = pci_read_config8(dev, PCI_HEADER_TYPE);
class = pci_read_config32(dev, PCI_CLASS_REVISION);
- /* Store the interesting information in the device structure */
+ /* Store the interesting information in the device structure. */
dev->vendor = id & 0xffff;
dev->device = (id >> 16) & 0xffff;
dev->hdr_type = hdr_type;
- /* class code, the upper 3 bytes of PCI_CLASS_REVISION */
+
+ /* Class code, the upper 3 bytes of PCI_CLASS_REVISION. */
dev->class = class >> 8;
-
- /* Architectural/System devices always need to
- * be bus masters.
- */
+ /* Architectural/System devices always need to be bus masters.
*/
if ((dev->class >> 16) == PCI_BASE_CLASS_SYSTEM) {
dev->command |= PCI_COMMAND_MASTER;
}
- /* Look at the vendor and device id, or at least the
- * header type and class and figure out which set of
- * configuration methods to use. Unless we already
- * have some pci ops.
+ /* Look at the vendor and device ID, or at least the header type
and
+ * class and figure out which set of configuration methods to
use.
+ * Unless we already have some PCI ops.
*/
set_pci_ops(dev);
- /* Now run the magic enable/disable sequence for the device */
+ /* Now run the magic enable/disable sequence for the device. */
if (dev->ops && dev->ops->enable) {
dev->ops->enable(dev);
}
-
- /* Display the device and error if we don't have some pci
operations
- * for it.
- */
+ /* Display the device. */
printk_debug("%s [%04x/%04x] %s%s\n",
- dev_path(dev),
- dev->vendor, dev->device,
- dev->enabled?"enabled": "disabled",
- dev->ops?"" : " No operations"
- );
+ dev_path(dev),
+ dev->vendor, dev->device,
+ dev->enabled ? "enabled" : "disabled",
+ dev->ops ? "" : " No operations");
return dev;
}
@@ -1027,73 +1018,69 @@
* @return The maximum bus number found, after scanning all subordinate
busses
*/
unsigned int pci_scan_bus(struct bus *bus,
- unsigned min_devfn, unsigned max_devfn,
- unsigned int max)
+ unsigned min_devfn, unsigned max_devfn,
+ unsigned int max)
{
unsigned int devfn;
- device_t old_devices;
- device_t child;
+ struct device *old_devices;
+ struct device *child;
#if CONFIG_PCI_BUS_SEGN_BITS
- printk_debug("PCI: pci_scan_bus for bus %04x:%02x\n",
bus->secondary >> 8, bus->secondary & 0xff);
+ printk_debug("PCI: pci_scan_bus for bus %04x:%02x\n",
+ bus->secondary >> 8, bus->secondary & 0xff);
#else
printk_debug("PCI: pci_scan_bus for bus %02x\n",
bus->secondary);
#endif
old_devices = bus->children;
- bus->children = 0;
+ bus->children = NULL;
post_code(0x24);
- /* probe all devices/functions on this bus with some
optimization for
- * non-existence and single funcion devices
+ /* Probe all devices/functions on this bus with some
optimization for
+ * non-existence and single function devices.
*/
for (devfn = min_devfn; devfn <= max_devfn; devfn++) {
- device_t dev;
+ struct device *dev;
/* First thing setup the device structure */
dev = pci_scan_get_dev(&old_devices, devfn);
- /* See if a device is present and setup the device
- * structure.
- */
+ /* See if a device is present and setup the device
structure. */
dev = pci_probe_dev(dev, bus, devfn);
- /* if this is not a multi function device,
- * or the device is not present don't waste
- * time probing another function.
+ /* If this is not a multi function device, or the device
is
+ * not present don't waste time probing another
function.
* Skip to next device.
*/
if ((PCI_FUNC(devfn) == 0x00) &&
- (!dev || (dev->enabled && ((dev->hdr_type &
0x80) != 0x80))))
- {
+ (!dev
+ || (dev->enabled && ((dev->hdr_type & 0x80) !=
0x80)))) {
devfn += 0x07;
}
}
post_code(0x25);
- /* Die if any left over static devices are are found.
+ /* Warn if any leftover static devices are are found.
* There's probably a problem in the Config.lb.
- */
- if(old_devices) {
+ */
+ if (old_devices) {
device_t left;
- for(left = old_devices; left; left = left->sibling) {
- printk_err("%s\n", dev_path(left));
+ printk_warning("PCI: Left over static devices:\n");
+ for (left = old_devices; left; left = left->sibling) {
+ printk_warning("%s\n", dev_path(left));
}
- printk_warning("PCI: Left over static devices. Check
your mainboard Config.lb\n");
+ printk_warning("PCI: Check your mainboard
Config.lb.\n");
}
- /* For all children that implement scan_bus (i.e. bridges)
+ /* For all children that implement scan_bus() (i.e. bridges)
* scan the bus behind that child.
*/
- for(child = bus->children; child; child = child->sibling) {
+ for (child = bus->children; child; child = child->sibling) {
max = scan_bus(child, max);
}
- /*
- * We've scanned the bus and so we know all about what's on
- * the other side of any bridges that may be on this bus plus
- * any devices.
- *
+ /* We've scanned the bus and so we know all about what's on the
other
+ * side of any bridges that may be on this bus plus any devices.
* Return how far we've got finding sub-buses.
*/
printk_debug("PCI: pci_scan_bus returning with max=%03x\n",
max);
@@ -1101,7 +1088,6 @@
return max;
}
-
/**
* @brief Scan a PCI bridge and the buses behind the bridge.
*
@@ -1110,18 +1096,19 @@
*
* This function is the default scan_bus() method for PCI bridge
devices.
*
- * @param dev pointer to the bridge device
- * @param max the highest bus number assgined up to now
- *
- * @return The maximum bus number found, after scanning all subordinate
busses
+ * @param dev Pointer to the bridge device.
+ * @param max The highest bus number assigned up to now.
+ * @return The maximum bus number found, after scanning all subordinate
buses.
*/
unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
- unsigned int (*do_scan_bus)(struct bus *bus,
- unsigned min_devfn, unsigned max_devfn, unsigned int
max))
+ unsigned int (*do_scan_bus) (struct bus
* bus,
+ unsigned
min_devfn,
+ unsigned
max_devfn,
+ unsigned
int max))
{
struct bus *bus;
- uint32_t buses;
- uint16_t cr;
+ u32 buses;
+ u16 cr;
printk_spew("%s for %s\n", __func__, dev_path(dev));
@@ -1141,8 +1128,7 @@
pci_write_config16(dev, PCI_COMMAND, 0x0000);
pci_write_config16(dev, PCI_STATUS, 0xffff);
- /*
- * Read the existing primary/secondary/subordinate bus
+ /* Read the existing primary/secondary/subordinate bus
* number configuration.
*/
buses = pci_read_config32(dev, PCI_PRIMARY_BUS);
@@ -1152,9 +1138,9 @@
* correctly configured.
*/
buses &= 0xff000000;
- buses |= (((unsigned int) (dev->bus->secondary) << 0) |
- ((unsigned int) (bus->secondary) << 8) |
- ((unsigned int) (bus->subordinate) << 16));
+ buses |= (((unsigned int)(dev->bus->secondary) << 0) |
+ ((unsigned int)(bus->secondary) << 8) |
+ ((unsigned int)(bus->subordinate) << 16));
pci_write_config32(dev, PCI_PRIMARY_BUS, buses);
/* Now we can scan all subordinate buses
@@ -1166,8 +1152,7 @@
* bus number to its real value.
*/
bus->subordinate = max;
- buses = (buses & 0xff00ffff) |
- ((unsigned int) (bus->subordinate) << 16);
+ buses = (buses & 0xff00ffff) | ((unsigned int)(bus->subordinate)
<< 16);
pci_write_config32(dev, PCI_PRIMARY_BUS, buses);
pci_write_config16(dev, PCI_COMMAND, cr);
@@ -1183,90 +1168,109 @@
*
* This function is the default scan_bus() method for PCI bridge
devices.
*
- * @param dev pointer to the bridge device
+ * @param dev Pointer to the bridge device.
+ * @param max The highest bus number assigned up to now.
+ * @return The maximum bus number found, after scanning all subordinate
buses.
+ */
+unsigned int pci_scan_bridge(struct device *dev, unsigned int max)
+{
+ return do_pci_scan_bridge(dev, max, pci_scan_bus);
+}
+
+/**
+ * @brief Scan a PCI domain.
+ *
+ * This function is the default scan_bus() method for PCI domains.
+ *
+ * @param dev pointer to the domain
* @param max the highest bus number assgined up to now
*
* @return The maximum bus number found, after scanning all subordinate
busses
*/
-unsigned int pci_scan_bridge(struct device *dev, unsigned int max)
+unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
{
- return do_pci_scan_bridge(dev, max, pci_scan_bus);
+ max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
+ return max;
}
-/*
- Tell the EISA int controller this int must be level triggered
- THIS IS A KLUDGE -- sorry, this needs to get cleaned up.
-*/
+/**
+ * Tell the EISA int controller this int must be level triggered.
+ *
+ * THIS IS A KLUDGE -- sorry, this needs to get cleaned up.
+ */
void pci_level_irq(unsigned char intNum)
{
- unsigned short intBits = inb(0x4d0) | (((unsigned) inb(0x4d1))
<< 8);
+ unsigned short intBits = inb(0x4d0) | (((unsigned)inb(0x4d1)) <<
8);
printk_spew("%s: current ints are 0x%x\n", __func__, intBits);
intBits |= (1 << intNum);
printk_spew("%s: try to set ints 0x%x\n", __func__, intBits);
- // Write new values
- outb((unsigned char) intBits, 0x4d0);
- outb((unsigned char) (intBits >> 8), 0x4d1);
+ /* Write new values. */
+ outb((unsigned char)intBits, 0x4d0);
+ outb((unsigned char)(intBits >> 8), 0x4d1);
- /* this seems like an error but is not ... */
-#if 1
+ /* This seems like an error but is not. */
if (inb(0x4d0) != (intBits & 0xff)) {
- printk_err("%s: lower order bits are wrong: want 0x%x, got
0x%x\n",
- __func__, intBits &0xff, inb(0x4d0));
+ printk_err(
+ "%s: lower order bits are wrong: want 0x%x,
got 0x%x\n",
+ __func__, intBits & 0xff, inb(0x4d0));
}
if (inb(0x4d1) != ((intBits >> 8) & 0xff)) {
- printk_err("%s: lower order bits are wrong: want 0x%x, got
0x%x\n",
- __func__, (intBits>>8) &0xff, inb(0x4d1));
+ printk_err(
+ "%s: lower order bits are wrong: want 0x%x,
got 0x%x\n",
+ __func__, (intBits >> 8) & 0xff, inb(0x4d1));
}
-#endif
}
-/*
- This function assigns IRQs for all functions contained within
- the indicated device address. If the device does not exist or does
- not require interrupts then this function has no effect.
-
- This function should be called for each PCI slot in your system.
-
- pIntAtoD is an array of IRQ #s that are assigned to PINTA through
PINTD of
- this slot.
- The particular irq #s that are passed in depend on the routing
inside
- your southbridge and on your motherboard.
-
- -kevinh@ispiri.com
+/**
+ * This function assigns IRQs for all functions contained within the
+ * indicated device address. If the device does not exist or does not
+ * require interrupts then this function has no effect.
+ *
+ * This function should be called for each PCI slot in your system.
+ *
+ * pIntAtoD is an array of IRQ #s that are assigned to PINTA through
PINTD of
+ * this slot.
+ *
+ * The particular irq #s that are passed in depend on the routing
inside
+ * your southbridge and on your motherboard.
+ *
+ * -kevinh@ispiri.com
+ *
*/
void pci_assign_irqs(unsigned bus, unsigned slot,
- const unsigned char pIntAtoD[4])
+ const unsigned char pIntAtoD[4])
{
unsigned functNum;
- device_t pdev;
+ struct device *pdev;
unsigned char line;
unsigned char irq;
unsigned char readback;
- /* Each slot may contain up to eight functions */
+ /* Each slot may contain up to eight functions. */
for (functNum = 0; functNum < 8; functNum++) {
pdev = dev_find_slot(bus, (slot << 3) + functNum);
if (pdev) {
- line = pci_read_config8(pdev, PCI_INTERRUPT_PIN);
+ line = pci_read_config8(pdev,
PCI_INTERRUPT_PIN);
- // PCI spec says all other values are reserved
+ /* PCI spec says all other values are reserved.
*/
if ((line >= 1) && (line <= 4)) {
irq = pIntAtoD[line - 1];
- printk_debug("Assigning IRQ %d to
%d:%x.%d\n", \
- irq, bus, slot, functNum);
+ printk_debug("Assigning IRQ %d to
%d:%x.%d\n",
+ irq, bus, slot, functNum);
- pci_write_config8(pdev,
PCI_INTERRUPT_LINE,\
- pIntAtoD[line - 1]);
+ pci_write_config8(pdev,
PCI_INTERRUPT_LINE,
+ pIntAtoD[line - 1]);
- readback = pci_read_config8(pdev,
PCI_INTERRUPT_LINE);
+ readback =
+ pci_read_config8(pdev,
PCI_INTERRUPT_LINE);
printk_debug(" Readback = %d\n",
readback);
- // Change to level triggered
+ // Change to level triggered.
pci_level_irq(pIntAtoD[line - 1]);
}
}
Modified: trunk/coreboot-v2/src/devices/root_device.c
===================================================================
--- trunk/coreboot-v2/src/devices/root_device.c 2009-07-02 18:27:02 UTC
(rev 4393)
+++ trunk/coreboot-v2/src/devices/root_device.c 2009-07-02 18:56:24 UTC
(rev 4394)
@@ -34,29 +34,7 @@
*/
void root_dev_read_resources(device_t root)
{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(root, 0);
- resource->base = 0x400;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO;
- compute_allocate_resource(&root->link[0], resource,
- IORESOURCE_IO, IORESOURCE_IO);
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(root, 1);
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffffffUL;
- resource->flags = IORESOURCE_MEM;
- compute_allocate_resource(&root->link[0], resource,
- IORESOURCE_MEM, IORESOURCE_MEM);
+ printk_err("%s should never be called.\n", __func__);
}
/**
@@ -68,14 +46,7 @@
*/
void root_dev_set_resources(device_t root)
{
- struct bus *bus;
-
- bus = &root->link[0];
- compute_allocate_resource(bus,
- &root->resource[0], IORESOURCE_IO, IORESOURCE_IO);
- compute_allocate_resource(bus,
- &root->resource[1], IORESOURCE_MEM, IORESOURCE_MEM);
- assign_resources(bus);
+ printk_err("%s should never be called.\n", __func__);
}
/**
Modified: trunk/coreboot-v2/src/include/device/device.h
===================================================================
--- trunk/coreboot-v2/src/include/device/device.h 2009-07-02
18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/include/device/device.h 2009-07-02
18:56:24 UTC (rev 4394)
@@ -69,17 +69,16 @@
unsigned int hdr_type; /* PCI header type */
unsigned int enabled : 1; /* set if we should enable the
device */
unsigned int initialized : 1; /* set if we have initialized
the device */
- unsigned int have_resources : 1; /* Set if we have read the
devices resources */
unsigned int on_mainboard : 1;
unsigned long rom_address;
- uint8_t command;
+ u8 command;
/* Base registers for this device. I/O, MEM and Expansion ROM */
struct resource resource[MAX_RESOURCES];
unsigned int resources;
- /* link are (down stream) buses attached to the device, usually
a leaf
+ /* links are (downstream) buses attached to the device, usually
a leaf
* device with no children have 0 buses attached and a bridge
has 1 bus
*/
struct bus link[MAX_LINKS];
@@ -106,8 +105,6 @@
/* Generic device helper functions */
int reset_bus(struct bus *bus);
unsigned int scan_bus(struct device *bus, unsigned int max);
-void compute_allocate_resource(struct bus *bus, struct resource
*bridge,
- unsigned long type_mask, unsigned long type);
void assign_resources(struct bus *bus);
void enable_resources(struct device *dev);
void enumerate_static_device(void);
@@ -142,6 +139,8 @@
#define DEVICE_MEM_ALIGN 4096
extern struct device_operations default_dev_ops_root;
+void pci_domain_read_resources(struct device *dev);
+unsigned int pci_domain_scan_bus(struct device *dev, unsigned int max);
void root_dev_read_resources(device_t dev);
void root_dev_set_resources(device_t dev);
unsigned int scan_static_bus(device_t bus, unsigned int max);
Modified: trunk/coreboot-v2/src/include/device/resource.h
===================================================================
--- trunk/coreboot-v2/src/include/device/resource.h 2009-07-02
18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/include/device/resource.h 2009-07-02
18:56:24 UTC (rev 4394)
@@ -1,5 +1,5 @@
-#ifndef RESOURCE_H
-#define RESOURCE_H
+#ifndef DEVICE_RESOURCE_H
+#define DEVICE_RESOURCE_H
#include <stdint.h>
@@ -19,6 +19,7 @@
#define IORESOURCE_SUBTRACTIVE 0x00040000 /* This resource filters
all of the unclaimed transactions
* to the bus below.
*/
+#define IORESOURCE_BRIDGE 0x00080000 /* The IO resource has a
bus below it. */
#define IORESOURCE_STORED 0x20000000 /* The IO resource
assignment has been stored in the device */
#define IORESOURCE_ASSIGNED 0x40000000 /* An IO resource that
has been assigned a value */
#define IORESOURCE_FIXED 0x80000000 /* An IO resource the
allocator must not change */
@@ -62,7 +63,7 @@
#define IORESOURCE_MEM_EXPANSIONROM (1<<6)
-typedef uint64_t resource_t;
+typedef u64 resource_t;
struct resource {
resource_t base; /* Base address of the resource */
resource_t size; /* Size of the resource */
@@ -74,10 +75,14 @@
/* Alignment must be >= the granularity of the resource */
};
-/* Macros to generate index values for subtractive resources */
+/* Macros to generate index values for resources */
#define IOINDEX_SUBTRACTIVE(IDX,LINK) (0x10000000 + ((IDX) << 8) +
LINK)
#define IOINDEX_SUBTRACTIVE_LINK(IDX) (IDX & 0xff)
+#define IOINDEX(IDX,LINK) (((LINK) << 16) + IDX)
+#define IOINDEX_LINK(IDX) (( IDX & 0xf0000) >> 16)
+#define IOINDEX_IDX(IDX) (IDX & 0xffff)
+
/* Generic resource helper functions */
struct device;
struct bus;
@@ -101,4 +106,4 @@
#define RESOURCE_TYPE_MAX 20
extern const char *resource_type(struct resource *resource);
-#endif /* RESOURCE_H */
+#endif /* DEVICE_RESOURCE_H */
Modified: trunk/coreboot-v2/src/northbridge/amd/amdfam10/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/amdfam10/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/amd/amdfam10/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -341,7 +341,7 @@
if (!dev)
continue;
for(link = 0; !res && (link < 8); link++) {
- res = probe_resource(dev, 0x1000 + reg +
(link<<16)); // 8 links, 0x1000 man f1,
+ res = probe_resource(dev, IOINDEX(0x1000 + reg,
link));
}
}
result = 2;
@@ -385,7 +385,7 @@
reg = 0x110+ (index<<24) + (4<<20); // index could be 0,
255
}
- resource = new_resource(dev, 0x1000 + reg + (link<<16));
+ resource = new_resource(dev, IOINDEX(0x1000 + reg,
link));
return resource;
}
@@ -421,7 +421,7 @@
reg = 0x110+ (index<<24) + (6<<20); // index could be 0,
63
}
- resource = new_resource(dev, 0x1000 + reg + (link<<16));
+ resource = new_resource(dev, IOINDEX(0x1000 + reg, link));
return resource;
}
@@ -447,8 +447,6 @@
resource->gran = align;
resource->limit = 0xffffUL;
resource->flags = IORESOURCE_IO;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_IO, IORESOURCE_IO);
}
/* Initialize the prefetchable memory constraints on the current
bus */
@@ -460,9 +458,6 @@
resource->gran = log2(HT_MEM_HOST_ALIGN);
resource->limit = 0xffffffffffULL;
resource->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM | IORESOURCE_PREFETCH);
#if CONFIG_EXT_CONF_SUPPORT == 1
if((resource->index & 0x1fff) == 0x1110) { // ext
@@ -481,9 +476,6 @@
resource->gran = log2(HT_MEM_HOST_ALIGN);
resource->limit = 0xffffffffffULL;
resource->flags = IORESOURCE_MEM;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
#if CONFIG_EXT_CONF_SUPPORT == 1
if((resource->index & 0x1fff) == 0x1110) { // ext
@@ -541,19 +533,14 @@
/* Get the register and link */
reg = resource->index & 0xfff; // 4k
- link = ( resource->index>> 16)& 0x7; // 8 links
+ link = IOINDEX_LINK(resource->index);
if (resource->flags & IORESOURCE_IO) {
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_IO, IORESOURCE_IO);
set_io_addr_reg(dev, nodeid, link, reg, rbase>>8,
rend>>8);
store_conf_io_addr(nodeid, link, reg, (resource->index
>> 24), rbase>>8, rend>>8);
}
else if (resource->flags & IORESOURCE_MEM) {
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- resource->flags & (IORESOURCE_MEM |
IORESOURCE_PREFETCH));
set_mmio_addr_reg(nodeid, link, reg, (resource->index
>>24), rbase>>8, rend>>8, sysconf.nodes) ;// [39:8]
store_conf_mmio_addr(nodeid, link, reg, (resource->index
>>24), rbase>>8, rend>>8);
}
@@ -657,7 +644,7 @@
.enable_dev = 0,
};
-static void pci_domain_read_resources(device_t dev)
+static void amdfam10_domain_read_resources(device_t dev)
{
struct resource *resource;
unsigned reg;
@@ -672,20 +659,20 @@
/* Is this register allocated? */
if ((base & 3) != 0) {
unsigned nodeid, link;
- device_t dev;
+ device_t reg_dev;
if(reg<0xc0) { // mmio
nodeid = (limit & 0xf) + (base&0x30);
} else { // io
nodeid = (limit & 0xf) +
((base>>4)&0x30);
}
link = (limit >> 4) & 7;
- dev = __f0_dev[nodeid];
- if (dev) {
- /* Reserve the resource */
- struct resource *resource;
- resource = new_resource(dev, 0x1000 +
reg + (link<<16));
- if (resource) {
- resource->flags = 1;
+ reg_dev = __f0_dev[nodeid];
+ if (reg_dev) {
+ /* Reserve the resource */
+ struct resource *reg_resource;
+ reg_resource = new_resource(reg_dev,
IOINDEX(0x1000 + reg, link));
+ if (reg_resource) {
+ reg_resource->flags = 1;
}
}
}
@@ -711,24 +698,16 @@
resource->base = 0x400;
resource->limit = 0xffffUL;
resource->flags = IORESOURCE_IO;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_IO, IORESOURCE_IO);
/* Initialize the system wide prefetchable memory
resources constraints */
resource = new_resource(dev, 1|(link<<2));
resource->limit = 0xfcffffffffULL;
resource->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM | IORESOURCE_PREFETCH);
/* Initialize the system wide memory resources
constraints */
resource = new_resource(dev, 2|(link<<2));
resource->limit = 0xfcffffffffULL;
resource->flags = IORESOURCE_MEM;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
}
#endif
}
@@ -770,10 +749,6 @@
return tolm;
}
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM |
IORESOURCE_PREFETCH)
-#endif
-
#if CONFIG_HW_MEM_HOLE_SIZEK != 0
struct hw_mem_hole_info {
@@ -980,9 +955,6 @@
resource->flags |= IORESOURCE_ASSIGNED;
resource->flags &= ~IORESOURCE_STORED;
link = (resource>>2) & 3;
- compute_allocate_resource(&dev->link[link], resource,
- BRIDGE_IO_MASK, resource->flags &
BRIDGE_IO_MASK);
-
resource->flags |= IORESOURCE_STORED;
report_resource_stored(dev, resource, "");
@@ -1142,7 +1114,7 @@
}
}
-static u32 pci_domain_scan_bus(device_t dev, u32 max)
+static u32 amdfam10_domain_scan_bus(device_t dev, u32 max)
{
u32 reg;
int i;
@@ -1192,11 +1164,11 @@
}
static struct device_operations pci_domain_ops = {
- .read_resources = pci_domain_read_resources,
+ .read_resources = amdfam10_domain_read_resources,
.set_resources = pci_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
- .scan_bus = pci_domain_scan_bus,
+ .scan_bus = amdfam10_domain_scan_bus,
#if CONFIG_MMCONF_SUPPORT_DEFAULT
.ops_pci_bus = &pci_ops_mmconf,
#else
Modified: trunk/coreboot-v2/src/northbridge/amd/amdk8/misc_control.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/amdk8/misc_control.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/amd/amdk8/misc_control.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -53,7 +53,7 @@
if (iommu) {
/* Add a Gart apeture resource */
resource = new_resource(dev, 0x94);
- resource->size = iommu?CONFIG_AGP_APERTURE_SIZE:1;
+ resource->size = CONFIG_AGP_APERTURE_SIZE;
resource->align = log2(resource->size);
resource->gran = log2(resource->size);
resource->limit = 0xffffffff; /* 4G */
Modified: trunk/coreboot-v2/src/northbridge/amd/amdk8/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/amdk8/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/amd/amdk8/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -297,7 +297,7 @@
if (!dev)
continue;
for(link = 0; !res && (link < 3); link++) {
- res = probe_resource(dev, 0x100 + (reg | link));
+ res = probe_resource(dev, IOINDEX(0x100 + reg,
link));
}
}
result = 2;
@@ -335,7 +335,7 @@
reg = free_reg;
}
if (reg > 0) {
- resource = new_resource(dev, 0x100 + (reg | link));
+ resource = new_resource(dev, IOINDEX(0x100 + reg,
link));
}
return resource;
}
@@ -362,7 +362,7 @@
reg = free_reg;
}
if (reg > 0) {
- resource = new_resource(dev, 0x100 + (reg | link));
+ resource = new_resource(dev, IOINDEX(0x100 + reg,
link));
}
return resource;
}
@@ -379,9 +379,7 @@
resource->align = log2(HT_IO_HOST_ALIGN);
resource->gran = log2(HT_IO_HOST_ALIGN);
resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_IO, IORESOURCE_IO);
+ resource->flags = IORESOURCE_IO | IORESOURCE_BRIDGE;
}
/* Initialize the prefetchable memory constraints on the current
bus */
@@ -393,9 +391,9 @@
resource->gran = log2(HT_MEM_HOST_ALIGN);
resource->limit = 0xffffffffffULL;
resource->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM | IORESOURCE_PREFETCH);
+#ifdef CONFIG_PCI_64BIT_PREF_MEM
+ resource->flags |= IORESOURCE_BRIDGE;
+#endif
}
/* Initialize the memory constraints on the current bus */
@@ -405,11 +403,8 @@
resource->size = 0;
resource->align = log2(HT_MEM_HOST_ALIGN);
resource->gran = log2(HT_MEM_HOST_ALIGN);
- resource->limit = 0xffffffffffULL;
- resource->flags = IORESOURCE_MEM;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
+ resource->limit = 0xffffffffULL;
+ resource->flags = IORESOURCE_MEM | IORESOURCE_BRIDGE;
}
}
@@ -432,11 +427,15 @@
/* Make certain the resource has actually been set */
if (!(resource->flags & IORESOURCE_ASSIGNED)) {
+ printk_err("%s: can't set unassigned resource @%lx
%lx\n",
+ __func__, resource->index, resource->flags);
return;
}
/* If I have already stored this resource don't worry about it
*/
if (resource->flags & IORESOURCE_STORED) {
+ printk_err("%s: can't set stored resource @%lx %lx\n",
__func__,
+ resource->index, resource->flags);
return;
}
@@ -448,6 +447,10 @@
if (resource->index < 0x100) {
return;
}
+
+ if (resource->size == 0)
+ return;
+
/* Get the base address */
rbase = resource->base;
@@ -456,12 +459,10 @@
/* Get the register and link */
reg = resource->index & 0xfc;
- link = resource->index & 3;
+ link = IOINDEX_LINK(resource->index);
if (resource->flags & IORESOURCE_IO) {
uint32_t base, limit;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_IO, IORESOURCE_IO);
base = f1_read_config32(reg);
limit = f1_read_config32(reg + 0x4);
base &= 0xfe000fcc;
@@ -486,9 +487,6 @@
}
else if (resource->flags & IORESOURCE_MEM) {
uint32_t base, limit;
- compute_allocate_resource(&dev->link[link], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- resource->flags & (IORESOURCE_MEM |
IORESOURCE_PREFETCH));
base = f1_read_config32(reg);
limit = f1_read_config32(reg + 0x4);
base &= 0x000000f0;
@@ -634,7 +632,7 @@
.enable_dev = 0,
};
-static void pci_domain_read_resources(device_t dev)
+static void amdk8_domain_read_resources(device_t dev)
{
struct resource *resource;
unsigned reg;
@@ -655,48 +653,21 @@
if (reg_dev) {
/* Reserve the resource */
struct resource *reg_resource;
- reg_resource = new_resource(reg_dev,
0x100 + (reg | link));
+ reg_resource = new_resource(reg_dev,
IOINDEX(0x100 + reg, link));
if (reg_resource) {
reg_resource->flags = 1;
}
}
}
}
-#if CONFIG_PCI_64BIT_PREF_MEM == 0
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->base = 0x400;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xfcffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-#else
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, 0);
- resource->base = 0x400;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO;
- compute_allocate_resource(&dev->link[0], resource,
- IORESOURCE_IO, IORESOURCE_IO);
+ pci_domain_read_resources(dev);
+#if CONFIG_PCI_64BIT_PREF_MEM == 1
/* Initialize the system wide prefetchable memory resources
constraints */
- resource = new_resource(dev, 1);
- resource->limit = 0xfcffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
- compute_allocate_resource(&dev->link[0], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM | IORESOURCE_PREFETCH);
-
- /* Initialize the system wide memory resources constraints */
resource = new_resource(dev, 2);
resource->limit = 0xfcffffffffULL;
- resource->flags = IORESOURCE_MEM;
- compute_allocate_resource(&dev->link[0], resource,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
+ resource->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
#endif
}
@@ -739,10 +710,6 @@
return tolm;
}
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM |
IORESOURCE_PREFETCH)
-#endif
-
#if CONFIG_HW_MEM_HOLE_SIZEK != 0
struct hw_mem_hole_info {
@@ -898,7 +865,7 @@
extern uint64_t high_tables_base, high_tables_size;
#endif
-static void pci_domain_set_resources(device_t dev)
+static void amdk8_domain_set_resources(device_t dev)
{
#if CONFIG_PCI_64BIT_PREF_MEM == 1
struct resource *io, *mem1, *mem2;
@@ -964,13 +931,7 @@
last = &dev->resource[dev->resources];
for(resource = &dev->resource[0]; resource < last; resource++)
{
-#if 1
resource->flags |= IORESOURCE_ASSIGNED;
- resource->flags &= ~IORESOURCE_STORED;
-#endif
- compute_allocate_resource(&dev->link[0], resource,
- BRIDGE_IO_MASK, resource->flags &
BRIDGE_IO_MASK);
-
resource->flags |= IORESOURCE_STORED;
report_resource_stored(dev, resource, "");
@@ -1125,7 +1086,7 @@
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
+static unsigned int amdk8_domain_scan_bus(device_t dev, unsigned int
max)
{
unsigned reg;
int i;
@@ -1160,11 +1121,11 @@
}
static struct device_operations pci_domain_ops = {
- .read_resources = pci_domain_read_resources,
- .set_resources = pci_domain_set_resources,
+ .read_resources = amdk8_domain_read_resources,
+ .set_resources = amdk8_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
- .scan_bus = pci_domain_scan_bus,
+ .scan_bus = amdk8_domain_scan_bus,
.ops_pci_bus = &pci_cf8_conf1,
};
Modified: trunk/coreboot-v2/src/northbridge/amd/gx1/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/gx1/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/amd/gx1/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -66,27 +66,6 @@
.device = PCI_DEVICE_ID_CYRIX_PCI_MASTER,
};
-
-
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- printk_spew("%s:%s()\n", NORTHBRIDGE_FILE, __func__);
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -187,12 +166,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/amd/gx2/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/gx2/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/amd/gx2/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -356,25 +356,6 @@
.device = PCI_DEVICE_ID_NS_GX2,
};
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- printk_spew("%s:%s()\n", NORTHBRIDGE_FILE, __func__);
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -468,12 +449,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/amd/lx/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/lx/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/amd/lx/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -74,8 +74,6 @@
#define IOD_BM(msr, pdid1, bizarro, ibase, imask) {msr,
{.hi=(pdid1<<29)|(bizarro<<28)|(ibase>>12), .lo=(ibase<<20)|imask}}
#define IOD_SC(msr, pdid1, bizarro, en, wen, ren, ibase) {msr,
{.hi=(pdid1<<29)|(bizarro<<28),
.lo=(en<<24)|(wen<<21)|(ren<<20)|(ibase<<3)}}
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
extern void graphics_init(void);
extern void cpubug(void);
extern void chipsetinit(void);
@@ -382,24 +380,6 @@
.device = PCI_DEVICE_ID_AMD_LXBRIDGE,
};
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
- printk_spew(">> Entering northbridge.c: %s\n", __func__);
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -470,14 +450,6 @@
pci_set_method(dev);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- printk_spew(">> Entering northbridge.c: %s\n", __func__);
-
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified:
trunk/coreboot-v2/src/northbridge/ibm/cpc710/cpc710_northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/ibm/cpc710/cpc710_northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/ibm/cpc710/cpc710_northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -9,23 +9,6 @@
#include <cpu/cpu.h>
#include "chip.h"
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->base = 0;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->base = 0x80000000ULL;
- resource->limit = 0xfeffffffULL; /* We can put pci resources in
the system controll area */
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -53,13 +36,6 @@
assign_resources(&dev->link[0]);
}
-
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified:
trunk/coreboot-v2/src/northbridge/ibm/cpc925/cpc925_northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/ibm/cpc925/cpc925_northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/ibm/cpc925/cpc925_northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -9,23 +9,6 @@
#include <cpu/cpu.h>
#include "chip.h"
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->base = 0;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->base = 0x80000000ULL;
- resource->limit = 0xfeffffffULL; /* We can put pci resources in
the system controll area */
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -53,13 +36,6 @@
assign_resources(&dev->link[0]);
}
-
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/intel/e7501/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/e7501/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/e7501/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -9,23 +9,6 @@
#include <bitops.h>
#include "chip.h"
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
- unsigned reg;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->base = 0x400; //yhlu
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -155,12 +138,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/intel/e7520/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/e7520/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/e7520/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -28,30 +28,6 @@
IORESOURCE_FIXED | IORESOURCE_STORED |
IORESOURCE_ASSIGNED;
}
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffffffUL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void tolm_test(void *gp, struct device *dev, struct resource
*new)
{
struct resource **best_p = gp;
@@ -90,7 +66,7 @@
#if 1
printk_debug("PCI mem marker = %x\n", pci_tolm);
-#endif
+#endif
/* FIXME Me temporary hack */
if(pci_tolm > 0xe0000000)
pci_tolm = 0xe0000000;
@@ -122,7 +98,7 @@
remapbasek = 0x3ff << 16;
remaplimitk = 0 << 16;
remapoffsetk = 0 << 16;
- }
+ }
else {
/* The PCI memory hole overlaps memory
* setup the remap window.
@@ -165,7 +141,7 @@
ram_resource(dev, 5, 4096*1024, tomk -
4*1024*1024);
}
if (remaplimitk >= remapbasek) {
- ram_resource(dev, 6, remapbasek,
+ ram_resource(dev, 6, remapbasek,
(remaplimitk + 64*1024) - remapbasek);
}
@@ -178,13 +154,10 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
+static u32 e7520_domain_scan_bus(device_t dev, u32 max)
{
- max = pci_scan_bus(&dev->link[0], 0, 0xff, max);
- if (max > max_bus) {
- max_bus = max;
- }
- return max;
+ max_bus = pci_domain_scan_bus(dev, max);
+ return max_bus;
}
static struct device_operations pci_domain_ops = {
@@ -192,7 +165,7 @@
.set_resources = pci_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
- .scan_bus = pci_domain_scan_bus,
+ .scan_bus = e7520_domain_scan_bus,
.ops_pci_bus = &pci_cf8_conf1, /* Do we want to use the
memory mapped space here? */
};
Modified: trunk/coreboot-v2/src/northbridge/intel/e7525/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/e7525/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/e7525/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -28,30 +28,6 @@
IORESOURCE_FIXED | IORESOURCE_STORED |
IORESOURCE_ASSIGNED;
}
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffffffUL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void tolm_test(void *gp, struct device *dev, struct resource
*new)
{
struct resource **best_p = gp;
@@ -90,7 +66,7 @@
#if 1
printk_debug("PCI mem marker = %x\n", pci_tolm);
-#endif
+#endif
/* FIXME Me temporary hack */
if(pci_tolm > 0xe0000000)
pci_tolm = 0xe0000000;
@@ -122,7 +98,7 @@
remapbasek = 0x3ff << 16;
remaplimitk = 0 << 16;
remapoffsetk = 0 << 16;
- }
+ }
else {
/* The PCI memory hole overlaps memory
* setup the remap window.
@@ -160,12 +136,12 @@
/* Report the memory regions */
ram_resource(dev, 3, 0, 640);
- ram_resource(dev, 4, 768, tolmk - 768);
+ ram_resource(dev, 4, 768, (tolmk - 768));
if (tomk > 4*1024*1024) {
ram_resource(dev, 5, 4096*1024, tomk -
4*1024*1024);
}
if (remaplimitk >= remapbasek) {
- ram_resource(dev, 6, remapbasek,
+ ram_resource(dev, 6, remapbasek,
(remaplimitk + 64*1024) - remapbasek);
}
@@ -178,13 +154,10 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
+static u32 e7525_domain_scan_bus(device_t dev, u32 max)
{
- max = pci_scan_bus(&dev->link[0], 0, 0xff, max);
- if (max > max_bus) {
- max_bus = max;
- }
- return max;
+ max_bus = pci_domain_scan_bus(dev, max);
+ return max_bus;
}
static struct device_operations pci_domain_ops = {
@@ -192,7 +165,7 @@
.set_resources = pci_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
- .scan_bus = pci_domain_scan_bus,
+ .scan_bus = e7525_domain_scan_bus,
.ops_pci_bus = &pci_cf8_conf1, /* Do we want to use the
memory mapped space here? */
};
Modified: trunk/coreboot-v2/src/northbridge/intel/i3100/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i3100/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i3100/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -49,30 +49,6 @@
IORESOURCE_FIXED | IORESOURCE_STORED |
IORESOURCE_ASSIGNED;
}
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffffffUL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void tolm_test(void *gp, struct device *dev, struct resource
*new)
{
struct resource **best_p = gp;
@@ -199,13 +175,10 @@
assign_resources(&dev->link[0]);
}
-static u32 pci_domain_scan_bus(device_t dev, u32 max)
+static u32 i3100_domain_scan_bus(device_t dev, u32 max)
{
- max = pci_scan_bus(&dev->link[0], 0, 0xff, max);
- if (max > max_bus) {
- max_bus = max;
- }
- return max;
+ max_bus = pci_domain_scan_bus(dev, max);
+ return max_bus;
}
static struct device_operations pci_domain_ops = {
@@ -213,7 +186,7 @@
.set_resources = pci_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
- .scan_bus = pci_domain_scan_bus,
+ .scan_bus = i3100_domain_scan_bus,
.ops_pci_bus = &pci_cf8_conf1, /* Do we want to use the
memory mapped space here? */
};
Modified: trunk/coreboot-v2/src/northbridge/intel/i440bx/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i440bx/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i440bx/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -33,24 +33,6 @@
.device = 0x7190,
};
-
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -95,7 +77,7 @@
extern uint64_t high_tables_base, high_tables_size;
#endif
-static void pci_domain_set_resources(device_t dev)
+static void i440bx_domain_set_resources(device_t dev)
{
device_t mc_dev;
uint32_t pci_tolm;
@@ -140,15 +122,9 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
- .set_resources = pci_domain_set_resources,
+ .set_resources = i440bx_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
.scan_bus = pci_domain_scan_bus,
Modified: trunk/coreboot-v2/src/northbridge/intel/i82810/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i82810/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i82810/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -52,27 +52,6 @@
.device = 0x7120,
};
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
- unsigned reg;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->base = 0x400;
- resource->limit = 0xffffUL;
- resource->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -181,12 +160,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/intel/i82830/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i82830/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i82830/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -51,25 +51,6 @@
.device = 0x3575,
};
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide I/O space constraints. */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints. */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -158,12 +139,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/intel/i855gme/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i855gme/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i855gme/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -31,24 +31,6 @@
#include <cpu/x86/cache.h>
#include "chip.h"
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
- unsigned reg;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -156,12 +138,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/intel/i855pm/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i855pm/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i855pm/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -10,23 +10,6 @@
#include <bitops.h>
#include "chip.h"
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -123,12 +106,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/intel/i945/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/intel/i945/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/intel/i945/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -43,31 +43,6 @@
IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED;
}
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffUL;
- resource->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->base = 0;
- resource->size = 0;
- resource->align = 0;
- resource->gran = 0;
- resource->limit = 0xffffffffUL;
- resource->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void tolm_test(void *gp, struct device *dev, struct resource
*new)
{
struct resource **best_p = gp;
@@ -184,15 +159,10 @@
#endif
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], 0, 0xff, max);
/* TODO We could determine how many PCIe busses we need in
* the bar. For now that number is hardcoded to a max of 64.
+ * See e7525/northbridge.c for an example.
*/
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified:
trunk/coreboot-v2/src/northbridge/motorola/mpc107/mpc107_northbridge.c
===================================================================
---
trunk/coreboot-v2/src/northbridge/motorola/mpc107/mpc107_northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++
trunk/coreboot-v2/src/northbridge/motorola/mpc107/mpc107_northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -16,7 +16,7 @@
* be large enough to hold all expected resources for all PCI
* devices.
*/
-static void pci_domain_read_resources(device_t dev)
+static void mpc107_domain_read_resources(device_t dev)
{
struct resource *resource;
@@ -101,15 +101,8 @@
assign_resources(&dev->link[0]);
}
-
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
- .read_resources = pci_domain_read_resources,
+ .read_resources = mpc107_domain_read_resources,
.set_resources = pci_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
Modified: trunk/coreboot-v2/src/northbridge/via/cn400/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/cn400/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/cn400/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -101,11 +101,11 @@
.device = PCI_DEVICE_ID_VIA_CN400_MEMCTRL,
};
-static void pci_domain_read_resources(device_t dev)
+static void cn400_domain_read_resources(device_t dev)
{
struct resource *resource;
- printk_spew("Entering cn400 pci_domain_read_resources.\n");
+ printk_spew("Entering %s.\n", __func__);
/* Initialize the system wide I/O space constraints. */
resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
@@ -119,7 +119,7 @@
resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
- printk_spew("Leaving cn400 pci_domain_read_resources.\n");
+ printk_spew("Leaving %s.\n", __func__);
}
static void ram_resource(device_t dev, unsigned long index,
@@ -173,14 +173,14 @@
extern uint64_t high_tables_base, high_tables_size;
#endif
-static void pci_domain_set_resources(device_t dev)
+static void cn400_domain_set_resources(device_t dev)
{
/* The order is important to find the correct RAM size. */
static const u8 ramregs[] = { 0x43, 0x42, 0x41, 0x40 };
device_t mc_dev;
u32 pci_tolm;
- printk_spew("Entering cn400 pci_domain_set_resources.\n");
+ printk_spew("Entering %s.\n", __func__);
pci_tolm = find_pci_tolm(&dev->link[0]);
mc_dev = dev_find_device(PCI_VENDOR_ID_VIA,
@@ -226,23 +226,23 @@
}
assign_resources(&dev->link[0]);
- printk_spew("Leaving cn400 pci_domain_set_resources.\n");
+ printk_spew("Leaving %s.\n", __func__);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
+static unsigned int cn400_domain_scan_bus(device_t dev, unsigned int
max)
{
- printk_debug("Entering cn400 pci_domain_scan_bus.\n");
+ printk_debug("Entering %s.\n", __func__);
max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
return max;
}
static const struct device_operations pci_domain_ops = {
- .read_resources = pci_domain_read_resources,
- .set_resources = pci_domain_set_resources,
+ .read_resources = cn400_domain_read_resources,
+ .set_resources = cn400_domain_set_resources,
.enable_resources = enable_childrens_resources,
.init = 0,
- .scan_bus = pci_domain_scan_bus,
+ .scan_bus = cn400_domain_scan_bus,
};
static void cpu_bus_init(device_t dev)
Modified: trunk/coreboot-v2/src/northbridge/via/cn700/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/cn700/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/cn700/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -97,27 +97,6 @@
.device = PCI_DEVICE_ID_VIA_CN700_MEMCTRL,
};
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- printk_spew("Entering cn700 pci_domain_read_resources.\n");
-
- /* Initialize the system wide I/O space constraints. */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
- IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints. */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
- IORESOURCE_ASSIGNED;
-
- printk_spew("Leaving cn700 pci_domain_read_resources.\n");
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -223,14 +202,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- printk_debug("Entering cn700 pci_domain_scan_bus.\n");
-
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static const struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/via/cx700/cx700_lpc.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/cx700/cx700_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/cx700/cx700_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -329,7 +329,7 @@
void cx700_read_resources(device_t dev)
{
- struct resource *resource;
+ struct resource *res;
/* Make sure we call our childrens set/enable functions - these
* are not called unless this device has a resource to set.
@@ -337,11 +337,16 @@
pci_dev_read_resources(dev);
- resource = new_resource(dev, 1);
- resource->flags |=
- IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_IO |
IORESOURCE_STORED;
- resource->size = 2;
- resource->base = 0x2e;
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
void cx700_set_resources(device_t dev)
Modified: trunk/coreboot-v2/src/northbridge/via/cx700/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/cx700/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/cx700/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -32,21 +32,6 @@
#include "chip.h"
#include "northbridge.h"
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -146,12 +131,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/via/vt8601/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vt8601/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/vt8601/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -45,23 +45,6 @@
.device = 0x0601, /* 0x8601 is the AGP bridge? */
};
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -160,12 +143,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/via/vt8623/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vt8623/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/vt8623/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -190,30 +190,6 @@
.device = 0x3122,
};
-
-#define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
-
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- printk_spew("Entering vt8623 pci_domain_read_resources.\n");
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
- IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
- IORESOURCE_ASSIGNED;
-
- printk_spew("Leaving vt8623 pci_domain_read_resources.\n");
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -313,14 +289,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- printk_spew("Entering vt8623 pci_domain_scan_bus.\n");
-
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -69,27 +69,6 @@
.device = PCI_DEVICE_ID_VIA_VX855_MEMCTRL,
};
-static void pci_domain_read_resources(device_t dev)
-{
- struct resource *resource;
-
- printk_spew("Entering vx800 pci_domain_read_resources.\n");
-
- /* Initialize the system wide io space constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- resource->limit = 0xffffUL;
- resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
- IORESOURCE_ASSIGNED;
-
- /* Initialize the system wide memory resources constraints */
- resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- resource->limit = 0xffffffffULL;
- resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
- IORESOURCE_ASSIGNED;
-
- printk_spew("Leaving vx800 pci_domain_read_resources.\n");
-}
-
static void ram_resource(device_t dev, unsigned long index,
unsigned long basek, unsigned long sizek)
{
@@ -195,14 +174,6 @@
assign_resources(&dev->link[0]);
}
-static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
-{
- printk_debug("Entering vx800 pci_domain_scan_bus.\n");
-
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
-}
-
static const struct device_operations pci_domain_ops = {
.read_resources = pci_domain_read_resources,
.set_resources = pci_domain_set_resources,
Modified: trunk/coreboot-v2/src/southbridge/amd/amd8111/amd8111_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/amd8111/amd8111_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/amd8111/amd8111_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -162,15 +162,26 @@
{
struct resource *res;
- /* Get the normal pci resources of this device */
+ /* Get the normal PCI resources of this device. */
pci_dev_read_resources(dev);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void amd8111_lpc_enable_resources(device_t dev)
Modified: trunk/coreboot-v2/src/southbridge/amd/amd8131/amd8131_bridge.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/amd8131/amd8131_bridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/amd8131/amd8131_bridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -364,9 +364,6 @@
/* set the memory range */
dev->command |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
res->flags |= IORESOURCE_STORED;
- compute_allocate_resource(&dev->link[0], res,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
base = res->base;
end = resource_end(res);
pci_write_config16(dev, PCI_MEMORY_BASE, base >> 16);
Modified: trunk/coreboot-v2/src/southbridge/amd/amd8132/amd8132_bridge.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/amd8132/amd8132_bridge.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/amd8132/amd8132_bridge.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -350,9 +350,6 @@
/* set the memory range */
dev->command |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
res->flags |= IORESOURCE_STORED;
- compute_allocate_resource(&dev->link[0], res,
- IORESOURCE_MEM | IORESOURCE_PREFETCH,
- IORESOURCE_MEM);
base = res->base;
end = resource_end(res);
pci_write_config16(dev, PCI_MEMORY_BASE, base >> 16);
Modified: trunk/coreboot-v2/src/southbridge/amd/cs5530/cs5530_isa.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/cs5530/cs5530_isa.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/cs5530/cs5530_isa.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -25,6 +25,24 @@
#include <device/pci_ids.h>
#include "cs5530.h"
+static void cs5530_read_resources(device_t dev)
+{
+ struct resource* res;
+
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
static void isa_init(struct device *dev)
{
uint8_t reg8;
@@ -45,7 +63,7 @@
}
static struct device_operations isa_ops = {
- .read_resources = pci_dev_read_resources,
+ .read_resources = cs5530_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = cs5530_pci_dev_enable_resources,
.init = isa_init,
Modified: trunk/coreboot-v2/src/southbridge/amd/cs5535/cs5535.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/cs5535/cs5535.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/cs5535/cs5535.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -69,6 +69,24 @@
printk_spew("%s: dev is %p\n", __func__, dev);
}
+static void cs5535_read_resources(device_t dev)
+{
+ struct resource* res;
+
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
static void cs5535_pci_dev_enable_resources(device_t dev)
{
printk_spew("cs5535.c: %s()\n", __func__);
@@ -77,7 +95,7 @@
}
static struct device_operations southbridge_ops = {
- .read_resources = pci_dev_read_resources,
+ .read_resources = cs5535_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = cs5535_pci_dev_enable_resources,
.init = southbridge_init,
Modified: trunk/coreboot-v2/src/southbridge/amd/cs5536/cs5536.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/cs5536/cs5536.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/cs5536/cs5536.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -607,6 +607,25 @@
}
}
+static void cs5536_read_resources(device_t dev)
+{
+ struct resource *res;
+
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
static void southbridge_enable(struct device *dev)
{
printk_err("cs5536: %s: dev is %p\n", __func__, dev);
@@ -621,7 +640,7 @@
}
static struct device_operations southbridge_ops = {
- .read_resources = pci_dev_read_resources,
+ .read_resources = cs5536_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = cs5536_pci_dev_enable_resources,
.init = southbridge_init,
Modified: trunk/coreboot-v2/src/southbridge/amd/sb600/sb600_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/amd/sb600/sb600_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/amd/sb600/sb600_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -70,15 +70,24 @@
pci_get_resource(dev, 0xA0); /* SPI ROM base address */
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
compact_resources(dev);
}
@@ -111,7 +120,7 @@
for (child = dev->link[link].children; child;
child = child->sibling) {
enable_resources(child);
- if (child->have_resources
+ if (child->enabled
&& (child->path.type == DEVICE_PATH_PNP)) {
for (i = 0; i < child->resources; i++) {
struct resource *res;
Modified:
trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -29,18 +29,27 @@
static void bcm5785_lpc_read_resources(device_t dev)
{
struct resource *res;
- unsigned long index;
/* Get the normal pci resources of this device */
- pci_dev_read_resources(dev);
-
- /* Add an extra subtractive resource for both memory and I/O */
- res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
-
- res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ pci_dev_read_resources(dev);
+ /* Add an extra subtractive resource for both memory and I/O. */
+ res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
/**
@@ -69,7 +78,7 @@
device_t child;
for (child = dev->link[link].children; child; child =
child->sibling) {
enable_resources(child);
- if(child->have_resources && (child->path.type ==
DEVICE_PATH_PNP)) {
+ if(child->enabled && (child->path.type ==
DEVICE_PATH_PNP)) {
for(i=0;i<child->resources;i++) {
struct resource *res;
unsigned long base, end; //
don't need long long
Modified:
trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_sb_pci_main.c
===================================================================
---
trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_sb_pci_main.c
2009-07-02 18:27:02 UTC (rev 4393)
+++
trunk/coreboot-v2/src/southbridge/broadcom/bcm5785/bcm5785_sb_pci_main.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -51,7 +51,6 @@
/* Get the normal pci resources of this device */
pci_dev_read_resources(dev);
-
/* Get Resource for SMBUS */
pci_get_resource(dev, 0x90);
Modified: trunk/coreboot-v2/src/southbridge/intel/esb6300/esb6300_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/esb6300/esb6300_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/esb6300/esb6300_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -361,12 +361,23 @@
/* Add the GPIO BAR */
res = pci_get_resource(dev, GPIO_BAR);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void esb6300_lpc_enable_resources(device_t dev)
Modified: trunk/coreboot-v2/src/southbridge/intel/i3100/i3100_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i3100/i3100_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i3100/i3100_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -399,13 +399,24 @@
/* Add the GPIO BAR */
res = pci_get_resource(dev, GPIO_BAR);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
/* Add resource for RCBA */
res = new_resource(dev, RCBA);
res->size = 0x4000;
Modified:
trunk/coreboot-v2/src/southbridge/intel/i82371eb/i82371eb_isa.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i82371eb/i82371eb_isa.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i82371eb/i82371eb_isa.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -55,8 +55,31 @@
isa_dma_init();
}
-static const struct device_operations isa_ops = {
- .read_resources = pci_dev_read_resources,
+static void sb_read_resources(struct device *dev)
+{
+ struct resource *res;
+
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x1000UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 2);
+ res->base = 0xff800000UL;
+ res->size = 0x00800000UL; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
+const struct device_operations isa_ops = {
+ .read_resources = sb_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = pci_dev_enable_resources,
.init = isa_init,
Modified:
trunk/coreboot-v2/src/southbridge/intel/i82801ca/i82801ca_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i82801ca/i82801ca_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i82801ca/i82801ca_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -207,15 +207,26 @@
{
struct resource *res;
- /* Get the normal pci resources of this device */
+ /* Get the normal PCI resources of this device. */
pci_dev_read_resources(dev);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void i82801ca_lpc_enable_resources(device_t dev)
Modified:
trunk/coreboot-v2/src/southbridge/intel/i82801dbm/i82801dbm_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i82801dbm/i82801dbm_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i82801dbm/i82801dbm_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -182,15 +182,26 @@
{
struct resource *res;
- /* Get the normal pci resources of this device */
+ /* Get the normal PCI resources of this device. */
pci_dev_read_resources(dev);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void i82801dbm_lpc_enable_resources(device_t dev)
Modified:
trunk/coreboot-v2/src/southbridge/intel/i82801er/i82801er_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i82801er/i82801er_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i82801er/i82801er_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -334,7 +334,7 @@
{
struct resource *res;
- /* Get the normal pci resources of this device */
+ /* Get the normal PCI resources of this device. */
pci_dev_read_resources(dev);
/* Add the ACPI BAR */
@@ -343,12 +343,23 @@
/* Add the GPIO BAR */
res = pci_get_resource(dev, GPIO_BAR);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void i82801er_lpc_enable_resources(device_t dev)
Modified:
trunk/coreboot-v2/src/southbridge/intel/i82801gx/i82801gx_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i82801gx/i82801gx_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i82801gx/i82801gx_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -419,12 +419,21 @@
/* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void i82801gx_lpc_enable_resources(device_t dev)
Modified:
trunk/coreboot-v2/src/southbridge/intel/i82801xx/i82801xx_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/intel/i82801xx/i82801xx_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/intel/i82801xx/i82801xx_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -340,12 +340,21 @@
/* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
static void i82801xx_lpc_enable_resources(device_t dev)
Modified: trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -275,12 +275,21 @@
/* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags =
- IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags =
- IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
/**
@@ -308,7 +317,7 @@
device_t child;
for (child = dev->link[link].children; child; child =
child->sibling) {
enable_resources(child);
- if (child->have_resources && (child->path.type
== DEVICE_PATH_PNP)) {
+ if (child->enabled && (child->path.type ==
DEVICE_PATH_PNP)) {
for (i = 0; i < child->resources; i++) {
struct resource *res;
unsigned long base, end;
// don't need long long
Modified: trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_pci.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_pci.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/nvidia/ck804/ck804_pci.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -5,6 +5,7 @@
#include <console/console.h>
#include <device/device.h>
+#include <device/resource.h>
#include <device/pci.h>
#include <device/pci_ids.h>
#include <device/pci_ops.h>
@@ -13,10 +14,8 @@
static void pci_init(struct device *dev)
{
uint32_t dword;
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
device_t pci_domain_dev;
- struct resource *mem1, *mem2;
-#endif
+ struct resource *mem, *pref;
dword = pci_read_config32(dev, 0x04);
dword |= (1 << 8); /* System error enable */
@@ -36,7 +35,6 @@
pci_write_config32(dev, 0x4c, dword);
#endif
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
pci_domain_dev = dev->bus->dev;
while (pci_domain_dev) {
if (pci_domain_dev->path.type == DEVICE_PATH_PCI_DOMAIN)
@@ -47,21 +45,19 @@
if (!pci_domain_dev)
return; /* Impossible */
- mem1 = find_resource(pci_domain_dev, 1); // prefmem, it
could be 64bit
- mem2 = find_resource(pci_domain_dev, 2); // mem
- if (mem1->base > mem2->base) {
- dword = mem2->base & (0xffff0000UL);
- printk_debug("PCI DOMAIN mem2 base = 0x%010Lx\n",
mem2->base);
+ pref = probe_resource(pci_domain_dev, IOINDEX_SUBTRACTIVE(2,0));
+ mem = probe_resource(pci_domain_dev, IOINDEX_SUBTRACTIVE(1,0));
+
+ if (!mem)
+ return; /* Impossible */
+
+ if (!pref || pref->base > mem->base) {
+ dword = mem->base & (0xffff0000UL);
+ printk_debug("PCI DOMAIN mem base = 0x%010Lx\n",
mem->base);
} else {
- dword = mem1->base & (0xffff0000UL);
- printk_debug("PCI DOMAIN mem1 (prefmem) base =
0x%010Lx\n",
- mem1->base);
+ dword = pref->base & (0xffff0000UL);
+ printk_debug("PCI DOMAIN pref base = 0x%010Lx\n",
pref->base);
}
-#else
- dword = dev_root.resource[1].base & (0xffff0000UL);
- printk_debug("dev_root mem base = 0x%010Lx\n",
- dev_root.resource[1].base);
-#endif
printk_debug("[0x50] <-- 0x%08x\n", dword);
pci_write_config32(dev, 0x50, dword); /* TOM */
Modified: trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -248,16 +248,27 @@
{
struct resource *res;
- /* Get the normal pci resources of this device */
- pci_dev_read_resources(dev); // We got one for APIC, or one more
for TRAP
+ /* Get the normal PCI resources of this device. */
+ /* We got one for APIC, or one more for TRAP. */
+ pci_dev_read_resources(dev);
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
/**
@@ -265,7 +276,7 @@
*
* @param dev the device whos children's resources are to be enabled
*
- * This function is call by the global enable_resources() indirectly
via the
+ * This function is called by the global enable_resources() indirectly
via the
* device_operation::enable_resources() method of devices.
*
* Indirect mutual recursion:
@@ -286,7 +297,7 @@
device_t child;
for (child = dev->link[link].children; child; child =
child->sibling) {
enable_resources(child);
- if(child->have_resources && (child->path.type ==
DEVICE_PATH_PNP)) {
+ if(child->enabled && (child->path.type ==
DEVICE_PATH_PNP)) {
for(i=0;i<child->resources;i++) {
struct resource *res;
unsigned long base, end; //
don't need long long
Modified: trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_pci.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_pci.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/nvidia/mcp55/mcp55_pci.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -23,6 +23,7 @@
#include <console/console.h>
#include <device/device.h>
+#include <device/resource.h>
#include <device/pci.h>
#include <device/pci_ids.h>
#include <device/pci_ops.h>
@@ -33,10 +34,8 @@
uint32_t dword;
uint16_t word;
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
device_t pci_domain_dev;
- struct resource *mem1, *mem2;
-#endif
+ struct resource *mem, *pref;
/* System error enable */
dword = pci_read_config32(dev, 0x04);
@@ -58,30 +57,32 @@
pci_write_config32(dev, 0x4c, dword);
#endif
-#if CONFIG_PCI_64BIT_PREF_MEM == 1
pci_domain_dev = dev->bus->dev;
- while(pci_domain_dev) {
- if(pci_domain_dev->path.type == DEVICE_PATH_PCI_DOMAIN)
break;
+ while (pci_domain_dev) {
+ if (pci_domain_dev->path.type == DEVICE_PATH_PCI_DOMAIN)
+ break;
pci_domain_dev = pci_domain_dev->bus->dev;
}
- if(!pci_domain_dev) return; // impossiable
- mem1 = find_resource(pci_domain_dev, 1); // prefmem, it could be
64bit
- mem2 = find_resource(pci_domain_dev, 2); // mem
- if(mem1->base > mem2->base) {
- dword = mem2->base & (0xffff0000UL);
- printk_debug("PCI DOMAIN mem2 base = 0x%010Lx\n",
mem2->base);
+ if (!pci_domain_dev)
+ return; /* Impossible */
+
+ pref = probe_resource(pci_domain_dev, IOINDEX_SUBTRACTIVE(2,0));
+ mem = probe_resource(pci_domain_dev, IOINDEX_SUBTRACTIVE(1,0));
+
+ if (!mem)
+ return; /* Impossible */
+
+ if (!pref || pref->base > mem->base) {
+ dword = mem->base & (0xffff0000UL);
+ printk_debug("PCI DOMAIN mem base = 0x%010Lx\n",
mem->base);
} else {
- dword = mem1->base & (0xffff0000UL);
- printk_debug("PCI DOMAIN mem1 (prefmem) base =
0x%010Lx\n", mem1->base);
+ dword = pref->base & (0xffff0000UL);
+ printk_debug("PCI DOMAIN pref base = 0x%010Lx\n",
pref->base);
}
-#else
- dword = dev_root.resource[1].base & (0xffff0000UL);
- printk_debug("dev_root mem base = 0x%010Lx\n",
dev_root.resource[1].base);
-#endif
+
printk_debug("[0x50] <-- 0x%08x\n", dword);
- pci_write_config32(dev, 0x50, dword); //TOM
-
+ pci_write_config32(dev, 0x50, dword); /* TOM */
}
static struct pci_operations lops_pci = {
Modified: trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -172,7 +172,6 @@
resource = find_resource(dev,1);
if( !(resource->flags & IORESOURCE_STORED) ){
resource->flags |= IORESOURCE_STORED ;
-
compute_allocate_resource(&dev->link[0],resource,resource->flags,resourc
e->flags);
printk_debug("%s 1 ==>
%x\n",dev_path(dev),resource->base);
cf_base = resource->base;
}
Modified: trunk/coreboot-v2/src/southbridge/sis/sis966/sis966_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/sis/sis966/sis966_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/sis/sis966/sis966_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -239,13 +239,23 @@
/* Get the normal pci resources of this device */
pci_dev_read_resources(dev); // We got one for APIC, or one more
for TRAP
- /* Add an extra subtractive resource for both memory and I/O */
+ /* Add an extra subtractive resource for both memory and I/O. */
res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
- res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0;
+ res->size = 0x1000;
+ res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
- res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
IORESOURCE_ASSIGNED;
+ res->base = 0xff800000;
+ res->size = 0x00800000; /* 8 MB for flash */
+ res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE |
+ IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
/**
@@ -274,7 +284,7 @@
device_t child;
for (child = dev->link[link].children; child; child =
child->sibling) {
enable_resources(child);
- if(child->have_resources && (child->path.type ==
DEVICE_PATH_PNP)) {
+ if(child->enabled && (child->path.type ==
DEVICE_PATH_PNP)) {
for(i=0;i<child->resources;i++) {
struct resource *res;
unsigned long base, end; //
don't need long long
Modified: trunk/coreboot-v2/src/southbridge/via/vt8231/vt8231_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/via/vt8231/vt8231_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/via/vt8231/vt8231_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -131,6 +131,24 @@
rtc_init(0);
}
+void vt8231_read_resources(device_t dev)
+{
+ struct resource *res;
+
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
static void southbridge_init(struct device *dev)
{
vt8231_init(dev);
@@ -138,7 +156,7 @@
}
static struct device_operations vt8231_lpc_ops = {
- .read_resources = pci_dev_read_resources,
+ .read_resources = vt8231_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = pci_dev_enable_resources,
.init = &southbridge_init,
Modified: trunk/coreboot-v2/src/southbridge/via/vt8235/vt8235_lpc.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/via/vt8235/vt8235_lpc.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/via/vt8235/vt8235_lpc.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -219,15 +219,22 @@
device has a resource to set - so set a dummy one */
void vt8235_read_resources(device_t dev)
{
+ struct resource *res;
- struct resource *resource;
pci_dev_read_resources(dev);
- resource = new_resource(dev, 1);
- resource->flags |= IORESOURCE_FIXED | IORESOURCE_ASSIGNED |
IORESOURCE_IO | IORESOURCE_STORED;
- resource->size = 2;
- resource->base = 0x2e;
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
}
+
void vt8235_set_resources(device_t dev)
{
struct resource *resource;
Modified: trunk/coreboot-v2/src/southbridge/winbond/w83c553/w83c553f.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/winbond/w83c553/w83c553f.c
2009-07-02 18:27:02 UTC (rev 4393)
+++ trunk/coreboot-v2/src/southbridge/winbond/w83c553/w83c553f.c
2009-07-02 18:56:24 UTC (rev 4394)
@@ -188,8 +188,26 @@
enable_childrens_resources(dev);
}
+static void w83c553_read_resources(device_t dev)
+{
+ struct resource* res;
+
+ pci_dev_read_resources(dev);
+
+ res = new_resource(dev, 1);
+ res->base = 0x0UL;
+ res->size = 0x400UL;
+ res->limit = 0xffffUL;
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+
+ res = new_resource(dev, 3); /* IOAPIC */
+ res->base = 0xfec00000;
+ res->size = 0x00001000;
+ res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED |
IORESOURCE_FIXED;
+}
+
static struct device_operations w83c553_ops = {
- .read_resources = pci_dev_read_resources,
+ .read_resources = w83c553_read_resources,
.set_resources = pci_dev_set_resources,
.enable_resources = w83c553_enable_resources,
.init = w83c553_init,
--
coreboot mailing list: coreboot@coreboot.org
http://www.coreboot.org/mailman/listinfo/coreboot
Bao, Zheng wrote:
This patch makes my AMD fam10 board not work (K8 works). The resource can not be allocated correctly.
Thanks for the report! Could you send debug output from the Fam10 system? //Peter
4392 is good. 4395 is not good. I don't exactly which patch causes this problem. Zheng -----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-bounces@coreboot.org] On Behalf Of Peter Stuge Sent: Saturday, July 04, 2009 2:31 AM To: coreboot@coreboot.org Subject: Re: [coreboot] [v2] r4394 - intrunk/coreboot-v2/src: cpu/amd/sc520cpu/emulation/qemu-x86cpu/ppc/ppc4xxdevices include/devicenorthbridge/amd/amdfam10 northbridge/amd/amdk8northbridge/amd/gx1northbridge/amd/gx2 northbridge/amd/lxnorthbridge/ibm/cpc710 n Bao, Zheng wrote:
This patch makes my AMD fam10 board not work (K8 works). The resource can not be allocated correctly.
Thanks for the report! Could you send debug output from the Fam10 system? //Peter -- coreboot mailing list: coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
On Mon, Jul 06, 2009 at 10:36:29AM +0800, Bao, Zheng wrote:
4392 is good. 4395 is not good. I don't exactly which patch causes this problem.
It's probably r4394, I'm seeing issues with that patch too, see http://www.coreboot.org/pipermail/coreboot/2009-July/050486.html Uwe. -- http://www.hermann-uwe.de | http://www.holsham-traders.de http://www.crazy-hacks.org | http://www.unmaintained-free-software.org
On Sun, Jul 5, 2009 at 8:36 PM, Bao, Zheng <Zheng.Bao@amd.com> wrote:
4392 is good. 4395 is not good. I don't exactly which patch causes this problem.
Thanks for testing. I'm sorry it broke. It looks like I forgot to add IORESOURCE_BRIDGE for the fam10 resources, so they get skipped by the allocator. Could you try this patch? Signed-off-by: Myles Watson <mylesgw@gmail.com> Thanks, Myles
I tested this patch. The resource can be allocated. But the kernel can not go. After the "Jumping to entry point...", nothing comes out. I don't know the cause. Do you know? Zheng ________________________________________ From: Myles Watson [mailto:mylesgw@gmail.com] Sent: Monday, July 06, 2009 9:48 PM To: Bao, Zheng Cc: coreboot@coreboot.org Subject: Re: [coreboot] fam10 resource can not allocated. On Sun, Jul 5, 2009 at 8:36 PM, Bao, Zheng <Zheng.Bao@amd.com> wrote: 4392 is good. 4395 is not good. I don't exactly which patch causes this problem. Thanks for testing. I'm sorry it broke. It looks like I forgot to add IORESOURCE_BRIDGE for the fam10 resources, so they get skipped by the allocator. Could you try this patch? Signed-off-by: Myles Watson <mylesgw@gmail.com> Thanks, Myles
I tested this patch. The resource can be allocated. But the kernel can not go. After the "Jumping to entry point...", nothing comes out. I don't know the cause. Do you know?
I guess fam10 code allocates a separate register for prefetchable memory. K8 doesn't. Since I didn't add IORESOURCE_BRIDGE to the prefetchable resource, anything prefetchable didn't get allocated (look for ERROR: ... not assigned messages) Here's an updated patch. Thanks for testing. Signed-off-by: Myles Watson <mylesgw@gmail.com> The last piece of the patch isn't necessary, but it would be nice to unify the K8 and fam10 code more than they are. Thanks, Myles
The patch has been tested and passed on fam10 board. I added an acked-by line to it, but I didn't review it. I didn't trace what happened in these patches and don't know what they mean. I just tested it. If it is appropriate, Acked-by: Zheng Bao <zheng.bao@amd.com> Zheng -----Original Message----- From: Myles Watson [mailto:mylesgw@gmail.com] Sent: Tuesday, July 07, 2009 12:44 PM To: Bao, Zheng Cc: coreboot@coreboot.org Subject: RE: [coreboot] fam10 resource can not allocated.
I tested this patch. The resource can be allocated. But the kernel can not go. After the "Jumping to entry point...", nothing comes out. I don't know the cause. Do you know?
I guess fam10 code allocates a separate register for prefetchable memory. K8 doesn't. Since I didn't add IORESOURCE_BRIDGE to the prefetchable resource, anything prefetchable didn't get allocated (look for ERROR: ... not assigned messages) Here's an updated patch. Thanks for testing. Signed-off-by: Myles Watson <mylesgw@gmail.com> The last piece of the patch isn't necessary, but it would be nice to unify the K8 and fam10 code more than they are. Thanks, Myles
The patch has been tested and passed on fam10 board. I added an acked-by line to it, but I didn't review it. I didn't trace what happened in these patches and don't know what they mean. I just tested it. If it is appropriate,
Acked-by: Zheng Bao <zheng.bao@amd.com>
Since it was a simple patch and it fixed the problem, I'll take it :) The IORESOURCE_BRIDGE flag helps the allocator know which resources belong to bridges. Rev 4403. Thanks, Myles
hi Ref: files posted by Bao, Zheng In file dmesg_r4392.log: line 2079 reads "menu: hda1:/etc/grub.conf" line 2080 has 2,000 characters of whitespace followed by text which starts with "scanning for" In file patch_applied.log: line 1927 reads "menu: hda1:/etc/grub.conf" line 1928 (last line) has 2,001 characters of whitespace followed by text which starts with "IDE" I think all that whitespace is a bug. Russ
On 08.07.2009 03:06, Russell Whitaker wrote:
In file dmesg_r4392.log:
line 2079 reads "menu: hda1:/etc/grub.conf" line 2080 has 2,000 characters of whitespace followed by text which starts with "scanning for" [...]
I think all that whitespace is a bug.
Actually, if you think about screen size and grub menu, it is pretty obvious that it is not a bug. Maybe not extremely efficient, but 2000 characters are exactly what fits on a 80x25 screen, so this is nothing but clearing the screen by writing spaces to it. Regards, Carl-Daniel -- http://www.hailfinger.org/
On Wed, 8 Jul 2009, Carl-Daniel Hailfinger wrote:
On 08.07.2009 03:06, Russell Whitaker wrote:
In file dmesg_r4392.log:
line 2079 reads "menu: hda1:/etc/grub.conf" line 2080 has 2,000 characters of whitespace followed by text which starts with "scanning for" [...]
I think all that whitespace is a bug.
Actually, if you think about screen size and grub menu, it is pretty obvious that it is not a bug. Maybe not extremely efficient, but 2000 characters are exactly what fits on a 80x25 screen, so this is nothing but clearing the screen by writing spaces to it.
If the program writing the display does not word-wrap at the edge of the screen then some data just disappears. I'll still call it a bug: there should be a "newline" at the end of the 2000 characters to ensure the data that follows the 2000 characters is on-screen. Russ
Russell Whitaker wrote:
If the program writing the display does not word-wrap at the edge of the screen then some data just disappears.
Doesn't that depend on the console driver? //Peter
On 08.07.2009, at 03:06, Russell Whitaker <russ@ashlandhome.net> wrote:
hi
Ref: files posted by Bao, Zheng
In file dmesg_r4392.log:
line 2079 reads "menu: hda1:/etc/grub.conf" line 2080 has 2,000 characters of whitespace followed by text which starts with "scanning for"
In file patch_applied.log:
line 1927 reads "menu: hda1:/etc/grub.conf" line 1928 (last line) has 2,001 characters of whitespace followed by text which starts with "IDE"
I think all that whitespace is a bug.
Russ
The whitespace is caused by "tinycurses" from libpayload. Not sure there is much we can do about it.. If you have a patch to fix the issue it will surely make many people happy. Stefan
participants (7)
-
Bao, Zheng -
Carl-Daniel Hailfinger -
Myles Watson -
Peter Stuge -
Russell Whitaker -
Stefan Reinauer -
Uwe Hermann