while (fw.pos != fw.end) {
u32 word, opcode, offset, count, mask, class;
err = fw_next(&fw, &word); if (err) return err;
opcode = (word & 0xf0000000) >> 28;
switch (opcode) { case HOST1X_OPCODE_SETCLASS:
offset = word >> 16 & 0xfff;
mask = word & 0x3f; class = (word >> 6) & 0x3ff;
err = fw_check_class(&fw, class);
fw.class = class;
*job_class = class; if (!err)
err = fw_check_regs_mask(&fw, offset, mask); if (err)
dev_warn(client->base.dev, "illegal SETCLASS(offset=0x%x, mask=0x%x, class=0x%x) at word %u",
offset, mask, class, fw.pos-1); break; case HOST1X_OPCODE_INCR:
offset = (word >> 16) & 0xfff;
count = word & 0xffff;
err = fw_check_regs_seq(&fw, offset, count, true); if (err)
dev_warn(client->base.dev, "illegal INCR(offset=0x%x, count=%u) in class 0x%x at word %u",
offset, count, fw.class, fw.pos-1); break; case HOST1X_OPCODE_NONINCR:
offset = (word >> 16) & 0xfff;
count = word & 0xffff;
err = fw_check_regs_seq(&fw, offset, count, false); if (err)
dev_warn(client->base.dev, "illegal NONINCR(offset=0x%x, count=%u) in class 0x%x at word %u",
offset, count, fw.class, fw.pos-1); break; case HOST1X_OPCODE_MASK:
offset = (word >> 16) & 0xfff;
mask = word & 0xffff;
err = fw_check_regs_mask(&fw, offset, mask); if (err)
dev_warn(client->base.dev, "illegal MASK(offset=0x%x, mask=0x%x) in class 0x%x at word %u",
offset, mask, fw.class, fw.pos-1); break; case HOST1X_OPCODE_IMM: /* IMM cannot reasonably be used to write a pointer */
offset = (word >> 16) & 0xfff;
err = fw_check_regs_imm(&fw, offset); if (err)
dev_warn(client->base.dev, "illegal IMM(offset=0x%x) in class 0x%x at word %u",
offset, fw.class, fw.pos-1); break; case HOST1X_OPCODE_SETPYLD:
payload = word & 0xffff;
payload_valid = true; break; case HOST1X_OPCODE_INCR_W: if (!payload_valid) return -EINVAL;
offset = word & 0x3fffff;
err = fw_check_regs_seq(&fw, offset, payload, true); if (err)
dev_warn(client->base.dev, "illegal INCR_W(offset=0x%x) in class 0x%x at word %u",
offset, fw.class, fw.pos-1); break; case HOST1X_OPCODE_NONINCR_W: if (!payload_valid) return -EINVAL;
offset = word & 0x3fffff;
err = fw_check_regs_seq(&fw, offset, payload, false); if (err)
dev_warn(client->base.dev, "illegal NONINCR(offset=0x%x) in class 0x%x at word %u",
offset, fw.class, fw.pos-1); break; default:
dev_warn(client->base.dev, "illegal opcode at word %u",
fw.pos-1); return -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.