diff --git a/job/tf-ci-gateway/generate_report.sh b/job/tf-ci-gateway/generate_report.sh
index 05e0fb5..730c503 100755
--- a/job/tf-ci-gateway/generate_report.sh
+++ b/job/tf-ci-gateway/generate_report.sh
@@ -26,7 +26,21 @@
 		triggered_job=$(echo ${TRIGGERED_JOB_NAMES} | tr "_" "-")
 		worker_job="${worker_job:-${triggered_job}}"
 		lava_job="${lava_job:-${triggered_job}}"
-        fi
+	fi
+
+	# Generate UI for test results, only if this is a visualization job.
+	while getopts ":t" option; do
+		case $option in
+			t)
+				target_job="$(dirname $TARGET_BUILD)"
+				target=${target_job:-tf-a-main}
+				"$CI_ROOT/script/gen_results_report.py" \
+					--png "${target}-result.png" \
+					--csv "${WORKSPACE}/${target}-result.csv" \
+					-o "${WORKSPACE}/report.html" || true
+				exit;;
+		esac
+	done
 
 	"$CI_ROOT/script/gen_test_report.py" \
 		--job "${worker_job}" \
diff --git a/script/gen_results_report.py b/script/gen_results_report.py
new file mode 100755
index 0000000..64918b2
--- /dev/null
+++ b/script/gen_results_report.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2022, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+import argparse
+import csv
+import os
+
+from gen_test_report import emit_header, print_error_message
+
+TABLE_HEADER = """\
+<table id="tf-results-panel">
+  <tbody>
+    <tr>
+      <td class="results-col">
+        <table>
+          <tbody>
+            <thead>
+              <tr>
+                <th>Passed</th>
+                <th>Skipped</th>
+                <th>Crashed</th>
+                <th>Failed</th>
+              </tr>
+            </thead>
+            <tbody>
+              <tr>"""
+
+TABLE_FOOTER = """\
+              </tr>
+            </tbody>
+          </tbody>
+        </table>
+      </td>
+      <td class="button-col">
+        <button id="tf-download-button" onclick="window.open('{}','_blank')">Download Plot</button>
+      </td>
+    </tr>
+  </tbody>
+</table>"""
+
+# Open and sum the results of a comma-separated test result file.
+def fetch_results(csv_path):
+    failed = passed = skipped = crashed = 0
+    with open(csv_path, "r") as fd:
+        for test in csv.DictReader(fd):
+            failed = failed + int(test["Failed"])
+            passed = passed + int(test["Passed"])
+            skipped = skipped + int(test["Skipped"])
+            crashed = crashed + int(test["Crashed"])
+    return passed, skipped, crashed, failed
+
+
+def main(fd, csv_path, png_path):
+    results_row = ("""<td>{}</td>\n""".rjust(28) * 4).format(
+        *fetch_results(csv_path)
+    )
+
+    # Emite header and style sheet.
+    emit_header(fd)
+
+    print(TABLE_HEADER, file=fd)
+    print(results_row, file=fd)
+
+    # Format table button to link to full-size plot of results.
+    TABLE_FOOTER.format(build_url + "/" + png_path)
+    print(TABLE_FOOTER, file=fd)
+
+
+if __name__ == "__main__":
+    global build_url
+
+    parser = argparse.ArgumentParser()
+
+    # Add arguments
+    parser.add_argument(
+        "--output",
+        "-o",
+        default="report.html",
+        help="Path to output file",
+    )
+    parser.add_argument(
+        "--csv",
+        default=None,
+        help="Path to input CSV with data for the target job",
+    )
+    parser.add_argument(
+        "--png", default=None, help="Filename for PNG results plot"
+    )
+
+    # The build url and target for the results are needed in-case the user hasn't provided a
+    # paths to the inputs.
+    opts = parser.parse_args()
+    build_url = os.environ["BUILD_URL"]
+    target_job = os.environ["TARGET_BUILD"]
+    target_job_name = target_job[: target_job.find("/")]
+
+    # Use filenames provided by user or try and infer based off the target name from the environment.
+    output_path = "report.html" if not opts.output else opts.output
+    csv_path = target_job_name + "results.csv" if not opts.csv else opts.csv
+    png_path = target_job_name + "results.png" if not opts.png else opts.png
+
+    with open(output_path, "w") as fd:
+        try:
+            main(output_path, csv_path, png_path)
+        except:
+            print_error_message(fd)
+            raise
diff --git a/script/gen_test_report.css b/script/gen_test_report.css
index 9a11600..07c298d 100644
--- a/script/gen_test_report.css
+++ b/script/gen_test_report.css
@@ -130,3 +130,51 @@
   display: inline-block;
   padding: 2px 3px 0px 3px;
 }
