On 9 May 2012 01:36, Zhang, Rui <rui.zh...@intel.com> wrote: > Hi, Amit, > > Sorry for the late response as I'm in a travel recently. > > I think the generic cpufreq cooling patches are good. > > But about the THERMAL_TRIP_STATE_INSTANCE patch, what I'd like to see is that > 1. from thermal zone point of view, when the temperature is higher than a > trip point, either ACTIVE or PASSIVE, what we should do is to set device > cooling state to cur_state+1, right? > The only difference is that if we should take passive cooling actions or > active cooling actions based on the policy. > So my question would be if it is possible to combine these two kind of trip > points together. Maybe something like this: > > In thermal_zone_device_update(), > > ... > case THERMAL_TRIP_PASSIVE: > if (passive cooling not allowed) > continue; > if (tc1) > thermal_zone_device_passive(); > else > thermal_set_cooling_state(); > break; > case THERMAL_TRIP_ACTIVE: > if (active cooling not allowed) > continue; > thermal_set_cooling_state(); > break; > ... > > and thermal_set_cooling_state() { > list_for_each_entry(instance, &tz->cooling_devices, node) { > if (instance->trip != count) > continue; > > cdev = instance->cdev; > > if (temp >= trip_temp) > cdev->ops->set_cur_state(cdev, 1); > else > cdev->ops->set_cur_state(cdev, 0); > } > } > > 2. use only one cooling_device instance for a thermal_zone, and introduce > cdev->trips which shows the trip points this cooling device is bind to. > And we may use multiple cooling devices states for one active trip point. > > Then, thermal_set_cooling_state() would be look like > > list_for_each_entry(instance, &tz->cooling_devices, node) { > cdev = instance->cdev; > /* check whether this cooling device is bind to the trip point */ > if (!(cdev->trips & 1<<count)) > continue; > cdev->ops->get_max_state(cdev, &max_state); > cdev->ops->get_cur_state(cdev, &cur_state); > > if (temp >= trip_temp) { > if (cur_state++ <= max_state)) > cdev->ops->set_cur_state(cdev, cur_state); > } else if ((temp < trip_temp) && (cur_state-- >= 0)) > cdev->ops->set_cur_state(cdev, cur_state); > } > }
Hi Rui, The above implementation also cools instance based cooling devices like passive trip type. I need some changes on top of your implementation such as, thermal_set_cooling_state() { list_for_each_entry(instance, &tz->cooling_devices, node) { cdev = instance->cdev; if (!cdev->trips & 1<<count) continue; inst_id = 0; for_each_bit_set(i, cdev->trips, count) inst_id++; cdev->ops->get_max_state(cdev, &max_state); if ((temp >= trip_temp) && (inst_id <= max_state)) cdev->ops->set_cur_state(cdev, inst_id); else if ((temp < trip_temp) && (--inst_id >= 0)) cdev->ops->set_cur_state(cdev, inst_id); } } I agree with you that the instance based trip types violates the concept like reading the cur_state and do cur_state++/cur_state-- depending upon threshold increase or decrease because it needs the state_id/inst_id. I am actually thinking of dropping this new trip type and use the existing THERMAL_TRIP_ACTIVE because there is so much logic in calculating the state_id. The only flip side of using TRIP_ACTIVE is that I need to create so many cooling devices. Thanks, Amit D > > With these two things, I think the WARN_ZONE AND MONITOR_ZONE can be > registered as two PASSIVE trip points in the generic thermal layer, right? > Actually, this is one thing in my TODO list. And I'd glad to make it high > priority if this solves the problem you have. > > Thanks, > rui > > -----Original Message----- > From: linux-acpi-ow...@vger.kernel.org > [mailto:linux-acpi-ow...@vger.kernel.org] On Behalf Of Amit Daniel Kachhap > Sent: Tuesday, May 08, 2012 9:18 AM > To: a...@linux-foundation.org; linux...@lists.linux-foundation.org > Cc: R, Durgadoss; linux-a...@vger.kernel.org; l...@kernel.org; Zhang, Rui; > amit.kach...@linaro.org; linaro-dev@lists.linaro.org; > linux-ker...@vger.kernel.org; linux-arm-ker...@lists.infradead.org; > linux-samsung-...@vger.kernel.org; patc...@linaro.org > Subject: [PATCH v3 0/6] thermal: exynos: Add kernel thermal support for > exynos platform > Importance: High > > Hi Andrew, > > This patchset introduces a new generic cooling device based on cpufreq that > can be used on non-ACPI platforms. As a proof of concept, we have drivers for > the following platforms using this mechanism now: > > * TI OMAP (git://git.linaro.org/people/amitdanielk/linux.git > omap4460_thermal) > * Samsung Exynos (Exynos4 and Exynos5) in the current patchset. > * Freescale i.MX (git://git.linaro.org/people/amitdanielk/linux.git > imx6q_thermal) > > These patches have been reviewed by Rui Zhang > (https://lkml.org/lkml/2012/4/9/448) > who seems to agree with them in principle, but I haven't had any luck getting > them merged, perhaps a lack of maintainer bandwidth. > > ACPI platforms currently have such a mechanism but it is wrapped in ACPI'isms > that we don't have on ARM platforms. If this is accepted, I'm proposing to > convert over the ACPI thermal driver to use this common code too. > > Can you please merge these patches for 3.5? > > Thanks, > Amit Daniel > > > Changes since V2: > *Added Exynos5 TMU sensor support by enhancing the exynos4 tmu driver. > Exynos5 TMU driver was internally developed by SangWook Ju > <sw...@samsung.com>. > *Removed cpuhotplug cooling code in this patchset. > *Rebased the patches against 3.4-rc6 kernel. > > Changes since V1: > *Moved the sensor driver to driver/thermal folder from driver/hwmon folder > as suggested by Mark Brown and Guenter Roeck *Added notifier support to > notify the registered drivers of any cpu cooling action. The driver can > modify the default cooling behaviour(eg set different max clip frequency). > *The percentage based frequency replaced with absolute clipped frequency. > *Some more conditional checks when setting max frequency. > *Renamed the new trip type THERMAL_TRIP_STATE_ACTIVE to > THERMAL_TRIP_STATE_INSTANCE *Many review comments from R, Durgadoss > <durgados...@intel.com> and eduardo.valen...@ti.com implemented. > *Removed cooling stats through debugfs patch *The V1 based can be found here, > https://lkml.org/lkml/2012/2/22/123 > http://lkml.org/lkml/2012/3/3/32 > > Changes since RFC: > *Changed the cpu cooling registration/unregistration API's to instance based > *Changed the STATE_ACTIVE trip type to pass correct instance id *Adding > support to restore back the policy->max_freq after doing frequency > clipping. > *Moved the trip cooling stats from sysfs node to debugfs node as suggested > by Greg KH g...@kroah.com > *Incorporated several review comments from eduardo.valen...@ti.com *Moved the > Temperature sensor driver from driver/hwmon/ to driver/mfd as discussed with > Guenter Roeck <guenter.ro...@ericsson.com> and Donggeun Kim > <dg77....@samsung.com> (https://lkml.org/lkml/2012/1/5/7) > *Some changes according to the changes in common cpu cooling APIs *The RFC > based patches can be found here, > https://lkml.org/lkml/2011/12/13/186 > https://lkml.org/lkml/2011/12/21/169 > > > Brief Description: > > 1) The generic cooling devices code is placed inside driver/thermal/* as > placing inside acpi folder will need un-necessary enabling of acpi code. This > codes is architecture independent. > > 2) This patchset adds a new trip type THERMAL_TRIP_STATE_INSTANCE which > passes cooling device instance number and may be helpful for cpufreq cooling > devices to take the correct cooling action. This trip type avoids the > temperature comparision check again inside the cooling handler. > > 3) This patchset adds generic cpu cooling low level implementation through > frequency clipping and cpu hotplug. In future, other cpu related cooling > devices may be added here. An ACPI version of this already exists > (drivers/acpi/processor_thermal.c). But this will be useful for platforms > like ARM using the generic thermal interface along with the generic cpu > cooling devices. The cooling device registration API's return cooling device > pointers which can be easily binded with the thermal zone trip points. > The important APIs exposed are, > a)struct thermal_cooling_device *cpufreq_cooling_register( > struct freq_clip_table *tab_ptr, unsigned int tab_size, > const struct cpumask *mask_val) > b)void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) > > 4) Samsung exynos platform thermal implementation is done using the generic > cpu cooling APIs and the new trip type. The temperature sensor driver present > in the hwmon folder(registered as hwmon driver) is moved to thermal folder > and registered as a thermal driver. > > All this patchset is based on Kernel version 3.4-rc6 > > A simple data/control flow diagrams is shown below, > > Core Linux thermal <-----> Exynos thermal interface <----- Temperature Sensor > | | > \|/ | > Cpufreq cooling device <--------------- > > TODO: > *Will send the DT enablement patches later after the driver is merged. > > > Amit Daniel Kachhap (6): > thermal: Add a new trip type to use cooling device instance number > thermal: Add generic cpufreq cooling implementation > hwmon: exynos4: Move thermal sensor driver to driver/thermal > directory > thermal: exynos5: Add exynos5 thermal sensor driver support > thermal: exynos: Register the tmu sensor with the kernel thermal > layer > ARM: exynos: Add thermal sensor driver platform data support > > Documentation/hwmon/exynos4_tmu | 81 --- > Documentation/thermal/cpu-cooling-api.txt | 60 ++ > Documentation/thermal/exynos_thermal | 52 ++ > Documentation/thermal/sysfs-api.txt | 4 +- > drivers/hwmon/Kconfig | 10 - > drivers/hwmon/Makefile | 1 - > drivers/hwmon/exynos4_tmu.c | 514 -------------- > drivers/thermal/Kconfig | 20 + > drivers/thermal/Makefile | 4 +- > drivers/thermal/cpu_cooling.c | 359 ++++++++++ > drivers/thermal/exynos_thermal.c | 933 > ++++++++++++++++++++++++++ > drivers/thermal/thermal_sys.c | 62 ++- > include/linux/cpu_cooling.h | 62 ++ > include/linux/platform_data/exynos4_tmu.h | 83 --- > include/linux/platform_data/exynos_thermal.h | 100 +++ > include/linux/thermal.h | 1 + > 16 files changed, 1651 insertions(+), 695 deletions(-) delete mode 100644 > Documentation/hwmon/exynos4_tmu create mode 100644 > Documentation/thermal/cpu-cooling-api.txt > create mode 100644 Documentation/thermal/exynos_thermal > delete mode 100644 drivers/hwmon/exynos4_tmu.c create mode 100644 > drivers/thermal/cpu_cooling.c create mode 100644 > drivers/thermal/exynos_thermal.c create mode 100644 > include/linux/cpu_cooling.h delete mode 100644 > include/linux/platform_data/exynos4_tmu.h > create mode 100644 include/linux/platform_data/exynos_thermal.h > > -- > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the > body of a message to majord...@vger.kernel.org More majordomo info at > http://vger.kernel.org/majordomo-info.html _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev