blob: 58f250185328ce600059e30092871760278f9ff8 [file] [log] [blame] [edit]
/*
* This file is part of the flashrom project.
*
* Copyright 2021 Google LLC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <string.h>
#include "flash.h"
/* Cros flashrom needs to be able to automatically identify the board's flash
* without additional input. If multiple flashchip entries are considered to be
* suitable matches, flashrom will fail to identify the chip and be unable to
* perform the requested operations.
*
* This function allows flashrom to always pick a single flashchip entry, by
* filtering out all unwanted duplicate flashchip entries and leaving only the
* one we want to use.
*/
bool is_chipname_duplicate(const struct flashchip *chip)
{
/* The "GD25B128B/GD25Q128B" and "GD25Q127C/GD25Q128C" chip entries
* have the same vendor and model IDs.
*
* Historically cros flashrom only had the "C" entry; an initial
* attempt to import the "B" from upstream entry resulted in flashrom
* being unable to identify the flash on Atlas and Nocturne boards,
* causing flashrom failures documented in b/168943314.
*
* After introducing GD25Q128E, we need to split GD25Q127C/GD25Q128C
* into GD25Q127C/GD25Q128E and GD25Q128C since 127C and 128C actually
* have different features (mainly QPI).
* GD25Q128C is phased out now, so we mark GD25Q128C as duplicated.
*/
if(!strcmp(chip->name, "GD25B128B/GD25Q128B") ||
!strcmp(chip->name, "GD25Q128C"))
return true;
/* MX25L128... has been split into several entries:
* "MX25L12805D" (b/190574697), "MX25L12833F",
* "MX25L12835F/MX25L12873F", "MX25L12845E/MX25L12865E" (b/332486637),
* and "MX25L12850F" (CB:81350),
* We are actually using MX25L12833F, so mark the others as duplicate.
*/
if(!strcmp(chip->name, "MX25L12805D") ||
!strcmp(chip->name, "MX25L12835F/MX25L12873F") ||
!strcmp(chip->name, "MX25L12845E/MX25L12865E") ||
!strcmp(chip->name, "MX25L12850F"))
return true;
/* W25Q256.V has been split into two entries: W25Q256FV and
* W25Q256JV_Q.
* Marking the latter as duplicate.
*/
if(!strcmp(chip->name, "W25Q256JV_Q")) return true;
/* W25Q32.W has been split into three entries:
* W25Q32BW/W25Q32CW/W25Q32DW, W25Q32FW and W25Q32JW...Q
* We are actually using W25Q32DW, so mark the last two as duplicate.
*/
if(!strcmp(chip->name, "W25Q32FW") ||
!strcmp(chip->name, "W25Q32JW...Q"))
return true;
return false;
}