@@ -1438,8 +1438,8 @@ static const MemoryRegionOps debug_trace_reg_ops = {
14381438};
14391439
14401440
1441- #define REG_TRNG_FIFO_OUTPUT_BASE (0x00)
1442- #define REG_TRNG_FIFO_OUTPUT_END (0x0C)
1441+ #define REG_TRNG_INOUT_START (0x00)
1442+ #define REG_TRNG_INOUT_END (0x0C)
14431443#define REG_TRNG_STATUS (0x10)
14441444#define TRNG_STATUS_READY BIT(0)
14451445#define TRNG_STATUS_SHUTDOWN_OVFL BIT(1)
@@ -1451,26 +1451,36 @@ static const MemoryRegionOps debug_trace_reg_ops = {
14511451#define TRNG_STATUS_MONOBIT_FAIL BIT(7)
14521452#define TRNG_STATUS_TEST_READY BIT(8)
14531453#define TRNG_STATUS_STUCK_NRBG BIT(9)
1454+ #define TRNG_STATUS_RESEED_AI BIT(10)
14541455#define TRNG_STATUS_REPCNT_FAIL BIT(13)
1455- #define TRNG_STATUS_APROP_FAIL BIT(13)
1456- #define TRNG_STATUS_TEST_STUCK BIT(13)
1456+ #define TRNG_STATUS_APROP_FAIL BIT(14)
1457+ #define TRNG_STATUS_TEST_STUCK BIT(15)
1458+ // blocks_available 16..23
1459+ // blocks_threshold 24..30
14571460#define TRNG_STATUS_NEED_CLOCK BIT(31)
14581461#define REG_TRNG_CONTROL (0x14)
1459- #define TRNG_CONTROL_UNKN0 BIT(0)
1460- #define TRNG_CONTROL_UNKN1_INT_ENABLED BIT(1)
1461- #define TRNG_CONTROL_UNKN2 BIT(2)
1462- #define TRNG_CONTROL_UNKN3 BIT(3)
1463- #define TRNG_CONTROL_STUCK_NRBG_MASK BIT(10)
1462+ #define TRNG_CONTROL_READY BIT(0)
1463+ #define TRNG_CONTROL_SHUTDOWN_OVFLO BIT(1)
1464+ #define TRNG_CONTROL_STUCK BIT(2)
1465+ #define TRNG_CONTROL_NOISE_FAIL BIT(3)
1466+ #define TRNG_CONTROL_RUN_FAIL BIT(4)
1467+ #define TRNG_CONTROL_LONG_RUN_FAIL BIT(5)
1468+ #define TRNG_CONTROL_POKER_FAIL BIT(6)
1469+ #define TRNG_CONTROL_MONOBIT_FAIL BIT(7)
1470+ #define TRNG_CONTROL_TEST_MODE BIT(8)
1471+ #define TRNG_CONTROL_STUCK_NRBG BIT(9)
14641472#define TRNG_CONTROL_ENABLED BIT(10)
14651473#define TRNG_CONTROL_DRBG_ENABLED BIT(12)
14661474#define TRNG_CONTROL_REP_CNT_FAIL_MASK BIT(13)
14671475#define TRNG_CONTROL_APROP_FAIL_MASK BIT(14)
14681476#define TRNG_CONTROL_RESEED BIT(15)
1469- #define TRNG_CONTROL_REQ_DATA BIT(16)
1470- #define TRNG_CONTROL_REQ_HOLD BIT(17)
1477+ #define TRNG_CONTROL_REQUEST_DATA BIT(16)
1478+ #define TRNG_CONTROL_REQUEST_HOLD BIT(17)
14711479#define TRNG_CONTROL_DATA_BLOCKS (v ) (((v) >> 20) & 0xFFF)
14721480#define REG_TRNG_CONFIG (0x18)
1473- #define TRNG_CONFIG_NOISE_BLOCKS (v ) ((v) & 0xFF)
1481+ #define TRNG_CONFIG_NOISE_BLOCKS (v ) ((v) & 0x1F)
1482+ #define TRNG_CONFIG_USE_STARTUP_BITS BIT(5)
1483+ #define TRNG_CONFIG_SCALE (v ) (((v) >> 6) & 0x3)
14741484#define TRNG_CONFIG_SAMPLE_DIV (v ) (((v) >> 8) & 0xF)
14751485#define TRNG_CONFIG_READ_TIMEOUT (v ) (((v) >> 12) & 0xF)
14761486#define TRNG_CONFIG_SAMPLE_CYCLES (v ) (((v) >> 16) & 0xFFFF)
@@ -1509,12 +1519,12 @@ static void trng_regs_reg_write(void *opaque, hwaddr addr, uint64_t data,
15091519 addr , data );
15101520
15111521 switch (addr ) {
1512- case REG_TRNG_FIFO_OUTPUT_BASE ... REG_TRNG_FIFO_OUTPUT_END :
1522+ case REG_TRNG_INOUT_START ... REG_TRNG_INOUT_END :
15131523 if ((s -> offset_0x70 & TRNG_UNKN5_ENCRYPT_FIFO ) != 0 ) {
15141524 data = bswap32 (data );
15151525 }
1516- memcpy (s -> fifo + (addr - REG_TRNG_FIFO_OUTPUT_BASE ), & data , size );
1517- if (addr == REG_TRNG_FIFO_OUTPUT_END &&
1526+ memcpy (s -> fifo + (addr - REG_TRNG_INOUT_START ), & data , size );
1527+ if (addr == REG_TRNG_INOUT_END &&
15181528 ((s -> offset_0x70 & TRNG_UNKN5_ENCRYPT_FIFO ) != 0 )) {
15191529 QCryptoCipher * cipher ;
15201530
@@ -1533,7 +1543,7 @@ static void trng_regs_reg_write(void *opaque, hwaddr addr, uint64_t data,
15331543 (s -> offset_0x70 &
15341544 (TRNG_UNKN5_ENCRYPT_FIFO | TRNG_UNKN5_INIT_DRBG )) == 0 ) {
15351545 qemu_guest_getrandom_nofail (s -> fifo , sizeof (s -> fifo ));
1536- if ((s -> config & TRNG_CONTROL_UNKN1_INT_ENABLED ) != 0 ) {
1546+ if ((s -> config & TRNG_CONTROL_SHUTDOWN_OVFLO ) != 0 ) {
15371547 apple_a7iop_interrupt_status_push (sep -> mailbox ,
15381548 0x10003 ); // TRNG
15391549 }
@@ -1629,8 +1639,8 @@ static uint64_t trng_regs_reg_read(void *opaque, hwaddr addr, unsigned size)
16291639
16301640 // uint32_t enabled = (s->config & TRNG_CONTROL_ENABLED) != 0;
16311641 switch (addr ) {
1632- case REG_TRNG_FIFO_OUTPUT_BASE ... REG_TRNG_FIFO_OUTPUT_END :
1633- ret = ldl_le_p (s -> fifo + (addr - REG_TRNG_FIFO_OUTPUT_BASE ));
1642+ case REG_TRNG_INOUT_START ... REG_TRNG_INOUT_END :
1643+ ret = ldl_le_p (s -> fifo + (addr - REG_TRNG_INOUT_START ));
16341644 if ((s -> offset_0x70 &
16351645 (TRNG_UNKN5_ENCRYPT_FIFO | TRNG_UNKN5_INIT_DRBG )) != 0 ) {
16361646 ret = bswap32 (ret );
0 commit comments