Author: cem
Date: Sat Apr 14 03:15:05 2018
New Revision: 332498
URL: https://svnweb.freebsd.org/changeset/base/332498

Log:
  cpufreq: Remove error-prone table terminators in favor of automatic sizing
  
  PR:           227388
  Reported by:  Vladimir Machulsky <xdelta AT meta.ua>
  Sponsored by: Dell EMC Isilon

Modified:
  head/sys/x86/cpufreq/est.c

Modified: head/sys/x86/cpufreq/est.c
==============================================================================
--- head/sys/x86/cpufreq/est.c  Sat Apr 14 00:20:47 2018        (r332497)
+++ head/sys/x86/cpufreq/est.c  Sat Apr 14 03:15:05 2018        (r332498)
@@ -71,6 +71,7 @@ typedef struct {
        const u_int     vendor_id;
        uint32_t        id32;
        freq_info       *freqtab;
+       size_t          tablen;
 } cpu_info;
 
 struct est_softc {
@@ -78,6 +79,7 @@ struct est_softc {
        int             acpi_settings;
        int             msr_settings;
        freq_info       *freq_list;
+       size_t          flist_len;
 };
 
 /* Convert MHz and mV into IDs for passing to the MSR. */
@@ -92,9 +94,9 @@ struct est_softc {
 #define FREQ_INFO(MHz, mV, bus_clk)                    \
        FREQ_INFO_PWR(MHz, mV, bus_clk, CPUFREQ_VAL_UNKNOWN)
 #define INTEL(tab, zhi, vhi, zlo, vlo, bus_clk)                \
-       { CPU_VENDOR_INTEL, ID32(zhi, vhi, zlo, vlo, bus_clk), tab }
+       { CPU_VENDOR_INTEL, ID32(zhi, vhi, zlo, vlo, bus_clk), tab, nitems(tab) 
}
 #define CENTAUR(tab, zhi, vhi, zlo, vlo, bus_clk)      \
-       { CPU_VENDOR_CENTAUR, ID32(zhi, vhi, zlo, vlo, bus_clk), tab }
+       { CPU_VENDOR_CENTAUR, ID32(zhi, vhi, zlo, vlo, bus_clk), tab, 
nitems(tab) }
 
 static int msr_info_enabled = 0;
 TUNABLE_INT("hw.est.msr_info", &msr_info_enabled);
@@ -131,7 +133,6 @@ static freq_info PM17_130[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1004, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM16_130[] = {
        /* 130nm 1.60GHz Pentium M */
@@ -141,7 +142,6 @@ static freq_info PM16_130[] = {
        FREQ_INFO(1000, 1164, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM15_130[] = {
        /* 130nm 1.50GHz Pentium M */
@@ -151,7 +151,6 @@ static freq_info PM15_130[] = {
        FREQ_INFO(1000, 1228, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM14_130[] = {
        /* 130nm 1.40GHz Pentium M */
@@ -160,7 +159,6 @@ static freq_info PM14_130[] = {
        FREQ_INFO(1000, 1308, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1180, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM13_130[] = {
        /* 130nm 1.30GHz Pentium M */
@@ -169,7 +167,6 @@ static freq_info PM13_130[] = {
        FREQ_INFO(1000, 1292, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1260, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM13_LV_130[] = {
        /* 130nm 1.30GHz Low Voltage Pentium M */
@@ -180,7 +177,6 @@ static freq_info PM13_LV_130[] = {
        FREQ_INFO( 900, 1004, INTEL_BUS_CLK),
        FREQ_INFO( 800,  988, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM12_LV_130[] = {
        /* 130 nm 1.20GHz Low Voltage Pentium M */
@@ -190,7 +186,6 @@ static freq_info PM12_LV_130[] = {
        FREQ_INFO( 900, 1020, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1004, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM11_LV_130[] = {
        /* 130 nm 1.10GHz Low Voltage Pentium M */
@@ -199,7 +194,6 @@ static freq_info PM11_LV_130[] = {
        FREQ_INFO( 900, 1100, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1020, INTEL_BUS_CLK),
        FREQ_INFO( 600,  956, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM11_ULV_130[] = {
        /* 130 nm 1.10GHz Ultra Low Voltage Pentium M */
@@ -208,7 +202,6 @@ static freq_info PM11_ULV_130[] = {
        FREQ_INFO( 900,  972, INTEL_BUS_CLK),
        FREQ_INFO( 800,  956, INTEL_BUS_CLK),
        FREQ_INFO( 600,  844, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM10_ULV_130[] = {
        /* 130 nm 1.00GHz Ultra Low Voltage Pentium M */
@@ -216,7 +209,6 @@ static freq_info PM10_ULV_130[] = {
        FREQ_INFO( 900,  988, INTEL_BUS_CLK),
        FREQ_INFO( 800,  972, INTEL_BUS_CLK),
        FREQ_INFO( 600,  844, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 
 /*
@@ -233,7 +225,6 @@ static freq_info PM_765A_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_765B_90[] = {
        /* 90 nm 2.10GHz Pentium M, VID #B */
@@ -245,7 +236,6 @@ static freq_info PM_765B_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_765C_90[] = {
        /* 90 nm 2.10GHz Pentium M, VID #C */
@@ -257,7 +247,6 @@ static freq_info PM_765C_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_765E_90[] = {
        /* 90 nm 2.10GHz Pentium M, VID #E */
@@ -269,7 +258,6 @@ static freq_info PM_765E_90[] = {
        FREQ_INFO(1000, 1100, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_755A_90[] = {
        /* 90 nm 2.00GHz Pentium M, VID #A */
@@ -281,7 +269,6 @@ static freq_info PM_755A_90[] = {
        FREQ_INFO(1000, 1100, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_755B_90[] = {
        /* 90 nm 2.00GHz Pentium M, VID #B */
@@ -293,7 +280,6 @@ static freq_info PM_755B_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_755C_90[] = {
        /* 90 nm 2.00GHz Pentium M, VID #C */
@@ -305,7 +291,6 @@ static freq_info PM_755C_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_755D_90[] = {
        /* 90 nm 2.00GHz Pentium M, VID #D */
@@ -317,7 +302,6 @@ static freq_info PM_755D_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_745A_90[] = {
        /* 90 nm 1.80GHz Pentium M, VID #A */
@@ -328,7 +312,6 @@ static freq_info PM_745A_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_745B_90[] = {
        /* 90 nm 1.80GHz Pentium M, VID #B */
@@ -339,7 +322,6 @@ static freq_info PM_745B_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_745C_90[] = {
        /* 90 nm 1.80GHz Pentium M, VID #C */
@@ -350,7 +332,6 @@ static freq_info PM_745C_90[] = {
        FREQ_INFO(1000, 1100, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_745D_90[] = {
        /* 90 nm 1.80GHz Pentium M, VID #D */
@@ -361,7 +342,6 @@ static freq_info PM_745D_90[] = {
        FREQ_INFO(1000, 1084, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_735A_90[] = {
        /* 90 nm 1.70GHz Pentium M, VID #A */
@@ -371,7 +351,6 @@ static freq_info PM_735A_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_735B_90[] = {
        /* 90 nm 1.70GHz Pentium M, VID #B */
@@ -381,7 +360,6 @@ static freq_info PM_735B_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_735C_90[] = {
        /* 90 nm 1.70GHz Pentium M, VID #C */
@@ -391,7 +369,6 @@ static freq_info PM_735C_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_735D_90[] = {
        /* 90 nm 1.70GHz Pentium M, VID #D */
@@ -401,7 +378,6 @@ static freq_info PM_735D_90[] = {
        FREQ_INFO(1000, 1100, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_725A_90[] = {
        /* 90 nm 1.60GHz Pentium M, VID #A */
@@ -411,7 +387,6 @@ static freq_info PM_725A_90[] = {
        FREQ_INFO(1000, 1132, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1068, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_725B_90[] = {
        /* 90 nm 1.60GHz Pentium M, VID #B */
@@ -421,7 +396,6 @@ static freq_info PM_725B_90[] = {
        FREQ_INFO(1000, 1132, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1068, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_725C_90[] = {
        /* 90 nm 1.60GHz Pentium M, VID #C */
@@ -431,7 +405,6 @@ static freq_info PM_725C_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_725D_90[] = {
        /* 90 nm 1.60GHz Pentium M, VID #D */
@@ -441,7 +414,6 @@ static freq_info PM_725D_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_715A_90[] = {
        /* 90 nm 1.50GHz Pentium M, VID #A */
@@ -450,7 +422,6 @@ static freq_info PM_715A_90[] = {
        FREQ_INFO(1000, 1148, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1068, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_715B_90[] = {
        /* 90 nm 1.50GHz Pentium M, VID #B */
@@ -459,7 +430,6 @@ static freq_info PM_715B_90[] = {
        FREQ_INFO(1000, 1148, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1068, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_715C_90[] = {
        /* 90 nm 1.50GHz Pentium M, VID #C */
@@ -468,7 +438,6 @@ static freq_info PM_715C_90[] = {
        FREQ_INFO(1000, 1132, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1068, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_715D_90[] = {
        /* 90 nm 1.50GHz Pentium M, VID #D */
@@ -477,7 +446,6 @@ static freq_info PM_715D_90[] = {
        FREQ_INFO(1000, 1116, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1052, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_778_90[] = {
        /* 90 nm 1.60GHz Low Voltage Pentium M */
@@ -491,7 +459,6 @@ static freq_info PM_778_90[] = {
        FREQ_INFO( 900, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1020, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_758_90[] = {
        /* 90 nm 1.50GHz Low Voltage Pentium M */
@@ -504,7 +471,6 @@ static freq_info PM_758_90[] = {
        FREQ_INFO( 900, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1020, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_738_90[] = {
        /* 90 nm 1.40GHz Low Voltage Pentium M */
@@ -516,7 +482,6 @@ static freq_info PM_738_90[] = {
        FREQ_INFO( 900, 1036, INTEL_BUS_CLK),
        FREQ_INFO( 800, 1020, INTEL_BUS_CLK),
        FREQ_INFO( 600,  988, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_773G_90[] = {
        /* 90 nm 1.30GHz Ultra Low Voltage Pentium M, VID #G */
@@ -688,7 +653,6 @@ static freq_info PM_733_90[] = {
        FREQ_INFO( 900,  892, INTEL_BUS_CLK),
        FREQ_INFO( 800,  876, INTEL_BUS_CLK),
        FREQ_INFO( 600,  812, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 static freq_info PM_723_90[] = {
        /* 90 nm 1.00GHz Ultra Low Voltage Pentium M */
@@ -696,7 +660,6 @@ static freq_info PM_723_90[] = {
        FREQ_INFO( 900,  908, INTEL_BUS_CLK),
        FREQ_INFO( 800,  876, INTEL_BUS_CLK),
        FREQ_INFO( 600,  812, INTEL_BUS_CLK),
-       FREQ_INFO(   0,    0, 1),
 };
 
 /*
@@ -713,7 +676,6 @@ static freq_info C7M_795[] = {
        FREQ_INFO_PWR( 800,  844, 133,  7000),
        FREQ_INFO_PWR( 667,  844, 133,  6000),
        FREQ_INFO_PWR( 533,  844, 133,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_785[] = {
        /* 1.80GHz Centaur C7-M 533 Mhz FSB */
@@ -724,7 +686,6 @@ static freq_info C7M_785[] = {
        FREQ_INFO_PWR( 800,  844, 133,  7000),
        FREQ_INFO_PWR( 667,  844, 133,  6000),
        FREQ_INFO_PWR( 533,  844, 133,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_765[] = {
        /* 1.60GHz Centaur C7-M 533 Mhz FSB */
@@ -734,7 +695,6 @@ static freq_info C7M_765[] = {
        FREQ_INFO_PWR( 800,  844, 133,  7000),
        FREQ_INFO_PWR( 667,  844, 133,  6000),
        FREQ_INFO_PWR( 533,  844, 133,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 
 static freq_info C7M_794[] = {
@@ -747,7 +707,6 @@ static freq_info C7M_794[] = {
        FREQ_INFO_PWR( 800,  844, 100,  7000),
        FREQ_INFO_PWR( 600,  844, 100,  6000),
        FREQ_INFO_PWR( 400,  844, 100,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_784[] = {
        /* 1.80GHz Centaur C7-M 400 Mhz FSB */
@@ -758,7 +717,6 @@ static freq_info C7M_784[] = {
        FREQ_INFO_PWR( 800,  844, 100,  7000),
        FREQ_INFO_PWR( 600,  844, 100,  6000),
        FREQ_INFO_PWR( 400,  844, 100,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_764[] = {
        /* 1.60GHz Centaur C7-M 400 Mhz FSB */
@@ -768,7 +726,6 @@ static freq_info C7M_764[] = {
        FREQ_INFO_PWR( 800,  844, 100,  7000),
        FREQ_INFO_PWR( 600,  844, 100,  6000),
        FREQ_INFO_PWR( 400,  844, 100,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_754[] = {
        /* 1.50GHz Centaur C7-M 400 Mhz FSB */
@@ -778,7 +735,6 @@ static freq_info C7M_754[] = {
        FREQ_INFO_PWR( 800,  844, 100,  7000),
        FREQ_INFO_PWR( 600,  844, 100,  6000),
        FREQ_INFO_PWR( 400,  844, 100,  5000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_771[] = {
        /* 1.20GHz Centaur C7-M 400 Mhz FSB */
@@ -787,7 +743,6 @@ static freq_info C7M_771[] = {
        FREQ_INFO_PWR( 800,  844, 100,  5500),
        FREQ_INFO_PWR( 600,  844, 100,  5000),
        FREQ_INFO_PWR( 400,  844, 100,  4000),
-       FREQ_INFO(0, 0, 1),
 };
 
 static freq_info C7M_775_ULV[] = {
@@ -798,7 +753,6 @@ static freq_info C7M_775_ULV[] = {
        FREQ_INFO_PWR( 800,  828, 100,  2800),
        FREQ_INFO_PWR( 600,  796, 100,  2500),
        FREQ_INFO_PWR( 400,  796, 100,  2000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_772_ULV[] = {
        /* 1.20GHz Centaur C7-M ULV */
@@ -807,7 +761,6 @@ static freq_info C7M_772_ULV[] = {
        FREQ_INFO_PWR( 800,  828, 100,  2800),
        FREQ_INFO_PWR( 600,  796, 100,  2500),
        FREQ_INFO_PWR( 400,  796, 100,  2000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_779_ULV[] = {
        /* 1.00GHz Centaur C7-M ULV */
@@ -815,7 +768,6 @@ static freq_info C7M_779_ULV[] = {
        FREQ_INFO_PWR( 800,  796, 100,  2800),
        FREQ_INFO_PWR( 600,  796, 100,  2500),
        FREQ_INFO_PWR( 400,  796, 100,  2000),
-       FREQ_INFO(0, 0, 1),
 };
 static freq_info C7M_770_ULV[] = {
        /* 1.00GHz Centaur C7-M ULV */
@@ -823,7 +775,6 @@ static freq_info C7M_770_ULV[] = {
        FREQ_INFO_PWR( 800,  796, 100,  2800),
        FREQ_INFO_PWR( 600,  796, 100,  2500),
        FREQ_INFO_PWR( 400,  796, 100,  2000),
-       FREQ_INFO(0, 0, 1),
 };
 
 static cpu_info ESTprocs[] = {
@@ -906,10 +857,13 @@ static int        est_probe(device_t parent);
 static int     est_attach(device_t parent);
 static int     est_detach(device_t parent);
 static int     est_get_info(device_t dev);
-static int     est_acpi_info(device_t dev, freq_info **freqs);
-static int     est_table_info(device_t dev, uint64_t msr, freq_info **freqs);
-static int     est_msr_info(device_t dev, uint64_t msr, freq_info **freqs);
-static freq_info *est_get_current(freq_info *freq_list);
+static int     est_acpi_info(device_t dev, freq_info **freqs,
+               size_t *freqslen);
+static int     est_table_info(device_t dev, uint64_t msr, freq_info **freqs,
+               size_t *freqslen);
+static int     est_msr_info(device_t dev, uint64_t msr, freq_info **freqs,
+               size_t *freqslen);
+static freq_info *est_get_current(freq_info *freq_list, size_t tablen);
 static int     est_settings(device_t dev, struct cf_setting *sets, int *count);
 static int     est_set(device_t dev, const struct cf_setting *set);
 static int     est_get(device_t dev, struct cf_setting *set);
@@ -1077,11 +1031,11 @@ est_get_info(device_t dev)
 
        sc = device_get_softc(dev);
        msr = rdmsr(MSR_PERF_STATUS);
-       error = est_table_info(dev, msr, &sc->freq_list);
+       error = est_table_info(dev, msr, &sc->freq_list, &sc->flist_len);
        if (error)
-               error = est_acpi_info(dev, &sc->freq_list);
+               error = est_acpi_info(dev, &sc->freq_list, &sc->flist_len);
        if (error)
-               error = est_msr_info(dev, msr, &sc->freq_list);
+               error = est_msr_info(dev, msr, &sc->freq_list, &sc->flist_len);
 
        if (error) {
                printf(
@@ -1094,7 +1048,7 @@ est_get_info(device_t dev)
 }
 
 static int
-est_acpi_info(device_t dev, freq_info **freqs)
+est_acpi_info(device_t dev, freq_info **freqs, size_t *freqslen)
 {
        struct est_softc *sc;
        struct cf_setting *sets;
@@ -1119,7 +1073,7 @@ est_acpi_info(device_t dev, freq_info **freqs)
                goto out;
 
        /* Parse settings into our local table format. */
-       table = malloc((count + 1) * sizeof(freq_info), M_DEVBUF, M_NOWAIT);
+       table = malloc(count * sizeof(*table), M_DEVBUF, M_NOWAIT);
        if (table == NULL) {
                error = ENOMEM;
                goto out;
@@ -1147,11 +1101,9 @@ est_acpi_info(device_t dev, freq_info **freqs)
        /* restore saved setting */
        est_set_id16(dev, saved_id16, 0);
 
-       /* Mark end of table with a terminator. */
-       bzero(&table[j], sizeof(freq_info));
-
        sc->acpi_settings = TRUE;
        *freqs = table;
+       *freqslen = j;
        error = 0;
 
 out:
@@ -1163,7 +1115,7 @@ out:
 }
 
 static int
-est_table_info(device_t dev, uint64_t msr, freq_info **freqs)
+est_table_info(device_t dev, uint64_t msr, freq_info **freqs, size_t *freqslen)
 {
        cpu_info *p;
        uint32_t id;
@@ -1178,12 +1130,13 @@ est_table_info(device_t dev, uint64_t msr, freq_info *
                return (EOPNOTSUPP);
 
        /* Make sure the current setpoint is valid. */
-       if (est_get_current(p->freqtab) == NULL) {
+       if (est_get_current(p->freqtab, p->tablen) == NULL) {
                device_printf(dev, "current setting not found in table\n");
                return (EOPNOTSUPP);
        }
 
        *freqs = p->freqtab;
+       *freqslen = p->tablen;
        return (0);
 }
 
@@ -1206,7 +1159,7 @@ bus_speed_ok(int bus)
  * based on the current clock speed and the upper 32 bits of the MSR.
  */
 static int
-est_msr_info(device_t dev, uint64_t msr, freq_info **freqs)
+est_msr_info(device_t dev, uint64_t msr, freq_info **freqs, size_t *freqslen)
 {
        struct est_softc *sc;
        freq_info *fp;
@@ -1236,7 +1189,7 @@ est_msr_info(device_t dev, uint64_t msr, freq_info **f
 
        /* Fill out a new freq table containing just the high and low freqs. */
        sc = device_get_softc(dev);
-       fp = malloc(sizeof(freq_info) * 3, M_DEVBUF, M_WAITOK | M_ZERO);
+       fp = malloc(sizeof(freq_info) * 2, M_DEVBUF, M_WAITOK | M_ZERO);
 
        /* First, the high frequency. */
        volts = id & 0xff;
@@ -1269,6 +1222,7 @@ est_msr_info(device_t dev, uint64_t msr, freq_info **f
        /* Table is already terminated due to M_ZERO. */
        sc->msr_settings = TRUE;
        *freqs = fp;
+       *freqslen = 2;
        return (0);
 }
 
@@ -1305,7 +1259,7 @@ est_set_id16(device_t dev, uint16_t id16, int need_che
 }
 
 static freq_info *
-est_get_current(freq_info *freq_list)
+est_get_current(freq_info *freq_list, size_t tablen)
 {
        freq_info *f;
        int i;
@@ -1318,7 +1272,7 @@ est_get_current(freq_info *freq_list)
         */
        for (i = 0; i < 5; i++) {
                est_get_id16(&id16);
-               for (f = freq_list; f->id16 != 0; f++) {
+               for (f = freq_list; f < freq_list + tablen; f++) {
                        if (f->id16 == id16)
                                return (f);
                }
@@ -1339,7 +1293,7 @@ est_settings(device_t dev, struct cf_setting *sets, in
                return (E2BIG);
 
        i = 0;
-       for (f = sc->freq_list; f->freq != 0; f++, i++) {
+       for (f = sc->freq_list; f < sc->freq_list + sc->flist_len; f++, i++) {
                sets[i].freq = f->freq;
                sets[i].volts = f->volts;
                sets[i].power = f->power;
@@ -1359,7 +1313,7 @@ est_set(device_t dev, const struct cf_setting *set)
 
        /* Find the setting matching the requested one. */
        sc = device_get_softc(dev);
-       for (f = sc->freq_list; f->freq != 0; f++) {
+       for (f = sc->freq_list; f < sc->freq_list + sc->flist_len; f++) {
                if (f->freq == set->freq)
                        break;
        }
@@ -1379,7 +1333,7 @@ est_get(device_t dev, struct cf_setting *set)
        freq_info *f;
 
        sc = device_get_softc(dev);
-       f = est_get_current(sc->freq_list);
+       f = est_get_current(sc->freq_list, sc->flist_len);
        if (f == NULL)
                return (ENXIO);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to