From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Subject: [PATCH 5/8] ARM: etm: Configure data tracing Date: Mon, 14 Feb 2011 22:11:13 -0800 Message-ID: <1297750276-12475-5-git-send-email-arve@android.com> References: <1296701663-12168-1-git-send-email-arve@android.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1296701663-12168-1-git-send-email-arve@android.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: linux-arm-kernel@lists.infradead.org Cc: Russell King , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Alexander Shishkin , =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Jason Wessel , linux-omap@vger.kernel.org List-Id: linux-omap@vger.kernel.org VGhlIG9sZCBjb2RlIGVuYWJsZWQgZGF0YSB0cmFjaW5nLCBidXQgZGlkIG5vdCBjb25maWd1cmUg dGhlCnJhbmdlLiBXZSBub3cgY29uZmlndXJlIGl0IHRvIHRyYWNlIGFsbCBkYXRhIGFkZHJlc3Nl cyBieSBkZWZhdWx0LAphbmQgYWRkIGEgdHJhY2VfZGF0YV9yYW5nZSBhdHRyaWJ1dGUgdG8gY2hh bmdlIHRoZSByYW5nZSBvciBkaXNhYmxlCmRhdGEgdHJhY2luZy4KClNpZ25lZC1vZmYtYnk6IEFy dmUgSGrDuG5uZXbDpWcgPGFydmVAYW5kcm9pZC5jb20+Ci0tLQogYXJjaC9hcm0vaW5jbHVkZS9h c20vaGFyZHdhcmUvY29yZXNpZ2h0LmggfCAgIDEwICsrKy0KIGFyY2gvYXJtL2tlcm5lbC9ldG0u YyAgICAgICAgICAgICAgICAgICAgIHwgICA3NyArKysrKysrKysrKysrKysrKysrKysrKysrKyst CiAyIGZpbGVzIGNoYW5nZWQsIDgzIGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY29yZXNpZ2h0LmggYi9hcmNo L2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jb3Jlc2lnaHQuaAppbmRleCA3ZWNkNzkzLi42ZWE1 MDdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jb3Jlc2lnaHQu aAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jb3Jlc2lnaHQuaApAQCAtMTcs OSArMTcsMTEgQEAKICNkZWZpbmUgVFJBQ0VSX0FDQ0VTU0VEX0JJVAkwCiAjZGVmaW5lIFRSQUNF Ul9SVU5OSU5HX0JJVAkxCiAjZGVmaW5lIFRSQUNFUl9DWUNMRV9BQ0NfQklUCTIKKyNkZWZpbmUg VFJBQ0VSX1RSQUNFX0RBVEFfQklUCTMKICNkZWZpbmUgVFJBQ0VSX0FDQ0VTU0VECQlCSVQoVFJB Q0VSX0FDQ0VTU0VEX0JJVCkKICNkZWZpbmUgVFJBQ0VSX1JVTk5JTkcJCUJJVChUUkFDRVJfUlVO TklOR19CSVQpCiAjZGVmaW5lIFRSQUNFUl9DWUNMRV9BQ0MJQklUKFRSQUNFUl9DWUNMRV9BQ0Nf QklUKQorI2RlZmluZSBUUkFDRVJfVFJBQ0VfREFUQQlCSVQoVFJBQ0VSX1RSQUNFX0RBVEFfQklU KQogCiAjZGVmaW5lIFRSQUNFUl9USU1FT1VUIDEwMDAwCiAKQEAgLTExMyw4ICsxMTUsMTQgQEAK ICNkZWZpbmUgRVRNUl9UUkFDRUVOQ1RSTAkweDI0CiAjZGVmaW5lIEVUTVRFX0lOQ0xFWENMCQlC SVQoMjQpCiAjZGVmaW5lIEVUTVJfVFJBQ0VFTkVWVAkJMHgyMAorCisjZGVmaW5lIEVUTVJfVklF V0RBVEFFVlQJMHgzMAorI2RlZmluZSBFVE1SX1ZJRVdEQVRBQ1RSTDEJMHgzNAorI2RlZmluZSBF VE1SX1ZJRVdEQVRBQ1RSTDIJMHgzOAorI2RlZmluZSBFVE1SX1ZJRVdEQVRBQ1RSTDMJMHgzYwor I2RlZmluZSBFVE1WREMzX0VYQ0xPTkxZCUJJVCgxNikKKwogI2RlZmluZSBFVE1DVFJMX09QVFMJ CShFVE1DVFJMX0RPX0NQUlQgfCBcCi0JCQkJRVRNQ1RSTF9EQVRBX0RPX0FERFIgfCBcCiAJCQkJ RVRNQ1RSTF9CUkFOQ0hfT1VUUFVUIHwgXAogCQkJCUVUTUNUUkxfRE9fQ09OVEVYVElEKQogCmRp ZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZXRtLmMgYi9hcmNoL2FybS9rZXJuZWwvZXRtLmMK aW5kZXggOGExYzQyMi4uOTZiMWFiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2V0bS5j CisrKyBiL2FyY2gvYXJtL2tlcm5lbC9ldG0uYwpAQCAtNDIsNiArNDIsOCBAQCBzdHJ1Y3QgdHJh Y2VjdHggewogCWludAkJZXRtX3BvcnRzejsKIAl1bnNpZ25lZCBsb25nCXJhbmdlX3N0YXJ0Owog CXVuc2lnbmVkIGxvbmcJcmFuZ2VfZW5kOworCXVuc2lnbmVkIGxvbmcJZGF0YV9yYW5nZV9zdGFy dDsKKwl1bnNpZ25lZCBsb25nCWRhdGFfcmFuZ2VfZW5kOwogCXN0cnVjdCBkZXZpY2UJKmRldjsK IAlzdHJ1Y3QgY2xrCSplbXVfY2xrOwogCXN0cnVjdCBtdXRleAltdXRleDsKQEAgLTgzLDggKzg1 LDE1IEBAIHN0YXRpYyBpbnQgZXRtX3NldHVwX2FkZHJlc3NfcmFuZ2Uoc3RydWN0IHRyYWNlY3R4 ICp0LCBpbnQgbiwKIAlldG1fd3JpdGVsKHQsIGZsYWdzLCBFVE1SX0NPTVBfQUNDX1RZUEUobiAq IDIgKyAxKSk7CiAJZXRtX3dyaXRlbCh0LCBlbmQsIEVUTVJfQ09NUF9WQUwobiAqIDIgKyAxKSk7 CiAKLQlmbGFncyA9IGV4Y2x1ZGUgPyBFVE1URV9JTkNMRVhDTCA6IDA7Ci0JZXRtX3dyaXRlbCh0 LCBmbGFncyB8ICgxIDw8IG4pLCBFVE1SX1RSQUNFRU5DVFJMKTsKKwlpZiAoZGF0YSkgeworCQlm bGFncyA9IGV4Y2x1ZGUgPyBFVE1WREMzX0VYQ0xPTkxZIDogMDsKKwkJaWYgKGV4Y2x1ZGUpCisJ CQluICs9IDg7CisJCWV0bV93cml0ZWwodCwgZmxhZ3MgfCBCSVQobiksIEVUTVJfVklFV0RBVEFD VFJMMyk7CisJfSBlbHNlIHsKKwkJZmxhZ3MgPSBleGNsdWRlID8gRVRNVEVfSU5DTEVYQ0wgOiAw OworCQlldG1fd3JpdGVsKHQsIGZsYWdzIHwgKDEgPDwgbiksIEVUTVJfVFJBQ0VFTkNUUkwpOwor CX0KIAogCXJldHVybiAwOwogfQpAQCAtMTA4LDYgKzExNyw5IEBAIHN0YXRpYyBpbnQgdHJhY2Vf c3RhcnQoc3RydWN0IHRyYWNlY3R4ICp0KQogCWlmICh0LT5mbGFncyAmIFRSQUNFUl9DWUNMRV9B Q0MpCiAJCXYgfD0gRVRNQ1RSTF9DWUNMRUFDQ1VSQVRFOwogCisJaWYgKHQtPmZsYWdzICYgVFJB Q0VSX1RSQUNFX0RBVEEpCisJCXYgfD0gRVRNQ1RSTF9EQVRBX0RPX0FERFI7CisKIAlldG1fdW5s b2NrKHQpOwogCiAJZXRtX3dyaXRlbCh0LCB2LCBFVE1SX0NUUkwpOwpAQCAtMTMwLDYgKzE0Miwx NyBAQCBzdGF0aWMgaW50IHRyYWNlX3N0YXJ0KHN0cnVjdCB0cmFjZWN0eCAqdCkKIAlldG1fd3Jp dGVsKHQsIDAsIEVUTVJfVFJBQ0VTU0NUUkwpOwogCWV0bV93cml0ZWwodCwgMHg2ZiwgRVRNUl9U UkFDRUVORVZUKTsKIAorCWV0bV93cml0ZWwodCwgMCwgRVRNUl9WSUVXREFUQUNUUkwxKTsKKwll dG1fd3JpdGVsKHQsIDAsIEVUTVJfVklFV0RBVEFDVFJMMik7CisKKwlpZiAodC0+ZGF0YV9yYW5n ZV9zdGFydCB8fCB0LT5kYXRhX3JhbmdlX2VuZCkKKwkJZXRtX3NldHVwX2FkZHJlc3NfcmFuZ2Uo dCwgMiwgdC0+ZGF0YV9yYW5nZV9zdGFydCwKKwkJCQkJdC0+ZGF0YV9yYW5nZV9lbmQsIDAsIDEp OworCWVsc2UKKwkJZXRtX3dyaXRlbCh0LCBFVE1WREMzX0VYQ0xPTkxZLCBFVE1SX1ZJRVdEQVRB Q1RSTDMpOworCisJZXRtX3dyaXRlbCh0LCAweDZmLCBFVE1SX1ZJRVdEQVRBRVZUKTsKKwogCXYg Jj0gfkVUTUNUUkxfUFJPR1JBTTsKIAl2IHw9IEVUTUNUUkxfUE9SVFNFTDsKIApAQCAtNTYzLDYg KzU4Niw0OCBAQCBzdGF0aWMgc3NpemVfdCB0cmFjZV9yYW5nZV9zdG9yZShzdHJ1Y3Qga29iamVj dCAqa29iaiwKIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgdHJhY2VfcmFuZ2VfYXR0ciA9 CiAJX19BVFRSKHRyYWNlX3JhbmdlLCAwNjQ0LCB0cmFjZV9yYW5nZV9zaG93LCB0cmFjZV9yYW5n ZV9zdG9yZSk7CiAKK3N0YXRpYyBzc2l6ZV90IHRyYWNlX2RhdGFfcmFuZ2Vfc2hvdyhzdHJ1Y3Qg a29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkg IGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIHJhbmdlX3N0YXJ0OworCXU2NCByYW5nZV9l bmQ7CisJbXV0ZXhfbG9jaygmdHJhY2VyLm11dGV4KTsKKwlyYW5nZV9zdGFydCA9IHRyYWNlci5k YXRhX3JhbmdlX3N0YXJ0OworCXJhbmdlX2VuZCA9IHRyYWNlci5kYXRhX3JhbmdlX2VuZDsKKwlp ZiAoIXJhbmdlX2VuZCAmJiAodHJhY2VyLmZsYWdzICYgVFJBQ0VSX1RSQUNFX0RBVEEpKQorCQly YW5nZV9lbmQgPSAweDEwMDAwMDAwMFVMTDsKKwltdXRleF91bmxvY2soJnRyYWNlci5tdXRleCk7 CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJTA4bHggJTA4bGx4XG4iLCByYW5nZV9zdGFydCwgcmFu Z2VfZW5kKTsKK30KKworc3RhdGljIHNzaXplX3QgdHJhY2VfZGF0YV9yYW5nZV9zdG9yZShzdHJ1 Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJ CQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKK3sKKwl1bnNpZ25lZCBsb25nIHJhbmdl X3N0YXJ0OworCXU2NCByYW5nZV9lbmQ7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVseCAlbGx4Iiwg JnJhbmdlX3N0YXJ0LCAmcmFuZ2VfZW5kKSAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11 dGV4X2xvY2soJnRyYWNlci5tdXRleCk7CisJdHJhY2VyLmRhdGFfcmFuZ2Vfc3RhcnQgPSByYW5n ZV9zdGFydDsKKwl0cmFjZXIuZGF0YV9yYW5nZV9lbmQgPSAodW5zaWduZWQgbG9uZylyYW5nZV9l bmQ7CisJaWYgKHJhbmdlX2VuZCkKKwkJdHJhY2VyLmZsYWdzIHw9IFRSQUNFUl9UUkFDRV9EQVRB OworCWVsc2UKKwkJdHJhY2VyLmZsYWdzICY9IH5UUkFDRVJfVFJBQ0VfREFUQTsKKwltdXRleF91 bmxvY2soJnRyYWNlci5tdXRleCk7CisKKwlyZXR1cm4gbjsKK30KKworCitzdGF0aWMgc3RydWN0 IGtvYmpfYXR0cmlidXRlIHRyYWNlX2RhdGFfcmFuZ2VfYXR0ciA9CisJX19BVFRSKHRyYWNlX2Rh dGFfcmFuZ2UsIDA2NDQsCisJCXRyYWNlX2RhdGFfcmFuZ2Vfc2hvdywgdHJhY2VfZGF0YV9yYW5n ZV9zdG9yZSk7CisKIHN0YXRpYyBpbnQgX19pbml0IGV0bV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZp Y2UgKmRldiwgc3RydWN0IGFtYmFfaWQgKmlkKQogewogCXN0cnVjdCB0cmFjZWN0eCAqdCA9ICZ0 cmFjZXI7CkBAIC01ODgsNyArNjUzLDcgQEAgc3RhdGljIGludCBfX2luaXQgZXRtX3Byb2JlKHN0 cnVjdCBhbWJhX2RldmljZSAqZGV2LCBzdHJ1Y3QgYW1iYV9pZCAqaWQpCiAKIAltdXRleF9pbml0 KCZ0LT5tdXRleCk7CiAJdC0+ZGV2ID0gJmRldi0+ZGV2OwotCXQtPmZsYWdzID0gVFJBQ0VSX0NZ Q0xFX0FDQzsKKwl0LT5mbGFncyA9IFRSQUNFUl9DWUNMRV9BQ0MgfCBUUkFDRVJfVFJBQ0VfREFU QTsKIAl0LT5ldG1fcG9ydHN6ID0gMTsKIAogCWV0bV91bmxvY2sodCk7CkBAIC02MTgsNiArNjgz LDExIEBAIHN0YXRpYyBpbnQgX19pbml0IGV0bV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRl diwgc3RydWN0IGFtYmFfaWQgKmlkKQogCWlmIChyZXQpCiAJCWRldl9kYmcoJmRldi0+ZGV2LCAi RmFpbGVkIHRvIGNyZWF0ZSB0cmFjZV9yYW5nZSBpbiBzeXNmc1xuIik7CiAKKwlyZXQgPSBzeXNm c19jcmVhdGVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX2RhdGFfcmFuZ2VfYXR0ci5hdHRy KTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gY3JlYXRl IHRyYWNlX2RhdGFfcmFuZ2UgaW4gc3lzZnNcbiIpOworCiAJZGV2X2RiZyh0LT5kZXYsICJFVE0g QU1CQSBkcml2ZXIgaW5pdGlhbGl6ZWQuXG4iKTsKIAogb3V0OgpAQCAtNjQ4LDYgKzcxOCw3IEBA IHN0YXRpYyBpbnQgZXRtX3JlbW92ZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKIAlzeXNmc19y ZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX2luZm9fYXR0ci5hdHRyKTsKIAlzeXNm c19yZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX21vZGVfYXR0ci5hdHRyKTsKIAlz eXNmc19yZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX3JhbmdlX2F0dHIuYXR0cik7 CisJc3lzZnNfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LmtvYmosICZ0cmFjZV9kYXRhX3JhbmdlX2F0 dHIuYXR0cik7CiAKIAlyZXR1cm4gMDsKIH0KLS0gCjEuNy4zLjEKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: arve@android.com (=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=) Date: Mon, 14 Feb 2011 22:11:13 -0800 Subject: [PATCH 5/8] ARM: etm: Configure data tracing In-Reply-To: <1296701663-12168-1-git-send-email-arve@android.com> References: <1296701663-12168-1-git-send-email-arve@android.com> Message-ID: <1297750276-12475-5-git-send-email-arve@android.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org The old code enabled data tracing, but did not configure the range. We now configure it to trace all data addresses by default, and add a trace_data_range attribute to change the range or disable data tracing. Signed-off-by: Arve Hj?nnev?g --- arch/arm/include/asm/hardware/coresight.h | 10 +++- arch/arm/kernel/etm.c | 77 +++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/arch/arm/include/asm/hardware/coresight.h b/arch/arm/include/asm/hardware/coresight.h index 7ecd793..6ea507f 100644 --- a/arch/arm/include/asm/hardware/coresight.h +++ b/arch/arm/include/asm/hardware/coresight.h @@ -17,9 +17,11 @@ #define TRACER_ACCESSED_BIT 0 #define TRACER_RUNNING_BIT 1 #define TRACER_CYCLE_ACC_BIT 2 +#define TRACER_TRACE_DATA_BIT 3 #define TRACER_ACCESSED BIT(TRACER_ACCESSED_BIT) #define TRACER_RUNNING BIT(TRACER_RUNNING_BIT) #define TRACER_CYCLE_ACC BIT(TRACER_CYCLE_ACC_BIT) +#define TRACER_TRACE_DATA BIT(TRACER_TRACE_DATA_BIT) #define TRACER_TIMEOUT 10000 @@ -113,8 +115,14 @@ #define ETMR_TRACEENCTRL 0x24 #define ETMTE_INCLEXCL BIT(24) #define ETMR_TRACEENEVT 0x20 + +#define ETMR_VIEWDATAEVT 0x30 +#define ETMR_VIEWDATACTRL1 0x34 +#define ETMR_VIEWDATACTRL2 0x38 +#define ETMR_VIEWDATACTRL3 0x3c +#define ETMVDC3_EXCLONLY BIT(16) + #define ETMCTRL_OPTS (ETMCTRL_DO_CPRT | \ - ETMCTRL_DATA_DO_ADDR | \ ETMCTRL_BRANCH_OUTPUT | \ ETMCTRL_DO_CONTEXTID) diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c index 8a1c422..96b1abb 100644 --- a/arch/arm/kernel/etm.c +++ b/arch/arm/kernel/etm.c @@ -42,6 +42,8 @@ struct tracectx { int etm_portsz; unsigned long range_start; unsigned long range_end; + unsigned long data_range_start; + unsigned long data_range_end; struct device *dev; struct clk *emu_clk; struct mutex mutex; @@ -83,8 +85,15 @@ static int etm_setup_address_range(struct tracectx *t, int n, etm_writel(t, flags, ETMR_COMP_ACC_TYPE(n * 2 + 1)); etm_writel(t, end, ETMR_COMP_VAL(n * 2 + 1)); - flags = exclude ? ETMTE_INCLEXCL : 0; - etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL); + if (data) { + flags = exclude ? ETMVDC3_EXCLONLY : 0; + if (exclude) + n += 8; + etm_writel(t, flags | BIT(n), ETMR_VIEWDATACTRL3); + } else { + flags = exclude ? ETMTE_INCLEXCL : 0; + etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL); + } return 0; } @@ -108,6 +117,9 @@ static int trace_start(struct tracectx *t) if (t->flags & TRACER_CYCLE_ACC) v |= ETMCTRL_CYCLEACCURATE; + if (t->flags & TRACER_TRACE_DATA) + v |= ETMCTRL_DATA_DO_ADDR; + etm_unlock(t); etm_writel(t, v, ETMR_CTRL); @@ -130,6 +142,17 @@ static int trace_start(struct tracectx *t) etm_writel(t, 0, ETMR_TRACESSCTRL); etm_writel(t, 0x6f, ETMR_TRACEENEVT); + etm_writel(t, 0, ETMR_VIEWDATACTRL1); + etm_writel(t, 0, ETMR_VIEWDATACTRL2); + + if (t->data_range_start || t->data_range_end) + etm_setup_address_range(t, 2, t->data_range_start, + t->data_range_end, 0, 1); + else + etm_writel(t, ETMVDC3_EXCLONLY, ETMR_VIEWDATACTRL3); + + etm_writel(t, 0x6f, ETMR_VIEWDATAEVT); + v &= ~ETMCTRL_PROGRAM; v |= ETMCTRL_PORTSEL; @@ -563,6 +586,48 @@ static ssize_t trace_range_store(struct kobject *kobj, static struct kobj_attribute trace_range_attr = __ATTR(trace_range, 0644, trace_range_show, trace_range_store); +static ssize_t trace_data_range_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + unsigned long range_start; + u64 range_end; + mutex_lock(&tracer.mutex); + range_start = tracer.data_range_start; + range_end = tracer.data_range_end; + if (!range_end && (tracer.flags & TRACER_TRACE_DATA)) + range_end = 0x100000000ULL; + mutex_unlock(&tracer.mutex); + return sprintf(buf, "%08lx %08llx\n", range_start, range_end); +} + +static ssize_t trace_data_range_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t n) +{ + unsigned long range_start; + u64 range_end; + + if (sscanf(buf, "%lx %llx", &range_start, &range_end) != 2) + return -EINVAL; + + mutex_lock(&tracer.mutex); + tracer.data_range_start = range_start; + tracer.data_range_end = (unsigned long)range_end; + if (range_end) + tracer.flags |= TRACER_TRACE_DATA; + else + tracer.flags &= ~TRACER_TRACE_DATA; + mutex_unlock(&tracer.mutex); + + return n; +} + + +static struct kobj_attribute trace_data_range_attr = + __ATTR(trace_data_range, 0644, + trace_data_range_show, trace_data_range_store); + static int __init etm_probe(struct amba_device *dev, struct amba_id *id) { struct tracectx *t = &tracer; @@ -588,7 +653,7 @@ static int __init etm_probe(struct amba_device *dev, struct amba_id *id) mutex_init(&t->mutex); t->dev = &dev->dev; - t->flags = TRACER_CYCLE_ACC; + t->flags = TRACER_CYCLE_ACC | TRACER_TRACE_DATA; t->etm_portsz = 1; etm_unlock(t); @@ -618,6 +683,11 @@ static int __init etm_probe(struct amba_device *dev, struct amba_id *id) if (ret) dev_dbg(&dev->dev, "Failed to create trace_range in sysfs\n"); + ret = sysfs_create_file(&dev->dev.kobj, &trace_data_range_attr.attr); + if (ret) + dev_dbg(&dev->dev, + "Failed to create trace_data_range in sysfs\n"); + dev_dbg(t->dev, "ETM AMBA driver initialized.\n"); out: @@ -648,6 +718,7 @@ static int etm_remove(struct amba_device *dev) sysfs_remove_file(&dev->dev.kobj, &trace_info_attr.attr); sysfs_remove_file(&dev->dev.kobj, &trace_mode_attr.attr); sysfs_remove_file(&dev->dev.kobj, &trace_range_attr.attr); + sysfs_remove_file(&dev->dev.kobj, &trace_data_range_attr.attr); return 0; } -- 1.7.3.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751268Ab1BOGNI (ORCPT ); Tue, 15 Feb 2011 01:13:08 -0500 Received: from mail-pz0-f46.google.com ([209.85.210.46]:46533 "EHLO mail-pz0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753277Ab1BOGL5 (ORCPT ); Tue, 15 Feb 2011 01:11:57 -0500 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= To: linux-arm-kernel@lists.infradead.org Cc: linux-omap@vger.kernel.org, =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Russell King , Alexander Shishkin , Jason Wessel , Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: [PATCH 5/8] ARM: etm: Configure data tracing Date: Mon, 14 Feb 2011 22:11:13 -0800 Message-Id: <1297750276-12475-5-git-send-email-arve@android.com> X-Mailer: git-send-email 1.7.3.1 In-Reply-To: <1296701663-12168-1-git-send-email-arve@android.com> References: <1296701663-12168-1-git-send-email-arve@android.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The old code enabled data tracing, but did not configure the range. We now configure it to trace all data addresses by default, and add a trace_data_range attribute to change the range or disable data tracing. Signed-off-by: Arve Hjønnevåg --- arch/arm/include/asm/hardware/coresight.h | 10 +++- arch/arm/kernel/etm.c | 77 +++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/arch/arm/include/asm/hardware/coresight.h b/arch/arm/include/asm/hardware/coresight.h index 7ecd793..6ea507f 100644 --- a/arch/arm/include/asm/hardware/coresight.h +++ b/arch/arm/include/asm/hardware/coresight.h @@ -17,9 +17,11 @@ #define TRACER_ACCESSED_BIT 0 #define TRACER_RUNNING_BIT 1 #define TRACER_CYCLE_ACC_BIT 2 +#define TRACER_TRACE_DATA_BIT 3 #define TRACER_ACCESSED BIT(TRACER_ACCESSED_BIT) #define TRACER_RUNNING BIT(TRACER_RUNNING_BIT) #define TRACER_CYCLE_ACC BIT(TRACER_CYCLE_ACC_BIT) +#define TRACER_TRACE_DATA BIT(TRACER_TRACE_DATA_BIT) #define TRACER_TIMEOUT 10000 @@ -113,8 +115,14 @@ #define ETMR_TRACEENCTRL 0x24 #define ETMTE_INCLEXCL BIT(24) #define ETMR_TRACEENEVT 0x20 + +#define ETMR_VIEWDATAEVT 0x30 +#define ETMR_VIEWDATACTRL1 0x34 +#define ETMR_VIEWDATACTRL2 0x38 +#define ETMR_VIEWDATACTRL3 0x3c +#define ETMVDC3_EXCLONLY BIT(16) + #define ETMCTRL_OPTS (ETMCTRL_DO_CPRT | \ - ETMCTRL_DATA_DO_ADDR | \ ETMCTRL_BRANCH_OUTPUT | \ ETMCTRL_DO_CONTEXTID) diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c index 8a1c422..96b1abb 100644 --- a/arch/arm/kernel/etm.c +++ b/arch/arm/kernel/etm.c @@ -42,6 +42,8 @@ struct tracectx { int etm_portsz; unsigned long range_start; unsigned long range_end; + unsigned long data_range_start; + unsigned long data_range_end; struct device *dev; struct clk *emu_clk; struct mutex mutex; @@ -83,8 +85,15 @@ static int etm_setup_address_range(struct tracectx *t, int n, etm_writel(t, flags, ETMR_COMP_ACC_TYPE(n * 2 + 1)); etm_writel(t, end, ETMR_COMP_VAL(n * 2 + 1)); - flags = exclude ? ETMTE_INCLEXCL : 0; - etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL); + if (data) { + flags = exclude ? ETMVDC3_EXCLONLY : 0; + if (exclude) + n += 8; + etm_writel(t, flags | BIT(n), ETMR_VIEWDATACTRL3); + } else { + flags = exclude ? ETMTE_INCLEXCL : 0; + etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL); + } return 0; } @@ -108,6 +117,9 @@ static int trace_start(struct tracectx *t) if (t->flags & TRACER_CYCLE_ACC) v |= ETMCTRL_CYCLEACCURATE; + if (t->flags & TRACER_TRACE_DATA) + v |= ETMCTRL_DATA_DO_ADDR; + etm_unlock(t); etm_writel(t, v, ETMR_CTRL); @@ -130,6 +142,17 @@ static int trace_start(struct tracectx *t) etm_writel(t, 0, ETMR_TRACESSCTRL); etm_writel(t, 0x6f, ETMR_TRACEENEVT); + etm_writel(t, 0, ETMR_VIEWDATACTRL1); + etm_writel(t, 0, ETMR_VIEWDATACTRL2); + + if (t->data_range_start || t->data_range_end) + etm_setup_address_range(t, 2, t->data_range_start, + t->data_range_end, 0, 1); + else + etm_writel(t, ETMVDC3_EXCLONLY, ETMR_VIEWDATACTRL3); + + etm_writel(t, 0x6f, ETMR_VIEWDATAEVT); + v &= ~ETMCTRL_PROGRAM; v |= ETMCTRL_PORTSEL; @@ -563,6 +586,48 @@ static ssize_t trace_range_store(struct kobject *kobj, static struct kobj_attribute trace_range_attr = __ATTR(trace_range, 0644, trace_range_show, trace_range_store); +static ssize_t trace_data_range_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + unsigned long range_start; + u64 range_end; + mutex_lock(&tracer.mutex); + range_start = tracer.data_range_start; + range_end = tracer.data_range_end; + if (!range_end && (tracer.flags & TRACER_TRACE_DATA)) + range_end = 0x100000000ULL; + mutex_unlock(&tracer.mutex); + return sprintf(buf, "%08lx %08llx\n", range_start, range_end); +} + +static ssize_t trace_data_range_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t n) +{ + unsigned long range_start; + u64 range_end; + + if (sscanf(buf, "%lx %llx", &range_start, &range_end) != 2) + return -EINVAL; + + mutex_lock(&tracer.mutex); + tracer.data_range_start = range_start; + tracer.data_range_end = (unsigned long)range_end; + if (range_end) + tracer.flags |= TRACER_TRACE_DATA; + else + tracer.flags &= ~TRACER_TRACE_DATA; + mutex_unlock(&tracer.mutex); + + return n; +} + + +static struct kobj_attribute trace_data_range_attr = + __ATTR(trace_data_range, 0644, + trace_data_range_show, trace_data_range_store); + static int __init etm_probe(struct amba_device *dev, struct amba_id *id) { struct tracectx *t = &tracer; @@ -588,7 +653,7 @@ static int __init etm_probe(struct amba_device *dev, struct amba_id *id) mutex_init(&t->mutex); t->dev = &dev->dev; - t->flags = TRACER_CYCLE_ACC; + t->flags = TRACER_CYCLE_ACC | TRACER_TRACE_DATA; t->etm_portsz = 1; etm_unlock(t); @@ -618,6 +683,11 @@ static int __init etm_probe(struct amba_device *dev, struct amba_id *id) if (ret) dev_dbg(&dev->dev, "Failed to create trace_range in sysfs\n"); + ret = sysfs_create_file(&dev->dev.kobj, &trace_data_range_attr.attr); + if (ret) + dev_dbg(&dev->dev, + "Failed to create trace_data_range in sysfs\n"); + dev_dbg(t->dev, "ETM AMBA driver initialized.\n"); out: @@ -648,6 +718,7 @@ static int etm_remove(struct amba_device *dev) sysfs_remove_file(&dev->dev.kobj, &trace_info_attr.attr); sysfs_remove_file(&dev->dev.kobj, &trace_mode_attr.attr); sysfs_remove_file(&dev->dev.kobj, &trace_range_attr.attr); + sysfs_remove_file(&dev->dev.kobj, &trace_data_range_attr.attr); return 0; } -- 1.7.3.1