amd/sr5650: Update add_ivrs_device_entries
Functionally, this should be roughly the same. The only real difference should be removing the 4 bytes of padding from the end of the 4 byte entries. The spec mentions a boundary for the 4 byte entries (which we are ignoring), but doesn't mention a boundary for the 8 byte entries, and I can't think of any other reason that the padding might be needed. - Wrap long lines. - Combine if statements to clean up indentation. - Use #defines from acpi_ivrs.h to make commands easier to understand. - Remove padding from 4 byte entries that made them 8 bytes in length. - Set the pointer p at init, and clear the value at p if the device we're looking at is enabled instead of setting p in every if statement. - Look at the command type to update current and length. - Treat malloc & free as if they were typical instead of coreboot specific versions. Check to make sure the malloc worked and only free on the last loop instead of every time. Change-Id: I79dd5f9e930fad22a09d1af78f33c1d9a88b3bfe Signed-off-by: Martin Roth <martinroth@google.com> Reviewed-on: https://review.coreboot.org/16532 Tested-by: build bot (Jenkins) Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@googlemail.com>
This commit is contained in:
parent
b599919495
commit
d173907747
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
|
#include <arch/acpi_ivrs.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
#include <device/pci_ids.h>
|
#include <device/pci_ids.h>
|
||||||
|
@ -715,78 +716,64 @@ void sr5650_enable(device_t dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_ivrs_device_entries(struct device *parent, struct device *dev, int depth, int linknum, int8_t *root_level, unsigned long *current, uint16_t *length)
|
static void add_ivrs_device_entries(struct device *parent, struct device *dev,
|
||||||
|
int depth, int linknum, int8_t *root_level,
|
||||||
|
unsigned long *current, uint16_t *length)
|
||||||
{
|
{
|
||||||
uint8_t *p;
|
uint8_t *p = (uint8_t *) *current;
|
||||||
|
|
||||||
struct device *sibling;
|
struct device *sibling;
|
||||||
struct bus *link;
|
struct bus *link;
|
||||||
|
|
||||||
if (!root_level) {
|
if (!root_level) {
|
||||||
root_level = malloc(sizeof(int8_t));
|
root_level = malloc(sizeof(int8_t));
|
||||||
|
if (root_level == NULL)
|
||||||
|
die("Error: Could not allocate a byte!\n");
|
||||||
*root_level = -1;
|
*root_level = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->path.type == DEVICE_PATH_PCI) {
|
if ((dev->path.type == DEVICE_PATH_PCI) &&
|
||||||
if ((dev->bus->secondary == 0x0) && (dev->path.pci.devfn == 0x0))
|
(dev->bus->secondary == 0x0) && (dev->path.pci.devfn == 0x0))
|
||||||
*root_level = depth;
|
*root_level = depth;
|
||||||
|
|
||||||
if (*root_level != -1) {
|
if ((dev->path.type == DEVICE_PATH_PCI) && (*root_level != -1) &&
|
||||||
if (depth >= *root_level) {
|
(depth >= *root_level) && (dev->enabled)) {
|
||||||
if (dev->enabled) {
|
|
||||||
|
*p = 0;
|
||||||
if (depth == *root_level) {
|
if (depth == *root_level) {
|
||||||
if (dev->path.pci.devfn < (0x1 << 3)) {
|
if (dev->path.pci.devfn < (0x1 << 3)) {
|
||||||
/* SR5690 control device */
|
/* SR5690 control device */
|
||||||
} else if ((dev->path.pci.devfn >= (0x1 << 3)) && (dev->path.pci.devfn < (0xe << 3))) {
|
} else if ((dev->path.pci.devfn >= (0x1 << 3)) &&
|
||||||
|
(dev->path.pci.devfn < (0xe << 3))) {
|
||||||
/* SR5690 PCIe bridge device */
|
/* SR5690 PCIe bridge device */
|
||||||
} else {
|
} else if (dev->path.pci.devfn == (0x14 << 3)) {
|
||||||
if (dev->path.pci.devfn == (0x14 << 3)) {
|
|
||||||
/* SMBUS controller */
|
/* SMBUS controller */
|
||||||
p = (uint8_t *) *current;
|
p[0] = IVHD_DEV_4_BYTE_SELECT; /* Entry type */
|
||||||
p[0] = 0x2; /* Entry type */
|
|
||||||
p[1] = dev->path.pci.devfn; /* Device */
|
p[1] = dev->path.pci.devfn; /* Device */
|
||||||
p[2] = dev->bus->secondary; /* Bus */
|
p[2] = dev->bus->secondary; /* Bus */
|
||||||
p[3] = 0x97; /* Data */
|
p[3] = IVHD_DTE_LINT_1_PASS | /* Data */
|
||||||
p[4] = 0x0; /* Padding */
|
IVHD_DTE_SYS_MGT_NO_TRANS |
|
||||||
p[5] = 0x0; /* Padding */
|
IVHD_DTE_NMI_PASS |
|
||||||
p[6] = 0x0; /* Padding */
|
IVHD_DTE_EXT_INT_PASS |
|
||||||
p[7] = 0x0; /* Padding */
|
IVHD_DTE_INIT_PASS;
|
||||||
*length += 8;
|
|
||||||
*current += 8;
|
|
||||||
} else {
|
} else {
|
||||||
/* Other southbridge device */
|
/* Other southbridge device */
|
||||||
p = (uint8_t *) *current;
|
p[0] = IVHD_DEV_4_BYTE_SELECT; /* Entry type */
|
||||||
p[0] = 0x2; /* Entry type */
|
|
||||||
p[1] = dev->path.pci.devfn; /* Device */
|
p[1] = dev->path.pci.devfn; /* Device */
|
||||||
p[2] = dev->bus->secondary; /* Bus */
|
p[2] = dev->bus->secondary; /* Bus */
|
||||||
p[3] = 0x0; /* Data */
|
p[3] = 0x0; /* Data */
|
||||||
p[4] = 0x0; /* Padding */
|
|
||||||
p[5] = 0x0; /* Padding */
|
|
||||||
p[6] = 0x0; /* Padding */
|
|
||||||
p[7] = 0x0; /* Padding */
|
|
||||||
*length += 8;
|
|
||||||
*current += 8;
|
|
||||||
}
|
}
|
||||||
}
|
} else if ((dev->hdr_type & 0x7f) == PCI_HEADER_TYPE_NORMAL) {
|
||||||
} else {
|
|
||||||
if ((dev->hdr_type & 0x7f) == PCI_HEADER_TYPE_NORMAL) {
|
|
||||||
/* Device behind bridge */
|
/* Device behind bridge */
|
||||||
if (pci_find_capability(dev, PCI_CAP_ID_PCIE)) {
|
if (pci_find_capability(dev, PCI_CAP_ID_PCIE)) {
|
||||||
/* Device is PCIe */
|
/* Device is PCIe */
|
||||||
p = (uint8_t *) *current;
|
p[0] = IVHD_DEV_4_BYTE_SELECT; /* Entry type */
|
||||||
p[0] = 0x2; /* Entry type */
|
|
||||||
p[1] = dev->path.pci.devfn; /* Device */
|
p[1] = dev->path.pci.devfn; /* Device */
|
||||||
p[2] = dev->bus->secondary; /* Bus */
|
p[2] = dev->bus->secondary; /* Bus */
|
||||||
p[3] = 0x0; /* Data */
|
p[3] = 0x0; /* Data */
|
||||||
p[4] = 0x0; /* Padding */
|
|
||||||
p[5] = 0x0; /* Padding */
|
|
||||||
p[6] = 0x0; /* Padding */
|
|
||||||
p[7] = 0x0; /* Padding */
|
|
||||||
*length += 8;
|
|
||||||
*current += 8;
|
|
||||||
} else {
|
} else {
|
||||||
/* Device is legacy PCI or PCI-X */
|
/* Device is legacy PCI or PCI-X */
|
||||||
p = (uint8_t *) *current;
|
p[0] = IVHD_DEV_8_BYTE_ALIAS_SELECT; /* Entry */
|
||||||
p[0] = 0x42; /* Entry type */
|
|
||||||
p[1] = dev->path.pci.devfn; /* Device */
|
p[1] = dev->path.pci.devfn; /* Device */
|
||||||
p[2] = dev->bus->secondary; /* Bus */
|
p[2] = dev->bus->secondary; /* Bus */
|
||||||
p[3] = 0x0; /* Data */
|
p[3] = 0x0; /* Data */
|
||||||
|
@ -794,20 +781,25 @@ static void add_ivrs_device_entries(struct device *parent, struct device *dev, i
|
||||||
p[5] = parent->path.pci.devfn; /* Device */
|
p[5] = parent->path.pci.devfn; /* Device */
|
||||||
p[6] = parent->bus->secondary; /* Bus */
|
p[6] = parent->bus->secondary; /* Bus */
|
||||||
p[7] = 0x0; /* Reserved */
|
p[7] = 0x0; /* Reserved */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p == IVHD_DEV_4_BYTE_SELECT) {
|
||||||
|
*length += 4;
|
||||||
|
*current += 4;
|
||||||
|
} else if (*p == IVHD_DEV_8_BYTE_ALIAS_SELECT) {
|
||||||
*length += 8;
|
*length += 8;
|
||||||
*current += 8;
|
*current += 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (link = dev->link_list; link; link = link->next)
|
for (link = dev->link_list; link; link = link->next)
|
||||||
for (sibling = link->children; sibling; sibling = sibling->sibling)
|
for (sibling = link->children; sibling;
|
||||||
add_ivrs_device_entries(dev, sibling, depth + 1, depth, root_level, current, length);
|
sibling = sibling->sibling)
|
||||||
|
add_ivrs_device_entries(dev, sibling, depth + 1,
|
||||||
|
depth, root_level, current, length);
|
||||||
|
|
||||||
|
if (depth == 0)
|
||||||
free(root_level);
|
free(root_level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue