blob: 43eda7cbb0fea5280e8c0be8b1cbefec0c542e93 [file] [log] [blame]
Angel Ponsae593872020-04-04 18:50:57 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Marc Jonesbc94aea2018-09-26 09:57:08 -06002
Felix Helde54e1412023-07-03 18:50:48 +02003#include <amdblocks/iommu.h>
Arthur Heymansf9c12ce2023-06-15 10:59:49 +02004#include <console/console.h>
Marc Jonesbc94aea2018-09-26 09:57:08 -06005#include <device/device.h>
6#include <device/pci.h>
Marc Jonesbc94aea2018-09-26 09:57:08 -06007#include <lib.h>
8
9static void iommu_read_resources(struct device *dev)
10{
11 struct resource *res;
12
13 /* Get the normal pci resources of this device */
14 pci_dev_read_resources(dev);
15
Felix Heldddf137f2022-02-04 19:27:48 +010016 /* IOMMU MMIO registers */
Arthur Heymansbafe55c2023-06-19 10:48:13 +020017 res = new_resource(dev, IOMMU_CAP_BASE_LO);
Felix Held6ebcdf32021-10-12 21:39:27 +020018 res->size = 512 * KiB;
Marc Jonesbc94aea2018-09-26 09:57:08 -060019 res->align = log2(res->size);
20 res->gran = log2(res->size);
21 res->limit = 0xffffffff; /* 4G */
22 res->flags = IORESOURCE_MEM;
23}
24
Arthur Heymansf9c12ce2023-06-15 10:59:49 +020025
26static void iommu_enable_resources(struct device *dev)
27{
28 uint32_t base = pci_read_config32(dev, IOMMU_CAP_BASE_LO);
29 base |= IOMMU_ENABLE;
30 pci_write_config32(dev, IOMMU_CAP_BASE_LO, base);
31 printk(BIOS_DEBUG, "%s -> mmio enable: %08X", __func__,
32 pci_read_config32(dev, IOMMU_CAP_BASE_LO));
33 pci_dev_enable_resources(dev);
34}
35
Felix Held8aa9edf2021-02-17 00:15:12 +010036#if CONFIG(HAVE_ACPI_TABLES)
37static const char *iommu_acpi_name(const struct device *dev)
38{
39 return "IOMM";
40}
41#endif
42
Arthur Heymansb3dcb962022-10-05 21:54:29 +020043struct device_operations amd_iommu_ops = {
Marc Jonesbc94aea2018-09-26 09:57:08 -060044 .read_resources = iommu_read_resources,
45 .set_resources = pci_dev_set_resources,
Arthur Heymansf9c12ce2023-06-15 10:59:49 +020046 .enable_resources = iommu_enable_resources,
Angel Pons1fc0edd2020-05-31 00:03:28 +020047 .ops_pci = &pci_dev_ops_pci,
Felix Held8aa9edf2021-02-17 00:15:12 +010048#if CONFIG(HAVE_ACPI_TABLES)
49 .acpi_name = iommu_acpi_name,
50#endif
Marc Jonesbc94aea2018-09-26 09:57:08 -060051};