summaryrefslogtreecommitdiff
path: root/sys/arch/arm64
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/arm64')
-rw-r--r--sys/arch/arm64/dev/acpiiort.c16
-rw-r--r--sys/arch/arm64/dev/acpiiort.h5
-rw-r--r--sys/arch/arm64/dev/acpipci.c14
-rw-r--r--sys/arch/arm64/dev/apldart.c9
-rw-r--r--sys/arch/arm64/dev/smmu.c28
-rw-r--r--sys/arch/arm64/dev/smmu_acpi.c3
-rw-r--r--sys/arch/arm64/dev/smmu_fdt.c14
-rw-r--r--sys/arch/arm64/dev/smmuvar.h3
8 files changed, 72 insertions, 20 deletions
diff --git a/sys/arch/arm64/dev/acpiiort.c b/sys/arch/arm64/dev/acpiiort.c
index 8569b4932d7..7bee4dac83e 100644
--- a/sys/arch/arm64/dev/acpiiort.c
+++ b/sys/arch/arm64/dev/acpiiort.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpiiort.c,v 1.3 2021/03/15 22:56:48 patrick Exp $ */
+/* $OpenBSD: acpiiort.c,v 1.4 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -103,6 +103,20 @@ acpiiort_smmu_map(struct acpi_iort_node *node, uint32_t rid,
return dmat;
}
+void
+acpiiort_smmu_reserve_region(struct acpi_iort_node *node, uint32_t rid,
+ bus_addr_t addr, bus_size_t size)
+{
+ struct acpiiort_smmu *as;
+
+ SIMPLEQ_FOREACH(as, &acpiiort_smmu_list, as_list) {
+ if (as->as_node == node) {
+ as->as_reserve(as->as_cookie, rid, addr, size);
+ return;
+ }
+ }
+}
+
bus_dma_tag_t
acpiiort_device_map(struct aml_node *root, bus_dma_tag_t dmat)
{
diff --git a/sys/arch/arm64/dev/acpiiort.h b/sys/arch/arm64/dev/acpiiort.h
index 5aaaa02c17b..02369755e33 100644
--- a/sys/arch/arm64/dev/acpiiort.h
+++ b/sys/arch/arm64/dev/acpiiort.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpiiort.h,v 1.3 2021/03/15 22:56:48 patrick Exp $ */
+/* $OpenBSD: acpiiort.h,v 1.4 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -28,8 +28,11 @@ struct acpiiort_smmu {
void *as_cookie;
bus_dma_tag_t (*as_map)(void *, uint32_t,
bus_dma_tag_t);
+ void (*as_reserve)(void *, uint32_t,
+ bus_addr_t, bus_size_t);
};
void acpiiort_smmu_register(struct acpiiort_smmu *);
bus_dma_tag_t acpiiort_smmu_map(struct acpi_iort_node *, uint32_t, bus_dma_tag_t);
+void acpiiort_smmu_reserve_region(struct acpi_iort_node *, uint32_t, bus_addr_t, bus_size_t);
bus_dma_tag_t acpiiort_device_map(struct aml_node *, bus_dma_tag_t);
diff --git a/sys/arch/arm64/dev/acpipci.c b/sys/arch/arm64/dev/acpipci.c
index 2b6566cdcc3..b7248cbed15 100644
--- a/sys/arch/arm64/dev/acpipci.c
+++ b/sys/arch/arm64/dev/acpipci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpipci.c,v 1.29 2021/05/17 17:25:13 kettenis Exp $ */
+/* $OpenBSD: acpipci.c,v 1.30 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2018 Mark Kettenis
*
@@ -355,6 +355,7 @@ int
acpipci_probe_device_hook(void *v, struct pci_attach_args *pa)
{
struct acpipci_mcfg *am = v;
+ struct acpipci_trans *at;
struct acpi_table_header *hdr;
struct acpi_iort *iort = NULL;
struct acpi_iort_node *node;
@@ -417,8 +418,17 @@ acpipci_probe_device_hook(void *v, struct pci_attach_args *pa)
return 0;
node = (struct acpi_iort_node *)((char *)iort + offset);
- if (node->type == ACPI_IORT_SMMU)
+ if (node->type == ACPI_IORT_SMMU) {
pa->pa_dmat = acpiiort_smmu_map(node, rid, pa->pa_dmat);
+ for (at = pa->pa_iot->bus_private; at; at = at->at_next) {
+ acpiiort_smmu_reserve_region(node, rid,
+ at->at_base, at->at_size);
+ }
+ for (at = pa->pa_memt->bus_private; at; at = at->at_next) {
+ acpiiort_smmu_reserve_region(node, rid,
+ at->at_base, at->at_size);
+ }
+ }
return 0;
}
diff --git a/sys/arch/arm64/dev/apldart.c b/sys/arch/arm64/dev/apldart.c
index dfa83508125..e662cc838bf 100644
--- a/sys/arch/arm64/dev/apldart.c
+++ b/sys/arch/arm64/dev/apldart.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: apldart.c,v 1.4 2021/05/30 15:05:32 visa Exp $ */
+/* $OpenBSD: apldart.c,v 1.5 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
*
@@ -133,6 +133,7 @@ struct cfdriver apldart_cd = {
};
bus_dma_tag_t apldart_map(void *, uint32_t *, bus_dma_tag_t);
+void apldart_reserve(void *, uint32_t *, bus_addr_t, bus_size_t);
int apldart_intr(void *);
void apldart_flush_tlb(struct apldart_softc *);
@@ -279,6 +280,7 @@ apldart_attach(struct device *parent, struct device *self, void *aux)
sc->sc_id.id_node = faa->fa_node;
sc->sc_id.id_cookie = sc;
sc->sc_id.id_map = apldart_map;
+ sc->sc_id.id_reserve = apldart_reserve;
iommu_device_register(&sc->sc_id);
}
@@ -290,6 +292,11 @@ apldart_map(void *cookie, uint32_t *cells, bus_dma_tag_t dmat)
return &sc->sc_bus_dmat;
}
+void
+apldart_reserve(void *cookie, uint32_t *cells, bus_addr_t addr, bus_size_t size)
+{
+}
+
int
apldart_intr(void *arg)
{
diff --git a/sys/arch/arm64/dev/smmu.c b/sys/arch/arm64/dev/smmu.c
index dd942391587..b4517057971 100644
--- a/sys/arch/arm64/dev/smmu.c
+++ b/sys/arch/arm64/dev/smmu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmu.c,v 1.16 2021/06/25 12:40:29 patrick Exp $ */
+/* $OpenBSD: smmu.c,v 1.17 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2008-2009,2014-2016 Dale Rahn <drahn@dalerahn.com>
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
@@ -750,21 +750,25 @@ smmu_domain_create(struct smmu_softc *sc, uint32_t sid)
/* Reserve first page (to catch NULL access) */
extent_alloc_region(dom->sd_iovamap, 0, PAGE_SIZE, EX_WAITOK);
-#if 0
- /* FIXME PCIe address space */
- {
-#if 1
- /* Reserve 8040 PCI address space */
- extent_alloc_region(dom->sd_iovamap, 0xc0000000, 0x20000000,
- EX_WAITOK);
-#endif
- }
-#endif
-
SIMPLEQ_INSERT_TAIL(&sc->sc_domains, dom, sd_list);
return dom;
}
+void
+smmu_reserve_region(void *cookie, uint32_t sid, bus_addr_t addr,
+ bus_size_t size)
+{
+ struct smmu_softc *sc = cookie;
+ struct smmu_domain *dom;
+
+ dom = smmu_domain_lookup(sc, sid);
+ if (dom == NULL)
+ return;
+
+ extent_alloc_region(dom->sd_iovamap, addr, size,
+ EX_WAITOK | EX_CONFLICTOK);
+}
+
/* basically pmap follows */
/* virtual to physical helpers */
diff --git a/sys/arch/arm64/dev/smmu_acpi.c b/sys/arch/arm64/dev/smmu_acpi.c
index 10c1daf6137..c6b30c4082f 100644
--- a/sys/arch/arm64/dev/smmu_acpi.c
+++ b/sys/arch/arm64/dev/smmu_acpi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmu_acpi.c,v 1.2 2021/03/15 22:48:57 patrick Exp $ */
+/* $OpenBSD: smmu_acpi.c,v 1.3 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -126,5 +126,6 @@ smmu_acpi_attach(struct device *parent, struct device *self, void *aux)
as->as_node = node;
as->as_cookie = sc;
as->as_map = smmu_device_map;
+ as->as_reserve = smmu_reserve_region;
acpiiort_smmu_register(as);
}
diff --git a/sys/arch/arm64/dev/smmu_fdt.c b/sys/arch/arm64/dev/smmu_fdt.c
index 75c80c8efe6..cbf872d5d36 100644
--- a/sys/arch/arm64/dev/smmu_fdt.c
+++ b/sys/arch/arm64/dev/smmu_fdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmu_fdt.c,v 1.3 2021/03/15 22:48:57 patrick Exp $ */
+/* $OpenBSD: smmu_fdt.c,v 1.4 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -42,6 +42,7 @@ int smmu_fdt_match(struct device *, void *, void *);
void smmu_fdt_attach(struct device *, struct device *, void *);
bus_dma_tag_t smmu_fdt_map(void *, uint32_t *, bus_dma_tag_t);
+void smmu_fdt_reserve(void *, uint32_t *, bus_addr_t, bus_size_t);
struct cfattach smmu_fdt_ca = {
sizeof(struct smmu_fdt_softc), smmu_fdt_match, smmu_fdt_attach
@@ -108,6 +109,7 @@ smmu_fdt_attach(struct device *parent, struct device *self, void *aux)
fsc->sc_id.id_node = faa->fa_node;
fsc->sc_id.id_cookie = fsc;
fsc->sc_id.id_map = smmu_fdt_map;
+ fsc->sc_id.id_reserve = smmu_fdt_reserve;
iommu_device_register(&fsc->sc_id);
}
@@ -119,3 +121,13 @@ smmu_fdt_map(void *cookie, uint32_t *cells, bus_dma_tag_t dmat)
return smmu_device_map(sc, cells[0], dmat);
}
+
+void
+smmu_fdt_reserve(void *cookie, uint32_t *cells, bus_addr_t addr,
+ bus_size_t size)
+{
+ struct smmu_fdt_softc *fsc = (struct smmu_fdt_softc *)cookie;
+ struct smmu_softc *sc = &fsc->sc_smmu;
+
+ return smmu_reserve_region(sc, cells[0], addr, size);
+}
diff --git a/sys/arch/arm64/dev/smmuvar.h b/sys/arch/arm64/dev/smmuvar.h
index 14dc0f20918..7824c970d4f 100644
--- a/sys/arch/arm64/dev/smmuvar.h
+++ b/sys/arch/arm64/dev/smmuvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmuvar.h,v 1.5 2021/06/25 12:40:29 patrick Exp $ */
+/* $OpenBSD: smmuvar.h,v 1.6 2021/06/25 17:41:22 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -80,3 +80,4 @@ int smmu_attach(struct smmu_softc *);
int smmu_global_irq(void *);
int smmu_context_irq(void *);
bus_dma_tag_t smmu_device_map(void *, uint32_t, bus_dma_tag_t);
+void smmu_reserve_region(void *, uint32_t, bus_addr_t, bus_size_t);