From a763b873b4a42cc73c99d574fcfe30435ee96002 Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Sun, 2 Aug 2026 16:11:01 +0800 Subject: [PATCH] arch/risc-v/eic7700x: Name the reset lines through procfs. Implements get_line, so /proc/reset names all 324 lines and gives the register and bit each lives in. The framework asks status() for the asserted state. The names do not survive compilation: they live in the enumeration, so without a table a listing gives only numbers, and working back from one to a peripheral means counting through the header. The table costs about 8 KiB and is built only when the procfs entry is. The ids are sparse, 324 lines across a space of 1952, so the table is sorted by id and searched rather than indexed, and an id naming no line returns -ENODEV. The framework skips those, which is what leaves the listing dense. Assisted-by: Claude:claude-opus-5 Signed-off-by: Justin Hammond --- arch/risc-v/src/eic7700x/eic7700x_reset.c | 430 ++++++++++++++++++ arch/risc-v/src/eic7700x/eic7700x_reset.h | 23 + arch/risc-v/src/eic7700x/eic7700x_reset_ops.c | 3 + 3 files changed, 456 insertions(+) diff --git a/arch/risc-v/src/eic7700x/eic7700x_reset.c b/arch/risc-v/src/eic7700x/eic7700x_reset.c index 479a3e26155..fa75ba170f6 100644 --- a/arch/risc-v/src/eic7700x/eic7700x_reset.c +++ b/arch/risc-v/src/eic7700x/eic7700x_reset.c @@ -34,6 +34,10 @@ #include #include +#ifdef CONFIG_RESET_PROCFS +# include +# include +#endif #include "riscv_internal.h" #include "eic7700x_reset.h" @@ -95,6 +99,13 @@ static struct reset_controller_dev g_eic7700x_rcdev = { .name = EIC7700X_RESET_CONTROLLER, .ops = &g_eic7700x_reset_ops, +#ifdef CONFIG_RESET_PROCFS + /* The id space, not the line count: an id is a register index times + * thirty two plus a bit, and most of it names nothing. + */ + + .nlines = EIC7700X_RESET_ID(EIC7700X_RESET_NREGS, 0), +#endif }; /**************************************************************************** @@ -195,6 +206,425 @@ static_assert(EIC7700X_RESET_CTRL(EIC7700X_RESET_NREGS - 1) == * Private Functions ****************************************************************************/ +#ifdef CONFIG_RESET_PROCFS + +/* One reset line and the manual's name for it. Only built when the procfs + * entry is, since nothing else needs a line to have a name at run time: the + * enumeration carries the names everywhere else and does not survive + * compilation. + */ + +struct eic7700x_reset_name_s +{ + FAR const char *name; + uint16_t id; +}; + +#define RSTNAME(i, n) \ + { \ + .name = (n), .id = (i) \ + } + +static const struct eic7700x_reset_name_s g_eic7700x_reset_names[] = +{ + RSTNAME(EIC7700X_RESET_NOC_NSP, "noc_nsp"), + RSTNAME(EIC7700X_RESET_NOC_CFG, "noc_cfg"), + RSTNAME(EIC7700X_RESET_RNOC_NSP, "rnoc_nsp"), + RSTNAME(EIC7700X_RESET_SNOC_TCU_A, "snoc_tcu_a"), + RSTNAME(EIC7700X_RESET_SNOC_U84_A, "snoc_u84_a"), + RSTNAME(EIC7700X_RESET_SNOC_PCIET_XS, "snoc_pciet_xs"), + RSTNAME(EIC7700X_RESET_SNOC_PCIET_XM, "snoc_pciet_xm"), + RSTNAME(EIC7700X_RESET_SNOC_PCIET_P, "snoc_pciet_p"), + RSTNAME(EIC7700X_RESET_SNOC_NPU_A, "snoc_npu_a"), + RSTNAME(EIC7700X_RESET_SNOC_JTAG_P, "snoc_jtag_p"), + RSTNAME(EIC7700X_RESET_SNOC_DSPT_A, "snoc_dspt_a"), + RSTNAME(EIC7700X_RESET_SNOC_DDRC1_P2_A, "snoc_ddrc1_p2_a"), + RSTNAME(EIC7700X_RESET_SNOC_DDRC1_P1_A, "snoc_ddrc1_p1_a"), + RSTNAME(EIC7700X_RESET_SNOC_DDRC0_P2_A, "snoc_ddrc0_p2_a"), + RSTNAME(EIC7700X_RESET_SNOC_DDRC0_P1_A, "snoc_ddrc0_p1_a"), + RSTNAME(EIC7700X_RESET_SNOC_D2D_A, "snoc_d2d_a"), + RSTNAME(EIC7700X_RESET_SNOC_AON_A, "snoc_aon_a"), + RSTNAME(EIC7700X_RESET_GPU_AXI, "gpu_axi"), + RSTNAME(EIC7700X_RESET_GPU_CFG, "gpu_cfg"), + RSTNAME(EIC7700X_RESET_GPU_GRAY, "gpu_gray"), + RSTNAME(EIC7700X_RESET_GPU_JONES, "gpu_jones"), + RSTNAME(EIC7700X_RESET_GPU_SPU, "gpu_spu"), + RSTNAME(EIC7700X_RESET_DSP_AXI, "dsp_axi"), + RSTNAME(EIC7700X_RESET_DSP_CFG, "dsp_cfg"), + RSTNAME(EIC7700X_RESET_DSP_DIV4, "dsp_div4"), + RSTNAME(EIC7700X_RESET_DSP_DIV0, "dsp_div0"), + RSTNAME(EIC7700X_RESET_DSP_DIV1, "dsp_div1"), + RSTNAME(EIC7700X_RESET_DSP_DIV2, "dsp_div2"), + RSTNAME(EIC7700X_RESET_DSP_DIV3, "dsp_div3"), + RSTNAME(EIC7700X_RESET_D2D_AXI, "d2d_axi"), + RSTNAME(EIC7700X_RESET_D2D_CFG, "d2d_cfg"), + RSTNAME(EIC7700X_RESET_D2D_P, "d2d_p"), + RSTNAME(EIC7700X_RESET_D2D_RAW_PCS, "d2d_raw_pcs"), + RSTNAME(EIC7700X_RESET_D2D_RX, "d2d_rx"), + RSTNAME(EIC7700X_RESET_D2D_TX, "d2d_tx"), + RSTNAME(EIC7700X_RESET_D2D_CORE, "d2d_core"), + RSTNAME(EIC7700X_RESET_D2D_SUBSYS, "d2d_subsys"), + RSTNAME(EIC7700X_RESET_DDR1_P0_A, "ddr1_p0_a"), + RSTNAME(EIC7700X_RESET_DDR1_P1_A, "ddr1_p1_a"), + RSTNAME(EIC7700X_RESET_DDR1_P2_A, "ddr1_p2_a"), + RSTNAME(EIC7700X_RESET_DDR1_P3_A, "ddr1_p3_a"), + RSTNAME(EIC7700X_RESET_DDR1_P4_A, "ddr1_p4_a"), + RSTNAME(EIC7700X_RESET_DDR1_TRACE_A, "ddr1_trace_a"), + RSTNAME(EIC7700X_RESET_DDR1_PMP_SOFT, "ddr1_pmp_soft"), + RSTNAME(EIC7700X_RESET_DDR0_P0_A, "ddr0_p0_a"), + RSTNAME(EIC7700X_RESET_DDR0_P1_A, "ddr0_p1_a"), + RSTNAME(EIC7700X_RESET_DDR0_P2_A, "ddr0_p2_a"), + RSTNAME(EIC7700X_RESET_DDR0_P3_A, "ddr0_p3_a"), + RSTNAME(EIC7700X_RESET_DDR0_P4_A, "ddr0_p4_a"), + RSTNAME(EIC7700X_RESET_DDR_CFG, "ddr_cfg"), + RSTNAME(EIC7700X_RESET_DDR0_TRACE_A, "ddr0_trace_a"), + RSTNAME(EIC7700X_RESET_DDR_CORE, "ddr_core"), + RSTNAME(EIC7700X_RESET_DDR0_PMP_SOFT, "ddr0_pmp_soft"), + RSTNAME(EIC7700X_RESET_DDR_P, "ddr_p"), + RSTNAME(EIC7700X_RESET_TCU_AXI, "tcu_axi"), + RSTNAME(EIC7700X_RESET_TCU_CFG, "tcu_cfg"), + RSTNAME(EIC7700X_RESET_TCU_TBU0, "tcu_tbu0"), + RSTNAME(EIC7700X_RESET_TCU_TBU1, "tcu_tbu1"), + RSTNAME(EIC7700X_RESET_TCU_TBU2, "tcu_tbu2"), + RSTNAME(EIC7700X_RESET_TCU_TBU3, "tcu_tbu3"), + RSTNAME(EIC7700X_RESET_TCU_TBU4, "tcu_tbu4"), + RSTNAME(EIC7700X_RESET_TCU_TBU5, "tcu_tbu5"), + RSTNAME(EIC7700X_RESET_TCU_TBU6, "tcu_tbu6"), + RSTNAME(EIC7700X_RESET_TCU_TBU7, "tcu_tbu7"), + RSTNAME(EIC7700X_RESET_TCU_TBU8, "tcu_tbu8"), + RSTNAME(EIC7700X_RESET_TCU_TBU9, "tcu_tbu9"), + RSTNAME(EIC7700X_RESET_TCU_TBU10, "tcu_tbu10"), + RSTNAME(EIC7700X_RESET_TCU_TBU11, "tcu_tbu11"), + RSTNAME(EIC7700X_RESET_TCU_TBU12, "tcu_tbu12"), + RSTNAME(EIC7700X_RESET_TCU_TBU13, "tcu_tbu13"), + RSTNAME(EIC7700X_RESET_TCU_TBU14, "tcu_tbu14"), + RSTNAME(EIC7700X_RESET_TCU_TBU15, "tcu_tbu15"), + RSTNAME(EIC7700X_RESET_TCU_TBU16, "tcu_tbu16"), + RSTNAME(EIC7700X_RESET_NPU_AXI, "npu_axi"), + RSTNAME(EIC7700X_RESET_NPU_CFG, "npu_cfg"), + RSTNAME(EIC7700X_RESET_NPU_CORE, "npu_core"), + RSTNAME(EIC7700X_RESET_NPU_E31CORE, "npu_e31core"), + RSTNAME(EIC7700X_RESET_NPU_E31BUS, "npu_e31bus"), + RSTNAME(EIC7700X_RESET_NPU_E31DBG, "npu_e31dbg"), + RSTNAME(EIC7700X_RESET_NPU_LLC, "npu_llc"), + RSTNAME(EIC7700X_RESET_HSP_AXI, "hsp_axi"), + RSTNAME(EIC7700X_RESET_HSP_CFG, "hsp_cfg"), + RSTNAME(EIC7700X_RESET_HSP_POR, "hsp_por"), + RSTNAME(EIC7700X_RESET_MSHC0_PHY, "mshc0_phy"), + RSTNAME(EIC7700X_RESET_MSHC1_PHY, "mshc1_phy"), + RSTNAME(EIC7700X_RESET_MSHC2_PHY, "mshc2_phy"), + RSTNAME(EIC7700X_RESET_MSHC0_TXRX, "mshc0_txrx"), + RSTNAME(EIC7700X_RESET_MSHC1_TXRX, "mshc1_txrx"), + RSTNAME(EIC7700X_RESET_MSHC2_TXRX, "mshc2_txrx"), + RSTNAME(EIC7700X_RESET_SATA_ASIC0, "sata_asic0"), + RSTNAME(EIC7700X_RESET_SATA_OOB, "sata_oob"), + RSTNAME(EIC7700X_RESET_SATA_PMALIVE, "sata_pmalive"), + RSTNAME(EIC7700X_RESET_SATA_RBC, "sata_rbc"), + RSTNAME(EIC7700X_RESET_DMA0, "dma0"), + RSTNAME(EIC7700X_RESET_HSP_DMA0, "hsp_dma0"), + RSTNAME(EIC7700X_RESET_USB0_VAUX, "usb0_vaux"), + RSTNAME(EIC7700X_RESET_USB1_VAUX, "usb1_vaux"), + RSTNAME(EIC7700X_RESET_HSP_SD1_P, "hsp_sd1_p"), + RSTNAME(EIC7700X_RESET_HSP_SD0_P, "hsp_sd0_p"), + RSTNAME(EIC7700X_RESET_HSP_EMMC_P, "hsp_emmc_p"), + RSTNAME(EIC7700X_RESET_HSP_DMA_P, "hsp_dma_p"), + RSTNAME(EIC7700X_RESET_HSP_SD1_A, "hsp_sd1_a"), + RSTNAME(EIC7700X_RESET_HSP_SD0_A, "hsp_sd0_a"), + RSTNAME(EIC7700X_RESET_HSP_EMMC_A, "hsp_emmc_a"), + RSTNAME(EIC7700X_RESET_HSP_DMA_A, "hsp_dma_a"), + RSTNAME(EIC7700X_RESET_HSP_ETH1_A, "hsp_eth1_a"), + RSTNAME(EIC7700X_RESET_HSP_ETH0_A, "hsp_eth0_a"), + RSTNAME(EIC7700X_RESET_HSP_SATA_A, "hsp_sata_a"), + RSTNAME(EIC7700X_RESET_PCIE_CFG, "pcie_cfg"), + RSTNAME(EIC7700X_RESET_PCIE_POWERUP, "pcie_powerup"), + RSTNAME(EIC7700X_RESET_PCIE_PERST, "pcie_perst"), + RSTNAME(EIC7700X_RESET_I2C0, "i2c0"), + RSTNAME(EIC7700X_RESET_I2C1, "i2c1"), + RSTNAME(EIC7700X_RESET_I2C2, "i2c2"), + RSTNAME(EIC7700X_RESET_I2C3, "i2c3"), + RSTNAME(EIC7700X_RESET_I2C4, "i2c4"), + RSTNAME(EIC7700X_RESET_I2C5, "i2c5"), + RSTNAME(EIC7700X_RESET_I2C6, "i2c6"), + RSTNAME(EIC7700X_RESET_I2C7, "i2c7"), + RSTNAME(EIC7700X_RESET_I2C8, "i2c8"), + RSTNAME(EIC7700X_RESET_I2C9, "i2c9"), + RSTNAME(EIC7700X_RESET_FAN, "fan"), + RSTNAME(EIC7700X_RESET_PVT_LSP, "pvt_lsp"), + RSTNAME(EIC7700X_RESET_PVT_DDR, "pvt_ddr"), + RSTNAME(EIC7700X_RESET_MBOX0, "mbox0"), + RSTNAME(EIC7700X_RESET_MBOX1, "mbox1"), + RSTNAME(EIC7700X_RESET_MBOX2, "mbox2"), + RSTNAME(EIC7700X_RESET_MBOX3, "mbox3"), + RSTNAME(EIC7700X_RESET_MBOX4, "mbox4"), + RSTNAME(EIC7700X_RESET_MBOX5, "mbox5"), + RSTNAME(EIC7700X_RESET_MBOX6, "mbox6"), + RSTNAME(EIC7700X_RESET_MBOX7, "mbox7"), + RSTNAME(EIC7700X_RESET_MBOX8, "mbox8"), + RSTNAME(EIC7700X_RESET_MBOX9, "mbox9"), + RSTNAME(EIC7700X_RESET_MBOX10, "mbox10"), + RSTNAME(EIC7700X_RESET_MBOX11, "mbox11"), + RSTNAME(EIC7700X_RESET_MBOX12, "mbox12"), + RSTNAME(EIC7700X_RESET_MBOX13, "mbox13"), + RSTNAME(EIC7700X_RESET_MBOX14, "mbox14"), + RSTNAME(EIC7700X_RESET_MBOX15, "mbox15"), + RSTNAME(EIC7700X_RESET_UART0, "uart0"), + RSTNAME(EIC7700X_RESET_UART1, "uart1"), + RSTNAME(EIC7700X_RESET_UART2, "uart2"), + RSTNAME(EIC7700X_RESET_UART3, "uart3"), + RSTNAME(EIC7700X_RESET_UART4, "uart4"), + RSTNAME(EIC7700X_RESET_GPIO0, "gpio0"), + RSTNAME(EIC7700X_RESET_GPIO1, "gpio1"), + RSTNAME(EIC7700X_RESET_LSP_TIMER, "lsp_timer"), + RSTNAME(EIC7700X_RESET_SSI0, "ssi0"), + RSTNAME(EIC7700X_RESET_SSI1, "ssi1"), + RSTNAME(EIC7700X_RESET_WDT0, "wdt0"), + RSTNAME(EIC7700X_RESET_WDT1, "wdt1"), + RSTNAME(EIC7700X_RESET_WDT2, "wdt2"), + RSTNAME(EIC7700X_RESET_WDT3, "wdt3"), + RSTNAME(EIC7700X_RESET_LSP_CFG, "lsp_cfg"), + RSTNAME(EIC7700X_RESET_U84_CORE0, "u84_core0"), + RSTNAME(EIC7700X_RESET_U84_CORE1, "u84_core1"), + RSTNAME(EIC7700X_RESET_U84_CORE2, "u84_core2"), + RSTNAME(EIC7700X_RESET_U84_CORE3, "u84_core3"), + RSTNAME(EIC7700X_RESET_U84_BUS, "u84_bus"), + RSTNAME(EIC7700X_RESET_U84_DBG, "u84_dbg"), + RSTNAME(EIC7700X_RESET_U84_TRACECOM, "u84_tracecom"), + RSTNAME(EIC7700X_RESET_U84_TRACE0, "u84_trace0"), + RSTNAME(EIC7700X_RESET_U84_TRACE1, "u84_trace1"), + RSTNAME(EIC7700X_RESET_U84_TRACE2, "u84_trace2"), + RSTNAME(EIC7700X_RESET_U84_TRACE3, "u84_trace3"), + RSTNAME(EIC7700X_RESET_SCPU_CORE, "scpu_core"), + RSTNAME(EIC7700X_RESET_SCPU_BUS, "scpu_bus"), + RSTNAME(EIC7700X_RESET_SCPU_DBG, "scpu_dbg"), + RSTNAME(EIC7700X_RESET_LPCPU_CORE, "lpcpu_core"), + RSTNAME(EIC7700X_RESET_LPCPU_BUS, "lpcpu_bus"), + RSTNAME(EIC7700X_RESET_LPCPU_DBG, "lpcpu_dbg"), + RSTNAME(EIC7700X_RESET_VC_CFG, "vc_cfg"), + RSTNAME(EIC7700X_RESET_VC_AXI, "vc_axi"), + RSTNAME(EIC7700X_RESET_VC_MONCFG, "vc_moncfg"), + RSTNAME(EIC7700X_RESET_JD_CFG, "jd_cfg"), + RSTNAME(EIC7700X_RESET_JD_AXI, "jd_axi"), + RSTNAME(EIC7700X_RESET_JE_CFG, "je_cfg"), + RSTNAME(EIC7700X_RESET_JE_AXI, "je_axi"), + RSTNAME(EIC7700X_RESET_VD_CFG, "vd_cfg"), + RSTNAME(EIC7700X_RESET_VD_AXI, "vd_axi"), + RSTNAME(EIC7700X_RESET_VE_CFG, "ve_cfg"), + RSTNAME(EIC7700X_RESET_VE_AXI, "ve_axi"), + RSTNAME(EIC7700X_RESET_G2D_CORE, "g2d_core"), + RSTNAME(EIC7700X_RESET_G2D_CFG, "g2d_cfg"), + RSTNAME(EIC7700X_RESET_G2D_AXI, "g2d_axi"), + RSTNAME(EIC7700X_RESET_VI_AXI, "vi_axi"), + RSTNAME(EIC7700X_RESET_VI_CFG, "vi_cfg"), + RSTNAME(EIC7700X_RESET_VI_DWE, "vi_dwe"), + RSTNAME(EIC7700X_RESET_VI_DVP, "vi_dvp"), + RSTNAME(EIC7700X_RESET_VI_ISP0, "vi_isp0"), + RSTNAME(EIC7700X_RESET_VI_ISP1, "vi_isp1"), + RSTNAME(EIC7700X_RESET_VI_SHUTTER0, "vi_shutter0"), + RSTNAME(EIC7700X_RESET_VI_SHUTTER1, "vi_shutter1"), + RSTNAME(EIC7700X_RESET_VI_SHUTTER2, "vi_shutter2"), + RSTNAME(EIC7700X_RESET_VI_SHUTTER3, "vi_shutter3"), + RSTNAME(EIC7700X_RESET_VI_SHUTTER4, "vi_shutter4"), + RSTNAME(EIC7700X_RESET_VI_SHUTTER5, "vi_shutter5"), + RSTNAME(EIC7700X_RESET_VO_MIPI_P, "vo_mipi_p"), + RSTNAME(EIC7700X_RESET_VO_P, "vo_p"), + RSTNAME(EIC7700X_RESET_VO_HDMI_P, "vo_hdmi_p"), + RSTNAME(EIC7700X_RESET_HDMI_PHYCTRL, "hdmi_phyctrl"), + RSTNAME(EIC7700X_RESET_VO_HDMI, "vo_hdmi"), + RSTNAME(EIC7700X_RESET_VO_I2S, "vo_i2s"), + RSTNAME(EIC7700X_RESET_VO_I2S_P, "vo_i2s_p"), + RSTNAME(EIC7700X_RESET_VO_AXI, "vo_axi"), + RSTNAME(EIC7700X_RESET_VO_CFG, "vo_cfg"), + RSTNAME(EIC7700X_RESET_VO_DC, "vo_dc"), + RSTNAME(EIC7700X_RESET_VO_DC_P, "vo_dc_p"), + RSTNAME(EIC7700X_RESET_BOOTSPI_H, "bootspi_h"), + RSTNAME(EIC7700X_RESET_BOOTSPI, "bootspi"), + RSTNAME(EIC7700X_RESET_I2C1_P, "i2c1_p"), + RSTNAME(EIC7700X_RESET_I2C0_P, "i2c0_p"), + RSTNAME(EIC7700X_RESET_DMA1_A, "dma1_a"), + RSTNAME(EIC7700X_RESET_DMA1_H, "dma1_h"), + RSTNAME(EIC7700X_RESET_FPRT_H, "fprt_h"), + RSTNAME(EIC7700X_RESET_HBLOCK_H, "hblock_h"), + RSTNAME(EIC7700X_RESET_SECSR_H, "secsr_h"), + RSTNAME(EIC7700X_RESET_OTP_P, "otp_p"), + RSTNAME(EIC7700X_RESET_PKA_H, "pka_h"), + RSTNAME(EIC7700X_RESET_SPACC, "spacc"), + RSTNAME(EIC7700X_RESET_TRNG_H, "trng_h"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT0, "timer0_cnt0"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT1, "timer0_cnt1"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT2, "timer0_cnt2"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT3, "timer0_cnt3"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT4, "timer0_cnt4"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT5, "timer0_cnt5"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT6, "timer0_cnt6"), + RSTNAME(EIC7700X_RESET_TIMER0_CNT7, "timer0_cnt7"), + RSTNAME(EIC7700X_RESET_TIMER0_P, "timer0_p"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT0, "timer1_cnt0"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT1, "timer1_cnt1"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT2, "timer1_cnt2"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT3, "timer1_cnt3"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT4, "timer1_cnt4"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT5, "timer1_cnt5"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT6, "timer1_cnt6"), + RSTNAME(EIC7700X_RESET_TIMER1_CNT7, "timer1_cnt7"), + RSTNAME(EIC7700X_RESET_TIMER1_P, "timer1_p"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT0, "timer2_cnt0"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT1, "timer2_cnt1"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT2, "timer2_cnt2"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT3, "timer2_cnt3"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT4, "timer2_cnt4"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT5, "timer2_cnt5"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT6, "timer2_cnt6"), + RSTNAME(EIC7700X_RESET_TIMER2_CNT7, "timer2_cnt7"), + RSTNAME(EIC7700X_RESET_TIMER2_P, "timer2_p"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT0, "timer3_cnt0"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT1, "timer3_cnt1"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT2, "timer3_cnt2"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT3, "timer3_cnt3"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT4, "timer3_cnt4"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT5, "timer3_cnt5"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT6, "timer3_cnt6"), + RSTNAME(EIC7700X_RESET_TIMER3_CNT7, "timer3_cnt7"), + RSTNAME(EIC7700X_RESET_TIMER3_P, "timer3_p"), + RSTNAME(EIC7700X_RESET_RTC, "rtc"), + RSTNAME(EIC7700X_RESET_MNOC_SNOC_NSP, "mnoc_snoc_nsp"), + RSTNAME(EIC7700X_RESET_MNOC_VC_A, "mnoc_vc_a"), + RSTNAME(EIC7700X_RESET_MNOC_CFG, "mnoc_cfg"), + RSTNAME(EIC7700X_RESET_MNOC_HSP_A, "mnoc_hsp_a"), + RSTNAME(EIC7700X_RESET_MNOC_GPU_A, "mnoc_gpu_a"), + RSTNAME(EIC7700X_RESET_MNOC_DDRC1_P3_A, "mnoc_ddrc1_p3_a"), + RSTNAME(EIC7700X_RESET_MNOC_DDRC0_P3_A, "mnoc_ddrc0_p3_a"), + RSTNAME(EIC7700X_RESET_RNOC_VO_A, "rnoc_vo_a"), + RSTNAME(EIC7700X_RESET_RNOC_VI_A, "rnoc_vi_a"), + RSTNAME(EIC7700X_RESET_RNOC_SNOC_NSP, "rnoc_snoc_nsp"), + RSTNAME(EIC7700X_RESET_RNOC_CFG, "rnoc_cfg"), + RSTNAME(EIC7700X_RESET_RNOC_DDRC1_P4_A, "rnoc_ddrc1_p4_a"), + RSTNAME(EIC7700X_RESET_RNOC_DDRC0_P4_A, "rnoc_ddrc0_p4_a"), + RSTNAME(EIC7700X_RESET_CNOC_VO_CFG, "cnoc_vo_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_VI_CFG, "cnoc_vi_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_VC_CFG, "cnoc_vc_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_TCU_CFG, "cnoc_tcu_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_PCIET_CFG, "cnoc_pciet_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_NPU_CFG, "cnoc_npu_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_LSP_CFG, "cnoc_lsp_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_HSP_CFG, "cnoc_hsp_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_GPU_CFG, "cnoc_gpu_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_DSPT_CFG, "cnoc_dspt_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_DDRT1_CFG, "cnoc_ddrt1_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_DDRT0_CFG, "cnoc_ddrt0_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_D2D_CFG, "cnoc_d2d_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_CFG, "cnoc_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_CLMM_CFG, "cnoc_clmm_cfg"), + RSTNAME(EIC7700X_RESET_CNOC_AON_CFG, "cnoc_aon_cfg"), + RSTNAME(EIC7700X_RESET_LNOC_CFG, "lnoc_cfg"), + RSTNAME(EIC7700X_RESET_LNOC_NPU_LLC_A, "lnoc_npu_llc_a"), + RSTNAME(EIC7700X_RESET_LNOC_DDRC1_P0_A, "lnoc_ddrc1_p0_a"), + RSTNAME(EIC7700X_RESET_LNOC_DDRC0_P0_A, "lnoc_ddrc0_p0_a"), + RSTNAME(EIC7700X_RESET_PIPE_TBU2SNOC, "pipe_tbu2snoc"), + RSTNAME(EIC7700X_RESET_PIPE_TBU2MNOC, "pipe_tbu2mnoc"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2PCIE, "pipe_snoc2pcie"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2MNOC, "pipe_snoc2mnoc"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2DDR1P1, "pipe_snoc2ddr1p1"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2DDR0P1, "pipe_snoc2ddr0p1"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2DDR1P2, "pipe_snoc2ddr1p2"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2DDR0P2, "pipe_snoc2ddr0p2"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2D2D, "pipe_snoc2d2d"), + RSTNAME(EIC7700X_RESET_PIPE_MCPU2SNOC, "pipe_mcpu2snoc"), + RSTNAME(EIC7700X_RESET_PIPE_MCPU2SNOCSP, "pipe_mcpu2snocsp"), + RSTNAME(EIC7700X_RESET_PIPE_MNOC2SNOC, "pipe_mnoc2snoc"), + RSTNAME(EIC7700X_RESET_PIPE_LNOC2DDR1, "pipe_lnoc2ddr1"), + RSTNAME(EIC7700X_RESET_PIPE_LNOC2DDR0, "pipe_lnoc2ddr0"), + RSTNAME(EIC7700X_RESET_PIPE_RNOC2DDR1, "pipe_rnoc2ddr1"), + RSTNAME(EIC7700X_RESET_PIPE_RNOC2DDR0, "pipe_rnoc2ddr0"), + RSTNAME(EIC7700X_RESET_PIPE_MNOC2DDR0, "pipe_mnoc2ddr0"), + RSTNAME(EIC7700X_RESET_PIPE_SNOC2DSP, "pipe_snoc2dsp"), + RSTNAME(EIC7700X_RESET_PIPE_DSP2SNOC, "pipe_dsp2snoc"), + RSTNAME(EIC7700X_RESET_PIPE_DSP2TCU, "pipe_dsp2tcu"), + RSTNAME(EIC7700X_RESET_PIPE_PCIE2TCU, "pipe_pcie2tcu"), + RSTNAME(EIC7700X_RESET_PIPE_VI2RNOC, "pipe_vi2rnoc"), + RSTNAME(EIC7700X_RESET_PIPE_VO2RNOC, "pipe_vo2rnoc"), + RSTNAME(EIC7700X_RESET_PIPE_GPU2MNOC, "pipe_gpu2mnoc"), + RSTNAME(EIC7700X_RESET_PIPE_VC2MNOC, "pipe_vc2mnoc"), + RSTNAME(EIC7700X_RESET_TBU_AON_A, "tbu_aon_a"), + RSTNAME(EIC7700X_RESET_TBU_PCIET_TBU3, "tbu_pciet_tbu3"), + RSTNAME(EIC7700X_RESET_TBU_HSP_A, "tbu_hsp_a"), + RSTNAME(EIC7700X_RESET_TBU_VI_AXI, "tbu_vi_axi"), + RSTNAME(EIC7700X_RESET_EXT_D2D_STATUS, "ext_d2d_status"), + RSTNAME(EIC7700X_RESET_TESTMUX, "testmux"), + RSTNAME(EIC7700X_RESET_SPI_SLV, "spi_slv"), +}; + +static_assert(nitems(g_eic7700x_reset_names) == 324, + "reset name table does not cover every line"); + +/* eic7700x_reset_getline() binary searches this table, so it has to be in + * id order. Checking every pair at compile time is not expressible here; + * the ends catch a table rebuilt in the wrong order. + */ + +static_assert(EIC7700X_RESET_NOC_NSP < EIC7700X_RESET_SPI_SLV, + "reset name table must be sorted by id"); + +/**************************************************************************** + * Name: eic7700x_reset_getline + * + * Description: + * Describe one reset line for /proc/reset: its name, and the register + * and bit it lives in. The state is not reported here; the framework + * asks status() for it. + * + * The ids are a register index times thirty two plus a bit, so most of + * the space names nothing. The table is sorted by id, which makes the + * lookup a binary search and reports a gap as -ENODEV. + * + * Reads only. + * + * Input Parameters: + * rcdev - The reset controller + * id - The reset line id + * info - Receives the name, and the register and bit as extra text + * + * Returned Value: + * OK, or -ENODEV if the id names no line. + * + ****************************************************************************/ + +int eic7700x_reset_getline(FAR struct reset_controller_dev *rcdev, + unsigned int id, + FAR struct reset_lineinfo_s *info) +{ + unsigned int low = 0; + unsigned int high = nitems(g_eic7700x_reset_names); + + while (low < high) + { + unsigned int mid = low + (high - low) / 2; + unsigned int found = g_eic7700x_reset_names[mid].id; + + if (found == id) + { + strlcpy(info->name, g_eic7700x_reset_names[mid].name, + sizeof(info->name)); + snprintf(info->extra, sizeof(info->extra), "reg:0x%03x bit:%u", + (unsigned int)(0x400 + EIC7700X_RESET_REGOF(id) * 4), + EIC7700X_RESET_BITOF(id)); + return OK; + } + + if (found < id) + { + low = mid + 1; + } + else + { + high = mid; + } + } + + return -ENODEV; +} + +#endif /* CONFIG_RESET_PROCFS */ + /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/arch/risc-v/src/eic7700x/eic7700x_reset.h b/arch/risc-v/src/eic7700x/eic7700x_reset.h index 68c6cc5091a..63b2af12eca 100644 --- a/arch/risc-v/src/eic7700x/eic7700x_reset.h +++ b/arch/risc-v/src/eic7700x/eic7700x_reset.h @@ -110,6 +110,29 @@ int eic7700x_reset_initialize(void); unsigned int eic7700x_reset_count(FAR unsigned int *held); +#ifdef CONFIG_RESET_PROCFS +/**************************************************************************** + * Name: eic7700x_reset_getline + * + * Description: + * Describe one reset line for /proc/reset. Lives beside the name table + * rather than beside the operations, since that is what it reads. + * + * Input Parameters: + * rcdev - The reset controller + * id - The reset line id + * info - Receives the name, and the register and bit as extra text + * + * Returned Value: + * OK, or -ENODEV if the id names no line. + * + ****************************************************************************/ + +int eic7700x_reset_getline(FAR struct reset_controller_dev *rcdev, + unsigned int id, + FAR struct reset_lineinfo_s *info); +#endif + #undef EXTERN #ifdef __cplusplus } diff --git a/arch/risc-v/src/eic7700x/eic7700x_reset_ops.c b/arch/risc-v/src/eic7700x/eic7700x_reset_ops.c index 062a3ea0af2..6d026f57512 100644 --- a/arch/risc-v/src/eic7700x/eic7700x_reset_ops.c +++ b/arch/risc-v/src/eic7700x/eic7700x_reset_ops.c @@ -287,4 +287,7 @@ const struct reset_control_ops g_eic7700x_reset_ops = .assert = eic7700x_reset_assert, .deassert = eic7700x_reset_deassert, .status = eic7700x_reset_status, +#ifdef CONFIG_RESET_PROCFS + .get_line = eic7700x_reset_getline, +#endif };