From: tip-bot for Thomas Gleixner <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: andi.kleen@intel.com, ricardo.neri-calderon@linux.intel.com,
eranian@google.com, linux-kernel@vger.kernel.org,
mingo@kernel.org, ravi.v.shankar@intel.com, tglx@linutronix.de,
Suravee.Suthikulpanit@amd.com, peterz@infradead.org,
ashok.raj@intel.com, hpa@zytor.com
Subject: [tip:x86/timers] x86/hpet: Use cached info instead of extra flags
Date: Thu, 27 Jun 2019 16:50:25 -0700 [thread overview]
Message-ID: <tip-45e0a415634600e608188480bc355b20344f9e3f@git.kernel.org> (raw)
In-Reply-To: <20190623132436.277510163@linutronix.de>
Commit-ID: 45e0a415634600e608188480bc355b20344f9e3f
Gitweb: https://git.kernel.org/tip/45e0a415634600e608188480bc355b20344f9e3f
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Sun, 23 Jun 2019 15:24:04 +0200
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Fri, 28 Jun 2019 00:57:25 +0200
x86/hpet: Use cached info instead of extra flags
Now that HPET clockevent support is integrated into the channel data, reuse
the cached boot configuration instead of copying the same information into
a flags field.
This also allows to consolidate the reservation code into one place, which
can now solely depend on the mode information.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Andi Kleen <andi.kleen@intel.com>
Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Ravi Shankar <ravi.v.shankar@intel.com>
Link: https://lkml.kernel.org/r/20190623132436.277510163@linutronix.de
---
arch/x86/kernel/hpet.c | 76 +++++++++++++++-----------------------------------
1 file changed, 23 insertions(+), 53 deletions(-)
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 7f76f07138a6..985a2246d20c 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -25,8 +25,8 @@ struct hpet_channel {
unsigned int num;
unsigned int cpu;
unsigned int irq;
+ unsigned int in_use;
enum hpet_mode mode;
- unsigned int flags;
unsigned int boot_cfg;
char name[10];
};
@@ -40,12 +40,6 @@ struct hpet_base {
#define HPET_MASK CLOCKSOURCE_MASK(32)
-#define HPET_DEV_USED_BIT 2
-#define HPET_DEV_USED (1 << HPET_DEV_USED_BIT)
-#define HPET_DEV_VALID 0x8
-#define HPET_DEV_FSB_CAP 0x1000
-#define HPET_DEV_PERI_CAP 0x2000
-
#define HPET_MIN_CYCLES 128
#define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES + (HPET_MIN_CYCLES >> 1))
@@ -62,6 +56,7 @@ static struct irq_domain *hpet_domain;
#endif
static void __iomem *hpet_virt_address;
+
static struct hpet_base hpet_base;
static bool hpet_legacy_int_enabled;
@@ -190,8 +185,6 @@ do { \
*/
#ifdef CONFIG_HPET
-static void hpet_reserve_msi_timers(struct hpet_data *hd);
-
static void __init hpet_reserve_platform_timers(void)
{
struct hpet_data hd;
@@ -201,11 +194,6 @@ static void __init hpet_reserve_platform_timers(void)
hd.hd_phys_address = hpet_address;
hd.hd_address = hpet_virt_address;
hd.hd_nirqs = hpet_base.nr_channels;
- hpet_reserve_timer(&hd, 0);
-
-#ifdef CONFIG_HPET_EMULATE_RTC
- hpet_reserve_timer(&hd, 1);
-#endif
/*
* NOTE that hd_irq[] reflects IOAPIC input pins (LEGACY_8254
@@ -215,13 +203,25 @@ static void __init hpet_reserve_platform_timers(void)
hd.hd_irq[0] = HPET_LEGACY_8254;
hd.hd_irq[1] = HPET_LEGACY_RTC;
- for (i = 2; i < hpet_base.nr_channels; i++)
- hd.hd_irq[i] = hpet_base.channels[i].irq;
+ for (i = 0; i < hpet_base.nr_channels; i++) {
+ struct hpet_channel *hc = hpet_base.channels + i;
- hpet_reserve_msi_timers(&hd);
+ if (i >= 2)
+ hd.hd_irq[i] = hc->irq;
- hpet_alloc(&hd);
+ switch (hc->mode) {
+ case HPET_MODE_UNUSED:
+ case HPET_MODE_DEVICE:
+ hc->mode = HPET_MODE_DEVICE;
+ break;
+ case HPET_MODE_CLOCKEVT:
+ case HPET_MODE_LEGACY:
+ hpet_reserve_timer(&hd, hc->num);
+ break;
+ }
+ }
+ hpet_alloc(&hd);
}
static void __init hpet_select_device_channel(void)
@@ -543,13 +543,11 @@ static int hpet_setup_irq(struct hpet_channel *hc)
return 0;
}
+/* Invoked from the hotplug callback on @cpu */
static void init_one_hpet_msi_clockevent(struct hpet_channel *hc, int cpu)
{
struct clock_event_device *evt = &hc->evt;
- if (!(hc->flags & HPET_DEV_VALID))
- return;
-
hc->cpu = cpu;
per_cpu(cpu_hpet_channel, cpu) = hc;
evt->name = hc->name;
@@ -558,7 +556,7 @@ static void init_one_hpet_msi_clockevent(struct hpet_channel *hc, int cpu)
evt->rating = 110;
evt->features = CLOCK_EVT_FEAT_ONESHOT;
- if (hc->flags & HPET_DEV_PERI_CAP) {
+ if (hc->boot_cfg & HPET_TN_PERIODIC) {
evt->features |= CLOCK_EVT_FEAT_PERIODIC;
evt->set_state_periodic = hpet_msi_set_periodic;
}
@@ -580,11 +578,9 @@ static struct hpet_channel *hpet_get_unused_clockevent(void)
for (i = 0; i < hpet_base.nr_channels; i++) {
struct hpet_channel *hc = hpet_base.channels + i;
- if (!(hc->flags & HPET_DEV_VALID))
- continue;
- if (test_and_set_bit(HPET_DEV_USED_BIT,
- (unsigned long *)&hc->flags))
+ if (hc->mode != HPET_MODE_CLOCKEVT || hc->in_use)
continue;
+ hc->in_use = 1;
return hc;
}
return NULL;
@@ -606,7 +602,7 @@ static int hpet_cpuhp_dead(unsigned int cpu)
if (!hc)
return 0;
free_irq(hc->irq, hc);
- hc->flags &= ~HPET_DEV_USED;
+ hc->in_use = 0;
per_cpu(cpu_hpet_channel, cpu) = NULL;
return 0;
}
@@ -638,9 +634,6 @@ static void __init hpet_select_clockevents(void)
if (!(hc->boot_cfg & HPET_TN_FSB_CAP))
continue;
- hc->flags = 0;
- if (hc->boot_cfg & HPET_TN_PERIODIC_CAP)
- hc->flags |= HPET_DEV_PERI_CAP;
sprintf(hc->name, "hpet%d", i);
irq = hpet_assign_irq(hpet_domain, hc, hc->num);
@@ -648,8 +641,6 @@ static void __init hpet_select_clockevents(void)
continue;
hc->irq = irq;
- hc->flags |= HPET_DEV_FSB_CAP;
- hc->flags |= HPET_DEV_VALID;
hc->mode = HPET_MODE_CLOCKEVT;
if (++hpet_base.nr_clockevents == num_possible_cpus())
@@ -660,31 +651,10 @@ static void __init hpet_select_clockevents(void)
hpet_base.nr_channels, hpet_base.nr_clockevents);
}
-#ifdef CONFIG_HPET
-static void __init hpet_reserve_msi_timers(struct hpet_data *hd)
-{
- int i;
-
- for (i = 0; i < hpet_base.nr_channels; i++) {
- struct hpet_channel *hc = hpet_base.channels + i;
-
- if (!(hc->flags & HPET_DEV_VALID))
- continue;
-
- hd->hd_irq[hc->num] = hc->irq;
- hpet_reserve_timer(hd, hc->num);
- }
-}
-#endif
-
#else
static inline void hpet_select_clockevents(void) { }
-#ifdef CONFIG_HPET
-static inline void hpet_reserve_msi_timers(struct hpet_data *hd) { }
-#endif
-
#define hpet_cpuhp_online NULL
#define hpet_cpuhp_dead NULL
next prev parent reply other threads:[~2019-06-27 23:50 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-23 13:23 [patch 00/29] x86/hpet: Cleanup the channel management Thomas Gleixner
2019-06-23 13:23 ` [patch 01/29] x86/hpet: Simplify CPU online code Thomas Gleixner
2019-06-27 23:34 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 02/29] x86/hpet: Replace printk(KERN...) with pr_...() Thomas Gleixner
2019-06-27 23:34 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 03/29] x86/hpet: Restructure init code Thomas Gleixner
2019-06-27 23:35 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 04/29] x86/hpet: Remove pointless x86-64 specific #include Thomas Gleixner
2019-06-27 23:36 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 05/29] x86/hpet: Remove unused parameter from hpet_next_event() Thomas Gleixner
2019-06-27 23:36 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 06/29] x86/hpet: Remove the unused hpet_msi_read() function Thomas Gleixner
2019-06-27 23:37 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 07/29] x86/hpet: Mark init functions __init Thomas Gleixner
2019-06-27 23:38 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 08/29] x86/hpet: Sanitize stub functions Thomas Gleixner
2019-06-27 23:39 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 09/29] x86/hpet: Move static and global variables to one place Thomas Gleixner
2019-06-27 23:39 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 10/29] x86/hpet: Shuffle code around for readability sake Thomas Gleixner
2019-06-27 23:40 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 11/29] x86/hpet: Separate counter check out of clocksource register code Thomas Gleixner
2019-06-27 23:41 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 12/29] x86/hpet: Simplify counter validation Thomas Gleixner
2019-06-27 23:41 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 13/29] x86/hpet: Decapitalize and rename EVT_TO_HPET_DEV Thomas Gleixner
2019-06-27 23:42 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 14/29] x86/hpet: Remove not required includes Thomas Gleixner
2019-06-27 23:43 ` [tip:x86/timers] " tip-bot for Ingo Molnar
2019-06-23 13:23 ` [patch 15/29] x86/hpet: Make naming consistent Thomas Gleixner
2019-06-27 23:44 ` [tip:x86/timers] " tip-bot for Ingo Molnar
2019-06-23 13:23 ` [patch 16/29] x86/hpet: Clean up comments Thomas Gleixner
2019-06-27 23:44 ` [tip:x86/timers] " tip-bot for Ingo Molnar
2019-06-23 13:23 ` [patch 17/29] x86/hpet: Coding style cleanup Thomas Gleixner
2019-06-27 23:45 ` [tip:x86/timers] " tip-bot for Ingo Molnar
2019-06-23 13:23 ` [patch 18/29] x86/hpet: Introduce struct hpet_base and struct hpet_channel Thomas Gleixner
2019-06-27 23:46 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:23 ` [patch 19/29] x86/hpet: Use cached channel data Thomas Gleixner
2019-06-27 23:46 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 20/29] x86/hpet: Add mode information to struct hpet_channel Thomas Gleixner
2019-06-27 23:47 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 21/29] x86/hpet: Add function to select a /dev/hpet channel Thomas Gleixner
2019-06-27 23:48 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 22/29] x86/hpet: Rename variables to prepare for switching to channels Thomas Gleixner
2019-06-27 23:49 ` [tip:x86/timers] " tip-bot for Ingo Molnar
2019-06-23 13:24 ` [patch 23/29] x86/hpet: Move clockevents into channels Thomas Gleixner
2019-06-27 23:49 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 24/29] x86/hpet: Use cached info instead of extra flags Thomas Gleixner
2019-06-26 21:20 ` Ingo Molnar
2019-06-27 23:50 ` tip-bot for Thomas Gleixner [this message]
2019-06-23 13:24 ` [patch 25/29] x86/hpet: Wrap legacy clockevent in hpet_channel Thomas Gleixner
2019-06-27 23:51 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 26/29] x86/hpet: Consolidate clockevent functions Thomas Gleixner
2019-06-26 21:17 ` Ingo Molnar
2019-06-27 22:44 ` Thomas Gleixner
2019-06-27 22:53 ` Thomas Gleixner
2019-06-28 8:32 ` Ingo Molnar
2019-06-27 23:51 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 27/29] x86/hpet: Carve out shareable parts of init_one_hpet_msi_clockevent() Thomas Gleixner
2019-06-27 23:52 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 28/29] x86/hpet: Use common init for legacy clockevent Thomas Gleixner
2019-06-26 21:13 ` Ingo Molnar
2019-06-27 23:53 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-23 13:24 ` [patch 29/29] x86/hpet: Use channel for legacy clockevent storage Thomas Gleixner
2019-06-27 23:53 ` [tip:x86/timers] " tip-bot for Thomas Gleixner
2019-06-26 21:22 ` [patch 00/29] x86/hpet: Cleanup the channel management Ingo Molnar
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=tip-45e0a415634600e608188480bc355b20344f9e3f@git.kernel.org \
--to=tipbot@zytor.com \
--cc=Suravee.Suthikulpanit@amd.com \
--cc=andi.kleen@intel.com \
--cc=ashok.raj@intel.com \
--cc=eranian@google.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=ravi.v.shankar@intel.com \
--cc=ricardo.neri-calderon@linux.intel.com \
--cc=tglx@linutronix.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.