sync code with last improvements from OpenBSD

This commit is contained in:
purplerain 2023-09-12 16:38:01 +00:00
parent 5455e77c6b
commit ca32125ea8
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
17 changed files with 271 additions and 75 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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++;
}

View file

@ -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;