|  | 
|  | 1 | +// SPDX-License-Identifier: BSD-3-Clause | 
|  | 2 | +/* | 
|  | 3 | + * Copyright (c) 2023, Linaro Ltd. | 
|  | 4 | + * Copyright (c) 2025, Luca Weiss | 
|  | 5 | + */ | 
|  | 6 | + | 
|  | 7 | +#include <sys/mman.h> | 
|  | 8 | +#include <err.h> | 
|  | 9 | +#include <fcntl.h> | 
|  | 10 | +#include <stdio.h> | 
|  | 11 | +#include <stdint.h> | 
|  | 12 | +#include <stdlib.h> | 
|  | 13 | +#include <string.h> | 
|  | 14 | +#include <unistd.h> | 
|  | 15 | + | 
|  | 16 | +#include "debugcc.h" | 
|  | 17 | + | 
|  | 18 | +static struct gcc_mux gcc = { | 
|  | 19 | +	.mux = { | 
|  | 20 | +		.phys =	0xfc400000, | 
|  | 21 | +		.size = 0x4000, | 
|  | 22 | + | 
|  | 23 | +		.measure = measure_gcc, | 
|  | 24 | + | 
|  | 25 | +        .enable_reg = 0x1880, | 
|  | 26 | +		.enable_mask = BIT(16), | 
|  | 27 | + | 
|  | 28 | +		.mux_reg = 0x1880, | 
|  | 29 | +		.mux_mask = 0x1ff, | 
|  | 30 | + | 
|  | 31 | +		.div_reg = 0x1880, | 
|  | 32 | +		.div_mask = 0xf000, | 
|  | 33 | +		.div_val = 2, // FIXME | 
|  | 34 | +	}, | 
|  | 35 | + | 
|  | 36 | +	.xo_div4_reg = 0x10c8, | 
|  | 37 | +	.debug_ctl_reg = 0x1884, | 
|  | 38 | +	.debug_status_reg = 0x1888, | 
|  | 39 | +}; | 
|  | 40 | + | 
|  | 41 | +static struct debug_mux mmss = { // FIXME | 
|  | 42 | +	.phys = 0xfd8c0000, | 
|  | 43 | +	.size = 0x40000, | 
|  | 44 | +	.block_name = "mmss", | 
|  | 45 | + | 
|  | 46 | +	.measure = measure_leaf, | 
|  | 47 | +	.parent = &gcc.mux, | 
|  | 48 | +	.parent_mux_val = 0x6a, // FIXME | 
|  | 49 | + | 
|  | 50 | +	.enable_reg = 0x14008, // FIXME | 
|  | 51 | +	.enable_mask = BIT(0), // FIXME | 
|  | 52 | + | 
|  | 53 | +	.mux_reg = 0x16000, // FIXME | 
|  | 54 | +	.mux_mask = 0xff, // FIXME | 
|  | 55 | +}; | 
|  | 56 | + | 
|  | 57 | +static struct debug_mux lpass = { // FIXME | 
|  | 58 | +	.phys = 0xfe000000, | 
|  | 59 | +	.size = 0x40000, | 
|  | 60 | +	.block_name = "lpass", | 
|  | 61 | + | 
|  | 62 | +	.measure = measure_leaf, | 
|  | 63 | +	.parent = &gcc.mux, | 
|  | 64 | +	.parent_mux_val = 0x6f, // FIXME | 
|  | 65 | + | 
|  | 66 | +	.enable_reg = 0xd004, // FIXME | 
|  | 67 | +	.enable_mask = BIT(0), // FIXME | 
|  | 68 | + | 
|  | 69 | +	.mux_reg = 0x11000, // FIXME | 
|  | 70 | +	.mux_mask = 0x1ff, // FIXME | 
|  | 71 | +}; | 
|  | 72 | + | 
|  | 73 | +// static struct debug_mux apcs = { // FIXME | 
|  | 74 | +// 	.phys = 0xf9011000, | 
|  | 75 | +// 	.size = 0x1000, | 
|  | 76 | +// 	.block_name = "apcs", | 
|  | 77 | +// | 
|  | 78 | +// 	.measure = measure_leaf, | 
|  | 79 | +// 	.parent = &gcc.mux, | 
|  | 80 | +// 	.parent_mux_val = 0x18d, // FIXME | 
|  | 81 | +// | 
|  | 82 | +// 	.enable_reg = 0x9274, // FIXME | 
|  | 83 | +// 	.enable_mask = BIT(0), // FIXME | 
|  | 84 | +// | 
|  | 85 | +// 	.mux_reg = 0x9564, // FIXME | 
|  | 86 | +// 	.mux_mask = 0xff, // FIXME | 
|  | 87 | +// }; | 
|  | 88 | + | 
|  | 89 | +static struct measure_clk msm8974_clocks[] = { | 
|  | 90 | +	/* GCC entries */ | 
|  | 91 | +	{ "gcc_pdm_ahb_clk", &gcc.mux, 0x00d0 }, | 
|  | 92 | +	{ "gcc_blsp2_qup1_i2c_apps_clk", &gcc.mux, 0x00ab }, | 
|  | 93 | +	{ "gcc_blsp2_qup3_spi_apps_clk", &gcc.mux, 0x00b3 }, | 
|  | 94 | +	{ "gcc_blsp2_uart5_apps_clk", &gcc.mux, 0x00be }, | 
|  | 95 | +	{ "gcc_usb30_master_clk", &gcc.mux, 0x0050 }, | 
|  | 96 | +	{ "gcc_blsp2_qup3_i2c_apps_clk", &gcc.mux, 0x00b4 }, | 
|  | 97 | +	{ "gcc_usb_hsic_system_clk", &gcc.mux, 0x0059 }, | 
|  | 98 | +	{ "gcc_sdcc1_cdccal_sleep_clk", &gcc.mux, 0x006a }, | 
|  | 99 | +	{ "gcc_sdcc1_cdccal_ff_clk", &gcc.mux, 0x006b }, | 
|  | 100 | +	{ "gcc_blsp2_uart3_apps_clk", &gcc.mux, 0x00b5 }, | 
|  | 101 | +	{ "gcc_usb_hsic_io_cal_clk", &gcc.mux, 0x005b }, | 
|  | 102 | +	{ "gcc_ce2_axi_clk", &gcc.mux, 0x0141 }, | 
|  | 103 | +	{ "gcc_sdcc3_ahb_clk", &gcc.mux, 0x0079 }, | 
|  | 104 | +	{ "gcc_blsp1_qup5_i2c_apps_clk", &gcc.mux, 0x009d }, | 
|  | 105 | +	{ "gcc_blsp1_qup1_spi_apps_clk", &gcc.mux, 0x008a }, | 
|  | 106 | +	{ "gcc_blsp2_uart4_apps_clk", &gcc.mux, 0x00ba }, | 
|  | 107 | +	{ "gcc_ce2_clk", &gcc.mux, 0x0140 }, | 
|  | 108 | +	{ "gcc_blsp1_uart2_apps_clk", &gcc.mux, 0x0091 }, | 
|  | 109 | +	{ "gcc_sdcc1_ahb_clk", &gcc.mux, 0x0069 }, | 
|  | 110 | +	{ "gcc_mss_cfg_ahb_clk", &gcc.mux, 0x0030 }, | 
|  | 111 | +	{ "gcc_tsif_ahb_clk", &gcc.mux, 0x00e8 }, | 
|  | 112 | +	{ "gcc_sdcc4_ahb_clk", &gcc.mux, 0x0081 }, | 
|  | 113 | +	{ "gcc_blsp1_qup4_spi_apps_clk", &gcc.mux, 0x0098 }, | 
|  | 114 | +	{ "gcc_blsp2_qup4_spi_apps_clk", &gcc.mux, 0x00b8 }, | 
|  | 115 | +	{ "gcc_blsp1_qup3_spi_apps_clk", &gcc.mux, 0x0093 }, | 
|  | 116 | +	{ "gcc_blsp1_qup6_i2c_apps_clk", &gcc.mux, 0x00a2 }, | 
|  | 117 | +	{ "gcc_blsp2_qup6_i2c_apps_clk", &gcc.mux, 0x00c2 }, | 
|  | 118 | +	{ "gcc_bam_dma_ahb_clk", &gcc.mux, 0x00e0 }, | 
|  | 119 | +	{ "gcc_sdcc3_apps_clk", &gcc.mux, 0x0078 }, | 
|  | 120 | +	{ "gcc_usb_hs_system_clk", &gcc.mux, 0x0060 }, | 
|  | 121 | +	{ "gcc_blsp1_ahb_clk", &gcc.mux, 0x0088 }, | 
|  | 122 | +	{ "gcc_sdcc1_apps_clk", &gcc.mux, 0x0068 }, | 
|  | 123 | +	{ "gcc_blsp2_qup5_i2c_apps_clk", &gcc.mux, 0x00bd }, | 
|  | 124 | +	{ "gcc_blsp1_uart4_apps_clk", &gcc.mux, 0x009a }, | 
|  | 125 | +	{ "gcc_blsp2_qup2_spi_apps_clk", &gcc.mux, 0x00ae }, | 
|  | 126 | +	{ "gcc_blsp2_qup6_spi_apps_clk", &gcc.mux, 0x00c1 }, | 
|  | 127 | +	{ "gcc_blsp2_uart2_apps_clk", &gcc.mux, 0x00b1 }, | 
|  | 128 | +	{ "gcc_blsp1_qup2_spi_apps_clk", &gcc.mux, 0x008e }, | 
|  | 129 | +	{ "gcc_usb_hsic_ahb_clk", &gcc.mux, 0x0058 }, | 
|  | 130 | +	{ "gcc_blsp1_uart3_apps_clk", &gcc.mux, 0x0095 }, | 
|  | 131 | +	{ "gcc_usb30_mock_utmi_clk", &gcc.mux, 0x0052 }, | 
|  | 132 | +	{ "gcc_ce1_axi_clk", &gcc.mux, 0x0139 }, | 
|  | 133 | +	{ "gcc_sdcc4_apps_clk", &gcc.mux, 0x0080 }, | 
|  | 134 | +	{ "gcc_blsp1_qup5_spi_apps_clk", &gcc.mux, 0x009c }, | 
|  | 135 | +	{ "gcc_usb_hs_ahb_clk", &gcc.mux, 0x0061 }, | 
|  | 136 | +	{ "gcc_blsp1_qup6_spi_apps_clk", &gcc.mux, 0x00a1 }, | 
|  | 137 | +	{ "gcc_blsp2_qup2_i2c_apps_clk", &gcc.mux, 0x00b0 }, | 
|  | 138 | +	{ "gcc_prng_ahb_clk", &gcc.mux, 0x00d8 }, | 
|  | 139 | +	{ "gcc_blsp1_qup3_i2c_apps_clk", &gcc.mux, 0x0094 }, | 
|  | 140 | +	{ "gcc_usb_hsic_clk", &gcc.mux, 0x005a }, | 
|  | 141 | +	{ "gcc_blsp1_uart6_apps_clk", &gcc.mux, 0x00a3 }, | 
|  | 142 | +	{ "gcc_sdcc2_apps_clk", &gcc.mux, 0x0070 }, | 
|  | 143 | +	{ "gcc_tsif_ref_clk", &gcc.mux, 0x00e9 }, | 
|  | 144 | +	{ "gcc_blsp1_uart1_apps_clk", &gcc.mux, 0x008c }, | 
|  | 145 | +	{ "gcc_blsp2_qup5_spi_apps_clk", &gcc.mux, 0x00bc }, | 
|  | 146 | +	{ "gcc_blsp1_qup4_i2c_apps_clk", &gcc.mux, 0x0099 }, | 
|  | 147 | +	{ "gcc_mmss_noc_cfg_ahb_clk", &gcc.mux, 0x002a }, | 
|  | 148 | +	{ "gcc_blsp2_ahb_clk", &gcc.mux, 0x00a8 }, | 
|  | 149 | +	{ "gcc_boot_rom_ahb_clk", &gcc.mux, 0x00f8 }, | 
|  | 150 | +	{ "gcc_ce1_ahb_clk", &gcc.mux, 0x013a }, | 
|  | 151 | +	{ "gcc_pdm2_clk", &gcc.mux, 0x00d2 }, | 
|  | 152 | +	{ "gcc_blsp2_qup4_i2c_apps_clk", &gcc.mux, 0x00b9 }, | 
|  | 153 | +	{ "gcc_ce2_ahb_clk", &gcc.mux, 0x0142 }, | 
|  | 154 | +	{ "gcc_blsp1_uart5_apps_clk", &gcc.mux, 0x009e }, | 
|  | 155 | +	{ "gcc_blsp2_qup1_spi_apps_clk", &gcc.mux, 0x00aa }, | 
|  | 156 | +	{ "gcc_blsp1_qup2_i2c_apps_clk", &gcc.mux, 0x0090 }, | 
|  | 157 | +	{ "gcc_blsp2_uart1_apps_clk", &gcc.mux, 0x00ac }, | 
|  | 158 | +	{ "gcc_blsp1_qup1_i2c_apps_clk", &gcc.mux, 0x008b }, | 
|  | 159 | +	{ "gcc_blsp2_uart6_apps_clk", &gcc.mux, 0x00c3 }, | 
|  | 160 | +	{ "gcc_sdcc2_ahb_clk", &gcc.mux, 0x0071 }, | 
|  | 161 | +	{ "gcc_usb30_sleep_clk", &gcc.mux, 0x0051 }, | 
|  | 162 | +	{ "gcc_usb2a_phy_sleep_clk", &gcc.mux, 0x0063 }, | 
|  | 163 | +	{ "gcc_usb2b_phy_sleep_clk", &gcc.mux, 0x0064 }, | 
|  | 164 | +	{ "gcc_sys_noc_usb3_axi_clk", &gcc.mux, 0x0001 }, | 
|  | 165 | +	{ "gcc_ocmem_noc_cfg_ahb_clk", &gcc.mux, 0x0029 }, | 
|  | 166 | +	{ "gcc_ce1_clk", &gcc.mux, 0x0138 }, | 
|  | 167 | +	{ "gcc_lpass_q6_axi_clk", &gcc.mux, 0x0160 }, | 
|  | 168 | +	{ "gcc_mss_q6_bimc_axi_clk", &gcc.mux, 0x0031 }, | 
|  | 169 | +	{ "cnoc_clk", &gcc.mux, 0x0008 }, | 
|  | 170 | +	{ "pnoc_clk", &gcc.mux, 0x0010 }, | 
|  | 171 | +	{ "snoc_clk", &gcc.mux, 0x0000 }, | 
|  | 172 | +	{ "bimc_clk", &gcc.mux, 0x0155 }, | 
|  | 173 | +	{ "wcnss_m_clk", &gcc.mux, 0x0198 }, | 
|  | 174 | +	/* MMSS entries */ | 
|  | 175 | +	{ "mmss_mmssnoc_axi_clk", &mmss, 0x0004 }, | 
|  | 176 | +	{ "ocmemnoc_clk", &mmss, 0x0007 }, | 
|  | 177 | +	{ "ocmemcx_ocmemnoc_clk", &mmss, 0x0009 }, | 
|  | 178 | +	{ "camss_cci_cci_ahb_clk", &mmss, 0x002e }, | 
|  | 179 | +	{ "camss_cci_cci_clk", &mmss, 0x002d }, | 
|  | 180 | +	{ "camss_csi0_ahb_clk", &mmss, 0x0042 }, | 
|  | 181 | +	{ "camss_csi0_clk", &mmss, 0x0041 }, | 
|  | 182 | +	{ "camss_csi0phy_clk", &mmss, 0x0043 }, | 
|  | 183 | +	{ "camss_csi0pix_clk", &mmss, 0x0045 }, | 
|  | 184 | +	{ "camss_csi0rdi_clk", &mmss, 0x0044 }, | 
|  | 185 | +	{ "camss_csi1_ahb_clk", &mmss, 0x0047 }, | 
|  | 186 | +	{ "camss_csi1_clk", &mmss, 0x0046 }, | 
|  | 187 | +	{ "camss_csi1phy_clk", &mmss, 0x0048 }, | 
|  | 188 | +	{ "camss_csi1pix_clk", &mmss, 0x004a }, | 
|  | 189 | +	{ "camss_csi1rdi_clk", &mmss, 0x0049 }, | 
|  | 190 | +	{ "camss_csi2_ahb_clk", &mmss, 0x004c }, | 
|  | 191 | +	{ "camss_csi2_clk", &mmss, 0x004b }, | 
|  | 192 | +	{ "camss_csi2phy_clk", &mmss, 0x004d }, | 
|  | 193 | +	{ "camss_csi2pix_clk", &mmss, 0x004f }, | 
|  | 194 | +	{ "camss_csi2rdi_clk", &mmss, 0x004e }, | 
|  | 195 | +	{ "camss_csi3_ahb_clk", &mmss, 0x0051 }, | 
|  | 196 | +	{ "camss_csi3_clk", &mmss, 0x0050 }, | 
|  | 197 | +	{ "camss_csi3phy_clk", &mmss, 0x0052 }, | 
|  | 198 | +	{ "camss_csi3pix_clk", &mmss, 0x0054 }, | 
|  | 199 | +	{ "camss_csi3rdi_clk", &mmss, 0x0053 }, | 
|  | 200 | +	{ "camss_csi_vfe0_clk", &mmss, 0x003f }, | 
|  | 201 | +	{ "camss_csi_vfe1_clk", &mmss, 0x0040 }, | 
|  | 202 | +	{ "camss_gp0_clk", &mmss, 0x0027 }, | 
|  | 203 | +	{ "camss_gp1_clk", &mmss, 0x0028 }, | 
|  | 204 | +	{ "camss_ispif_ahb_clk", &mmss, 0x0055 }, | 
|  | 205 | +	{ "camss_jpeg_jpeg0_clk", &mmss, 0x0032 }, | 
|  | 206 | +	{ "camss_jpeg_jpeg1_clk", &mmss, 0x0033 }, | 
|  | 207 | +	{ "camss_jpeg_jpeg2_clk", &mmss, 0x0034 }, | 
|  | 208 | +	{ "camss_jpeg_jpeg_ahb_clk", &mmss, 0x0035 }, | 
|  | 209 | +	{ "camss_jpeg_jpeg_axi_clk", &mmss, 0x0036 }, | 
|  | 210 | +	{ "camss_jpeg_jpeg_ocmemnoc_clk", &mmss, 0x0037 }, | 
|  | 211 | +	{ "camss_mclk0_clk", &mmss, 0x0029 }, | 
|  | 212 | +	{ "camss_mclk1_clk", &mmss, 0x002a }, | 
|  | 213 | +	{ "camss_mclk2_clk", &mmss, 0x002b }, | 
|  | 214 | +	{ "camss_mclk3_clk", &mmss, 0x002c }, | 
|  | 215 | +	{ "camss_micro_ahb_clk", &mmss, 0x0026 }, | 
|  | 216 | +	{ "camss_phy0_csi0phytimer_clk", &mmss, 0x002f }, | 
|  | 217 | +	{ "camss_phy1_csi1phytimer_clk", &mmss, 0x0030 }, | 
|  | 218 | +	{ "camss_phy2_csi2phytimer_clk", &mmss, 0x0031 }, | 
|  | 219 | +	{ "camss_top_ahb_clk", &mmss, 0x0025 }, | 
|  | 220 | +	{ "camss_vfe_cpp_ahb_clk", &mmss, 0x003b }, | 
|  | 221 | +	{ "camss_vfe_cpp_clk", &mmss, 0x003a }, | 
|  | 222 | +	{ "camss_vfe_vfe0_clk", &mmss, 0x0038 }, | 
|  | 223 | +	{ "camss_vfe_vfe1_clk", &mmss, 0x0039 }, | 
|  | 224 | +	{ "camss_vfe_vfe_ahb_clk", &mmss, 0x003c }, | 
|  | 225 | +	{ "camss_vfe_vfe_axi_clk", &mmss, 0x003d }, | 
|  | 226 | +	{ "camss_vfe_vfe_ocmemnoc_clk", &mmss, 0x003e }, | 
|  | 227 | +	{ "oxilicx_axi_clk", &mmss, 0x000b }, | 
|  | 228 | +	{ "oxilicx_ahb_clk", &mmss, 0x000c }, | 
|  | 229 | +	{ "ocmemcx_ocmemnoc_clk", &mmss, 0x0009 }, | 
|  | 230 | +	{ "oxili_gfx3d_clk", &mmss, 0x000d }, | 
|  | 231 | +	{ "venus0_axi_clk", &mmss, 0x000f }, | 
|  | 232 | +	{ "venus0_ocmemnoc_clk", &mmss, 0x0010 }, | 
|  | 233 | +	{ "venus0_ahb_clk", &mmss, 0x0011 }, | 
|  | 234 | +	{ "venus0_vcodec0_clk", &mmss, 0x000e }, | 
|  | 235 | +	{ "mmss_s0_axi_clk", &mmss, 0x0005 }, | 
|  | 236 | +	{ "mmssnoc_ahb_clk", &mmss, 0x0001 }, | 
|  | 237 | +	{ "mdss_ahb_clk", &mmss, 0x0022 }, | 
|  | 238 | +	{ "mdss_hdmi_clk", &mmss, 0x001d }, | 
|  | 239 | +	{ "mdss_mdp_clk", &mmss, 0x0014 }, | 
|  | 240 | +	{ "mdss_mdp_lut_clk", &mmss, 0x0015 }, | 
|  | 241 | +	{ "mdss_axi_clk", &mmss, 0x0024 }, | 
|  | 242 | +	{ "mdss_vsync_clk", &mmss, 0x001c }, | 
|  | 243 | +	{ "mdss_esc0_clk", &mmss, 0x0020 }, | 
|  | 244 | +	{ "mdss_esc1_clk", &mmss, 0x0021 }, | 
|  | 245 | +	{ "mdss_edpaux_clk", &mmss, 0x001b }, | 
|  | 246 | +	{ "mdss_byte0_clk", &mmss, 0x001e }, | 
|  | 247 | +	{ "mdss_byte1_clk", &mmss, 0x001f }, | 
|  | 248 | +	{ "mdss_edplink_clk", &mmss, 0x001a }, | 
|  | 249 | +	{ "mdss_edppixel_clk", &mmss, 0x0019 }, | 
|  | 250 | +	{ "mdss_extpclk_clk", &mmss, 0x0018 }, | 
|  | 251 | +	{ "mdss_hdmi_ahb_clk", &mmss, 0x0023 }, | 
|  | 252 | +	{ "mdss_pclk0_clk", &mmss, 0x0016 }, | 
|  | 253 | +	{ "mdss_pclk1_clk", &mmss, 0x0017 }, | 
|  | 254 | +	/* LPASS entries */ | 
|  | 255 | +	{ "q6ss_xo_clk", &lpass, 0x002b }, | 
|  | 256 | +	{ "q6ss_ahb_lfabif_clk", &lpass, 0x001e }, | 
|  | 257 | +	{ "q6ss_ahbm_clk", &lpass, 0x001d }, | 
|  | 258 | +	/* APCS entries */ | 
|  | 259 | +	// { "krait0_m_clk", &apcs, 0x00 }, | 
|  | 260 | +	// { "krait1_m_clk", &apcs, 0x01 }, | 
|  | 261 | +	// { "krait2_m_clk", &apcs, 0x02 }, | 
|  | 262 | +	// { "krait3_m_clk", &apcs, 0x03 }, | 
|  | 263 | +	// { "l2_m_clk", &apcs, 0x04 }, | 
|  | 264 | +	{} | 
|  | 265 | +}; | 
|  | 266 | + | 
|  | 267 | +struct debugcc_platform msm8974_debugcc = { | 
|  | 268 | +	"msm8974", | 
|  | 269 | +	msm8974_clocks, | 
|  | 270 | +}; | 
0 commit comments