hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _SPARC64_MDESC_H
#define _SPARC64_MDESC_H
 
#include <linux/types.h>
#include <linux/cpumask.h>
#include <asm/prom.h>
 
struct mdesc_handle;
 
/* Machine description operations are to be surrounded by grab and
 * release calls.  The mdesc_handle returned from the grab is
 * the first argument to all of the operational calls that work
 * on mdescs.
 */
struct mdesc_handle *mdesc_grab(void);
void mdesc_release(struct mdesc_handle *);
 
#define MDESC_NODE_NULL        (~(u64)0)
#define MDESC_MAX_STR_LEN    256
 
u64 mdesc_node_by_name(struct mdesc_handle *handle,
              u64 from_node, const char *name);
#define mdesc_for_each_node_by_name(__hdl, __node, __name) \
   for (__node = mdesc_node_by_name(__hdl, MDESC_NODE_NULL, __name); \
        (__node) != MDESC_NODE_NULL; \
        __node = mdesc_node_by_name(__hdl, __node, __name))
 
/* Access to property values returned from mdesc_get_property() are
 * only valid inside of a mdesc_grab()/mdesc_release() sequence.
 * Once mdesc_release() is called, the memory backed up by these
 * pointers may reference freed up memory.
 *
 * Therefore callers must make copies of any property values
 * they need.
 *
 * These same rules apply to mdesc_node_name().
 */
const void *mdesc_get_property(struct mdesc_handle *handle,
                  u64 node, const char *name, int *lenp);
const char *mdesc_node_name(struct mdesc_handle *hp, u64 node);
 
/* MD arc iteration, the standard sequence is:
 *
 *    unsigned long arc;
 *    mdesc_for_each_arc(arc, handle, node, MDESC_ARC_TYPE_{FWD,BACK}) {
 *        unsigned long target = mdesc_arc_target(handle, arc);
 *        ...
 *    }
 */
 
#define MDESC_ARC_TYPE_FWD    "fwd"
#define MDESC_ARC_TYPE_BACK    "back"
 
u64 mdesc_next_arc(struct mdesc_handle *handle, u64 from,
          const char *arc_type);
#define mdesc_for_each_arc(__arc, __hdl, __node, __type) \
   for (__arc = mdesc_next_arc(__hdl, __node, __type); \
        (__arc) != MDESC_NODE_NULL; \
        __arc = mdesc_next_arc(__hdl, __arc, __type))
 
u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc);
 
void mdesc_update(void);
 
struct mdesc_notifier_client {
   void (*add)(struct mdesc_handle *handle, u64 node,
           const char *node_name);
   void (*remove)(struct mdesc_handle *handle, u64 node,
              const char *node_name);
   const char            *node_name;
   struct mdesc_notifier_client    *next;
};
 
void mdesc_register_notifier(struct mdesc_notifier_client *client);
 
union md_node_info {
   struct vdev_port {
       u64 id;                /* id */
       u64 parent_cfg_hdl;        /* parent config handle */
       const char *name;        /* name (property) */
   } vdev_port;
   struct ds_port {
       u64 id;                /* id */
   } ds_port;
};
 
u64 mdesc_get_node(struct mdesc_handle *hp, const char *node_name,
          union md_node_info *node_info);
int mdesc_get_node_info(struct mdesc_handle *hp, u64 node,
           const char *node_name, union md_node_info *node_info);
 
void mdesc_fill_in_cpu_data(cpumask_t *mask);
void mdesc_populate_present_mask(cpumask_t *mask);
void mdesc_get_page_sizes(cpumask_t *mask, unsigned long *pgsz_mask);
 
void sun4v_mdesc_init(void);
 
#endif