Lines Matching defs:task

69  * find the kernel part of the task struct, copy the registers and
70 * the buffer contents and then complete the task.
75 struct uvesafb_ktask *task;
84 task = uvfb_tasks[msg->seq];
86 if (!task || msg->ack != task->ack) {
94 if (task->t.buf_len < utask->buf_len ||
103 memcpy(&task->t, utask, sizeof(*utask));
105 if (task->t.buf_len && task->buf)
106 memcpy(task->buf, utask + 1, task->t.buf_len);
108 complete(task->done);
129 * Execute a uvesafb task.
131 * Returns 0 if the task is executed successfully.
144 static int uvesafb_exec(struct uvesafb_ktask *task)
149 int len = sizeof(task->t) + task->t.buf_len;
156 pr_warn("message too long (%d), can't execute task\n",
165 init_completion(task->done);
173 memcpy(m + 1, &task->t, sizeof(task->t));
176 memcpy((u8 *)(m + 1) + sizeof(task->t), task->buf, task->t.buf_len);
180 * part of this task when a reply is received from userspace.
182 task->ack = m->ack;
193 /* Save a pointer to the kernel part of the task struct. */
194 uvfb_tasks[seq] = task;
216 if (!err && !(task->t.flags & TF_EXIT))
217 err = !wait_for_completion_timeout(task->done,
235 static void uvesafb_free(struct uvesafb_ktask *task)
237 if (task) {
238 kfree(task->done);
239 kfree(task);
246 static void uvesafb_reset(struct uvesafb_ktask *task)
248 struct completion *cpl = task->done;
250 memset(task, 0, sizeof(*task));
251 task->done = cpl;
259 struct uvesafb_ktask *task;
261 task = kzalloc(sizeof(*task), GFP_KERNEL);
262 if (task) {
263 task->done = kzalloc(sizeof(*task->done), GFP_KERNEL);
264 if (!task->done) {
265 kfree(task);
266 task = NULL;
269 return task;
354 struct uvesafb_ktask *task;
365 task = uvesafb_prep();
366 if (!task) {
371 task->t.regs.eax = 0x4f04;
372 task->t.regs.ecx = 0x000f;
373 task->t.regs.edx = 0x0001;
374 task->t.flags = TF_BUF_RET | TF_BUF_ESBX;
375 task->t.buf_len = par->vbe_state_size;
376 task->buf = state;
377 err = uvesafb_exec(task);
379 if (err || (task->t.regs.eax & 0xffff) != 0x004f) {
381 task->t.regs.eax, err);
386 uvesafb_free(task);
392 struct uvesafb_ktask *task;
398 task = uvesafb_prep();
399 if (!task)
402 task->t.regs.eax = 0x4f04;
403 task->t.regs.ecx = 0x000f;
404 task->t.regs.edx = 0x0002;
405 task->t.buf_len = par->vbe_state_size;
406 task->t.flags = TF_BUF_ESBX;
407 task->buf = state_buf;
409 err = uvesafb_exec(task);
410 if (err || (task->t.regs.eax & 0xffff) != 0x004f)
412 task->t.regs.eax, err);
414 uvesafb_free(task);
417 static int uvesafb_vbe_getinfo(struct uvesafb_ktask *task,
422 task->t.regs.eax = 0x4f00;
423 task->t.flags = TF_VBEIB;
424 task->t.buf_len = sizeof(struct vbe_ib);
425 task->buf = &par->vbe_ib;
428 err = uvesafb_exec(task);
429 if (err || (task->t.regs.eax & 0xffff) != 0x004f) {
431 (u32)task->t.regs.eax, err);
454 ((char *)task->buf) + par->vbe_ib.oem_vendor_name_ptr);
458 ((char *)task->buf) + par->vbe_ib.oem_product_name_ptr);
462 ((char *)task->buf) + par->vbe_ib.oem_product_rev_ptr);
466 ((char *)task->buf) + par->vbe_ib.oem_string_ptr);
475 static int uvesafb_vbe_getmodes(struct uvesafb_ktask *task,
501 uvesafb_reset(task);
502 task->t.regs.eax = 0x4f01;
503 task->t.regs.ecx = (u32) *mode;
504 task->t.flags = TF_BUF_RET | TF_BUF_ESDI;
505 task->t.buf_len = sizeof(struct vbe_mode_ib);
506 task->buf = par->vbe_modes + off;
508 err = uvesafb_exec(task);
509 if (err || (task->t.regs.eax & 0xffff) != 0x004f) {
511 *mode, (u32)task->t.regs.eax, err);
517 mib = task->buf;
554 static int uvesafb_vbe_getpmi(struct uvesafb_ktask *task,
559 uvesafb_reset(task);
560 task->t.regs.eax = 0x4f0a;
561 task->t.regs.ebx = 0x0;
562 err = uvesafb_exec(task);
564 if ((task->t.regs.eax & 0xffff) != 0x4f || task->t.regs.es < 0xc000) {
567 par->pmi_base = (u16 *)phys_to_virt(((u32)task->t.regs.es << 4)
568 + task->t.regs.edi);
572 (u16)task->t.regs.es, (u16)task->t.regs.edi);
613 static int uvesafb_vbe_getedid(struct uvesafb_ktask *task, struct fb_info *info)
621 task->t.regs.eax = 0x4f15;
622 task->t.regs.ebx = 0;
623 task->t.regs.ecx = 0;
624 task->t.buf_len = 0;
625 task->t.flags = 0;
627 err = uvesafb_exec(task);
629 if ((task->t.regs.eax & 0xffff) != 0x004f || err)
632 if ((task->t.regs.ebx & 0x3) == 3) {
634 } else if ((task->t.regs.ebx & 0x3) == 2) {
636 } else if ((task->t.regs.ebx & 0x3) == 1) {
643 task->t.regs.eax = 0x4f15;
644 task->t.regs.ebx = 1;
645 task->t.regs.ecx = task->t.regs.edx = 0;
646 task->t.flags = TF_BUF_RET | TF_BUF_ESDI;
647 task->t.buf_len = EDID_LENGTH;
648 task->buf = kzalloc(EDID_LENGTH, GFP_KERNEL);
649 if (!task->buf)
652 err = uvesafb_exec(task);
654 if ((task->t.regs.eax & 0xffff) == 0x004f && !err) {
655 fb_edid_to_monspecs(task->buf, &info->monspecs);
670 kfree(task->buf);
674 static void uvesafb_vbe_getmonspecs(struct uvesafb_ktask *task,
687 if (uvesafb_vbe_getedid(task, info)) {
753 static void uvesafb_vbe_getstatesize(struct uvesafb_ktask *task,
758 uvesafb_reset(task);
764 task->t.regs.eax = 0x4f04;
765 task->t.regs.ecx = 0x000f;
766 task->t.regs.edx = 0x0000;
767 task->t.flags = 0;
769 err = uvesafb_exec(task);
771 if (err || (task->t.regs.eax & 0xffff) != 0x004f) {
773 task->t.regs.eax, err);
778 par->vbe_state_size = 64 * (task->t.regs.ebx & 0xffff);
783 struct uvesafb_ktask *task = NULL;
787 task = uvesafb_prep();
788 if (!task)
791 err = uvesafb_vbe_getinfo(task, par);
795 err = uvesafb_vbe_getmodes(task, par);
809 uvesafb_vbe_getpmi(task, par);
818 uvesafb_vbe_getmonspecs(task, info);
819 uvesafb_vbe_getstatesize(task, par);
821 out: uvesafb_free(task);
925 struct uvesafb_ktask *task;
966 task = uvesafb_prep();
967 if (!task)
970 task->t.regs.eax = 0x4f09;
971 task->t.regs.ebx = 0x0;
972 task->t.regs.ecx = count;
973 task->t.regs.edx = start;
974 task->t.flags = TF_BUF_ESDI;
975 task->t.buf_len = sizeof(struct uvesafb_pal_entry) * count;
976 task->buf = entries;
978 err = uvesafb_exec(task);
979 if ((task->t.regs.eax & 0xffff) != 0x004f)
982 uvesafb_free(task);
1106 struct uvesafb_ktask *task;
1136 task = uvesafb_prep();
1137 if (!task)
1140 task->t.regs.eax = 0x4f10;
1143 task->t.regs.ebx = 0x0001;
1146 task->t.regs.ebx = 0x0101; /* standby */
1149 task->t.regs.ebx = 0x0401; /* powerdown */
1155 err = uvesafb_exec(task);
1156 if (err || (task->t.regs.eax & 0xffff) != 0x004f)
1158 out: uvesafb_free(task);
1185 struct uvesafb_ktask *task = NULL;
1195 task = uvesafb_prep();
1196 if (!task)
1200 task->t.regs.eax = 0x0003;
1201 uvesafb_exec(task);
1210 uvesafb_free(task);
1217 struct uvesafb_ktask *task = NULL;
1233 task = uvesafb_prep();
1234 if (!task)
1237 task->t.regs.eax = 0x4f02;
1238 task->t.regs.ebx = mode->mode_id | 0x4000; /* use LFB */
1242 task->t.regs.ebx |= 0x0800; /* use CRTC data */
1243 task->t.flags = TF_BUF_ESDI;
1274 task->t.buf_len = sizeof(struct vbe_crtc_ib);
1275 task->buf = &par->crtc;
1277 err = uvesafb_exec(task);
1278 if (err || (task->t.regs.eax & 0xffff) != 0x004f) {
1285 task->t.regs.eax, err);
1286 uvesafb_reset(task);
1293 task->t.regs.eax, err);
1303 uvesafb_reset(task);
1304 task->t.regs.eax = 0x4f08;
1305 task->t.regs.ebx = 0x0800;
1307 err = uvesafb_exec(task);
1308 if (err || (task->t.regs.eax & 0xffff) != 0x004f ||
1309 ((task->t.regs.ebx & 0xff00) >> 8) != 8) {
1322 uvesafb_free(task);
1925 struct uvesafb_ktask *task;
1928 task = uvesafb_prep();
1929 if (task) {
1930 task->t.flags = TF_EXIT;
1931 uvesafb_exec(task);
1932 uvesafb_free(task);