chore(lib/s2tt): move HIPAS and RIPAS fields

- Move HIPAS field to bits [5:3], corresponding to
MemAttr[3:1] of 2 block and page descriptors.
- Move RIPAS field with defined values in range
[0-3] to bits [2:1] corresponding to MemAttr[0]
and block/page descriptor select bit.
- RIPAS and DESC_TYPE fields share bit[1], bit[0]
set to 1 applies to a valid descriptor with HIPAS
and RIPAS fields N/A.

Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
Change-Id: Ib045a4586c15d854b53c787100b3043dd22f1213
diff --git a/lib/s2tt/src/s2tt.c b/lib/s2tt/src/s2tt.c
index dd611b3..6149ead 100644
--- a/lib/s2tt/src/s2tt.c
+++ b/lib/s2tt/src/s2tt.c
@@ -113,6 +113,17 @@
 }
 
 /*
+ * Returns true if @s2tte has HIPAS=@hipas.
+ */
+static inline bool s2tte_has_hipas(unsigned long s2tte, unsigned long hipas)
+{
+	bool invalid_desc = ((s2tte & S2TT_DESC_VALID_MASK) == S2TTE_INVALID);
+	unsigned long invalid_desc_hipas = s2tte & S2TTE_INVALID_HIPAS_MASK;
+
+	return (invalid_desc && (invalid_desc_hipas == hipas));
+}
+
+/*
  * Returns true if s2tte has 'output address' field, namely, if it is one of:
  * - assigned_empty
  * - assigned_ram
@@ -123,11 +134,12 @@
 static bool s2tte_has_pa(const struct s2tt_context *s2_ctx,
 			 unsigned long s2tte, long level)
 {
-	unsigned long desc_type = s2tte & S2TT_DESC_TYPE_MASK;
+	(void)s2_ctx;
+	(void)level;
+	bool valid_desc = ((s2tte & S2TT_DESC_VALID_MASK) == S2TTE_VALID);
 
-	return ((desc_type != S2TTE_INVALID) ||	/* block, page or table */
-		s2tte_is_assigned_empty(s2_ctx, s2tte, level) ||
-		s2tte_is_assigned_destroyed(s2_ctx, s2tte, level));
+	return (valid_desc ||	/* block, page or table */
+		s2tte_has_hipas(s2tte, S2TTE_INVALID_HIPAS_ASSIGNED));
 }
 
 /*
@@ -428,6 +440,8 @@
 					   unsigned long pa, long level,
 					   unsigned long s2tte_ripas)
 {
+	unsigned long tte;
+
 	assert(level >= S2TT_MIN_BLOCK_LEVEL);
 	assert(level <= S2TT_PAGE_LEVEL);
 	assert(EXTRACT(S2TTE_INVALID_RIPAS, s2tte_ripas)
@@ -435,18 +449,19 @@
 	assert(s2_ctx != NULL);
 	assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
 
-	unsigned long tte = pa_to_s2tte(pa, s2_ctx->enable_lpa2);
-	unsigned long s2tte_page, s2tte_block;
-
-	if (s2_ctx->enable_lpa2 == true) {
-		s2tte_page = S2TTE_PAGE_LPA2;
-		s2tte_block = S2TTE_BLOCK_LPA2;
-	} else {
-		s2tte_page = S2TTE_PAGE;
-		s2tte_block = S2TTE_BLOCK;
-	}
+	tte = pa_to_s2tte(pa, s2_ctx->enable_lpa2);
 
 	if (s2tte_ripas == S2TTE_INVALID_RIPAS_RAM) {
+		unsigned long s2tte_page, s2tte_block;
+
+		if (s2_ctx->enable_lpa2) {
+			s2tte_page = S2TTE_PAGE_LPA2;
+			s2tte_block = S2TTE_BLOCK_LPA2;
+		} else {
+			s2tte_page = S2TTE_PAGE;
+			s2tte_block = S2TTE_BLOCK;
+		}
+
 		if (level == S2TT_PAGE_LEVEL) {
 			return (tte | s2tte_page);
 		}
@@ -513,20 +528,18 @@
 unsigned long s2tte_create_assigned_ns(const struct s2tt_context *s2_ctx,
 				       unsigned long s2tte, long level)
 {
-	assert(s2_ctx != NULL);
-
 	/*
 	 * We just mask out the DESC_TYPE below. We assume rest of the
 	 * bits have been setup properly by the caller.
 	 */
 	unsigned long new_s2tte = s2tte & ~S2TT_DESC_TYPE_MASK;
-	bool lpa2 = s2_ctx->enable_lpa2;
 
