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