+
+#tf-results-panel {
+  margin-bottom: 20px;
+  margin-top: 20px;
+  padding: 5px 10px;
+}
+
+.results-col {
+  padding: 5px 10px;
+}
+
+.results-col table {
+  border-collapse: collapse;
+  vertical-align: middle;
+}
+
+.results-col td,
+.results-col th {
+  text-align: center;
+  padding: 5px 10px;
+  font: 20px monospace;
+  border: 1px #c8c8c8 solid;
+}
+
+.results-col th {
+  font-weight: bold;
+  background-color: #e0f7ff;
+}
+.button-col {
+  margin-left: 15px;
+}
+
+#tf-results-panel .button-col {
+  border-collapse: collapse;
+  font: 10px monospace;
+  padding: 25px;
+}
+
+#tf-download-button {
+  background-color: #4b758b;
+  border: 1px solid #aaa;
+  color: #eee;
+  display: block;
+  font-weight: bold;
+  padding: 5px 10px;
+  margin-bottom: 10px;
+  width: 250px;
+}
diff --git a/script/gen_test_report.py b/script/gen_test_report.py
index 965aaa0..d32b118 100755
--- a/script/gen_test_report.py
+++ b/script/gen_test_report.py
@@ -327,6 +327,34 @@
     # Return result as string
     return "".join(crumbs)
 
+# Emit style sheet, and script elements.
+def emit_header(fd):
+    stem = os.path.splitext(os.path.abspath(__file__))[0]
+    for tag, ext in [("style", "css"), ("script", "js")]:
+        print(open_element(tag), file=fd)
+        with open(os.extsep.join([stem, ext])) as ext_fd:
+            shutil.copyfileobj(ext_fd, fd)
+        print(close_element(tag), file=fd)
+
+def print_error_message(fd):
+            # Upon error, create a static HTML reporting the error, and then raise
+        # the latent exception again.
+        fd.seek(0, io.SEEK_SET)
+
+        # Provide inline style as there won't be a page header for us.
+        err_style = (
+                "border: 1px solid red;",
+                "color: red;",
+                "font-size: 30px;",
+                "padding: 15px;"
+                )
+
+        print(make_element("div",
+            "HTML report couldn't be prepared! Check job console.",
+            style=" ".join(err_style)), file=fd)
+
+        # Truncate file as we're disarding whatever there generated before.
+        fd.truncate()
 
 def main(fd):
     global Build_job, Jenkins, Job
@@ -347,6 +375,9 @@
     opts = parser.parse_args()
 
     workspace = os.environ["WORKSPACE"]
+
+    emit_header(fd)
+
     if not opts.from_json:
         json_obj = {}
 
@@ -431,13 +462,7 @@
         run_node.set_result(test_result, build_number)
         run_node.set_desc(os.path.join(workspace, f))
 
-    # Emit style sheet, script, and page header elements
-    stem = os.path.splitext(os.path.abspath(__file__))[0]
-    for tag, ext in [("style", "css"), ("script", "js")]:
-        print(open_element(tag), file=fd)
-        with open(os.extsep.join([stem, ext])) as ext_fd:
-            shutil.copyfileobj(ext_fd, fd)
-        print(close_element(tag), file=fd)
+    # Emit page header element
     print(PAGE_HEADER, file=fd)
     begin_table(results, fd)
 
@@ -481,27 +506,10 @@
         with open(REPORT_JSON, "wt") as json_fd:
             json.dump(json_obj, json_fd, indent=2)
 
-
-with open(REPORT, "wt") as fd:
-    try:
-        main(fd)
-    except:
-        # Upon error, create a static HTML reporting the error, and then raise
-        # the latent exception again.
-        fd.seek(0, io.SEEK_SET)
-
-        # Provide inline style as there won't be a page header for us.
-        err_style = (
-                "border: 1px solid red;",
-                "color: red;",
-                "font-size: 30px;",
-                "padding: 15px;"
-                )
-
-        print(make_element("div",
-            "HTML report couldn't be prepared! Check job console.",
-            style=" ".join(err_style)), file=fd)
-
-        # Truncate file as we're disarding whatever there generated before.
-        fd.truncate()
-        raise
+if __name__ == "__main__":
+    with open(REPORT, "wt") as fd:
+        try:
+            main(fd)
+        except:
+            print_error_message(fd)
+            raise
diff --git a/script/graphs/README.rst b/script/graphs/README.rst
index 0860cb2..b057943 100644
--- a/script/graphs/README.rst
+++ b/script/graphs/README.rst
@@ -41,6 +41,66 @@
 
 .. code-block::
 
