tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: VirtIO MMIO for amd64



> Date: Wed, 20 Dec 2023 08:37:32 +0100
> From: Emile 'iMil' Heitor <imil%home.imil.net@localhost>
> 
> On 12/20/23 06:55, Emile 'iMil' Heitor wrote:
> 
> > Well that's the thing, I can't find where does MMIO attaches on FreeBSD,
> > they have a very simple way of creating the resources:
> 
> After a bit of digging, their virtio_mmio device attaches to "nexus0",
> which if I understand correctly, is our mainbus equivalent.

This is presumably some platform-specific irq numbering scheme.

I skimmed through the FreeBSD sources and it looks like, on x86:

1. irqs [0,16) are probably verbatim i8259 vectors, which you can get
   at with intr_establish_xname(irq, &i8259_pic, ...)

2. irqs in [0,n), where n is the number of pins, might also be ioapic
   vectors (which might overlap with i8259?)

3. mptable might determine more ioapic irq numbers allocated
   consecutively after the first zero-based ioapic

4. ACPI MADT, if present, might determine more ioapic irq numbers
   starting from GlobalIrqBase

5. irq numbers starting at first_msi_irq, which is one higher than all
   the previously allocated irq numbers, are for MSI

It would be nice if someone laid out a map of how these interrupt
numbering schemes work and are related (and how they are numbered on
both FreeBSD and NetBSD).  I'm sure I can spend hours poring through
the Intel and ACPI manuals to create the reverse map but it's a pain!


My guess is that this is not going to be MSI -- it'll either be i8259
or ioapic.  In that case, it may work to do this:

	struct ioapic_soft *ioapic = ioapic_find_bybase(irq);
	struct pic *pic;
	int pin;

	if (ioapic != NULL) {
		/*
		 * Some logic in x86/acpi/acpi_machdep.c has a
		 * conditional on this, but I can't see how we
		 * could possibly have a struct ioapic_softc
		 * whose sc_pic.pic_type is not PIC_IOAPIC, so
		 * I think that must be a dead branch.
		 */
		KASSERT(ioapic->sc_pic.pic_type == PIC_IOAPIC);

		pic = &ioapic->sc_pic;
		pin = irq - pic->pic_vecbase;
		irq = -1;
	} else {
		pic = &i8259_pic;
		pin = irq;
	}
	ih = intr_establish_xname(irq, pic, pin, ...);


Home | Main Index | Thread Index | Old Index