public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2.6] (3/5) abstract the acpi-"perflib" registration method
@ 2004-01-29 10:58 Dominik Brodowski
  2004-01-31  5:45 ` Len Brown
  0 siblings, 1 reply; 2+ messages in thread
From: Dominik Brodowski @ 2004-01-29 10:58 UTC (permalink / raw)
  To: len.brown, acpi-devel; +Cc: cpufreq

Abstract the registration method between low-level drivers and the
ACPI Processor P-States driver.

 arch/i386/kernel/cpu/cpufreq/acpi.c |  131 ++++++++++++++++++------------------
 drivers/acpi/processor.c            |   31 --------
 include/acpi/processor.h            |   13 +--
 3 files changed, 73 insertions(+), 102 deletions(-)


diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/acpi.c linux/arch/i386/kernel/cpu/cpufreq/acpi.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/acpi.c	2004-01-18 13:53:33.000000000 +0100
+++ linux/arch/i386/kernel/cpu/cpufreq/acpi.c	2004-01-18 18:45:28.323885104 +0100
@@ -51,7 +51,12 @@
 MODULE_LICENSE("GPL");
 
 
-static struct acpi_processor_performance	*performance[NR_CPUS];
+struct cpufreq_acpi_io {
+	struct acpi_processor_performance	acpi_data;
+	struct cpufreq_frequency_table		freq_table[ACPI_PROCESSOR_MAX_PERFORMANCE];
+};
+
+static struct cpufreq_acpi_io	*acpi_io_data[NR_CPUS];
 
 
 static int
@@ -93,7 +98,7 @@
 
 static int
 acpi_processor_set_performance (
-	struct acpi_processor_performance	*perf,
+	struct cpufreq_acpi_io	*data,
 	unsigned int		cpu,
 	int			state)
 {
@@ -106,28 +111,19 @@
 
 	ACPI_FUNCTION_TRACE("acpi_processor_set_performance");
 
-	if (!perf)
-		return_VALUE(-EINVAL);
-
-	if (state >= perf->state_count) {
-		ACPI_DEBUG_PRINT((ACPI_DB_WARN, 
-			"Invalid target state (P%d)\n", state));
-		return_VALUE(-ENODEV);
-	}
-
-	if (state == perf->state) {
+	if (state == data->acpi_data.state) {
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
 			"Already at target state (P%d)\n", state));
 		return_VALUE(0);
 	}
 
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n",
-		perf->state, state));
+		data->acpi_data.state, state));
 
 	/* cpufreq frequency struct */
 	cpufreq_freqs.cpu = cpu;
-	cpufreq_freqs.old = perf->states[perf->state].core_frequency * 1000;
-	cpufreq_freqs.new = perf->states[state].core_frequency * 1000;
+	cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency;
+	cpufreq_freqs.new = data->freq_table[state].frequency;
 
 	/* notify cpufreq */
 	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
@@ -137,9 +133,9 @@
 	 * control_register.
 	 */
 
-	port = perf->control_register;
-	bit_width = perf->control_register_bit_width;
-	value = (u32) perf->states[state].control;
+	port = data->acpi_data.control_register.address;
+	bit_width = data->acpi_data.control_register.bit_width;
+	value = (u32) data->acpi_data.states[state].control;
 
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
 		"Writing 0x%08x to port 0x%04x\n", value, port));
@@ -158,12 +154,12 @@
 	 * giving up.
 	 */
 
-	port = perf->status_register;
-	bit_width = perf->status_register_bit_width;
+	port = data->acpi_data.status_register.address;
+	bit_width = data->acpi_data.status_register.bit_width;
 
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
 		"Looking for 0x%08x from port 0x%04x\n",
-		(u32) perf->states[state].status, port));
+		(u32) data->acpi_data.states[state].status, port));
 
 	for (i=0; i<100; i++) {
 		ret = acpi_processor_read_port(port, bit_width, &value);
@@ -172,7 +168,7 @@
 				"Invalid port width 0x%04x\n", bit_width));
 			return_VALUE(ret);
 		}
-		if (value == (u32) perf->states[state].status)
+		if (value == (u32) data->acpi_data.states[state].status)
 			break;
 		udelay(10);
 	}
@@ -180,7 +176,7 @@
 	/* notify cpufreq */
 	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
 
-	if (value != (u32) perf->states[state].status) {
+	if (value != (u32) data->acpi_data.states[state].status) {
 		unsigned int tmp = cpufreq_freqs.new;
 		cpufreq_freqs.new = cpufreq_freqs.old;
 		cpufreq_freqs.old = tmp;
@@ -194,7 +190,7 @@
 		"Transition successful after %d microseconds\n",
 		i * 10));
 
-	perf->state = state;
+	data->acpi_data.state = state;
 
 	return_VALUE(0);
 }
@@ -206,21 +202,21 @@
 	unsigned int target_freq,
 	unsigned int relation)
 {
-	struct acpi_processor_performance *perf = performance[policy->cpu];
+	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
 	unsigned int next_state = 0;
 	unsigned int result = 0;
 
 	ACPI_FUNCTION_TRACE("acpi_cpufreq_setpolicy");
 
-	result = cpufreq_frequency_table_target(policy, 
-			perf->freq_table,
+	result = cpufreq_frequency_table_target(policy,
+			data->freq_table,
 			target_freq,
 			relation,
 			&next_state);
 	if (result)
 		return_VALUE(result);
 
-	result = acpi_processor_set_performance (perf, policy->cpu, next_state);
+	result = acpi_processor_set_performance (data, policy->cpu, next_state);
 
 	return_VALUE(result);
 }
@@ -231,17 +227,12 @@
 	struct cpufreq_policy   *policy)
 {
 	unsigned int result = 0;
-	struct acpi_processor_performance *perf = performance[policy->cpu];
+	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
 
 	ACPI_FUNCTION_TRACE("acpi_cpufreq_verify");
 
 	result = cpufreq_frequency_table_verify(policy, 
-			perf->freq_table);
-
-	cpufreq_verify_within_limits(
-		policy, 
-		perf->states[perf->state_count - 1].core_frequency * 1000,
-		perf->states[0].core_frequency * 1000);
+			data->freq_table);
 
 	return_VALUE(result);
 }
@@ -253,31 +244,40 @@
 {
 	unsigned int		i;
 	unsigned int		cpu = policy->cpu;
-	struct acpi_processor_performance *perf;
+	struct cpufreq_acpi_io	*data;
 	unsigned int		result = 0;
 
 	ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_init");
 
-	perf = kmalloc(sizeof(struct acpi_processor_performance), GFP_KERNEL);
-	if (!perf)
+	data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
+	if (!data)
 		return_VALUE(-ENOMEM);
-	memset(perf, 0, sizeof(struct acpi_processor_performance));
+	memset(data, 0, sizeof(struct cpufreq_acpi_io));
 
-	performance[cpu] = perf;
+	acpi_io_data[cpu] = data;
 
-	result = acpi_processor_register_performance(perf, cpu);
+	result = acpi_processor_register_performance(&data->acpi_data, cpu);
 	if (result)
 		goto err_free;
 
 	/* capability check */
-	if (perf->state_count <= 1)
+	if (data->acpi_data.state_count <= 1) {
+		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No P-States\n"));
+		goto err_unreg;
+	}
+	if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) ||
+	    (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
+		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unsupported address space [%d, %d]\n",
+				  (u32) (data->acpi_data.control_register.space_id),
+				  (u32) (data->acpi_data.status_register.space_id)));
 		goto err_unreg;
+	}
 
 	/* detect transition latency */
 	policy->cpuinfo.transition_latency = 0;
-	for (i=0; i<perf->state_count; i++) {
-		if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
-			policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000;
+	for (i=0; i<data->acpi_data.state_count; i++) {
+		if ((data->acpi_data.states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
+			policy->cpuinfo.transition_latency = data->acpi_data.states[i].transition_latency * 1000;
 	}
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
 
@@ -285,36 +285,36 @@
 	 * The current speed is unknown and not detectable by ACPI... argh! Assume 
 	 * it's P0, it will be set to this value later during initialization.
 	 */
-	policy->cur = perf->states[0].core_frequency * 1000;
+	policy->cur = data->acpi_data.states[0].core_frequency * 1000;
 
 	/* table init */
-	for (i=0; i<=perf->state_count; i++)
+	for (i=0; i<=data->acpi_data.state_count; i++)
 	{
-		perf->freq_table[i].index = i;
-		if (i<perf->state_count)
-			perf->freq_table[i].frequency = perf->states[i].core_frequency * 1000;
+		data->freq_table[i].index = i;
+		if (i<data->acpi_data.state_count)
+			data->freq_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000;
 		else
-			perf->freq_table[i].frequency = CPUFREQ_TABLE_END;
+			data->freq_table[i].frequency = CPUFREQ_TABLE_END;
 	}
 
-	result = cpufreq_frequency_table_cpuinfo(policy, &perf->freq_table[0]);
+	result = cpufreq_frequency_table_cpuinfo(policy, &data->freq_table[0]);
 
 	printk(KERN_INFO "cpufreq: CPU%u - ACPI performance management activated.\n",
 	       cpu);
-	for (i = 0; i < perf->state_count; i++)
+	for (i = 0; i < data->acpi_data.state_count; i++)
 		printk(KERN_INFO "cpufreq: %cP%d: %d MHz, %d mW, %d uS\n",
-			(i == perf->state?'*':' '), i,
-			(u32) perf->states[i].core_frequency,
-			(u32) perf->states[i].power,
-			(u32) perf->states[i].transition_latency);
+			(i == data->acpi_data.state?'*':' '), i,
+			(u32) data->acpi_data.states[i].core_frequency,
+			(u32) data->acpi_data.states[i].power,
+			(u32) data->acpi_data.states[i].transition_latency);
 
 	return_VALUE(result);
 
  err_unreg:
-	acpi_processor_unregister_performance(perf, cpu);
+	acpi_processor_unregister_performance(&data->acpi_data, cpu);
  err_free:
-	kfree(perf);
-	performance[cpu] = NULL;
+	kfree(data);
+	acpi_io_data[cpu] = NULL;
 
 	return_VALUE(result);
 }
@@ -324,14 +324,15 @@
 acpi_cpufreq_cpu_exit (
 	struct cpufreq_policy   *policy)
 {
-	struct acpi_processor_performance  *perf = performance[policy->cpu];
+	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
+
 
 	ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_exit");
 
-	if (perf) {
-		performance[policy->cpu] = NULL;
-		acpi_processor_unregister_performance(perf, policy->cpu);
-		kfree(perf);
+	if (data) {
+		acpi_io_data[policy->cpu] = NULL;
+		acpi_processor_unregister_performance(&data->acpi_data, policy->cpu);
+		kfree(data);
 	}
 
 	return_VALUE(0);
diff -ruN linux-original/drivers/acpi/processor.c linux/drivers/acpi/processor.c
--- linux-original/drivers/acpi/processor.c	2004-01-18 13:53:33.000000000 +0100
+++ linux/drivers/acpi/processor.c	2004-01-18 18:45:59.091207760 +0100
@@ -871,7 +871,6 @@
 	struct acpi_buffer	buffer = {ACPI_ALLOCATE_BUFFER, NULL};
 	union acpi_object	*pct = NULL;
 	union acpi_object	obj = {0};
-	struct acpi_pct_register *reg = NULL;
 
 	ACPI_FUNCTION_TRACE("acpi_processor_get_performance_control");
 
@@ -903,19 +902,9 @@
 		result = -EFAULT;
 		goto end;
 	}
+	memcpy(&pr->performance->control_register, obj.buffer.pointer, sizeof(struct acpi_pct_register));
 
-	reg = (struct acpi_pct_register *) (obj.buffer.pointer);
 
-	if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO) {
-		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-			"Unsupported address space [%d] (control_register)\n",
-			(u32) reg->space_id));
-		result = -EFAULT;
-		goto end;
-	}
-
-	pr->performance->control_register = (u16) reg->address;
-	pr->performance->control_register_bit_width = reg->bit_width;
 	/*
 	 * status_register
 	 */
@@ -931,23 +920,7 @@
 		goto end;
 	}
 
-	reg = (struct acpi_pct_register *) (obj.buffer.pointer);
-
-	if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO) {
-		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-			"Unsupported address space [%d] (status_register)\n",
-			(u32) reg->space_id));
-		result = -EFAULT;
-		goto end;
-	}
-
-	pr->performance->status_register = (u16) reg->address;
-	pr->performance->status_register_bit_width = reg->bit_width;
-
-	ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
-		"control_register[0x%04x] status_register[0x%04x]\n",
-		pr->performance->control_register,
-		pr->performance->status_register));
+	memcpy(&pr->performance->status_register, obj.buffer.pointer, sizeof(struct acpi_pct_register));
 
 end:
 	acpi_os_free(buffer.pointer);
diff -ruN linux-original/include/acpi/processor.h linux/include/acpi/processor.h
--- linux-original/include/acpi/processor.h	2004-01-18 13:53:33.000000000 +0100
+++ linux/include/acpi/processor.h	2004-01-18 18:44:20.178244816 +0100
@@ -68,15 +68,12 @@
 };
 
 struct acpi_processor_performance {
-	int			state;
-	int			platform_limit;
-	u16			control_register;
-	u16			status_register;
-	u8			control_register_bit_width;
-	u8			status_register_bit_width;
-	int			state_count;
+	unsigned int		 state;
+	unsigned int		 platform_limit;
+	struct acpi_pct_register control_register;
+	struct acpi_pct_register status_register;
+	unsigned int		 state_count;
 	struct acpi_processor_px states[ACPI_PROCESSOR_MAX_PERFORMANCE];
-	struct cpufreq_frequency_table freq_table[ACPI_PROCESSOR_MAX_PERFORMANCE];
 };

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH 2.6] (3/5) abstract the acpi-"perflib" registration method
  2004-01-29 10:58 [PATCH 2.6] (3/5) abstract the acpi-"perflib" registration method Dominik Brodowski
@ 2004-01-31  5:45 ` Len Brown
  0 siblings, 0 replies; 2+ messages in thread
