blob: cfef417d3917cc99cc87126e0065a1ab7f29434c [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
<%
page_width = (cfg.pages_per_bank-1).bit_length()
bank_width = (cfg.banks-1).bit_length()
total_pages = cfg.banks * cfg.pages_per_bank
bytes_per_page = cfg.words_per_page * cfg.word_bytes
total_byte_width = int(total_pages*bytes_per_page-1).bit_length()
info_type_width = (cfg.info_types-1).bit_length()
%>
{ name: "FLASH_CTRL",
clocking: [
{clock: "clk_i", reset: "rst_ni", primary: true},
{clock: "clk_otp_i", reset: "rst_otp_ni"}
]
bus_interfaces: [
{ protocol: "tlul", direction: "device", name: "core" }
{ protocol: "tlul", direction: "device", name: "prim" }
{ protocol: "tlul", direction: "device", name: "mem" }
],
available_input_list: [
{ name: "tck", desc: "jtag clock" },
{ name: "tms", desc: "jtag tms" },
{ name: "tdi", desc: "jtag input" },
],
available_output_list: [
{ name: "tdo", desc: "jtag output" },
],
interrupt_list: [
{ name: "prog_empty", desc: "Program FIFO empty" },
{ name: "prog_lvl", desc: "Program FIFO drained to level" },
{ name: "rd_full", desc: "Read FIFO full" },
{ name: "rd_lvl", desc: "Read FIFO filled to level" },
{ name: "op_done", desc: "Operation complete" },
{ name: "corr_err", desc: "Correctable error encountered"},
],
alert_list: [
{ name: "recov_err",
desc: "flash recoverable errors",
},
{ name: "fatal_err",
desc: "flash fatal errors"
},
],
// Define flash_ctrl <-> flash_phy struct package
inter_signal_list: [
{ struct: "flash_otp_key",
type: "req_rsp",
name: "otp",
act: "req",
package: "otp_ctrl_pkg"
},
{ struct: "lc_tx",
package: "lc_ctrl_pkg",
type: "uni"
act: "rcv"
name: "lc_nvm_debug_en"
},
{ struct: "mubi4"
package: "prim_mubi_pkg"
type: "uni"
act: "rcv"
name: "flash_bist_enable"
},
{ struct: "logic"
package: ""
type: "uni"
act: "rcv"
name: "flash_power_down_h"
},
{ struct: "logic"
package: ""
type: "uni"
act: "rcv"
name: "flash_power_ready_h"
},
{ struct: "",
package: "",
width: "2",
type: "io"
act: "none"
name: "flash_test_mode_a"
},
{ struct: "",
package: "",
type: "io"
act: "none"
name: "flash_test_voltage_h"
},
{ struct: "ast_dif",
package: "ast_pkg",
type: "uni"
act: "req"
name: "flash_alert"
},
{ struct: "lc_tx"
type: "uni"
name: "lc_creator_seed_sw_rw_en"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "lc_owner_seed_sw_rw_en"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "lc_iso_part_sw_rd_en"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "lc_iso_part_sw_wr_en"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "lc_seed_hw_rd_en"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "lc_escalate_en"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "rma_req"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "lc_tx"
type: "uni"
name: "rma_ack"
act: "req"
package: "lc_ctrl_pkg"
},
{ struct: "lc_flash_rma_seed"
type: "uni"
name: "rma_seed"
act: "rcv"
package: "lc_ctrl_pkg"
},
{ struct: "pwr_flash",
type: "uni",
name: "pwrmgr",
act: "req",
package: "pwrmgr_pkg"
},
{ struct: "keymgr_flash",
type: "uni",
name: "keymgr",
act: "req",
package: "flash_ctrl_pkg"
}
],
scan: "true", // Enable `scanmode_i` port
scan_en: "true", // Enable `scan_en_i` port
scan_reset: "true", // Enable `scan_rst_ni` port
param_list: [
// The reg parameters can be modified directly through top_*.hjson.
// The template will automatically propagate the appropriate values.
// Random netlist constants
{ name: "RndCnstAddrKey",
desc: "Compile-time random bits for default address key",
type: "flash_ctrl_pkg::flash_key_t"
randcount: "128",
randtype: "data", // randomize randcount databits
},
{ name: "RndCnstDataKey",
desc: "Compile-time random bits for default data key",
type: "flash_ctrl_pkg::flash_key_t"
randcount: "128",
randtype: "data", // randomize randcount databits
},
{ name: "RndCnstLfsrSeed",
desc: "Compile-time random bits for initial LFSR seed",
type: "flash_ctrl_pkg::lfsr_seed_t"
randcount: "32",
randtype: "data",
},
{ name: "RndCnstLfsrPerm",
desc: "Compile-time random permutation for LFSR output",
type: "flash_ctrl_pkg::lfsr_perm_t"
randcount: "32",
randtype: "perm",
},
{ name: "RegNumBanks",
desc: "Number of flash banks",
type: "int",
default: "${cfg.banks}",
local: "true"
},
{ name: "RegPagesPerBank",
desc: "Number of pages per bank",
type: "int",
default: "${cfg.pages_per_bank}",
local: "true"
},
{ name: "RegBusPgmResBytes",
desc: "Number of pages per bank",
type: "int",
default: "${cfg.pgm_resolution_bytes}",
local: "true"
},
{ name: "RegPageWidth",
desc: "Number of bits needed to represent the pages within a bank",
type: "int",
default: "${page_width}",
local: "true"
},
{ name: "RegBankWidth",
desc: "Number of bits needed to represent the number of banks",
type: "int",
default: "${bank_width}",
local: "true"
},
{ name: "NumRegions",
desc: "Number of configurable flash regions",
type: "int",
default: "8",
local: "true"
},
// The following parameters are derived from topgen and should not be
// direclty modified.
% for type in range(cfg.info_types):
{ name: "NumInfos${type}",
desc: "Number of configurable flash info pages for info type ${type}",
type: "int",
default: "${cfg.infos_per_bank[type]}",
local: "true"
},
% endfor
{ name: "WordsPerPage",
desc: "Number of words per page",
type: "int",
default: "${cfg.words_per_page}",
local: "true"
},
{ name: "BytesPerWord",
desc: "Number of bytes per word",
type: "int",
default: "${cfg.word_bytes}",
local: "true"
},
{ name: "BytesPerPage",
desc: "Number of bytes per page",
type: "int",
default: "${cfg.bytes_per_page}",
local: "true"
},
{ name: "BytesPerBank",
desc: "Number of bytes per bank",
type: "int",
default: "${cfg.bytes_per_bank}",
local: "true"
},
],
regwidth: "32",
registers: {
core: [
{ name: "DIS",
desc: "Disable flash functionality",
swaccess: "rw0c",
hwaccess: "hro",
fields: [
{ bits: "3:0",
name: "VAL",
mubi: true,
desc: '''
Disables flash functionality completely.
This is a shortcut mechanism used by the software to completely
kill flash in case of emergency.
To disable, set this field to anything other than false.
'''
resval: false,
tags: [// Dont touch disable, it has several side effects on the system
"excl:CsrAllTests:CsrExclWrite"],
},
]
},
{ name: "EXEC",
desc: "Controls whether flash can be used for code execution fetches",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "3:0",
mubi: true,
name: "EN",
desc: '''
A value of true allows flash to be used for code execution.
Any other value prevents code execution.
'''
resval: false
},
]
},
{ name: "INIT",
desc: "Controller init register",
swaccess: "rw1s",
hwaccess: "hro",
fields: [
{ bits: "0",
name: "VAL",
desc: '''
Initializes the flash controller.
During the initialization process, the flash controller reads out the root seeds
before allowing other usage of the flash controller.
'''
resval: "0"
tags: [// Dont init flash, it has several side effects on the status bits
"excl:CsrAllTests:CsrExclWrite"],
},
]
},
{ name: "CTRL_REGWEN",
swaccess: "ro",
hwaccess: "hwo",
hwext: "true",
desc: '''
Controls the configurability of the !!CONTROL register.
This register ensures the contents of !!CONTROL cannot be changed by software once a flash
operation has begun.
It unlocks whenever the existing flash operation completes, regardless of success or error.
''',
fields: [
{ bits: "0",
name: "EN",
desc: '''
Configuration enable.
This bit defaults to 1 and is set to 0 by hardware when flash operation is initiated.
When the controller completes the flash operation, this bit is set
back to 1 to allow software configuration of !!CONTROL
''',
resval: "1",
},
]
tags: [// This regwen is completely under HW management and thus cannot be manipulated
// by software.
"excl:CsrNonInitTests:CsrExclCheck"]
},
{ name: "CONTROL",
desc: "Control register",
regwen: "CTRL_REGWEN",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "0",
hwaccess: "hrw",
name: "START",
desc: '''
Start flash transaction. This bit shall only be set after the other fields of the
CONTROL register and ADDR have been programmed
'''
resval: "0"
tags: [// Dont enable flash - it causes several side-effects.
"excl:CsrAllTests:CsrExclWrite"],
},
{ bits: "5:4",
name: "OP",
desc: "Flash operation selection",
resval: "0"
enum: [
{ value: "0",
name: "Read",
desc: '''
Flash Read.
Read desired number of flash words
'''
},
{ value: "1",
name: "Prog",
desc: '''
Flash Program.
Program desired number of flash words
'''
},
{ value: "2",
name: "Erase",
desc: '''
Flash Erase Operation.
See ERASE_SEL for details on erase operation
'''
},
]
},
{ bits: "6",
name: "PROG_SEL",
desc: "Flash program operation type selection",
resval: "0"
enum: [
{ value: "0",
name: "Normal program",
desc: '''
Normal program operation to the flash
'''
},
{ value: "1",
name: "Program repair",
desc: '''
Repair program operation to the flash. Whether this is actually
supported depends on the underlying flash memory.
'''
},
]
},
{ bits: "7",
name: "ERASE_SEL",
desc: "Flash erase operation type selection",
resval: "0"
enum: [
{ value: "0",
name: "Page Erase",
desc: '''
Erase 1 page of flash
'''
},
{ value: "1",
name: "Bank Erase",
desc: '''
Erase 1 bank of flash
'''
},
]
},
{ bits: "8",
name: "PARTITION_SEL",
desc: '''
When doing a read, program or page erase operation, selects either info or data partition for operation.
When 0, select data partition - this is the portion of flash that is accessible both by the host and by the controller.
When 1, select info partition - this is the portion of flash that is only accessible by the controller.
When doing a bank erase operation, selects info partition also for erase.
When 0, bank erase only erases data partition.
When 1, bank erase erases data partition and info partition.
'''
resval: "0"
},
{ bits: "${9 + info_type_width -1}:9",
name: "INFO_SEL",
desc: '''
Informational partions can have multiple types.
This field selects the info type to be accessed.
'''
resval: "0"
},
{ bits: "27:16",
name: "NUM",
desc: "Number of bus words the flash operation should read or program.",
resval: "0"
},
]
},
{ name: "ADDR",
desc: "Address for flash operation",
swaccess: "rw",
hwaccess: "hro",
resval: "0",
fields: [
{ bits: "31:0",
name: "START",
desc: '''
Start address of a flash transaction. Software should supply the full byte address.
The flash controller will then truncate the address as needed. For read operations,
the flash controller will truncate to the closest, lower word aligned address. For
example, if 0x13 is supplied, the controller will perform a read at address 0x10.
Program operations behave similarly, the controller does not have read modified write
support.
For page erases, the controller will truncate to the closest lower page aligned
address. Similarly for bank erases, the controller will truncate to the closest
lower bank aligned address.
'''
resval: "0"
},
]
},
// Program type
{ name: "PROG_TYPE_EN",
desc: "Enable different program types",
swaccess: "rw0c",
hwaccess: "hro",
fields: [
{ bits: "0",
resval: "1",
name: "NORMAL",
desc: '''
Normal prog type available
'''
},
{ bits: "1",
resval: "1",
name: "REPAIR",
desc: '''
Repair prog type available
'''
},
]
},
// erase suspend support
{ name: "ERASE_SUSPEND",
desc: "Suspend erase",
swaccess: "rw",
hwaccess: "hrw",
fields: [
{ bits: "0",
resval: "0",
name: "REQ",
desc: '''
When 1, request erase suspend.
If no erase ongoing, the request is immediately cleared by hardware
If erase ongoing, the request is fed to the flash_phy and cleared when the suspend is handled.
'''
},
],
tags: [// Erase suspend must be directly tested
"excl:CsrAllTests:CsrExclWrite"],
},
// Data partition memory properties region setup
{ multireg: {
cname: "FLASH_CTRL",
name: "REGION_CFG_REGWEN"
desc: "Memory region registers configuration enable.",
count: "NumRegions",
swaccess: "rw0c",
hwaccess: "none",
compact: false,
fields: [
{ bits: "0",
name: "REGION",
resval: "1"
desc: "Region register write enable. Once set to 0, it can longer be configured to 1",
enum: [
{ value: "0",
name: "Region locked",
desc: '''
Region can no longer be configured until next reset
'''
},
{ value: "1",
name: "Region enabled",
desc: '''
Region can be configured
'''
},
]
},
],
},
},
{ multireg: {
cname: "FLASH_CTRL",
name: "MP_REGION_CFG_SHADOWED",
desc: "Memory property configuration for data partition",
count: "NumRegions",
swaccess: "rw",
hwaccess: "hro",
regwen: "REGION_CFG_REGWEN",
regwen_multi: true,
shadowed: "true",
update_err_alert: "recov_err",
storage_err_alert: "fatal_err",
fields: [
{ bits: "0",
name: "EN",
desc: '''
Region enabled, following fields apply
''',
resval: "0"
},
{ bits: "1",
name: "RD_EN",
desc: '''
Region can be read
''',
resval: "0"
},
{ bits: "2",
name: "PROG_EN",
desc: '''
Region can be programmed
''',
resval: "0"
}
{ bits: "3",
name: "ERASE_EN",
desc: '''
Region can be erased
''',
resval: "0"
}
{ bits: "4",
name: "SCRAMBLE_EN",
desc: '''
Region is scramble enabled.
''',
resval: "0"
}
{ bits: "5",
name: "ECC_EN",
desc: '''
Region is ECC enabled (both integrity and reliability ECC).
''',
resval: "0"
}
{ bits: "6",
name: "HE_EN",
desc: '''
Region is high endurance enabled.
''',
resval: "0"
}
{ bits: "${8 + bank_width + page_width - 1}:8",
name: "BASE",
desc: '''
Region base page. Note the granularity is page, not byte or word
''',
resval: "0"
},
{ bits: "${8 + 2*bank_width + 2*page_width}:${8 + bank_width + page_width}",
name: "SIZE",
desc: '''
Region size in number of pages
''',
resval: "0"
},
],
},
},
// Default region properties for data partition
{ name: "DEFAULT_REGION_SHADOWED",
desc: "Default region properties",
swaccess: "rw",
hwaccess: "hro",
shadowed: "true",
update_err_alert: "recov_err",
storage_err_alert: "fatal_err",
resval: "0",
fields: [
{ bits: "0",
name: "RD_EN",
desc: '''
Region can be read
''',
resval: "0"
},
{ bits: "1",
name: "PROG_EN",
desc: '''
Region can be programmed
''',
resval: "0"
}
{ bits: "2",
name: "ERASE_EN",
desc: '''
Region can be erased
''',
resval: "0"
},
{ bits: "3",
name: "SCRAMBLE_EN",
desc: '''
Region is scrambleenabled
''',
resval: "0"
}
{ bits: "4",
name: "ECC_EN",
desc: '''
Region is ECC enabled (both integrity and reliability ECC)
''',
resval: "0"
}
{ bits: "5",
name: "HE_EN",
desc: '''
Region is high endurance enabled
''',
resval: "0"
}
]
},
// Info partition memory properties setup
% for bank in range(cfg.banks):
% for idx in range(cfg.info_types):
{ multireg: {
cname: "FLASH_CTRL",
name: "BANK${bank}_INFO${idx}_REGWEN"
desc: "Memory region registers configuration enable.",
count: "NumInfos${idx}",
swaccess: "rw0c",
hwaccess: "none",
compact: false,
fields: [
{ bits: "0",
name: "REGION",
resval: "1"
desc: "Info${idx} page write enable. Once set to 0, it can longer be configured to 1",
enum: [
{ value: "0",
name: "Page locked",
desc: '''
Region can no longer be configured until next reset
'''
},
{ value: "1",
name: "Page enabled",
desc: '''
Region can be configured
'''
},
]
},
],
},
},
{ multireg: {
cname: "FLASH_CTRL",
name: "BANK${bank}_INFO${idx}_PAGE_CFG_SHADOWED",
desc: '''
Memory property configuration for info partition in bank${bank},
Unlike data partition, each page is individually configured.
'''
count: "NumInfos${idx}",
swaccess: "rw",
hwaccess: "hro",
regwen: "BANK${bank}_INFO${idx}_REGWEN",
regwen_multi: true,
shadowed: "true",
update_err_alert: "recov_err",
storage_err_alert: "fatal_err",
fields: [
{ bits: "0",
name: "EN",
desc: '''
Region enabled, following fields apply
''',
resval: "0"
},
{ bits: "1",
name: "RD_EN",
desc: '''
Region can be read
''',
resval: "0"
},
{ bits: "2",
name: "PROG_EN",
desc: '''
Region can be programmed
''',
resval: "0"
}
{ bits: "3",
name: "ERASE_EN",
desc: '''
Region can be erased
''',
resval: "0"
}
{ bits: "4",
name: "SCRAMBLE_EN",
desc: '''
Region is scramble enabled.
''',
resval: "0"
}
{ bits: "5",
name: "ECC_EN",
desc: '''
Region is ECC enabled (both integrity and reliability ECC).
''',
resval: "0"
}
{ bits: "6",
name: "HE_EN",
desc: '''
Region is high endurance enabled.
''',
resval: "0"
}
],
},
},
% endfor
% endfor
{ name: "BANK_CFG_REGWEN"
desc: "Bank configuration registers configuration enable.",
swaccess: "rw0c",
hwaccess: "none",
fields: [
{ bits: "0",
name: "BANK",
resval: "1"
desc: "Bank register write enable. Once set to 0, it can longer be configured to 1",
enum: [
{ value: "0",
name: "Bank locked",
desc: '''
Bank can no longer be configured until next reset
'''
},
{ value: "1",
name: "Bank enabled",
desc: '''
Bank can be configured
'''
},
]
},
],
},
{ multireg: {
cname: "FLASH_CTRL",
name: "MP_BANK_CFG_SHADOWED",
desc: "Memory properties bank configuration",
count: "RegNumBanks",
swaccess: "rw",
hwaccess: "hro",
regwen: "BANK_CFG_REGWEN",
shadowed: "true",
update_err_alert: "recov_err",
storage_err_alert: "fatal_err",
fields: [
{ bits: "0",
name: "ERASE_EN",
desc: '''
Bank wide erase enable
''',
resval: "0"
},
],
},
},
{ name: "OP_STATUS",
desc: "Flash Operation Status",
swaccess: "rw",
hwaccess: "hwo",
fields: [
{ bits: "0", name: "done",
desc: "Flash operation done. Set by HW, cleared by SW" },
{ bits: "1", name: "err",
desc: "Flash operation error. Set by HW, cleared by SW. See !!ERR_CODE for more details."},
]
},
{ name: "STATUS",
desc: "Flash Controller Status",
swaccess: "ro",
hwaccess: "hwo",
fields: [
{ bits: "0", name: "rd_full", desc: "Flash read FIFO full, software must consume data"},
{ bits: "1", name: "rd_empty", desc: "Flash read FIFO empty", resval: "1"},
{ bits: "2", name: "prog_full", desc: "Flash program FIFO full"},
{ bits: "3", name: "prog_empty", desc: "Flash program FIFO empty, software must provide data", resval: "1"},
{ bits: "4", name: "init_wip", desc: "Flash controller undergoing init, inclusive of phy init"},
]
},
{ name: "ERR_CODE",
desc: '''
Flash error code register.
This register tabulates detailed error status of the flash.
This is separate from !!OP_STATUS, which is used to indicate the current state of the software initiated
flash operation.
Note, all errors in this register are considered recoverable errors, ie, errors that could have been
generated by software.
'''
swaccess: "rw1c",
hwaccess: "hwo",
fields: [
{ bits: "0",
name: "oob_err",
desc: '''
The supplied address !!ADDR is invalid and out of bounds.
This is a synchronous error.
'''
},
{ bits: "1",
name: "mp_err",
desc: '''
Flash access has encountered an access permission error.
Please see !!ERR_ADDR for exact address.
This is a synchronous error.
'''
},
{ bits: "2",
name: "rd_err",
desc: '''
Flash read has an uncorrectable data error.
Please see !!ERR_ADDR for exact address.
This is a synchronous error.
'''
},
{ bits: "3",
name: "prog_win_err",
desc: '''
Flash program has a window resolution error. Ie, the start of program
and end of program are in different windows. Please check !!ADDR.
This is a synchronous error.
'''
},
{ bits: "4",
name: "prog_type_err",
desc: '''
Flash program selected unavailable type, see !!PROG_TYPE_EN.
This is a synchronous error.
'''
},
{ bits: "5",
name: "flash_phy_err",
desc: '''
The flash access encountered a native flash error.
Please check the vendor specs for details of the error.
This is a synchronous error.
'''
},
{ bits: "6",
name: "update_err",
desc: '''
A shadow register encountered an update error.
'''
},
]
},
{ name: "FAULT_STATUS",
desc: '''
Flash fault status register.
This register tabulates detailed fault status of the flash.
These are errors that are impossible to have been caused by software or unrecoverable
in nature.
'''
swaccess: "ro",
hwaccess: "hrw",
fields: [
{ bits: "0",
name: "oob_err",
desc: '''
The flash hardware interface supplied an out of bound value.
'''
},
{ bits: "1",
name: "mp_err",
desc: '''
The flash hardware interface encountered a memory permission error.
'''
},
{ bits: "2",
name: "rd_err",
desc: '''
The flash hardware interface encountered a read data error.
'''
},
{ bits: "3",
name: "prog_win_err",
desc: '''
The flash hardware interface encountered a program resolution error.
'''
},
{ bits: "4",
name: "prog_type_err",
desc: '''
The flash hardware interface encountered a program type error.
'''
},
{ bits: "5",
name: "flash_phy_err",
desc: '''
The flash hardware interface encountered a native flash error.
'''
},
{ bits: "6",
name: "reg_intg_err",
desc: '''
The flash controller encountered a register integrity error.
'''
},
{ bits: "7",
name: "phy_intg_err",
desc: '''
The flash memory encountered a register integrity error.
'''
},
{ bits: "8",
name: "lcmgr_err",
desc: '''
The life cycle management interface has encountered a fatal error.
There is an error with the RMA state machine or counts.
'''
},
{ bits: "9",
name: "storage_err",
desc: '''
A shadow register encountered a storage fault.
'''
},
]
},
{ name: "ERR_ADDR",
desc: "Synchronous error address",
swaccess: "ro",
hwaccess: "hwo",
fields: [
{ bits: "31:0",
resval: 0,
},
]
},
{ multireg: {
cname: "ECC_SINGLE_ERR",
name: "ECC_SINGLE_ERR_CNT",
desc: "Total number of single bit ECC error count",
count: "RegNumBanks",
swaccess: "rw",
hwaccess: "hrw",
fields: [
{ bits: "7:0",
desc: "This count will not wrap when saturated",
resval: 0,
},
]
}
},
{ multireg: {
cname: "ECC_SINGLE_ERR",
name: "ECC_SINGLE_ERR_ADDR",
desc: "Latest address of ECC single err",
count: "RegNumBanks",
swaccess: "ro",
hwaccess: "hwo",
fields: [
{ bits: "${total_byte_width-1}:0",
desc: "Latest single error address for this bank",
resval: 0,
},
]
}
}
{ name: "PHY_ERR_CFG_REGWEN",
swaccess: "rw0c",
hwaccess: "none",
desc: '''
Controls the configurability of the !!PHY_ERR_CFG register.
''',
fields: [
{ bits: "0",
name: "EN",
desc: '''
Configuration enable.
''',
resval: "1",
},
]
},
{ name: "PHY_ERR_CFG",
regwen: "PHY_ERR_CFG_REGWEN",
desc: "Phy error configuration",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "0",
name: "ECC_MULTI_ERR_DATA_EN",
desc: '''
Transaction error response for ECC multi bit errors in data type transactions.
When set to 1, the error response is propagated to the source.
When set to 0, the error response is silenced.
Note this register only controls whether an error response is generated to the source
for data transactions. It does not control whether !!ERR_CODE and its associated error
status register collects error information.
This can be used by software to dictate whether a multi-bit error should be reflected as a
bus error to bus hosts or the flash controller.
The reason this may not be desired is because software may want to triage the actual bit change,
and that would not be possible if an error response is always generated. The hosts may simply
react on the error and discard the data.
'''
},
]
tags: [ // alert triggers should be tested by directed tests
"excl:CsrAllTests:CsrExclWrite"]
},
{ name: "PHY_ALERT_CFG",
desc: "Phy alert configuration",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "0",
name: "alert_ack",
desc: "Acknowledge flash phy alert"
},
{ bits: "1",
name: "alert_trig",
desc: "Trigger flash phy alert"
}
]
tags: [ // alert triggers should be tested by directed tests
"excl:CsrAllTests:CsrExclWrite"]
},
{ name: "PHY_STATUS",
desc: "Flash Phy Status",
swaccess: "ro",
hwaccess: "hwo",
fields: [
{ bits: "0",
name: "init_wip",
desc: "Flash phy controller initializing"
},
{ bits: "1",
name: "prog_normal_avail",
resval: "0x1",
desc: "Normal program supported"
},
{ bits: "2",
name: "prog_repair_avail",
resval: "0x1",
desc: "Program repair supported"
},
]
},
{ name: "Scratch",
desc: "Flash Controller Scratch",
swaccess: "rw",
fields: [
{ bits: "31:0", name: "data", desc: "Flash ctrl scratch register" },
]
},
{ name: "FIFO_LVL",
desc: "Programmable depth where FIFOs should generate interrupts",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "4:0",
name: "PROG",
desc: '''
When the program FIFO drains to this level, trigger an interrupt.
Default value is set such that interrupt does not trigger at reset.
'''
resval: "0xF"
},
{ bits: "12:8",
name: "RD",
desc: '''
When the read FIFO fills to this level, trigger an interrupt.
Default value is set such that interrupt does not trigger at reset.
'''
resval: "0xF"
},
]
}
{ name: "FIFO_RST",
desc: "Reset for flash controller FIFOs",
swaccess: "rw",
hwaccess: "hro",
resval: "0",
fields: [
{ bits: "0",
name: "EN",
desc: '''
Active high resets for both program and read FIFOs. This is especially useful after the controller
encounters an error of some kind.
This bit will hold the FIFO in reset as long as it is set.
'''
resval: "0"
},
]
},
{ window: {
name: "prog_fifo",
items: "1",
validbits: "32",
byte-write: "false",
unusual: "false"
swaccess: "wo",
desc: '''
Flash program FIFO.
The FIFO is 16 entries of 4B flash words. This FIFO can only be programmed
by software after a program operation has been initiated via the !!CONTROL register.
This ensures accidental programming of the program FIFO cannot lock up the system.
'''
},
},
{ window: {
name: "rd_fifo",
items: "1",
validbits: "32",
byte-write: "false",
unusual: "false"
swaccess: "ro",
desc: '''
Flash read FIFO.
The FIFO is 16 entries of 4B flash words
'''
},
},
],
prim: []
mem: []
}
}