All of lore.kernel.org
 help / color / mirror / Atom feed
From: <vijayak@caviumnetworks.com>
To: Ian.Campbell@citrix.com, julien.grall@citrix.com,
	stefano.stabellini@eu.citrix.com, stefano.stabellini@citrix.com,
	tim@xen.org, xen-devel@lists.xen.org
Cc: Keir Fraser <keir@xen.org>,
	Ian Campbell <ian.campbell@citrix.com>,
	vijay.kilari@gmail.com, Prasun.Kapoor@caviumnetworks.com,
	manish.jaggi@caviumnetworks.com,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	Vijaya Kumar K <Vijaya.Kumar@caviumnetworks.com>
Subject: [PATCH v8 02/28] xen: Add log2 functionality
Date: Mon, 1 Feb 2016 14:56:12 +0530	[thread overview]
Message-ID: <1454318798-31913-3-git-send-email-vijayak@caviumnetworks.com> (raw)
In-Reply-To: <1454318798-31913-1-git-send-email-vijayak@caviumnetworks.com>

From: Vijaya Kumar K <Vijaya.Kumar@caviumnetworks.com>

log2 helper apis are ported from linux from
commit 13c07b0286d340275f2d97adf085cecda37ede37
(linux/log2.h: Fix rounddown_pow_of_two(1))
Changes made for xen are:
  - Only required functionality is retained
  - Replace fls_long with flsl

Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@caviumnetworks.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
CC: Ian Campbell <ian.campbell@citrix.com>
CC: Ian Jackson <ian.jackson@eu.citrix.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Keir Fraser <keir@xen.org>
CC: Tim Deegan <tim@xen.org>
---
v4: - Only retained required functionality
    - Replaced fls_long with flsl
    - Removed fls_long implementation in bitops.h in v3 version
---
 xen/include/xen/log2.h |  167 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 167 insertions(+)

