device: introduce and use dev_get_domain_id
To avoid having constructs like 'dev->path.domain.domain' in the SoC code, create the 'dev_get_domain_id' helper function that returns the domain ID of either that device if it's a domain device or the corresponding domain device's domain ID, and use it in the code. If this function is called with a device other than PCI or domain type, it won't have a domain number. In order to not need to call 'die', 'dev_get_domain_id' will print an error and return 0 which is a valid domain number. In that case, the calling code should be fixed. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I3d79f19846cea49609f848a4c42747ac1052c288 Reviewed-on: https://review.coreboot.org/c/coreboot/+/83644 Reviewed-by: Shuo Liu <shuo.liu@intel.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <commonlib/bsd/helpers.h>
|
#include <commonlib/bsd/helpers.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
@ -261,6 +262,20 @@ const struct device *dev_get_domain(const struct device *dev)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int dev_get_domain_id(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct device *domain_dev = dev_get_domain(dev);
|
||||||
|
|
||||||
|
assert(domain_dev);
|
||||||
|
|
||||||
|
if (!domain_dev) {
|
||||||
|
printk(BIOS_ERR, "%s: doesn't have a domain device\n", dev_path(dev));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return domain_dev->path.domain.domain;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_domain0(const struct device *dev)
|
bool is_domain0(const struct device *dev)
|
||||||
{
|
{
|
||||||
return dev && dev->path.type == DEVICE_PATH_DOMAIN && dev->path.domain.domain == 0;
|
return dev && dev->path.type == DEVICE_PATH_DOMAIN && dev->path.domain.domain == 0;
|
||||||
|
@ -183,6 +183,7 @@ const char *dev_name(const struct device *dev);
|
|||||||
const char *dev_path(const struct device *dev);
|
const char *dev_path(const struct device *dev);
|
||||||
u32 dev_path_encode(const struct device *dev);
|
u32 dev_path_encode(const struct device *dev);
|
||||||
const struct device *dev_get_domain(const struct device *dev);
|
const struct device *dev_get_domain(const struct device *dev);
|
||||||
|
unsigned int dev_get_domain_id(const struct device *dev);
|
||||||
void dev_set_enabled(struct device *dev, int enable);
|
void dev_set_enabled(struct device *dev, int enable);
|
||||||
void disable_children(struct bus *bus);
|
void disable_children(struct bus *bus);
|
||||||
bool dev_is_active_bridge(struct device *dev);
|
bool dev_is_active_bridge(struct device *dev);
|
||||||
|
@ -22,7 +22,7 @@ void amd_pci_domain_scan_bus(struct device *domain)
|
|||||||
|
|
||||||
if (segment_group >= PCI_SEGMENT_GROUP_COUNT) {
|
if (segment_group >= PCI_SEGMENT_GROUP_COUNT) {
|
||||||
printk(BIOS_ERR, "Skipping domain %u due to too large segment group %u.\n",
|
printk(BIOS_ERR, "Skipping domain %u due to too large segment group %u.\n",
|
||||||
domain->path.domain.domain, segment_group);
|
dev_get_domain_id(domain), segment_group);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,6 @@ enum cb_err data_fabric_get_pci_bus_numbers(struct device *domain, uint8_t *segm
|
|||||||
}
|
}
|
||||||
|
|
||||||
printk(BIOS_ERR, "No valid DF PCI CFG register pair found for domain %x.\n",
|
printk(BIOS_ERR, "No valid DF PCI CFG register pair found for domain %x.\n",
|
||||||
domain->path.domain.domain);
|
dev_get_domain_id(domain));
|
||||||
return CB_ERR;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,6 @@ enum cb_err data_fabric_get_pci_bus_numbers(struct device *domain, uint8_t *segm
|
|||||||
}
|
}
|
||||||
|
|
||||||
printk(BIOS_ERR, "No valid DF PCI CFG register found for domain %x.\n",
|
printk(BIOS_ERR, "No valid DF PCI CFG register found for domain %x.\n",
|
||||||
domain->path.domain.domain);
|
dev_get_domain_id(domain));
|
||||||
return CB_ERR;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
static const struct domain_iohc_info *get_domain_iohc_info(struct device *domain)
|
static const struct domain_iohc_info *get_domain_iohc_info(struct device *domain)
|
||||||
{
|
{
|
||||||
const unsigned int domain_id = domain->path.domain.domain;
|
const unsigned int domain_id = dev_get_domain_id(domain);
|
||||||
const struct domain_iohc_info *iohc;
|
const struct domain_iohc_info *iohc;
|
||||||
size_t iohc_count;
|
size_t iohc_count;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ static void genoa_domain_set_resources(struct device *domain)
|
|||||||
{
|
{
|
||||||
if (domain->downstream->bridge_ctrl & PCI_BRIDGE_CTL_VGA) {
|
if (domain->downstream->bridge_ctrl & PCI_BRIDGE_CTL_VGA) {
|
||||||
printk(BIOS_DEBUG, "Setting VGA decoding for domain 0x%x\n",
|
printk(BIOS_DEBUG, "Setting VGA decoding for domain 0x%x\n",
|
||||||
domain->path.domain.domain);
|
dev_get_domain_id(domain));
|
||||||
const union df_vga_en vga_en = {
|
const union df_vga_en vga_en = {
|
||||||
.ve = 1,
|
.ve = 1,
|
||||||
.dst_fabric_id = get_iohc_fabric_id(domain),
|
.dst_fabric_id = get_iohc_fabric_id(domain),
|
||||||
@ -48,6 +48,7 @@ static void genoa_domain_set_resources(struct device *domain)
|
|||||||
|
|
||||||
static const char *genoa_domain_acpi_name(const struct device *domain)
|
static const char *genoa_domain_acpi_name(const struct device *domain)
|
||||||
{
|
{
|
||||||
|
const unsigned int domain_id = dev_get_domain_id(domain);
|
||||||
const char *domain_acpi_names[4] = {
|
const char *domain_acpi_names[4] = {
|
||||||
"S0B0",
|
"S0B0",
|
||||||
"S0B1",
|
"S0B1",
|
||||||
@ -55,8 +56,8 @@ static const char *genoa_domain_acpi_name(const struct device *domain)
|
|||||||
"S0B3",
|
"S0B3",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (domain->path.domain.domain < ARRAY_SIZE(domain_acpi_names))
|
if (domain_id < ARRAY_SIZE(domain_acpi_names))
|
||||||
return domain_acpi_names[domain->path.domain.domain];
|
return domain_acpi_names[domain_id];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ const acpi_cstate_t *soc_get_cstate_map(size_t *entries)
|
|||||||
void iio_domain_set_acpi_name(struct device *dev, const char *prefix)
|
void iio_domain_set_acpi_name(struct device *dev, const char *prefix)
|
||||||
{
|
{
|
||||||
const union xeon_domain_path dn = {
|
const union xeon_domain_path dn = {
|
||||||
.domain_path = dev->path.domain.domain
|
.domain_path = dev_get_domain_id(dev)
|
||||||
};
|
};
|
||||||
|
|
||||||
assert(dn.socket < CONFIG_MAX_SOCKET);
|
assert(dn.socket < CONFIG_MAX_SOCKET);
|
||||||
|
@ -49,7 +49,7 @@ static int filter_device_on_stack(struct device *dev, uint8_t socket, uint8_t st
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
union xeon_domain_path dn;
|
union xeon_domain_path dn;
|
||||||
dn.domain_path = domain->path.domain.domain;
|
dn.domain_path = dev_get_domain_id(domain);
|
||||||
|
|
||||||
if (socket != XEONSP_SOCKET_MAX && dn.socket != socket)
|
if (socket != XEONSP_SOCKET_MAX && dn.socket != socket)
|
||||||
return 0;
|
return 0;
|
||||||
@ -140,7 +140,7 @@ int iio_pci_domain_socket_from_dev(const struct device *dev)
|
|||||||
if (!domain)
|
if (!domain)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
dn.domain_path = domain->path.domain.domain;
|
dn.domain_path = dev_get_domain_id(domain);
|
||||||
|
|
||||||
return dn.socket;
|
return dn.socket;
|
||||||
}
|
}
|
||||||
@ -162,7 +162,7 @@ int iio_pci_domain_stack_from_dev(const struct device *dev)
|
|||||||
if (!domain)
|
if (!domain)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
dn.domain_path = domain->path.domain.domain;
|
dn.domain_path = dev_get_domain_id(domain);
|
||||||
|
|
||||||
return dn.stack;
|
return dn.stack;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ static const STACK_RES *domain_to_stack_res(const struct device *dev)
|
|||||||
{
|
{
|
||||||
assert(dev->path.type == DEVICE_PATH_DOMAIN);
|
assert(dev->path.type == DEVICE_PATH_DOMAIN);
|
||||||
const union xeon_domain_path dn = {
|
const union xeon_domain_path dn = {
|
||||||
.domain_path = dev->path.domain.domain
|
.domain_path = dev_get_domain_id(dev)
|
||||||
};
|
};
|
||||||
|
|
||||||
const IIO_UDS *hob = get_iio_uds();
|
const IIO_UDS *hob = get_iio_uds();
|
||||||
|
@ -16,7 +16,7 @@ static const UDS_PCIROOT_RES *domain_to_pciroot_res(const struct device *dev)
|
|||||||
{
|
{
|
||||||
assert(dev->path.type == DEVICE_PATH_DOMAIN);
|
assert(dev->path.type == DEVICE_PATH_DOMAIN);
|
||||||
const union xeon_domain_path dn = {
|
const union xeon_domain_path dn = {
|
||||||
.domain_path = dev->path.domain.domain
|
.domain_path = dev_get_domain_id(dev)
|
||||||
};
|
};
|
||||||
|
|
||||||
const IIO_UDS *hob = get_iio_uds();
|
const IIO_UDS *hob = get_iio_uds();
|
||||||
|
@ -128,7 +128,7 @@ static void setup_bmc_lanes(uint8_t lane, uint8_t socket)
|
|||||||
static void per_device_config(MPIOCLASS_INPUT_BLK *mpio_data, struct device *dev)
|
static void per_device_config(MPIOCLASS_INPUT_BLK *mpio_data, struct device *dev)
|
||||||
{
|
{
|
||||||
static uint32_t slot_num;
|
static uint32_t slot_num;
|
||||||
const uint32_t domain = dev->upstream->dev->path.domain.domain;
|
const uint32_t domain = dev_get_domain_id(dev);
|
||||||
const uint32_t devfn = dev->path.pci.devfn;
|
const uint32_t devfn = dev->path.pci.devfn;
|
||||||
const struct vendorcode_amd_opensil_chip_mpio_config *const config = dev->chip_info;
|
const struct vendorcode_amd_opensil_chip_mpio_config *const config = dev->chip_info;
|
||||||
printk(BIOS_DEBUG, "Setting MPIO port for domain 0x%x, PCI %d:%d\n",
|
printk(BIOS_DEBUG, "Setting MPIO port for domain 0x%x, PCI %d:%d\n",
|
||||||
|
Reference in New Issue
Block a user