x86: refactor psr: CDP: implement get hw info flow.
authorYi Sun <yi.y.sun@linux.intel.com>
Tue, 1 Aug 2017 09:04:00 +0000 (11:04 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 3 Aug 2017 10:36:04 +0000 (12:36 +0200)
This patch implements get HW info flow for CDP including L3 CDP callback
function. The flow is almost same as L3 CAT.

With this patch, 'psr-hwinfo' can work for L3 CDP.

Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/psr.c

index 0dccb9253469ceb68488086d58730f26ef56fb2a..b86271c5ccb09a44888ab3cacf0e8f3afcb6625c 100644 (file)
@@ -222,7 +222,21 @@ static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
     {
     case PSR_CBM_TYPE_L3:
         feat_type = FEAT_TYPE_L3_CAT;
+
+        /*
+         * If type is L3 CAT but we cannot find it in feat_props array,
+         * try CDP.
+         */
+        if ( !feat_props[feat_type] )
+            feat_type = FEAT_TYPE_L3_CDP;
+
+        break;
+
+    case PSR_CBM_TYPE_L3_DATA:
+    case PSR_CBM_TYPE_L3_CODE:
+        feat_type = FEAT_TYPE_L3_CDP;
         break;
+
     default:
         ASSERT_UNREACHABLE();
     }
@@ -350,7 +364,12 @@ static const struct feat_props l3_cat_props = {
 static bool l3_cdp_get_feat_info(const struct feat_node *feat,
                                  uint32_t data[], uint32_t array_len)
 {
-    return false;
+    if ( !cat_get_feat_info(feat, data, array_len) )
+        return false;
+
+    data[PSR_INFO_IDX_CAT_FLAG] |= XEN_SYSCTL_PSR_CAT_L3_CDP;
+
+    return true;
 }
 
 static void l3_cdp_write_msr(unsigned int cos, uint32_t val, enum cbm_type type)