Lines Matching +full:ip +full:- +full:blocks
2 * SPDX-License-Identifier: BSD-2-Clause
29 if (vendorid == prod->amdsmu_vendorid && in amdsmu_match()
30 deviceid == prod->amdsmu_deviceid) { in amdsmu_match()
42 if (device_find_child(parent, "amdsmu", -1) != NULL) in amdsmu_identify()
46 if (device_add_child(parent, "amdsmu", -1) == NULL) in amdsmu_identify()
136 sc->smu_program = (smu_vers >> 24) & 0xFF; in amdsmu_get_vers()
137 sc->smu_maj = (smu_vers >> 16) & 0xFF; in amdsmu_get_vers()
138 sc->smu_min = (smu_vers >> 8) & 0xFF; in amdsmu_get_vers()
139 sc->smu_rev = smu_vers & 0xFF; in amdsmu_get_vers()
141 sc->smu_maj, sc->smu_min, sc->smu_rev, sc->smu_program); in amdsmu_get_vers()
152 struct amdsmu_metrics *m = &sc->metrics; in amdsmu_get_ip_blocks()
156 /* Get IP block count. */ in amdsmu_get_ip_blocks()
159 sc->ip_block_count = 12; in amdsmu_get_ip_blocks()
162 sc->ip_block_count = 21; in amdsmu_get_ip_blocks()
164 /* TODO How many IP blocks does Strix Point (and the others) have? */ in amdsmu_get_ip_blocks()
167 sc->ip_block_count = nitems(amdsmu_ip_blocks_names); in amdsmu_get_ip_blocks()
169 KASSERT(sc->ip_block_count <= nitems(amdsmu_ip_blocks_names), in amdsmu_get_ip_blocks()
170 ("too many IP blocks for array")); in amdsmu_get_ip_blocks()
172 /* Get and print out IP blocks. */ in amdsmu_get_ip_blocks()
174 &sc->active_ip_blocks); in amdsmu_get_ip_blocks()
176 device_printf(dev, "failed to get IP blocks\n"); in amdsmu_get_ip_blocks()
179 device_printf(dev, "Active IP blocks: "); in amdsmu_get_ip_blocks()
180 for (size_t i = 0; i < sc->ip_block_count; i++) { in amdsmu_get_ip_blocks()
181 active = (sc->active_ip_blocks & (1 << i)) != 0; in amdsmu_get_ip_blocks()
182 sc->ip_blocks_active[i] = active; in amdsmu_get_ip_blocks()
186 i + 1 < sc->ip_block_count ? " " : "\n"); in amdsmu_get_ip_blocks()
189 /* Create a sysctl node for IP blocks. */ in amdsmu_get_ip_blocks()
190 sc->ip_blocks_sysctlnode = SYSCTL_ADD_NODE(sc->sysctlctx, in amdsmu_get_ip_blocks()
191 SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO, "ip_blocks", in amdsmu_get_ip_blocks()
193 if (sc->ip_blocks_sysctlnode == NULL) { in amdsmu_get_ip_blocks()
194 device_printf(dev, "could not add sysctl node for IP blocks\n"); in amdsmu_get_ip_blocks()
198 /* Create a sysctl node for each IP block. */ in amdsmu_get_ip_blocks()
199 for (size_t i = 0; i < sc->ip_block_count; i++) { in amdsmu_get_ip_blocks()
200 /* Create the sysctl node itself for the IP block. */ in amdsmu_get_ip_blocks()
202 "Metrics about the %s AMD IP block", in amdsmu_get_ip_blocks()
204 sc->ip_block_sysctlnodes[i] = SYSCTL_ADD_NODE(sc->sysctlctx, in amdsmu_get_ip_blocks()
205 SYSCTL_CHILDREN(sc->ip_blocks_sysctlnode), OID_AUTO, in amdsmu_get_ip_blocks()
207 if (sc->ip_block_sysctlnodes[i] == NULL) { in amdsmu_get_ip_blocks()
213 * Create sysctls for if the IP block is currently active, last in amdsmu_get_ip_blocks()
216 SYSCTL_ADD_BOOL(sc->sysctlctx, in amdsmu_get_ip_blocks()
217 SYSCTL_CHILDREN(sc->ip_block_sysctlnodes[i]), OID_AUTO, in amdsmu_get_ip_blocks()
218 "active", CTLFLAG_RD, &sc->ip_blocks_active[i], 0, in amdsmu_get_ip_blocks()
219 "IP block is currently active"); in amdsmu_get_ip_blocks()
220 SYSCTL_ADD_U64(sc->sysctlctx, in amdsmu_get_ip_blocks()
221 SYSCTL_CHILDREN(sc->ip_block_sysctlnodes[i]), OID_AUTO, in amdsmu_get_ip_blocks()
222 "last_time", CTLFLAG_RD, &m->ip_block_last_active_time[i], in amdsmu_get_ip_blocks()
223 0, "How long the IP block was active for during the last" in amdsmu_get_ip_blocks()
226 SYSCTL_ADD_U64(sc->sysctlctx, in amdsmu_get_ip_blocks()
227 SYSCTL_CHILDREN(sc->ip_block_sysctlnodes[i]), OID_AUTO, in amdsmu_get_ip_blocks()
228 "total_time", CTLFLAG_RD, &m->ip_block_total_active_time[i], in amdsmu_get_ip_blocks()
229 0, "How long the IP block was active for during sleep in" in amdsmu_get_ip_blocks()
254 err = bus_space_map(sc->bus_tag, metrics_addr, in amdsmu_init_metrics()
255 sizeof(struct amdsmu_metrics), 0, &sc->metrics_space); in amdsmu_init_metrics()
278 bus_space_read_region_4(sc->bus_tag, sc->metrics_space, 0, in amdsmu_dump_metrics()
279 (uint32_t *)&sc->metrics, sizeof(sc->metrics) / sizeof(uint32_t)); in amdsmu_dump_metrics()
289 sc->idlemask = amdsmu_read4(sc, SMU_REG_IDLEMASK); in amdsmu_fetch_idlemask()
305 * what Linux does in the amd-pmc driver to get the base address. in amdsmu_attach()
316 sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); in amdsmu_attach()
317 if (sc->res == NULL) { in amdsmu_attach()
322 sc->bus_tag = rman_get_bustag(sc->res); in amdsmu_attach()
324 if (bus_space_map(sc->bus_tag, physbase_addr, in amdsmu_attach()
325 SMU_MEM_SIZE, 0, &sc->smu_space) != 0) { in amdsmu_attach()
330 if (bus_space_map(sc->bus_tag, physbase_addr + SMU_REG_SPACE_OFF, in amdsmu_attach()
331 SMU_MEM_SIZE, 0, &sc->reg_space) != 0) { in amdsmu_attach()
338 sc->sysctlctx = device_get_sysctl_ctx(dev); in amdsmu_attach()
339 sc->sysctlnode = device_get_sysctl_tree(dev); in amdsmu_attach()
345 SYSCTL_ADD_U8(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO, in amdsmu_attach()
346 "program", CTLFLAG_RD, &sc->smu_program, 0, "SMU program number"); in amdsmu_attach()
347 SYSCTL_ADD_U8(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO, in amdsmu_attach()
348 "version_major", CTLFLAG_RD, &sc->smu_maj, 0, in amdsmu_attach()
350 SYSCTL_ADD_U8(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO, in amdsmu_attach()
351 "version_minor", CTLFLAG_RD, &sc->smu_min, 0, in amdsmu_attach()
353 SYSCTL_ADD_U8(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO, in amdsmu_attach()
354 "version_revision", CTLFLAG_RD, &sc->smu_rev, 0, in amdsmu_attach()
363 node = SYSCTL_ADD_NODE(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), in amdsmu_attach()
371 SYSCTL_ADD_U32(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
372 "table_version", CTLFLAG_RD, &sc->metrics.table_version, 0, in amdsmu_attach()
374 SYSCTL_ADD_U32(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
375 "hint_count", CTLFLAG_RD, &sc->metrics.hint_count, 0, in amdsmu_attach()
377 SYSCTL_ADD_U32(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
379 &sc->metrics.s0i3_last_entry_status, 0, in amdsmu_attach()
381 SYSCTL_ADD_U32(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
382 "time_last_in_s0i2", CTLFLAG_RD, &sc->metrics.time_last_in_s0i2, 0, in amdsmu_attach()
384 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
386 &sc->metrics.time_last_entering_s0i3, 0, in amdsmu_attach()
388 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
390 &sc->metrics.total_time_entering_s0i3, 0, in amdsmu_attach()
392 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
393 "time_last_resuming", CTLFLAG_RD, &sc->metrics.time_last_resuming, in amdsmu_attach()
395 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
396 "total_time_resuming", CTLFLAG_RD, &sc->metrics.total_time_resuming, in amdsmu_attach()
398 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
399 "time_last_in_s0i3", CTLFLAG_RD, &sc->metrics.time_last_in_s0i3, 0, in amdsmu_attach()
401 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
402 "total_time_in_s0i3", CTLFLAG_RD, &sc->metrics.total_time_in_s0i3, in amdsmu_attach()
404 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
406 &sc->metrics.time_last_in_sw_drips, 0, in amdsmu_attach()
408 SYSCTL_ADD_U64(sc->sysctlctx, SYSCTL_CHILDREN(node), OID_AUTO, in amdsmu_attach()
410 &sc->metrics.total_time_in_sw_drips, 0, in amdsmu_attach()
413 /* Get IP blocks & add sysctls. */ in amdsmu_attach()
420 SYSCTL_ADD_U32(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO, in amdsmu_attach()
421 "idlemask", CTLFLAG_RD, &sc->idlemask, 0, "SMU idlemask. This " in amdsmu_attach()
422 "value is not documented - only used to help AMD internally debug " in amdsmu_attach()
427 bus_space_unmap(sc->bus_tag, sc->reg_space, SMU_MEM_SIZE); in amdsmu_attach()
429 bus_space_unmap(sc->bus_tag, sc->smu_space, SMU_MEM_SIZE); in amdsmu_attach()
431 bus_release_resource(dev, SYS_RES_MEMORY, rid, sc->res); in amdsmu_attach()
441 bus_space_unmap(sc->bus_tag, sc->smu_space, SMU_MEM_SIZE); in amdsmu_detach()
442 bus_space_unmap(sc->bus_tag, sc->reg_space, SMU_MEM_SIZE); in amdsmu_detach()
444 bus_release_resource(dev, SYS_RES_MEMORY, rid, sc->res); in amdsmu_detach()