⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acpi.c

📁 linux-2.4.29操作系统的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  acpi.c - Architecture-Specific Low-Level ACPI Support * *  Copyright (C) 1999 VA Linux Systems *  Copyright (C) 1999,2000 Walt Drummond <drummond@valinux.com> *  Copyright (C) 2000, 2002-2003 Hewlett-Packard Co. *	David Mosberger-Tang <davidm@hpl.hp.com> *  Copyright (C) 2000 Intel Corp. *  Copyright (C) 2000,2001 J.I. Lee <jung-ik.lee@intel.com> *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> *  Copyright (C) 2001 Jenna Hall <jenna.s.hall@intel.com> *  Copyright (C) 2001 Takayoshi Kochi <t-kouchi@cq.jp.nec.com> *  Copyright (C) 2002 Erich Focht <efocht@ess.nec.de> * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */#include <linux/config.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/smp.h>#include <linux/string.h>#include <linux/types.h>#include <linux/irq.h>#include <linux/acpi.h>#include <linux/efi.h>#include <linux/mm.h>#include <linux/mmzone.h>#include <asm/io.h>#include <asm/iosapic.h>#include <asm/machvec.h>#include <asm/page.h>#include <asm/system.h>#include <asm/numa.h>#define PREFIX			"ACPI: "asm (".weak iosapic_register_intr");asm (".weak iosapic_override_isa_irq");asm (".weak iosapic_register_platform_intr");asm (".weak iosapic_init");asm (".weak iosapic_system_init");asm (".weak iosapic_version");void (*pm_idle) (void);void (*pm_power_off) (void);unsigned char acpi_kbd_controller_present = 1;const char *acpi_get_sysname (void){#ifdef CONFIG_IA64_GENERIC	unsigned long rsdp_phys;	struct acpi20_table_rsdp *rsdp;	struct acpi_table_xsdt *xsdt;	struct acpi_table_header *hdr;	rsdp_phys = acpi_find_rsdp();	if (!rsdp_phys) {		printk(KERN_ERR "ACPI 2.0 RSDP not found, default to \"dig\"\n");		return "dig";	}	rsdp = (struct acpi20_table_rsdp *) __va(rsdp_phys);	if (strncmp(rsdp->signature, RSDP_SIG, sizeof(RSDP_SIG) - 1)) {		printk(KERN_ERR "ACPI 2.0 RSDP signature incorrect, default to \"dig\"\n");		return "dig";	}	xsdt = (struct acpi_table_xsdt *) __va(rsdp->xsdt_address);	hdr = &xsdt->header;	if (strncmp(hdr->signature, XSDT_SIG, sizeof(XSDT_SIG) - 1)) {		printk(KERN_ERR "ACPI 2.0 XSDT signature incorrect, default to \"dig\"\n");		return "dig";	}	if (!strcmp(hdr->oem_id, "HP")) {		return "hp";	}	else if (!strcmp(hdr->oem_id, "SGI")) {		return "sn2";	}	return "dig";#else# if defined (CONFIG_IA64_HP_SIM)	return "hpsim";# elif defined (CONFIG_IA64_HP_ZX1)	return "hp";# elif defined (CONFIG_IA64_SGI_SN2)	return "sn2";# elif defined (CONFIG_IA64_DIG)	return "dig";# else#	error Unknown platform.  Fix acpi.c.# endif#endif}#ifdef CONFIG_ACPIstruct acpi_vendor_descriptor {	u8				guid_id;	efi_guid_t			guid;};struct acpi_vendor_info {	struct acpi_vendor_descriptor	*descriptor;	u8				*data;	u32				length;};acpi_statusacpi_vendor_resource_match (struct acpi_resource *resource, void *context){	struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;	struct acpi_resource_vendor *vendor;	struct acpi_vendor_descriptor *descriptor;	u32 length;	if (resource->id != ACPI_RSTYPE_VENDOR)		return AE_OK;	vendor = (struct acpi_resource_vendor *) &resource->data;	descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;	if (vendor->length <= sizeof(*info->descriptor) ||	    descriptor->guid_id != info->descriptor->guid_id ||	    efi_guidcmp(descriptor->guid, info->descriptor->guid))		return AE_OK;	length = vendor->length - sizeof(struct acpi_vendor_descriptor);	info->data = acpi_os_allocate(length);	if (!info->data)		return AE_NO_MEMORY;	memcpy(info->data, vendor->reserved + sizeof(struct acpi_vendor_descriptor), length);	info->length = length;	return AE_CTRL_TERMINATE;}acpi_statusacpi_find_vendor_resource (acpi_handle obj, struct acpi_vendor_descriptor *id,		u8 **data, u32 *length){	struct acpi_vendor_info info;	info.descriptor = id;	info.data = 0;	acpi_walk_resources(obj, METHOD_NAME__CRS, acpi_vendor_resource_match, &info);	if (!info.data)		return AE_NOT_FOUND;	*data = info.data;	*length = info.length;	return AE_OK;}struct acpi_vendor_descriptor hp_ccsr_descriptor = {	.guid_id = 2,	.guid    = EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad)};acpi_statusacpi_hp_csr_space (acpi_handle obj, u64 *csr_base, u64 *csr_length){	acpi_status status;	u8 *data;	u32 length;	status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length);	if (ACPI_FAILURE(status) || length != 16)		return AE_NOT_FOUND;	memcpy(csr_base, data, sizeof(*csr_base));	memcpy(csr_length, data + 8, sizeof(*csr_length));	acpi_os_free(data);	return AE_OK;}#endif /* CONFIG_ACPI */#ifdef CONFIG_ACPI_BOOT#define ACPI_MAX_PLATFORM_INTERRUPTS	256/* Array to record platform interrupt vectors for generic interrupt routing. */int platform_intr_list[ACPI_MAX_PLATFORM_INTERRUPTS] = {	[0 ... ACPI_MAX_PLATFORM_INTERRUPTS - 1] = -1};enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_IOSAPIC;/* * Interrupt routing API for device drivers.  Provides interrupt vector for * a generic platform event.  Currently only CPEI is implemented. */intacpi_request_vector (u32 int_type){	int vector = -1;	if (int_type < ACPI_MAX_PLATFORM_INTERRUPTS) {		/* corrected platform error interrupt */		vector = platform_intr_list[int_type];	} else		printk(KERN_ERR "acpi_request_vector(): invalid interrupt type\n");	return vector;}char *__acpi_map_table (unsigned long phys_addr, unsigned long size){	return __va(phys_addr);}/* --------------------------------------------------------------------------                            Boot-time Table Parsing   -------------------------------------------------------------------------- */static int			total_cpus __initdata;static int			available_cpus __initdata;struct acpi_table_madt *	acpi_madt __initdata;static u8			has_8259;static int __initacpi_parse_lapic_addr_ovr (acpi_table_entry_header *header){	struct acpi_table_lapic_addr_ovr *lapic;	lapic = (struct acpi_table_lapic_addr_ovr *) header;	if (!lapic)		return -EINVAL;	acpi_table_print_madt_entry(header);	if (lapic->address) {		iounmap((void *) ipi_base_addr);		ipi_base_addr = (unsigned long) ioremap(lapic->address, 0);	}	return 0;}static int __initacpi_parse_lsapic (acpi_table_entry_header *header){	struct acpi_table_lsapic *lsapic;	lsapic = (struct acpi_table_lsapic *) header;	if (!lsapic)		return -EINVAL;	acpi_table_print_madt_entry(header);	printk(KERN_INFO "CPU %d (0x%04x)", total_cpus, (lsapic->id << 8) | lsapic->eid);	if (!lsapic->flags.enabled)		printk(" disabled");	else if (available_cpus >= NR_CPUS)		printk(" ignored (increase NR_CPUS)");	else {		printk(" enabled");#ifdef CONFIG_SMP		smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid;		if (hard_smp_processor_id()		    == (unsigned int) smp_boot_data.cpu_phys_id[available_cpus])			printk(" (BSP)");#endif		++available_cpus;	}	printk("\n");	total_cpus++;	return 0;}static int __initacpi_parse_lapic_nmi (acpi_table_entry_header *header){	struct acpi_table_lapic_nmi *lacpi_nmi;	lacpi_nmi = (struct acpi_table_lapic_nmi*) header;	if (!lacpi_nmi)		return -EINVAL;	acpi_table_print_madt_entry(header);	/* TBD: Support lapic_nmi entries */	return 0;}static int __initacpi_parse_iosapic (acpi_table_entry_header *header){	struct acpi_table_iosapic *iosapic;	iosapic = (struct acpi_table_iosapic *) header;	if (!iosapic)		return -EINVAL;	acpi_table_print_madt_entry(header);	if (iosapic_init)		iosapic_init(iosapic->address, iosapic->global_irq_base);	return 0;}static int __initacpi_parse_plat_int_src (acpi_table_entry_header *header){	struct acpi_table_plat_int_src *plintsrc;	int vector;	plintsrc = (struct acpi_table_plat_int_src *) header;	if (!plintsrc)		return -EINVAL;	acpi_table_print_madt_entry(header);	if (!iosapic_register_platform_intr) {		printk(KERN_WARNING PREFIX "No ACPI platform interrupt support\n");		return -ENODEV;	}	/*	 * Get vector assignment for this interrupt, set attributes,	 * and program the IOSAPIC routing table.	 */	vector = iosapic_register_platform_intr(plintsrc->type,						plintsrc->global_irq,						plintsrc->iosapic_vector,						plintsrc->eid,						plintsrc->id,						(plintsrc->flags.polarity == 1) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,						(plintsrc->flags.trigger == 1) ? IOSAPIC_EDGE : IOSAPIC_LEVEL);	platform_intr_list[plintsrc->type] = vector;	return 0;}static int __initacpi_parse_int_src_ovr (acpi_table_entry_header *header){	struct acpi_table_int_src_ovr *p;	p = (struct acpi_table_int_src_ovr *) header;	if (!p)		return -EINVAL;	acpi_table_print_madt_entry(header);	/* Ignore if the platform doesn't support overrides */	if (!iosapic_override_isa_irq)		return 0;	iosapic_override_isa_irq(p->bus_irq, p->global_irq,				 (p->flags.polarity == 1) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,				 (p->flags.trigger == 1) ? IOSAPIC_EDGE : IOSAPIC_LEVEL);	return 0;}static int __initacpi_parse_nmi_src (acpi_table_entry_header *header){	struct acpi_table_nmi_src *nmi_src;	nmi_src = (struct acpi_table_nmi_src*) header;	if (!nmi_src)		return -EINVAL;	acpi_table_print_madt_entry(header);	/* TBD: Support nimsrc entries */	return 0;}static int __initacpi_parse_madt (unsigned long phys_addr, unsigned long size){	if (!phys_addr || !size)		return -EINVAL;	acpi_madt = (struct acpi_table_madt *) __va(phys_addr);	/* remember the value for reference after free_initmem() */#ifdef CONFIG_ITANIUM	has_8259 = 1; /* Firmware on old Itanium systems is broken */#else	has_8259 = acpi_madt->flags.pcat_compat;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -