Commit f67b467a authored by Chunyan Zhang's avatar Chunyan Zhang Committed by Greg Kroah-Hartman

coresight-etm4x: Support context-ID tracing when PID namespace is enabled

Like ETTv3, ETMv4 also needs the similar modifications to support Context
ID tracing when PID namespace is enabled.
Signed-off-by: default avatarChunyan Zhang <zhang.chunyan@linaro.org>
Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a440617e
...@@ -506,8 +506,11 @@ static ssize_t reset_store(struct device *dev, ...@@ -506,8 +506,11 @@ static ssize_t reset_store(struct device *dev,
} }
drvdata->ctxid_idx = 0x0; drvdata->ctxid_idx = 0x0;
for (i = 0; i < drvdata->numcidc; i++) for (i = 0; i < drvdata->numcidc; i++) {
drvdata->ctxid_pid[i] = 0x0; drvdata->ctxid_pid[i] = 0x0;
drvdata->ctxid_vpid[i] = 0x0;
}
drvdata->ctxid_mask0 = 0x0; drvdata->ctxid_mask0 = 0x0;
drvdata->ctxid_mask1 = 0x0; drvdata->ctxid_mask1 = 0x0;
...@@ -1825,7 +1828,7 @@ static ssize_t ctxid_pid_show(struct device *dev, ...@@ -1825,7 +1828,7 @@ static ssize_t ctxid_pid_show(struct device *dev,
spin_lock(&drvdata->spinlock); spin_lock(&drvdata->spinlock);
idx = drvdata->ctxid_idx; idx = drvdata->ctxid_idx;
val = (unsigned long)drvdata->ctxid_pid[idx]; val = (unsigned long)drvdata->ctxid_vpid[idx];
spin_unlock(&drvdata->spinlock); spin_unlock(&drvdata->spinlock);
return scnprintf(buf, PAGE_SIZE, "%#lx\n", val); return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
} }
...@@ -1835,7 +1838,7 @@ static ssize_t ctxid_pid_store(struct device *dev, ...@@ -1835,7 +1838,7 @@ static ssize_t ctxid_pid_store(struct device *dev,
const char *buf, size_t size) const char *buf, size_t size)
{ {
u8 idx; u8 idx;
unsigned long val; unsigned long vpid, pid;
struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent); struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
/* /*
...@@ -1845,12 +1848,15 @@ static ssize_t ctxid_pid_store(struct device *dev, ...@@ -1845,12 +1848,15 @@ static ssize_t ctxid_pid_store(struct device *dev,
*/ */
if (!drvdata->ctxid_size || !drvdata->numcidc) if (!drvdata->ctxid_size || !drvdata->numcidc)
return -EINVAL; return -EINVAL;
if (kstrtoul(buf, 16, &val)) if (kstrtoul(buf, 16, &vpid))
return -EINVAL; return -EINVAL;
pid = coresight_vpid_to_pid(vpid);
spin_lock(&drvdata->spinlock); spin_lock(&drvdata->spinlock);
idx = drvdata->ctxid_idx; idx = drvdata->ctxid_idx;
drvdata->ctxid_pid[idx] = (u64)val; drvdata->ctxid_pid[idx] = (u64)pid;
drvdata->ctxid_vpid[idx] = (u64)vpid;
spin_unlock(&drvdata->spinlock); spin_unlock(&drvdata->spinlock);
return size; return size;
} }
...@@ -2513,8 +2519,11 @@ static void etm4_init_default_data(struct etmv4_drvdata *drvdata) ...@@ -2513,8 +2519,11 @@ static void etm4_init_default_data(struct etmv4_drvdata *drvdata)
drvdata->addr_type[1] = ETM_ADDR_TYPE_RANGE; drvdata->addr_type[1] = ETM_ADDR_TYPE_RANGE;
} }
for (i = 0; i < drvdata->numcidc; i++) for (i = 0; i < drvdata->numcidc; i++) {
drvdata->ctxid_pid[i] = 0x0; drvdata->ctxid_pid[i] = 0x0;
drvdata->ctxid_vpid[i] = 0x0;
}
drvdata->ctxid_mask0 = 0x0; drvdata->ctxid_mask0 = 0x0;
drvdata->ctxid_mask1 = 0x0; drvdata->ctxid_mask1 = 0x0;
......
...@@ -266,6 +266,8 @@ ...@@ -266,6 +266,8 @@
* @ctxid_idx: Context ID index selector. * @ctxid_idx: Context ID index selector.
* @ctxid_size: Size of the context ID field to consider. * @ctxid_size: Size of the context ID field to consider.
* @ctxid_pid: Value of the context ID comparator. * @ctxid_pid: Value of the context ID comparator.
* @ctxid_vpid: Virtual PID seen by users if PID namespace is enabled, otherwise
* the same value of ctxid_pid.
* @ctxid_mask0:Context ID comparator mask for comparator 0-3. * @ctxid_mask0:Context ID comparator mask for comparator 0-3.
* @ctxid_mask1:Context ID comparator mask for comparator 4-7. * @ctxid_mask1:Context ID comparator mask for comparator 4-7.
* @vmid_idx: VM ID index selector. * @vmid_idx: VM ID index selector.
...@@ -353,6 +355,7 @@ struct etmv4_drvdata { ...@@ -353,6 +355,7 @@ struct etmv4_drvdata {
u8 ctxid_idx; u8 ctxid_idx;
u8 ctxid_size; u8 ctxid_size;
u64 ctxid_pid[ETMv4_MAX_CTXID_CMP]; u64 ctxid_pid[ETMv4_MAX_CTXID_CMP];
u64 ctxid_vpid[ETMv4_MAX_CTXID_CMP];
u32 ctxid_mask0; u32 ctxid_mask0;
u32 ctxid_mask1; u32 ctxid_mask1;
u8 vmid_idx; u8 vmid_idx;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment