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

📄 rsparser.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	mem->min = p->min_base_address;	mem->max = p->max_base_address;	mem->align = p->alignment;	mem->size = p->range_length;	mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ?			IORESOURCE_MEM_WRITEABLE : 0;	pnp_register_mem_resource(option,mem);	return;}static voidpnpacpi_parse_fixed_mem32_option(struct pnp_option *option,	struct acpi_resource_fixed_mem32 *p){	struct pnp_mem * mem;	if (p->range_length == 0)		return;	mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);	if (!mem)		return;	mem->min = mem->max = p->range_base_address;	mem->size = p->range_length;	mem->align = 0;	mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ?			IORESOURCE_MEM_WRITEABLE : 0;	pnp_register_mem_resource(option,mem);	return;}struct acpipnp_parse_option_s {	struct pnp_option *option;	struct pnp_option *option_independent;	struct pnp_dev *dev;};static acpi_status pnpacpi_option_resource(struct acpi_resource *res, 	void *data){	int priority = 0;	struct acpipnp_parse_option_s *parse_data = (struct acpipnp_parse_option_s *)data;	struct pnp_dev *dev = parse_data->dev;	struct pnp_option *option = parse_data->option;	switch (res->id) {		case ACPI_RSTYPE_IRQ:			pnpacpi_parse_irq_option(option, &res->data.irq);			break;		case ACPI_RSTYPE_EXT_IRQ:			pnpacpi_parse_ext_irq_option(option,				&res->data.extended_irq);			break;		case ACPI_RSTYPE_DMA:			pnpacpi_parse_dma_option(option, &res->data.dma);				break;		case ACPI_RSTYPE_IO:			pnpacpi_parse_port_option(option, &res->data.io);			break;		case ACPI_RSTYPE_FIXED_IO:			pnpacpi_parse_fixed_port_option(option,				&res->data.fixed_io);			break;		case ACPI_RSTYPE_MEM24:			pnpacpi_parse_mem24_option(option, &res->data.memory24);			break;		case ACPI_RSTYPE_MEM32:			pnpacpi_parse_mem32_option(option, &res->data.memory32);			break;		case ACPI_RSTYPE_FIXED_MEM32:			pnpacpi_parse_fixed_mem32_option(option,				&res->data.fixed_memory32);			break;		case ACPI_RSTYPE_START_DPF:			switch (res->data.start_dpf.compatibility_priority) {				case ACPI_GOOD_CONFIGURATION:					priority = PNP_RES_PRIORITY_PREFERRED;					break;									case ACPI_ACCEPTABLE_CONFIGURATION:					priority = PNP_RES_PRIORITY_ACCEPTABLE;					break;				case ACPI_SUB_OPTIMAL_CONFIGURATION:					priority = PNP_RES_PRIORITY_FUNCTIONAL;					break;				default:					priority = PNP_RES_PRIORITY_INVALID;					break;			}			/* TBD: Considering performace/robustness bits */			option = pnp_register_dependent_option(dev, priority);			if (!option)				return AE_ERROR;			parse_data->option = option;				break;		case ACPI_RSTYPE_END_DPF:			/*only one EndDependentFn is allowed*/			if (!parse_data->option_independent) {				pnp_warn("PnPACPI: more than one EndDependentFn");				return AE_ERROR;			}			parse_data->option = parse_data->option_independent;			parse_data->option_independent = NULL;			break;		default:			pnp_warn("PnPACPI: unknown resource type %d", res->id);			return AE_ERROR;	}				return AE_OK;}acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle, 	struct pnp_dev *dev){	acpi_status status;	struct acpipnp_parse_option_s parse_data;	parse_data.option = pnp_register_independent_option(dev);	if (!parse_data.option)		return AE_ERROR;	parse_data.option_independent = parse_data.option;	parse_data.dev = dev;	status = acpi_walk_resources(handle, METHOD_NAME__PRS, 		pnpacpi_option_resource, &parse_data);	return status;}/* * Set resource */static acpi_status pnpacpi_count_resources(struct acpi_resource *res,	void *data){	int *res_cnt = (int *)data;	switch (res->id) {	case ACPI_RSTYPE_IRQ:	case ACPI_RSTYPE_EXT_IRQ:	case ACPI_RSTYPE_DMA:	case ACPI_RSTYPE_IO:	case ACPI_RSTYPE_FIXED_IO:	case ACPI_RSTYPE_MEM24:	case ACPI_RSTYPE_MEM32:	case ACPI_RSTYPE_FIXED_MEM32:#if 0	case ACPI_RSTYPE_ADDRESS16:	case ACPI_RSTYPE_ADDRESS32:	case ACPI_RSTYPE_ADDRESS64:#endif		(*res_cnt) ++;	default:		return AE_OK;	}	return AE_OK;}static acpi_status pnpacpi_type_resources(struct acpi_resource *res,	void *data){	struct acpi_resource **resource = (struct acpi_resource **)data;		switch (res->id) {	case ACPI_RSTYPE_IRQ:	case ACPI_RSTYPE_EXT_IRQ:	case ACPI_RSTYPE_DMA:	case ACPI_RSTYPE_IO:	case ACPI_RSTYPE_FIXED_IO:	case ACPI_RSTYPE_MEM24:	case ACPI_RSTYPE_MEM32:	case ACPI_RSTYPE_FIXED_MEM32:#if 0	case ACPI_RSTYPE_ADDRESS16:	case ACPI_RSTYPE_ADDRESS32:	case ACPI_RSTYPE_ADDRESS64:#endif		(*resource)->id = res->id;		(*resource)++;	default:		return AE_OK;	}	return AE_OK;}int pnpacpi_build_resource_template(acpi_handle handle, 	struct acpi_buffer *buffer){	struct acpi_resource *resource;	int res_cnt = 0;	acpi_status status;	status = acpi_walk_resources(handle, METHOD_NAME__CRS, 		pnpacpi_count_resources, &res_cnt);	if (ACPI_FAILURE(status)) {		pnp_err("Evaluate _CRS failed");		return -EINVAL;	}	if (!res_cnt)		return -EINVAL;	buffer->length = sizeof(struct acpi_resource) * (res_cnt + 1) + 1;	buffer->pointer = kcalloc(1, buffer->length - 1, GFP_KERNEL);	if (!buffer->pointer)		return -ENOMEM;	pnp_dbg("Res cnt %d", res_cnt);	resource = (struct acpi_resource *)buffer->pointer;	status = acpi_walk_resources(handle, METHOD_NAME__CRS, 		pnpacpi_type_resources, &resource);	if (ACPI_FAILURE(status)) {		kfree(buffer->pointer);		pnp_err("Evaluate _CRS failed");		return -EINVAL;	}	/* resource will pointer the end resource now */	resource->id = ACPI_RSTYPE_END_TAG;	return 0;}static void pnpacpi_encode_irq(struct acpi_resource *resource, 	struct resource *p){	int edge_level, active_high_low;		decode_irq_flags(p->flags & IORESOURCE_BITS, &edge_level, 		&active_high_low);	resource->id = ACPI_RSTYPE_IRQ;	resource->length = sizeof(struct acpi_resource);	resource->data.irq.edge_level = edge_level;	resource->data.irq.active_high_low = active_high_low;	if (edge_level == ACPI_EDGE_SENSITIVE)		resource->data.irq.shared_exclusive = ACPI_EXCLUSIVE;	else		resource->data.irq.shared_exclusive = ACPI_SHARED;	resource->data.irq.number_of_interrupts = 1;	resource->data.irq.interrupts[0] = p->start;}static void pnpacpi_encode_ext_irq(struct acpi_resource *resource,	struct resource *p){	int edge_level, active_high_low;		decode_irq_flags(p->flags & IORESOURCE_BITS, &edge_level, 		&active_high_low);	resource->id = ACPI_RSTYPE_EXT_IRQ;	resource->length = sizeof(struct acpi_resource);	resource->data.extended_irq.producer_consumer = ACPI_CONSUMER;	resource->data.extended_irq.edge_level = edge_level;	resource->data.extended_irq.active_high_low = active_high_low;	if (edge_level == ACPI_EDGE_SENSITIVE)		resource->data.irq.shared_exclusive = ACPI_EXCLUSIVE;	else		resource->data.irq.shared_exclusive = ACPI_SHARED;	resource->data.extended_irq.number_of_interrupts = 1;	resource->data.extended_irq.interrupts[0] = p->start;}static void pnpacpi_encode_dma(struct acpi_resource *resource,	struct resource *p){	resource->id = ACPI_RSTYPE_DMA;	resource->length = sizeof(struct acpi_resource);	/* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */	if (p->flags & IORESOURCE_DMA_COMPATIBLE)		resource->data.dma.type = ACPI_COMPATIBILITY;	else if (p->flags & IORESOURCE_DMA_TYPEA)		resource->data.dma.type = ACPI_TYPE_A;	else if (p->flags & IORESOURCE_DMA_TYPEB)		resource->data.dma.type = ACPI_TYPE_B;	else if (p->flags & IORESOURCE_DMA_TYPEF)		resource->data.dma.type = ACPI_TYPE_F;	if (p->flags & IORESOURCE_DMA_8BIT)		resource->data.dma.transfer = ACPI_TRANSFER_8;	else if (p->flags & IORESOURCE_DMA_8AND16BIT)		resource->data.dma.transfer = ACPI_TRANSFER_8_16;	else if (p->flags & IORESOURCE_DMA_16BIT)		resource->data.dma.transfer = ACPI_TRANSFER_16;	resource->data.dma.bus_master = p->flags & IORESOURCE_DMA_MASTER;	resource->data.dma.number_of_channels = 1;	resource->data.dma.channels[0] = p->start;}static void pnpacpi_encode_io(struct acpi_resource *resource,	struct resource *p){	resource->id = ACPI_RSTYPE_IO;	resource->length = sizeof(struct acpi_resource);	/* Note: pnp_assign_port will copy pnp_port->flags into p->flags */	resource->data.io.io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR)?		ACPI_DECODE_16 : ACPI_DECODE_10; 	resource->data.io.min_base_address = p->start;	resource->data.io.max_base_address = p->end;	resource->data.io.alignment = 0; /* Correct? */	resource->data.io.range_length = p->end - p->start + 1;}static void pnpacpi_encode_fixed_io(struct acpi_resource *resource,	struct resource *p){	resource->id = ACPI_RSTYPE_FIXED_IO;	resource->length = sizeof(struct acpi_resource);	resource->data.fixed_io.base_address = p->start;	resource->data.fixed_io.range_length = p->end - p->start + 1;}static void pnpacpi_encode_mem24(struct acpi_resource *resource,	struct resource *p){	resource->id = ACPI_RSTYPE_MEM24;	resource->length = sizeof(struct acpi_resource);	/* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */	resource->data.memory24.read_write_attribute =		(p->flags & IORESOURCE_MEM_WRITEABLE) ?		ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;	resource->data.memory24.min_base_address = p->start;	resource->data.memory24.max_base_address = p->end;	resource->data.memory24.alignment = 0;	resource->data.memory24.range_length = p->end - p->start + 1;}static void pnpacpi_encode_mem32(struct acpi_resource *resource,	struct resource *p){	resource->id = ACPI_RSTYPE_MEM32;	resource->length = sizeof(struct acpi_resource);	resource->data.memory32.read_write_attribute =		(p->flags & IORESOURCE_MEM_WRITEABLE) ?		ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;	resource->data.memory32.min_base_address = p->start;	resource->data.memory32.max_base_address = p->end;	resource->data.memory32.alignment = 0;	resource->data.memory32.range_length = p->end - p->start + 1;}static void pnpacpi_encode_fixed_mem32(struct acpi_resource *resource,	struct resource *p){	resource->id = ACPI_RSTYPE_FIXED_MEM32;	resource->length = sizeof(struct acpi_resource);	resource->data.fixed_memory32.read_write_attribute =		(p->flags & IORESOURCE_MEM_WRITEABLE) ?		ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;	resource->data.fixed_memory32.range_base_address = p->start;	resource->data.fixed_memory32.range_length = p->end - p->start + 1;}int pnpacpi_encode_resources(struct pnp_resource_table *res_table, 	struct acpi_buffer *buffer){	int i = 0;	/* pnpacpi_build_resource_template allocates extra mem */	int res_cnt = (buffer->length - 1)/sizeof(struct acpi_resource) - 1;	struct acpi_resource *resource = (struct acpi_resource*)buffer->pointer;	int port = 0, irq = 0, dma = 0, mem = 0;	pnp_dbg("res cnt %d", res_cnt);	while (i < res_cnt) {		switch(resource->id) {		case ACPI_RSTYPE_IRQ:			pnp_dbg("Encode irq");			pnpacpi_encode_irq(resource, 				&res_table->irq_resource[irq]);			irq++;			break;		case ACPI_RSTYPE_EXT_IRQ:			pnp_dbg("Encode ext irq");			pnpacpi_encode_ext_irq(resource, 				&res_table->irq_resource[irq]);			irq++;			break;		case ACPI_RSTYPE_DMA:			pnp_dbg("Encode dma");			pnpacpi_encode_dma(resource, 				&res_table->dma_resource[dma]);			dma ++;			break;		case ACPI_RSTYPE_IO:			pnp_dbg("Encode io");			pnpacpi_encode_io(resource, 				&res_table->port_resource[port]);			port ++;			break;		case ACPI_RSTYPE_FIXED_IO:			pnp_dbg("Encode fixed io");			pnpacpi_encode_fixed_io(resource,				&res_table->port_resource[port]);			port ++;			break;		case ACPI_RSTYPE_MEM24:			pnp_dbg("Encode mem24");			pnpacpi_encode_mem24(resource,				&res_table->mem_resource[mem]);			mem ++;			break;		case ACPI_RSTYPE_MEM32:			pnp_dbg("Encode mem32");			pnpacpi_encode_mem32(resource,				&res_table->mem_resource[mem]);			mem ++;			break;		case ACPI_RSTYPE_FIXED_MEM32:			pnp_dbg("Encode fixed mem32");			pnpacpi_encode_fixed_mem32(resource,				&res_table->mem_resource[mem]);			mem ++;			break;		default: /* other type */			pnp_warn("unknown resource type %d", resource->id);			return -EINVAL;		}		resource ++;		i ++;	}	return 0;}

⌨️ 快捷键说明

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