diff --git a/doc/openocd.texi b/doc/openocd.texi
index feb433459fb9fa1b0031c9d0adfaa1016556aa17..81a913541d5513fa992435dd15655812e40cf537 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -3895,10 +3895,14 @@ devices do not set the ack bit until sometime later.
 
 @section Other TAP commands
 
+@deffn Command {jtag cget} dotted.name @option{-idcode}
+Get the value of the IDCODE found in hardware.
+@end deffn
+
 @deffn Command {jtag cget} dotted.name @option{-event} event_name
 @deffnx Command {jtag configure} dotted.name @option{-event} event_name handler
 At this writing this TAP attribute
-mechanism is used only for event handling.
+mechanism is limited and used mostly for event handling.
 (It is not a direct analogue of the @code{cget}/@code{configure}
 mechanism for debugger targets.)
 See the next section for information about the available events.
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index 768301470d2d90447afe13ce3cc99e5739fb11b9..71d220b82c0bb9847b7ffff5f0e18551bcf9ac5c 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -307,11 +307,13 @@ static const struct command_registration jtag_command_handlers_to_move[] = {
 
 
 enum jtag_tap_cfg_param {
-	JCFG_EVENT
+	JCFG_EVENT,
+	JCFG_IDCODE,
 };
 
 static Jim_Nvp nvp_config_opts[] = {
 	{ .name = "-event",      .value = JCFG_EVENT },
+	{ .name = "-idcode",     .value = JCFG_IDCODE },
 
 	{ .name = NULL,          .value = -1 }
 };
@@ -404,8 +406,23 @@ static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, struct jtag_tap *tap)
 				if (e != JIM_OK)
 					return e;
 				break;
+			case JCFG_IDCODE:
+				if (goi->isconfigure) {
+					Jim_SetResultFormatted(goi->interp,
+							"not settable: %s", n->name);
+					return JIM_ERR;
+				} else {
+					if (goi->argc != 0) {
+						Jim_WrongNumArgs(goi->interp,
+								goi->argc, goi->argv,
+								"NO PARAMS");
+						return JIM_ERR;
+					}
+				}
+				Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, tap->idcode));
+				break;
 			default:
-				Jim_SetResultFormatted(goi->interp, "unknown event: %s", n->name);
+				Jim_SetResultFormatted(goi->interp, "unknown value: %s", n->name);
 				return JIM_ERR;
 		}
 	}