add MD support for ACPI sleep/wakeup.
This commit is contained in:
parent
0c0fe6076b
commit
2d5fc6d0a9
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: files.i386,v 1.207 2002/06/17 22:38:31 christos Exp $
|
||||
# $NetBSD: files.i386,v 1.208 2002/06/18 07:56:12 tshiozak Exp $
|
||||
#
|
||||
# new style config file for i386 architecture
|
||||
#
|
||||
|
@ -431,6 +431,7 @@ include "arch/i386/pnpbios/files.pnpbios"
|
|||
|
||||
include "dev/acpi/files.acpi"
|
||||
file arch/i386/i386/acpi_machdep.c acpi
|
||||
file arch/i386/acpi/acpi_wakeup.c acpi
|
||||
|
||||
# Toshiba VALD
|
||||
device vald
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: machdep.c,v 1.472 2002/05/31 17:46:51 thorpej Exp $ */
|
||||
/* $NetBSD: machdep.c,v 1.473 2002/06/18 07:56:13 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1996, 1997, 1998, 2000 The NetBSD Foundation, Inc.
|
||||
|
@ -76,7 +76,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.472 2002/05/31 17:46:51 thorpej Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.473 2002/06/18 07:56:13 tshiozak Exp $");
|
||||
|
||||
#include "opt_cputype.h"
|
||||
#include "opt_ddb.h"
|
||||
|
@ -152,6 +152,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.472 2002/05/31 17:46:51 thorpej Exp $"
|
|||
#include <machine/vm86.h>
|
||||
#endif
|
||||
|
||||
#include "acpi.h"
|
||||
#include "apm.h"
|
||||
#include "bioscall.h"
|
||||
|
||||
|
@ -159,6 +160,12 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.472 2002/05/31 17:46:51 thorpej Exp $"
|
|||
#include <machine/bioscall.h>
|
||||
#endif
|
||||
|
||||
#if NACPI > 0
|
||||
#include <dev/acpi/acpivar.h>
|
||||
#define ACPI_MACHDEP_PRIVATE
|
||||
#include <machine/acpi_machdep.h>
|
||||
#endif
|
||||
|
||||
#if NAPM > 0
|
||||
#include <machine/apmvar.h>
|
||||
#endif
|
||||
|
@ -2186,6 +2193,13 @@ haltsys:
|
|||
doshutdownhooks();
|
||||
|
||||
if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
|
||||
#if 0
|
||||
#if NACPI > 0
|
||||
delay(500000);
|
||||
acpi_enter_sleep_state(acpi_softc, ACPI_STATE_S5);
|
||||
printf("WARNING: powerdown failed!\n");
|
||||
#endif
|
||||
#endif
|
||||
#if NAPM > 0 && !defined(APM_NO_POWEROFF)
|
||||
/* turn off, if we can. But try to turn disk off and
|
||||
* wait a bit first--some disk drives are slow to clean up
|
||||
|
@ -2684,6 +2698,9 @@ init386(first_avail)
|
|||
int x, first16q;
|
||||
u_int64_t seg_start, seg_end;
|
||||
u_int64_t seg_start1, seg_end1;
|
||||
paddr_t realmode_reserved_start;
|
||||
psize_t realmode_reserved_size;
|
||||
int needs_earlier_install_pte0;
|
||||
#if NBIOSCALL > 0
|
||||
extern int biostramp_image_size;
|
||||
extern u_char biostramp_image[];
|
||||
|
@ -2721,13 +2738,36 @@ init386(first_avail)
|
|||
*/
|
||||
uvmexp.ncolors = 2;
|
||||
|
||||
/*
|
||||
* BIOS leaves data in low memory
|
||||
* and VM system doesn't work with phys 0
|
||||
*/
|
||||
avail_start = PAGE_SIZE;
|
||||
|
||||
/*
|
||||
* reserve memory for real-mode call
|
||||
*/
|
||||
needs_earlier_install_pte0 = 0;
|
||||
realmode_reserved_start = 0;
|
||||
realmode_reserved_size = 0;
|
||||
#if NBIOSCALL > 0
|
||||
avail_start = 3*PAGE_SIZE; /* save us a page for trampoline code and
|
||||
one additional PT page! */
|
||||
#else
|
||||
avail_start = PAGE_SIZE; /* BIOS leaves data in low memory */
|
||||
/* and VM system doesn't work with phys 0 */
|
||||
/* save us a page for trampoline code */
|
||||
realmode_reserved_size += PAGE_SIZE;
|
||||
needs_earlier_install_pte0 = 1;
|
||||
#endif
|
||||
#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) {
|
||||
/* page table for directory entry 0 */
|
||||
realmode_reserved_size += PAGE_SIZE;
|
||||
}
|
||||
if (realmode_reserved_size>0) {
|
||||
realmode_reserved_start = avail_start;
|
||||
avail_start += realmode_reserved_size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Call pmap initialization to make new kernel address space.
|
||||
|
@ -3018,18 +3058,37 @@ init386(first_avail)
|
|||
"in last cluster (%ld used)\n", reqsz, sz);
|
||||
}
|
||||
|
||||
#if NBIOSCALL > 0
|
||||
/* install page 2 (reserved above) as PT page for first 4M */
|
||||
pmap_enter(pmap_kernel(), (vaddr_t)vtopte(0), 2*PAGE_SIZE,
|
||||
VM_PROT_READ|VM_PROT_WRITE, PMAP_WIRED|VM_PROT_READ|VM_PROT_WRITE);
|
||||
pmap_update(pmap_kernel());
|
||||
memset(vtopte(0), 0, PAGE_SIZE);/* make sure it is clean before using */
|
||||
/*
|
||||
* install PT page for the first 4M if needed.
|
||||
*/
|
||||
if (needs_earlier_install_pte0) {
|
||||
paddr_t paddr;
|
||||
#ifdef DIAGNOSTIC
|
||||
if (realmode_reserved_size < PAGE_SIZE) {
|
||||
panic("cannot steal memory for first 4M PT page.");
|
||||
}
|
||||
#endif
|
||||
paddr=realmode_reserved_start+realmode_reserved_size-PAGE_SIZE;
|
||||
pmap_enter(pmap_kernel(), (vaddr_t)vtopte(0), paddr,
|
||||
VM_PROT_READ|VM_PROT_WRITE,
|
||||
PMAP_WIRED|VM_PROT_READ|VM_PROT_WRITE);
|
||||
pmap_update(pmap_kernel());
|
||||
/* make sure it is clean before using */
|
||||
memset(vtopte(0), 0, PAGE_SIZE);
|
||||
realmode_reserved_size -= PAGE_SIZE;
|
||||
}
|
||||
|
||||
#if NBIOSCALL > 0
|
||||
/*
|
||||
* this should be caught at kernel build time, but put it here
|
||||
* in case someone tries to fake it out...
|
||||
*/
|
||||
#ifdef DIAGNOSTIC
|
||||
if (realmode_reserved_start > BIOSTRAMP_BASE ||
|
||||
(realmode_reseved_start+realmode_reserved_size) < (BIOSTRAMP_BASE+
|
||||
PAGE_SIZE)) {
|
||||
panic("cannot steal memory for PT page of bioscall.");
|
||||
}
|
||||
if (biostramp_image_size > PAGE_SIZE)
|
||||
panic("biostramp_image_size too big: %x vs. %x\n",
|
||||
biostramp_image_size, PAGE_SIZE);
|
||||
|
@ -3042,6 +3101,42 @@ init386(first_avail)
|
|||
#ifdef DEBUG_BIOSCALL
|
||||
printf("biostramp installed @ %x\n", BIOSTRAMP_BASE);
|
||||
#endif
|
||||
realmode_reserved_size -= PAGE_SIZE;
|
||||
realmode_reserved_start += PAGE_SIZE;
|
||||
#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_enter(pmap_kernel(), idt_vaddr, idt_paddr,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: acpi_machdep.h,v 1.3 2002/06/15 18:01:05 thorpej Exp $ */
|
||||
/* $NetBSD: acpi_machdep.h,v 1.4 2002/06/18 07:56:14 tshiozak Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2001 Wasabi Systems, Inc.
|
||||
|
@ -65,3 +65,10 @@ ACPI_STATUS acpi_md_OsGetPhysicalAddress(void *LogicalAddress,
|
|||
|
||||
BOOLEAN acpi_md_OsReadable(void *, UINT32);
|
||||
BOOLEAN acpi_md_OsWritable(void *, UINT32);
|
||||
|
||||
int acpi_md_sleep(int);
|
||||
|
||||
#ifdef ACPI_MACHDEP_PRIVATE
|
||||
u_int32_t acpi_md_get_npages_of_wakecode(void);
|
||||
void acpi_md_install_wakecode(paddr_t);
|
||||
#endif
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: isa_machdep.h,v 1.18 2000/11/15 19:30:10 thorpej Exp $ */
|
||||
/* $NetBSD: isa_machdep.h,v 1.19 2002/06/18 07:56:14 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
|
||||
|
@ -163,6 +163,12 @@ void isa_mem_free(bus_space_tag_t, bus_space_handle_t, bus_size_t);
|
|||
#define isa_mappage(m, o, p) \
|
||||
_isa_mappage((m), (o), (p))
|
||||
|
||||
/*
|
||||
* for ACPI code
|
||||
*/
|
||||
|
||||
void isa_reinit_irq(void);
|
||||
|
||||
/*
|
||||
* ALL OF THE FOLLOWING ARE MACHINE-DEPENDENT, AND SHOULD NOT BE USED
|
||||
* BY PORTABLE CODE.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: isa_machdep.c,v 1.53 2001/11/18 13:48:00 jdolecek Exp $ */
|
||||
/* $NetBSD: isa_machdep.c,v 1.54 2002/06/18 07:56:15 tshiozak Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
|
||||
|
@ -76,7 +76,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.53 2001/11/18 13:48:00 jdolecek Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.54 2002/06/18 07:56:15 tshiozak Exp $");
|
||||
|
||||
#define ISA_DMA_STATS
|
||||
|
||||
|
@ -159,6 +159,8 @@ struct i386_isa_dma_cookie {
|
|||
#define ID_BUFTYPE_UIO 3
|
||||
#define ID_BUFTYPE_RAW 4
|
||||
|
||||
static void init_i8259 __P((void));
|
||||
|
||||
int _isa_bus_dmamap_create __P((bus_dma_tag_t, bus_size_t, int,
|
||||
bus_size_t, bus_size_t, int, bus_dmamap_t *));
|
||||
void _isa_bus_dmamap_destroy __P((bus_dma_tag_t, bus_dmamap_t));
|
||||
|
@ -216,7 +218,21 @@ isa_defaultirq()
|
|||
for (i = 0; i < ICU_LEN; i++)
|
||||
setgate(&idt[ICU_OFFSET + i].gd, IDTVEC(intr)[i], 0,
|
||||
SDT_SYS386IGT, SEL_KPL);
|
||||
|
||||
init_i8259();
|
||||
}
|
||||
|
||||
void
|
||||
isa_reinit_irq()
|
||||
{
|
||||
init_i8259();
|
||||
SET_ICUS();
|
||||
}
|
||||
|
||||
/* initialize i8259s */
|
||||
|
||||
static void
|
||||
init_i8259(void)
|
||||
{
|
||||
/* initialize 8259's */
|
||||
#if NMCA > 0
|
||||
/* level-triggered interrupts on MCA PS/2s */
|
||||
|
|
Loading…
Reference in New Issue