[PATCH] Updated quirk-driven R3000Z patches
Nicolas Blais
nb_root at videotron.ca
Tue Feb 15 14:00:41 PST 2005
Hi,
Thanks for the patch. Will this be MFC into -STABLE?
Nicolas.
On February 14, 2005 17:22, John Baldwin wrote:
> I've tweaked Jung-uk Kim's patches to be driven by a single ACPI quirk
> rather than multiple hints. I've included the patch below. If the quirk
> is not automatically detected on your laptop, you can manually set it from
> the loader via 'set debug.acpi.quirks=4'. If you have to manually set the
> quirk to get it to work, please let me know and include the FADT header
> from your acpidump in your reply, thanks.
>
> --- //depot/vendor/freebsd/src/sys/amd64/acpica/madt.c 2004/06/10 21:30:51
> +++ //depot/user/jhb/acpipci/amd64/acpica/madt.c 2005/02/14 22:18:55
> @@ -367,7 +367,7 @@
> }
>
> /* First, we run through adding I/O APIC's. */
> - if (madt->PCATCompat)
> + if (madt->PCATCompat && !(acpi_quirks & ACPI_Q_MADT_IRQ0))
> ioapic_enable_mixed_mode();
> madt_walk_table(madt_parse_apics, NULL);
>
> @@ -596,8 +596,14 @@
> enum intr_polarity pol;
> char buf[64];
>
> + if (acpi_quirks & ACPI_Q_MADT_IRQ0 && intr->Source == 0 &&
> + intr->Interrupt == 2) {
> + if (bootverbose)
> + printf("MADT: Skipping timer override\n");
> + return;
> + }
> if (bootverbose)
> - printf("MADT: intr override: source %u, irq %u\n",
> + printf("MADT: Interrupt override: source %u, irq %u\n",
> intr->Source, intr->Interrupt);
> KASSERT(intr->Bus == 0, ("bus for interrupt overrides must be zero"));
> if (madt_find_interrupt(intr->Interrupt, &new_ioapic,
> --- //depot/vendor/freebsd/src/sys/dev/acpica/acpi_quirks 2004/10/08
> 18:00:57 +++ //depot/user/jhb/acpipci/dev/acpica/acpi_quirks 2005/02/14
> 21:45:45 @@ -101,6 +101,13 @@
> oem_rev: FADT <= 0x06040000
> quirks: ACPI_Q_BROKEN
>
> +# Compaq R3000Z
> +name: Compaq_R3000Z
> +oem: FADT "NVIDIA" "CK8 "
> +oem_rev: FADT = 0x6040000
> +creator: FADT "PTL_"
> +quirks: ACPI_Q_MADT_IRQ0
> +
> # Compaq Thunder 05/18/99
> # XXX Note creator rev should be "=", I think
> name: Compaq_Thunder
> --- //depot/vendor/freebsd/src/sys/dev/acpica/acpi_resource.c 2005/01/18
> 20:25:37 +++ //depot/user/jhb/acpipci/dev/acpica/acpi_resource.c 2005/01/18
> 23:04:51 @@ -77,6 +77,12 @@
> req->counter++;
> break;
> }
> + if (irq != rman_get_start(req->res) && irq == 0) {
> + if (bootverbose)
> + printf("IRQ is %u, resource is %lu\n", irq,
> + rman_get_start(req->res));
> + return (AE_CTRL_TERMINATE);
> + }
> req->found = 1;
> KASSERT(irq == rman_get_start(req->res),
> ("IRQ resources do not match"));
> --- //depot/vendor/freebsd/src/sys/dev/acpica/acpivar.h 2004/12/13 23:35:37
> +++ //depot/user/jhb/acpipci/dev/acpica/acpivar.h 2005/02/11 19:51:51
> @@ -160,11 +160,20 @@
> #define ACPI_INTR_APIC 1
> #define ACPI_INTR_SAPIC 2
>
> -/* Quirk flags. */
> +/*
> + * Quirk flags.
> + *
> + * ACPI_Q_BROKEN: Disables all ACPI support.
> + * ACPI_Q_TIMER: Disables support for the ACPI timer.
> + * ACPI_Q_MADT_IRQ0: Specifies that ISA IRQ 0 is wired up to pin 0 of the
> + * first APIC and that the MADT should force that by ignoring the PC-AT
> + * compatible flag and ignoring overrides that redirect IRQ 0 to pin 2.
> + */
> extern int acpi_quirks;
> #define ACPI_Q_OK 0
> -#define ACPI_Q_BROKEN (1 << 0) /* Disable ACPI completely. */
> -#define ACPI_Q_TIMER (1 << 1) /* Disable ACPI timer. */
> +#define ACPI_Q_BROKEN (1 << 0)
> +#define ACPI_Q_TIMER (1 << 1)
> +#define ACPI_Q_MADT_IRQ0 (1 << 2)
>
> /*
> * Note that the low ivar values are reserved to provide
> --- //depot/vendor/freebsd/src/sys/i386/acpica/madt.c 2004/06/10 20:05:33
> +++ //depot/user/jhb/acpipci/i386/acpica/madt.c 2005/02/14 22:18:55
> @@ -367,7 +367,7 @@
> }
>
> /* First, we run through adding I/O APIC's. */
> - if (madt->PCATCompat)
> + if (madt->PCATCompat && !(acpi_quirks & ACPI_Q_MADT_IRQ0))
> ioapic_enable_mixed_mode();
> madt_walk_table(madt_parse_apics, NULL);
>
> @@ -595,8 +595,14 @@
> enum intr_polarity pol;
> char buf[64];
>
> + if (acpi_quirks & ACPI_Q_MADT_IRQ0 && intr->Source == 0 &&
> + intr->Interrupt == 2) {
> + if (bootverbose)
> + printf("MADT: Skipping timer override\n");
> + return;
> + }
> if (bootverbose)
> - printf("MADT: intr override: source %u, irq %u\n",
> + printf("MADT: Interrupt override: source %u, irq %u\n",
> intr->Source, intr->Interrupt);
> KASSERT(intr->Bus == 0, ("bus for interrupt overrides must be zero"));
> if (madt_find_interrupt(intr->Interrupt, &new_ioapic,
> --- //depot/vendor/freebsd/src/sys/i386/i386/io_apic.c 2005/01/18 20:30:33
> +++ //depot/user/jhb/acpipci/i386/i386/io_apic.c 2005/02/08 19:07:03
> @@ -547,10 +547,11 @@
>
> /*
> * Assume that pin 0 on the first I/O APIC is an ExtINT pin
> - * and that pins 1-15 are ISA interrupts. Assume that all
> + * if mixed mode is enabled and an ISA interrupt if not.
> + * Assume that pins 1-15 are ISA interrupts and that all
> * other pins are PCI interrupts.
> */
> - if (intpin->io_vector == 0)
> + if (intpin->io_vector == 0 && mixed_mode_enabled)
> ioapic_set_extint(io, i);
> else if (intpin->io_vector < IOAPIC_ISA_INTS) {
> intpin->io_bus = APIC_BUS_ISA;
More information about the freebsd-amd64
mailing list