+	assert(s2_ctx != NULL);
 	assert(level >= S2TT_MIN_BLOCK_LEVEL);
 	assert(level <= S2TT_PAGE_LEVEL);
 
 	/* The Shareability bits need to be added if FEAT_LPA2 is not enabled */
-	if (!lpa2) {
+	if (!s2_ctx->enable_lpa2) {
 		new_s2tte |= S2TTE_SH_IS;
 	}
 
@@ -604,8 +617,7 @@
 
 	assert(s2_ctx != NULL);
 
-	/* cppcheck-suppress misra-c2012-10.6 */
-	min_starting_level = (s2_ctx->enable_lpa2 == true) ?
+	min_starting_level = s2_ctx->enable_lpa2 ?
 			S2TT_MIN_STARTING_LEVEL_LPA2 : S2TT_MIN_STARTING_LEVEL;
 
 	assert(level < S2TT_PAGE_LEVEL);
@@ -616,7 +628,7 @@
 }
 
 /*
- * Returns true if s2tte has defined ripas value, namely if it is one of:
+ * Returns true if s2tte has defined RIPAS value, namely if it is one of:
  * - unassigned_empty
  * - unassigned_ram
  * - unassigned_destroyed
@@ -632,17 +644,6 @@
 }
 
 /*
- * Returns true if @s2tte has HIPAS=@hipas.
- */
-static inline bool s2tte_has_hipas(unsigned long s2tte, unsigned long hipas)
-{
-	unsigned long desc_type = s2tte & S2TT_DESC_TYPE_MASK;
-	unsigned long invalid_desc_hipas = s2tte & S2TTE_INVALID_HIPAS_MASK;
-
-	return ((desc_type == S2TTE_INVALID) && (invalid_desc_hipas == hipas));
-}
-
-/*
  * Returns true if @s2tte has HIPAS=UNASSIGNED and RIPAS=@ripas.
  */
 static inline bool s2tte_has_unassigned_ripas(unsigned long s2tte,
@@ -805,16 +806,17 @@
  */
 enum ripas s2tte_get_ripas(const struct s2tt_context *s2_ctx, unsigned long s2tte)
 {
-	unsigned long desc_ripas = s2tte & S2TTE_INVALID_RIPAS_MASK;
-	unsigned long desc_type = s2tte & S2TT_DESC_TYPE_MASK;
-
 	(void)s2_ctx;
+	unsigned long desc_ripas = s2tte & S2TTE_INVALID_RIPAS_MASK;
+	bool valid_desc = ((s2tte & S2TT_DESC_VALID_MASK) == S2TTE_VALID);
 
 	/*
 	 * If a valid S2TTE descriptor is passed, the RIPAS corresponds to
 	 * RIPAS_RAM.
 	 */
-	if (desc_type != S2TTE_INVALID) {
+	if (valid_desc) {
+		__unused unsigned long desc_type = s2tte & S2TT_DESC_TYPE_MASK;
+
 		assert((desc_type == S2TTE_L012_BLOCK) ||
 			(desc_type == S2TTE_L3_PAGE));
 		return RIPAS_RAM;
diff --git a/lib/s2tt/src/s2tt_pvt_defs.h b/lib/s2tt/src/s2tt_pvt_defs.h
index f1ba46c..9f52ecd 100644
--- a/lib/s2tt/src/s2tt_pvt_defs.h
+++ b/lib/s2tt/src/s2tt_pvt_defs.h
@@ -9,44 +9,46 @@
 /*
  * The type of stage 2 translation table entry (s2tte) is defined by:
  * 1. Table level where it resides
- * 2. DESC_TYPE field[1:0]
- * 4. HIPAS field [4:2]
- * 4. RIPAS field [6:5]
- * 5. NS field [55]
+ * 2. NS field [55]
+ * 3. HIPAS field [5:3]
+ * 4. RIPAS field [2:1]
+ * 5. DESC_TYPE field[1:0]
  *
- * ======================================================================================
- * s2tte type           level DESC_TYPE[1:0] HIPAS[4:2]    RIPAS[6:5]   NS  OA alignment
- * ======================================================================================
- * unassigned_empty     any   invalid[0]     unassigned[0] empty[0]     0   n/a
- * --------------------------------------------------------------------------------------
- * unassigned_ram       any   invalid[0]     unassigned[0] ram[1]       0   n/a
- * --------------------------------------------------------------------------------------
- * unassigned_destroyed any   invalid[0]     unassigned[0] destroyed[2] 0   n/a
- * --------------------------------------------------------------------------------------
- * assigned_empty       2,3   invalid[0]     assigned[1]   empty[0]     0   to level
- * --------------------------------------------------------------------------------------
- * assigned_ram         3     page[3]        n/a           n/a          0   to level
- *                      2     block[1]       n/a           n/a          0   to level
- * --------------------------------------------------------------------------------------
- * assigned_destroyed   any   invalid[0]     assigned[1]   destroyed[2] 0   n/a
- * ======================================================================================
- * unassigned_ns        any   invalid[0]     unassigned[0] n/a          1   n/a
- * --------------------------------------------------------------------------------------
- * assigned_ns	        3     page[3]        n/a           n/a          1   to level
- *                      2     block[1]       n/a           n/a          1   to level
- * ======================================================================================
- * table              <=2     table[3]       n/a           n/a          n/a to 4K
- * ======================================================================================
+ * RIPAS and DESC_TYPE fields share bit[1], bit[0] set to 1 applies to a valid descriptor
+ * with HIPAS and RIPAS fields N/A.
+ *
+ * ========================================================================================
+ * s2tte type           level NS[55] HIPAS[5:3]    RIPAS[2:1]   DESC_TYPE[1:0] OA alignment
+ * ========================================================================================
+ * unassigned_empty     any   0      unassigned[0] empty[0]     invalid[0]     n/a
+ * ----------------------------------------------------------------------------------------
+ * unassigned_ram       any   0      unassigned[0] ram[1]       invalid[2]     n/a
+ * ----------------------------------------------------------------------------------------
+ * unassigned_destroyed any   0      unassigned[0] destroyed[2] invalid[0]     n/a
+ * ----------------------------------------------------------------------------------------
+ * assigned_empty       2,3   0      assigned[1]   empty[0]     invalid[0]     to level
+ * ----------------------------------------------------------------------------------------
+ * assigned_ram         3     0      n/a           n/a          page[3]        to level
+ *                      2     0      n/a           n/a          block[1]       to level
+ * ----------------------------------------------------------------------------------------
+ * assigned_destroyed   any   0      assigned[1]   destroyed[2] invalid[0]     n/a
+ * ========================================================================================
+ * unassigned_ns        any   1      unassigned[0] n/a          invalid[0]     n/a
+ * ----------------------------------------------------------------------------------------
+ * assigned_ns	        3     1      n/a           n/a          page[3]        to level
+ *                      2     1      n/a           n/a          block[1]       to level
+ * ========================================================================================
+ * table              <=2     n/a    n/a           n/a          table[3]       to 4KB
+ * ========================================================================================
  */
-
-#define S2TTE_INVALID_HIPAS_SHIFT	2
+#define S2TTE_INVALID_HIPAS_SHIFT	5
 #define S2TTE_INVALID_HIPAS_WIDTH	3U
 #define S2TTE_INVALID_HIPAS_MASK	MASK(S2TTE_INVALID_HIPAS)
 
 #define S2TTE_INVALID_HIPAS_UNASSIGNED	(INPLACE(S2TTE_INVALID_HIPAS, RMI_UNASSIGNED))
 #define S2TTE_INVALID_HIPAS_ASSIGNED	(INPLACE(S2TTE_INVALID_HIPAS, RMI_ASSIGNED))
 
-#define S2TTE_INVALID_RIPAS_SHIFT	5
+#define S2TTE_INVALID_RIPAS_SHIFT	1
 #define S2TTE_INVALID_RIPAS_WIDTH	2U
 #define S2TTE_INVALID_RIPAS_MASK	MASK(S2TTE_INVALID_RIPAS)
 
@@ -62,7 +64,9 @@
  * Descriptor types
  */
 #define S2TT_DESC_TYPE_MASK		3UL
+#define S2TT_DESC_VALID_MASK		1UL
 #define S2TTE_Lx_INVALID		0UL
+#define S2TTE_Lx_VALID			1UL
 #define S2TTE_L012_BLOCK		1UL
 #define S2TTE_L012_TABLE		3UL
 #define S2TTE_L3_PAGE			3UL
@@ -139,6 +143,7 @@
 #define S2TTE_BLOCK_NS		((S2TTE_NS_ATTR_RMM) | S2TTE_L012_BLOCK)
 #define S2TTE_PAGE_NS		((S2TTE_NS_ATTR_RMM) | S2TTE_L3_PAGE)
 #define S2TTE_INVALID		S2TTE_Lx_INVALID
+#define S2TTE_VALID		S2TTE_Lx_VALID
 
 /* Maximum number of concatenated tables for the start level */
 #define S2TTE_MAX_CONCAT_TABLES		(16U)