/* * Copyright (C) 2012-2017, Samsung Electronics Co., Ltd. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include #include "tz_hotplug.h" #include "tz_iwio.h" #include "tz_kthread_pool.h" #include "tzdev.h" #include "tzlog.h" struct iw_service_channel { uint32_t cpu_mask; uint32_t user_cpu_mask; } __attribute__((__packed__)); static struct iw_service_channel *iw_channel; int tz_iwservice_alloc(void) { struct iw_service_channel *ch; ch = tz_iwio_alloc_iw_channel(TZ_IWIO_CONNECT_SERVICE, 1, NULL, NULL, NULL); if (!ch) return -ENOMEM; iw_channel = ch; return 0; } unsigned long tz_iwservice_get_cpu_mask(void) { if (!iw_channel) return 0; return (iw_channel->cpu_mask | iw_channel->user_cpu_mask); } unsigned long tz_iwservice_get_user_cpu_mask(void) { if (!iw_channel) return 0; return iw_channel->user_cpu_mask; } static void tz_iwservice_notify_swd_cpu_mask_update(void) { cpumask_t new_cpus_mask; unsigned long sk_cpu_mask; /* Check cores activation */ sk_cpu_mask = tz_iwservice_get_cpu_mask(); cpumask_andnot(&new_cpus_mask, to_cpumask(&sk_cpu_mask), cpu_online_mask); if (!cpumask_empty(&new_cpus_mask)) tz_hotplug_notify_swd_cpu_mask_update(); if (sk_cpu_mask) tz_kthread_pool_wake_up_all(); } void tz_iwservice_handle_swd_request(void) { if (!iw_channel) return; tz_iwservice_notify_swd_cpu_mask_update(); }