Lines Matching refs:ss
436 static void init_stage(struct staging_state *ss) in init_stage() argument
438 ss->ucode_len = get_totalsize(&ucode_patch_late->hdr); in init_stage()
445 writel(MASK_MBOX_CTRL_ABORT, ss->mmio_base + MBOX_CONTROL_OFFSET); in init_stage()
452 static bool can_send_next_chunk(struct staging_state *ss, int *err) in can_send_next_chunk() argument
455 ss->chunk_size = min(PAGE_SIZE, ss->ucode_len - ss->offset); in can_send_next_chunk()
473 if (ss->bytes_sent + ss->chunk_size > ss->ucode_len * 2) { in can_send_next_chunk()
495 static inline bool staging_is_complete(struct staging_state *ss, int *err) in staging_is_complete() argument
497 return is_end_offset(ss->offset) || !can_send_next_chunk(ss, err); in staging_is_complete()
504 static int wait_for_transaction(struct staging_state *ss) in wait_for_transaction() argument
512 status = readl(ss->mmio_base + MBOX_STATUS_OFFSET); in wait_for_transaction()
536 static int send_data_chunk(struct staging_state *ss, void *ucode_ptr) in send_data_chunk() argument
538 u32 *src_chunk = ucode_ptr + ss->offset; in send_data_chunk()
549 mbox_size = MBOX_HEADER_SIZE * 2 + ss->chunk_size; in send_data_chunk()
550 write_mbox_header(ss->mmio_base, MBOX_HEADER(mbox_size)); in send_data_chunk()
551 write_mbox_header(ss->mmio_base, MBOX_CMD_LOAD); in send_data_chunk()
552 write_mbox_data(ss->mmio_base, src_chunk, ss->chunk_size); in send_data_chunk()
553 ss->bytes_sent += ss->chunk_size; in send_data_chunk()
556 writel(MASK_MBOX_CTRL_GO, ss->mmio_base + MBOX_CONTROL_OFFSET); in send_data_chunk()
558 return wait_for_transaction(ss); in send_data_chunk()
565 static int fetch_next_offset(struct staging_state *ss) in fetch_next_offset() argument
577 header = read_mbox_header(ss->mmio_base); in fetch_next_offset()
578 offset = read_mbox_dword(ss->mmio_base); in fetch_next_offset()
579 status = read_mbox_dword(ss->mmio_base); in fetch_next_offset()
591 if (!is_end_offset(offset) && offset > ss->ucode_len) { in fetch_next_offset()
593 offset, ss->ucode_len); in fetch_next_offset()
601 ss->offset = offset; in fetch_next_offset()
612 struct staging_state ss = {}; in do_stage() local
615 ss.mmio_base = ioremap(mmio_pa, MBOX_REG_NUM * MBOX_REG_SIZE); in do_stage()
616 if (WARN_ON_ONCE(!ss.mmio_base)) in do_stage()
619 init_stage(&ss); in do_stage()
622 while (!staging_is_complete(&ss, &err)) { in do_stage()
624 err = send_data_chunk(&ss, ucode_patch_late); in do_stage()
631 err = fetch_next_offset(&ss); in do_stage()
636 iounmap(ss.mmio_base); in do_stage()