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