Lines Matching refs:task
71 struct uvesafb_ktask *task; in uvesafb_cn_callback() local
80 task = uvfb_tasks[msg->seq]; in uvesafb_cn_callback()
82 if (!task || msg->ack != task->ack) { in uvesafb_cn_callback()
90 if (task->t.buf_len < utask->buf_len || in uvesafb_cn_callback()
99 memcpy(&task->t, utask, sizeof(*utask)); in uvesafb_cn_callback()
101 if (task->t.buf_len && task->buf) in uvesafb_cn_callback()
102 memcpy(task->buf, utask + 1, task->t.buf_len); in uvesafb_cn_callback()
104 complete(task->done); in uvesafb_cn_callback()
140 static int uvesafb_exec(struct uvesafb_ktask *task) in uvesafb_exec() argument
145 int len = sizeof(task->t) + task->t.buf_len; in uvesafb_exec()
161 init_completion(task->done); in uvesafb_exec()
169 memcpy(m + 1, &task->t, sizeof(task->t)); in uvesafb_exec()
172 memcpy((u8 *)(m + 1) + sizeof(task->t), task->buf, task->t.buf_len); in uvesafb_exec()
178 task->ack = m->ack; in uvesafb_exec()
190 uvfb_tasks[seq] = task; in uvesafb_exec()
214 if (!err && !(task->t.flags & TF_EXIT)) in uvesafb_exec()
215 err = !wait_for_completion_timeout(task->done, in uvesafb_exec()
233 static void uvesafb_free(struct uvesafb_ktask *task) in uvesafb_free() argument
235 if (task) { in uvesafb_free()
236 kfree(task->done); in uvesafb_free()
237 kfree(task); in uvesafb_free()
244 static void uvesafb_reset(struct uvesafb_ktask *task) in uvesafb_reset() argument
246 struct completion *cpl = task->done; in uvesafb_reset()
248 memset(task, 0, sizeof(*task)); in uvesafb_reset()
249 task->done = cpl; in uvesafb_reset()
257 struct uvesafb_ktask *task; in uvesafb_prep() local
259 task = kzalloc(sizeof(*task), GFP_KERNEL); in uvesafb_prep()
260 if (task) { in uvesafb_prep()
261 task->done = kzalloc(sizeof(*task->done), GFP_KERNEL); in uvesafb_prep()
262 if (!task->done) { in uvesafb_prep()
263 kfree(task); in uvesafb_prep()
264 task = NULL; in uvesafb_prep()
267 return task; in uvesafb_prep()
352 struct uvesafb_ktask *task; in uvesafb_vbe_state_save() local
363 task = uvesafb_prep(); in uvesafb_vbe_state_save()
364 if (!task) { in uvesafb_vbe_state_save()
369 task->t.regs.eax = 0x4f04; in uvesafb_vbe_state_save()
370 task->t.regs.ecx = 0x000f; in uvesafb_vbe_state_save()
371 task->t.regs.edx = 0x0001; in uvesafb_vbe_state_save()
372 task->t.flags = TF_BUF_RET | TF_BUF_ESBX; in uvesafb_vbe_state_save()
373 task->t.buf_len = par->vbe_state_size; in uvesafb_vbe_state_save()
374 task->buf = state; in uvesafb_vbe_state_save()
375 err = uvesafb_exec(task); in uvesafb_vbe_state_save()
377 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { in uvesafb_vbe_state_save()
380 task->t.regs.eax, err); in uvesafb_vbe_state_save()
385 uvesafb_free(task); in uvesafb_vbe_state_save()
391 struct uvesafb_ktask *task; in uvesafb_vbe_state_restore() local
397 task = uvesafb_prep(); in uvesafb_vbe_state_restore()
398 if (!task) in uvesafb_vbe_state_restore()
401 task->t.regs.eax = 0x4f04; in uvesafb_vbe_state_restore()
402 task->t.regs.ecx = 0x000f; in uvesafb_vbe_state_restore()
403 task->t.regs.edx = 0x0002; in uvesafb_vbe_state_restore()
404 task->t.buf_len = par->vbe_state_size; in uvesafb_vbe_state_restore()
405 task->t.flags = TF_BUF_ESBX; in uvesafb_vbe_state_restore()
406 task->buf = state_buf; in uvesafb_vbe_state_restore()
408 err = uvesafb_exec(task); in uvesafb_vbe_state_restore()
409 if (err || (task->t.regs.eax & 0xffff) != 0x004f) in uvesafb_vbe_state_restore()
412 task->t.regs.eax, err); in uvesafb_vbe_state_restore()
414 uvesafb_free(task); in uvesafb_vbe_state_restore()
417 static int uvesafb_vbe_getinfo(struct uvesafb_ktask *task, in uvesafb_vbe_getinfo() argument
422 task->t.regs.eax = 0x4f00; in uvesafb_vbe_getinfo()
423 task->t.flags = TF_VBEIB; in uvesafb_vbe_getinfo()
424 task->t.buf_len = sizeof(struct vbe_ib); in uvesafb_vbe_getinfo()
425 task->buf = &par->vbe_ib; in uvesafb_vbe_getinfo()
428 err = uvesafb_exec(task); in uvesafb_vbe_getinfo()
429 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { in uvesafb_vbe_getinfo()
431 "(eax=0x%x, err=%d)\n", (u32)task->t.regs.eax, in uvesafb_vbe_getinfo()
456 ((char *)task->buf) + par->vbe_ib.oem_vendor_name_ptr); in uvesafb_vbe_getinfo()
460 ((char *)task->buf) + par->vbe_ib.oem_product_name_ptr); in uvesafb_vbe_getinfo()
464 ((char *)task->buf) + par->vbe_ib.oem_product_rev_ptr); in uvesafb_vbe_getinfo()
468 ((char *)task->buf) + par->vbe_ib.oem_string_ptr); in uvesafb_vbe_getinfo()
476 static int uvesafb_vbe_getmodes(struct uvesafb_ktask *task, in uvesafb_vbe_getmodes() argument
501 uvesafb_reset(task); in uvesafb_vbe_getmodes()
502 task->t.regs.eax = 0x4f01; in uvesafb_vbe_getmodes()
503 task->t.regs.ecx = (u32) *mode; in uvesafb_vbe_getmodes()
504 task->t.flags = TF_BUF_RET | TF_BUF_ESDI; in uvesafb_vbe_getmodes()
505 task->t.buf_len = sizeof(struct vbe_mode_ib); in uvesafb_vbe_getmodes()
506 task->buf = par->vbe_modes + off; in uvesafb_vbe_getmodes()
508 err = uvesafb_exec(task); in uvesafb_vbe_getmodes()
509 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { in uvesafb_vbe_getmodes()
512 *mode, (u32)task->t.regs.eax, err); in uvesafb_vbe_getmodes()
518 mib = task->buf; in uvesafb_vbe_getmodes()
555 static int uvesafb_vbe_getpmi(struct uvesafb_ktask *task, in uvesafb_vbe_getpmi() argument
560 uvesafb_reset(task); in uvesafb_vbe_getpmi()
561 task->t.regs.eax = 0x4f0a; in uvesafb_vbe_getpmi()
562 task->t.regs.ebx = 0x0; in uvesafb_vbe_getpmi()
563 err = uvesafb_exec(task); in uvesafb_vbe_getpmi()
565 if ((task->t.regs.eax & 0xffff) != 0x4f || task->t.regs.es < 0xc000) { in uvesafb_vbe_getpmi()
568 par->pmi_base = (u16 *)phys_to_virt(((u32)task->t.regs.es << 4) in uvesafb_vbe_getpmi()
569 + task->t.regs.edi); in uvesafb_vbe_getpmi()
574 (u16)task->t.regs.es, (u16)task->t.regs.edi); in uvesafb_vbe_getpmi()
617 static int uvesafb_vbe_getedid(struct uvesafb_ktask *task, struct fb_info *info) in uvesafb_vbe_getedid() argument
625 task->t.regs.eax = 0x4f15; in uvesafb_vbe_getedid()
626 task->t.regs.ebx = 0; in uvesafb_vbe_getedid()
627 task->t.regs.ecx = 0; in uvesafb_vbe_getedid()
628 task->t.buf_len = 0; in uvesafb_vbe_getedid()
629 task->t.flags = 0; in uvesafb_vbe_getedid()
631 err = uvesafb_exec(task); in uvesafb_vbe_getedid()
633 if ((task->t.regs.eax & 0xffff) != 0x004f || err) in uvesafb_vbe_getedid()
636 if ((task->t.regs.ebx & 0x3) == 3) { in uvesafb_vbe_getedid()
639 } else if ((task->t.regs.ebx & 0x3) == 2) { in uvesafb_vbe_getedid()
642 } else if ((task->t.regs.ebx & 0x3) == 1) { in uvesafb_vbe_getedid()
651 task->t.regs.eax = 0x4f15; in uvesafb_vbe_getedid()
652 task->t.regs.ebx = 1; in uvesafb_vbe_getedid()
653 task->t.regs.ecx = task->t.regs.edx = 0; in uvesafb_vbe_getedid()
654 task->t.flags = TF_BUF_RET | TF_BUF_ESDI; in uvesafb_vbe_getedid()
655 task->t.buf_len = EDID_LENGTH; in uvesafb_vbe_getedid()
656 task->buf = kzalloc(EDID_LENGTH, GFP_KERNEL); in uvesafb_vbe_getedid()
657 if (!task->buf) in uvesafb_vbe_getedid()
660 err = uvesafb_exec(task); in uvesafb_vbe_getedid()
662 if ((task->t.regs.eax & 0xffff) == 0x004f && !err) { in uvesafb_vbe_getedid()
663 fb_edid_to_monspecs(task->buf, &info->monspecs); in uvesafb_vbe_getedid()
678 kfree(task->buf); in uvesafb_vbe_getedid()
682 static void uvesafb_vbe_getmonspecs(struct uvesafb_ktask *task, in uvesafb_vbe_getmonspecs() argument
695 if (uvesafb_vbe_getedid(task, info)) { in uvesafb_vbe_getmonspecs()
763 static void uvesafb_vbe_getstatesize(struct uvesafb_ktask *task, in uvesafb_vbe_getstatesize() argument
768 uvesafb_reset(task); in uvesafb_vbe_getstatesize()
774 task->t.regs.eax = 0x4f04; in uvesafb_vbe_getstatesize()
775 task->t.regs.ecx = 0x000f; in uvesafb_vbe_getstatesize()
776 task->t.regs.edx = 0x0000; in uvesafb_vbe_getstatesize()
777 task->t.flags = 0; in uvesafb_vbe_getstatesize()
779 err = uvesafb_exec(task); in uvesafb_vbe_getstatesize()
781 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { in uvesafb_vbe_getstatesize()
784 task->t.regs.eax, err); in uvesafb_vbe_getstatesize()
789 par->vbe_state_size = 64 * (task->t.regs.ebx & 0xffff); in uvesafb_vbe_getstatesize()
794 struct uvesafb_ktask *task = NULL; in uvesafb_vbe_init() local
798 task = uvesafb_prep(); in uvesafb_vbe_init()
799 if (!task) in uvesafb_vbe_init()
802 err = uvesafb_vbe_getinfo(task, par); in uvesafb_vbe_init()
806 err = uvesafb_vbe_getmodes(task, par); in uvesafb_vbe_init()
821 uvesafb_vbe_getpmi(task, par); in uvesafb_vbe_init()
830 uvesafb_vbe_getmonspecs(task, info); in uvesafb_vbe_init()
831 uvesafb_vbe_getstatesize(task, par); in uvesafb_vbe_init()
833 out: uvesafb_free(task); in uvesafb_vbe_init()
938 struct uvesafb_ktask *task; in uvesafb_setpalette() local
979 task = uvesafb_prep(); in uvesafb_setpalette()
980 if (!task) in uvesafb_setpalette()
983 task->t.regs.eax = 0x4f09; in uvesafb_setpalette()
984 task->t.regs.ebx = 0x0; in uvesafb_setpalette()
985 task->t.regs.ecx = count; in uvesafb_setpalette()
986 task->t.regs.edx = start; in uvesafb_setpalette()
987 task->t.flags = TF_BUF_ESDI; in uvesafb_setpalette()
988 task->t.buf_len = sizeof(struct uvesafb_pal_entry) * count; in uvesafb_setpalette()
989 task->buf = entries; in uvesafb_setpalette()
991 err = uvesafb_exec(task); in uvesafb_setpalette()
992 if ((task->t.regs.eax & 0xffff) != 0x004f) in uvesafb_setpalette()
995 uvesafb_free(task); in uvesafb_setpalette()
1119 struct uvesafb_ktask *task; in uvesafb_blank() local
1149 task = uvesafb_prep(); in uvesafb_blank()
1150 if (!task) in uvesafb_blank()
1153 task->t.regs.eax = 0x4f10; in uvesafb_blank()
1156 task->t.regs.ebx = 0x0001; in uvesafb_blank()
1159 task->t.regs.ebx = 0x0101; /* standby */ in uvesafb_blank()
1162 task->t.regs.ebx = 0x0401; /* powerdown */ in uvesafb_blank()
1168 err = uvesafb_exec(task); in uvesafb_blank()
1169 if (err || (task->t.regs.eax & 0xffff) != 0x004f) in uvesafb_blank()
1171 out: uvesafb_free(task); in uvesafb_blank()
1198 struct uvesafb_ktask *task = NULL; in uvesafb_release() local
1208 task = uvesafb_prep(); in uvesafb_release()
1209 if (!task) in uvesafb_release()
1213 task->t.regs.eax = 0x0003; in uvesafb_release()
1214 uvesafb_exec(task); in uvesafb_release()
1223 uvesafb_free(task); in uvesafb_release()
1230 struct uvesafb_ktask *task = NULL; in uvesafb_set_par() local
1246 task = uvesafb_prep(); in uvesafb_set_par()
1247 if (!task) in uvesafb_set_par()
1250 task->t.regs.eax = 0x4f02; in uvesafb_set_par()
1251 task->t.regs.ebx = mode->mode_id | 0x4000; /* use LFB */ in uvesafb_set_par()
1255 task->t.regs.ebx |= 0x0800; /* use CRTC data */ in uvesafb_set_par()
1256 task->t.flags = TF_BUF_ESDI; in uvesafb_set_par()
1287 task->t.buf_len = sizeof(struct vbe_crtc_ib); in uvesafb_set_par()
1288 task->buf = &par->crtc; in uvesafb_set_par()
1290 err = uvesafb_exec(task); in uvesafb_set_par()
1291 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { in uvesafb_set_par()
1299 "default timings.\n", task->t.regs.eax, err); in uvesafb_set_par()
1300 uvesafb_reset(task); in uvesafb_set_par()
1307 "0x%x, err=%d)\n", task->t.regs.eax, err); in uvesafb_set_par()
1317 uvesafb_reset(task); in uvesafb_set_par()
1318 task->t.regs.eax = 0x4f08; in uvesafb_set_par()
1319 task->t.regs.ebx = 0x0800; in uvesafb_set_par()
1321 err = uvesafb_exec(task); in uvesafb_set_par()
1322 if (err || (task->t.regs.eax & 0xffff) != 0x004f || in uvesafb_set_par()
1323 ((task->t.regs.ebx & 0xff00) >> 8) != 8) { in uvesafb_set_par()
1336 uvesafb_free(task); in uvesafb_set_par()
1947 struct uvesafb_ktask *task; in uvesafb_exit() local
1950 task = uvesafb_prep(); in uvesafb_exit()
1951 if (task) { in uvesafb_exit()
1952 task->t.flags = TF_EXIT; in uvesafb_exit()
1953 uvesafb_exec(task); in uvesafb_exit()
1954 uvesafb_free(task); in uvesafb_exit()