#!/bin/bash
set -e

# ID all unique CPU package IDs
SYS=/sys/devices/system/cpu
for PKG_ID in $(cat "${SYS}"/cpu*[0-9]/topology/physical_package_id | sort | uniq); do
    COUNT=$(grep "^${PKG_ID}$" "${SYS}"/cpu*[0-9]/topology/physical_package_id | wc -l)
    FIRST=$(dirname $(dirname $(grep "^${PKG_ID}$" "${SYS}"/cpu*[0-9]/topology/physical_package_id | head -n1)))
    MAXFREQ=$(cat "${FIRST}/cpufreq/scaling_max_freq")
    MIDR=$(cat "${FIRST}/regs/identification/midr_el1")
    IMPL=${MIDR:10:2}
    MODEL=${MIDR:14:3}
    if DESC=$(grep "^${IMPL}/${MODEL}:" arm-chip-id.db); then
	# Known implementer, model
	DESC="${DESC##*:}"
    elif DESC=$(grep "^${IMPL}:" arm-chip-id.db); then
	# Known implementer, unknown model
	DESC="${DESC##*:} Model ${MODEL}"
    else
	DESC="Implementer ${IMPL} Model ${MODEL}"
    fi
    echo "${COUNT}x ${DESC} @ $[MAXFREQ / 1000] MHz"
done
