| 1008 | #endif |
| 1009 | |
| 1010 | static void |
| 1011 | mca_setup(uint64_t mcg_cap) |
| 1012 | { |
| 1013 | |
| 1014 | /* |
| 1015 | * On AMD Family 10h processors, unless logging of level one TLB |
| 1016 | * parity (L1TP) errors is disabled, enable the recommended workaround |
| 1017 | * for Erratum 383. |
| 1018 | */ |
| 1019 | if (cpu_vendor_id == CPU_VENDOR_AMD && |
| 1020 | CPUID_TO_FAMILY(cpu_id) == 0x10 && amd10h_L1TP) |
| 1021 | workaround_erratum383 = 1; |
| 1022 | |
| 1023 | mca_banks = mcg_cap & MCG_CAP_COUNT; |
| 1024 | mtx_init(&mca_lock, "mca", NULL, MTX_SPIN); |
| 1025 | STAILQ_INIT(&mca_records); |
| 1026 | STAILQ_INIT(&mca_pending); |
| 1027 | TASK_INIT(&mca_scan_task, 0, mca_scan_cpus, NULL); |
| 1028 | callout_init(&mca_timer, 1); |
| 1029 | STAILQ_INIT(&mca_freelist); |
| 1030 | TASK_INIT(&mca_resize_task, 0, mca_resize, NULL); |
| 1031 | mca_resize_freelist(); |
| 1032 | SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO, |
| 1033 | "count", CTLFLAG_RD, (int *)(uintptr_t)&mca_count, 0, |
| 1034 | "Record count"); |
| 1035 | SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO, |
| 1036 | "maxcount", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, |
| 1037 | &mca_maxcount, 0, sysctl_mca_maxcount, "I", |
| 1038 | "Maximum record count (-1 is unlimited)"); |
| 1039 | SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO, |
| 1040 | "interval", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &mca_ticks, |
| 1041 | 0, sysctl_positive_int, "I", |
| 1042 | "Periodic interval in seconds to scan for machine checks"); |
| 1043 | SYSCTL_ADD_NODE(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO, |
| 1044 | "records", CTLFLAG_RD | CTLFLAG_MPSAFE, sysctl_mca_records, |
| 1045 | "Machine check records"); |
| 1046 | SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO, |
| 1047 | "force_scan", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0, |
| 1048 | sysctl_mca_scan, "I", "Force an immediate scan for machine checks"); |
| 1049 | #ifdef DEV_APIC |
| 1050 | if (cmci_supported(mcg_cap)) |
| 1051 | cmci_setup(); |
| 1052 | else if (amd_thresholding_supported()) |
| 1053 | amd_thresholding_setup(); |
| 1054 | #endif |
| 1055 | } |
| 1056 | |
| 1057 | #ifdef DEV_APIC |
| 1058 | /* |
no test coverage detected