[v2,6/7] thermal/drivers/int340x: Support workload hint interrupts
Commit Message
On thermal device interrupt, if the interrupt is generated for passing
workload hint, call the callback to pass notification to the user
space.
First call proc_thermal_check_wlt_intr() to check interrupt, if this
callback returns true, wake IRQ thread. Call
proc_thermal_wlt_intr_callback() to notify user space.
While here remove function pkg_thermal_schedule_work() and move the
processing to the caller. The function pkg_thermal_schedule_work() just
called schedule_delayed_work().
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
v2:
No change
.../processor_thermal_device_pci.c | 33 ++++++++++++++-----
1 file changed, 24 insertions(+), 9 deletions(-)
Comments
On Mon, Jul 17, 2023 at 9:54 PM Srinivas Pandruvada
<srinivas.pandruvada@linux.intel.com> wrote:
>
> On thermal device interrupt, if the interrupt is generated for passing
> workload hint, call the callback to pass notification to the user
> space.
>
> First call proc_thermal_check_wlt_intr() to check interrupt, if this
> callback returns true, wake IRQ thread. Call
> proc_thermal_wlt_intr_callback() to notify user space.
>
> While here remove function pkg_thermal_schedule_work() and move the
> processing to the caller. The function pkg_thermal_schedule_work() just
> called schedule_delayed_work().
This extra change is somewhat confusing. I would move it to a separate patch.
> Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> ---
> v2:
> No change
>
> .../processor_thermal_device_pci.c | 33 ++++++++++++++-----
> 1 file changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c
> index ee5a4c227d96..83177ed9db49 100644
> --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c
> +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c
> @@ -115,27 +115,40 @@ static void proc_thermal_threshold_work_fn(struct work_struct *work)
> proc_thermal_mmio_write(pci_info, PROC_THERMAL_MMIO_INT_ENABLE_0, 1);
> }
>
> -static void pkg_thermal_schedule_work(struct delayed_work *work)
> +static irqreturn_t proc_thermal_irq_thread_handler(int irq, void *devid)
> {
> - unsigned long ms = msecs_to_jiffies(notify_delay_ms);
> + struct proc_thermal_pci *pci_info = devid;
> +
> + proc_thermal_wlt_intr_callback(pci_info->pdev, pci_info->proc_priv);
>
> - schedule_delayed_work(work, ms);
> + return IRQ_HANDLED;
> }
>
> static irqreturn_t proc_thermal_irq_handler(int irq, void *devid)
> {
> struct proc_thermal_pci *pci_info = devid;
> + struct proc_thermal_device *proc_priv;
> + int ret = IRQ_HANDLED;
> u32 status;
>
> + proc_priv = pci_info->proc_priv;
> +
> + if (proc_priv->mmio_feature_mask & PROC_THERMAL_FEATURE_WLT_HINT) {
> + if (proc_thermal_check_wlt_intr(pci_info->proc_priv))
> + ret = IRQ_WAKE_THREAD;
> + }
> +
> proc_thermal_mmio_read(pci_info, PROC_THERMAL_MMIO_INT_STATUS_0, &status);
> + if (status) {
> + unsigned long ms = msecs_to_jiffies(notify_delay_ms);
>
> - /* Disable enable interrupt flag */
> - proc_thermal_mmio_write(pci_info, PROC_THERMAL_MMIO_INT_ENABLE_0, 0);
> + /* Disable enable interrupt flag */
> + proc_thermal_mmio_write(pci_info, PROC_THERMAL_MMIO_INT_ENABLE_0, 0);
> + schedule_delayed_work(&pci_info->work, ms);
> + }
> pci_write_config_byte(pci_info->pdev, 0xdc, 0x01);
>
> - pkg_thermal_schedule_work(&pci_info->work);
> -
> - return IRQ_HANDLED;
> + return ret;
> }
>
> static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
> @@ -269,7 +282,7 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, const struct pci_device_
> }
>
> ret = devm_request_threaded_irq(&pdev->dev, irq,
> - proc_thermal_irq_handler, NULL,
> + proc_thermal_irq_handler, proc_thermal_irq_thread_handler,
> irq_flag, KBUILD_MODNAME, pci_info);
> if (ret) {
> dev_err(&pdev->dev, "Request IRQ %d failed\n", pdev->irq);
> @@ -383,6 +396,8 @@ static struct pci_driver proc_thermal_pci_driver = {
>
> module_pci_driver(proc_thermal_pci_driver);
>
> +MODULE_IMPORT_NS(INT340X_THERMAL);
> +
> MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
> MODULE_DESCRIPTION("Processor Thermal Reporting Device Driver");
> MODULE_LICENSE("GPL v2");
> --
> 2.38.1
>
@@ -115,27 +115,40 @@ static void proc_thermal_threshold_work_fn(struct work_struct *work)
proc_thermal_mmio_write(pci_info, PROC_THERMAL_MMIO_INT_ENABLE_0, 1);
}
-static void pkg_thermal_schedule_work(struct delayed_work *work)
+static irqreturn_t proc_thermal_irq_thread_handler(int irq, void *devid)
{
- unsigned long ms = msecs_to_jiffies(notify_delay_ms);
+ struct proc_thermal_pci *pci_info = devid;
+
+ proc_thermal_wlt_intr_callback(pci_info->pdev, pci_info->proc_priv);
- schedule_delayed_work(work, ms);
+ return IRQ_HANDLED;
}
static irqreturn_t proc_thermal_irq_handler(int irq, void *devid)
{
struct proc_thermal_pci *pci_info = devid;
+ struct proc_thermal_device *proc_priv;
+ int ret = IRQ_HANDLED;
u32 status;
+ proc_priv = pci_info->proc_priv;
+
+ if (proc_priv->mmio_feature_mask & PROC_THERMAL_FEATURE_WLT_HINT) {
+ if (proc_thermal_check_wlt_intr(pci_info->proc_priv))
+ ret = IRQ_WAKE_THREAD;
+ }
+
proc_thermal_mmio_read(pci_info, PROC_THERMAL_MMIO_INT_STATUS_0, &status);
+ if (status) {
+ unsigned long ms = msecs_to_jiffies(notify_delay_ms);
- /* Disable enable interrupt flag */
- proc_thermal_mmio_write(pci_info, PROC_THERMAL_MMIO_INT_ENABLE_0, 0);
+ /* Disable enable interrupt flag */
+ proc_thermal_mmio_write(pci_info, PROC_THERMAL_MMIO_INT_ENABLE_0, 0);
+ schedule_delayed_work(&pci_info->work, ms);
+ }
pci_write_config_byte(pci_info->pdev, 0xdc, 0x01);
- pkg_thermal_schedule_work(&pci_info->work);
-
- return IRQ_HANDLED;
+ return ret;
}
static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
@@ -269,7 +282,7 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, const struct pci_device_
}
ret = devm_request_threaded_irq(&pdev->dev, irq,
- proc_thermal_irq_handler, NULL,
+ proc_thermal_irq_handler, proc_thermal_irq_thread_handler,
irq_flag, KBUILD_MODNAME, pci_info);
if (ret) {
dev_err(&pdev->dev, "Request IRQ %d failed\n", pdev->irq);
@@ -383,6 +396,8 @@ static struct pci_driver proc_thermal_pci_driver = {
module_pci_driver(proc_thermal_pci_driver);
+MODULE_IMPORT_NS(INT340X_THERMAL);
+
MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
MODULE_DESCRIPTION("Processor Thermal Reporting Device Driver");
MODULE_LICENSE("GPL v2");