diff --git a/userspace/tools/wrs_version.c b/userspace/tools/wrs_version.c index 1a227098dc080c9854095d5b7ad7ecb9b158111e..8e9f34d93422361c69bba618355720cf26971b02 100644 --- a/userspace/tools/wrs_version.c +++ b/userspace/tools/wrs_version.c @@ -27,6 +27,7 @@ #include <libwr/hwiu.h> #include <libwr/switch_hw.h> #include <libwr/wrs-msg.h> +#include <libwr/softpll.h> #include <fpga_io.h> #include "libsdbfs.h" @@ -40,10 +41,27 @@ #define __GIT_USR__ "?" #endif -/* TODO: Should be taken from generated files, but there are not present in - * WRS repo */ -#define GPIO_LJD_BOARD_DETECT 4 -#define GPIO_REG_PSR 12 +char *spll_lj_periph_id_to_name[] = { + [PERIPH_ID_WRS_LJ_SAFRAN] = "Safran", + [PERIPH_ID_WRS_FL_SYNCTECHv1_5] = "SyncTech v1.0", + [PERIPH_ID_WRS_FL_SYNCTECHv1_0] = "SyncTech v1.5", +}; + +char *spll_lj_osc_freq_type_to_name[] = { + [OSC_FREQ_10M] = "10M", + [OSC_FREQ_20M] = "20M", + [OSC_FREQ_25M] = "25M", + [OSC_FREQ_50M] = "50M", + [OSC_FREQ_100M] = "100M", + [OSC_FREQ_WRS_LJ_INT] = "WRS LJ INT", +}; + +char *spll_lj_wrs_type_to_name[] = { + [PERIPH_WRS_STD_NO_LJ] = "Standard no LJ", + [PERIPH_WRS_STD_WITH_LJD] = "Standard with LJD", + [PERIPH_WRS_FL_SYNCTECH] = "SyncTech FL", + [PERIPH_WRS_LJ_SAFRAN] = "Safran LJ", +}; void help(const char* pgrname) @@ -179,10 +197,57 @@ static void print_gw_info(void) printf("wr-cores-commit: %07x\n", info.wr_cores_hash); } +static char * get_lj_periph_id(int i) +{ + switch (i) { + case PERIPH_ID_WRS_FL_SYNCTECHv1_0: + case PERIPH_ID_WRS_FL_SYNCTECHv1_5: + case PERIPH_ID_WRS_LJ_SAFRAN: + return spll_lj_periph_id_to_name[i]; + default: + return "Unknown"; + } + + return NULL; +} + +static char * get_lj_osc_freq_type(int i) +{ + switch (i) { + case OSC_FREQ_10M: + case OSC_FREQ_20M: + case OSC_FREQ_25M: + case OSC_FREQ_50M: + case OSC_FREQ_100M: + case OSC_FREQ_WRS_LJ_INT: + return spll_lj_osc_freq_type_to_name[i]; + default: + return "Unknown"; + } + + return NULL; +} + +static char * get_lj_wrs_type(int i) +{ + switch (i) { + case PERIPH_WRS_STD_NO_LJ: + case PERIPH_WRS_STD_WITH_LJD: + case PERIPH_WRS_FL_SYNCTECH: + case PERIPH_WRS_LJ_SAFRAN: + return spll_lj_wrs_type_to_name[i]; + default: + return "Unknown"; + } + + return NULL; +} + /* Print everything in tagged format, for snmp parsing etc */ static void wrsw_tagged_versions(void) { - int feature_ljd; + int feature_ljd = 0; + struct spll_stats *spll_stats_p; printf("software-version: %s\n", __GIT_VER__); /* see Makefile */ printf("built-by: %s\n", __GIT_USR__); /* see Makefile */ @@ -193,9 +258,39 @@ static void wrsw_tagged_versions(void) printf("serial-number: %s\n", sdb_get("hw_info", "scb_serial")); printf("scb-version: %s\n", sdb_get("scb_version", NULL)); print_gw_info(); /* This is already tagged */ - feature_ljd =_fpga_readl(FPGA_BASE_RT_GPIO + GPIO_REG_PSR) - & 1 << GPIO_LJD_BOARD_DETECT; + + spll_stats_p = create_map(FPGA_SPLL_STAT, sizeof(*spll_stats_p)); + if (!spll_stats_p) { + fprintf(stderr, "Unable to map spll stats\n"); + } else if (spll_stats_p->magic != SPLL_STATS_MAGIC) { + /* Wrong magic */ + fprintf(stderr, "unknown magic %x (known is %x)\n", + spll_stats_p->magic, SPLL_STATS_MAGIC); + } else { + feature_ljd = spll_stats_p->ljd_present; + printf("wrpc-sw-commit: %.30s\n", + spll_stats_p->build_id.commit_id); + printf("wrpc-sw-build-date: %.30s\n", + spll_stats_p->build_id.build_date); + printf("wrpc-sw-build-time: %.30s\n", + spll_stats_p->build_id.build_time); + printf("wrpc-sw-build-by: %.30s\n", + spll_stats_p->build_id.build_by); + } + printf("features: %s\n", feature_ljd ? "LJD" : ""); + + if (feature_ljd) { + printf("lj-periph-id: %s (0x%x)\n", + get_lj_periph_id(spll_stats_p->lj_periph_id), + spll_stats_p->lj_periph_id); + printf("lj-osc-freq: %s (0x%x)\n", + get_lj_osc_freq_type(spll_stats_p->lj_osc_freq_type), + spll_stats_p->lj_osc_freq_type); + printf("lj-wrs-type: %s (0x%x)\n", + get_lj_wrs_type(spll_stats_p->lj_wrs_type), + spll_stats_p->lj_wrs_type); + } } /* remove dots from strings */