Add support for ACPI in xen-3 dom0 support. We can now boot a xen-3 dom0
kernel with a default xen comamnd line.
This commit is contained in:
parent
c1cd33addf
commit
aab0004b68
|
@ -1,4 +1,4 @@
|
||||||
# $NetBSD: files.compat,v 1.10 2006/01/15 22:09:51 bouyer Exp $
|
# $NetBSD: files.compat,v 1.11 2006/04/09 19:28:00 bouyer Exp $
|
||||||
# NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp
|
# NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp
|
||||||
|
|
||||||
# options for MP configuration through the MP spec
|
# options for MP configuration through the MP spec
|
||||||
|
@ -27,7 +27,6 @@ defflag vesabios.h XXXVESABIOS
|
||||||
defflag bioscall.h XXXBIOSCALL
|
defflag bioscall.h XXXBIOSCALL
|
||||||
defflag opt_pcibios.h XXXOPT_PCIBIOS
|
defflag opt_pcibios.h XXXOPT_PCIBIOS
|
||||||
defflag opt_pcifixup.h XXXOPT_PCIFIXUP
|
defflag opt_pcifixup.h XXXOPT_PCIFIXUP
|
||||||
defflag acpi.h XXXACPI
|
|
||||||
defflag opt_mpacpi.h XXXOPT_MPACPI
|
defflag opt_mpacpi.h XXXOPT_MPACPI
|
||||||
defflag opt_mpbios.h XXXOPT_MPBIOS
|
defflag opt_mpbios.h XXXOPT_MPBIOS
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $NetBSD: files.xen,v 1.39 2006/04/04 03:13:12 gdamore Exp $
|
# $NetBSD: files.xen,v 1.40 2006/04/09 19:28:01 bouyer Exp $
|
||||||
# NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp
|
# NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp
|
||||||
# NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp
|
# NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp
|
||||||
|
|
||||||
|
@ -22,6 +22,12 @@ defflag opt_beep.h BEEP_ONHALT
|
||||||
defparam opt_beep.h BEEP_ONHALT_COUNT
|
defparam opt_beep.h BEEP_ONHALT_COUNT
|
||||||
defparam opt_beep.h BEEP_ONHALT_PITCH BEEP_ONHALT_PERIOD
|
defparam opt_beep.h BEEP_ONHALT_PITCH BEEP_ONHALT_PERIOD
|
||||||
|
|
||||||
|
# PCI fixup options
|
||||||
|
defflag opt_pcifixup.h PCI_ADDR_FIXUP PCI_BUS_FIXUP
|
||||||
|
PCI_INTR_FIXUP PCI_INTR_FIXUP_FORCE
|
||||||
|
|
||||||
|
defparam PCI_CONF_MODE
|
||||||
|
|
||||||
file arch/xen/i386/autoconf.c
|
file arch/xen/i386/autoconf.c
|
||||||
file arch/i386/i386/db_dbgreg.S ddb | kstack_check_dr0
|
file arch/i386/i386/db_dbgreg.S ddb | kstack_check_dr0
|
||||||
file arch/i386/i386/db_disasm.c ddb
|
file arch/i386/i386/db_disasm.c ddb
|
||||||
|
@ -116,7 +122,7 @@ attach mainbus at root
|
||||||
file arch/xen/i386/mainbus.c mainbus
|
file arch/xen/i386/mainbus.c mainbus
|
||||||
|
|
||||||
# Xen hypervisor
|
# Xen hypervisor
|
||||||
device hypervisor { }: isabus, pcibus, sysmon_power, xendevbus
|
device hypervisor { }: isabus, pcibus, sysmon_power, xendevbus, acpibus
|
||||||
attach hypervisor at hypervisorbus
|
attach hypervisor at hypervisorbus
|
||||||
file arch/xen/xen/hypervisor.c hypervisor needs-flag
|
file arch/xen/xen/hypervisor.c hypervisor needs-flag
|
||||||
|
|
||||||
|
@ -185,6 +191,16 @@ include "dev/usb/files.usb"
|
||||||
|
|
||||||
include "dev/ieee1394/files.ieee1394"
|
include "dev/ieee1394/files.ieee1394"
|
||||||
|
|
||||||
|
device fdc {drive = -1} #XXX
|
||||||
|
|
||||||
|
include "dev/acpi/files.acpi"
|
||||||
|
file arch/xen/xen/xen_acpi_machdep.c acpi
|
||||||
|
file arch/x86/x86/acpi_machdep.c acpi
|
||||||
|
file arch/x86/x86/i8259.c acpi
|
||||||
|
|
||||||
|
file arch/i386/pci/pci_bus_fixup.c pci_bus_fixup
|
||||||
|
file arch/i386/pci/pci_addr_fixup.c pci_addr_fixup
|
||||||
|
|
||||||
# PCI-Host bridge chipsets
|
# PCI-Host bridge chipsets
|
||||||
device pchb: pcibus, agpbus, agp_ali, agp_amd, agp_i810, agp_intel, agp_sis,
|
device pchb: pcibus, agpbus, agp_ali, agp_amd, agp_i810, agp_intel, agp_sis,
|
||||||
agp_via
|
agp_via
|
||||||
|
@ -278,7 +294,9 @@ file arch/xen/xen/privcmd.c dom0ops
|
||||||
file arch/xen/i386/xen_shm_machdep.c dom0ops
|
file arch/xen/i386/xen_shm_machdep.c dom0ops
|
||||||
file arch/xen/xen/xbdback.c dom0ops & !xen3
|
file arch/xen/xen/xbdback.c dom0ops & !xen3
|
||||||
file arch/xen/xen/xennetback.c dom0ops & !xen3
|
file arch/xen/xen/xennetback.c dom0ops & !xen3
|
||||||
file arch/xen/xen/pci_machdep.c hypervisor & pci
|
file arch/xen/xen/pci_machdep.c hypervisor & pci & !xen3
|
||||||
|
file arch/x86/pci/pci_machdep.c hypervisor & pci & xen3
|
||||||
|
file arch/xen/xen/pci_intr_machdep.c hypervisor & pci
|
||||||
file arch/xen/xen/isa_machdep.c hypervisor & dom0ops
|
file arch/xen/xen/isa_machdep.c hypervisor & dom0ops
|
||||||
file arch/xen/xen/xenevt.c xenevt & dom0ops
|
file arch/xen/xen/xenevt.c xenevt & dom0ops
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: machdep.c,v 1.26 2006/03/23 04:14:33 jld Exp $ */
|
/* $NetBSD: machdep.c,v 1.27 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
/* NetBSD: machdep.c,v 1.559 2004/07/22 15:12:46 mycroft Exp */
|
/* NetBSD: machdep.c,v 1.559 2004/07/22 15:12:46 mycroft Exp */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.26 2006/03/23 04:14:33 jld Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.27 2006/04/09 19:28:01 bouyer Exp $");
|
||||||
|
|
||||||
#include "opt_beep.h"
|
#include "opt_beep.h"
|
||||||
#include "opt_compat_ibcs2.h"
|
#include "opt_compat_ibcs2.h"
|
||||||
|
@ -162,20 +162,12 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.26 2006/03/23 04:14:33 jld Exp $");
|
||||||
#include <machine/vm86.h>
|
#include <machine/vm86.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "acpi.h"
|
|
||||||
#include "apm.h"
|
|
||||||
#include "bioscall.h"
|
#include "bioscall.h"
|
||||||
|
|
||||||
#if NBIOSCALL > 0
|
#if NBIOSCALL > 0
|
||||||
#include <machine/bioscall.h>
|
#include <machine/bioscall.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if NACPI > 0
|
|
||||||
#include <dev/acpi/acpivar.h>
|
|
||||||
#define ACPI_MACHDEP_PRIVATE
|
|
||||||
#include <machine/acpi_machdep.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NAPM > 0
|
#if NAPM > 0
|
||||||
#include <machine/apmvar.h>
|
#include <machine/apmvar.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -838,13 +830,6 @@ haltsys:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
|
if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
|
||||||
#if NACPI > 0
|
|
||||||
if (acpi_softc != NULL) {
|
|
||||||
delay(500000);
|
|
||||||
acpi_enter_sleep_state(acpi_softc, ACPI_STATE_S5);
|
|
||||||
printf("WARNING: ACPI powerdown failed!\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if NAPM > 0 && !defined(APM_NO_POWEROFF)
|
#if NAPM > 0 && !defined(APM_NO_POWEROFF)
|
||||||
/* turn off, if we can. But try to turn disk off and
|
/* turn off, if we can. But try to turn disk off and
|
||||||
* wait a bit first--some disk drives are slow to clean up
|
* wait a bit first--some disk drives are slow to clean up
|
||||||
|
@ -1582,11 +1567,6 @@ init386(paddr_t first_avail)
|
||||||
realmode_reserved_size = MP_TRAMPOLINE; /* XXX */
|
realmode_reserved_size = MP_TRAMPOLINE; /* XXX */
|
||||||
needs_earlier_install_pte0 = 1; /* XXX */
|
needs_earlier_install_pte0 = 1; /* XXX */
|
||||||
#endif /* XXX */
|
#endif /* XXX */
|
||||||
#if NACPI > 0
|
|
||||||
/* trampoline code for wake handler */
|
|
||||||
realmode_reserved_size += ptoa(acpi_md_get_npages_of_wakecode()+1);
|
|
||||||
needs_earlier_install_pte0 = 1;
|
|
||||||
#endif
|
|
||||||
if (needs_earlier_install_pte0) {
|
if (needs_earlier_install_pte0) {
|
||||||
/* page table for directory entry 0 */
|
/* page table for directory entry 0 */
|
||||||
realmode_reserved_size += PAGE_SIZE;
|
realmode_reserved_size += PAGE_SIZE;
|
||||||
|
@ -1953,40 +1933,6 @@ init386(paddr_t first_avail)
|
||||||
realmode_reserved_start += PAGE_SIZE;
|
realmode_reserved_start += PAGE_SIZE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if NACPI > 0
|
|
||||||
/*
|
|
||||||
* Steal memory for the acpi wake code
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
paddr_t paddr, p;
|
|
||||||
psize_t sz;
|
|
||||||
int npg;
|
|
||||||
|
|
||||||
paddr = realmode_reserved_start;
|
|
||||||
npg = acpi_md_get_npages_of_wakecode();
|
|
||||||
sz = ptoa(npg);
|
|
||||||
#ifdef DIAGNOSTIC
|
|
||||||
if (realmode_reserved_size < sz) {
|
|
||||||
panic("cannot steal memory for ACPI wake code.");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* identical mapping */
|
|
||||||
p = paddr;
|
|
||||||
for (x=0; x<npg; x++) {
|
|
||||||
printf("kenter: 0x%08X\n", (unsigned)p);
|
|
||||||
pmap_kenter_pa((vaddr_t)p, p, VM_PROT_ALL);
|
|
||||||
p += PAGE_SIZE;
|
|
||||||
}
|
|
||||||
pmap_update(pmap_kernel());
|
|
||||||
|
|
||||||
acpi_md_install_wakecode(paddr);
|
|
||||||
|
|
||||||
realmode_reserved_size -= sz;
|
|
||||||
realmode_reserved_start += sz;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pmap_kenter_pa(idt_vaddr, idt_paddr, VM_PROT_READ|VM_PROT_WRITE);
|
pmap_kenter_pa(idt_vaddr, idt_paddr, VM_PROT_READ|VM_PROT_WRITE);
|
||||||
pmap_update(pmap_kernel());
|
pmap_update(pmap_kernel());
|
||||||
memset((void *)idt_vaddr, 0, PAGE_SIZE);
|
memset((void *)idt_vaddr, 0, PAGE_SIZE);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: mainbus.c,v 1.7 2005/12/11 12:19:48 christos Exp $ */
|
/* $NetBSD: mainbus.c,v 1.8 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
/* NetBSD: mainbus.c,v 1.53 2003/10/27 14:11:47 junyoung Exp */
|
/* NetBSD: mainbus.c,v 1.53 2003/10/27 14:11:47 junyoung Exp */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.7 2005/12/11 12:19:48 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.8 2006/04/09 19:28:01 bouyer Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -40,53 +40,12 @@ __KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.7 2005/12/11 12:19:48 christos Exp $")
|
||||||
|
|
||||||
#include <machine/bus.h>
|
#include <machine/bus.h>
|
||||||
|
|
||||||
#include <dev/isa/isavar.h>
|
|
||||||
#include <dev/eisa/eisavar.h>
|
|
||||||
#include <dev/pci/pcivar.h>
|
|
||||||
|
|
||||||
#include <dev/isa/isareg.h> /* for ISA_HOLE_VADDR */
|
|
||||||
|
|
||||||
#include "pci.h"
|
|
||||||
#include "eisa.h"
|
|
||||||
#include "isa.h"
|
|
||||||
#include "isadma.h"
|
|
||||||
#include "mca.h"
|
|
||||||
#include "apm.h"
|
|
||||||
#include "pnpbios.h"
|
|
||||||
#include "acpi.h"
|
|
||||||
#include "vesabios.h"
|
|
||||||
#include "hypervisor.h"
|
#include "hypervisor.h"
|
||||||
|
|
||||||
#include "opt_mpacpi.h"
|
|
||||||
#include "opt_mpbios.h"
|
|
||||||
#include "opt_xen.h"
|
#include "opt_xen.h"
|
||||||
|
|
||||||
#include <machine/cpuvar.h>
|
#include <machine/cpuvar.h>
|
||||||
#include <machine/i82093var.h>
|
#include <machine/i82093var.h>
|
||||||
#include <machine/mpbiosvar.h>
|
|
||||||
#include <machine/mpacpi.h>
|
|
||||||
|
|
||||||
#if NAPM > 0
|
|
||||||
#include <machine/bioscall.h>
|
|
||||||
#include <machine/apmvar.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NPNPBIOS > 0
|
|
||||||
#include <arch/i386/pnpbios/pnpbiosvar.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NACPI > 0
|
|
||||||
#include <dev/acpi/acpivar.h>
|
|
||||||
#include <dev/acpi/acpi_madt.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NMCA > 0
|
|
||||||
#include <dev/mca/mcavar.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NVESABIOS > 0
|
|
||||||
#include <arch/i386/bios/vesabios.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XEN
|
#ifdef XEN
|
||||||
#include <machine/xen.h>
|
#include <machine/xen.h>
|
||||||
|
@ -103,26 +62,7 @@ int mainbus_print(void *, const char *);
|
||||||
|
|
||||||
union mainbus_attach_args {
|
union mainbus_attach_args {
|
||||||
const char *mba_busname; /* first elem of all */
|
const char *mba_busname; /* first elem of all */
|
||||||
struct pcibus_attach_args mba_pba;
|
|
||||||
struct eisabus_attach_args mba_eba;
|
|
||||||
struct isabus_attach_args mba_iba;
|
|
||||||
#if NMCA > 0
|
|
||||||
struct mcabus_attach_args mba_mba;
|
|
||||||
#endif
|
|
||||||
#if NAPM > 0
|
|
||||||
struct apm_attach_args mba_aaa;
|
|
||||||
#endif
|
|
||||||
#if NPNPBIOS > 0
|
|
||||||
struct pnpbios_attach_args mba_paa;
|
|
||||||
#endif
|
|
||||||
struct cpu_attach_args mba_caa;
|
struct cpu_attach_args mba_caa;
|
||||||
struct apic_attach_args aaa_caa;
|
|
||||||
#if NACPI > 0
|
|
||||||
struct acpibus_attach_args mba_acpi;
|
|
||||||
#endif
|
|
||||||
#if NVESABIOS > 0
|
|
||||||
struct vesabios_attach_args mba_vba;
|
|
||||||
#endif
|
|
||||||
#if NHYPERVISOR > 0
|
#if NHYPERVISOR > 0
|
||||||
struct hypervisor_attach_args mba_haa;
|
struct hypervisor_attach_args mba_haa;
|
||||||
#endif
|
#endif
|
||||||
|
@ -189,178 +129,15 @@ mainbus_attach(parent, self, aux)
|
||||||
void *aux;
|
void *aux;
|
||||||
{
|
{
|
||||||
union mainbus_attach_args mba;
|
union mainbus_attach_args mba;
|
||||||
#if NACPI > 0
|
|
||||||
int acpi_present = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef MPBIOS
|
|
||||||
int mpbios_present = 0;
|
|
||||||
#endif
|
|
||||||
int mpacpi_active = 0;
|
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
#ifdef MPBIOS
|
memset(&mba.mba_caa, 0, sizeof(mba.mba_caa));
|
||||||
mpbios_present = mpbios_probe(self);
|
mba.mba_caa.caa_name = "cpu";
|
||||||
#endif
|
mba.mba_caa.cpu_number = 0;
|
||||||
|
mba.mba_caa.cpu_role = CPU_ROLE_SP;
|
||||||
#if XXXNPCI > 0
|
mba.mba_caa.cpu_func = 0;
|
||||||
/*
|
config_found_ia(self, "cpubus", &mba.mba_caa, mainbus_print);
|
||||||
* ACPI needs to be able to access PCI configuration space.
|
|
||||||
*/
|
|
||||||
pci_mode = pci_mode_detect();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NACPI > 0
|
|
||||||
acpi_present = acpi_probe();
|
|
||||||
#ifdef MPACPI
|
|
||||||
/*
|
|
||||||
* First, see if the MADT contains CPUs, and possibly I/O APICs.
|
|
||||||
* Building the interrupt routing structures can only
|
|
||||||
* be done later (via a callback).
|
|
||||||
*/
|
|
||||||
if (acpi_present)
|
|
||||||
mpacpi_active = mpacpi_scan_apics(self);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!mpacpi_active) {
|
|
||||||
#ifdef MPBIOS
|
|
||||||
if (mpbios_present)
|
|
||||||
mpbios_scan(self);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
struct cpu_attach_args caa;
|
|
||||||
|
|
||||||
memset(&caa, 0, sizeof(caa));
|
|
||||||
caa.caa_name = "cpu";
|
|
||||||
caa.cpu_number = 0;
|
|
||||||
caa.cpu_role = CPU_ROLE_SP;
|
|
||||||
caa.cpu_func = 0;
|
|
||||||
|
|
||||||
config_found_ia(self, "cpubus", &caa, mainbus_print);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if NVESABIOS > 0
|
|
||||||
if (vbeprobe()) {
|
|
||||||
mba.mba_vba.vaa_busname = "vesabios";
|
|
||||||
config_found_ia(self, "vesabiosbus", &mba.mba_vba, mainbus_print);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NISADMA > 0 && (NACPI > 0 || NPNPBIOS > 0)
|
|
||||||
/*
|
|
||||||
* ACPI and PNPBIOS need ISA DMA initialized before they start probing.
|
|
||||||
*/
|
|
||||||
isa_dmainit(&x86_isa_chipset, X86_BUS_SPACE_IO, &isa_bus_dma_tag,
|
|
||||||
self);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NACPI > 0
|
|
||||||
if (acpi_present) {
|
|
||||||
mba.mba_acpi.aa_busname = "acpi";
|
|
||||||
mba.mba_acpi.aa_iot = X86_BUS_SPACE_IO;
|
|
||||||
mba.mba_acpi.aa_memt = X86_BUS_SPACE_MEM;
|
|
||||||
mba.mba_acpi.aa_pc = NULL;
|
|
||||||
mba.mba_acpi.aa_pciflags =
|
|
||||||
PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED |
|
|
||||||
PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY |
|
|
||||||
PCI_FLAGS_MWI_OKAY;
|
|
||||||
mba.mba_acpi.aa_ic = &x86_isa_chipset;
|
|
||||||
config_found_ia(self, "acpibus", &mba.mba_acpi, mainbus_print);
|
|
||||||
#if 0 /* XXXJRT not yet */
|
|
||||||
if (acpi_active) {
|
|
||||||
/*
|
|
||||||
* ACPI already did all the work for us, there
|
|
||||||
* is nothing more for us to do.
|
|
||||||
*/
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NPNPBIOS > 0
|
|
||||||
#if NACPI > 0
|
|
||||||
if (acpi_active == 0)
|
|
||||||
#endif
|
|
||||||
if (pnpbios_probe()) {
|
|
||||||
mba.mba_paa.paa_busname = "pnpbios";
|
|
||||||
mba.mba_paa.paa_ic = &x86_isa_chipset;
|
|
||||||
config_found_ia(self, "pnpbuisbus", &mba.mba_paa,
|
|
||||||
mainbus_print);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX Note also that the presence of a PCI bus should
|
|
||||||
* XXX _always_ be checked, and if present the bus should be
|
|
||||||
* XXX 'found'. However, because of the structure of the code,
|
|
||||||
* XXX that's not currently possible.
|
|
||||||
*/
|
|
||||||
#if XXXNPCI > 0
|
|
||||||
if (pci_mode != 0) {
|
|
||||||
mba.mba_pba.pba_iot = X86_BUS_SPACE_IO;
|
|
||||||
mba.mba_pba.pba_memt = X86_BUS_SPACE_MEM;
|
|
||||||
mba.mba_pba.pba_dmat = &pci_bus_dma_tag;
|
|
||||||
mba.mba_pba.pba_dmat64 = NULL;
|
|
||||||
mba.mba_pba.pba_pc = NULL;
|
|
||||||
mba.mba_pba.pba_flags = pci_bus_flags();
|
|
||||||
mba.mba_pba.pba_bus = 0;
|
|
||||||
mba.mba_pba.pba_bridgetag = NULL;
|
|
||||||
#if defined(MPACPI) && defined(MPACPI_SCANPCI)
|
|
||||||
if (mpacpi_active)
|
|
||||||
mpacpi_scan_pci(self, &mba.mba_pba, pcibusprint);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
#if defined(MPBIOS) && defined(MPBIOS_SCANPCI)
|
|
||||||
if (mpbios_scanned != 0)
|
|
||||||
mpbios_scan_pci(self, &mba.mba_pba, pcibusprint);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
config_found_ia(self, "pcibus", &mba.mba_pba, pcibusprint);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NMCA > 0
|
|
||||||
/* Note: MCA bus probe is done in i386/machdep.c */
|
|
||||||
if (MCA_system) {
|
|
||||||
mba.mba_mba.mba_iot = X86_BUS_SPACE_IO;
|
|
||||||
mba.mba_mba.mba_memt = X86_BUS_SPACE_MEM;
|
|
||||||
mba.mba_mba.mba_dmat = &mca_bus_dma_tag;
|
|
||||||
mba.mba_mba.mba_mc = NULL;
|
|
||||||
mba.mba_mba.mba_bus = 0;
|
|
||||||
config_found_ia(self, "mcabus", &mba.mba_mba, mcabusprint);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef XEN
|
|
||||||
if (memcmp(ISA_HOLE_VADDR(EISA_ID_PADDR), EISA_ID, EISA_ID_LEN) == 0 &&
|
|
||||||
eisa_has_been_seen == 0) {
|
|
||||||
mba.mba_eba.eba_iot = X86_BUS_SPACE_IO;
|
|
||||||
mba.mba_eba.eba_memt = X86_BUS_SPACE_MEM;
|
|
||||||
#if NEISA > 0
|
|
||||||
mba.mba_eba.eba_dmat = &eisa_bus_dma_tag;
|
|
||||||
#endif
|
|
||||||
config_found_ia(self, "eisabus", &mba.mba_eba, eisabusprint);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if XXXNISA > 0
|
|
||||||
if (isa_has_been_seen == 0)
|
|
||||||
config_found_ia(self, "isabus", &mba_iba, isabusprint);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NAPM > 0
|
|
||||||
#if NACPI > 0
|
|
||||||
if (acpi_active == 0)
|
|
||||||
#endif
|
|
||||||
if (apm_busprobe()) {
|
|
||||||
mba.mba_aaa.aaa_busname = "apm";
|
|
||||||
config_found_ia(self, "apmbus", &mba.mba_aaa, mainbus_print);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NHYPERVISOR > 0
|
#if NHYPERVISOR > 0
|
||||||
mba.mba_haa.haa_busname = "hypervisor";
|
mba.mba_haa.haa_busname = "hypervisor";
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
/* $NetBSD: acpi_func.h,v 1.1 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
|
#include <i386/acpi_func.h>
|
|
@ -0,0 +1,3 @@
|
||||||
|
/* $NetBSD: acpi_machdep.h,v 1.1 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
|
#include <x86/acpi_machdep.h>
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: intr.h,v 1.9 2006/02/16 20:17:15 perry Exp $ */
|
/* $NetBSD: intr.h,v 1.10 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
/* NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp */
|
/* NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
|
@ -46,6 +46,13 @@
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <machine/pic.h>
|
#include <machine/pic.h>
|
||||||
|
|
||||||
|
#include "opt_xen.h"
|
||||||
|
|
||||||
|
#ifdef XEN3
|
||||||
|
/* for x86 compatibility */
|
||||||
|
extern struct intrstub i8259_stubs[];
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Struct describing an event channel.
|
* Struct describing an event channel.
|
||||||
*/
|
*/
|
||||||
|
@ -209,6 +216,7 @@ struct pcibus_attach_args;
|
||||||
void intr_default_setup(void);
|
void intr_default_setup(void);
|
||||||
int x86_nmi(void);
|
int x86_nmi(void);
|
||||||
void intr_calculatemasks(struct evtsource *);
|
void intr_calculatemasks(struct evtsource *);
|
||||||
|
|
||||||
void *intr_establish(int, struct pic *, int, int, int, int (*)(void *), void *);
|
void *intr_establish(int, struct pic *, int, int, int, int (*)(void *), void *);
|
||||||
void intr_disestablish(struct intrhand *);
|
void intr_disestablish(struct intrhand *);
|
||||||
const char *intr_string(int);
|
const char *intr_string(int);
|
||||||
|
@ -217,6 +225,7 @@ void cpu_intr_init(struct cpu_info *);
|
||||||
void intr_printconfig(void);
|
void intr_printconfig(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif /* !_LOCORE */
|
#endif /* !_LOCORE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: intrdefs.h,v 1.4 2005/12/11 12:19:48 christos Exp $ */
|
/* $NetBSD: intrdefs.h,v 1.5 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
/* NetBSD intrdefs.h,v 1.3 2003/06/16 20:01:06 thorpej Exp */
|
/* NetBSD intrdefs.h,v 1.3 2003/06/16 20:01:06 thorpej Exp */
|
||||||
|
|
||||||
#ifndef _XEN_INTRDEFS_H
|
#ifndef _XEN_INTRDEFS_H
|
||||||
|
@ -59,4 +59,6 @@
|
||||||
#define IST_EDGE 2 /* edge-triggered */
|
#define IST_EDGE 2 /* edge-triggered */
|
||||||
#define IST_LEVEL 3 /* level-triggered */
|
#define IST_LEVEL 3 /* level-triggered */
|
||||||
|
|
||||||
|
#define NUM_LEGACY_IRQS 16
|
||||||
|
|
||||||
#endif /* _XEN_INTRDEFS_H */
|
#endif /* _XEN_INTRDEFS_H */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* $NetBSD: pci_machdep.h,v 1.5 2005/12/11 12:19:48 christos Exp $ */
|
/* $NetBSD: pci_machdep.h,v 1.6 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005 Manuel Bouyer.
|
* Copyright (c) 2006 Manuel Bouyer.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
@ -30,15 +30,65 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
|
||||||
|
* Copyright (c) 1994 Charles M. Hannum. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by Charles M. Hannum.
|
||||||
|
* 4. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef _XEN_PCI_MACHDEP_H_
|
#ifndef _XEN_PCI_MACHDEP_H_
|
||||||
#define _XEN_PCI_MACHDEP_H_
|
#define _XEN_PCI_MACHDEP_H_
|
||||||
|
|
||||||
|
#include "opt_xen.h"
|
||||||
|
|
||||||
extern struct x86_bus_dma_tag pci_bus_dma_tag;
|
extern struct x86_bus_dma_tag pci_bus_dma_tag;
|
||||||
extern u_int32_t pci_bus_attached[];
|
#ifdef _LP64
|
||||||
|
extern struct x86_bus_dma_tag pci_bus_dma64_tag;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Some values appropriate for x86, from x86/include/pci_machdep.h */
|
/* Some values appropriate for x86, from x86/include/pci_machdep.h */
|
||||||
#define __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH
|
#define __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH
|
||||||
#define PCI_PREFER_IOSPACE
|
#define PCI_PREFER_IOSPACE
|
||||||
|
|
||||||
|
#ifdef XEN3
|
||||||
|
union x86_pci_tag_u {
|
||||||
|
u_int32_t mode1;
|
||||||
|
struct {
|
||||||
|
u_int16_t port;
|
||||||
|
u_int8_t enable;
|
||||||
|
u_int8_t forward;
|
||||||
|
} mode2;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union x86_pci_tag_u pcitag_t;
|
||||||
|
|
||||||
|
#else /* XEN3 */
|
||||||
|
|
||||||
|
extern u_int32_t pci_bus_attached[];
|
||||||
|
|
||||||
#define PCI_MACHDEP_ENUMERATE_BUS xen_pci_enumerate_bus
|
#define PCI_MACHDEP_ENUMERATE_BUS xen_pci_enumerate_bus
|
||||||
|
|
||||||
/* types provided to MI PCI */
|
/* types provided to MI PCI */
|
||||||
|
@ -49,13 +99,16 @@ struct xen_pci_tag {
|
||||||
u_int8_t _pad; /* pad to 32bits */
|
u_int8_t _pad; /* pad to 32bits */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct xen_pci_tag pcitag_t;
|
||||||
|
#endif /* !XEN3 */
|
||||||
|
|
||||||
|
typedef void *pci_chipset_tag_t;
|
||||||
|
|
||||||
struct xen_intr_handle {
|
struct xen_intr_handle {
|
||||||
int pirq;
|
int pirq;
|
||||||
int evtch;
|
int evtch;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct xen_pci_tag pcitag_t;
|
|
||||||
typedef void *pci_chipset_tag_t;
|
|
||||||
typedef struct xen_intr_handle pci_intr_handle_t;
|
typedef struct xen_intr_handle pci_intr_handle_t;
|
||||||
|
|
||||||
/* functions provided to MI PCI */
|
/* functions provided to MI PCI */
|
||||||
|
@ -85,4 +138,20 @@ int xen_pci_enumerate_bus(struct pci_softc *, const int *,
|
||||||
* controller on a PC.
|
* controller on a PC.
|
||||||
*/
|
*/
|
||||||
#define X86_PCI_INTERRUPT_LINE_NO_CONNECTION 0xff
|
#define X86_PCI_INTERRUPT_LINE_NO_CONNECTION 0xff
|
||||||
|
|
||||||
|
extern int pci_mode;
|
||||||
|
int pci_mode_detect(void);
|
||||||
|
int pci_bus_flags(void);
|
||||||
|
|
||||||
|
void pci_device_foreach(pci_chipset_tag_t, int,
|
||||||
|
void (*)(pci_chipset_tag_t, pcitag_t, void*),
|
||||||
|
void *);
|
||||||
|
|
||||||
|
void pci_device_foreach_min(pci_chipset_tag_t, int, int,
|
||||||
|
void (*)(pci_chipset_tag_t, pcitag_t, void*),
|
||||||
|
void *);
|
||||||
|
|
||||||
|
void pci_bridge_foreach(pci_chipset_tag_t, int, int,
|
||||||
|
void (*) (pci_chipset_tag_t, pcitag_t, void *), void *);
|
||||||
|
|
||||||
#endif /* _XEN_PCI_MACHDEP_H_ */
|
#endif /* _XEN_PCI_MACHDEP_H_ */
|
||||||
|
|
|
@ -103,10 +103,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.7 2005/12/11 12:19:50 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.8 2006/04/09 19:28:01 bouyer Exp $");
|
||||||
|
|
||||||
#include "opt_multiprocessor.h"
|
#include "opt_multiprocessor.h"
|
||||||
#include "opt_xen.h"
|
#include "opt_xen.h"
|
||||||
|
#include "isa.h"
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
@ -122,6 +124,15 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.7 2005/12/11 12:19:50 christos Exp $");
|
||||||
#include <machine/i8259.h>
|
#include <machine/i8259.h>
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <machine/pio.h>
|
#include <machine/pio.h>
|
||||||
|
#include <machine/evtchn.h>
|
||||||
|
|
||||||
|
#ifdef XEN3
|
||||||
|
#include "acpi.h"
|
||||||
|
#if NACPI > 0
|
||||||
|
/* for x86/i8259.c */
|
||||||
|
struct intrstub i8259_stubs[NUM_LEGACY_IRQS] = {{0}};
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Recalculate the interrupt from scratch for an event source.
|
* Recalculate the interrupt from scratch for an event source.
|
||||||
|
@ -229,9 +240,28 @@ cpu_intr_init(struct cpu_info *ci)
|
||||||
evcnt_attach_dynamic(&softxenevt_evtcnt, EVCNT_TYPE_INTR, NULL,
|
evcnt_attach_dynamic(&softxenevt_evtcnt, EVCNT_TYPE_INTR, NULL,
|
||||||
ci->ci_dev->dv_xname, "xenevt");
|
ci->ci_dev->dv_xname, "xenevt");
|
||||||
#endif /* defined(DOM0OPS) */
|
#endif /* defined(DOM0OPS) */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if NPCI > 0 || NISA > 0
|
||||||
|
void *
|
||||||
|
intr_establish(int legacy_irq, struct pic *pic, int pin,
|
||||||
|
int type, int level, int (*handler)(void *) , void *arg)
|
||||||
|
{
|
||||||
|
struct pintrhand *ih;
|
||||||
|
|
||||||
|
ih = pirq_establish(legacy_irq, bind_pirq_to_evtch(legacy_irq),
|
||||||
|
handler, arg, level);
|
||||||
|
return ih;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
intr_disestablish(struct intrhand *ih)
|
||||||
|
{
|
||||||
|
printf("intr_disestablish irq\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef INTRDEBUG
|
#ifdef INTRDEBUG
|
||||||
void
|
void
|
||||||
intr_printconfig(void)
|
intr_printconfig(void)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: hypervisor.c,v 1.22 2006/03/19 15:11:50 bouyer Exp $ */
|
/* $NetBSD: hypervisor.c,v 1.23 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005 Manuel Bouyer.
|
* Copyright (c) 2005 Manuel Bouyer.
|
||||||
|
@ -63,7 +63,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.22 2006/03/19 15:11:50 bouyer Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.23 2006/04/09 19:28:01 bouyer Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -78,6 +78,7 @@ __KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.22 2006/03/19 15:11:50 bouyer Exp $
|
||||||
#include "npx.h"
|
#include "npx.h"
|
||||||
#include "isa.h"
|
#include "isa.h"
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
|
#include "acpi.h"
|
||||||
|
|
||||||
#include "opt_xen.h"
|
#include "opt_xen.h"
|
||||||
|
|
||||||
|
@ -88,7 +89,7 @@ __KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.22 2006/03/19 15:11:50 bouyer Exp $
|
||||||
#include <machine/ctrl_if.h>
|
#include <machine/ctrl_if.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DOM0OPS
|
#if defined(DOM0OPS) || defined(XEN3)
|
||||||
#include <sys/dirent.h>
|
#include <sys/dirent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/tree.h>
|
#include <sys/tree.h>
|
||||||
|
@ -97,9 +98,26 @@ __KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.22 2006/03/19 15:11:50 bouyer Exp $
|
||||||
#include <miscfs/kernfs/kernfs.h>
|
#include <miscfs/kernfs/kernfs.h>
|
||||||
#include <machine/kernfs_machdep.h>
|
#include <machine/kernfs_machdep.h>
|
||||||
#include <dev/isa/isavar.h>
|
#include <dev/isa/isavar.h>
|
||||||
|
#endif /* DOM0OPS || XEN3 */
|
||||||
|
#ifdef XEN3
|
||||||
|
#include <machine/granttables.h>
|
||||||
#endif
|
#endif
|
||||||
#if NPCI > 0
|
#if NPCI > 0
|
||||||
#include <dev/pci/pcivar.h>
|
#include <dev/pci/pcivar.h>
|
||||||
|
#if NACPI > 0
|
||||||
|
#include <dev/acpi/acpivar.h>
|
||||||
|
#include <dev/acpi/acpi_madt.h>
|
||||||
|
#endif
|
||||||
|
#ifdef PCI_BUS_FIXUP
|
||||||
|
#include <arch/i386/pci/pci_bus_fixup.h>
|
||||||
|
#ifdef PCI_ADDR_FIXUP
|
||||||
|
#include <arch/i386/pci/pci_addr_fixup.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif /* NPCI */
|
||||||
|
|
||||||
|
#if NXENBUS > 0
|
||||||
|
#include <machine/xenbus.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef XEN3
|
#ifdef XEN3
|
||||||
#include <machine/granttables.h>
|
#include <machine/granttables.h>
|
||||||
|
@ -148,6 +166,15 @@ union hypervisor_attach_cookie {
|
||||||
#if NNPX > 0
|
#if NNPX > 0
|
||||||
struct xen_npx_attach_args hac_xennpx;
|
struct xen_npx_attach_args hac_xennpx;
|
||||||
#endif
|
#endif
|
||||||
|
#if NPCI > 0
|
||||||
|
struct pcibus_attach_args hac_pba;
|
||||||
|
#if defined(DOM0OPS) && NISA > 0
|
||||||
|
struct isabus_attach_args hac_iba;
|
||||||
|
#endif
|
||||||
|
#if NACPI > 0
|
||||||
|
struct acpibus_attach_args hac_acpi;
|
||||||
|
#endif
|
||||||
|
#endif /* NPCI */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -198,16 +225,18 @@ hypervisor_attach(parent, self, aux)
|
||||||
struct device *parent, *self;
|
struct device *parent, *self;
|
||||||
void *aux;
|
void *aux;
|
||||||
{
|
{
|
||||||
#if NPCI > 0
|
#if NPCI >0
|
||||||
struct pcibus_attach_args pba;
|
|
||||||
#if defined(DOM0OPS) && NISA > 0
|
|
||||||
struct isabus_attach_args iba;
|
|
||||||
#endif
|
|
||||||
#ifndef XEN3
|
#ifndef XEN3
|
||||||
physdev_op_t physdev_op;
|
physdev_op_t physdev_op;
|
||||||
int i, j, busnum;
|
int i, j, busnum;
|
||||||
#endif
|
#endif
|
||||||
|
#if NACPI > 0
|
||||||
|
int acpi_present = 0;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef PCI_BUS_FIXUP
|
||||||
|
int pci_maxbus = 0;
|
||||||
|
#endif
|
||||||
|
#endif /* NPCI */
|
||||||
union hypervisor_attach_cookie hac;
|
union hypervisor_attach_cookie hac;
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -221,7 +250,6 @@ hypervisor_attach(parent, self, aux)
|
||||||
hac.hac_xenbus.xa_device = "xenbus";
|
hac.hac_xenbus.xa_device = "xenbus";
|
||||||
config_found_ia(self, "xendevbus", &hac.hac_xenbus, hypervisor_print);
|
config_found_ia(self, "xendevbus", &hac.hac_xenbus, hypervisor_print);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if NXENCONS > 0
|
#if NXENCONS > 0
|
||||||
hac.hac_xencons.xa_device = "xencons";
|
hac.hac_xencons.xa_device = "xencons";
|
||||||
config_found_ia(self, "xendevbus", &hac.hac_xencons, hypervisor_print);
|
config_found_ia(self, "xendevbus", &hac.hac_xencons, hypervisor_print);
|
||||||
|
@ -240,14 +268,39 @@ hypervisor_attach(parent, self, aux)
|
||||||
#endif
|
#endif
|
||||||
#if NPCI > 0
|
#if NPCI > 0
|
||||||
#ifdef XEN3
|
#ifdef XEN3
|
||||||
pba.pba_iot = X86_BUS_SPACE_IO;
|
pci_mode = pci_mode_detect();
|
||||||
pba.pba_memt = X86_BUS_SPACE_MEM;
|
#ifdef PCI_BUS_FIXUP
|
||||||
pba.pba_dmat = &pci_bus_dma_tag;
|
pci_maxbus = pci_bus_fixup(NULL, 0);
|
||||||
pba.pba_dmat64 = 0;
|
aprint_debug("PCI bus max, after pci_bus_fixup: %i\n", pci_maxbus);
|
||||||
pba.pba_flags = PCI_FLAGS_MEM_ENABLED | PCI_FLAGS_IO_ENABLED;
|
#ifdef PCI_ADDR_FIXUP
|
||||||
pba.pba_bridgetag = NULL;
|
pciaddr.extent_port = NULL;
|
||||||
pba.pba_bus = 0;
|
pciaddr.extent_mem = NULL;
|
||||||
config_found_ia(self, "pcibus", &pba, pcibusprint);
|
pci_addr_fixup(NULL, pci_maxbus);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NACPI > 0
|
||||||
|
acpi_present = acpi_probe();
|
||||||
|
if (acpi_present) {
|
||||||
|
hac.hac_acpi.aa_iot = X86_BUS_SPACE_IO;
|
||||||
|
hac.hac_acpi.aa_memt = X86_BUS_SPACE_MEM;
|
||||||
|
hac.hac_acpi.aa_pc = NULL;
|
||||||
|
hac.hac_acpi.aa_pciflags =
|
||||||
|
PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED |
|
||||||
|
PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY |
|
||||||
|
PCI_FLAGS_MWI_OKAY;
|
||||||
|
hac.hac_acpi.aa_ic = &x86_isa_chipset;
|
||||||
|
config_found_ia(self, "acpibus", &hac.hac_acpi, 0);
|
||||||
|
}
|
||||||
|
#endif /* NACPI */
|
||||||
|
hac.hac_pba.pba_iot = X86_BUS_SPACE_IO;
|
||||||
|
hac.hac_pba.pba_memt = X86_BUS_SPACE_MEM;
|
||||||
|
hac.hac_pba.pba_dmat = &pci_bus_dma_tag;
|
||||||
|
hac.hac_pba.pba_dmat64 = 0;
|
||||||
|
hac.hac_pba.pba_flags = PCI_FLAGS_MEM_ENABLED | PCI_FLAGS_IO_ENABLED;
|
||||||
|
hac.hac_pba.pba_bridgetag = NULL;
|
||||||
|
hac.hac_pba.pba_bus = 0;
|
||||||
|
config_found_ia(self, "pcibus", &hac.hac_pba, pcibusprint);
|
||||||
#else
|
#else
|
||||||
physdev_op.cmd = PHYSDEVOP_PCI_PROBE_ROOT_BUSES;
|
physdev_op.cmd = PHYSDEVOP_PCI_PROBE_ROOT_BUSES;
|
||||||
if ((i = HYPERVISOR_physdev_op(&physdev_op)) < 0) {
|
if ((i = HYPERVISOR_physdev_op(&physdev_op)) < 0) {
|
||||||
|
@ -271,15 +324,15 @@ hypervisor_attach(parent, self, aux)
|
||||||
busnum);
|
busnum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pba.pba_iot = X86_BUS_SPACE_IO;
|
hac.hac_pba.pba_iot = X86_BUS_SPACE_IO;
|
||||||
pba.pba_memt = X86_BUS_SPACE_MEM;
|
hac.hac_pba.pba_memt = X86_BUS_SPACE_MEM;
|
||||||
pba.pba_dmat = &pci_bus_dma_tag;
|
hac.hac_pba.pba_dmat = &pci_bus_dma_tag;
|
||||||
pba.pba_dmat64 = 0;
|
hac.hac_pba.pba_dmat64 = 0;
|
||||||
pba.pba_flags = PCI_FLAGS_MEM_ENABLED |
|
hac.hac_pba.pba_flags = PCI_FLAGS_MEM_ENABLED |
|
||||||
PCI_FLAGS_IO_ENABLED;
|
PCI_FLAGS_IO_ENABLED;
|
||||||
pba.pba_bridgetag = NULL;
|
hac.hac_pba.pba_bridgetag = NULL;
|
||||||
pba.pba_bus = busnum;
|
hac.hac_pba.pba_bus = busnum;
|
||||||
config_found_ia(self, "pcibus", &pba,
|
config_found_ia(self, "pcibus", &hac.hac_pba,
|
||||||
pcibusprint);
|
pcibusprint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,19 +340,23 @@ hypervisor_attach(parent, self, aux)
|
||||||
#endif /* XEN3 */
|
#endif /* XEN3 */
|
||||||
#if defined(DOM0OPS) && NISA > 0
|
#if defined(DOM0OPS) && NISA > 0
|
||||||
if (isa_has_been_seen == 0) {
|
if (isa_has_been_seen == 0) {
|
||||||
iba._iba_busname = "isa";
|
hac.hac_iba._iba_busname = "isa";
|
||||||
iba.iba_iot = X86_BUS_SPACE_IO;
|
hac.hac_iba.iba_iot = X86_BUS_SPACE_IO;
|
||||||
iba.iba_memt = X86_BUS_SPACE_MEM;
|
hac.hac_iba.iba_memt = X86_BUS_SPACE_MEM;
|
||||||
iba.iba_dmat = &isa_bus_dma_tag;
|
hac.hac_iba.iba_dmat = &isa_bus_dma_tag;
|
||||||
iba.iba_ic = NULL; /* No isa DMA yet */
|
hac.hac_iba.iba_ic = NULL; /* No isa DMA yet */
|
||||||
config_found_ia(self, "isabus", &iba, isabusprint);
|
config_found_ia(self, "isabus", &hac.hac_iba, isabusprint);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* NPCI */
|
#endif /* NPCI */
|
||||||
|
|
||||||
|
#if defined(DOM0OPS) && !defined(XEN3)
|
||||||
|
if (xen_start_info.flags & SIF_PRIVILEGED)
|
||||||
|
xenkernfs_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DOM0OPS
|
#ifdef DOM0OPS
|
||||||
if (xen_start_info.flags & SIF_PRIVILEGED) {
|
if (xen_start_info.flags & SIF_PRIVILEGED) {
|
||||||
xenkernfs_init();
|
|
||||||
xenprivcmd_init();
|
xenprivcmd_init();
|
||||||
xen_shm_init();
|
xen_shm_init();
|
||||||
#ifndef XEN3
|
#ifndef XEN3
|
||||||
|
@ -331,7 +388,7 @@ hypervisor_print(aux, parent)
|
||||||
return (UNCONF);
|
return (UNCONF);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DOM0OPS
|
#if defined(DOM0OPS) || defined(XEN3)
|
||||||
|
|
||||||
#define DIR_MODE (S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
|
#define DIR_MODE (S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
|
||||||
|
|
||||||
|
@ -347,7 +404,7 @@ xenkernfs_init()
|
||||||
kernfs_addentry(NULL, dkt);
|
kernfs_addentry(NULL, dkt);
|
||||||
kernxen_pkt = KERNFS_ENTOPARENTDIR(dkt);
|
kernxen_pkt = KERNFS_ENTOPARENTDIR(dkt);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* DOM0OPS || XEN3 */
|
||||||
|
|
||||||
#ifndef XEN3
|
#ifndef XEN3
|
||||||
/* handler for the shutdown messages */
|
/* handler for the shutdown messages */
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
/* $NetBSD: pci_intr_machdep.c,v 1.1 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2005 Manuel Bouyer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by Manuel Bouyer.
|
||||||
|
* 4. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
|
||||||
|
#include <machine/bus.h>
|
||||||
|
#include <machine/bus_private.h>
|
||||||
|
|
||||||
|
#include <dev/pci/pcivar.h>
|
||||||
|
#include <dev/pci/pcidevs.h>
|
||||||
|
|
||||||
|
#include <machine/evtchn.h>
|
||||||
|
|
||||||
|
#include "locators.h"
|
||||||
|
#include "opt_ddb.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
|
||||||
|
{
|
||||||
|
pcireg_t intr;
|
||||||
|
int pin;
|
||||||
|
int line;
|
||||||
|
|
||||||
|
#ifndef XEN3
|
||||||
|
physdev_op_t physdev_op;
|
||||||
|
/* initialise device, to get the real IRQ */
|
||||||
|
physdev_op.cmd = PHYSDEVOP_PCI_INITIALISE_DEVICE;
|
||||||
|
physdev_op.u.pci_initialise_device.bus = pa->pa_bus;
|
||||||
|
physdev_op.u.pci_initialise_device.dev = pa->pa_device;
|
||||||
|
physdev_op.u.pci_initialise_device.func = pa->pa_function;
|
||||||
|
if (HYPERVISOR_physdev_op(&physdev_op) < 0)
|
||||||
|
panic("HYPERVISOR_physdev_op(PHYSDEVOP_PCI_INITIALISE_DEVICE)");
|
||||||
|
#endif /* !XEN3 */
|
||||||
|
|
||||||
|
intr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_INTERRUPT_REG);
|
||||||
|
pin = pa->pa_intrpin;
|
||||||
|
pa->pa_intrline = line = PCI_INTERRUPT_LINE(intr);
|
||||||
|
#if 0 /* XXXX why is it always 0 ? */
|
||||||
|
if (pin == 0) {
|
||||||
|
/* No IRQ used */
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (pin > PCI_INTERRUPT_PIN_MAX) {
|
||||||
|
printf("pci_intr_map: bad interrupt pin %d\n", pin);
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line == 0 || line == X86_PCI_INTERRUPT_LINE_NO_CONNECTION) {
|
||||||
|
printf("pci_intr_map: no mapping for pin %c (line=%02x)\n",
|
||||||
|
'@' + pin, line);
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
ihp->pirq = line;
|
||||||
|
ihp->evtch = bind_pirq_to_evtch(ihp->pirq);
|
||||||
|
if (ihp->evtch == -1)
|
||||||
|
goto bad;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bad:
|
||||||
|
ihp->pirq = -1;
|
||||||
|
ihp->evtch = -1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const char
|
||||||
|
*pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih)
|
||||||
|
{
|
||||||
|
static char buf[64];
|
||||||
|
snprintf(buf, 64, "irq %d, event channel %d",
|
||||||
|
ih.pirq, ih.evtch);
|
||||||
|
return buf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct evcnt*
|
||||||
|
pci_intr_evcnt(pci_chipset_tag_t pcitag, pci_intr_handle_t intrh)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pci_intr_establish(pci_chipset_tag_t pcitag, pci_intr_handle_t intrh,
|
||||||
|
int level, int (*func)(void *), void *arg)
|
||||||
|
{
|
||||||
|
return (void *)pirq_establish(intrh.pirq, intrh.evtch, func, arg, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pci_intr_disestablish(pci_chipset_tag_t pcitag, void *cookie)
|
||||||
|
{
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: pci_machdep.c,v 1.7 2006/01/15 22:09:52 bouyer Exp $ */
|
/* $NetBSD: pci_machdep.c,v 1.8 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005 Manuel Bouyer.
|
* Copyright (c) 2005 Manuel Bouyer.
|
||||||
|
@ -40,8 +40,6 @@
|
||||||
#include <dev/pci/pcivar.h>
|
#include <dev/pci/pcivar.h>
|
||||||
#include <dev/pci/pcidevs.h>
|
#include <dev/pci/pcidevs.h>
|
||||||
|
|
||||||
#include <machine/evtchn.h>
|
|
||||||
|
|
||||||
#include "locators.h"
|
#include "locators.h"
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
|
|
||||||
|
@ -104,40 +102,9 @@ pci_decompose_tag(pci_chipset_tag_t pcitag, pcitag_t tag,
|
||||||
*funcp = tag.function;
|
*funcp = tag.function;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XEN3
|
|
||||||
struct simplelock pci_conf_slock = SIMPLELOCK_INITIALIZER;
|
|
||||||
#define PCI_CONF_LOCK(s) \
|
|
||||||
do { \
|
|
||||||
(s) = splhigh(); \
|
|
||||||
simple_lock(&pci_conf_slock); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define PCI_CONF_UNLOCK(s) \
|
|
||||||
do { \
|
|
||||||
simple_unlock(&pci_conf_slock); \
|
|
||||||
splx((s)); \
|
|
||||||
} while (0)
|
|
||||||
#define PCI_MODE1_ENABLE 0x80000000UL
|
|
||||||
#define PCI_MODE1_ADDRESS_REG 0x0cf8
|
|
||||||
#define PCI_MODE1_DATA_REG 0x0cfc
|
|
||||||
#endif /* XEN3 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pcireg_t
|
pcireg_t
|
||||||
pci_conf_read(pci_chipset_tag_t pcitag, pcitag_t dev, int reg)
|
pci_conf_read(pci_chipset_tag_t pcitag, pcitag_t dev, int reg)
|
||||||
{
|
{
|
||||||
#ifdef XEN3
|
|
||||||
pcireg_t data;
|
|
||||||
int s;
|
|
||||||
PCI_CONF_LOCK(s);
|
|
||||||
outl(PCI_MODE1_ADDRESS_REG, PCI_MODE1_ENABLE |
|
|
||||||
(dev.bus << 16) | (dev.device << 11) | (dev.function << 8) | reg);
|
|
||||||
data = inl(PCI_MODE1_DATA_REG);
|
|
||||||
outl(PCI_MODE1_ADDRESS_REG, 0);
|
|
||||||
PCI_CONF_UNLOCK(s);
|
|
||||||
return data;
|
|
||||||
#else /* XEN3 */
|
|
||||||
physdev_op_t physdev_op;
|
physdev_op_t physdev_op;
|
||||||
|
|
||||||
physdev_op.cmd = PHYSDEVOP_PCI_CFGREG_READ;
|
physdev_op.cmd = PHYSDEVOP_PCI_CFGREG_READ;
|
||||||
|
@ -156,22 +123,11 @@ pci_conf_read(pci_chipset_tag_t pcitag, pcitag_t dev, int reg)
|
||||||
return 0xffffffff;
|
return 0xffffffff;
|
||||||
}
|
}
|
||||||
return physdev_op.u.pci_cfgreg_read.value;
|
return physdev_op.u.pci_cfgreg_read.value;
|
||||||
#endif /* XEN3 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pci_conf_write(pci_chipset_tag_t pcitag, pcitag_t dev, int reg, pcireg_t val)
|
pci_conf_write(pci_chipset_tag_t pcitag, pcitag_t dev, int reg, pcireg_t val)
|
||||||
{
|
{
|
||||||
#ifdef XEN3
|
|
||||||
int s;
|
|
||||||
PCI_CONF_LOCK(s);
|
|
||||||
outl(PCI_MODE1_ADDRESS_REG, PCI_MODE1_ENABLE |
|
|
||||||
(dev.bus << 16) | (dev.device << 11) | (dev.function << 8) | reg);
|
|
||||||
outl(PCI_MODE1_DATA_REG, val);
|
|
||||||
outl(PCI_MODE1_ADDRESS_REG, 0);
|
|
||||||
PCI_CONF_UNLOCK(s);
|
|
||||||
return;
|
|
||||||
#else /* XEN3 */
|
|
||||||
physdev_op_t physdev_op;
|
physdev_op_t physdev_op;
|
||||||
|
|
||||||
physdev_op.cmd = PHYSDEVOP_PCI_CFGREG_WRITE;
|
physdev_op.cmd = PHYSDEVOP_PCI_CFGREG_WRITE;
|
||||||
|
@ -188,85 +144,6 @@ pci_conf_write(pci_chipset_tag_t pcitag, pcitag_t dev, int reg, pcireg_t val)
|
||||||
Debugger();
|
Debugger();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* XEN3 */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
|
|
||||||
{
|
|
||||||
pcireg_t intr;
|
|
||||||
int pin;
|
|
||||||
int line;
|
|
||||||
|
|
||||||
#ifndef XEN3
|
|
||||||
physdev_op_t physdev_op;
|
|
||||||
/* initialise device, to get the real IRQ */
|
|
||||||
physdev_op.cmd = PHYSDEVOP_PCI_INITIALISE_DEVICE;
|
|
||||||
physdev_op.u.pci_initialise_device.bus = pa->pa_bus;
|
|
||||||
physdev_op.u.pci_initialise_device.dev = pa->pa_device;
|
|
||||||
physdev_op.u.pci_initialise_device.func = pa->pa_function;
|
|
||||||
if (HYPERVISOR_physdev_op(&physdev_op) < 0)
|
|
||||||
panic("HYPERVISOR_physdev_op(PHYSDEVOP_PCI_INITIALISE_DEVICE)");
|
|
||||||
#endif /* !XEN3 */
|
|
||||||
|
|
||||||
intr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_INTERRUPT_REG);
|
|
||||||
pin = pa->pa_intrpin;
|
|
||||||
pa->pa_intrline = line = PCI_INTERRUPT_LINE(intr);
|
|
||||||
#if 0 /* XXXX why is it always 0 ? */
|
|
||||||
if (pin == 0) {
|
|
||||||
/* No IRQ used */
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (pin > PCI_INTERRUPT_PIN_MAX) {
|
|
||||||
printf("pci_intr_map: bad interrupt pin %d\n", pin);
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (line == 0 || line == X86_PCI_INTERRUPT_LINE_NO_CONNECTION) {
|
|
||||||
printf("pci_intr_map: no mapping for pin %c (line=%02x)\n",
|
|
||||||
'@' + pin, line);
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
|
|
||||||
ihp->pirq = line;
|
|
||||||
ihp->evtch = bind_pirq_to_evtch(ihp->pirq);
|
|
||||||
if (ihp->evtch == -1)
|
|
||||||
goto bad;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
bad:
|
|
||||||
ihp->pirq = -1;
|
|
||||||
ihp->evtch = -1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
const char
|
|
||||||
*pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih)
|
|
||||||
{
|
|
||||||
static char buf[64];
|
|
||||||
snprintf(buf, 64, "irq %d, event channel %d",
|
|
||||||
ih.pirq, ih.evtch);
|
|
||||||
return buf;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct evcnt*
|
|
||||||
pci_intr_evcnt(pci_chipset_tag_t pcitag, pci_intr_handle_t intrh)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
pci_intr_establish(pci_chipset_tag_t pcitag, pci_intr_handle_t intrh,
|
|
||||||
int level, int (*func)(void *), void *arg)
|
|
||||||
{
|
|
||||||
return (void *)pirq_establish(intrh.pirq, intrh.evtch, func, arg, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
pci_intr_disestablish(pci_chipset_tag_t pcitag, void *cookie)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
/* $NetBSD: xen_acpi_machdep.c,v 1.1 2006/04/09 19:28:01 bouyer Exp $ */
|
||||||
|
|
||||||
|
#include "acpi.h"
|
||||||
|
|
||||||
|
#include <dev/acpi/acpica.h>
|
||||||
|
#include <dev/acpi/acpivar.h>
|
||||||
|
#define ACPI_MACHDEP_PRIVATE
|
||||||
|
#include <machine/acpi_machdep.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
acpi_md_sleep(int state)
|
||||||
|
{
|
||||||
|
printf("acpi: sleep not implemented\n");
|
||||||
|
return (-1);
|
||||||
|
}
|
Loading…
Reference in New Issue