blob: 00bef42a79901ee6b0b055001ff8c513a803d2f8 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h>
#include <device/device.h>
#include <intelblocks/pcie_rp.h>
#include <stdint.h>
static uint32_t pcie_slot_enable_mask(const struct pcie_rp_group *group)
{
uint32_t mask = 0;
unsigned int fn;
unsigned int i;
const struct device *dev;
for (i = 0, fn = rp_start_fn(group); i < group->count; i++, fn++) {
dev = pcidev_on_root(group->slot, fn);
if (is_dev_enabled(dev))
mask |= BIT(i);
}
return mask;
}
uint32_t pcie_rp_enable_mask(const struct pcie_rp_group *const groups)
{
uint32_t mask = 0;
uint32_t offset = 0;
const struct pcie_rp_group *group;
for (group = groups; group->count; ++group) {
if (group->count + offset >= sizeof(mask) * 8) {
printk(BIOS_ERR, "%s: Root port count greater than mask size!\n",
__func__);
break;
}
mask |= pcie_slot_enable_mask(group) << offset;
offset += group->count;
}
return mask;
}