Lines Matching +full:frame +full:- +full:buffer

1 // SPDX-License-Identifier: MIT
26 FIELD_GET(SYSCTRL_HDR_GROUP_ID_MASK, (hdr)->data)
29 FIELD_GET(SYSCTRL_HDR_COMMAND_MASK, (hdr)->data)
32 FIELD_GET(SYSCTRL_HDR_IS_RESPONSE, (hdr)->data)
35 FIELD_GET(SYSCTRL_HDR_RESULT_MASK, (hdr)->data)
42 ret = xe_mmio_wait32_not(sc->mmio, SYSCTRL_MB_CTRL, bit_mask, bit_mask,
53 ret = xe_mmio_wait32(sc->mmio, SYSCTRL_MB_CTRL, bit_mask, bit_mask,
59 static int sysctrl_write_frame(struct xe_sysctrl *sc, const void *frame,
72 memcpy(val, frame, len);
75 xe_mmio_write32(sc->mmio, regs[i], val[i]);
80 static int sysctrl_read_frame(struct xe_sysctrl *sc, void *frame,
94 val[i] = xe_mmio_read32(sc->mmio, regs[i]);
96 memcpy(frame, val, len);
103 xe_mmio_rmw32(sc->mmio, SYSCTRL_MB_CTRL, SYSCTRL_MB_CTRL_RUN_BUSY_OUT, 0);
113 u8 *buffer;
117 if (data_in_len > XE_SYSCTRL_MB_MAX_MESSAGE_SIZE - sizeof(*hdr)) {
119 return -EINVAL;
124 buffer = kmalloc(size, GFP_KERNEL);
125 if (!buffer)
126 return -ENOMEM;
128 hdr = (struct xe_sysctrl_mailbox_msg_hdr *)buffer;
129 hdr->data = FIELD_PREP(SYSCTRL_HDR_GROUP_ID_MASK, group_id) |
133 memcpy(buffer + sizeof(*hdr), data_in, data_in_len);
135 *mbox_cmd = buffer;
146 u32 ctrl_reg, total_frames, frame;
154 return -EBUSY;
157 ctrl_reg = xe_mmio_read32(sc->mmio, SYSCTRL_MB_CTRL);
161 for (frame = 0; frame < total_frames; frame++) {
162 frame_size = min_t(size_t, cmd_size - bytes_sent, XE_SYSCTRL_MB_FRAME_SIZE);
165 xe_err(xe, "sysctrl: Failed to write frame %u\n", frame);
166 return -EIO;
170 REG_FIELD_PREP(SYSCTRL_FRAME_CURRENT_MASK, frame) |
171 REG_FIELD_PREP(SYSCTRL_FRAME_TOTAL_MASK, total_frames - 1) |
175 xe_mmio_write32(sc->mmio, SYSCTRL_MB_CTRL, ctrl_reg);
178 xe_err(xe, "sysctrl: Frame %u acknowledgment timeout\n", frame);
179 return -ETIMEDOUT;
197 xe_err(xe, "sysctrl: Response frame timeout\n");
198 return -ETIMEDOUT;
201 ctrl_reg = xe_mmio_read32(sc->mmio, SYSCTRL_MB_CTRL);
225 u8 *buffer __free(kfree) = kzalloc(remain, GFP_KERNEL);
231 if (!buffer)
232 return -ENOMEM;
234 out = buffer;
243 remain -= frame_size;
247 hdr = (struct xe_sysctrl_mailbox_msg_hdr *)buffer;
253 return -EPROTO;
259 return -EIO;
263 *rdata_len = out - buffer - sizeof(*hdr);
297 * xe_sysctrl_create_command() - Create system controller command
301 * @request: Pointer to request buffer (can be NULL)
302 * @request_len: Size of request buffer
303 * @response: Pointer to response buffer
304 * @response_len: Size of response buffer
317 command->header = header;
318 command->data_in = request;
319 command->data_in_len = request_len;
320 command->data_out = response;
321 command->data_out_len = response_len;
325 * xe_sysctrl_send_command() - Send mailbox command to System Controller
333 * Request payload is provided via @cmd->data_in and @cmd->data_in_len.
334 * If a response is expected, @cmd->data_out must point to a buffer of
335 * size @cmd->data_out_len supplied by caller.
338 * returned by firmware, bounded by @cmd->data_out_len.
354 if (!xe->info.has_sysctrl)
355 return -ENODEV;
357 xe_assert(xe, cmd->data_in || cmd->data_out);
358 xe_assert(xe, !cmd->data_in || cmd->data_in_len);
359 xe_assert(xe, !cmd->data_out || cmd->data_out_len);
361 group_id = XE_SYSCTRL_APP_HDR_GROUP_ID(&cmd->header);
362 command_code = XE_SYSCTRL_APP_HDR_COMMAND(&cmd->header);
367 cmd->data_in, cmd->data_in_len,
374 guard(mutex)(&sc->cmd_lock);
377 cmd->data_out, cmd->data_out_len, rdata_len,