-    bash ../<this-repo>/script/graph/sloc-viz.bash > sloc.png 2> sloc.tsv
+    bash ../<this-repo>/script/graphs/sloc-viz.bash > sloc.png 2> sloc.tsv
+
+Test Results
+------------
+
+The script `tf-main-results.bash` uses curl to retrieve test results for a
+tf-a-main Jenkins job, and generates a CSV and stacked histogram PNG of the
+combined data.
+
+Usage:
+======
+
+    bash tf-main-results.bash <jenkins-url> [ci_gateway] [filter]
+
+The Jenkins URL is the URL for the target build job.
+
+    https://ci.trustedfirmware.org/job/tf-a-main/1/
+
+The sub-builds for this job will all be queried to find the ones that contain
+tests, ignoring child builds that only build and don't run any platform tests.
+
+`tf-a-ci-gateway` is the default gateway, although, different gateways may be
+specified with the optional "ci_gateway" argument. This option will be combined
+with the build numbers and the base Jenkins URL to retrieve the results of
+sub-builds.
+
+This can be filtered further using the optional "filter" argument, which will
+select only test groups that match the provided regex.
+
+Example Useful Queries
+======================
+
+Only show tests running the test framework:
+
+    bash tf-main-results.bash <jenkins-url> [ci_gateway] "tftf"
+
+Only show tests for N1SDP & Juno platforms:
+
+    bash tf-main-results.bash <jenkins-url> [ci_gateway] "n1sdp|juno"
+
+Only show boot tests on FVP platforms:
+
+    bash tf-main-results.bash <jenkins-url> [ci_gateway] 'fvp.*boot'
+
+Note: for filters that return a small number of test groups, the graph is not
+ideal as it is sized for a large number. A CSV file of the data is also produced,
+however, so that you can use it to create your own graph, if required.
+
+Additional Config
+=================
+
+The script also allows the three output files to be configured via ENV variables:
+
+    PNGFILE=out.png CSVFILE=out.csv bash tf-main-results.bash
+
+If they are not set then default values based on the build number will be generated:
+
+    PNGFILE_DEFAULT="tf-main_${build_number}.png"
+    CSVFILE_DEFAULT="tf-main_${build_number}.csv"
+
+If any of these files already exist then they will be overwritten.
 
 *Copyright (c) 2021-2022, Arm Limited. All rights reserved.*
