xref: /openbmc/qemu/include/hw/nvram/npcm7xx_otp.h (revision a9c17e9a21af9c4bf9c08dedf0f0df4a6566cf52)
1c752bb07SHavard Skinnemoen /*
2c752bb07SHavard Skinnemoen  * Nuvoton NPCM7xx OTP (Fuse Array) Interface
3c752bb07SHavard Skinnemoen  *
4c752bb07SHavard Skinnemoen  * Copyright 2020 Google LLC
5c752bb07SHavard Skinnemoen  *
6c752bb07SHavard Skinnemoen  * This program is free software; you can redistribute it and/or modify it
7c752bb07SHavard Skinnemoen  * under the terms of the GNU General Public License as published by the
8c752bb07SHavard Skinnemoen  * Free Software Foundation; either version 2 of the License, or
9c752bb07SHavard Skinnemoen  * (at your option) any later version.
10c752bb07SHavard Skinnemoen  *
11c752bb07SHavard Skinnemoen  * This program is distributed in the hope that it will be useful, but WITHOUT
12c752bb07SHavard Skinnemoen  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13c752bb07SHavard Skinnemoen  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14c752bb07SHavard Skinnemoen  * for more details.
15c752bb07SHavard Skinnemoen  */
16c752bb07SHavard Skinnemoen #ifndef NPCM7XX_OTP_H
17c752bb07SHavard Skinnemoen #define NPCM7XX_OTP_H
18c752bb07SHavard Skinnemoen 
19c752bb07SHavard Skinnemoen #include "exec/memory.h"
20c752bb07SHavard Skinnemoen #include "hw/sysbus.h"
21c752bb07SHavard Skinnemoen 
22c752bb07SHavard Skinnemoen /* Each OTP module holds 8192 bits of one-time programmable storage */
23c752bb07SHavard Skinnemoen #define NPCM7XX_OTP_ARRAY_BITS (8192)
24c752bb07SHavard Skinnemoen #define NPCM7XX_OTP_ARRAY_BYTES (NPCM7XX_OTP_ARRAY_BITS / BITS_PER_BYTE)
25c752bb07SHavard Skinnemoen 
26c752bb07SHavard Skinnemoen /* Fuse array offsets */
27c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_FUSTRAP (0)
28c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_CP_FUSTRAP (12)
29c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_DAC_CALIB (16)
30c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_ADC_CALIB (24)
31c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_DERIVATIVE (64)
32c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_TEST_SIG (72)
33c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_DIE_LOCATION (74)
34c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_GP1 (80)
35c752bb07SHavard Skinnemoen #define NPCM7XX_FUSE_GP2 (128)
36c752bb07SHavard Skinnemoen 
37c752bb07SHavard Skinnemoen /*
38c752bb07SHavard Skinnemoen  * Number of registers in our device state structure. Don't change this without
39c752bb07SHavard Skinnemoen  * incrementing the version_id in the vmstate.
40c752bb07SHavard Skinnemoen  */
41c752bb07SHavard Skinnemoen #define NPCM7XX_OTP_NR_REGS (0x18 / sizeof(uint32_t))
42c752bb07SHavard Skinnemoen 
43c752bb07SHavard Skinnemoen /**
44c752bb07SHavard Skinnemoen  * struct NPCM7xxOTPState - Device state for one OTP module.
45c752bb07SHavard Skinnemoen  * @parent: System bus device.
46c752bb07SHavard Skinnemoen  * @mmio: Memory region through which registers are accessed.
47c752bb07SHavard Skinnemoen  * @regs: Register contents.
48c752bb07SHavard Skinnemoen  * @array: OTP storage array.
49c752bb07SHavard Skinnemoen  */
50c752bb07SHavard Skinnemoen typedef struct NPCM7xxOTPState {
51c752bb07SHavard Skinnemoen     SysBusDevice parent;
52c752bb07SHavard Skinnemoen 
53c752bb07SHavard Skinnemoen     MemoryRegion mmio;
54c752bb07SHavard Skinnemoen     uint32_t regs[NPCM7XX_OTP_NR_REGS];
55c752bb07SHavard Skinnemoen     uint8_t array[NPCM7XX_OTP_ARRAY_BYTES];
56c752bb07SHavard Skinnemoen } NPCM7xxOTPState;
57c752bb07SHavard Skinnemoen 
58c752bb07SHavard Skinnemoen #define TYPE_NPCM7XX_OTP "npcm7xx-otp"
59c752bb07SHavard Skinnemoen #define NPCM7XX_OTP(obj) OBJECT_CHECK(NPCM7xxOTPState, (obj), TYPE_NPCM7XX_OTP)
60c752bb07SHavard Skinnemoen 
61c752bb07SHavard Skinnemoen #define TYPE_NPCM7XX_KEY_STORAGE "npcm7xx-key-storage"
62c752bb07SHavard Skinnemoen #define TYPE_NPCM7XX_FUSE_ARRAY "npcm7xx-fuse-array"
63c752bb07SHavard Skinnemoen 
64c752bb07SHavard Skinnemoen typedef struct NPCM7xxOTPClass NPCM7xxOTPClass;
65c752bb07SHavard Skinnemoen 
66c752bb07SHavard Skinnemoen /**
67c752bb07SHavard Skinnemoen  * npcm7xx_otp_array_write - ECC encode and write data to OTP array.
68c752bb07SHavard Skinnemoen  * @s: OTP module.
69c752bb07SHavard Skinnemoen  * @data: Data to be encoded and written.
70c752bb07SHavard Skinnemoen  * @offset: Offset of first byte to be written in the OTP array.
71c752bb07SHavard Skinnemoen  * @len: Number of bytes before ECC encoding.
72c752bb07SHavard Skinnemoen  *
73c752bb07SHavard Skinnemoen  * Each nibble of data is encoded into a byte, so the number of bytes written
74c752bb07SHavard Skinnemoen  * to the array will be @len * 2.
75c752bb07SHavard Skinnemoen  */
76*f703f1efSPhilippe Mathieu-Daudé void npcm7xx_otp_array_write(NPCM7xxOTPState *s, const void *data,
77c752bb07SHavard Skinnemoen                              unsigned int offset, unsigned int len);
78c752bb07SHavard Skinnemoen 
79c752bb07SHavard Skinnemoen #endif /* NPCM7XX_OTP_H */
80