sync code with last improvements from OpenBSD
This commit is contained in:
parent
5455e77c6b
commit
ca32125ea8
17 changed files with 271 additions and 75 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: acpipci.c,v 1.39 2023/04/18 12:39:32 kettenis Exp $ */
|
||||
/* $OpenBSD: acpipci.c,v 1.40 2023/09/12 08:32:58 jmatthew Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2018 Mark Kettenis
|
||||
*
|
||||
|
@ -124,7 +124,10 @@ void *acpipci_intr_establish(void *, pci_intr_handle_t, int,
|
|||
struct cpu_info *, int (*)(void *), void *, char *);
|
||||
void acpipci_intr_disestablish(void *, void *);
|
||||
|
||||
uint32_t acpipci_iort_map_msi(pci_chipset_tag_t, pcitag_t);
|
||||
uint32_t acpipci_iort_map_msi(pci_chipset_tag_t, pcitag_t,
|
||||
struct interrupt_controller **);
|
||||
|
||||
extern LIST_HEAD(, interrupt_controller) interrupt_controllers;
|
||||
|
||||
int
|
||||
acpipci_match(struct device *parent, void *match, void *aux)
|
||||
|
@ -190,7 +193,6 @@ acpipci_attach(struct device *parent, struct device *self, void *aux)
|
|||
sc->sc_bus_memt._space_map = acpipci_bs_map;
|
||||
sc->sc_bus_memt._space_mmap = acpipci_bs_mmap;
|
||||
|
||||
extern LIST_HEAD(, interrupt_controller) interrupt_controllers;
|
||||
LIST_FOREACH(ic, &interrupt_controllers, ic_list) {
|
||||
if (ic->ic_establish_msi)
|
||||
break;
|
||||
|
@ -632,7 +634,7 @@ acpipci_intr_establish(void *v, pci_intr_handle_t ih, int level,
|
|||
KASSERT(ic);
|
||||
|
||||
/* Map Requester ID through IORT to get sideband data. */
|
||||
data = acpipci_iort_map_msi(ih.ih_pc, ih.ih_tag);
|
||||
data = acpipci_iort_map_msi(ih.ih_pc, ih.ih_tag, &ic);
|
||||
cookie = ic->ic_establish_msi(ic->ic_cookie, &addr,
|
||||
&data, level, ci, func, arg, name);
|
||||
if (cookie == NULL)
|
||||
|
@ -797,11 +799,12 @@ pci_lookup_segment(int segment)
|
|||
* IORT support.
|
||||
*/
|
||||
|
||||
uint32_t acpipci_iort_map(struct acpi_iort *, uint32_t, uint32_t);
|
||||
uint32_t acpipci_iort_map(struct acpi_iort *, uint32_t, uint32_t,
|
||||
struct interrupt_controller **);
|
||||
|
||||
uint32_t
|
||||
acpipci_iort_map_node(struct acpi_iort *iort,
|
||||
struct acpi_iort_node *node, uint32_t id)
|
||||
struct acpi_iort_node *node, uint32_t id, struct interrupt_controller **ic)
|
||||
{
|
||||
struct acpi_iort_mapping *map =
|
||||
(struct acpi_iort_mapping *)((char *)node + node->mapping_offset);
|
||||
|
@ -812,14 +815,14 @@ acpipci_iort_map_node(struct acpi_iort *iort,
|
|||
|
||||
if (map[i].flags & ACPI_IORT_MAPPING_SINGLE) {
|
||||
id = map[i].output_base;
|
||||
return acpipci_iort_map(iort, offset, id);
|
||||
return acpipci_iort_map(iort, offset, id, ic);
|
||||
}
|
||||
|
||||
/* Mapping encodes number of IDs in the range minus one. */
|
||||
if (map[i].input_base <= id &&
|
||||
id <= map[i].input_base + map[i].number_of_ids) {
|
||||
id = map[i].output_base + (id - map[i].input_base);
|
||||
return acpipci_iort_map(iort, offset, id);
|
||||
return acpipci_iort_map(iort, offset, id, ic);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -827,24 +830,39 @@ acpipci_iort_map_node(struct acpi_iort *iort,
|
|||
}
|
||||
|
||||
uint32_t
|
||||
acpipci_iort_map(struct acpi_iort *iort, uint32_t offset, uint32_t id)
|
||||
acpipci_iort_map(struct acpi_iort *iort, uint32_t offset, uint32_t id,
|
||||
struct interrupt_controller **ic)
|
||||
{
|
||||
struct acpi_iort_node *node =
|
||||
(struct acpi_iort_node *)((char *)iort + offset);
|
||||
struct interrupt_controller *icl;
|
||||
struct acpi_iort_its_node *itsn;
|
||||
int i;
|
||||
|
||||
switch (node->type) {
|
||||
case ACPI_IORT_ITS:
|
||||
itsn = (struct acpi_iort_its_node *)&node[1];
|
||||
LIST_FOREACH(icl, &interrupt_controllers, ic_list) {
|
||||
for (i = 0; i < itsn->number_of_itss; i++) {
|
||||
if (icl->ic_gic_its_id == itsn->its_ids[i]) {
|
||||
*ic = icl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return id;
|
||||
case ACPI_IORT_SMMU:
|
||||
case ACPI_IORT_SMMU_V3:
|
||||
return acpipci_iort_map_node(iort, node, id);
|
||||
return acpipci_iort_map_node(iort, node, id, ic);
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
acpipci_iort_map_msi(pci_chipset_tag_t pc, pcitag_t tag)
|
||||
acpipci_iort_map_msi(pci_chipset_tag_t pc, pcitag_t tag,
|
||||
struct interrupt_controller **ic)
|
||||
{
|
||||
struct acpipci_softc *sc = pc->pc_intr_v;
|
||||
struct acpi_table_header *hdr;
|
||||
|
@ -877,7 +895,8 @@ acpipci_iort_map_msi(pci_chipset_tag_t pc, pcitag_t tag)
|
|||
case ACPI_IORT_ROOT_COMPLEX:
|
||||
rc = (struct acpi_iort_rc_node *)&node[1];
|
||||
if (rc->segment == sc->sc_seg)
|
||||
return acpipci_iort_map_node(iort, node, rid);
|
||||
return acpipci_iort_map_node(iort, node, rid,
|
||||
ic);
|
||||
break;
|
||||
}
|
||||
offset += node->length;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: agintc.c,v 1.52 2023/07/07 10:11:39 patrick Exp $ */
|
||||
/* $OpenBSD: agintc.c,v 1.53 2023/09/12 08:29:28 jmatthew Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2007, 2009, 2011, 2017 Dale Rahn <drahn@dalerahn.com>
|
||||
* Copyright (c) 2018 Mark Kettenis <kettenis@openbsd.org>
|
||||
|
@ -1797,6 +1797,8 @@ agintc_msi_attach(struct device *parent, struct device *self, void *aux)
|
|||
sc->sc_ic.ic_establish_msi = agintc_intr_establish_msi;
|
||||
sc->sc_ic.ic_disestablish = agintc_intr_disestablish_msi;
|
||||
sc->sc_ic.ic_barrier = agintc_intr_barrier_msi;
|
||||
sc->sc_ic.ic_gic_its_id = OF_getpropint(faa->fa_node,
|
||||
"openbsd,gic-its-id", 0);
|
||||
arm_intr_register_fdt(&sc->sc_ic);
|
||||
return;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: intr.h,v 1.21 2022/12/21 22:30:42 kettenis Exp $ */
|
||||
/* $OpenBSD: intr.h,v 1.22 2023/09/12 08:29:28 jmatthew Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
|
||||
|
@ -162,6 +162,7 @@ struct interrupt_controller {
|
|||
LIST_ENTRY(interrupt_controller) ic_list;
|
||||
uint32_t ic_phandle;
|
||||
uint32_t ic_cells;
|
||||
uint32_t ic_gic_its_id;
|
||||
};
|
||||
|
||||
void arm_intr_init_fdt(void);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: efiacpi.c,v 1.14 2022/01/02 02:13:33 jsg Exp $ */
|
||||
/* $OpenBSD: efiacpi.c,v 1.15 2023/09/12 08:22:07 jmatthew Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2018 Mark Kettenis <kettenis@openbsd.org>
|
||||
|
@ -491,11 +491,13 @@ efi_acpi_madt_gic_its(struct acpi_madt_gic_its *its)
|
|||
static uint32_t phandle = 2;
|
||||
void *node, *child;
|
||||
uint64_t reg[2];
|
||||
uint32_t its_id;
|
||||
char name[32];
|
||||
|
||||
snprintf(name, sizeof(name), "gic-its@%llx", its->base_address);
|
||||
reg[0] = htobe64(its->base_address);
|
||||
reg[1] = htobe64(0x20000);
|
||||
its_id = htobe32(its->gic_its_id);
|
||||
|
||||
/* Create "gic-its" node. */
|
||||
node = fdt_find_node("/interrupt-controller");
|
||||
|
@ -504,6 +506,8 @@ efi_acpi_madt_gic_its(struct acpi_madt_gic_its *its)
|
|||
fdt_node_add_property(child, "msi-controller", NULL, 0);
|
||||
fdt_node_add_property(child, "reg", reg, sizeof(reg));
|
||||
fdt_node_add_property(child, "phandle", &phandle, sizeof(phandle));
|
||||
fdt_node_add_property(child, "openbsd,gic-its-id", &its_id,
|
||||
sizeof(its_id));
|
||||
phandle++;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: acpireg.h,v 1.59 2022/11/24 04:04:39 jmatthew Exp $ */
|
||||
/* $OpenBSD: acpireg.h,v 1.60 2023/09/12 08:32:58 jmatthew Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
|
||||
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
|
||||
|
@ -718,6 +718,11 @@ struct acpi_iort_node {
|
|||
uint32_t mapping_offset;
|
||||
} __packed;
|
||||
|
||||
struct acpi_iort_its_node {
|
||||
uint32_t number_of_itss;
|
||||
uint32_t its_ids[];
|
||||
} __packed;
|
||||
|
||||
struct acpi_iort_nc_node {
|
||||
uint32_t node_flags;
|
||||
uint64_t memory_access_properties;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue