From: Len Brown <len.brown@intel.com>
To: Dominik Brodowski <linux@dominikbrodowski.de>
Cc: ACPI Developers <acpi-devel@lists.sourceforge.net>,
cpufreq@www.linux.org.uk
Subject: Re: [PATCH 2.6] (3/5) abstract the acpi-"perflib" registration method
Date: 31 Jan 2004 00:45:33 -0500 [thread overview]
Message-ID: <1075527932.2448.26.camel@dhcppc4> (raw)
In-Reply-To: <20040129105856.GC5372@dominikbrodowski.de>
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];
> };
>
>
prev parent reply other threads:[~2004-01-31 5:45 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
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 message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1075527932.2448.26.camel@dhcppc4 \
--to=len.brown@intel.com \
--cc=acpi-devel@lists.sourceforge.net \
--cc=cpufreq@www.linux.org.uk \
--cc=linux@dominikbrodowski.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.