Lines Matching full:ss
437 static void init_stage(struct staging_state *ss)
439 ss->ucode_len = get_totalsize(&ucode_patch_late->hdr);
446 writel(MASK_MBOX_CTRL_ABORT, ss->mmio_base + MBOX_CONTROL_OFFSET);
453 static bool can_send_next_chunk(struct staging_state *ss, int *err)
456 ss->chunk_size = min(PAGE_SIZE, ss->ucode_len - ss->offset);
474 if (ss->bytes_sent + ss->chunk_size > ss->ucode_len * 2) {
496 static inline bool staging_is_complete(struct staging_state *ss, int *err)
498 return is_end_offset(ss->offset) || !can_send_next_chunk(ss, err);
505 static int wait_for_transaction(struct staging_state *ss)
513 status = readl(ss->mmio_base + MBOX_STATUS_OFFSET);
537 static int send_data_chunk(struct staging_state *ss, void *ucode_ptr)
539 u32 *src_chunk = ucode_ptr + ss->offset;
550 mbox_size = MBOX_HEADER_SIZE * 2 + ss->chunk_size;
551 write_mbox_header(ss->mmio_base, MBOX_HEADER(mbox_size));
552 write_mbox_header(ss->mmio_base, MBOX_CMD_LOAD);
553 write_mbox_data(ss->mmio_base, src_chunk, ss->chunk_size);
554 ss->bytes_sent += ss->chunk_size;
557 writel(MASK_MBOX_CTRL_GO, ss->mmio_base + MBOX_CONTROL_OFFSET);
559 return wait_for_transaction(ss);
566 static int fetch_next_offset(struct staging_state *ss)
578 header = read_mbox_header(ss->mmio_base);
579 offset = read_mbox_dword(ss->mmio_base);
580 status = read_mbox_dword(ss->mmio_base);
592 if (!is_end_offset(offset) && offset > ss->ucode_len) {
594 offset, ss->ucode_len);
602 ss->offset = offset;
613 struct staging_state ss = {};
616 ss.mmio_base = ioremap(mmio_pa, MBOX_REG_NUM * MBOX_REG_SIZE);
617 if (WARN_ON_ONCE(!ss.mmio_base))
620 init_stage(&ss);
623 while (!staging_is_complete(&ss, &err)) {
625 err = send_data_chunk(&ss, ucode_patch_late);
632 err = fetch_next_offset(&ss);
637 iounmap(ss.mmio_base);