@@ -470,7 +470,11 @@ static uintptr_t acl_kernel_cra_set_segment_rom(acl_kernel_if *kern,
470
470
}
471
471
472
472
static int acl_kernel_cra_read (acl_kernel_if *kern, unsigned int accel_id,
473
- unsigned int addr, unsigned int *val) {
473
+ unsigned int addr, unsigned int *val,
474
+ bool assert_csr_version = true ) {
475
+ // Allow the very first reading csr_version call to run.
476
+ if (assert_csr_version)
477
+ assert (kern->csr_version );
474
478
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
475
479
acl_assert_locked_or_sig ();
476
480
return acl_kernel_if_read_32b (
@@ -479,6 +483,7 @@ static int acl_kernel_cra_read(acl_kernel_if *kern, unsigned int accel_id,
479
483
480
484
int acl_kernel_cra_read_64b (acl_kernel_if *kern, unsigned int accel_id,
481
485
unsigned int addr, uint64_t *val) {
486
+ assert (kern->csr_version );
482
487
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
483
488
acl_assert_locked_or_sig ();
484
489
return acl_kernel_if_read_64b (
@@ -530,6 +535,7 @@ static int acl_kernel_rom_cra_read_block(acl_kernel_if *kern, unsigned int addr,
530
535
531
536
static int acl_kernel_cra_write (acl_kernel_if *kern, unsigned int accel_id,
532
537
unsigned int addr, unsigned int val) {
538
+ assert (kern->csr_version );
533
539
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
534
540
acl_assert_locked_or_sig ();
535
541
return acl_kernel_if_write_32b (
@@ -538,6 +544,7 @@ static int acl_kernel_cra_write(acl_kernel_if *kern, unsigned int accel_id,
538
544
539
545
static int acl_kernel_cra_write_64b (acl_kernel_if *kern, unsigned int accel_id,
540
546
unsigned int addr, uint64_t val) {
547
+ assert (kern->csr_version );
541
548
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
542
549
acl_assert_locked ();
543
550
return acl_kernel_if_write_64b (
@@ -547,6 +554,7 @@ static int acl_kernel_cra_write_64b(acl_kernel_if *kern, unsigned int accel_id,
547
554
static int acl_kernel_cra_write_block (acl_kernel_if *kern,
548
555
unsigned int accel_id, unsigned int addr,
549
556
unsigned int *val, size_t size) {
557
+ assert (kern->csr_version );
550
558
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
551
559
uintptr_t logical_addr =
552
560
kern->accel_csr [accel_id].address + addr - OFFSET_KERNEL_CRA;
@@ -704,8 +712,6 @@ int acl_kernel_if_init(acl_kernel_if *kern, acl_bsp_io bsp_io,
704
712
kern->accel_perf_mon = NULL ;
705
713
kern->accel_num_printfs = NULL ;
706
714
707
- kern->csr_version = 0 ;
708
-
709
715
kern->autorun_profiling_kernel_id = -1 ;
710
716
711
717
// The simulator doesn't have any kernel interface information until the aocx
@@ -1017,7 +1023,8 @@ int acl_kernel_if_update(const acl_device_def_autodiscovery_t &devdef,
1017
1023
// Post-PLL config init function - at this point it's safe to talk to
1018
1024
// the kernel CSR registers.
1019
1025
// Returns 0 on success
1020
- int acl_kernel_if_post_pll_config_init (acl_kernel_if *kern) {
1026
+ int acl_kernel_if_post_pll_config_init (bool cra_ring_root_exist,
1027
+ acl_kernel_if *kern) {
1021
1028
unsigned int csr, version;
1022
1029
unsigned k;
1023
1030
char *profile_start_cycle = getenv (" ACL_PROFILE_START_CYCLE" );
@@ -1032,16 +1039,18 @@ int acl_kernel_if_post_pll_config_init(acl_kernel_if *kern) {
1032
1039
kern->io .printf (" HAL Kern Error: Post PLL init: Invalid kernel handle" );
1033
1040
assert (0 && " Invalid kernel handle" );
1034
1041
}
1035
- if (kern->num_accel > 0 ) {
1036
- acl_kernel_cra_read (kern, 0 , KERNEL_OFFSET_CSR, &csr);
1042
+ if (kern->num_accel > 0 && cra_ring_root_exist ) {
1043
+ acl_kernel_cra_read (kern, 0 , KERNEL_OFFSET_CSR, &csr, false );
1037
1044
version = ACL_KERNEL_READ_BIT_RANGE (csr, KERNEL_CSR_LAST_VERSION_BIT,
1038
1045
KERNEL_CSR_FIRST_VERSION_BIT);
1039
1046
kern->csr_version = version;
1040
1047
ACL_KERNEL_IF_DEBUG_MSG (kern,
1041
1048
" Read CSR version from kernel 0: Version = %u\n " ,
1042
1049
kern->csr_version );
1043
1050
} else {
1044
- kern->csr_version = 0 ;
1051
+ ACL_KERNEL_IF_DEBUG_MSG (kern,
1052
+ " No accelerator found or CRA ring root doesn't "
1053
+ " exist, not setting kern->csr_version\n " );
1045
1054
}
1046
1055
1047
1056
// If environment variables set, configure the profile hardware
@@ -1148,7 +1157,8 @@ void acl_kernel_if_launch_kernel_on_custom_sof(
1148
1157
// Version is defined in upper 16-bits of the status register and cached
1149
1158
// in the kern->csr_version field. The value is cached after PLL init to
1150
1159
// avoid reading back on every kernel launch, which would add overhead.
1151
- if (!(kern->csr_version >= CSR_VERSION_ID_18_1 &&
1160
+ if (kern->csr_version .has_value () &&
1161
+ !(kern->csr_version >= CSR_VERSION_ID_18_1 &&
1152
1162
kern->csr_version <= CSR_VERSION_ID)) {
1153
1163
kern->io .printf (" Hardware CSR version ID differs from version expected by "
1154
1164
" software. Either:\n " );
@@ -1239,7 +1249,8 @@ void acl_kernel_if_launch_kernel_on_custom_sof(
1239
1249
}
1240
1250
}
1241
1251
1242
- if (kern->csr_version != CSR_VERSION_ID_18_1) {
1252
+ if (kern->csr_version .has_value () &&
1253
+ (kern->csr_version != CSR_VERSION_ID_18_1)) {
1243
1254
for (uintptr_t p = 0 ; p < image->arg_value_size ; p += sizeof (int )) {
1244
1255
unsigned int pword = *(unsigned int *)(image->arg_value + p);
1245
1256
ACL_KERNEL_IF_DEBUG_MSG_VERBOSE (
@@ -1256,7 +1267,9 @@ void acl_kernel_if_launch_kernel_on_custom_sof(
1256
1267
acl_kernel_cra_write_block (kern, accel_id, offset, (unsigned int *)image_p,
1257
1268
image_size_static);
1258
1269
}
1259
- if (kern->csr_version != CSR_VERSION_ID_18_1 && image->arg_value_size > 0 ) {
1270
+
1271
+ if (kern->csr_version .has_value () &&
1272
+ (kern->csr_version != CSR_VERSION_ID_18_1 && image->arg_value_size > 0 )) {
1260
1273
acl_kernel_cra_write_block (
1261
1274
kern, accel_id, offset + (unsigned int )image_size_static,
1262
1275
(unsigned int *)image->arg_value , image->arg_value_size );
0 commit comments