1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker *
4*0d6140beSAndroid Build Coastguard Worker * Copyright 2021 Google LLC
5*0d6140beSAndroid Build Coastguard Worker *
6*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
7*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
8*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; version 2 of the License.
9*0d6140beSAndroid Build Coastguard Worker *
10*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
11*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details.
14*0d6140beSAndroid Build Coastguard Worker */
15*0d6140beSAndroid Build Coastguard Worker
16*0d6140beSAndroid Build Coastguard Worker #include <string.h>
17*0d6140beSAndroid Build Coastguard Worker #include "flash.h"
18*0d6140beSAndroid Build Coastguard Worker
19*0d6140beSAndroid Build Coastguard Worker /* Cros flashrom needs to be able to automatically identify the board's flash
20*0d6140beSAndroid Build Coastguard Worker * without additional input. If multiple flashchip entries are considered to be
21*0d6140beSAndroid Build Coastguard Worker * suitable matches, flashrom will fail to identify the chip and be unable to
22*0d6140beSAndroid Build Coastguard Worker * perform the requested operations.
23*0d6140beSAndroid Build Coastguard Worker *
24*0d6140beSAndroid Build Coastguard Worker * This function allows flashrom to always pick a single flashchip entry, by
25*0d6140beSAndroid Build Coastguard Worker * filtering out all unwanted duplicate flashchip entries and leaving only the
26*0d6140beSAndroid Build Coastguard Worker * one we want to use.
27*0d6140beSAndroid Build Coastguard Worker */
is_chipname_duplicate(const struct flashchip * chip)28*0d6140beSAndroid Build Coastguard Worker bool is_chipname_duplicate(const struct flashchip *chip)
29*0d6140beSAndroid Build Coastguard Worker {
30*0d6140beSAndroid Build Coastguard Worker /* The "GD25B128B/GD25Q128B" and "GD25Q127C/GD25Q128C" chip entries
31*0d6140beSAndroid Build Coastguard Worker * have the same vendor and model IDs.
32*0d6140beSAndroid Build Coastguard Worker *
33*0d6140beSAndroid Build Coastguard Worker * Historically cros flashrom only had the "C" entry; an initial
34*0d6140beSAndroid Build Coastguard Worker * attempt to import the "B" from upstream entry resulted in flashrom
35*0d6140beSAndroid Build Coastguard Worker * being unable to identify the flash on Atlas and Nocturne boards,
36*0d6140beSAndroid Build Coastguard Worker * causing flashrom failures documented in b/168943314.
37*0d6140beSAndroid Build Coastguard Worker *
38*0d6140beSAndroid Build Coastguard Worker * After introducing GD25Q128E, we need to split GD25Q127C/GD25Q128C
39*0d6140beSAndroid Build Coastguard Worker * into GD25Q127C/GD25Q128E and GD25Q128C since 127C and 128C actually
40*0d6140beSAndroid Build Coastguard Worker * have different features (mainly QPI).
41*0d6140beSAndroid Build Coastguard Worker * GD25Q128C is phased out now, so we mark GD25Q128C as duplicated.
42*0d6140beSAndroid Build Coastguard Worker */
43*0d6140beSAndroid Build Coastguard Worker if(!strcmp(chip->name, "GD25B128B/GD25Q128B") ||
44*0d6140beSAndroid Build Coastguard Worker !strcmp(chip->name, "GD25Q128C"))
45*0d6140beSAndroid Build Coastguard Worker return true;
46*0d6140beSAndroid Build Coastguard Worker
47*0d6140beSAndroid Build Coastguard Worker /* MX25L128... has been split into several entries:
48*0d6140beSAndroid Build Coastguard Worker * "MX25L12805D" (b/190574697), "MX25L12833F",
49*0d6140beSAndroid Build Coastguard Worker * "MX25L12835F/MX25L12873F", "MX25L12845E/MX25L12865E" (b/332486637),
50*0d6140beSAndroid Build Coastguard Worker * and "MX25L12850F" (CB:81350),
51*0d6140beSAndroid Build Coastguard Worker * We are actually using MX25L12833F, so mark the others as duplicate.
52*0d6140beSAndroid Build Coastguard Worker */
53*0d6140beSAndroid Build Coastguard Worker if(!strcmp(chip->name, "MX25L12805D") ||
54*0d6140beSAndroid Build Coastguard Worker !strcmp(chip->name, "MX25L12835F/MX25L12873F") ||
55*0d6140beSAndroid Build Coastguard Worker !strcmp(chip->name, "MX25L12845E/MX25L12865E") ||
56*0d6140beSAndroid Build Coastguard Worker !strcmp(chip->name, "MX25L12850F"))
57*0d6140beSAndroid Build Coastguard Worker return true;
58*0d6140beSAndroid Build Coastguard Worker
59*0d6140beSAndroid Build Coastguard Worker /* W25Q256.V has been split into two entries: W25Q256FV and
60*0d6140beSAndroid Build Coastguard Worker * W25Q256JV_Q.
61*0d6140beSAndroid Build Coastguard Worker * Marking the latter as duplicate.
62*0d6140beSAndroid Build Coastguard Worker */
63*0d6140beSAndroid Build Coastguard Worker if(!strcmp(chip->name, "W25Q256JV_Q")) return true;
64*0d6140beSAndroid Build Coastguard Worker
65*0d6140beSAndroid Build Coastguard Worker /* W25Q32.W has been split into three entries:
66*0d6140beSAndroid Build Coastguard Worker * W25Q32BW/W25Q32CW/W25Q32DW, W25Q32FW and W25Q32JW...Q
67*0d6140beSAndroid Build Coastguard Worker * We are actually using W25Q32DW, so mark the last two as duplicate.
68*0d6140beSAndroid Build Coastguard Worker */
69*0d6140beSAndroid Build Coastguard Worker if(!strcmp(chip->name, "W25Q32FW") ||
70*0d6140beSAndroid Build Coastguard Worker !strcmp(chip->name, "W25Q32JW...Q"))
71*0d6140beSAndroid Build Coastguard Worker return true;
72*0d6140beSAndroid Build Coastguard Worker
73*0d6140beSAndroid Build Coastguard Worker /* The "GD25LQ255E" and "GD25LB256F/GD25LR256F" and chip entries
74*0d6140beSAndroid Build Coastguard Worker * have the same vendor and model IDs.
75*0d6140beSAndroid Build Coastguard Worker * Marking the latter as duplicate.
76*0d6140beSAndroid Build Coastguard Worker */
77*0d6140beSAndroid Build Coastguard Worker if(!strcmp(chip->name, "GD25LB256F/GD25LR256F")) return true;
78*0d6140beSAndroid Build Coastguard Worker
79*0d6140beSAndroid Build Coastguard Worker return false;
80*0d6140beSAndroid Build Coastguard Worker }
81