From patchwork Wed Mar 18 00:38:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: jimmzhang X-Patchwork-Id: 451188 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 249A514010F for ; Wed, 18 Mar 2015 11:39:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754355AbbCRAjl (ORCPT ); Tue, 17 Mar 2015 20:39:41 -0400 Received: from hqemgate15.nvidia.com ([216.228.121.64]:8861 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754522AbbCRAjh (ORCPT ); Tue, 17 Mar 2015 20:39:37 -0400 Received: from hqnvupgp07.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com id ; Tue, 17 Mar 2015 17:39:52 -0700 Received: from hqemhub02.nvidia.com ([172.20.12.94]) by hqnvupgp07.nvidia.com (PGP Universal service); Tue, 17 Mar 2015 17:37:48 -0700 X-PGP-Universal: processed; by hqnvupgp07.nvidia.com on Tue, 17 Mar 2015 17:37:48 -0700 Received: from jimmzhang-P9X79.nvidia.com (172.20.144.16) by hqemhub02.nvidia.com (172.20.150.31) with Microsoft SMTP Server (TLS) id 8.3.342.0; Tue, 17 Mar 2015 17:39:35 -0700 From: Jimmy Zhang To: , CC: , Jimmy Zhang Subject: [tegrarcm PATCH v1 4/8] tegrarcm: add support for odmdata command Date: Tue, 17 Mar 2015 17:38:57 -0700 Message-ID: <1426639141-12060-6-git-send-email-jimmzhang@nvidia.com> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <1426639141-12060-1-git-send-email-jimmzhang@nvidia.com> References: <1426639141-12060-1-git-send-email-jimmzhang@nvidia.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Allen Martin Add "--odmdata=[odmdata]" option in command line. Signed-off-by: Jimmy Zhang --- src/main.c | 37 +++++++++++++++++++++++++++++++++++++ src/nv3p.c | 16 ++++++++++++++++ src/nv3p.h | 8 ++++++++ 3 files changed, 61 insertions(+) diff --git a/src/main.c b/src/main.c index 96caddcc820d..b61fc9ebf92e 100644 --- a/src/main.c +++ b/src/main.c @@ -84,6 +84,7 @@ static int download_bootloader(nv3p_handle_t h3p, char *filename, static int download_mts(nv3p_handle_t h3p, char *filename, uint32_t loadaddr, uint16_t devid, char *mtsdir); static int read_bct(nv3p_handle_t h3p, char *filename); +static int send_odmdata(nv3p_handle_t h3p, uint32_t odmdata); enum cmdline_opts { OPT_BCT, @@ -99,6 +100,7 @@ enum cmdline_opts { OPT_MTS, OPT_MTSENTRY, OPT_MTSDIR, + OPT_ODMDATA, OPT_END, }; @@ -132,6 +134,8 @@ static void usage(char *progname) fprintf(stderr, "\t\tminiloader\n"); fprintf(stderr, "\t--miniloader_entry=\n"); fprintf(stderr, "\t\tSpecify the entry point for the miniloader\n"); + fprintf(stderr, "\t--odmdata=\n"); + fprintf(stderr, "\t\tOverride odmdata by odmdata given in command line\n"); fprintf(stderr, "\t--preboot=pbfile\n"); fprintf(stderr, "\t\tRead the preboot ucode from given file\n"); fprintf(stderr, "\t--preboot-entry=\n"); @@ -183,6 +187,7 @@ int main(int argc, char **argv) char *mtsfile = NULL; uint32_t mtsentry = 0; char *mtsdir = NULL; + uint32_t odmdata = 0; static struct option long_options[] = { [OPT_BCT] = {"bct", 1, 0, 0}, @@ -198,6 +203,7 @@ int main(int argc, char **argv) [OPT_MTS] = {"mts", 1, 0, 0}, [OPT_MTSENTRY] = {"mts-entry", 1, 0, 0}, [OPT_MTSDIR] = {"mts-dir", 1, 0, 0}, + [OPT_ODMDATA] = {"odmdata", 1, 0, 0}, [OPT_END] = {0, 0, 0, 0} }; @@ -248,6 +254,9 @@ int main(int argc, char **argv) case OPT_MTSDIR: mtsdir = optarg; break; + case OPT_ODMDATA: + odmdata = strtoul(optarg, NULL, 0); + break; case OPT_HELP: default: usage(argv[0]); @@ -354,6 +363,14 @@ int main(int argc, char **argv) exit(0); } + if (odmdata) { + printf("sending odm data (0x%x) to target...\n", odmdata); + ret = send_odmdata(h3p, odmdata); + if (ret) + error(1, ret, "error sending ODM data"); + printf("odm data sent successfully\n"); + } + // get platform info and dump it if ((devid & 0xff) == USB_DEVID_NVIDIA_TEGRA132) info_t132.skip_auto_detect = 1; @@ -965,6 +982,26 @@ out: return ret; } +static int send_odmdata(nv3p_handle_t h3p, uint32_t odmdata) +{ + int ret; + nv3p_cmd_send_odmdata_t odm_info; + + odm_info.odmdata = odmdata; + ret = nv3p_cmd_send(h3p, NV3P_CMD_SEND_ODMDATA, (uint8_t *)&odm_info); + if (ret) { + dprintf("error sending send odmdata command\n"); + return ret; + } + ret = wait_status(h3p); + if (ret) { + dprintf("error waiting for status after get bct\n"); + return ret; + } + + return 0; +} + static int download_bootloader(nv3p_handle_t h3p, char *filename, uint32_t entry, uint32_t loadaddr) { diff --git a/src/nv3p.c b/src/nv3p.c index 89bb607d9d96..7f8c72994396 100644 --- a/src/nv3p.c +++ b/src/nv3p.c @@ -358,6 +358,15 @@ static void nv3p_write_cmd(nv3p_handle_t h3p, uint32_t command, void *args, WRITE32(tmp, a->address); break; } + case NV3P_CMD_SEND_ODMDATA: + { + nv3p_cmd_send_odmdata_t *a = (nv3p_cmd_send_odmdata_t *)args; + *length = (1 * 4); + WRITE32(tmp, *length); + WRITE32(tmp, command); + WRITE32(tmp, a->odmdata); + break; + } default: dprintf("bad command: 0x%x\n", command); break; @@ -439,6 +448,7 @@ static int nv3p_get_cmd_return(nv3p_handle_t h3p, uint32_t command, void *args) case NV3P_CMD_DL_BCT: case NV3P_CMD_DL_BL: case NV3P_CMD_DL_MTS: + case NV3P_CMD_SEND_ODMDATA: break; default: dprintf("unknown command: 0x%x\n", command); @@ -682,6 +692,12 @@ static int nv3p_get_args(nv3p_handle_t h3p, uint32_t command, void **args, READ32(tmp, a->address); break; } + case NV3P_CMD_SEND_ODMDATA: + { + nv3p_cmd_send_odmdata_t *a = (nv3p_cmd_send_odmdata_t *)buf; + READ32(tmp, a->odmdata); + break; + } default: dprintf("unknown command: 0x%x\n", command); return EINVAL; diff --git a/src/nv3p.h b/src/nv3p.h index 66c06e7a0902..3143c192e979 100644 --- a/src/nv3p.h +++ b/src/nv3p.h @@ -42,6 +42,7 @@ #define NV3P_CMD_GET_BCT 0x02 #define NV3P_CMD_DL_BCT 0x04 #define NV3P_CMD_DL_BL 0x06 +#define NV3P_CMD_SEND_ODMDATA 0x07 #define NV3P_CMD_STATUS 0x0a #define NV3P_CMD_DL_MTS 0x33 @@ -206,6 +207,13 @@ typedef struct { uint32_t address; // Load address } nv3p_cmd_dl_mts_t; +/* + * nv3p_cmd_send_odmdata_t: send ODMDATA to the device + */ +typedef struct { + uint32_t odmdata; +} nv3p_cmd_send_odmdata_t; + int nv3p_open(nv3p_handle_t *h3p, usb_device_t *usb); void nv3p_close(nv3p_handle_t h3p); int nv3p_cmd_send(nv3p_handle_t h3p, uint32_t command, void *args);