From: Len Brown @ 2004-01-31  5:45 UTC (permalink / raw)
  To: Dominik Brodowski; +Cc: ACPI Developers, cpufreq

Accepted into ACPI test trees
http://linux-acpi.bkbits.net/linux-acpi-test-2.6.1
http://linux-acpi.bkbits.net/linux-acpi-test-2.6.2

This means it will be pulled into AKPM's 2.6 mm tree on the next update,
and is in the test queue for early 2.6.3.

thanks Dominik,
-Len

On Thu, 2004-01-29 at 05:58, Dominik Brodowski wrote:
> Abstract the registration method between low-level drivers and the
> ACPI Processor P-States driver.
> 
>  arch/i386/kernel/cpu/cpufreq/acpi.c |  131 ++++++++++++++++++------------------
>  drivers/acpi/processor.c            |   31 --------
>  include/acpi/processor.h            |   13 +--
>  3 files changed, 73 insertions(+), 102 deletions(-)
> 
> 
> diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/acpi.c linux/arch/i386/kernel/cpu/cpufreq/acpi.c
> --- linux-original/arch/i386/kernel/cpu/cpufreq/acpi.c	2004-01-18 13:53:33.000000000 +0100
> +++ linux/arch/i386/kernel/cpu/cpufreq/acpi.c	2004-01-18 18:45:28.323885104 +0100
> @@ -51,7 +51,12 @@
>  MODULE_LICENSE("GPL");
>  
> 
> -static struct acpi_processor_performance	*performance[NR_CPUS];
> +struct cpufreq_acpi_io {
> +	struct acpi_processor_performance	acpi_data;
> +	struct cpufreq_frequency_table		freq_table[ACPI_PROCESSOR_MAX_PERFORMANCE];
> +};
> +
> +static struct cpufreq_acpi_io	*acpi_io_data[NR_CPUS];
>  
> 
>  static int
> @@ -93,7 +98,7 @@
>  
>  static int
>  acpi_processor_set_performance (
> -	struct acpi_processor_performance	*perf,
> +	struct cpufreq_acpi_io	*data,
>  	unsigned int		cpu,
>  	int			state)
>  {
> @@ -106,28 +111,19 @@
>  
>  	ACPI_FUNCTION_TRACE("acpi_processor_set_performance");
>  
> -	if (!perf)
> -		return_VALUE(-EINVAL);
> -
> -	if (state >= perf->state_count) {
> -		ACPI_DEBUG_PRINT((ACPI_DB_WARN, 
> -			"Invalid target state (P%d)\n", state));
> -		return_VALUE(-ENODEV);
> -	}
> -
> -	if (state == perf->state) {
> +	if (state == data->acpi_data.state) {
>  		ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
>  			"Already at target state (P%d)\n", state));
>  		return_VALUE(0);
>  	}
>  
>  	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n",
> -		perf->state, state));
> +		data->acpi_data.state, state));
>  
>  	/* cpufreq frequency struct */
>  	cpufreq_freqs.cpu = cpu;
> -	cpufreq_freqs.old = perf->states[perf->state].core_frequency * 1000;
> -	cpufreq_freqs.new = perf->states[state].core_frequency * 1000;
> +	cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency;
> +	cpufreq_freqs.new = data->freq_table[state].frequency;
>  
>  	/* notify cpufreq */
>  	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
> @@ -137,9 +133,9 @@
>  	 * control_register.
>  	 */
>  
> -	port = perf->control_register;
> -	bit_width = perf->control_register_bit_width;
> -	value = (u32) perf->states[state].control;
> +	port = data->acpi_data.control_register.address;
> +	bit_width = data->acpi_data.control_register.bit_width;
> +	value = (u32) data->acpi_data.states[state].control;
>  
>  	ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
>  		"Writing 0x%08x to port 0x%04x\n", value, port));
> @@ -158,12 +154,12 @@
>  	 * giving up.
>  	 */
>  
> -	port = perf->status_register;
> -	bit_width = perf->status_register_bit_width;
> +	port = data->acpi_data.status_register.address;
> +	bit_width = data->acpi_data.status_register.bit_width;
>  
>  	ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
>  		"Looking for 0x%08x from port 0x%04x\n",
> -		(u32) perf->states[state].status, port));
> +		(u32) data->acpi_data.states[state].status, port));
>  
>  	for (i=0; i<100; i++) {
>  		ret = acpi_processor_read_port(port, bit_width, &value);
> @@ -172,7 +168,7 @@
>  				"Invalid port width 0x%04x\n", bit_width));
>  			return_VALUE(ret);
>  		}
> -		if (value == (u32) perf->states[state].status)
> +		if (value == (u32) data->acpi_data.states[state].status)
>  			break;
>  		udelay(10);
>  	}
> @@ -180,7 +176,7 @@
>  	/* notify cpufreq */
>  	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
>  
> -	if (value != (u32) perf->states[state].status) {
> +	if (value != (u32) data->acpi_data.states[state].status) {
>  		unsigned int tmp = cpufreq_freqs.new;
>  		cpufreq_freqs.new = cpufreq_freqs.old;
>  		cpufreq_freqs.old = tmp;
> @@ -194,7 +190,7 @@
>  		"Transition successful after %d microseconds\n",
>  		i * 10));
>  
> -	perf->state = state;
> +	data->acpi_data.state = state;
>  
>  	return_VALUE(0);
>  }
> @@ -206,21 +202,21 @@
>  	unsigned int target_freq,
>  	unsigned int relation)
>  {
> -	struct acpi_processor_performance *perf = performance[policy->cpu];
> +	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
>  	unsigned int next_state = 0;
>  	unsigned int result = 0;
>  
>  	ACPI_FUNCTION_TRACE("acpi_cpufreq_setpolicy");
>  
> -	result = cpufreq_frequency_table_target(policy, 
> -			perf->freq_table,
> +	result = cpufreq_frequency_table_target(policy,
> +			data->freq_table,
>  			target_freq,
>  			relation,
>  			&next_state);
>  	if (result)
>  		return_VALUE(result);
>  
> -	result = acpi_processor_set_performance (perf, policy->cpu, next_state);
> +	result = acpi_processor_set_performance (data, policy->cpu, next_state);
>  
>  	return_VALUE(result);
>  }
> @@ -231,17 +227,12 @@
>  	struct cpufreq_policy   *policy)
>  {
>  	unsigned int result = 0;
> -	struct acpi_processor_performance *perf = performance[policy->cpu];
> +	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
>  
>  	ACPI_FUNCTION_TRACE("acpi_cpufreq_verify");
>  
>  	result = cpufreq_frequency_table_verify(policy, 
> -			perf->freq_table);
> -
> -	cpufreq_verify_within_limits(
> -		policy, 
> -		perf->states[perf->state_count - 1].core_frequency * 1000,
> -		perf->states[0].core_frequency * 1000);
> +			data->freq_table);
>  
>  	return_VALUE(result);
>  }
> @@ -253,31 +244,40 @@
>  {
>  	unsigned int		i;
>  	unsigned int		cpu = policy->cpu;
> -	struct acpi_processor_performance *perf;
> +	struct cpufreq_acpi_io	*data;
>  	unsigned int		result = 0;
>  
>  	ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_init");
>  
> -	perf = kmalloc(sizeof(struct acpi_processor_performance), GFP_KERNEL);
> -	if (!perf)
> +	data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
> +	if (!data)
>  		return_VALUE(-ENOMEM);
> -	memset(perf, 0, sizeof(struct acpi_processor_performance));
> +	memset(data, 0, sizeof(struct cpufreq_acpi_io));
>  
> -	performance[cpu] = perf;
> +	acpi_io_data[cpu] = data;
>  
> -	result = acpi_processor_register_performance(perf, cpu);
> +	result = acpi_processor_register_performance(&data->acpi_data, cpu);
>  	if (result)
>  		goto err_free;
>  
>  	/* capability check */
> -	if (perf->state_count <= 1)
> +	if (data->acpi_data.state_count <= 1) {
> +		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No P-States\n"));
> +		goto err_unreg;
> +	}
> +	if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) ||
> +	    (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
> +		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unsupported address space [%d, %d]\n",
> +				  (u32) (data->acpi_data.control_register.space_id),
> +				  (u32) (data->acpi_data.status_register.space_id)));
>  		goto err_unreg;
> +	}
>  
>  	/* detect transition latency */
>  	policy->cpuinfo.transition_latency = 0;
> -	for (i=0; i<perf->state_count; i++) {
> -		if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
> -			policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000;
> +	for (i=0; i<data->acpi_data.state_count; i++) {
> +		if ((data->acpi_data.states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
> +			policy->cpuinfo.transition_latency = data->acpi_data.states[i].transition_latency * 1000;
>  	}
>  	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
>  
> @@ -285,36 +285,36 @@
>  	 * The current speed is unknown and not detectable by ACPI... argh! Assume 
>  	 * it's P0, it will be set to this value later during initialization.
>  	 */
> -	policy->cur = perf->states[0].core_frequency * 1000;
> +	policy->cur = data->acpi_data.states[0].core_frequency * 1000;
>  
>  	/* table init */
> -	for (i=0; i<=perf->state_count; i++)
> +	for (i=0; i<=data->acpi_data.state_count; i++)
>  	{
> -		perf->freq_table[i].index = i;
> -		if (i<perf->state_count)
> -			perf->freq_table[i].frequency = perf->states[i].core_frequency * 1000;
> +		data->freq_table[i].index = i;
> +		if (i<data->acpi_data.state_count)
> +			data->freq_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000;
>  		else
> -			perf->freq_table[i].frequency = CPUFREQ_TABLE_END;
> +			data->freq_table[i].frequency = CPUFREQ_TABLE_END;
>  	}
>  
> -	result = cpufreq_frequency_table_cpuinfo(policy, &perf->freq_table[0]);
> +	result = cpufreq_frequency_table_cpuinfo(policy, &data->freq_table[0]);
>  
>  	printk(KERN_INFO "cpufreq: CPU%u - ACPI performance management activated.\n",
>  	       cpu);
> -	for (i = 0; i < perf->state_count; i++)
> +	for (i = 0; i < data->acpi_data.state_count; i++)
>  		printk(KERN_INFO "cpufreq: %cP%d: %d MHz, %d mW, %d uS\n",
> -			(i == perf->state?'*':' '), i,
> -			(u32) perf->states[i].core_frequency,
> -			(u32) perf->states[i].power,
> -			(u32) perf->states[i].transition_latency);
> +			(i == data->acpi_data.state?'*':' '), i,
> +			(u32) data->acpi_data.states[i].core_frequency,
> +			(u32) data->acpi_data.states[i].power,
> +			(u32) data->acpi_data.states[i].transition_latency);
>  
>  	return_VALUE(result);
>  
>   err_unreg:
> -	acpi_processor_unregister_performance(perf, cpu);
> +	acpi_processor_unregister_performance(&data->acpi_data, cpu);
>   err_free:
> -	kfree(perf);
> -	performance[cpu] = NULL;
> +	kfree(data);
> +	acpi_io_data[cpu] = NULL;
>  
>  	return_VALUE(result);
>  }
> @@ -324,14 +324,15 @@
>  acpi_cpufreq_cpu_exit (
>  	struct cpufreq_policy   *policy)
>  {
> -	struct acpi_processor_performance  *perf = performance[policy->cpu];
> +	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
> +
>  
>  	ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_exit");
>  
> -	if (perf) {
> -		performance[policy->cpu] = NULL;
> -		acpi_processor_unregister_performance(perf, policy->cpu);
> -		kfree(perf);
> +	if (data) {
> +		acpi_io_data[policy->cpu] = NULL;
> +		acpi_processor_unregister_performance(&data->acpi_data, policy->cpu);
> +		kfree(data);
>  	}
>  
>  	return_VALUE(0);
> diff -ruN linux-original/drivers/acpi/processor.c linux/drivers/acpi/processor.c
> --- linux-original/drivers/acpi/processor.c	2004-01-18 13:53:33.000000000 +0100
> +++ linux/drivers/acpi/processor.c	2004-01-18 18:45:59.091207760 +0100
> @@ -871,7 +871,6 @@
>  	struct acpi_buffer	buffer = {ACPI_ALLOCATE_BUFFER, NULL};
>  	union acpi_object	*pct = NULL;
>  	union acpi_object	obj = {0};
> -	struct acpi_pct_register *reg = NULL;
>  
>  	ACPI_FUNCTION_TRACE("acpi_processor_get_performance_control");
>  
> @@ -903,19 +902,9 @@
>  		result = -EFAULT;
>  		goto end;
>  	}
> +	memcpy(&pr->performance->control_register, obj.buffer.pointer, sizeof(struct acpi_pct_register));
>  
> -	reg = (struct acpi_pct_register *) (obj.buffer.pointer);
>  
> -	if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO) {
> -		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
> -			"Unsupported address space [%d] (control_register)\n",
> -			(u32) reg->space_id));
> -		result = -EFAULT;
> -		goto end;
> -	}
> -
> -	pr->performance->control_register = (u16) reg->address;
> -	pr->performance->control_register_bit_width = reg->bit_width;
>  	/*
>  	 * status_register
>  	 */
> @@ -931,23 +920,7 @@
>  		goto end;
>  	}
>  
> -	reg = (struct acpi_pct_register *) (obj.buffer.pointer);
> -
> -	if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO) {
> -		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
> -			"Unsupported address space [%d] (status_register)\n",
> -			(u32) reg->space_id));
> -		result = -EFAULT;
> -		goto end;
> -	}
> -
> -	pr->performance->status_register = (u16) reg->address;
> -	pr->performance->status_register_bit_width = reg->bit_width;
> -
> -	ACPI_DEBUG_PRINT((ACPI_DB_INFO, 
> -		"control_register[0x%04x] status_register[0x%04x]\n",
> -		pr->performance->control_register,
> -		pr->performance->status_register));
> +	memcpy(&pr->performance->status_register, obj.buffer.pointer, sizeof(struct acpi_pct_register));
>  
>  end:
>  	acpi_os_free(buffer.pointer);
> diff -ruN linux-original/include/acpi/processor.h linux/include/acpi/processor.h
> --- linux-original/include/acpi/processor.h	2004-01-18 13:53:33.000000000 +0100
> +++ linux/include/acpi/processor.h	2004-01-18 18:44:20.178244816 +0100
> @@ -68,15 +68,12 @@
>  };
>  
>  struct acpi_processor_performance {
> -	int			state;
> -	int			platform_limit;
> -	u16			control_register;
> -	u16			status_register;
> -	u8			control_register_bit_width;
> -	u8			status_register_bit_width;
> -	int			state_count;
> +	unsigned int		 state;
> +	unsigned int		 platform_limit;
> +	struct acpi_pct_register control_register;
> +	struct acpi_pct_register status_register;
> +	unsigned int		 state_count;
>  	struct acpi_processor_px states[ACPI_PROCESSOR_MAX_PERFORMANCE];
> -	struct cpufreq_frequency_table freq_table[ACPI_PROCESSOR_MAX_PERFORMANCE];
>  };
>  
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-01-31  5:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-01-29 10:58 [PATCH 2.6] (3/5) abstract the acpi-"perflib" registration method Dominik Brodowski
2004-01-31  5:45 ` Len Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox