Trivial white space fixes so that the next patches are easier to read.
Signed-off-by: Myles Watson <mylesgw@gmail.com> Acked-by: Myles Watson <mylesgw@gmail.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4268 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
7c29dada3e
commit
032a9653a6
|
@ -83,16 +83,16 @@ static void pci_domain_set_resources(device_t dev)
|
||||||
for(rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) {
|
for(rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) {
|
||||||
unsigned char reg;
|
unsigned char reg;
|
||||||
reg = pci_read_config8(mc_dev, ramregs[i]);
|
reg = pci_read_config8(mc_dev, ramregs[i]);
|
||||||
/* these are ENDING addresses, not sizes.
|
/* these are ENDING addresses, not sizes.
|
||||||
* if there is memory in this slot, then reg will be > rambits.
|
* if there is memory in this slot, then reg will be > rambits.
|
||||||
* So we just take the max, that gives us total.
|
* So we just take the max, that gives us total.
|
||||||
* We take the highest one to cover for once and future coreboot
|
* We take the highest one to cover for once and future coreboot
|
||||||
* bugs. We warn about bugs.
|
* bugs. We warn about bugs.
|
||||||
*/
|
*/
|
||||||
if (reg > rambits)
|
if (reg > rambits)
|
||||||
rambits = reg;
|
rambits = reg;
|
||||||
if (reg < rambits)
|
if (reg < rambits)
|
||||||
printk_err("ERROR! register 0x%x is not set!\n",
|
printk_err("ERROR! register 0x%x is not set!\n",
|
||||||
ramregs[i]);
|
ramregs[i]);
|
||||||
}
|
}
|
||||||
if (rambits == 0) {
|
if (rambits == 0) {
|
||||||
|
@ -104,11 +104,11 @@ static void pci_domain_set_resources(device_t dev)
|
||||||
/* Compute the top of Low memory */
|
/* Compute the top of Low memory */
|
||||||
tolmk = pci_tolm >> 10;
|
tolmk = pci_tolm >> 10;
|
||||||
if (tolmk >= tomk) {
|
if (tolmk >= tomk) {
|
||||||
/* The PCI hole does not overlap memory.
|
/* The PCI hole does not overlap the memory. */
|
||||||
*/
|
|
||||||
tolmk = tomk;
|
tolmk = tomk;
|
||||||
}
|
}
|
||||||
/* Report the memory regions */
|
|
||||||
|
/* Report the memory regions. */
|
||||||
idx = 10;
|
idx = 10;
|
||||||
ram_resource(dev, idx++, 0, tolmk);
|
ram_resource(dev, idx++, 0, tolmk);
|
||||||
}
|
}
|
||||||
|
@ -122,12 +122,12 @@ static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device_operations pci_domain_ops = {
|
static struct device_operations pci_domain_ops = {
|
||||||
.read_resources = pci_domain_read_resources,
|
.read_resources = pci_domain_read_resources,
|
||||||
.set_resources = pci_domain_set_resources,
|
.set_resources = pci_domain_set_resources,
|
||||||
.enable_resources = enable_childrens_resources,
|
.enable_resources = enable_childrens_resources,
|
||||||
.init = 0,
|
.init = 0,
|
||||||
.scan_bus = pci_domain_scan_bus,
|
.scan_bus = pci_domain_scan_bus,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void enable_dev(struct device *dev)
|
static void enable_dev(struct device *dev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,10 +17,10 @@
|
||||||
/*
|
/*
|
||||||
* (c) 1999--2000 Martin Mares <mj@suse.cz>
|
* (c) 1999--2000 Martin Mares <mj@suse.cz>
|
||||||
*/
|
*/
|
||||||
/* lots of mods by ron minnich (rminnich@lanl.gov), with
|
/* lots of mods by ron minnich (rminnich@lanl.gov), with
|
||||||
* the final architecture guidance from Tom Merritt (tjm@codegen.com)
|
* the final architecture guidance from Tom Merritt (tjm@codegen.com)
|
||||||
* In particular, we changed from the one-pass original version to
|
* In particular, we changed from the one-pass original version to
|
||||||
* Tom's recommended multiple-pass version. I wasn't sure about doing
|
* Tom's recommended multiple-pass version. I wasn't sure about doing
|
||||||
* it with multiple passes, until I actually started doing it and saw
|
* it with multiple passes, until I actually started doing it and saw
|
||||||
* the wisdom of Tom's recommendations ...
|
* the wisdom of Tom's recommendations ...
|
||||||
*
|
*
|
||||||
|
@ -52,7 +52,7 @@ extern struct device **last_dev_p;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a new device structure.
|
* @brief Allocate a new device structure.
|
||||||
*
|
*
|
||||||
* Allocte a new device structure and attached it to the device tree as a
|
* Allocte a new device structure and attached it to the device tree as a
|
||||||
* child of the parent bus.
|
* child of the parent bus.
|
||||||
*
|
*
|
||||||
|
@ -69,7 +69,7 @@ device_t alloc_dev(struct bus *parent, struct device_path *path)
|
||||||
device_t dev, child;
|
device_t dev, child;
|
||||||
int link;
|
int link;
|
||||||
|
|
||||||
spin_lock(&dev_lock);
|
spin_lock(&dev_lock);
|
||||||
|
|
||||||
/* Find the last child of our parent */
|
/* Find the last child of our parent */
|
||||||
for(child = parent->children; child && child->sibling; ) {
|
for(child = parent->children; child && child->sibling; ) {
|
||||||
|
@ -111,7 +111,7 @@ device_t alloc_dev(struct bus *parent, struct device_path *path)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief round a number up to an alignment.
|
* @brief round a number up to an alignment.
|
||||||
* @param val the starting value
|
* @param val the starting value
|
||||||
* @param roundup Alignment as a power of two
|
* @param roundup Alignment as a power of two
|
||||||
* @returns rounded up number
|
* @returns rounded up number
|
||||||
|
@ -158,7 +158,7 @@ static void read_resources(struct bus *bus)
|
||||||
struct resource *resource;
|
struct resource *resource;
|
||||||
unsigned link;
|
unsigned link;
|
||||||
resource = &curdev->resource[i];
|
resource = &curdev->resource[i];
|
||||||
if (!(resource->flags & IORESOURCE_SUBTRACTIVE))
|
if (!(resource->flags & IORESOURCE_SUBTRACTIVE))
|
||||||
continue;
|
continue;
|
||||||
link = IOINDEX_SUBTRACTIVE_LINK(resource->index);
|
link = IOINDEX_SUBTRACTIVE_LINK(resource->index);
|
||||||
if (link > MAX_LINKS) {
|
if (link > MAX_LINKS) {
|
||||||
|
@ -194,24 +194,23 @@ static void pick_largest_resource(void *gp,
|
||||||
state->seen_last = 1;
|
state->seen_last = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (resource->flags & IORESOURCE_FIXED ) return; //skip it
|
if (resource->flags & IORESOURCE_FIXED)
|
||||||
if (last && (
|
return; // Skip it.
|
||||||
(last->align < resource->align) ||
|
if (last && ((last->align < resource->align) ||
|
||||||
((last->align == resource->align) &&
|
((last->align == resource->align) &&
|
||||||
(last->size < resource->size)) ||
|
(last->size < resource->size)) ||
|
||||||
((last->align == resource->align) &&
|
((last->align == resource->align) &&
|
||||||
(last->size == resource->size) &&
|
(last->size == resource->size) && (!state->seen_last)))) {
|
||||||
(!state->seen_last)))) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!state->result ||
|
if (!state->result ||
|
||||||
(state->result->align < resource->align) ||
|
(state->result->align < resource->align) ||
|
||||||
((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_dev = dev;
|
||||||
state->result = resource;
|
state->result = resource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device *largest_resource(struct bus *bus, struct resource **result_res,
|
static struct device *largest_resource(struct bus *bus, struct resource **result_res,
|
||||||
|
@ -224,14 +223,15 @@ static struct device *largest_resource(struct bus *bus, struct resource **result
|
||||||
state.result = 0;
|
state.result = 0;
|
||||||
state.seen_last = 0;
|
state.seen_last = 0;
|
||||||
|
|
||||||
search_bus_resources(bus, type_mask, type, pick_largest_resource, &state);
|
search_bus_resources(bus, type_mask, type, pick_largest_resource,
|
||||||
|
&state);
|
||||||
|
|
||||||
*result_res = state.result;
|
*result_res = state.result;
|
||||||
return state.result_dev;
|
return state.result_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute allocate resources is the guts of the resource allocator.
|
/* Compute allocate resources is the guts of the resource allocator.
|
||||||
*
|
*
|
||||||
* The problem.
|
* The problem.
|
||||||
* - Allocate resources locations for every device.
|
* - Allocate resources locations for every device.
|
||||||
* - Don't overlap, and follow the rules of bridges.
|
* - Don't overlap, and follow the rules of bridges.
|
||||||
|
@ -253,7 +253,7 @@ static struct device *largest_resource(struct bus *bus, struct resource **result
|
||||||
* bridges. The first to see how large the resources are behind
|
* bridges. The first to see how large the resources are behind
|
||||||
* the bridge, and what their alignment requirements are. The
|
* the bridge, and what their alignment requirements are. The
|
||||||
* second to assign a safe address to the devices behind 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
|
* 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
|
* a couple of resources, and not need to special case it in the
|
||||||
* allocator. Also this allows handling of other types of bridges.
|
* allocator. Also this allows handling of other types of bridges.
|
||||||
*
|
*
|
||||||
|
@ -272,7 +272,7 @@ void compute_allocate_resource(
|
||||||
min_align = 0;
|
min_align = 0;
|
||||||
base = bridge->base;
|
base = bridge->base;
|
||||||
|
|
||||||
printk_spew("%s compute_allocate_resource %s: base: %08Lx size: %08Lx align: %d gran: %d\n",
|
printk_spew("%s compute_allocate_resource %s: base: %08Lx size: %08Lx align: %d gran: %d\n",
|
||||||
dev_path(bus->dev),
|
dev_path(bus->dev),
|
||||||
(bridge->flags & IORESOURCE_IO)? "io":
|
(bridge->flags & IORESOURCE_IO)? "io":
|
||||||
(bridge->flags & IORESOURCE_PREFETCH)? "prefmem" : "mem",
|
(bridge->flags & IORESOURCE_PREFETCH)? "prefmem" : "mem",
|
||||||
|
@ -295,7 +295,7 @@ void compute_allocate_resource(
|
||||||
/* Remember I haven't found anything yet. */
|
/* Remember I haven't found anything yet. */
|
||||||
resource = 0;
|
resource = 0;
|
||||||
|
|
||||||
/* Walk through all the devices on the current bus and
|
/* Walk through all the devices on the current bus and
|
||||||
* compute the addresses.
|
* compute the addresses.
|
||||||
*/
|
*/
|
||||||
while((dev = largest_resource(bus, &resource, type_mask, type))) {
|
while((dev = largest_resource(bus, &resource, type_mask, type))) {
|
||||||
|
@ -356,11 +356,11 @@ void compute_allocate_resource(
|
||||||
resource->flags |= IORESOURCE_ASSIGNED;
|
resource->flags |= IORESOURCE_ASSIGNED;
|
||||||
resource->flags &= ~IORESOURCE_STORED;
|
resource->flags &= ~IORESOURCE_STORED;
|
||||||
base += size;
|
base += size;
|
||||||
|
|
||||||
printk_spew("%s %02lx * [0x%08Lx - 0x%08Lx] %s\n",
|
printk_spew("%s %02lx * [0x%08Lx - 0x%08Lx] %s\n",
|
||||||
dev_path(dev),
|
dev_path(dev),
|
||||||
resource->index,
|
resource->index,
|
||||||
resource->base,
|
resource->base,
|
||||||
resource->base + resource->size - 1,
|
resource->base + resource->size - 1,
|
||||||
(resource->flags & IORESOURCE_IO)? "io":
|
(resource->flags & IORESOURCE_IO)? "io":
|
||||||
(resource->flags & IORESOURCE_PREFETCH)? "prefmem": "mem");
|
(resource->flags & IORESOURCE_PREFETCH)? "prefmem": "mem");
|
||||||
|
@ -380,13 +380,11 @@ void compute_allocate_resource(
|
||||||
*/
|
*/
|
||||||
bridge->size = round(base, bridge->gran) - bridge->base;
|
bridge->size = round(base, bridge->gran) - bridge->base;
|
||||||
|
|
||||||
printk_spew("%s compute_allocate_resource %s: base: %08Lx size: %08Lx align: %d gran: %d done\n",
|
printk_spew("%s compute_allocate_resource %s: base: %08Lx size: %08Lx align: %d gran: %d done\n",
|
||||||
dev_path(bus->dev),
|
dev_path(bus->dev),
|
||||||
(bridge->flags & IORESOURCE_IO)? "io":
|
(bridge->flags & IORESOURCE_IO)? "io":
|
||||||
(bridge->flags & IORESOURCE_PREFETCH)? "prefmem" : "mem",
|
(bridge->flags & IORESOURCE_PREFETCH)? "prefmem" : "mem",
|
||||||
base, bridge->size, bridge->align, bridge->gran);
|
base, bridge->size, bridge->align, bridge->gran);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_CONSOLE_VGA == 1
|
#if CONFIG_CONSOLE_VGA == 1
|
||||||
|
@ -407,7 +405,7 @@ static void allocate_vga_resource(void)
|
||||||
for(dev = all_devices; dev; dev = dev->next) {
|
for(dev = all_devices; dev; dev = dev->next) {
|
||||||
if (!dev->enabled) continue;
|
if (!dev->enabled) continue;
|
||||||
if (((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) &&
|
if (((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) &&
|
||||||
((dev->class >> 8) != PCI_CLASS_DISPLAY_OTHER))
|
((dev->class >> 8) != PCI_CLASS_DISPLAY_OTHER))
|
||||||
{
|
{
|
||||||
if (!vga_first) {
|
if (!vga_first) {
|
||||||
if (dev->on_mainboard) {
|
if (dev->on_mainboard) {
|
||||||
|
@ -427,7 +425,7 @@ static void allocate_vga_resource(void)
|
||||||
dev->command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
|
dev->command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vga = vga_last;
|
vga = vga_last;
|
||||||
|
|
||||||
if(!vga) {
|
if(!vga) {
|
||||||
|
@ -443,7 +441,7 @@ static void allocate_vga_resource(void)
|
||||||
vga = vga_onboard;
|
vga = vga_onboard;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (vga) {
|
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));
|
printk_debug("Allocating VGA resource %s\n", dev_path(vga));
|
||||||
|
@ -458,7 +456,7 @@ static void allocate_vga_resource(void)
|
||||||
dev_path(bus->dev));
|
dev_path(bus->dev));
|
||||||
bus->bridge_ctrl |= PCI_BRIDGE_CTL_VGA;
|
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
|
#endif
|
||||||
|
@ -481,7 +479,7 @@ void assign_resources(struct bus *bus)
|
||||||
{
|
{
|
||||||
struct device *curdev;
|
struct device *curdev;
|
||||||
|
|
||||||
printk_spew("%s assign_resources, bus %d link: %d\n",
|
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) {
|
||||||
|
@ -495,7 +493,7 @@ void assign_resources(struct bus *bus)
|
||||||
}
|
}
|
||||||
curdev->ops->set_resources(curdev);
|
curdev->ops->set_resources(curdev);
|
||||||
}
|
}
|
||||||
printk_spew("%s assign_resources, bus %d link: %d\n",
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,7 +527,7 @@ void enable_resources(struct device *dev)
|
||||||
dev->ops->enable_resources(dev);
|
dev->ops->enable_resources(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Reset all of the devices a bus
|
* @brief Reset all of the devices a bus
|
||||||
*
|
*
|
||||||
* Reset all of the devices on a bus and clear the bus's reset_needed flag.
|
* Reset all of the devices on a bus and clear the bus's reset_needed flag.
|
||||||
|
@ -550,11 +548,11 @@ int reset_bus(struct bus *bus)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Scan for devices on a bus.
|
* @brief Scan for devices on a bus.
|
||||||
*
|
*
|
||||||
* If there are bridges on the bus, recursively scan the buses behind the bridges.
|
* 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,
|
* If the setting up and tuning of the bus causes a reset to be required,
|
||||||
* reset the bus and scan it again.
|
* reset the bus and scan it again.
|
||||||
*
|
*
|
||||||
* @param bus pointer to the bus device
|
* @param bus pointer to the bus device
|
||||||
|
@ -612,7 +610,7 @@ unsigned int scan_bus(device_t bus, unsigned int max)
|
||||||
* This function has no idea how to scan and probe buses and devices at all.
|
* This function has no idea how to scan and probe buses and devices at all.
|
||||||
* It depends on the bus/device specific scan_bus() method to do it. The
|
* It depends on the bus/device specific scan_bus() method to do it. The
|
||||||
* scan_bus() method also has to create the device structure and attach
|
* scan_bus() method also has to create the device structure and attach
|
||||||
* it to the device tree.
|
* it to the device tree.
|
||||||
*/
|
*/
|
||||||
void dev_enumerate(void)
|
void dev_enumerate(void)
|
||||||
{
|
{
|
||||||
|
@ -633,7 +631,7 @@ void dev_enumerate(void)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configure devices on the devices tree.
|
* @brief Configure devices on the devices tree.
|
||||||
*
|
*
|
||||||
* Starting at the root of the device tree, travel it recursively in two
|
* Starting at the root of the device tree, travel it recursively in two
|
||||||
* passes. In the first pass, we compute and allocate resources (ranges)
|
* passes. In the first pass, we compute and allocate resources (ranges)
|
||||||
* requried by each device. In the second pass, the resources ranges are
|
* requried by each device. In the second pass, the resources ranges are
|
||||||
|
@ -643,7 +641,7 @@ void dev_enumerate(void)
|
||||||
* at DEVICE_MEM_HIGH and grow downward.
|
* at DEVICE_MEM_HIGH and grow downward.
|
||||||
*
|
*
|
||||||
* Since the assignment is hierarchical we set the values into the dev_root
|
* Since the assignment is hierarchical we set the values into the dev_root
|
||||||
* struct.
|
* struct.
|
||||||
*/
|
*/
|
||||||
void dev_configure(void)
|
void dev_configure(void)
|
||||||
{
|
{
|
||||||
|
@ -682,7 +680,7 @@ void dev_configure(void)
|
||||||
|
|
||||||
#if CONFIG_CONSOLE_VGA == 1
|
#if CONFIG_CONSOLE_VGA == 1
|
||||||
/* Allocate the VGA I/O resource.. */
|
/* Allocate the VGA I/O resource.. */
|
||||||
allocate_vga_resource();
|
allocate_vga_resource();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Store the computed resource allocations into device registers ... */
|
/* Store the computed resource allocations into device registers ... */
|
||||||
|
@ -726,8 +724,8 @@ void dev_initialize(void)
|
||||||
|
|
||||||
printk_info("Initializing devices...\n");
|
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 &&
|
if (dev->enabled && !dev->initialized &&
|
||||||
dev->ops && dev->ops->init)
|
dev->ops && dev->ops->init)
|
||||||
{
|
{
|
||||||
if (dev->path.type == DEVICE_PATH_I2C) {
|
if (dev->path.type == DEVICE_PATH_I2C) {
|
||||||
printk_debug("smbus: %s[%d]->",
|
printk_debug("smbus: %s[%d]->",
|
||||||
|
|
|
@ -55,7 +55,7 @@ uint8_t pci_moving_config8(struct device *dev, unsigned reg)
|
||||||
{
|
{
|
||||||
uint8_t value, ones, zeroes;
|
uint8_t value, ones, zeroes;
|
||||||
value = pci_read_config8(dev, reg);
|
value = pci_read_config8(dev, reg);
|
||||||
|
|
||||||
pci_write_config8(dev, reg, 0xff);
|
pci_write_config8(dev, reg, 0xff);
|
||||||
ones = pci_read_config8(dev, reg);
|
ones = pci_read_config8(dev, reg);
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ uint16_t pci_moving_config16(struct device *dev, unsigned reg)
|
||||||
{
|
{
|
||||||
uint16_t value, ones, zeroes;
|
uint16_t value, ones, zeroes;
|
||||||
value = pci_read_config16(dev, reg);
|
value = pci_read_config16(dev, reg);
|
||||||
|
|
||||||
pci_write_config16(dev, reg, 0xffff);
|
pci_write_config16(dev, reg, 0xffff);
|
||||||
ones = pci_read_config16(dev, reg);
|
ones = pci_read_config16(dev, reg);
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ uint32_t pci_moving_config32(struct device *dev, unsigned reg)
|
||||||
{
|
{
|
||||||
uint32_t value, ones, zeroes;
|
uint32_t value, ones, zeroes;
|
||||||
value = pci_read_config32(dev, reg);
|
value = pci_read_config32(dev, reg);
|
||||||
|
|
||||||
pci_write_config32(dev, reg, 0xffffffff);
|
pci_write_config32(dev, reg, 0xffffffff);
|
||||||
ones = pci_read_config32(dev, reg);
|
ones = pci_read_config32(dev, reg);
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ unsigned pci_find_capability(device_t dev, unsigned cap)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Given a device and register, read the size of the BAR for that register.
|
/** Given a device and register, read the size of the BAR for that register.
|
||||||
* @param dev Pointer to the device structure
|
* @param dev Pointer to the device structure
|
||||||
* @param resource Pointer to the resource structure
|
* @param resource Pointer to the resource structure
|
||||||
* @param index Address of the pci configuration register
|
* @param index Address of the pci configuration register
|
||||||
|
@ -176,7 +176,7 @@ struct resource *pci_get_resource(struct device *dev, unsigned long index)
|
||||||
/* Find the high bits that move */
|
/* Find the high bits that move */
|
||||||
moving |= ((resource_t)pci_moving_config32(dev, index + 4)) << 32;
|
moving |= ((resource_t)pci_moving_config32(dev, index + 4)) << 32;
|
||||||
}
|
}
|
||||||
/* Find the resource constraints.
|
/* Find the resource constraints.
|
||||||
*
|
*
|
||||||
* Start by finding the bits that move. From there:
|
* Start by finding the bits that move. From there:
|
||||||
* - Size is the least significant bit of the bits that move.
|
* - Size is the least significant bit of the bits that move.
|
||||||
|
@ -195,12 +195,12 @@ struct resource *pci_get_resource(struct device *dev, unsigned long index)
|
||||||
resource->limit = limit = moving | (resource->size - 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.
|
* 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
|
* so BAR1 at offset 0x10 reads 0x1f1. If you size that register
|
||||||
* by writing 0xffffffff to it, it will read back as 0x1f1 -- a
|
* by writing 0xffffffff to it, it will read back as 0x1f1 -- a
|
||||||
* violation of the spec.
|
* violation of the spec.
|
||||||
* We catch this case and ignore it by observing which bits move,
|
* We catch this case and ignore it by observing which bits move,
|
||||||
* This also catches the common case unimplemented registers
|
* This also catches the common case unimplemented registers
|
||||||
* that always read back as 0.
|
* that always read back as 0.
|
||||||
|
@ -219,7 +219,7 @@ struct resource *pci_get_resource(struct device *dev, unsigned long index)
|
||||||
resource->flags |= IORESOURCE_IO;
|
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;
|
resource->limit = 0xffff;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* A Memory mapped base address */
|
/* A Memory mapped base address */
|
||||||
attr &= PCI_BASE_ADDRESS_MEM_ATTR_MASK;
|
attr &= PCI_BASE_ADDRESS_MEM_ATTR_MASK;
|
||||||
|
@ -290,7 +290,7 @@ static void pci_get_rom_resource(struct device *dev, unsigned long index)
|
||||||
/* clear the Enable bit */
|
/* clear the Enable bit */
|
||||||
moving = moving & ~PCI_ROM_ADDRESS_ENABLE;
|
moving = moving & ~PCI_ROM_ADDRESS_ENABLE;
|
||||||
|
|
||||||
/* Find the resource constraints.
|
/* Find the resource constraints.
|
||||||
*
|
*
|
||||||
* Start by finding the bits that move. From there:
|
* Start by finding the bits that move. From there:
|
||||||
* - Size is the least significant bit of the bits that move.
|
* - Size is the least significant bit of the bits that move.
|
||||||
|
@ -325,12 +325,12 @@ static void pci_get_rom_resource(struct device *dev, unsigned long index)
|
||||||
resource->base = dev->rom_address;
|
resource->base = dev->rom_address;
|
||||||
resource->flags |= IORESOURCE_MEM | IORESOURCE_READONLY |
|
resource->flags |= IORESOURCE_MEM | IORESOURCE_READONLY |
|
||||||
IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
|
IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
|
||||||
}
|
}
|
||||||
|
|
||||||
compact_resources(dev);
|
compact_resources(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the base address registers for a given device.
|
/** Read the base address registers for a given device.
|
||||||
* @param dev Pointer to the dev structure
|
* @param dev Pointer to the dev structure
|
||||||
* @param howmany How many registers to read (6 for device, 2 for bridge)
|
* @param howmany How many registers to read (6 for device, 2 for bridge)
|
||||||
*/
|
*/
|
||||||
|
@ -405,7 +405,7 @@ static void pci_bridge_read_bases(struct device *dev)
|
||||||
|
|
||||||
/* Initialize the io space constraints on the current bus */
|
/* Initialize the io space constraints on the current bus */
|
||||||
pci_record_bridge_resource(
|
pci_record_bridge_resource(
|
||||||
dev, moving, PCI_IO_BASE,
|
dev, moving, PCI_IO_BASE,
|
||||||
IORESOURCE_IO, IORESOURCE_IO);
|
IORESOURCE_IO, IORESOURCE_IO);
|
||||||
|
|
||||||
|
|
||||||
|
@ -415,14 +415,14 @@ static void pci_bridge_read_bases(struct device *dev)
|
||||||
|
|
||||||
moving_limit = ((resource_t)pci_moving_config16(dev, PCI_PREF_MEMORY_LIMIT)) << 16;
|
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_config32(dev, PCI_PREF_LIMIT_UPPER32)) << 32;
|
||||||
|
|
||||||
moving = moving_base & moving_limit;
|
moving = moving_base & moving_limit;
|
||||||
/* Initiliaze the prefetchable memory constraints on the current bus */
|
/* Initiliaze the prefetchable memory constraints on the current bus */
|
||||||
pci_record_bridge_resource(
|
pci_record_bridge_resource(
|
||||||
dev, moving, PCI_PREF_MEMORY_BASE,
|
dev, moving, PCI_PREF_MEMORY_BASE,
|
||||||
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
||||||
IORESOURCE_MEM | IORESOURCE_PREFETCH);
|
IORESOURCE_MEM | IORESOURCE_PREFETCH);
|
||||||
|
|
||||||
|
|
||||||
/* See if the bridge mem resources are implemented */
|
/* See if the bridge mem resources are implemented */
|
||||||
moving_base = ((uint32_t)pci_moving_config16(dev, PCI_MEMORY_BASE)) << 16;
|
moving_base = ((uint32_t)pci_moving_config16(dev, PCI_MEMORY_BASE)) << 16;
|
||||||
|
@ -432,7 +432,7 @@ static void pci_bridge_read_bases(struct device *dev)
|
||||||
|
|
||||||
/* Initialize the memory resources on the current bus */
|
/* Initialize the memory resources on the current bus */
|
||||||
pci_record_bridge_resource(
|
pci_record_bridge_resource(
|
||||||
dev, moving, PCI_MEMORY_BASE,
|
dev, moving, PCI_MEMORY_BASE,
|
||||||
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
||||||
IORESOURCE_MEM);
|
IORESOURCE_MEM);
|
||||||
|
|
||||||
|
@ -496,13 +496,13 @@ static void pci_set_resource(struct device *dev, struct resource *resource)
|
||||||
|
|
||||||
/* Get the end */
|
/* Get the end */
|
||||||
end = resource_end(resource);
|
end = resource_end(resource);
|
||||||
|
|
||||||
/* Now store the resource */
|
/* Now store the resource */
|
||||||
resource->flags |= IORESOURCE_STORED;
|
resource->flags |= IORESOURCE_STORED;
|
||||||
if (!(resource->flags & IORESOURCE_PCI_BRIDGE)) {
|
if (!(resource->flags & IORESOURCE_PCI_BRIDGE)) {
|
||||||
unsigned long base_lo, base_hi;
|
unsigned long base_lo, base_hi;
|
||||||
/*
|
/*
|
||||||
* some chipsets allow us to set/clear the IO bit.
|
* some chipsets allow us to set/clear the IO bit.
|
||||||
* (e.g. VIA 82c686a.) So set it to be safe)
|
* (e.g. VIA 82c686a.) So set it to be safe)
|
||||||
*/
|
*/
|
||||||
base_lo = base & 0xffffffff;
|
base_lo = base & 0xffffffff;
|
||||||
|
@ -517,7 +517,7 @@ static void pci_set_resource(struct device *dev, struct resource *resource)
|
||||||
}
|
}
|
||||||
else if (resource->index == PCI_IO_BASE) {
|
else if (resource->index == PCI_IO_BASE) {
|
||||||
/* set the IO ranges */
|
/* set the IO ranges */
|
||||||
compute_allocate_resource(&dev->link[0], resource,
|
compute_allocate_resource(&dev->link[0], resource,
|
||||||
IORESOURCE_IO, IORESOURCE_IO);
|
IORESOURCE_IO, IORESOURCE_IO);
|
||||||
pci_write_config8(dev, PCI_IO_BASE, base >> 8);
|
pci_write_config8(dev, PCI_IO_BASE, base >> 8);
|
||||||
pci_write_config16(dev, PCI_IO_BASE_UPPER16, base >> 16);
|
pci_write_config16(dev, PCI_IO_BASE_UPPER16, base >> 16);
|
||||||
|
@ -527,7 +527,7 @@ static void pci_set_resource(struct device *dev, struct resource *resource)
|
||||||
else if (resource->index == PCI_MEMORY_BASE) {
|
else if (resource->index == PCI_MEMORY_BASE) {
|
||||||
/* set the memory range */
|
/* set the memory range */
|
||||||
compute_allocate_resource(&dev->link[0], resource,
|
compute_allocate_resource(&dev->link[0], resource,
|
||||||
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
||||||
IORESOURCE_MEM);
|
IORESOURCE_MEM);
|
||||||
pci_write_config16(dev, PCI_MEMORY_BASE, base >> 16);
|
pci_write_config16(dev, PCI_MEMORY_BASE, base >> 16);
|
||||||
pci_write_config16(dev, PCI_MEMORY_LIMIT, end >> 16);
|
pci_write_config16(dev, PCI_MEMORY_LIMIT, end >> 16);
|
||||||
|
@ -535,7 +535,7 @@ static void pci_set_resource(struct device *dev, struct resource *resource)
|
||||||
else if (resource->index == PCI_PREF_MEMORY_BASE) {
|
else if (resource->index == PCI_PREF_MEMORY_BASE) {
|
||||||
/* set the prefetchable memory range */
|
/* set the prefetchable memory range */
|
||||||
compute_allocate_resource(&dev->link[0], resource,
|
compute_allocate_resource(&dev->link[0], resource,
|
||||||
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
IORESOURCE_MEM | IORESOURCE_PREFETCH,
|
||||||
IORESOURCE_MEM | IORESOURCE_PREFETCH);
|
IORESOURCE_MEM | IORESOURCE_PREFETCH);
|
||||||
pci_write_config16(dev, PCI_PREF_MEMORY_BASE, base >> 16);
|
pci_write_config16(dev, PCI_PREF_MEMORY_BASE, base >> 16);
|
||||||
pci_write_config32(dev, PCI_PREF_BASE_UPPER32, base >> 32);
|
pci_write_config32(dev, PCI_PREF_BASE_UPPER32, base >> 32);
|
||||||
|
@ -597,10 +597,10 @@ void pci_dev_enable_resources(struct device *dev)
|
||||||
ops = ops_pci(dev);
|
ops = ops_pci(dev);
|
||||||
if (dev->on_mainboard && ops && ops->set_subsystem) {
|
if (dev->on_mainboard && ops && ops->set_subsystem) {
|
||||||
printk_debug("%s subsystem <- %02x/%02x\n",
|
printk_debug("%s subsystem <- %02x/%02x\n",
|
||||||
dev_path(dev),
|
dev_path(dev),
|
||||||
MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
|
MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
|
||||||
MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
|
MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
|
||||||
ops->set_subsystem(dev,
|
ops->set_subsystem(dev,
|
||||||
MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
|
MAINBOARD_PCI_SUBSYSTEM_VENDOR_ID,
|
||||||
MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
|
MAINBOARD_PCI_SUBSYSTEM_DEVICE_ID);
|
||||||
}
|
}
|
||||||
|
@ -642,7 +642,7 @@ void pci_bus_reset(struct bus *bus)
|
||||||
|
|
||||||
void pci_dev_set_subsystem(device_t dev, unsigned vendor, unsigned device)
|
void pci_dev_set_subsystem(device_t dev, unsigned vendor, unsigned device)
|
||||||
{
|
{
|
||||||
pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
|
pci_write_config32(dev, PCI_SUBSYSTEM_VENDOR_ID,
|
||||||
((device & 0xffff) << 16) | (vendor & 0xffff));
|
((device & 0xffff) << 16) | (vendor & 0xffff));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -722,12 +722,12 @@ struct device_operations default_pci_ops_bus = {
|
||||||
* to figure out the type of downstream bridge. PCI-X
|
* to figure out the type of downstream bridge. PCI-X
|
||||||
* PCI-E, and Hypertransport all seem to have appropriate
|
* PCI-E, and Hypertransport all seem to have appropriate
|
||||||
* capabilities.
|
* capabilities.
|
||||||
*
|
*
|
||||||
* When only a PCI-Express capability is found the type
|
* When only a PCI-Express capability is found the type
|
||||||
* is examined to see which type of bridge we have.
|
* is examined to see which type of bridge we have.
|
||||||
*
|
*
|
||||||
* @param dev
|
* @param dev
|
||||||
*
|
*
|
||||||
* @return appropriate bridge operations
|
* @return appropriate bridge operations
|
||||||
*/
|
*/
|
||||||
static struct device_operations *get_pci_bridge_ops(device_t dev)
|
static struct device_operations *get_pci_bridge_ops(device_t dev)
|
||||||
|
@ -751,7 +751,7 @@ static struct device_operations *get_pci_bridge_ops(device_t dev)
|
||||||
flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS);
|
flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS);
|
||||||
if ((flags >> 13) == 1) {
|
if ((flags >> 13) == 1) {
|
||||||
/* Host or Secondary Interface */
|
/* Host or Secondary Interface */
|
||||||
printk_debug("%s subbordinate bus Hypertransport\n",
|
printk_debug("%s subbordinate bus Hypertransport\n",
|
||||||
dev_path(dev));
|
dev_path(dev));
|
||||||
return &default_ht_ops_bus;
|
return &default_ht_ops_bus;
|
||||||
}
|
}
|
||||||
|
@ -766,11 +766,11 @@ static struct device_operations *get_pci_bridge_ops(device_t dev)
|
||||||
case PCI_EXP_TYPE_ROOT_PORT:
|
case PCI_EXP_TYPE_ROOT_PORT:
|
||||||
case PCI_EXP_TYPE_UPSTREAM:
|
case PCI_EXP_TYPE_UPSTREAM:
|
||||||
case PCI_EXP_TYPE_DOWNSTREAM:
|
case PCI_EXP_TYPE_DOWNSTREAM:
|
||||||
printk_debug("%s subbordinate bus PCI Express\n",
|
printk_debug("%s subbordinate bus PCI Express\n",
|
||||||
dev_path(dev));
|
dev_path(dev));
|
||||||
return &default_pciexp_ops_bus;
|
return &default_pciexp_ops_bus;
|
||||||
case PCI_EXP_TYPE_PCI_BRIDGE:
|
case PCI_EXP_TYPE_PCI_BRIDGE:
|
||||||
printk_debug("%s subbordinate PCI\n",
|
printk_debug("%s subbordinate PCI\n",
|
||||||
dev_path(dev));
|
dev_path(dev));
|
||||||
return &default_pci_ops_bus;
|
return &default_pci_ops_bus;
|
||||||
default:
|
default:
|
||||||
|
@ -785,7 +785,7 @@ static struct device_operations *get_pci_bridge_ops(device_t dev)
|
||||||
* @brief Set up PCI device operation
|
* @brief Set up PCI device operation
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param dev
|
* @param dev
|
||||||
*
|
*
|
||||||
* @see pci_drivers
|
* @see pci_drivers
|
||||||
*/
|
*/
|
||||||
|
@ -797,14 +797,14 @@ static void set_pci_ops(struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look through the list of setup drivers and find one for
|
/* 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) &&
|
if ((driver->vendor == dev->vendor) &&
|
||||||
(driver->device == dev->device))
|
(driver->device == dev->device))
|
||||||
{
|
{
|
||||||
dev->ops = driver->ops;
|
dev->ops = driver->ops;
|
||||||
printk_spew("%s [%04x/%04x] %sops\n",
|
printk_spew("%s [%04x/%04x] %sops\n",
|
||||||
dev_path(dev),
|
dev_path(dev),
|
||||||
driver->vendor, driver->device,
|
driver->vendor, driver->device,
|
||||||
(driver->ops->scan_bus?"bus ":""));
|
(driver->ops->scan_bus?"bus ":""));
|
||||||
|
@ -835,7 +835,7 @@ static void set_pci_ops(struct device *dev)
|
||||||
printk_err("%s [%04x/%04x/%06x] has unknown header "
|
printk_err("%s [%04x/%04x/%06x] has unknown header "
|
||||||
"type %02x, ignoring.\n",
|
"type %02x, ignoring.\n",
|
||||||
dev_path(dev),
|
dev_path(dev),
|
||||||
dev->vendor, dev->device,
|
dev->vendor, dev->device,
|
||||||
dev->class >> 8, dev->hdr_type);
|
dev->class >> 8, dev->hdr_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -875,9 +875,9 @@ static struct device *pci_scan_get_dev(struct device **list, unsigned int devfn)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Just like alloc_dev add the device to the list of device on the bus.
|
/* 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
|
* When the list of devices was formed we removed all of the parents
|
||||||
* children, and now we are interleaving static and dynamic devices in
|
* children, and now we are interleaving static and dynamic devices in
|
||||||
* order on the bus.
|
* order on the bus.
|
||||||
*/
|
*/
|
||||||
if (dev) {
|
if (dev) {
|
||||||
|
@ -897,7 +897,7 @@ static struct device *pci_scan_get_dev(struct device **list, unsigned int devfn)
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Scan a PCI bus.
|
* @brief Scan a PCI bus.
|
||||||
*
|
*
|
||||||
* Determine the existence of a given PCI device.
|
* Determine the existence of a given PCI device.
|
||||||
|
@ -936,13 +936,13 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
* found the device specific operations this
|
* found the device specific operations this
|
||||||
* operations we will disable the device with
|
* operations we will disable the device with
|
||||||
* those as well.
|
* those as well.
|
||||||
*
|
*
|
||||||
* This is geared toward devices that have subfunctions
|
* This is geared toward devices that have subfunctions
|
||||||
* that do not show up by default.
|
* that do not show up by default.
|
||||||
*
|
*
|
||||||
* If a device is a stuff option on the motherboard
|
* 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 magice enable sequence for the device */
|
||||||
if (dev->chip_ops && dev->chip_ops->enable_dev) {
|
if (dev->chip_ops && dev->chip_ops->enable_dev) {
|
||||||
|
@ -950,8 +950,8 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
}
|
}
|
||||||
/* Now read the vendor and device id */
|
/* Now read the vendor and device id */
|
||||||
id = pci_read_config32(dev, PCI_VENDOR_ID);
|
id = pci_read_config32(dev, PCI_VENDOR_ID);
|
||||||
|
|
||||||
|
|
||||||
/* If the device does not have a pci id disable it.
|
/* If the device does not have a pci id disable it.
|
||||||
* Possibly this is because we have already disabled
|
* Possibly this is because we have already disabled
|
||||||
* the device. But this also handles optional devices
|
* the device. But this also handles optional devices
|
||||||
|
@ -959,7 +959,7 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
*/
|
*/
|
||||||
/* If the chain is fully enumerated quit */
|
/* If the chain is fully enumerated quit */
|
||||||
if ( (id == 0xffffffff) || (id == 0x00000000) ||
|
if ( (id == 0xffffffff) || (id == 0x00000000) ||
|
||||||
(id == 0x0000ffff) || (id == 0xffff0000))
|
(id == 0x0000ffff) || (id == 0xffff0000))
|
||||||
{
|
{
|
||||||
if (dev->enabled) {
|
if (dev->enabled) {
|
||||||
printk_info("Disabling static device: %s\n",
|
printk_info("Disabling static device: %s\n",
|
||||||
|
@ -972,14 +972,14 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
/* 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);
|
hdr_type = pci_read_config8(dev, PCI_HEADER_TYPE);
|
||||||
class = pci_read_config32(dev, PCI_CLASS_REVISION);
|
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->vendor = id & 0xffff;
|
||||||
dev->device = (id >> 16) & 0xffff;
|
dev->device = (id >> 16) & 0xffff;
|
||||||
dev->hdr_type = hdr_type;
|
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;
|
dev->class = class >> 8;
|
||||||
|
|
||||||
|
|
||||||
/* Architectural/System devices always need to
|
/* Architectural/System devices always need to
|
||||||
* be bus masters.
|
* be bus masters.
|
||||||
|
@ -987,7 +987,7 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
if ((dev->class >> 16) == PCI_BASE_CLASS_SYSTEM) {
|
if ((dev->class >> 16) == PCI_BASE_CLASS_SYSTEM) {
|
||||||
dev->command |= PCI_COMMAND_MASTER;
|
dev->command |= PCI_COMMAND_MASTER;
|
||||||
}
|
}
|
||||||
/* Look at the vendor and device id, or at least the
|
/* Look at the vendor and device id, or at least the
|
||||||
* header type and class and figure out which set of
|
* header type and class and figure out which set of
|
||||||
* configuration methods to use. Unless we already
|
* configuration methods to use. Unless we already
|
||||||
* have some pci ops.
|
* have some pci ops.
|
||||||
|
@ -998,14 +998,14 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
if (dev->ops && dev->ops->enable) {
|
if (dev->ops && dev->ops->enable) {
|
||||||
dev->ops->enable(dev);
|
dev->ops->enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Display the device and error if we don't have some pci operations
|
/* Display the device and error if we don't have some pci operations
|
||||||
* for it.
|
* for it.
|
||||||
*/
|
*/
|
||||||
printk_debug("%s [%04x/%04x] %s%s\n",
|
printk_debug("%s [%04x/%04x] %s%s\n",
|
||||||
dev_path(dev),
|
dev_path(dev),
|
||||||
dev->vendor, dev->device,
|
dev->vendor, dev->device,
|
||||||
dev->enabled?"enabled": "disabled",
|
dev->enabled?"enabled": "disabled",
|
||||||
dev->ops?"" : " No operations"
|
dev->ops?"" : " No operations"
|
||||||
);
|
);
|
||||||
|
@ -1013,7 +1013,7 @@ device_t pci_probe_dev(device_t dev, struct bus *bus, unsigned devfn)
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Scan a PCI bus.
|
* @brief Scan a PCI bus.
|
||||||
*
|
*
|
||||||
* Determine the existence of devices and bridges on a PCI bus. If there are
|
* Determine the existence of devices and bridges on a PCI bus. If there are
|
||||||
|
@ -1059,14 +1059,14 @@ unsigned int pci_scan_bus(struct bus *bus,
|
||||||
/* See if a device is present and setup the device
|
/* See if a device is present and setup the device
|
||||||
* structure.
|
* structure.
|
||||||
*/
|
*/
|
||||||
dev = pci_probe_dev(dev, bus, devfn);
|
dev = pci_probe_dev(dev, bus, devfn);
|
||||||
|
|
||||||
/* if this is not a multi function device,
|
/* if this is not a multi function device,
|
||||||
* or the device is not present don't waste
|
* or the device is not present don't waste
|
||||||
* time probing another function.
|
* time probing another function.
|
||||||
* Skip to next device.
|
* Skip to next device.
|
||||||
*/
|
*/
|
||||||
if ((PCI_FUNC(devfn) == 0x00) &&
|
if ((PCI_FUNC(devfn) == 0x00) &&
|
||||||
(!dev || (dev->enabled && ((dev->hdr_type & 0x80) != 0x80))))
|
(!dev || (dev->enabled && ((dev->hdr_type & 0x80) != 0x80))))
|
||||||
{
|
{
|
||||||
devfn += 0x07;
|
devfn += 0x07;
|
||||||
|
@ -1074,7 +1074,7 @@ unsigned int pci_scan_bus(struct bus *bus,
|
||||||
}
|
}
|
||||||
post_code(0x25);
|
post_code(0x25);
|
||||||
|
|
||||||
/* Die if any left over static devices are are found.
|
/* Die if any left over static devices are are found.
|
||||||
* There's probably a problem in the Config.lb.
|
* There's probably a problem in the Config.lb.
|
||||||
*/
|
*/
|
||||||
if(old_devices) {
|
if(old_devices) {
|
||||||
|
@ -1118,8 +1118,8 @@ unsigned int pci_scan_bus(struct bus *bus,
|
||||||
*
|
*
|
||||||
* @return The maximum bus number found, after scanning all subordinate busses
|
* @return The maximum bus number found, after scanning all subordinate busses
|
||||||
*/
|
*/
|
||||||
unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
|
unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
|
||||||
unsigned int (*do_scan_bus)(struct bus *bus,
|
unsigned int (*do_scan_bus)(struct bus *bus,
|
||||||
unsigned min_devfn, unsigned max_devfn, unsigned int max))
|
unsigned min_devfn, unsigned max_devfn, unsigned int max))
|
||||||
{
|
{
|
||||||
struct bus *bus;
|
struct bus *bus;
|
||||||
|
@ -1134,7 +1134,7 @@ unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
|
||||||
|
|
||||||
/* Set up the primary, secondary and subordinate bus numbers. We have
|
/* Set up the primary, secondary and subordinate bus numbers. We have
|
||||||
* no idea how many buses are behind this bridge yet, so we set the
|
* no idea how many buses are behind this bridge yet, so we set the
|
||||||
* subordinate bus number to 0xff for the moment.
|
* subordinate bus number to 0xff for the moment.
|
||||||
*/
|
*/
|
||||||
bus->secondary = ++max;
|
bus->secondary = ++max;
|
||||||
bus->subordinate = 0xff;
|
bus->subordinate = 0xff;
|
||||||
|
@ -1160,7 +1160,7 @@ unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
|
||||||
((unsigned int) (bus->subordinate) << 16));
|
((unsigned int) (bus->subordinate) << 16));
|
||||||
pci_write_config32(dev, PCI_PRIMARY_BUS, buses);
|
pci_write_config32(dev, PCI_PRIMARY_BUS, buses);
|
||||||
|
|
||||||
/* Now we can scan all subordinate buses
|
/* Now we can scan all subordinate buses
|
||||||
* i.e. the bus behind the bridge.
|
* i.e. the bus behind the bridge.
|
||||||
*/
|
*/
|
||||||
max = do_scan_bus(bus, 0x00, 0xff, max);
|
max = do_scan_bus(bus, 0x00, 0xff, max);
|
||||||
|
@ -1173,7 +1173,7 @@ unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
|
||||||
((unsigned int) (bus->subordinate) << 16);
|
((unsigned int) (bus->subordinate) << 16);
|
||||||
pci_write_config32(dev, PCI_PRIMARY_BUS, buses);
|
pci_write_config32(dev, PCI_PRIMARY_BUS, buses);
|
||||||
pci_write_config16(dev, PCI_COMMAND, cr);
|
pci_write_config16(dev, PCI_COMMAND, cr);
|
||||||
|
|
||||||
printk_spew("%s returns max %d\n", __func__, max);
|
printk_spew("%s returns max %d\n", __func__, max);
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
|
@ -1231,10 +1231,10 @@ void pci_level_irq(unsigned char intNum)
|
||||||
the indicated device address. If the device does not exist or does
|
the indicated device address. If the device does not exist or does
|
||||||
not require interrupts then this function has no effect.
|
not require interrupts then this function has no effect.
|
||||||
|
|
||||||
This function should be called for each PCI slot in your system.
|
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
|
pIntAtoD is an array of IRQ #s that are assigned to PINTA through PINTD of
|
||||||
this slot.
|
this slot.
|
||||||
The particular irq #s that are passed in depend on the routing inside
|
The particular irq #s that are passed in depend on the routing inside
|
||||||
your southbridge and on your motherboard.
|
your southbridge and on your motherboard.
|
||||||
|
|
||||||
|
@ -1256,7 +1256,7 @@ void pci_assign_irqs(unsigned bus, unsigned slot,
|
||||||
if (pdev) {
|
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)) {
|
if ((line >= 1) && (line <= 4)) {
|
||||||
irq = pIntAtoD[line - 1];
|
irq = pIntAtoD[line - 1];
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "northbridge.h"
|
#include "northbridge.h"
|
||||||
#include "i440bx.h"
|
#include "i440bx.h"
|
||||||
|
|
||||||
static void northbridge_init(device_t dev)
|
static void northbridge_init(device_t dev)
|
||||||
{
|
{
|
||||||
printk_spew("Northbridge Init\n");
|
printk_spew("Northbridge Init\n");
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ static struct device_operations northbridge_operations = {
|
||||||
static const struct pci_driver northbridge_driver __pci_driver = {
|
static const struct pci_driver northbridge_driver __pci_driver = {
|
||||||
.ops = &northbridge_operations,
|
.ops = &northbridge_operations,
|
||||||
.vendor = PCI_VENDOR_ID_INTEL,
|
.vendor = PCI_VENDOR_ID_INTEL,
|
||||||
.device = 0x7190,
|
.device = 0x7190,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,33 +38,32 @@ static const struct pci_driver northbridge_driver __pci_driver = {
|
||||||
|
|
||||||
static void pci_domain_read_resources(device_t dev)
|
static void pci_domain_read_resources(device_t dev)
|
||||||
{
|
{
|
||||||
struct resource *resource;
|
struct resource *resource;
|
||||||
unsigned reg;
|
|
||||||
|
|
||||||
/* Initialize the system wide io space constraints */
|
/* Initialize the system wide io space constraints */
|
||||||
resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
|
resource = new_resource(dev, IOINDEX_SUBTRACTIVE(0,0));
|
||||||
resource->limit = 0xffffUL;
|
resource->limit = 0xffffUL;
|
||||||
resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
|
resource->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
|
||||||
|
|
||||||
/* Initialize the system wide memory resources constraints */
|
/* Initialize the system wide memory resources constraints */
|
||||||
resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
|
resource = new_resource(dev, IOINDEX_SUBTRACTIVE(1,0));
|
||||||
resource->limit = 0xffffffffULL;
|
resource->limit = 0xffffffffULL;
|
||||||
resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
|
resource->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ram_resource(device_t dev, unsigned long index,
|
static void ram_resource(device_t dev, unsigned long index,
|
||||||
unsigned long basek, unsigned long sizek)
|
unsigned long basek, unsigned long sizek)
|
||||||
{
|
{
|
||||||
struct resource *resource;
|
struct resource *resource;
|
||||||
|
|
||||||
if (!sizek) {
|
if (!sizek) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
resource = new_resource(dev, index);
|
resource = new_resource(dev, index);
|
||||||
resource->base = ((resource_t)basek) << 10;
|
resource->base = ((resource_t)basek) << 10;
|
||||||
resource->size = ((resource_t)sizek) << 10;
|
resource->size = ((resource_t)sizek) << 10;
|
||||||
resource->flags = IORESOURCE_MEM | IORESOURCE_CACHEABLE | \
|
resource->flags = IORESOURCE_MEM | IORESOURCE_CACHEABLE | \
|
||||||
IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED;
|
IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tolm_test(void *gp, struct device *dev, struct resource *new)
|
static void tolm_test(void *gp, struct device *dev, struct resource *new)
|
||||||
|
@ -95,6 +94,7 @@ static uint32_t find_pci_tolm(struct bus *bus)
|
||||||
#define HIGH_TABLES_SIZE 64 // maximum size of high tables in KB
|
#define HIGH_TABLES_SIZE 64 // maximum size of high tables in KB
|
||||||
extern uint64_t high_tables_base, high_tables_size;
|
extern uint64_t high_tables_base, high_tables_size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void pci_domain_set_resources(device_t dev)
|
static void pci_domain_set_resources(device_t dev)
|
||||||
{
|
{
|
||||||
device_t mc_dev;
|
device_t mc_dev;
|
||||||
|
@ -102,7 +102,6 @@ static void pci_domain_set_resources(device_t dev)
|
||||||
|
|
||||||
pci_tolm = find_pci_tolm(&dev->link[0]);
|
pci_tolm = find_pci_tolm(&dev->link[0]);
|
||||||
mc_dev = dev->link[0].children;
|
mc_dev = dev->link[0].children;
|
||||||
|
|
||||||
if (mc_dev) {
|
if (mc_dev) {
|
||||||
uint16_t tolm_r;
|
uint16_t tolm_r;
|
||||||
unsigned long tomk, tolmk;
|
unsigned long tomk, tolmk;
|
||||||
|
@ -123,7 +122,7 @@ static void pci_domain_set_resources(device_t dev)
|
||||||
tolmk = pci_tolm / 1024;
|
tolmk = pci_tolm / 1024;
|
||||||
|
|
||||||
if (tolmk >= tomk) {
|
if (tolmk >= tomk) {
|
||||||
/* The PCI hole does does not overlap the memory. */
|
/* The PCI hole does not overlap the memory. */
|
||||||
tolmk = tomk;
|
tolmk = tomk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,34 +130,33 @@ static void pci_domain_set_resources(device_t dev)
|
||||||
idx = 10;
|
idx = 10;
|
||||||
ram_resource(dev, idx++, 0, 640);
|
ram_resource(dev, idx++, 0, 640);
|
||||||
ram_resource(dev, idx++, 768, tolmk - 768);
|
ram_resource(dev, idx++, 768, tolmk - 768);
|
||||||
|
|
||||||
#if HAVE_HIGH_TABLES==1
|
#if HAVE_HIGH_TABLES==1
|
||||||
/* Leave some space for ACPI, PIRQ and MP tables */
|
/* Leave some space for ACPI, PIRQ and MP tables */
|
||||||
high_tables_base = (tomk - HIGH_TABLES_SIZE) * 1024;
|
high_tables_base = (tomk - HIGH_TABLES_SIZE) * 1024;
|
||||||
high_tables_size = HIGH_TABLES_SIZE * 1024;
|
high_tables_size = HIGH_TABLES_SIZE * 1024;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
assign_resources(&dev->link[0]);
|
assign_resources(&dev->link[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int pci_domain_scan_bus(device_t dev, unsigned int max)
|
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);
|
max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device_operations pci_domain_ops = {
|
static struct device_operations pci_domain_ops = {
|
||||||
.read_resources = pci_domain_read_resources,
|
.read_resources = pci_domain_read_resources,
|
||||||
.set_resources = pci_domain_set_resources,
|
.set_resources = pci_domain_set_resources,
|
||||||
.enable_resources = enable_childrens_resources,
|
.enable_resources = enable_childrens_resources,
|
||||||
.init = 0,
|
.init = 0,
|
||||||
.scan_bus = pci_domain_scan_bus,
|
.scan_bus = pci_domain_scan_bus,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cpu_bus_init(device_t dev)
|
static void cpu_bus_init(device_t dev)
|
||||||
{
|
{
|
||||||
initialize_cpus(&dev->link[0]);
|
initialize_cpus(&dev->link[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_bus_noop(device_t dev)
|
static void cpu_bus_noop(device_t dev)
|
||||||
|
@ -166,25 +164,23 @@ static void cpu_bus_noop(device_t dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device_operations cpu_bus_ops = {
|
static struct device_operations cpu_bus_ops = {
|
||||||
.read_resources = cpu_bus_noop,
|
.read_resources = cpu_bus_noop,
|
||||||
.set_resources = cpu_bus_noop,
|
.set_resources = cpu_bus_noop,
|
||||||
.enable_resources = cpu_bus_noop,
|
.enable_resources = cpu_bus_noop,
|
||||||
.init = cpu_bus_init,
|
.init = cpu_bus_init,
|
||||||
.scan_bus = 0,
|
.scan_bus = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void enable_dev(struct device *dev)
|
static void enable_dev(struct device *dev)
|
||||||
{
|
{
|
||||||
struct device_path path;
|
/* Set the operations if it is a special bus type */
|
||||||
|
if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) {
|
||||||
/* Set the operations if it is a special bus type */
|
dev->ops = &pci_domain_ops;
|
||||||
if (dev->path.type == DEVICE_PATH_PCI_DOMAIN) {
|
|
||||||
dev->ops = &pci_domain_ops;
|
|
||||||
pci_set_method(dev);
|
pci_set_method(dev);
|
||||||
}
|
}
|
||||||
else if (dev->path.type == DEVICE_PATH_APIC_CLUSTER) {
|
else if (dev->path.type == DEVICE_PATH_APIC_CLUSTER) {
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations northbridge_intel_i440bx_ops = {
|
struct chip_operations northbridge_intel_i440bx_ops = {
|
||||||
|
|
Loading…
Reference in New Issue