diff --git a/sys/dev/amdsmn/amdsmn.c b/sys/dev/amdsmn/amdsmn.c --- a/sys/dev/amdsmn/amdsmn.c +++ b/sys/dev/amdsmn/amdsmn.c @@ -25,7 +25,7 @@ */ /* - * Driver for the AMD Family 15h and 17h CPU System Management Network. + * Driver for the AMD Family 15h, 17h, 19h, 1Ah CPU System Management Network. */ #include @@ -62,6 +62,10 @@ #define PCI_DEVICE_ID_AMD_19H_M40H_ROOT 0x14b5 #define PCI_DEVICE_ID_AMD_19H_M60H_ROOT 0x14d8 /* Also F1AH M40H */ #define PCI_DEVICE_ID_AMD_19H_M70H_ROOT 0x14e8 +#define PCI_DEVICE_ID_AMD_1AH_M00H_ROOT 0x153a +#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507 +#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122 + struct pciid; struct amdsmn_softc { @@ -129,6 +133,24 @@ .amdsmn_addr_reg = F17H_SMN_ADDR_REG, .amdsmn_data_reg = F17H_SMN_DATA_REG, }, + { + .amdsmn_vendorid = CPU_VENDOR_AMD, + .amdsmn_deviceid = PCI_DEVICE_ID_AMD_1AH_M00H_ROOT, + .amdsmn_addr_reg = F17H_SMN_ADDR_REG, + .amdsmn_data_reg = F17H_SMN_DATA_REG, + }, + { + .amdsmn_vendorid = CPU_VENDOR_AMD, + .amdsmn_deviceid = PCI_DEVICE_ID_AMD_1AH_M20H_ROOT, + .amdsmn_addr_reg = F17H_SMN_ADDR_REG, + .amdsmn_data_reg = F17H_SMN_DATA_REG, + }, + { + .amdsmn_vendorid = CPU_VENDOR_AMD, + .amdsmn_deviceid = PCI_DEVICE_ID_AMD_1AH_M60H_ROOT, + .amdsmn_addr_reg = F17H_SMN_ADDR_REG, + .amdsmn_data_reg = F17H_SMN_DATA_REG, + }, }; /* @@ -216,7 +238,7 @@ default: return (ENXIO); } - device_set_descf(dev, "AMD Family %xh System Management Network", + device_set_descf(dev, "AMD Family %02Xh System Management Network", family); return (BUS_PROBE_GENERIC); diff --git a/sys/dev/amdtemp/amdtemp.c b/sys/dev/amdtemp/amdtemp.c --- a/sys/dev/amdtemp/amdtemp.c +++ b/sys/dev/amdtemp/amdtemp.c @@ -117,6 +117,9 @@ #define DEVICEID_AMD_HOSTB19H_M40H_ROOT 0x14b5 #define DEVICEID_AMD_HOSTB19H_M60H_ROOT 0x14d8 /* Also F1AH M40H */ #define DEVICEID_AMD_HOSTB19H_M70H_ROOT 0x14e8 +#define DEVICEID_AMD_HOSTB1AH_M00H_ROOT 0x153a +#define DEVICEID_AMD_HOSTB1AH_M20H_ROOT 0x1507 +#define DEVICEID_AMD_HOSTB1AH_M60H_ROOT 0x1122 static const struct amdtemp_product { uint16_t amdtemp_vendorid; @@ -145,6 +148,9 @@ { VENDORID_AMD, DEVICEID_AMD_HOSTB19H_M40H_ROOT, false }, { VENDORID_AMD, DEVICEID_AMD_HOSTB19H_M60H_ROOT, false }, { VENDORID_AMD, DEVICEID_AMD_HOSTB19H_M70H_ROOT, false }, + { VENDORID_AMD, DEVICEID_AMD_HOSTB1AH_M00H_ROOT, false }, + { VENDORID_AMD, DEVICEID_AMD_HOSTB1AH_M20H_ROOT, false }, + { VENDORID_AMD, DEVICEID_AMD_HOSTB1AH_M60H_ROOT, false }, }; /* @@ -166,7 +172,7 @@ #define AMDTEMP_15H_M60H_REPTMP_CTRL 0xd8200ca4 /* - * Reported Temperature, Family 17h + * Reported Temperature, Family 17h - 1Ah * * According to AMD OSRR for 17H, section 4.2.1, bits 31-21 of this register * provide the current temp. bit 19, when clear, means the temp is reported in @@ -294,21 +300,33 @@ static int amdtemp_probe(device_t dev) { - uint32_t family, model; + uint32_t family, model, stepping; - if (resource_disabled("amdtemp", 0)) + if (resource_disabled("amdtemp", 0)) { + if (bootverbose) + device_printf(dev, "Resource disabled\n"); return (ENXIO); - if (!amdtemp_match(device_get_parent(dev), NULL)) + } + if (!amdtemp_match(device_get_parent(dev), NULL)) { + if (bootverbose) + device_printf(dev, "amdtemp_match() failed\n"); return (ENXIO); + } family = CPUID_TO_FAMILY(cpu_id); model = CPUID_TO_MODEL(cpu_id); + stepping = CPUID_TO_STEPPING(cpu_id); switch (family) { case 0x0f: - if ((model == 0x04 && (cpu_id & CPUID_STEPPING) == 0) || - (model == 0x05 && (cpu_id & CPUID_STEPPING) <= 1)) + if ((model == 0x04 && stepping == 0) || + (model == 0x05 && stepping <= 1)) { + if (bootverbose) + device_printf(dev, + "Unsupported (Family=%02Xh, Model=%02Xh, Stepping=%02Xh)\n", + family, model, stepping); return (ENXIO); + } break; case 0x10: case 0x11: @@ -323,7 +341,8 @@ default: return (ENXIO); } - device_set_desc(dev, "AMD CPU On-Die Thermal Sensors"); + device_set_descf(dev, "AMD Family %02Xh CPU On-Die Thermal Sensors", + family); return (BUS_PROBE_GENERIC); } @@ -484,7 +503,7 @@ needsmn = true; break; default: - device_printf(dev, "Bogus family 0x%x\n", family); + device_printf(dev, "Bogus family %02Xh\n", family); return (ENXIO); } @@ -493,7 +512,7 @@ device_get_parent(dev), "amdsmn", -1); if (sc->sc_smn == NULL) { if (bootverbose) - device_printf(dev, "No SMN device found\n"); + device_printf(dev, "No amdsmn(4) device found\n"); return (ENXIO); } } @@ -509,7 +528,7 @@ device_printf(dev, "Erratum 319: temperature measurement may be inaccurate\n"); if (bootverbose) - device_printf(dev, "Found %d cores and %d sensors.\n", + device_printf(dev, "Found %d cores and %d sensors\n", sc->sc_ncores, sc->sc_ntemps > 1 ? sc->sc_ntemps * sc->sc_ncores : 1); @@ -857,7 +876,7 @@ break; default: device_printf(dev, - "Unrecognized Family 17h Model: %02xh\n", model); + "Unrecognized Family 17h Model: %02Xh\n", model); return; } @@ -877,7 +896,7 @@ maxreg = 8; _Static_assert((int)NUM_CCDS >= 8, ""); break; - case 0x10 ... 0x1f: + case 0x10 ... 0x1f: /* Zen4 EPYC "Genoa" */ sc->sc_temp_base = AMDTEMP_ZEN4_10H_CCD_TMP_BASE; maxreg = 12; _Static_assert((int)NUM_CCDS >= 12, ""); @@ -891,7 +910,7 @@ break; default: device_printf(dev, - "Unrecognized Family 19h Model: %02xh\n", model); + "Unrecognized Family 19h Model: %02Xh\n", model); return; } @@ -905,14 +924,16 @@ uint32_t maxreg; switch (model) { + case 0x00 ... 0x2f: /* Zen5 EPYC "Turin" */ case 0x40 ... 0x4f: /* Zen5 Ryzen "Granite Ridge" */ + case 0x60 ... 0x7f: /* ??? */ sc->sc_temp_base = AMDTEMP_ZEN4_CCD_TMP_BASE; maxreg = 8; _Static_assert((int)NUM_CCDS >= 8, ""); break; default: device_printf(dev, - "Unrecognized Family 1ah Model: %02xh\n", model); + "Unrecognized Family 1Ah Model: %02Xh\n", model); return; }