| /* 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; |
| } |