Received: by 10.192.165.148 with SMTP id m20csp1311083imm; Thu, 10 May 2018 08:46:03 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrvQym5lbIGylQUFXr/m4GgQ+aE7JACJv/TYKXwmRrOHbD57HZOmJrabc74DKiZEbr0CQ5Z X-Received: by 2002:a63:b046:: with SMTP id z6-v6mr1530556pgo.16.1525967163939; Thu, 10 May 2018 08:46:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525967163; cv=none; d=google.com; s=arc-20160816; b=He1x5HV244sgWIOina4P18JA4gUWwb9rVB9Ry1UgXwIE4Il0WJ1jxByGr8PXKAqGML ymFWZdV/MRnPcRz4EndXjVetmHBOpknK9XrLuD51KClt1XjPTb0pn/P+GDhuwNbFIjpi yr7T2AIzyyOL7o1uk2P3MPsTob8vY+YcxdBT4sElyRV0/odgdivk1BJL1ruWrgzBHSsx LHfD8K22D6RzgcsUHjFLAhMe/lLWzFH3PTPYUaz8xyAbAgNBhDvOmDcBL1lWweeHB/7i CT/p2SknMrlPu5mzqAXYGFW6cgxyAlnAWHJjyzJGv1zTpNq7Uev6YdDKmcg8CWz9Rryu 6FsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=ZdnXqIN3iLut6VSLdPhJ0iyMk30AYQg8G0ZtVYBevzQ=; b=N+Cfm5fCVLrHcOvrmy9WptQ++8+bKLBTIfxC25XACvcUycY2THm1fLtG6r6ASbM9Ch nLEC0GQ3Ze0rlw+150NlyNkIhNC29imuKzsyp2N4UW1Fpy3L4Rfz7qFbXPQc3g/pQc6a WOc+SImBkfy9bP8pr4+qllEOd+jWFLjZE9kJfLN5LALmCjoz5oQndcepwcglE7ajEZbk XKbGpMdyZULSZG0AUkRMf+LDD3l3kifH+HL6dh5ix4qkaAhAnLiqzrIq5TfodKkDMHu3 lc/XdgHrigld4VPKzk65Z1V6O7LmQM6aww24fjVAAapZ9K+46jKaYcJH2ZRJXf2RyuRR R5iw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mellanox.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x33-v6si1004807plb.512.2018.05.10.08.45.48; Thu, 10 May 2018 08:46:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mellanox.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966375AbeEJPof (ORCPT + 99 others); Thu, 10 May 2018 11:44:35 -0400 Received: from mail-il-dmz.mellanox.com ([193.47.165.129]:35679 "EHLO mellanox.co.il" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S966301AbeEJPob (ORCPT ); Thu, 10 May 2018 11:44:31 -0400 Received: from Internal Mail-Server by MTLPINE1 (envelope-from oleksandrs@mellanox.com) with ESMTPS (AES256-SHA encrypted); 10 May 2018 18:46:10 +0300 Received: from r-vnc16.mtr.labs.mlnx (r-vnc16.mtr.labs.mlnx [10.208.0.16]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id w4AFiPK7016730; Thu, 10 May 2018 18:44:26 +0300 From: Oleksandr Shamray To: gregkh@linuxfoundation.org, arnd@arndb.de Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, openbmc@lists.ozlabs.org, joel@jms.id.au, jiri@resnulli.us, tklauser@distanz.ch, linux-serial@vger.kernel.org, vadimp@mellanox.com, system-sw-low-level@mellanox.com, robh+dt@kernel.org, openocd-devel-owner@lists.sourceforge.net, linux-api@vger.kernel.org, davem@davemloft.net, mchehab@kernel.org, Oleksandr Shamray Subject: [patch v19 4/4] Documentation: jtag: Add ABI documentation Date: Thu, 10 May 2018 18:44:24 +0300 Message-Id: <1525967064-10760-5-git-send-email-oleksandrs@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1525967064-10760-1-git-send-email-oleksandrs@mellanox.com> References: <1525967064-10760-1-git-send-email-oleksandrs@mellanox.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Added document that describe the ABI for JTAG class drivrer Signed-off-by: Oleksandr Shamray Acked-by: Arnd Bergmann --- v18-v19 Pavel Machek - Added JTAG doccumentation to Documentation/jtag v17->v18 v16->v17 v15->v16 v14->v15 v13->v14 v12->v13 v11->v12 Tobias Klauser - rename /Documentation/ABI/testing/jatg-dev -> jtag-dev - Typo: s/interfase/interface v10->v11 v9->v10 Fixes added by Oleksandr: - change jtag-cdev to jtag-dev in documentation - update Kernel Version and Date in jtag-dev documentation; v8->v9 v7->v8 v6->v7 Comments pointed by Pavel Machek - Added jtag-cdev documentation to Documentation/ABI/testing folder --- Documentation/ABI/testing/jtag-dev | 27 +++++++++ Documentation/jtag/overview | 31 ++++++++++ Documentation/jtag/transactions | 108 ++++++++++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 0 deletions(-) create mode 100644 Documentation/ABI/testing/jtag-dev create mode 100644 Documentation/jtag/overview create mode 100644 Documentation/jtag/transactions diff --git a/Documentation/ABI/testing/jtag-dev b/Documentation/ABI/testing/jtag-dev new file mode 100644 index 0000000..4325316 --- /dev/null +++ b/Documentation/ABI/testing/jtag-dev @@ -0,0 +1,27 @@ +What: /dev/jtag[0-9]+ +Date: May 2018 +KernelVersion: 4.18 +Contact: oleksandrs@mellanox.com +Description: + The misc device files /dev/jtag* are the interface + between JTAG master interface and userspace. + + The ioctl(2)-based ABI is defined and documented in + [include/uapi]. + + The following file operations are supported: + + open(2) + The argument flag currently support only one access + mode O_RDWR. + + ioctl(2) + Initiate various actions. + See the inline documentation in [include/uapi] + for descriptions of all ioctls. + + close(2) + Stops and free up the I/O contexts that was associated + with the file descriptor. + +Users: TBD diff --git a/Documentation/jtag/overview b/Documentation/jtag/overview new file mode 100644 index 0000000..e35afc0 --- /dev/null +++ b/Documentation/jtag/overview @@ -0,0 +1,31 @@ +Linux kernel JTAG support +========================= + +The JTAG (Joint Test Action Group) is an industry standard for hardware +verifying designs and testing printed circuit boards after manufacture. +JTAG provides access to many logic signals of a complex integrated circuit, +including the device pins + +JTAG provides access to many logic signals of a complex integrated circuit, +including the device pins. + +A JTAG interface is a special interface added to a chip. +Depending on the version of JTAG, two, four, or five pins are added. + +The connector pins are: + TDI (Test Data In) + TDO (Test Data Out) + TCK (Test Clock) + TMS (Test Mode Select) + TRST (Test Reset) optional. + +JTAG interface is supposed to have two parts - basic core driver and +hardware specific driver. +The basic driver introduces general interface which is not dependent of specific +hardware. It provides communication between user space and hardware specific +driver. +Each JTAG device is represented as char device from (jtag0, jtag1, ...). +Access to JTAG device is performed through IOCTL call. + +Call flow example: +User (IOCTL) -> /dev/jtagX -> JTAG core driver -> JTAG hw specific driver diff --git a/Documentation/jtag/transactions b/Documentation/jtag/transactions new file mode 100644 index 0000000..91f7f92 --- /dev/null +++ b/Documentation/jtag/transactions @@ -0,0 +1,108 @@ +The JTAG API +============= + +JTAG master devices can be accessed through a character misc-device. +Each JTAG master interface can be accessed by using /dev/jtagN + +JTAG system calls set: +- SIR (Scan Instruction Register, IEEE 1149.1 Data Register scan); +- SDR (Scan Data Register, IEEE 1149.1 Instruction Register scan); +- RUNTEST (Forces the IEEE 1149.1 bus to a run state for a specified +number of clocks. + +open(), close() +------- +open() opens JTAG device. Only one open operation per JTAG device +can be performed. Twice and more open for one device will return error + +Open/Close device: +- open('/dev/jtag0', O_RDWR); +- close(jtag_fd'); + +ioctl() +------- +All access operations to JTAG device performed trougth ioctl interface. +It support another requests: + JTAG_IOCRUNTEST - Force JTAG state machine to RUN_TEST/IDLE state + JTAG_SIOCFREQ - Set JTAG TCK frequency + JTAG_GIOCFREQ - GET JTAG TCK frequency + JTAG_IOCXFER - send JTAG data Xfer + JTAG_GIOCSTATUS - get current JTAG TAP status + JTAG_SIOCMODE - set JTAG mode flags. + +JTAG_SIOCFREQ, JTAG_GIOCFREQ +------ +Set/Get JTAG clock speed: + + ioctl(jtag_fd, JTAG_SIOCFREQ, &frq); + ioctl(jtag_fd, JTAG_GIOCFREQ, &frq); + +JTAG_IOCRUNTEST +------ +Force JTAG state machine to RUN_TEST/IDLE state + +struct jtag_run_test_idle { + __u8 reset; + __u8 endstate; + __u8 tck; +}; + +reset: 0 - run IDLE/PAUSE from current state + 1 - go through TEST_LOGIC/RESET state before IDLE/PAUSE +end: completion flag +tck: clock counter + +Example: + struct jtag_run_test_idle runtest; + + runtest.endstate = JTAG_STATE_IDLE; + runtest.reset = 0; + runtest.tck = data_p->tck; + usleep(25 * 1000); + ioctl(jtag_fd, JTAG_IOCRUNTEST, &runtest); + +JTAG_IOCXFER +------ +Send SDR/SIR transaction + +struct jtag_xfer { + __u8 type; + __u8 direction; + __u8 endstate; + __u8 padding; + __u32 length; + __u64 tdio; +}; + +type: transfer type - JTAG_SIR_XFER/JTAG_SDR_XFER +direction: xfer direction - JTAG_SIR_XFER/JTAG_SDR_XFER, +length: xfer data len in bits +tdio : xfer data array +endir: xfer end state after transaction finish + can be: JTAG_STATE_IDLE/JTAG_STATE_PAUSEIR/JTAG_STATE_PAUSEDR + +Example: + struct jtag_xfer xfer; + static char buf[64]; + static unsigned int buf_len = 0; + [...] + xfer.type = JTAG_SDR_XFER; + xfer.tdio = (__u64)buf; + xfer.length = buf_len; + xfer.endstate = JTAG_STATE_IDLE; + + if (is_read) + xfer.direction = JTAG_READ_XFER; + else + xfer.direction = JTAG_WRITE_XFER; + + ioctl(jtag_fd, JTAG_IOCXFER, &xfer); + +JTAG_SIOCMODE +------ +If hw driver can support different running modes you can change it. + +Example: + int mode; + mode = JTAG_XFER_HW_MODE; + ioctl(jtag_fd, JTAG_SIOCMODE, &mode); -- 1.7.1