From patchwork Fri Aug 31 13:45:18 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damien Lespiau X-Patchwork-Id: 1393391 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork1.kernel.org (Postfix) with ESMTP id 23DA33FDF5 for ; Fri, 31 Aug 2012 13:51:09 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D1DFAA0A2F for ; Fri, 31 Aug 2012 06:51:08 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-we0-f177.google.com (mail-we0-f177.google.com [74.125.82.177]) by gabe.freedesktop.org (Postfix) with ESMTP id C03439E897 for ; Fri, 31 Aug 2012 06:50:38 -0700 (PDT) Received: by weyr3 with SMTP id r3so1718027wey.36 for ; Fri, 31 Aug 2012 06:50:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:x-mailer; bh=Nt0fNI4byHTBdq9x8qJcRkmkmuiRYlE5aRJT1dQP1D0=; b=pMq6PuL42cUH7Kj/LBiZT8vIOet+YZ5RfLW8o0VIh7PVSJrYYPHTY2ewnFE6oBiW2P I28+sFjjX9cIaGoTPDzq2idjk/CNSd5Lckmq6UdK4UugVBMEWOvsZ8pbgE8cArQIBFmN trj3vv/L1T0Qr+jUwnJTGyXM19xIY6wpDeKOrBsKYAzDxBtk2Bpy0vE++LgK1K1zfDaz 24N/chTIP2LOnXkAQdSnpRPyc2Y8uKClpgEEZSsM3pEQcWFBqq1vuYUxlv9wDdMkWBDj WTqFpwag1pCfOpYdkLdkRnOeJRjlhviMakFNm8nvp3eb5Fe+z5Lj1BqRazJrYISWi5R1 A5Rg== Received: by 10.216.30.83 with SMTP id j61mr4944979wea.168.1346420729394; Fri, 31 Aug 2012 06:45:29 -0700 (PDT) Received: from localhost.localdomain ([83.217.123.106]) by mx.google.com with ESMTPS id fu8sm1025571wib.5.2012.08.31.06.45.27 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 31 Aug 2012 06:45:27 -0700 (PDT) From: Damien Lespiau To: intel-gfx@lists.freedesktop.org Date: Fri, 31 Aug 2012 14:45:18 +0100 Message-Id: <1346420719-5532-1-git-send-email-damien.lespiau@gmail.com> X-Mailer: git-send-email 1.7.11.4 Subject: [Intel-gfx] [PATCH 1/2] intel_reg_dumper: Add a single register decode mode X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org From: Damien Lespiau From time to time, one would like to decode a register value that have been captured at a certain point in time (and say printed out with a printk). intel_reg_dumper has all the knowledge to do that and this patch adds a way to ask it to decode a value. Example usage: $ ./tools/intel_reg_dumper PCH_PP_CONTROL 0xabcd0002 PCH_PP_CONTROL: 0xabcd0002 (blacklight disabled, power... v2: friendlier invocation (Chris Wilson) Signed-off-by: Damien Lespiau --- tools/intel_reg_dumper.c | 99 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 13 deletions(-) diff --git a/tools/intel_reg_dumper.c b/tools/intel_reg_dumper.c index b49d967..098affa 100644 --- a/tools/intel_reg_dumper.c +++ b/tools/intel_reg_dumper.c @@ -1911,26 +1911,33 @@ static struct reg_debug i945gm_mi_regs[] = { DEFINEREG(ECOSKPD), }; +static void +_intel_dump_reg(struct reg_debug *reg, uint32_t val) +{ + char debug[1024]; + + if (reg->debug_output != NULL) { + reg->debug_output(debug, sizeof(debug), reg->reg, val); + printf("%30.30s: 0x%08x (%s)\n", + reg->name, + (unsigned int)val, debug); + } else { + printf("%30.30s: 0x%08x\n", reg->name, + (unsigned int)val); + } +} + #define intel_dump_regs(regs) _intel_dump_regs(regs, ARRAY_SIZE(regs)) static void _intel_dump_regs(struct reg_debug *regs, int count) { - char debug[1024]; int i; for (i = 0; i < count; i++) { uint32_t val = INREG(regs[i].reg); - if (regs[i].debug_output != NULL) { - regs[i].debug_output(debug, sizeof(debug), regs[i].reg, val); - printf("%30.30s: 0x%08x (%s)\n", - regs[i].name, - (unsigned int)val, debug); - } else { - printf("%30.30s: 0x%08x\n", regs[i].name, - (unsigned int)val); - } + _intel_dump_reg(®s[i], val); } } @@ -1964,6 +1971,54 @@ static struct reg_debug gen6_rp_debug_regs[] = { DEFINEREG(GEN6_PMINTRMSK), }; +#define DECLARE_REGS(r) { .regs = r, .count = ARRAY_SIZE(r) } +static struct { + struct reg_debug *regs; + int count; +} known_registers[] = { + DECLARE_REGS(ironlake_debug_regs), + DECLARE_REGS(i945gm_mi_regs), + DECLARE_REGS(intel_debug_regs), + DECLARE_REGS(gen6_rp_debug_regs), + DECLARE_REGS(haswell_debug_regs) +}; +#undef DECLARE_REGS + +static struct reg_debug * +find_register_by_name(struct reg_debug *regs, int count, + const char *name) +{ + int i; + + for (i = 0; i < count; i++) + if (strcmp(name, regs[i].name) == 0) + return ®s[i]; + + return NULL; +} + +static void +decode_register(const char *name, uint32_t val) +{ + int i; + struct reg_debug *reg = NULL; + + for (i = 0; i < ARRAY_SIZE(known_registers); i++) { + reg = find_register_by_name(known_registers[i].regs, + known_registers[i].count, + name); + if (reg) + break; + } + + if (!reg) { + fprintf(stderr, "Unknown register: %s\n", name); + return; + } + + _intel_dump_reg(reg, val); +} + static void intel_dump_other_regs(void) { @@ -2172,6 +2227,7 @@ intel_dump_other_regs(void) static void print_usage(void) { printf("Usage: intel_reg_dumper [options] [file]\n" + " intel_reg_dumper [options] register value\n" "Options:\n" " -d id when a dump file is used, use 'id' as device id (in " "hex)\n" @@ -2181,8 +2237,9 @@ static void print_usage(void) int main(int argc, char** argv) { struct pci_device *pci_dev; - int opt; - char *file = NULL; + int opt, n_args; + char *file = NULL, *reg_name = NULL; + uint32_t reg_val; while ((opt = getopt(argc, argv, "d:h")) != -1) { switch (opt) { @@ -2197,8 +2254,24 @@ int main(int argc, char** argv) return 1; } } - if (optind < argc) + + n_args = argc - optind; + if (n_args == 1) { file = argv[optind]; + } else if (n_args == 2) { + reg_name = argv[optind]; + reg_val = strtoul(argv[optind + 1], NULL, 0); + } else if (n_args) { + print_usage(); + return 1; + } + + /* the tool operates in "single" mode, decode a single register given + * on the command line: intel_reg_dumper PCH_PP_CONTROL 0xabcd0002 */ + if (reg_name) { + decode_register(reg_name, reg_val); + return 0; + } if (file) { intel_map_file(file);