Author: stefanct
Date: Tue Jan  6 00:00:14 2015
New Revision: 1861
URL: http://flashrom.org/trac/flashrom/changeset/1861

Log:
Fix wrong density encoding on Intel Silvermont.

Silvermont (Bay Trail, Rangeley, Avoton) seems to still use the old
density encoding with 3 bits per chip. Documentation is unavailable
(held concealed by Intel) but thanks to the efforts of Tai-Hong
(Type) Wu the layout is clear now. This patch is based on his one
but solves the issue differently thus reducing the code complexity.

Signed-off-by: Tai-Hong Wu <[email protected]>
Signed-off-by: Stefan Tauner <[email protected]>
Acked-by: Stefan Tauner <[email protected]>

Modified:
   trunk/ich_descriptors.c
   trunk/ich_descriptors.h

Modified: trunk/ich_descriptors.c
==============================================================================
--- trunk/ich_descriptors.c     Sat Dec 20 21:25:19 2014        (r1860)
+++ trunk/ich_descriptors.c     Tue Jan  6 00:00:14 2015        (r1861)
@@ -127,27 +127,27 @@
        case CHIPSET_ICH10:
        case CHIPSET_5_SERIES_IBEX_PEAK:
        case CHIPSET_6_SERIES_COUGAR_POINT:
-       case CHIPSET_7_SERIES_PANTHER_POINT: {
+       case CHIPSET_7_SERIES_PANTHER_POINT:
+       case CHIPSET_BAYTRAIL: {
                uint8_t size_enc;
                if (idx == 0) {
-                       size_enc = desc->component.old.comp1_density;
+                       size_enc = desc->component.dens_old.comp1_density;
                } else {
-                       size_enc = desc->component.old.comp2_density;
+                       size_enc = desc->component.dens_old.comp2_density;
                }
                if (size_enc > 5)
                        return "reserved";
                return size_str[size_enc];
        }
        case CHIPSET_8_SERIES_LYNX_POINT:
-       case CHIPSET_BAYTRAIL:
        case CHIPSET_8_SERIES_LYNX_POINT_LP:
        case CHIPSET_8_SERIES_WELLSBURG:
        case CHIPSET_9_SERIES_WILDCAT_POINT: {
                uint8_t size_enc;
                if (idx == 0) {
-                       size_enc = desc->component.new.comp1_density;
+                       size_enc = desc->component.dens_new.comp1_density;
                } else {
-                       size_enc = desc->component.new.comp2_density;
+                       size_enc = desc->component.dens_new.comp2_density;
                }
                if (size_enc > 7)
                        return "reserved";
@@ -207,16 +207,16 @@
                msg_pdbg2("Component 2 density:            %s\n", 
pprint_density(cs, desc, 1));
        else
                msg_pdbg2("Component 2 is not used.\n");
-       msg_pdbg2("Read Clock Frequency:           %s\n", pprint_freq(cs, 
desc->component.common.freq_read));
-       msg_pdbg2("Read ID and Status Clock Freq.: %s\n", pprint_freq(cs, 
desc->component.common.freq_read_id));
-       msg_pdbg2("Write and Erase Clock Freq.:    %s\n", pprint_freq(cs, 
desc->component.common.freq_write));
-       msg_pdbg2("Fast Read is %ssupported.\n", 
desc->component.common.fastread ? "" : "not ");
-       if (desc->component.common.fastread)
+       msg_pdbg2("Read Clock Frequency:           %s\n", pprint_freq(cs, 
desc->component.modes.freq_read));
+       msg_pdbg2("Read ID and Status Clock Freq.: %s\n", pprint_freq(cs, 
desc->component.modes.freq_read_id));
+       msg_pdbg2("Write and Erase Clock Freq.:    %s\n", pprint_freq(cs, 
desc->component.modes.freq_write));
+       msg_pdbg2("Fast Read is %ssupported.\n", desc->component.modes.fastread 
? "" : "not ");
+       if (desc->component.modes.fastread)
                msg_pdbg2("Fast Read Clock Frequency:      %s\n",
-                         pprint_freq(cs, 
desc->component.common.freq_fastread));
+                         pprint_freq(cs, desc->component.modes.freq_fastread));
        if (cs > CHIPSET_6_SERIES_COUGAR_POINT)
                msg_pdbg2("Dual Output Fast Read Support:  %sabled\n",
-                         desc->component.new.dual_output ? "dis" : "en");
+                         desc->component.modes.dual_output ? "dis" : "en");
        if (desc->component.FLILL == 0)
                msg_pdbg2("No forbidden opcodes.\n");
        else {
@@ -816,22 +816,22 @@
        case CHIPSET_5_SERIES_IBEX_PEAK:
        case CHIPSET_6_SERIES_COUGAR_POINT:
        case CHIPSET_7_SERIES_PANTHER_POINT:
+       case CHIPSET_BAYTRAIL:
                if (idx == 0) {
-                       size_enc = desc->component.old.comp1_density;
+                       size_enc = desc->component.dens_old.comp1_density;
                } else {
-                       size_enc = desc->component.old.comp2_density;
+                       size_enc = desc->component.dens_old.comp2_density;
                }
                size_max = 5;
                break;
        case CHIPSET_8_SERIES_LYNX_POINT:
-       case CHIPSET_BAYTRAIL:
        case CHIPSET_8_SERIES_LYNX_POINT_LP:
        case CHIPSET_8_SERIES_WELLSBURG:
        case CHIPSET_9_SERIES_WILDCAT_POINT:
                if (idx == 0) {
-                       size_enc = desc->component.new.comp1_density;
+                       size_enc = desc->component.dens_new.comp1_density;
                } else {
-                       size_enc = desc->component.new.comp2_density;
+                       size_enc = desc->component.dens_new.comp2_density;
                }
                size_max = 7;
                break;
@@ -842,7 +842,7 @@
        }
 
        if (size_enc > size_max) {
-               msg_perr("Density of ICH SPI component with index %d is 
invalid."
+               msg_perr("Density of ICH SPI component with index %d is 
invalid.\n"
                         "Encoded density is 0x%x while maximum allowed is 
0x%x.\n",
                         idx, size_enc, size_max);
                return -1;

Modified: trunk/ich_descriptors.h
==============================================================================
--- trunk/ich_descriptors.h     Sat Dec 20 21:25:19 2014        (r1860)
+++ trunk/ich_descriptors.h     Tue Jan  6 00:00:14 2015        (r1861)
@@ -123,23 +123,19 @@
                                 freq_fastread  :3,
                                 freq_write     :3,
                                 freq_read_id   :3,
-                                               :2;
-               } common;
+                                dual_output    :1, /* new since Cougar Point/6 
*/
+                                               :1;
+               } modes;
                struct {
                        uint32_t comp1_density  :3,
                                 comp2_density  :3,
-                                               :11,
-                                               :13,
-                                               :2;
-               } old;
+                                               :26;
+               } dens_old;
                struct {
                        uint32_t comp1_density  :4, /* new since Lynx Point/8 */
                                 comp2_density  :4,
-                                               :9,
-                                               :13,
-                                dual_output    :1, /* new since Cougar Point/6 
*/
-                                               :1;
-               } new;
+                                               :24;
+               } dens_new;
        };
        union {                 /* 0x04 */
                uint32_t FLILL; /* Flash Invalid Instructions Register */

_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to