Skip to content

Commit 111a833

Browse files
committed
firmware: arm_ffa: Set reserved/MBZ fields to zero in the memory descriptors
The transmit buffers allocated by the driver can be used to transmit data by any messages/commands needing the buffer. However, it is not guaranteed to have been zero-ed before every new transmission and hence it will just contain residual value from the previous transmission. There are several reserved fields in the memory descriptors that must be zero(MBZ). The receiver can reject the transmission if any such MBZ fields are non-zero. While we can set the whole page to zero, it is not optimal as most of the fields get initialised to the value required for the current transmission. So, just set the reserved/MBZ fields to zero in the memory descriptors explicitly to honour the requirement and keep the receiver happy. Fixes: cc2195f ("firmware: arm_ffa: Add support for MEM_* interfaces") Reported-by: Marc Bonnici <marc.bonnici@arm.com> Link: https://lore.kernel.org/r/20230503131252.12585-1-sudeep.holla@arm.com Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
1 parent 19b8766 commit 111a833

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

drivers/firmware/arm_ffa/driver.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,12 +421,17 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize,
421421
ep_mem_access->receiver = args->attrs[idx].receiver;
422422
ep_mem_access->attrs = args->attrs[idx].attrs;
423423
ep_mem_access->composite_off = COMPOSITE_OFFSET(args->nattrs);
424+
ep_mem_access->flag = 0;
425+
ep_mem_access->reserved = 0;
424426
}
427+
mem_region->reserved_0 = 0;
428+
mem_region->reserved_1 = 0;
425429
mem_region->ep_count = args->nattrs;
426430

427431
composite = buffer + COMPOSITE_OFFSET(args->nattrs);
428432
composite->total_pg_cnt = ffa_get_num_pages_sg(args->sg);
429433
composite->addr_range_cnt = num_entries;
434+
composite->reserved = 0;
430435

431436
length = COMPOSITE_CONSTITUENTS_OFFSET(args->nattrs, num_entries);
432437
frag_len = COMPOSITE_CONSTITUENTS_OFFSET(args->nattrs, 0);
@@ -461,6 +466,7 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize,
461466

462467
constituents->address = sg_phys(args->sg);
463468
constituents->pg_cnt = args->sg->length / FFA_PAGE_SIZE;
469+
constituents->reserved = 0;
464470
constituents++;
465471
frag_len += sizeof(struct ffa_mem_region_addr_range);
466472
} while ((args->sg = sg_next(args->sg)));

0 commit comments

Comments
 (0)