SLAU962A December 2025 – June 2026 MSPM33C321A , MSPM33C321A-Q1
The GSC provides information on the security level, privilege level, and the write/erase protection level to the FPI. The FPI then uses these inputs to perform the authorization check and generate an error signal that is aggregated by the EAM. The error signal is used to block commands not allowed by safety or security settings, or if the system address is out of range. The values of the error signal are described in Table 5-7.
| # | Priority | Brief Description | Condition | Error/Authorization | Fault/Error (defined more in Section 6.3.2) |
|---|---|---|---|---|---|
| 1 | 1 (highest) | Default when not executing command | Flash Controller is not currently executing a command | 1 (error, not authorized)† | N/A |
| 2 | 2 | IDLE/NOOP (0x0) and CLEARSTATUS (0x5) commands are always allowed | The FLASHCTL.CMDTYPE.COMMAND equals IDLE/NOOP (0x0) or CLEARSTATUS (0x5) | 0 (no error, authorized) | N/A |
| 3 | 2 | Not a valid flash address for this controller configuration | System address (FLASHCTL.CMDADDR) is not an address contained in Flash Controller | 1 (error, not authorized) | FPI_ILLADDR |
| 4 | 2 | Reserved command | The FLASHCTL.CMDTYPE.COMMAND is reserved (0x7) | 1 (error, not authorized) | FPI_ILLCMD |
| 5 | 2 | Reserved sizes |
The FLASHCTL.CMDTYPE.SIZE is equal to either: EIGHTWORD (0x3), or A reserved value (0x6 or 0x7) |
1 (error, not authorized) | FPI_ILLSIZE |
| 6 | 2 | Unaligned address/size |
The FLASHCTL.CMDADDR is not aligned to the FLASHCTL.CMDTYPE.SIZE (this forces commands to not cross a sector boundary). Alignment is: 1. ONEWORD (0x0): alignment must be per 16 bytes (FLASHCTL.CMDADDR[3:0] must equal 4’b0000) 2. TWOWORD (0x1): alignment must be per 32 bytes (FLASHCTL.CMDADDR[4:0] must equal 5’b00000) 3. FOURWORD (0x2): alignment must be per 64 bytes (FLASHCTL.CMDADDR[5:0] must equal 6’b000000) 4. EIGHTWORD (0x3): not allowed; covered by 'Reserved sizes' rule 5. SECTOR (0x4): alignment must be per 2048 bytes (FLASHCTL.CMDADDR[10:0] must equal 11’b00000000000) 6. BANK (0x5): alignment is ignored |
1 (error, not authorized) | FPI_ILLSIZE |
| 7 | 2 | Illegal combination of programming commands and size | a) The FLASHCTL.CMDTYPE.COMMAND equals PROGRAM (0x1), and FLASHCTL.CMDTYPE.SIZE is equal to either: SECTOR (0x4), or BANK (0x5) | 1 (error, not authorized) | FPI_ILLSIZE |
| 8 | 2 | Illegal combination of erase commands and size |
1. The FLASHCTL.CMDTYPE.COMMAND equals ERASE (0x2), and 2. The FLASHCTL.CMDTYPE.SIZE is equal to either: a. ONEWORD (0x0), or b. TWOWORD (0x1), or c. FOURWORD (0x2), or d. EIGHTWORD (0x3) -> this one is not required as it is covered already |
1 (error, not authorized) | FPI_ILLSIZE |
| 9 | 3 | Modification of MAIN sectors by secure thread |
a) The FLASHCTL.CMDTYPE.COMMAND equals either PROGRAM (0x1), or ERASE (0x2)‡, and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches MAIN (0x0) and c) Sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_WEPROT_REG_x = 0 and d) FPC_FLSEMSTAT.ASSIGNED = 1 and e) FPC_FLSEMSTAT.SEC = 1 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_SECATTRIB_REG_x is i. ‘1’ (secure) or ii. ‘0’ (non-secure) and FPC_ATTRIBVIOLS_CONFIG.SECVIOL = 0 and f) Either FPC_FLSEMSTAT.PRIV = 1 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is i. ‘1’ (privilege) or ii. ‘0’ (non-privilege) and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 g) Or FPC_FLSEMSTAT.PRIV = 0 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is ‘0’ (non-privilege) h) Program/Erase is allowed to MAIN based on FlashRegionProtections |
0 (no error, authorized) | N/A |
| 10 | 3 | Modification of MAIN sectors by non-secure thread |
a) The FLASHCTL.CMDTYPE.COMMAND equals either PROGRAM (0x1), or ERASE (0x2)‡, and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches MAIN (0x0) and c) Sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_WEPROT_REG_x = 0 and d) FPC_FLSEMSTAT.ASSIGNED = 1 and e) FPC_FLSEMSTAT.SEC = 0 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_SECATTRIB_REG_x is ‘0’ (non-secure) and f) Either FPC_FLSEMSTAT.PRIV = 1 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is i. ‘1’ (privilege) or ii. ‘0’ (non-privilege) and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 g) Or FPC_FLSEMSTAT.PRIV = 0 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is ‘0’ (non-privilege) h) Program/Erase is allowed to MAINα based on FlashRegionProtections |
0 (no error, authorized) | N/A |
| 11 | 3 | Bank Erase of MAIN sectors |
a) The FLASHCTL.CMDTYPE.COMMAND equals ERASE (0x2), and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches MAIN (0x0), and c) The FLASHCTL.CMDTYPE.SIZE is equal to BANK (0x5) Below are the conditions to be satisfied for successful erase of sectors. Authorization error is NOT to be generated if one or more below conditions below fail. a) FPC_FLSEMSTAT.ASSIGNED = 1 b) Sectors that are write protected through FPC_WEPROT_REG_x are not erased c) Sectors marked as secure are erased when FPC_FLSEMSTAT.SEC = 1 d) Sectors marked as non-secure are erased when i. Either FPC_FLSEMSTAT.SEC = 0 ii. Or FPC_FLSEMSTAT.SEC = 1 and FPC_ATTRIBVIOLS_CONFIG.SECVIOL = 0 e) Sectors marked as privilege are erased when FPC_FLSEMSTAT.PRIV = 1 f) Sectors marked as non-privilege are erased when i. Either FPC_FLSEMSTAT.PRIV = 0 ii. Or FPC_FLSEMSTAT.PRIV = 1 and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 g) Program/Erase is allowed to corresponding sector of NONMAIN based on FlashRegionProtections |
0 (no error, authorized) | N/A |
| 12 | 3 | Modification of NONMAIN sectors by secure thread |
a) The FLASHCTL.CMDTYPE.COMMAND equals either PROGRAM (0x1), or ERASE (0x2)‡, and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches NONMAIN (0x1) and c) Sub-sector† bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_WEPROT_REG_x = 0 and d) FPC_FLSEMSTAT.ASSIGNED = 1 and e) FPC_FLSEMSTAT.SEC = 1 and sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_SECATTRIB_REG_x is i. ‘1’ (secure) or ii. ‘0’ (non-secure) and FPC_ATTRIBVIOLS_CONFIG.SECVIOL = 0 and f) Either FPC_FLSEMSTAT.PRIV = 1 and sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_PRIVATTRIB_REG_x is i. ‘1’ (privilege) or ii. ‘0’ (non-privilege) and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 g) Or FPC_FLSEMSTAT.PRIV = 0 and sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_PRIVATTRIB_REG_x is ‘0’ (non-privilege) h) Program/Erase is allowed to corresponding sector of NONMAIN based on FlashRegionProtections |
0 (no error, authorized) | N/A |
| 13 | 3 | Modification of NONMAIN sectors by non-secure thread |
a) The FLASHCTL.CMDTYPE.COMMAND equals either PROGRAM (0x1), or ERASE (0x2)‡, and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches NONMAIN (0x1) and c) Sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_WEPROT_REG_x = 0 and d) FPC_FLSEMSTAT.ASSIGNED = 1 and e) FPC_FLSEMSTAT.SEC = 0 and sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_SECATTRIB_REG_x is ‘0’ (non-secure) and f) Either FPC_FLSEMSTAT.PRIV = 1 and sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_PRIVATTRIB_REG_x is i. ‘1’ (privilege) or ii. ‘0’ (non-privilege) and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 g) Or FPC_FLSEMSTAT.PRIV = 0 and sub-sector bit value that FLASHCTL.CMDADDR decodes based on FPC_NONMAIN_PRIVATTRIB_REG_x is ‘0’ (non-privilege) h) Program/Erase is allowed to corresponding sector of NONMAIN based on FlashRegionProtections |
0 (no error, authorized) | N/A |
| 14 | 3 | Read verify check from secure context |
Following conditions must satisfy: a) The FLASHCTL.CMDTYPE.COMMAND equals READVERIFY (0x3) and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches MAIN (0x0), and c) FPC_FLSEMSTAT.ASSIGNED = 1 and d) FPC_FLSEMSTAT.SEC = 1 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_SECATTRIB_REG_x is i. 1’ (secure) or ii. ‘0’ (non-secure) and FPC_ATTRIBVIOLS_CONFIG.SECVIOL = 0 and e) Either FPC_FLSEMSTAT.PRIV = 1 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is i. ‘1’ (privilege) or ii. ‘0’ (non-privilege) and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 f) Or FPC_FLSEMSTAT.PRIV = 0 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is ‘0’ (non-privilege) g) Read-Verify command is allowed to MAIN based on FlashRegionProtections (Prog permissions used) |
0 (no error, authorized) | N/A |
| 15 | 3 | Read verify check from non-secure context |
Following conditions must satisfy: a) The FLASHCTL.CMDTYPE.COMMAND equals READVERIFY (0x3) and b) The FLASHCTL.CMDCTL.REGIONSEL calculated from FLASHCTL.CMDADDR matches MAIN (0x0), and c) FPC_FLSEMSTAT.ASSIGNED = 1 and d) FPC_FLSEMSTAT.SEC = 0 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_SECATTRIB_REG_x is ‘0’ (non-secure) e) Either FPC_FLSEMSTAT.PRIV = 1 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is i. ‘1’ (privilege) or ii. ‘0’ (non-privilege) and FPC_ATTRIBVIOLP_CONFIG.PRIVVIOL = 0 f) Or FPC_FLSEMSTAT.PRIV = 0 and sector (or 8sectors) bit value that FLASHCTL.CMDADDR decodes based on FPC_PRIVATTRIB_REG_x is ‘0’ (non-privilege) g) Read-Verify command is allowed to MAIN based on FlashRegionProtections (Prog permissions used) |
0 (no error, authorized) | N/A |
| 16 | 3 | Mode change to read mode always allowed |
a) The FLASHCTL.CMDTYPE.COMMAND equals MODECHANGE (0x4), and FLASHCTL.CMDCTL.MODESEL is READ (0x0) b) FPC_FLSEMSTAT.ASSIGNED = 1 |
0 (no error, authorized) | N/A |
| 17 | 3 | Mode change to read margin modes only allowed by Secure thread |
a) Following conditions must satisfy: a) The FLASHCTL.CMDTYPE.COMMAND equals MODECHANGE (0x4), and b) The FLASHCTL.CMDCTL.MODESEL is either: a. RDMARG0 (0x2), or b. RDMARG1 (0x4), or c. RDMARG0B (0x6), or d. RDMARG1B (0x7), and c) FPC_FLSEMSTAT.ASSIGNED = 1 and FPC_FLSEMSTAT.PRIV = 1 and FPC_FLSEMSTAT.SEC = 1 and |
0 (no error, authorized) | N/A |
| 18 |
4 (lowest) |
Else | Else (default) – this ensures that any condition not explicitly given permission above will not be allowed | 1 (error, not authorized) | Depends on FLASHCTL.CMDTYPE.COMMAND(FPI_ILLPROG, FPI_ILLERASE, FPI_ILLRDVER, FPI_ILLMODECH) |
† Sub-sector refers to region of NONMAIN sector
‡ Bank erase (FLASHCTL.CMDTYPE.SIZE = 0x5) is secured by the write/erase protect input signals
α Code corresponding to programming a HDP region is not to be kept after the code corresponding to setting of FPC_HDPPROT_CONTROL.HDPPROT[0/1]ACCEN.