Hi Zenghui, On 3/30/20 11:22 AM, Zenghui Yu wrote: > Hi Eric, > > On 2020/3/20 17:24, Eric Auger wrote: >> Implement main ITS commands. The code is largely inherited from >> the ITS driver. >> >> Signed-off-by: Eric Auger <eric.auger@xxxxxxxxxx> > > [...] > >> +/* ITS COMMANDS */ >> + >> +static void its_encode_cmd(struct its_cmd_block *cmd, u8 cmd_nr) >> +{ >> + cmd->raw_cmd[0] &= ~0xffUL; >> + cmd->raw_cmd[0] |= cmd_nr; >> +} >> + >> +static void its_encode_devid(struct its_cmd_block *cmd, u32 devid) >> +{ >> + cmd->raw_cmd[0] &= BIT_ULL(32) - 1; >> + cmd->raw_cmd[0] |= ((u64)devid) << 32; >> +} >> + >> +static void its_encode_event_id(struct its_cmd_block *cmd, u32 id) >> +{ >> + cmd->raw_cmd[1] &= ~0xffffffffUL; >> + cmd->raw_cmd[1] |= id; >> +} >> + >> +static void its_encode_phys_id(struct its_cmd_block *cmd, u32 phys_id) >> +{ >> + cmd->raw_cmd[1] &= 0xffffffffUL; >> + cmd->raw_cmd[1] |= ((u64)phys_id) << 32; >> +} >> + >> +static void its_encode_size(struct its_cmd_block *cmd, u8 size) >> +{ >> + cmd->raw_cmd[1] &= ~0x1fUL; >> + cmd->raw_cmd[1] |= size & 0x1f; >> +} >> + >> +static void its_encode_itt(struct its_cmd_block *cmd, u64 itt_addr) >> +{ >> + cmd->raw_cmd[2] &= ~0xffffffffffffUL; >> + cmd->raw_cmd[2] |= itt_addr & 0xffffffffff00UL; >> +} >> + >> +static void its_encode_valid(struct its_cmd_block *cmd, int valid) >> +{ >> + cmd->raw_cmd[2] &= ~(1UL << 63); >> + cmd->raw_cmd[2] |= ((u64)!!valid) << 63; >> +} >> + >> +static void its_encode_target(struct its_cmd_block *cmd, u64 >> target_addr) >> +{ >> + cmd->raw_cmd[2] &= ~(0xfffffffffUL << 16); >> + cmd->raw_cmd[2] |= (target_addr & (0xffffffffUL << 16)); >> +} >> + >> +static void its_encode_collection(struct its_cmd_block *cmd, u16 col) >> +{ >> + cmd->raw_cmd[2] &= ~0xffffUL; >> + cmd->raw_cmd[2] |= col; >> +} > > The command encoding can be refactored like: > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4d36f136d57aea6f6440886106e246bb7e5918d8 > > > which will look much clearer. OK > > [...] > >> +static void its_send_single_command(its_cmd_builder_t builder, >> + struct its_cmd_desc *desc) >> +{ >> + struct its_cmd_block *cmd, *next_cmd; >> + >> + cmd = its_allocate_entry(); >> + builder(cmd, desc); >> + next_cmd = its_post_commands(); >> + >> + its_wait_for_range_completion(cmd, next_cmd); >> +} >> + >> + > > extra line. OK > >> +static void its_build_mapd_cmd(struct its_cmd_block *cmd, >> + struct its_cmd_desc *desc) >> +{ >> + unsigned long itt_addr; >> + u8 size = 12; /* 4096 eventids */ > > Maybe use desc->its_mapd_cmd.dev->nr_ites instead as we already have it? OK > >> + >> + itt_addr = (unsigned >> long)(virt_to_phys(desc->its_mapd_cmd.dev->itt)); >> + itt_addr = ALIGN(itt_addr, ITS_ITT_ALIGN); >> + >> + its_encode_cmd(cmd, GITS_CMD_MAPD); >> + its_encode_devid(cmd, desc->its_mapd_cmd.dev->device_id); >> + its_encode_size(cmd, size - 1); >> + its_encode_itt(cmd, itt_addr); >> + its_encode_valid(cmd, desc->its_mapd_cmd.valid); >> + its_fixup_cmd(cmd); >> + if (desc->verbose) >> + printf("ITS: MAPD devid=%d size = 0x%x itt=0x%lx valid=%d\n", >> + desc->its_mapd_cmd.dev->device_id, >> + size, itt_addr, desc->its_mapd_cmd.valid); >> + > > extra line. > > All of these are trivial things and feel free to ignore them, > Reviewed-by: Zenghui Yu <yuzenghui@xxxxxxxxxx> thanks! Eric > > > Thanks >