@@ -46,6 +46,8 @@ acl_process_autorun_profiler_scan_chain(unsigned int physical_device_id,
46
46
#define CSR_VERSION_ID_18_1 (3 )
47
47
#define CSR_VERSION_ID_19_1 (4 )
48
48
#define CSR_VERSION_ID CSR_VERSION_ID_19_1
49
+ // Starting from 2023.1 release, some IPs don't have the cra_ring_root for the Runtime to check the version. E.g, pure streaming design.
50
+ #define NO_CSR_VERSION_ID (-1 )
49
51
50
52
// Address map
51
53
// For unit tests to work, these defines must match those in the unit test
@@ -471,6 +473,7 @@ static uintptr_t acl_kernel_cra_set_segment_rom(acl_kernel_if *kern,
471
473
472
474
static int acl_kernel_cra_read (acl_kernel_if *kern, unsigned int accel_id,
473
475
unsigned int addr, unsigned int *val) {
476
+ assert (kern->csr_version != NO_CSR_VERSION_ID);
474
477
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
475
478
acl_assert_locked_or_sig ();
476
479
return acl_kernel_if_read_32b (
@@ -479,6 +482,7 @@ static int acl_kernel_cra_read(acl_kernel_if *kern, unsigned int accel_id,
479
482
480
483
int acl_kernel_cra_read_64b (acl_kernel_if *kern, unsigned int accel_id,
481
484
unsigned int addr, uint64_t *val) {
485
+ assert (kern->csr_version != NO_CSR_VERSION_ID);
482
486
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
483
487
acl_assert_locked_or_sig ();
484
488
return acl_kernel_if_read_64b (
@@ -530,6 +534,7 @@ static int acl_kernel_rom_cra_read_block(acl_kernel_if *kern, unsigned int addr,
530
534
531
535
static int acl_kernel_cra_write (acl_kernel_if *kern, unsigned int accel_id,
532
536
unsigned int addr, unsigned int val) {
537
+ assert (kern->csr_version != NO_CSR_VERSION_ID);
533
538
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
534
539
acl_assert_locked_or_sig ();
535
540
return acl_kernel_if_write_32b (
@@ -538,6 +543,7 @@ static int acl_kernel_cra_write(acl_kernel_if *kern, unsigned int accel_id,
538
543
539
544
static int acl_kernel_cra_write_64b (acl_kernel_if *kern, unsigned int accel_id,
540
545
unsigned int addr, uint64_t val) {
546
+ assert (kern->csr_version != NO_CSR_VERSION_ID);
541
547
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
542
548
acl_assert_locked ();
543
549
return acl_kernel_if_write_64b (
@@ -547,6 +553,7 @@ static int acl_kernel_cra_write_64b(acl_kernel_if *kern, unsigned int accel_id,
547
553
static int acl_kernel_cra_write_block (acl_kernel_if *kern,
548
554
unsigned int accel_id, unsigned int addr,
549
555
unsigned int *val, size_t size) {
556
+ assert (kern->csr_version != NO_CSR_VERSION_ID);
550
557
uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
551
558
uintptr_t logical_addr =
552
559
kern->accel_csr [accel_id].address + addr - OFFSET_KERNEL_CRA;
@@ -1017,7 +1024,7 @@ int acl_kernel_if_update(const acl_device_def_autodiscovery_t &devdef,
1017
1024
// Post-PLL config init function - at this point it's safe to talk to
1018
1025
// the kernel CSR registers.
1019
1026
// Returns 0 on success
1020
- int acl_kernel_if_post_pll_config_init (acl_kernel_if *kern) {
1027
+ int acl_kernel_if_post_pll_config_init (const acl_device_def_autodiscovery_t &devdef, 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,14 +1039,19 @@ 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 ) {
1042
+ if (kern->num_accel > 0 && devdef. cra_ring_root_exist ) {
1036
1043
acl_kernel_cra_read (kern, 0 , KERNEL_OFFSET_CSR, &csr);
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 );
1050
+ } else if (kern->num_accel > 0 && !devdef.cra_ring_root_exist ) {
1051
+ kern->csr_version = NO_CSR_VERSION_ID;
1052
+ ACL_KERNEL_IF_DEBUG_MSG (kern,
1053
+ " CRA ring root doesn't exist, setting kern->csr_version to %u\n " ,
1054
+ kern->csr_version );
1043
1055
} else {
1044
1056
kern->csr_version = 0 ;
1045
1057
}
@@ -1149,7 +1161,7 @@ void acl_kernel_if_launch_kernel_on_custom_sof(
1149
1161
// in the kern->csr_version field. The value is cached after PLL init to
1150
1162
// avoid reading back on every kernel launch, which would add overhead.
1151
1163
if (!(kern->csr_version >= CSR_VERSION_ID_18_1 &&
1152
- kern->csr_version <= CSR_VERSION_ID)) {
1164
+ kern->csr_version <= CSR_VERSION_ID) && !(kern-> csr_version == NO_CSR_VERSION_ID) ) {
1153
1165
kern->io .printf (" Hardware CSR version ID differs from version expected by "
1154
1166
" software. Either:\n " );
1155
1167
kern->io .printf (" a) Ensure your compiled design was generated by the "
@@ -1256,6 +1268,7 @@ void acl_kernel_if_launch_kernel_on_custom_sof(
1256
1268
acl_kernel_cra_write_block (kern, accel_id, offset, (unsigned int *)image_p,
1257
1269
image_size_static);
1258
1270
}
1271
+
1259
1272
if (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,
0 commit comments