cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

class.c (13059B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * RTC subsystem, base class
      4 *
      5 * Copyright (C) 2005 Tower Technologies
      6 * Author: Alessandro Zummo <a.zummo@towertech.it>
      7 *
      8 * class skeleton from drivers/hwmon/hwmon.c
      9 */
     10
     11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     12
     13#include <linux/module.h>
     14#include <linux/of.h>
     15#include <linux/rtc.h>
     16#include <linux/kdev_t.h>
     17#include <linux/idr.h>
     18#include <linux/slab.h>
     19#include <linux/workqueue.h>
     20
     21#include "rtc-core.h"
     22
     23static DEFINE_IDA(rtc_ida);
     24struct class *rtc_class;
     25
     26static void rtc_device_release(struct device *dev)
     27{
     28	struct rtc_device *rtc = to_rtc_device(dev);
     29	struct timerqueue_head *head = &rtc->timerqueue;
     30	struct timerqueue_node *node;
     31
     32	mutex_lock(&rtc->ops_lock);
     33	while ((node = timerqueue_getnext(head)))
     34		timerqueue_del(head, node);
     35	mutex_unlock(&rtc->ops_lock);
     36
     37	cancel_work_sync(&rtc->irqwork);
     38
     39	ida_simple_remove(&rtc_ida, rtc->id);
     40	mutex_destroy(&rtc->ops_lock);
     41	kfree(rtc);
     42}
     43
     44#ifdef CONFIG_RTC_HCTOSYS_DEVICE
     45/* Result of the last RTC to system clock attempt. */
     46int rtc_hctosys_ret = -ENODEV;
     47
     48/* IMPORTANT: the RTC only stores whole seconds. It is arbitrary
     49 * whether it stores the most close value or the value with partial
     50 * seconds truncated. However, it is important that we use it to store
     51 * the truncated value. This is because otherwise it is necessary,
     52 * in an rtc sync function, to read both xtime.tv_sec and
     53 * xtime.tv_nsec. On some processors (i.e. ARM), an atomic read
     54 * of >32bits is not possible. So storing the most close value would
     55 * slow down the sync API. So here we have the truncated value and
     56 * the best guess is to add 0.5s.
     57 */
     58
     59static void rtc_hctosys(struct rtc_device *rtc)
     60{
     61	int err;
     62	struct rtc_time tm;
     63	struct timespec64 tv64 = {
     64		.tv_nsec = NSEC_PER_SEC >> 1,
     65	};
     66
     67	err = rtc_read_time(rtc, &tm);
     68	if (err) {
     69		dev_err(rtc->dev.parent,
     70			"hctosys: unable to read the hardware clock\n");
     71		goto err_read;
     72	}
     73
     74	tv64.tv_sec = rtc_tm_to_time64(&tm);
     75
     76#if BITS_PER_LONG == 32
     77	if (tv64.tv_sec > INT_MAX) {
     78		err = -ERANGE;
     79		goto err_read;
     80	}
     81#endif
     82
     83	err = do_settimeofday64(&tv64);
     84
     85	dev_info(rtc->dev.parent, "setting system clock to %ptR UTC (%lld)\n",
     86		 &tm, (long long)tv64.tv_sec);
     87
     88err_read:
     89	rtc_hctosys_ret = err;
     90}
     91#endif
     92
     93#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_RTC_HCTOSYS_DEVICE)
     94/*
     95 * On suspend(), measure the delta between one RTC and the
     96 * system's wall clock; restore it on resume().
     97 */
     98
     99static struct timespec64 old_rtc, old_system, old_delta;
    100
    101static int rtc_suspend(struct device *dev)
    102{
    103	struct rtc_device	*rtc = to_rtc_device(dev);
    104	struct rtc_time		tm;
    105	struct timespec64	delta, delta_delta;
    106	int err;
    107
    108	if (timekeeping_rtc_skipsuspend())
    109		return 0;
    110
    111	if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
    112		return 0;
    113
    114	/* snapshot the current RTC and system time at suspend*/
    115	err = rtc_read_time(rtc, &tm);
    116	if (err < 0) {
    117		pr_debug("%s:  fail to read rtc time\n", dev_name(&rtc->dev));
    118		return 0;
    119	}
    120
    121	ktime_get_real_ts64(&old_system);
    122	old_rtc.tv_sec = rtc_tm_to_time64(&tm);
    123
    124	/*
    125	 * To avoid drift caused by repeated suspend/resumes,
    126	 * which each can add ~1 second drift error,
    127	 * try to compensate so the difference in system time
    128	 * and rtc time stays close to constant.
    129	 */
    130	delta = timespec64_sub(old_system, old_rtc);
    131	delta_delta = timespec64_sub(delta, old_delta);
    132	if (delta_delta.tv_sec < -2 || delta_delta.tv_sec >= 2) {
    133		/*
    134		 * if delta_delta is too large, assume time correction
    135		 * has occurred and set old_delta to the current delta.
    136		 */
    137		old_delta = delta;
    138	} else {
    139		/* Otherwise try to adjust old_system to compensate */
    140		old_system = timespec64_sub(old_system, delta_delta);
    141	}
    142
    143	return 0;
    144}
    145
    146static int rtc_resume(struct device *dev)
    147{
    148	struct rtc_device	*rtc = to_rtc_device(dev);
    149	struct rtc_time		tm;
    150	struct timespec64	new_system, new_rtc;
    151	struct timespec64	sleep_time;
    152	int err;
    153
    154	if (timekeeping_rtc_skipresume())
    155		return 0;
    156
    157	rtc_hctosys_ret = -ENODEV;
    158	if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
    159		return 0;
    160
    161	/* snapshot the current rtc and system time at resume */
    162	ktime_get_real_ts64(&new_system);
    163	err = rtc_read_time(rtc, &tm);
    164	if (err < 0) {
    165		pr_debug("%s:  fail to read rtc time\n", dev_name(&rtc->dev));
    166		return 0;
    167	}
    168
    169	new_rtc.tv_sec = rtc_tm_to_time64(&tm);
    170	new_rtc.tv_nsec = 0;
    171
    172	if (new_rtc.tv_sec < old_rtc.tv_sec) {
    173		pr_debug("%s:  time travel!\n", dev_name(&rtc->dev));
    174		return 0;
    175	}
    176
    177	/* calculate the RTC time delta (sleep time)*/
    178	sleep_time = timespec64_sub(new_rtc, old_rtc);
    179
    180	/*
    181	 * Since these RTC suspend/resume handlers are not called
    182	 * at the very end of suspend or the start of resume,
    183	 * some run-time may pass on either sides of the sleep time
    184	 * so subtract kernel run-time between rtc_suspend to rtc_resume
    185	 * to keep things accurate.
    186	 */
    187	sleep_time = timespec64_sub(sleep_time,
    188				    timespec64_sub(new_system, old_system));
    189
    190	if (sleep_time.tv_sec >= 0)
    191		timekeeping_inject_sleeptime64(&sleep_time);
    192	rtc_hctosys_ret = 0;
    193	return 0;
    194}
    195
    196static SIMPLE_DEV_PM_OPS(rtc_class_dev_pm_ops, rtc_suspend, rtc_resume);
    197#define RTC_CLASS_DEV_PM_OPS	(&rtc_class_dev_pm_ops)
    198#else
    199#define RTC_CLASS_DEV_PM_OPS	NULL
    200#endif
    201
    202/* Ensure the caller will set the id before releasing the device */
    203static struct rtc_device *rtc_allocate_device(void)
    204{
    205	struct rtc_device *rtc;
    206
    207	rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
    208	if (!rtc)
    209		return NULL;
    210
    211	device_initialize(&rtc->dev);
    212
    213	/*
    214	 * Drivers can revise this default after allocating the device.
    215	 * The default is what most RTCs do: Increment seconds exactly one
    216	 * second after the write happened. This adds a default transport
    217	 * time of 5ms which is at least halfways close to reality.
    218	 */
    219	rtc->set_offset_nsec = NSEC_PER_SEC + 5 * NSEC_PER_MSEC;
    220
    221	rtc->irq_freq = 1;
    222	rtc->max_user_freq = 64;
    223	rtc->dev.class = rtc_class;
    224	rtc->dev.groups = rtc_get_dev_attribute_groups();
    225	rtc->dev.release = rtc_device_release;
    226
    227	mutex_init(&rtc->ops_lock);
    228	spin_lock_init(&rtc->irq_lock);
    229	init_waitqueue_head(&rtc->irq_queue);
    230
    231	/* Init timerqueue */
    232	timerqueue_init_head(&rtc->timerqueue);
    233	INIT_WORK(&rtc->irqwork, rtc_timer_do_work);
    234	/* Init aie timer */
    235	rtc_timer_init(&rtc->aie_timer, rtc_aie_update_irq, rtc);
    236	/* Init uie timer */
    237	rtc_timer_init(&rtc->uie_rtctimer, rtc_uie_update_irq, rtc);
    238	/* Init pie timer */
    239	hrtimer_init(&rtc->pie_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    240	rtc->pie_timer.function = rtc_pie_update_irq;
    241	rtc->pie_enabled = 0;
    242
    243	set_bit(RTC_FEATURE_ALARM, rtc->features);
    244	set_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->features);
    245
    246	return rtc;
    247}
    248
    249static int rtc_device_get_id(struct device *dev)
    250{
    251	int of_id = -1, id = -1;
    252
    253	if (dev->of_node)
    254		of_id = of_alias_get_id(dev->of_node, "rtc");
    255	else if (dev->parent && dev->parent->of_node)
    256		of_id = of_alias_get_id(dev->parent->of_node, "rtc");
    257
    258	if (of_id >= 0) {
    259		id = ida_simple_get(&rtc_ida, of_id, of_id + 1, GFP_KERNEL);
    260		if (id < 0)
    261			dev_warn(dev, "/aliases ID %d not available\n", of_id);
    262	}
    263
    264	if (id < 0)
    265		id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL);
    266
    267	return id;
    268}
    269
    270static void rtc_device_get_offset(struct rtc_device *rtc)
    271{
    272	time64_t range_secs;
    273	u32 start_year;
    274	int ret;
    275
    276	/*
    277	 * If RTC driver did not implement the range of RTC hardware device,
    278	 * then we can not expand the RTC range by adding or subtracting one
    279	 * offset.
    280	 */
    281	if (rtc->range_min == rtc->range_max)
    282		return;
    283
    284	ret = device_property_read_u32(rtc->dev.parent, "start-year",
    285				       &start_year);
    286	if (!ret) {
    287		rtc->start_secs = mktime64(start_year, 1, 1, 0, 0, 0);
    288		rtc->set_start_time = true;
    289	}
    290
    291	/*
    292	 * If user did not implement the start time for RTC driver, then no
    293	 * need to expand the RTC range.
    294	 */
    295	if (!rtc->set_start_time)
    296		return;
    297
    298	range_secs = rtc->range_max - rtc->range_min + 1;
    299
    300	/*
    301	 * If the start_secs is larger than the maximum seconds (rtc->range_max)
    302	 * supported by RTC hardware or the maximum seconds of new expanded
    303	 * range (start_secs + rtc->range_max - rtc->range_min) is less than
    304	 * rtc->range_min, which means the minimum seconds (rtc->range_min) of
    305	 * RTC hardware will be mapped to start_secs by adding one offset, so
    306	 * the offset seconds calculation formula should be:
    307	 * rtc->offset_secs = rtc->start_secs - rtc->range_min;
    308	 *
    309	 * If the start_secs is larger than the minimum seconds (rtc->range_min)
    310	 * supported by RTC hardware, then there is one region is overlapped
    311	 * between the original RTC hardware range and the new expanded range,
    312	 * and this overlapped region do not need to be mapped into the new
    313	 * expanded range due to it is valid for RTC device. So the minimum
    314	 * seconds of RTC hardware (rtc->range_min) should be mapped to
    315	 * rtc->range_max + 1, then the offset seconds formula should be:
    316	 * rtc->offset_secs = rtc->range_max - rtc->range_min + 1;
    317	 *
    318	 * If the start_secs is less than the minimum seconds (rtc->range_min),
    319	 * which is similar to case 2. So the start_secs should be mapped to
    320	 * start_secs + rtc->range_max - rtc->range_min + 1, then the
    321	 * offset seconds formula should be:
    322	 * rtc->offset_secs = -(rtc->range_max - rtc->range_min + 1);
    323	 *
    324	 * Otherwise the offset seconds should be 0.
    325	 */
    326	if (rtc->start_secs > rtc->range_max ||
    327	    rtc->start_secs + range_secs - 1 < rtc->range_min)
    328		rtc->offset_secs = rtc->start_secs - rtc->range_min;
    329	else if (rtc->start_secs > rtc->range_min)
    330		rtc->offset_secs = range_secs;
    331	else if (rtc->start_secs < rtc->range_min)
    332		rtc->offset_secs = -range_secs;
    333	else
    334		rtc->offset_secs = 0;
    335}
    336
    337static void devm_rtc_unregister_device(void *data)
    338{
    339	struct rtc_device *rtc = data;
    340
    341	mutex_lock(&rtc->ops_lock);
    342	/*
    343	 * Remove innards of this RTC, then disable it, before
    344	 * letting any rtc_class_open() users access it again
    345	 */
    346	rtc_proc_del_device(rtc);
    347	if (!test_bit(RTC_NO_CDEV, &rtc->flags))
    348		cdev_device_del(&rtc->char_dev, &rtc->dev);
    349	rtc->ops = NULL;
    350	mutex_unlock(&rtc->ops_lock);
    351}
    352
    353static void devm_rtc_release_device(void *res)
    354{
    355	struct rtc_device *rtc = res;
    356
    357	put_device(&rtc->dev);
    358}
    359
    360struct rtc_device *devm_rtc_allocate_device(struct device *dev)
    361{
    362	struct rtc_device *rtc;
    363	int id, err;
    364
    365	id = rtc_device_get_id(dev);
    366	if (id < 0)
    367		return ERR_PTR(id);
    368
    369	rtc = rtc_allocate_device();
    370	if (!rtc) {
    371		ida_simple_remove(&rtc_ida, id);
    372		return ERR_PTR(-ENOMEM);
    373	}
    374
    375	rtc->id = id;
    376	rtc->dev.parent = dev;
    377	err = dev_set_name(&rtc->dev, "rtc%d", id);
    378	if (err)
    379		return ERR_PTR(err);
    380
    381	err = devm_add_action_or_reset(dev, devm_rtc_release_device, rtc);
    382	if (err)
    383		return ERR_PTR(err);
    384
    385	return rtc;
    386}
    387EXPORT_SYMBOL_GPL(devm_rtc_allocate_device);
    388
    389int __devm_rtc_register_device(struct module *owner, struct rtc_device *rtc)
    390{
    391	struct rtc_wkalrm alrm;
    392	int err;
    393
    394	if (!rtc->ops) {
    395		dev_dbg(&rtc->dev, "no ops set\n");
    396		return -EINVAL;
    397	}
    398
    399	if (!rtc->ops->set_alarm)
    400		clear_bit(RTC_FEATURE_ALARM, rtc->features);
    401
    402	if (rtc->ops->set_offset)
    403		set_bit(RTC_FEATURE_CORRECTION, rtc->features);
    404
    405	rtc->owner = owner;
    406	rtc_device_get_offset(rtc);
    407
    408	/* Check to see if there is an ALARM already set in hw */
    409	err = __rtc_read_alarm(rtc, &alrm);
    410	if (!err && !rtc_valid_tm(&alrm.time))
    411		rtc_initialize_alarm(rtc, &alrm);
    412
    413	rtc_dev_prepare(rtc);
    414
    415	err = cdev_device_add(&rtc->char_dev, &rtc->dev);
    416	if (err) {
    417		set_bit(RTC_NO_CDEV, &rtc->flags);
    418		dev_warn(rtc->dev.parent, "failed to add char device %d:%d\n",
    419			 MAJOR(rtc->dev.devt), rtc->id);
    420	} else {
    421		dev_dbg(rtc->dev.parent, "char device (%d:%d)\n",
    422			MAJOR(rtc->dev.devt), rtc->id);
    423	}
    424
    425	rtc_proc_add_device(rtc);
    426
    427	dev_info(rtc->dev.parent, "registered as %s\n",
    428		 dev_name(&rtc->dev));
    429
    430#ifdef CONFIG_RTC_HCTOSYS_DEVICE
    431	if (!strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE))
    432		rtc_hctosys(rtc);
    433#endif
    434
    435	return devm_add_action_or_reset(rtc->dev.parent,
    436					devm_rtc_unregister_device, rtc);
    437}
    438EXPORT_SYMBOL_GPL(__devm_rtc_register_device);
    439
    440/**
    441 * devm_rtc_device_register - resource managed rtc_device_register()
    442 * @dev: the device to register
    443 * @name: the name of the device (unused)
    444 * @ops: the rtc operations structure
    445 * @owner: the module owner
    446 *
    447 * @return a struct rtc on success, or an ERR_PTR on error
    448 *
    449 * Managed rtc_device_register(). The rtc_device returned from this function
    450 * are automatically freed on driver detach.
    451 * This function is deprecated, use devm_rtc_allocate_device and
    452 * rtc_register_device instead
    453 */
    454struct rtc_device *devm_rtc_device_register(struct device *dev,
    455					    const char *name,
    456					    const struct rtc_class_ops *ops,
    457					    struct module *owner)
    458{
    459	struct rtc_device *rtc;
    460	int err;
    461
    462	rtc = devm_rtc_allocate_device(dev);
    463	if (IS_ERR(rtc))
    464		return rtc;
    465
    466	rtc->ops = ops;
    467
    468	err = __devm_rtc_register_device(owner, rtc);
    469	if (err)
    470		return ERR_PTR(err);
    471
    472	return rtc;
    473}
    474EXPORT_SYMBOL_GPL(devm_rtc_device_register);
    475
    476static int __init rtc_init(void)
    477{
    478	rtc_class = class_create(THIS_MODULE, "rtc");
    479	if (IS_ERR(rtc_class)) {
    480		pr_err("couldn't create class\n");
    481		return PTR_ERR(rtc_class);
    482	}
    483	rtc_class->pm = RTC_CLASS_DEV_PM_OPS;
    484	rtc_dev_init();
    485	return 0;
    486}
    487subsys_initcall(rtc_init);