Lines Matching +full:platform +full:- +full:level

1 // SPDX-License-Identifier: GPL-2.0
26 /* Unlike the OBP device tree, the machine description is a full-on
106 {"virtual-device-port", get_vdev_port_node_info,
108 {"domain-services-port", get_ds_port_node_info,
152 BUG_ON(((unsigned long)&hp->mdesc) & (16UL - 1)); in mdesc_handle_init()
155 INIT_LIST_HEAD(&hp->list); in mdesc_handle_init()
156 hp->self_base = base; in mdesc_handle_init()
157 refcount_set(&hp->refcnt, 1); in mdesc_handle_init()
158 hp->handle_size = handle_size; in mdesc_handle_init()
167 handle_size = (sizeof(struct mdesc_handle) - in mdesc_memblock_alloc()
187 BUG_ON(refcount_read(&hp->refcnt) != 0); in mdesc_memblock_free()
188 BUG_ON(!list_empty(&hp->list)); in mdesc_memblock_free()
190 alloc_size = PAGE_ALIGN(hp->handle_size); in mdesc_memblock_free()
207 handle_size = (sizeof(struct mdesc_handle) - in mdesc_kmalloc()
225 BUG_ON(refcount_read(&hp->refcnt) != 0); in mdesc_kfree()
226 BUG_ON(!list_empty(&hp->list)); in mdesc_kfree()
228 kfree(hp->self_base); in mdesc_kfree()
239 struct mdesc_handle *hp = mops->alloc(mdesc_size); in mdesc_alloc()
242 hp->mops = mops; in mdesc_alloc()
249 hp->mops->free(hp); in mdesc_free()
264 refcount_inc(&hp->refcnt); in mdesc_grab()
276 if (refcount_dec_and_test(&hp->refcnt)) { in mdesc_release()
277 list_del_init(&hp->list); in mdesc_release()
278 hp->mops->free(hp); in mdesc_release()
297 if (strcmp(md_node_ops_table[i].name, client->node_name) == 0) { in mdesc_register_notifier()
304 pr_err("MD: %s node not supported\n", client->node_name); in mdesc_register_notifier()
309 client->next = client_list; in mdesc_register_notifier()
312 mdesc_for_each_node_by_name(cur_mdesc, node, client->node_name) in mdesc_register_notifier()
313 client->add(cur_mdesc, node, client->node_name); in mdesc_register_notifier()
329 "cfg-handle", NULL); in parent_cfg_handle()
348 * 3. parent node "cfg-handle" property in get_vdev_port_node_info()
355 return -1; in get_vdev_port_node_info()
357 node_info->vdev_port.id = *idp; in get_vdev_port_node_info()
358 node_info->vdev_port.name = kstrdup_const(name, GFP_KERNEL); in get_vdev_port_node_info()
359 if (!node_info->vdev_port.name) in get_vdev_port_node_info()
360 return -1; in get_vdev_port_node_info()
361 node_info->vdev_port.parent_cfg_hdl = *parent_cfg_hdlp; in get_vdev_port_node_info()
368 if (node_info && node_info->vdev_port.name) { in rel_vdev_port_node_info()
369 kfree_const(node_info->vdev_port.name); in rel_vdev_port_node_info()
370 node_info->vdev_port.name = NULL; in rel_vdev_port_node_info()
377 if (a_node_info->vdev_port.id != b_node_info->vdev_port.id) in vdev_port_node_match()
380 if (a_node_info->vdev_port.parent_cfg_hdl != in vdev_port_node_match()
381 b_node_info->vdev_port.parent_cfg_hdl) in vdev_port_node_match()
384 if (strncmp(a_node_info->vdev_port.name, in vdev_port_node_match()
385 b_node_info->vdev_port.name, MDESC_MAX_STR_LEN) != 0) in vdev_port_node_match()
399 return -1; in get_ds_port_node_info()
401 node_info->ds_port.id = *idp; in get_ds_port_node_info()
413 if (a_node_info->ds_port.id != b_node_info->ds_port.id) in ds_port_node_match()
485 invoke_on_missing(p->node_name, old_hp, new_hp, p->remove); in notify_one()
486 invoke_on_missing(p->node_name, new_hp, old_hp, p->add); in notify_one()
496 p = p->next; in mdesc_notify_clients()
516 status = sun4v_mach_desc(__pa(&hp->mdesc), len, &real_len); in mdesc_update()
520 refcount_dec(&hp->refcnt); in mdesc_update()
533 if (refcount_dec_and_test(&orig_hp->refcnt)) in mdesc_update()
536 list_add(&orig_hp->list, &mdesc_zombie_list); in mdesc_update()
563 return -EINVAL; in mdesc_get_node()
591 return -EINVAL; in mdesc_get_node_info()
599 return -EINVAL; in mdesc_get_node_info()
606 return -1; in mdesc_get_node_info()
620 return ((void *) node_block(mdesc)) + mdesc->node_sz; in name_block()
625 return ((void *) name_block(mdesc)) + mdesc->name_sz; in data_block()
631 struct mdesc_elem *ep = node_block(&hp->mdesc); in mdesc_node_by_name()
632 const char *names = name_block(&hp->mdesc); in mdesc_node_by_name()
633 u64 last_node = hp->mdesc.node_sz / 16; in mdesc_node_by_name()
660 const char *names = name_block(&hp->mdesc); in mdesc_get_property()
661 u64 last_node = hp->mdesc.node_sz / 16; in mdesc_get_property()
662 void *data = data_block(&hp->mdesc); in mdesc_get_property()
668 ep = node_block(&hp->mdesc) + node; in mdesc_get_property()
670 for (; ep->tag != MD_NODE_END; ep++) { in mdesc_get_property()
674 switch (ep->tag) { in mdesc_get_property()
676 val = &ep->d.val; in mdesc_get_property()
682 val = data + ep->d.data.data_offset; in mdesc_get_property()
683 len = ep->d.data.data_len; in mdesc_get_property()
692 if (!strcmp(names + ep->name_offset, name)) { in mdesc_get_property()
705 struct mdesc_elem *ep, *base = node_block(&hp->mdesc); in mdesc_next_arc()
706 const char *names = name_block(&hp->mdesc); in mdesc_next_arc()
707 u64 last_node = hp->mdesc.node_sz / 16; in mdesc_next_arc()
715 for (; ep->tag != MD_NODE_END; ep++) { in mdesc_next_arc()
716 if (ep->tag != MD_PROP_ARC) in mdesc_next_arc()
719 if (strcmp(names + ep->name_offset, arc_type)) in mdesc_next_arc()
722 return ep - base; in mdesc_next_arc()
731 struct mdesc_elem *ep, *base = node_block(&hp->mdesc); in mdesc_arc_target()
735 return ep->d.val; in mdesc_arc_target()
741 struct mdesc_elem *ep, *base = node_block(&hp->mdesc); in mdesc_node_name()
742 const char *names = name_block(&hp->mdesc); in mdesc_node_name()
743 u64 last_node = hp->mdesc.node_sz / 16; in mdesc_node_name()
749 if (ep->tag != MD_NODE) in mdesc_node_name()
752 return names + ep->name_offset; in mdesc_node_name()
761 u64 pn = mdesc_node_by_name(hp, MDESC_NODE_NULL, "platform"); in report_platform_properties()
766 prom_printf("No platform node in machine-description.\n"); in report_platform_properties()
770 s = mdesc_get_property(hp, pn, "banner-name", NULL); in report_platform_properties()
771 printk("PLATFORM: banner-name [%s]\n", s); in report_platform_properties()
773 printk("PLATFORM: name [%s]\n", s); in report_platform_properties()
777 printk("PLATFORM: hostid [%08llx]\n", *v); in report_platform_properties()
780 printk("PLATFORM: serial# [%08llx]\n", *v); in report_platform_properties()
781 v = mdesc_get_property(hp, pn, "stick-frequency", NULL); in report_platform_properties()
782 printk("PLATFORM: stick-frequency [%08llx]\n", *v); in report_platform_properties()
783 v = mdesc_get_property(hp, pn, "mac-address", NULL); in report_platform_properties()
785 printk("PLATFORM: mac-address [%llx]\n", *v); in report_platform_properties()
786 v = mdesc_get_property(hp, pn, "watchdog-resolution", NULL); in report_platform_properties()
788 printk("PLATFORM: watchdog-resolution [%llu ms]\n", *v); in report_platform_properties()
789 v = mdesc_get_property(hp, pn, "watchdog-max-timeout", NULL); in report_platform_properties()
791 printk("PLATFORM: watchdog-max-timeout [%llu ms]\n", *v); in report_platform_properties()
792 v = mdesc_get_property(hp, pn, "max-cpus", NULL); in report_platform_properties()
795 printk("PLATFORM: max-cpus [%llu]\n", max_cpus); in report_platform_properties()
819 const u64 *level = mdesc_get_property(hp, mp, "level", NULL); in fill_in_one_cache() local
821 const u64 *line_size = mdesc_get_property(hp, mp, "line-size", NULL); in fill_in_one_cache()
827 switch (*level) { in fill_in_one_cache()
830 c->icache_size = *size; in fill_in_one_cache()
831 c->icache_line_size = *line_size; in fill_in_one_cache()
833 c->dcache_size = *size; in fill_in_one_cache()
834 c->dcache_line_size = *line_size; in fill_in_one_cache()
839 c->ecache_size = *size; in fill_in_one_cache()
840 c->ecache_line_size = *line_size; in fill_in_one_cache()
847 if (*level == 1) { in fill_in_one_cache()
878 find_back_node_value(hp, n, srch_val, func, val, depth-1); in find_back_node_value()
928 * level 1 instruction caches. in set_core_ids()
931 const u64 *level; in set_core_ids() local
935 level = mdesc_get_property(hp, mp, "level", NULL); in set_core_ids()
936 if (*level != 1) in set_core_ids()
948 static int set_max_cache_ids_by_cache(struct mdesc_handle *hp, int level) in set_max_cache_ids_by_cache() argument
955 * Identify unique highest level of shared cache by looking for cpus in set_max_cache_ids_by_cache()
956 * backpointed to by shared level N caches. in set_max_cache_ids_by_cache()
961 cur_lvl = mdesc_get_property(hp, mp, "level", NULL); in set_max_cache_ids_by_cache()
962 if (*cur_lvl != level) in set_max_cache_ids_by_cache()
1000 * Find the highest level of shared cache which pre-T7 is also in set_sock_ids()
1054 __set_proc_ids(hp, "exec-unit"); in set_proc_ids()
1072 *mask = ((1U << val) * 64U) - 1U; in get_one_mondo_bits()
1076 *mask = ((1U << def) * 64U) - 1U; in get_one_mondo_bits()
1085 val = mdesc_get_property(hp, mp, "q-cpu-mondo-#bits", NULL); in get_mondo_data()
1086 get_one_mondo_bits(val, &tb->cpu_mondo_qmask, 7, ilog2(max_cpus * 2)); in get_mondo_data()
1088 val = mdesc_get_property(hp, mp, "q-dev-mondo-#bits", NULL); in get_mondo_data()
1089 get_one_mondo_bits(val, &tb->dev_mondo_qmask, 7, 8); in get_mondo_data()
1091 val = mdesc_get_property(hp, mp, "q-resumable-#bits", NULL); in get_mondo_data()
1092 get_one_mondo_bits(val, &tb->resum_qmask, 6, 7); in get_mondo_data()
1094 val = mdesc_get_property(hp, mp, "q-nonresumable-#bits", NULL); in get_mondo_data()
1095 get_one_mondo_bits(val, &tb->nonresum_qmask, 2, 2); in get_mondo_data()
1099 tb->cpu_mondo_qmask + 1, in get_mondo_data()
1100 tb->dev_mondo_qmask + 1, in get_mondo_data()
1101 tb->resum_qmask + 1, in get_mondo_data()
1102 tb->nonresum_qmask + 1); in get_mondo_data()
1157 const u64 *pgsz_prop = mdesc_get_property(hp, mp, "mmu-page-size-list", NULL); in check_one_pgsz()
1182 const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL); in fill_in_one_cpu()
1198 c->clock_tick = *cfreq; in fill_in_one_cpu()
1223 c->core_id = 0; in fill_in_one_cpu()
1224 c->proc_id = -1; in fill_in_one_cpu()
1246 /* mdesc_open() - Grab a reference to mdesc_handle when /dev/mdesc is
1256 return -ENODEV; in mdesc_open()
1258 file->private_data = hp; in mdesc_open()
1266 struct mdesc_handle *hp = file->private_data; in mdesc_read()
1270 if (*offp >= hp->handle_size) in mdesc_read()
1273 bytes_left = hp->handle_size - *offp; in mdesc_read()
1277 mdesc = (unsigned char *)&hp->mdesc; in mdesc_read()
1283 return -EFAULT; in mdesc_read()
1289 struct mdesc_handle *hp = file->private_data; in mdesc_llseek()
1291 return no_seek_end_llseek_size(file, offset, whence, hp->handle_size); in mdesc_llseek()
1294 /* mdesc_close() - /dev/mdesc is being closed, release the reference to
1299 mdesc_release(file->private_data); in mdesc_close()
1339 status = sun4v_mach_desc(__pa(&hp->mdesc), len, &real_len); in sun4v_mdesc_init()