Refine Flash Component descriptor handling
Possible values as well as encodings have changed in newer chipsets as follows.
- Pre-PCH (i.e. ICH) chipsets had a maximum frequency of 33 MHz for all
operations
- Since Cougar Point the chipsets support dual output fast reads (encoded
in bit 30).
- Flash component density encoding has changed from 3 to 4 bits with Lynx
Point, currently allowing for up to 64 MB chips.
Corresponding to flashrom svn r1843.
Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
diff --git a/ich_descriptors.h b/ich_descriptors.h
index 3a44740..208e640 100644
--- a/ich_descriptors.h
+++ b/ich_descriptors.h
@@ -64,7 +64,7 @@
#define ICH_FREG_BASE(flreg) (((flreg) << 12) & 0x01fff000)
#define ICH_FREG_LIMIT(flreg) (((flreg) >> 4) & 0x01fff000)
-void prettyprint_ich_reg_vscc(uint32_t reg_val, int verbosity);
+void prettyprint_ich_reg_vscc(uint32_t reg_val, int verbosity, bool print_vcl);
struct ich_desc_content {
uint32_t FLVALSIG; /* 0x00 */
@@ -102,17 +102,44 @@
struct ich_desc_component {
union { /* 0x00 */
uint32_t FLCOMP; /* Flash Components Register */
+ /* FLCOMP encoding on various generations:
+ *
+ * Chipset/Generation max_speed dual_output density
+ * [MHz] bits max. bits
+ * ICH8: 33 N/A 5 0:2, 3:5
+ * ICH9: 33 N/A 5 0:2, 3:5
+ * ICH10: 33 N/A 5 0:2, 3:5
+ * Ibex Peak/5: 50 N/A 5 0:2, 3:5
+ * Cougar Point/6: 50 30 5 0:2, 3:5
+ * Patsburg: 50 30 5 0:2, 3:5
+ * Panther Point/7 50 30 5 0:2, 3:5
+ * Lynx Point/8: 50 30 7 0:3, 4:7
+ * Wildcat Point/9: 50 ?? (multi I/O) ? ?:?, ?:?
+ */
struct {
- uint32_t comp1_density :3,
- comp2_density :3,
- :11,
+ uint32_t :17,
freq_read :3,
fastread :1,
freq_fastread :3,
freq_write :3,
freq_read_id :3,
:2;
- };
+ } common;
+ struct {
+ uint32_t comp1_density :3,
+ comp2_density :3,
+ :11,
+ :13,
+ :2;
+ } 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;
};
union { /* 0x04 */
uint32_t FLILL; /* Flash Invalid Instructions Register */
@@ -555,7 +582,7 @@
void prettyprint_ich_descriptors(enum ich_chipset cs, const struct ich_descriptors *desc);
void prettyprint_ich_descriptor_content(const struct ich_desc_content *content);
-void prettyprint_ich_descriptor_component(const struct ich_descriptors *desc);
+void prettyprint_ich_descriptor_component(enum ich_chipset cs, const struct ich_descriptors *desc);
void prettyprint_ich_descriptor_region(const struct ich_descriptors *desc);
void prettyprint_ich_descriptor_master(const struct ich_desc_master *master);
@@ -568,7 +595,7 @@
#else /* ICH_DESCRIPTORS_FROM_DUMP */
int read_ich_descriptors_via_fdo(void *spibar, struct ich_descriptors *desc);
-int getFCBA_component_density(const struct ich_descriptors *desc, uint8_t idx);
+int getFCBA_component_density(enum ich_chipset cs, const struct ich_descriptors *desc, uint8_t idx);
#endif /* ICH_DESCRIPTORS_FROM_DUMP */
#endif /* __ICH_DESCRIPTORS_H__ */