1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include <console/console.h> 4 #include <device/device.h> 5 #include <intelblocks/pcie_rp.h> 6 #include <stdint.h> 7 pcie_slot_enable_mask(const struct pcie_rp_group * group)8static uint32_t pcie_slot_enable_mask(const struct pcie_rp_group *group) 9 { 10 uint32_t mask = 0; 11 unsigned int fn; 12 unsigned int i; 13 const struct device *dev; 14 15 for (i = 0, fn = rp_start_fn(group); i < group->count; i++, fn++) { 16 dev = pcidev_on_root(group->slot, fn); 17 if (is_dev_enabled(dev)) 18 mask |= BIT(i); 19 } 20 21 return mask; 22 } 23 pcie_rp_enable_mask(const struct pcie_rp_group * const groups)24uint32_t pcie_rp_enable_mask(const struct pcie_rp_group *const groups) 25 { 26 uint32_t mask = 0; 27 uint32_t offset = 0; 28 const struct pcie_rp_group *group; 29 30 for (group = groups; group->count; ++group) { 31 if (group->count + offset >= sizeof(mask) * 8) { 32 printk(BIOS_ERR, "%s: Root port count greater than mask size!\n", 33 __func__); 34 break; 35 } 36 mask |= pcie_slot_enable_mask(group) << offset; 37 offset += group->count; 38 } 39 40 return mask; 41 } 42