diff --git a/iommu_ref_model/test/test_app.c b/iommu_ref_model/test/test_app.c index 18798f1..dfa5993 100644 --- a/iommu_ref_model/test/test_app.c +++ b/iommu_ref_model/test/test_app.c @@ -95,8 +95,28 @@ main(void) { // Enable command queue fail_if( ( enable_cq(4) < 0 ) ); + + // Test that writes to cqcsr are discarded when it is busy + g_reg_file.cqcsr.busy = 1; + cqcsr.cqen = 0; + write_register(CQCSR_OFFSET, 4, cqcsr.raw); + cqcsr.raw = read_register(CQCSR_OFFSET, 4); + if ( cqcsr.cqen == 0 ) return -1; + if ( cqcsr.cqon == 0 ) return -1; + g_reg_file.cqcsr.busy = 0; + // Enable fault queue fail_if( ( enable_fq(4) < 0 ) ); + + // Test that writes to fqcsr are discarded when it is busy + g_reg_file.fqcsr.busy = 1; + fqcsr.fqen = 0; + write_register(FQCSR_OFFSET, 4, fqcsr.raw); + fqcsr.raw = read_register(FQCSR_OFFSET, 4); + if ( fqcsr.fqen == 0 ) return -1; + if ( fqcsr.fqon == 0 ) return -1; + g_reg_file.fqcsr.busy = 0; + // Enable page queue fail_if( ( enable_disable_pq(4, 1) < 0 ) ); @@ -3056,6 +3076,15 @@ main(void) { fail_if( ( ((read_register(PQH_OFFSET, 4)) != read_register(PQT_OFFSET, 4)) ) ); fail_if( ( enable_disable_pq(4, 1) < 0 ) ); + // Test that write to pqen when register is busy is discarded + g_reg_file.pqcsr.busy = 1; + pqcsr.pqen = 0; + write_register(PQCSR_OFFSET, 4, pqcsr.raw); + pqcsr.raw = read_register(PQCSR_OFFSET, 4); + if ( pqcsr.pqen == 0 ) return -1; + if ( pqcsr.pqon == 0 ) return -1; + g_reg_file.pqcsr.busy = 0; + // PRI enabled - should queue in PQ pr.RID = 0x2233; pr.DSEG = 0x11; @@ -3975,6 +4004,13 @@ main(void) { write_register(FQCSR_OFFSET, 4, fqcsr.raw); fail_if( ( enable_iommu(Off) < 0 ) ); fail_if( ( enable_iommu(DDT_3LVL) < 0 ) ); + // test that writes to ddtp when it is busy are discarded + g_reg_file.ddtp.busy = 1; + ddtp.iommu_mode = Off; + write_register(DDTP_OFFSET, 8, ddtp.raw); + ddtp.raw = read_register(DDTP_OFFSET, 8); + g_reg_file.ddtp.busy = 0; + fail_if( (ddtp.iommu_mode != DDT_3LVL) ); offset += 4; break; case DDTP_OFFSET: diff --git a/iommu_ref_model/test/test_utils.c b/iommu_ref_model/test/test_utils.c index aed073a..958c4c2 100644 --- a/iommu_ref_model/test/test_utils.c +++ b/iommu_ref_model/test/test_utils.c @@ -68,14 +68,6 @@ enable_cq( printf("CQ enable failed\n"); return -1; } - g_reg_file.cqcsr.busy = 1; - cqcsr.cqen = 0; - write_register(CQCSR_OFFSET, 4, cqcsr.raw); - cqcsr.raw = read_register(CQCSR_OFFSET, 4); - if ( cqcsr.cqen == 0 ) return -1; - if ( cqcsr.cqon == 0 ) return -1; - g_reg_file.cqcsr.busy = 0; - return 0; } @@ -105,13 +97,6 @@ enable_fq( printf("FQ enable failed\n"); return -1; } - g_reg_file.fqcsr.busy = 1; - fqcsr.fqen = 0; - write_register(FQCSR_OFFSET, 4, fqcsr.raw); - fqcsr.raw = read_register(FQCSR_OFFSET, 4); - if ( fqcsr.fqen == 0 ) return -1; - if ( fqcsr.fqon == 0 ) return -1; - g_reg_file.fqcsr.busy = 0; return 0; } @@ -147,15 +132,6 @@ enable_disable_pq( printf("PQ disable failed\n"); return -1; } - if ( enable_disable == 1 ) { - g_reg_file.pqcsr.busy = 1; - pqcsr.pqen = 0; - write_register(PQCSR_OFFSET, 4, pqcsr.raw); - pqcsr.raw = read_register(PQCSR_OFFSET, 4); - if ( pqcsr.pqen == 0 ) return -1; - if ( pqcsr.pqon == 0 ) return -1; - g_reg_file.pqcsr.busy = 0; - } return 0; } @@ -182,15 +158,7 @@ enable_iommu( do { ddtp.raw = read_register(DDTP_OFFSET, 8); } while ( ddtp.busy == 1 ); - if ( iommu_mode != Off ) { - g_reg_file.ddtp.busy = 1; - ddtp.iommu_mode = Off; - write_register(DDTP_OFFSET, 8, ddtp.raw); - ddtp.raw = read_register(DDTP_OFFSET, 8); - g_reg_file.ddtp.busy = 0; - if ( ddtp.iommu_mode != iommu_mode ) return -1; - } - return 0; + return (ddtp.iommu_mode == iommu_mode) ? 0 : -1; } void send_translation_request(uint32_t did, uint8_t pid_valid, uint32_t pid, uint8_t no_write,