xref: /illumos-gate/usr/src/uts/intel/io/amdzen/amdzen.h (revision 019df03d)
1047043c2SRobert Mustacchi /*
2047043c2SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3047043c2SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4047043c2SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5047043c2SRobert Mustacchi  * 1.0 of the CDDL.
6047043c2SRobert Mustacchi  *
7047043c2SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8047043c2SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9047043c2SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10047043c2SRobert Mustacchi  */
11047043c2SRobert Mustacchi 
12047043c2SRobert Mustacchi /*
13*019df03dSRobert Mustacchi  * Copyright 2024 Oxide Computer Company
14047043c2SRobert Mustacchi  */
15047043c2SRobert Mustacchi 
16047043c2SRobert Mustacchi #ifndef _AMDZEN_H
17047043c2SRobert Mustacchi #define	_AMDZEN_H
18047043c2SRobert Mustacchi 
19047043c2SRobert Mustacchi #include <sys/ddi.h>
20047043c2SRobert Mustacchi #include <sys/sunddi.h>
21047043c2SRobert Mustacchi #include <sys/list.h>
22047043c2SRobert Mustacchi #include <sys/pci.h>
23047043c2SRobert Mustacchi #include <sys/taskq.h>
24047043c2SRobert Mustacchi #include <sys/bitmap.h>
25*019df03dSRobert Mustacchi #include <sys/x86_archext.h>
2671815ce7SRobert Mustacchi #include <sys/amdzen/df.h>
2771815ce7SRobert Mustacchi 
2871815ce7SRobert Mustacchi #include "amdzen_client.h"
29047043c2SRobert Mustacchi 
30047043c2SRobert Mustacchi /*
31047043c2SRobert Mustacchi  * This header describes properties of the data fabric and our internal state
32047043c2SRobert Mustacchi  * for the Zen Nexus driver.
33047043c2SRobert Mustacchi  */
34047043c2SRobert Mustacchi 
35047043c2SRobert Mustacchi #ifdef __cplusplus
36047043c2SRobert Mustacchi extern "C" {
37047043c2SRobert Mustacchi #endif
38047043c2SRobert Mustacchi 
39047043c2SRobert Mustacchi /*
40047043c2SRobert Mustacchi  * The data fabric devices are always defined to be on PCI bus zero starting at
41047043c2SRobert Mustacchi  * device 0x18.
42047043c2SRobert Mustacchi  */
43047043c2SRobert Mustacchi #define	AMDZEN_DF_BUSNO		0x00
44047043c2SRobert Mustacchi #define	AMDZEN_DF_FIRST_DEVICE	0x18
45047043c2SRobert Mustacchi 
46047043c2SRobert Mustacchi /*
47047043c2SRobert Mustacchi  * The maximum amount of Data Fabric node's we can see. In Zen 1 there were up
48047043c2SRobert Mustacchi  * to four per package.
49047043c2SRobert Mustacchi  */
50047043c2SRobert Mustacchi #define	AMDZEN_MAX_DFS		0x8
51047043c2SRobert Mustacchi 
52047043c2SRobert Mustacchi /*
53047043c2SRobert Mustacchi  * The maximum number of PCI functions we expect to encounter on the data
54047043c2SRobert Mustacchi  * fabric.
55047043c2SRobert Mustacchi  */
56047043c2SRobert Mustacchi #define	AMDZEN_MAX_DF_FUNCS	0x8
57047043c2SRobert Mustacchi 
58047043c2SRobert Mustacchi /*
59047043c2SRobert Mustacchi  * Northbridge registers that are relevant for the nexus, mostly for SMN.
60047043c2SRobert Mustacchi  */
61047043c2SRobert Mustacchi #define	AMDZEN_NB_SMN_ADDR	0x60
62047043c2SRobert Mustacchi #define	AMDZEN_NB_SMN_DATA	0x64
63047043c2SRobert Mustacchi 
64047043c2SRobert Mustacchi /*
65047043c2SRobert Mustacchi  * AMD PCI ID for reference
66047043c2SRobert Mustacchi  */
67047043c2SRobert Mustacchi #define	AMDZEN_PCI_VID_AMD	0x1022
68047043c2SRobert Mustacchi 
699b0429a1SPu Wen /*
709b0429a1SPu Wen  * Hygon PCI ID for reference
719b0429a1SPu Wen  */
729b0429a1SPu Wen #define	AMDZEN_PCI_VID_HYGON	0x1d94
739b0429a1SPu Wen 
74047043c2SRobert Mustacchi typedef enum {
75047043c2SRobert Mustacchi 	AMDZEN_STUB_TYPE_DF,
76047043c2SRobert Mustacchi 	AMDZEN_STUB_TYPE_NB
77047043c2SRobert Mustacchi } amdzen_stub_type_t;
78047043c2SRobert Mustacchi 
79047043c2SRobert Mustacchi typedef struct {
80047043c2SRobert Mustacchi 	list_node_t		azns_link;
81047043c2SRobert Mustacchi 	dev_info_t		*azns_dip;
82047043c2SRobert Mustacchi 	uint16_t		azns_vid;
83047043c2SRobert Mustacchi 	uint16_t		azns_did;
84047043c2SRobert Mustacchi 	uint16_t		azns_bus;
85047043c2SRobert Mustacchi 	uint16_t		azns_dev;
86047043c2SRobert Mustacchi 	uint16_t		azns_func;
87047043c2SRobert Mustacchi 	ddi_acc_handle_t	azns_cfgspace;
88047043c2SRobert Mustacchi } amdzen_stub_t;
89047043c2SRobert Mustacchi 
90dd23d762SRobert Mustacchi typedef enum {
91047043c2SRobert Mustacchi 	AMDZEN_DFE_F_MCA	= 1 << 0,
92dd23d762SRobert Mustacchi 	AMDZEN_DFE_F_ENABLED	= 1 << 1,
93dd23d762SRobert Mustacchi 	AMDZEN_DFE_F_DATA_VALID	= 1 << 2
94047043c2SRobert Mustacchi } amdzen_df_ent_flags_t;
95047043c2SRobert Mustacchi 
96dd23d762SRobert Mustacchi /*
97dd23d762SRobert Mustacchi  * Data specific to a CCM.
98dd23d762SRobert Mustacchi  */
99dd23d762SRobert Mustacchi typedef struct {
100dd23d762SRobert Mustacchi 	uint32_t acd_nccds;
101dd23d762SRobert Mustacchi 	uint8_t acd_ccd_en[DF_MAX_CCDS_PER_CCM];
102dd23d762SRobert Mustacchi 	uint32_t acd_ccd_id[DF_MAX_CCDS_PER_CCM];
103dd23d762SRobert Mustacchi 	void *acd_ccd_data[DF_MAX_CCDS_PER_CCM];
104dd23d762SRobert Mustacchi } amdzen_ccm_data_t;
105dd23d762SRobert Mustacchi 
106dd23d762SRobert Mustacchi typedef union {
107dd23d762SRobert Mustacchi 	amdzen_ccm_data_t aded_ccm;
108dd23d762SRobert Mustacchi } amdzen_df_ent_data_t;
109dd23d762SRobert Mustacchi 
110047043c2SRobert Mustacchi typedef struct {
111047043c2SRobert Mustacchi 	uint8_t adfe_drvid;
112047043c2SRobert Mustacchi 	amdzen_df_ent_flags_t adfe_flags;
11371815ce7SRobert Mustacchi 	df_type_t adfe_type;
114047043c2SRobert Mustacchi 	uint8_t adfe_subtype;
115047043c2SRobert Mustacchi 	uint8_t adfe_fabric_id;
116047043c2SRobert Mustacchi 	uint8_t adfe_inst_id;
117047043c2SRobert Mustacchi 	uint32_t adfe_info0;
118047043c2SRobert Mustacchi 	uint32_t adfe_info1;
119047043c2SRobert Mustacchi 	uint32_t adfe_info2;
120047043c2SRobert Mustacchi 	uint32_t adfe_info3;
121dd23d762SRobert Mustacchi 	amdzen_df_ent_data_t adfe_data;
122047043c2SRobert Mustacchi } amdzen_df_ent_t;
123047043c2SRobert Mustacchi 
124047043c2SRobert Mustacchi typedef enum {
125047043c2SRobert Mustacchi 	AMDZEN_DF_F_VALID		= 1 << 0,
12671815ce7SRobert Mustacchi 	AMDZEN_DF_F_FOUND_NB		= 1 << 1,
127047043c2SRobert Mustacchi } amdzen_df_flags_t;
128047043c2SRobert Mustacchi 
129047043c2SRobert Mustacchi typedef struct {
130047043c2SRobert Mustacchi 	amdzen_df_flags_t	adf_flags;
131047043c2SRobert Mustacchi 	uint_t		adf_nb_busno;
132047043c2SRobert Mustacchi 	amdzen_stub_t	*adf_funcs[AMDZEN_MAX_DF_FUNCS];
133047043c2SRobert Mustacchi 	amdzen_stub_t	*adf_nb;
13471815ce7SRobert Mustacchi 	uint8_t		adf_major;
13571815ce7SRobert Mustacchi 	uint8_t		adf_minor;
136047043c2SRobert Mustacchi 	uint_t		adf_nents;
13771815ce7SRobert Mustacchi 	df_rev_t	adf_rev;
138047043c2SRobert Mustacchi 	amdzen_df_ent_t	*adf_ents;
139047043c2SRobert Mustacchi 	uint32_t	adf_nodeid;
140047043c2SRobert Mustacchi 	uint32_t	adf_syscfg;
141047043c2SRobert Mustacchi 	uint32_t	adf_mask0;
142047043c2SRobert Mustacchi 	uint32_t	adf_mask1;
14371815ce7SRobert Mustacchi 	uint32_t	adf_mask2;
144dd23d762SRobert Mustacchi 	uint32_t	adf_nccm;
14571815ce7SRobert Mustacchi 	df_fabric_decomp_t	adf_decomp;
146047043c2SRobert Mustacchi } amdzen_df_t;
147047043c2SRobert Mustacchi 
148047043c2SRobert Mustacchi typedef enum {
149047043c2SRobert Mustacchi 	AMDZEN_F_UNSUPPORTED		= 1 << 0,
150047043c2SRobert Mustacchi 	AMDZEN_F_DEVICE_ERROR		= 1 << 1,
151047043c2SRobert Mustacchi 	AMDZEN_F_MAP_ERROR		= 1 << 2,
152047043c2SRobert Mustacchi 	AMDZEN_F_SCAN_DISPATCHED	= 1 << 3,
153047043c2SRobert Mustacchi 	AMDZEN_F_SCAN_COMPLETE		= 1 << 4,
154047043c2SRobert Mustacchi 	AMDZEN_F_ATTACH_DISPATCHED	= 1 << 5,
155dd23d762SRobert Mustacchi 	AMDZEN_F_ATTACH_COMPLETE	= 1 << 6,
156dd23d762SRobert Mustacchi 	AMDZEN_F_APIC_DECOMP_VALID	= 1 << 7
157047043c2SRobert Mustacchi } amdzen_flags_t;
158047043c2SRobert Mustacchi 
159047043c2SRobert Mustacchi #define	AMDZEN_F_TASKQ_MASK	(AMDZEN_F_SCAN_DISPATCHED | \
160047043c2SRobert Mustacchi     AMDZEN_F_SCAN_COMPLETE | AMDZEN_F_ATTACH_DISPATCHED | \
161047043c2SRobert Mustacchi     AMDZEN_F_ATTACH_COMPLETE)
162047043c2SRobert Mustacchi 
163dd23d762SRobert Mustacchi /*
164dd23d762SRobert Mustacchi  * These are the set of flags we want to consider when determining whether or
165dd23d762SRobert Mustacchi  * not we're OK for receiving topo ioctls.
166dd23d762SRobert Mustacchi  */
167dd23d762SRobert Mustacchi #define	AMDZEN_F_IOCTL_MASK	(AMDZEN_F_UNSUPPORTED | \
168dd23d762SRobert Mustacchi     AMDZEN_F_DEVICE_ERROR | AMDZEN_F_MAP_ERROR | AMDZEN_F_ATTACH_COMPLETE)
169dd23d762SRobert Mustacchi 
170047043c2SRobert Mustacchi typedef struct amdzen {
171047043c2SRobert Mustacchi 	kmutex_t	azn_mutex;
172047043c2SRobert Mustacchi 	kcondvar_t	azn_cv;
173047043c2SRobert Mustacchi 	amdzen_flags_t	azn_flags;
174047043c2SRobert Mustacchi 	dev_info_t	*azn_dip;
175047043c2SRobert Mustacchi 	taskqid_t	azn_taskqid;
176047043c2SRobert Mustacchi 	uint_t		azn_nscanned;
177047043c2SRobert Mustacchi 	uint_t		azn_npresent;
178047043c2SRobert Mustacchi 	list_t		azn_df_stubs;
179047043c2SRobert Mustacchi 	list_t		azn_nb_stubs;
180047043c2SRobert Mustacchi 	uint_t		azn_ndfs;
181047043c2SRobert Mustacchi 	amdzen_df_t	azn_dfs[AMDZEN_MAX_DFS];
182*019df03dSRobert Mustacchi 	x86_uarchrev_t	azn_uarchrev;
183*019df03dSRobert Mustacchi 	x86_chiprev_t	azn_chiprev;
184dd23d762SRobert Mustacchi 	uint32_t	azn_ncore_per_ccx;
185dd23d762SRobert Mustacchi 	amdzen_apic_decomp_t azn_apic_decomp;
186047043c2SRobert Mustacchi } amdzen_t;
187047043c2SRobert Mustacchi 
188047043c2SRobert Mustacchi typedef enum {
189047043c2SRobert Mustacchi 	AMDZEN_C_SMNTEMP = 1,
190549e0fd3SRobert Mustacchi 	AMDZEN_C_USMN,
19171815ce7SRobert Mustacchi 	AMDZEN_C_ZEN_UDF,
19271815ce7SRobert Mustacchi 	AMDZEN_C_ZEN_UMC
193047043c2SRobert Mustacchi } amdzen_child_t;
194047043c2SRobert Mustacchi 
195047043c2SRobert Mustacchi /*
196047043c2SRobert Mustacchi  * Functions for stubs.
197047043c2SRobert Mustacchi  */
198047043c2SRobert Mustacchi extern int amdzen_attach_stub(dev_info_t *, ddi_attach_cmd_t);
199047043c2SRobert Mustacchi extern int amdzen_detach_stub(dev_info_t *, ddi_detach_cmd_t);
200047043c2SRobert Mustacchi 
201047043c2SRobert Mustacchi #ifdef __cplusplus
202047043c2SRobert Mustacchi }
203047043c2SRobert Mustacchi #endif
204047043c2SRobert Mustacchi 
205047043c2SRobert Mustacchi #endif /* _AMDZEN_H */
206