diff --git a/xen/include/xen/log2.h b/xen/include/xen/log2.h
new file mode 100644
index 0000000..86bd861
--- /dev/null
+++ b/xen/include/xen/log2.h
@@ -0,0 +1,167 @@
+/* 
+ * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#ifndef _XEN_LOG2_H
+#define _XEN_LOG2_H
+
+#include <xen/types.h>
+#include <xen/bitops.h>
+
+/*
+ * deal with unrepresentable constant logarithms
+ */
+extern __attribute__((const))
+int ____ilog2_NaN(void);
+
+/*
+ * non-constant log of base 2 calculators
+ * - the arch may override these in asm/bitops.h if they can be implemented
+ *   more efficiently than using fls() and fls64()
+ * - the arch is not required to handle n==0 if implementing the fallback
+ */
+static inline __attribute__((const))
+int __ilog2_u32(u32 n)
+{
+	return fls(n) - 1;
+}
+
+static inline __attribute__((const))
+int __ilog2_u64(u64 n)
+{
+	return flsl(n) - 1;
+}
+
+/*
+ * round up to nearest power of two
+ */
+static inline __attribute__((const))
+unsigned long __roundup_pow_of_two(unsigned long n)
+{
+	return 1UL << flsl(n - 1);
+}
+
+/**
+ * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
+ * @n - parameter
+ *
+ * constant-capable log of base 2 calculation
+ * - this can be used to initialise global variables from constant data, hence
+ *   the massive ternary operator construction
+ *
+ * selects the appropriately-sized optimised version depending on sizeof(n)
+ */
+#define ilog2(n)				\
+(						\
+	__builtin_constant_p(n) ? (		\
+		(n) < 1 ? ____ilog2_NaN() :	\
+		(n) & (1ULL << 63) ? 63 :	\
+		(n) & (1ULL << 62) ? 62 :	\
+		(n) & (1ULL << 61) ? 61 :	\
+		(n) & (1ULL << 60) ? 60 :	\
+		(n) & (1ULL << 59) ? 59 :	\
+		(n) & (1ULL << 58) ? 58 :	\
+		(n) & (1ULL << 57) ? 57 :	\
+		(n) & (1ULL << 56) ? 56 :	\
+		(n) & (1ULL << 55) ? 55 :	\
+		(n) & (1ULL << 54) ? 54 :	\
+		(n) & (1ULL << 53) ? 53 :	\
+		(n) & (1ULL << 52) ? 52 :	\
+		(n) & (1ULL << 51) ? 51 :	\
+		(n) & (1ULL << 50) ? 50 :	\
+		(n) & (1ULL << 49) ? 49 :	\
+		(n) & (1ULL << 48) ? 48 :	\
+		(n) & (1ULL << 47) ? 47 :	\
+		(n) & (1ULL << 46) ? 46 :	\
+		(n) & (1ULL << 45) ? 45 :	\
+		(n) & (1ULL << 44) ? 44 :	\
+		(n) & (1ULL << 43) ? 43 :	\
+		(n) & (1ULL << 42) ? 42 :	\
+		(n) & (1ULL << 41) ? 41 :	\
+		(n) & (1ULL << 40) ? 40 :	\
+		(n) & (1ULL << 39) ? 39 :	\
+		(n) & (1ULL << 38) ? 38 :	\
+		(n) & (1ULL << 37) ? 37 :	\
+		(n) & (1ULL << 36) ? 36 :	\
+		(n) & (1ULL << 35) ? 35 :	\
+		(n) & (1ULL << 34) ? 34 :	\
+		(n) & (1ULL << 33) ? 33 :	\
+		(n) & (1ULL << 32) ? 32 :	\
+		(n) & (1ULL << 31) ? 31 :	\
+		(n) & (1ULL << 30) ? 30 :	\
+		(n) & (1ULL << 29) ? 29 :	\
+		(n) & (1ULL << 28) ? 28 :	\
+		(n) & (1ULL << 27) ? 27 :	\
+		(n) & (1ULL << 26) ? 26 :	\
+		(n) & (1ULL << 25) ? 25 :	\
+		(n) & (1ULL << 24) ? 24 :	\
+		(n) & (1ULL << 23) ? 23 :	\
+		(n) & (1ULL << 22) ? 22 :	\
+		(n) & (1ULL << 21) ? 21 :	\
+		(n) & (1ULL << 20) ? 20 :	\
+		(n) & (1ULL << 19) ? 19 :	\
+		(n) & (1ULL << 18) ? 18 :	\
+		(n) & (1ULL << 17) ? 17 :	\
+		(n) & (1ULL << 16) ? 16 :	\
+		(n) & (1ULL << 15) ? 15 :	\
+		(n) & (1ULL << 14) ? 14 :	\
+		(n) & (1ULL << 13) ? 13 :	\
+		(n) & (1ULL << 12) ? 12 :	\
+		(n) & (1ULL << 11) ? 11 :	\
+		(n) & (1ULL << 10) ? 10 :	\
+		(n) & (1ULL <<  9) ?  9 :	\
+		(n) & (1ULL <<  8) ?  8 :	\
+		(n) & (1ULL <<  7) ?  7 :	\
+		(n) & (1ULL <<  6) ?  6 :	\
+		(n) & (1ULL <<  5) ?  5 :	\
+		(n) & (1ULL <<  4) ?  4 :	\
+		(n) & (1ULL <<  3) ?  3 :	\
+		(n) & (1ULL <<  2) ?  2 :	\
+		(n) & (1ULL <<  1) ?  1 :	\
+		(n) & (1ULL <<  0) ?  0 :	\
+		____ilog2_NaN()			\
+				   ) :		\
+	(sizeof(n) <= 4) ?			\
+	__ilog2_u32(n) :			\
+	__ilog2_u64(n)				\
+ )
+
+/**
+ * roundup_pow_of_two - round the given value up to nearest power of two
+ * @n - parameter
+ *
+ * round the given value up to the nearest power of two
+ * - the result is undefined when n == 0
+ * - this can be used to initialise global variables from constant data
+ */
+#define roundup_pow_of_two(n)			\
+(						\
+	__builtin_constant_p(n) ? (		\
+		(n == 1) ? 1 :			\
+		(1UL << (ilog2((n) - 1) + 1))	\
+				   ) :		\
+	__roundup_pow_of_two(n)			\
+ )
+
+/**
+ * order_base_2 - calculate the (rounded up) base 2 order of the argument
+ * @n: parameter
+ *
+ * The first few values calculated by this routine:
+ *  ob2(0) = 0
+ *  ob2(1) = 0
+ *  ob2(2) = 1
+ *  ob2(3) = 2
+ *  ob2(4) = 2
+ *  ob2(5) = 3
+ *  ... and so on.
+ */
+
+#define order_base_2(n) ilog2(roundup_pow_of_two(n))
+#endif /* _XEN_LOG2_H */
-- 
1.7.9.5

  parent reply	other threads:[~2016-02-01  9:26 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-01  9:26 [PATCH v8 00/28] Add ITS support vijayak
2016-02-01  9:26 ` [PATCH v8 01/28] xen/arm: Add bitmap_find_next_zero_area helper function vijayak
2016-02-01  9:26 ` vijayak [this message]
2016-02-01  9:26 ` [PATCH v8 03/28] xen/arm: Set nr_cpu_ids to available number of cpus vijayak
2016-02-01  9:26 ` [PATCH v8 04/28] xen/arm: Rename NR_IRQs and vgic_num_irqs helper function vijayak
2016-02-01  9:26 ` [PATCH v8 05/28] xen/arm: ITS: Port ITS driver to Xen vijayak
2016-02-01  9:26 ` [PATCH v8 06/28] xen/arm: ITS: Add helper functions to manage its_devices vijayak
2016-02-01  9:26 ` [PATCH v8 07/28] xen/arm: ITS: Introduce msi_desc for LPIs vijayak
2016-02-01  9:26 ` [PATCH v8 08/28] xen/arm: ITS: Add APIs to add and assign device vijayak
2016-02-01  9:26 ` [PATCH v8 09/28] xen/arm: ITS: Introduce gic_is_lpi helper function vijayak
2016-02-01  9:26 ` [PATCH v8 10/28] xen/arm: ITS: Implement hw_irq_controller for LPIs vijayak
2016-02-01  9:26 ` [PATCH v8 11/28] xen/arm: ITS: Enable compilation of physical ITS driver vijayak
2016-02-01  9:26 ` [PATCH v8 12/28] xen/arm: ITS: Plumb hw_irq_controller for LPIs vijayak
2016-02-01  9:26 ` [PATCH v8 13/28] xen/arm: Correct GICD_TYPER register definition typos vijayak
2016-02-01  9:26 ` [PATCH v8 14/28] xen/arm: ITS: Initialize physical ITS and export lpi support vijayak
2016-02-01  9:26 ` [PATCH v8 15/28] xen/arm: ITS: Add virtual ITS driver vijayak
2016-02-01  9:26 ` [PATCH v8 16/28] xen/arm: ITS: Add virtual ITS commands support vijayak
2016-02-01  9:26 ` [PATCH v8 17/28] xen/arm: ITS: Add GITS registers emulation vijayak
2016-02-01  9:26 ` [PATCH v8 18/28] xen/arm: ITS: Export ITS info to Virtual ITS vijayak
2016-02-01  9:26 ` [PATCH v8 19/28] xen/arm: ITS: Store the number of LPIs allocated per domain vijayak
2016-02-01  9:26 ` [PATCH v8 20/28] xen/arm: ITS: Add virtual ITS availability check helper vijayak
2016-02-01  9:26 ` [PATCH v8 21/28] xen/arm: ITS: Add GICR register emulation vijayak
2016-02-01  9:26 ` [PATCH v8 22/28] xen/arm: ITS: Allocate irq descriptors for LPIs vijayak
2016-02-01  9:26 ` [PATCH v8 23/28] xen/arm: ITS: Allocate pending_lpi " vijayak
2016-02-01  9:26 ` [PATCH v8 24/28] xen/arm: ITS: Route LPIs vijayak
2016-02-01  9:26 ` [PATCH v8 25/28] xen/arm: ITS: Add domain specific ITS initialization vijayak
2016-02-01  9:26 ` [PATCH v8 26/28] xen/arm: ITS: Map ITS translation space vijayak
2016-02-01  9:26 ` [PATCH v8 27/28] xen/arm: ITS: Generate ITS node for Dom0 vijayak
2016-02-01  9:26 ` [PATCH v8 28/28] xen/arm: ITS: Add pci devices in ThunderX vijayak
2016-04-08 13:42 ` [PATCH v8 00/28] Add ITS support Steve Capper
2016-04-09 23:25   ` Stefano Stabellini

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=1454318798-31913-3-git-send-email-vijayak@caviumnetworks.com \
    --to=vijayak@caviumnetworks.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Prasun.Kapoor@caviumnetworks.com \
    --cc=Vijaya.Kumar@caviumnetworks.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=julien.grall@citrix.com \
    --cc=keir@xen.org \
    --cc=manish.jaggi@caviumnetworks.com \
    --cc=stefano.stabellini@citrix.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=tim@xen.org \
    --cc=vijay.kilari@gmail.com \
    --cc=xen-devel@lists.xen.org \
    /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.