diff --git a/script/graphs/tf-main-results.bash b/script/graphs/tf-main-results.bash
new file mode 100644
index 0000000..34ff885
--- /dev/null
+++ b/script/graphs/tf-main-results.bash
@@ -0,0 +1,197 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2022 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+set -euo pipefail
+
+# Build and Jenkins URL.
+sub_build_url=${1}
+job_name="${2:-"tf-a-ci-gateway"}"
+filter=${3:-".*"}
+
+jenkins="${sub_build_url%%/job*}"
+
+# Utilise default paths to output files if none provided.
+job_target="$(dirname ${sub_build_url#*/job/})"
+PNGFILE=${PNGFILE:=${job_target}-result.png}
+CSVFILE=${CSVFILE:=${job_target}-result.csv}
+
+# Remove csv output file if it exists to append to empty file
+: > "${CSVFILE}"
+
+readarray -t sub_builds < <(curl -sSL "${sub_build_url}/api/json" | jq -Rr '
+	fromjson? | [
+		.subBuilds[]? | select(.jobName == "'${job_name}'") | .url
+	] | .[]')
+
+# Get a csv list of relative paths to report.json, or "-" if no report.json
+report_rel_paths_url="${jenkins}/{$(echo $(IFS=,; echo "${sub_builds[*]}"))}/api/json"
+
+readarray -t report_paths < <(curl -fsSL --fail-early "${report_rel_paths_url}" \
+					| sed 's/--_curl_--.*$//' \
+					| sed -e 's/^{/'$(printf "\x1e")'{/' \
+					| jq -sr --seq '
+				 	[ .[]
+						| [ .artifacts[]?
+						| select (.fileName == "report.json")
+						| .relativePath ]
+						| if length > 0 then .[] else "-" end ]
+					| .[]')
+
+# Combine sub build urls with relative path to "report.json"
+# the empty entries are intentionally kept as -, so the output array can
+# be mapped onto ${sub_build_list}
+report_urls="$jenkins/{"
+for i in "${!sub_builds[@]}"
+do
+	if [[ ${report_paths[i]} != "-" ]]
+	then
+		report_urls="${report_urls}${sub_builds[i]}/artifact/${report_paths[i]},"
+	fi
+done
+
+# Strip last comma and add closing brace
+report_urls="${report_urls%?}}"
+
+# Get Child build information from each report.json.
+readarray -t child_file_list_array < <(curl -sL "${report_urls}" -o -\
+                        | sed 's/--_curl_--.*$//' \
+                        | jq -sr --arg FILTER "${filter}" \
+                            '[.[]
+                             | .job as $job
+                             | [ .child_build_numbers?, [(.test_files[]
+                               | sub("\\.test";"")
+                               | split("%") as $config
+                               | { group: $config[1], suite: $config[2]})]]
+                             | transpose
+                             | map( {($job + "/" + .[0]) : .[1]} | to_entries )
+                             | add
+                             | map(select(.value.suite | test(".*"; "il")?
+							               and (endswith("nil")
+										     or endswith("norun-fip.dummy") | not)))
+                             | if ( length > 0 )
+                                then .[] else empty end
+                             | .value.group, (.value.suite | gsub("\\,nil";"")), .key]
+							 | .[]')
+
+# These three arrays should be the same length, and values at the same index
+# correspond to the same child build
+declare -a tftf_keys tftf_suite tftf_group
+
+for i in $(seq 0 3 $((${#child_file_list_array[@]}-1))) ; do
+	tftf_group+=("${child_file_list_array[$i]}")
+	tftf_suite+=("${child_file_list_array[$i+1]}")
+	tftf_keys+=("${child_file_list_array[$i+2]}")
+done
+
+
+child_output_results_url="${jenkins}/job/{$(echo $(IFS=,; echo "${tftf_keys[*]}"))}/api/json"
+
+# Retrieve relative path to either "uart0_full.txt" (FVP) or
+# "job_output.log" (LAVA) for each child job. Once again values where no match
+# is found are intentionally kept as "-" so the array can be correlated with
+# ${tftf_suite}.
+readarray -t child_output_results < <(curl -fsSL --fail-early "$child_output_results_url" \
+                 | sed 's/}{/}\n{/g' \
+                 | jq -sr '[ .[]
+                             | ([ .artifacts[]?
+                                  | select(.fileName == "uart0_full.txt"
+                                  or .fileName == "job_output.log"
+                                  or .fileName == "lava-uart0.log") ]
+                             |  if length > 0
+                                then .[0].relativePath else "-" end), .result ]
+                           | .[]')
+
+# Combine job and child_build number with relative path to output file
+testlog_urls="${jenkins}/job/{"
+tftf_child_results=()
+
+for i in $(seq 0 2 $((${#child_output_results[@]}-1))) ; do
+	testlog_urls+="${tftf_keys[$((i/2))]}/artifact/${child_output_results[$i]},"
+	tftf_child_results+=(${child_output_results[$((i+1))]})
+done
+
+# Remove final comma and append a closing brace
+testlog_urls="${testlog_urls%?}}"
+
+# Retrieve the log for each child with --include to also retrieve the HTTP
+# header and grep for a block like:
+# Tests Skipped : 125
+# Tests Passed  : 45
+# Tests Failed  : 0
+# Tests Crashed : 0
+#
+# If none is found the line HTTP is used to delemit each entry
+#
+# Logs from Lava each message is wrapped with braces and has some pre-amble,
+# which is removed with sed.
+
+tftf_result_keys=(
+        "TestGroup" "TestSuite" "URL" "Result" "Passed" "Failed" "Crashed" "Skipped"
+)
+declare -A results_split="( $(for ord_ in ${tftf_result_keys[@]} ; do echo -n "[$ord_]=\"\" "; done))"
+declare output_csv_str="" csv_row=""
+
+read -ra tftf_urls <<< "$(eval "echo ${testlog_urls}")"
+
+# FIXME adjust this so we can handle both LAVA logs
+# for each test suite
+# curl the result log if its not '-'
+# remove debug information
+# if results is none:
+	# use "Result"
+# else
+	# read each key
+# write row to csv
+
+# Sort results into rows:
+for i in ${!tftf_suite[*]}; do
+	results_split["TestGroup"]="${tftf_group[$i]:-}"
+	results_split["TestSuite"]="\"${tftf_suite[$i]:-}\""
+	results_split["URL"]="${tftf_urls[$i]:-}"
+	results_split["Result"]="${tftf_child_results[$i]:-}"
+
+	# Skipped/Crashed are always zero if no test block is found
+	results_split["Skipped"]="0"
+	results_split["Crashed"]="0"
+	if [[ "${results_split["Result"]}" == "SUCCESS" ]];
+	then
+		results_split["Passed"]="1"
+		results_split["Failed"]="0"
+	else
+		results_split["Passed"]="0"
+		results_split["Failed"]="1"
+	fi
+
+	readarray -t raw_result < <(curl -sL --include "${results_split["URL"]}" \
+			| sed 's/.*msg": "//g' \
+			| grep --text -E "^Tests|HTTP\/")
+
+	for line in "${raw_result[@]}"; do
+		if [[ "${line}" == Test* ]]
+		then
+			k=$(echo "${line}" | awk -F ' ' '{print $2}')
+			count="${line//[!0-9]/}"
+			results_split[$k]=$count
+		fi
+	done
+
+	# Generate CSV row using array of ordinals to align with headers.
+	readarray -t row < <(for k in ${tftf_result_keys[@]} ; do echo "${results_split[$k]}"; done )
+	output_csv_str="${output_csv_str} $(echo $(IFS=,; echo "${row[*]}"))"
+	unset results_split[{..}] row
+done
+
+# Replace spaces in header with commas and print to the output file.
+echo $(IFS=,; echo "${tftf_result_keys[*]}") > ${CSVFILE}
+
+# Sort Filenames alphabetically and store in csv for gnuplot
+sorted=($(IFS=$' '; sort <<<$output_csv_str))
+printf "%b\n" "${sorted[@]}" >> ${CSVFILE}
+
+# Produce PNG image of graph using gnuplot and .plot description file
+gnuplot -e "jenkins_id='$sub_build_url'" -c ${0%bash}plot \
+        "$CSVFILE" > "$PNGFILE"
diff --git a/script/graphs/tf-main-results.plot b/script/graphs/tf-main-results.plot
new file mode 100644
index 0000000..3c8e345
--- /dev/null
+++ b/script/graphs/tf-main-results.plot
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2022 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# Determine the number of test groups, scale the terminal based on the number
+# of these.
+groups=system(sprintf("awk -F ',' 'NR!=1 {print $1}' %s | sort | uniq", ARG1))
+group_count=words(groups)
+
+# Terminal height should scale with the number of groups
+# (each group has a plot).
+set terminal pngcairo enhanced size 5400,9600 font ',14'
+
+set xrange [0:5<*] extend
+set ytic scale 0 nomirror
+set grid xtics
+set lmargin 70
+set bmargin 5
+set yrange [:] reverse
+set offsets 0,0,0.5,0.5
+set datafile separator ","
+
+set key autotitle columnhead
+
+# Create linetypes for coloured labels
+set linetype 1 linecolor "red"
+set linetype 2 linecolor "black"
+fill(n) = word("green red orange gray", n)
+
+set multiplot title "TF-A CI Test Results: " . jenkins_id \
+    font ",30" layout ceil(group_count/3.0),3
+
+        set style data histograms
+        set style fill solid 0.3 border -1
+        set key outside left vertical
+        set label "Test Suites" at screen 0.05,0.5 \
+            center front rotate font ",20"
+
+        do for [group in groups]{
+                set title group font ",18"
+                set style histogram rowstacked
+                filter = "awk -F, 'NR==1 || $1==\"".group."\"'"
+                col_count = 8
+                box_width = 0.5
+
+                plot for [col=5:col_count] '< '.filter.' '.ARG1 u col:0: \
+                    (sum [i=5:col-1] column(i)): \
+                    (sum [i=5:col] column(i)): \
+                    ($0-box_width/2.):($0+box_width/2.):ytic(2) w boxxyerror \
+                    ti columnhead(col) lc rgb fill(col-4)
+
+                unset key
+        }
+
+unset multiplot
+
