| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <amdblocks/root_complex.h> |
| #include <amdblocks/smn.h> |
| #include <device/device.h> |
| #include <types.h> |
| |
| #define IOHC_MMIO_EN BIT(0) |
| |
| void read_non_pci_resources(struct device *domain, unsigned long *idx) |
| { |
| const uint32_t iohc_misc_base = get_iohc_misc_smn_base(domain); |
| const struct non_pci_mmio_reg *regs; |
| size_t reg_count; |
| |
| regs = get_iohc_non_pci_mmio_regs(®_count); |
| |
| for (size_t i = 0; i < reg_count; i++) { |
| const uint64_t reg64 = smn_read64(iohc_misc_base + regs[i].iohc_misc_offset); |
| /* only report enabled non-PCI MMIO regions */ |
| if (!(reg64 & IOHC_MMIO_EN)) |
| continue; |
| |
| const unsigned long res_idx = regs[i].res_idx == NON_PCI_RES_IDX_AUTO ? |
| (*idx)++ : regs[i].res_idx; |
| const uint64_t base = reg64 & regs[i].mask; |
| mmio_range(domain, res_idx, base, regs[i].size); |
| } |
| } |