hi im trying to run ivtv on an amd64-
ok, the firmware loading has been fixed. used : http://kmos.org/~ckennedy/ivtv/ivtv-0.1.10-pre2-ck65f.tgz to load ivtv successfully.
but the io code does not seem to be 64bit safe.
when accessing the device the kernel crashes: when executing function ivtv_sched_DMA
There must be someone out there who is able to check if this is 64bit safe .. !
Thanks, sven
PS: if someone can tell me how to save the dmesg of a crashing kernel i will submit the stack trace
On Fri, 2004-05-14 at 13:46, Sven Boeckelmann wrote:
hi,
i'm trying to get ivtv working on my amd64. the driver is compiling on gentoo with kernel 2.6.6, gcc 3.3.3, module-init-tools from gentoo sys-apps/module-init-tools-3.0
but when i'm doing insmod i get a modprobe Ooops:
ivtv: i2c client attach ivtv: i2c attach [client=saa7115[0],ok] ivtv: Active card count: 1. ivtv: Stopping VDM ivtv: Stopping AO ivtv: pinging (?) APU ivtv: Stopping VPU ivtv: Resetting Hw Blocks ivtv: Stopping SPU ivtv: Sleeping for 10ms ivtv: init Encoder SDRAM pre-charge ivtv: init Encoder SDRAM refresh to 1us ivtv: init Decoder SDRAM pre-charge ivtv: init Decoder SDRAM refresh to 1us ivtv: Sleeping for 600ms (600 recommended) ivtv: Card ready for firmware! ivtv: Loading encoder image ivtv: Loading decoder firmware ivtv: Sleeping for 1 sec ivtv: Sleeping for 1 sec ivtv: About to search for mailboxes ivtv: Searching for encoder mailbox ivtv: .<1>Unable to handle kernel paging request at 00000000000c8100 RIP: <ffffffffa02ebdfb>{:ivtv:ivtv_find_firmware_mailbox+75}PML4 38949067 PGD 386ad067 PMD 0 Oops: 0000 [1] CPU 0 Pid: 5714, comm: insmod Tainted: P 2.6.6 RIP: 0010:[<ffffffffa02ebdfb>] <ffffffffa02ebdfb>{:ivtv:ivtv_find_firmware_mailbox+75}RSP: 0018:0000010037529dc8 EFLAGS: 00010213 RAX: ffffff00010c7fff RBX: 0000000000000000 RCX: 000000000000007f RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffff80463a40 RBP: 00000000000c8100 R08: 0000000000000034 R09: 000001003f37b0c0 R10: 0000007fbffff3c3 R11: 0000000000000001 R12: 0000000000000000 R13: ffffffffa02fd720 R14: 00000000005020a0 R15: 0000000000000003 FS: 0000002a95ac9060(0000) GS:ffffffff804ce600(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 00000000000c8100 CR3: 0000000000101000 CR4: 00000000000006e0 Process insmod (pid: 5714, stackpage=1003e76f000) Stack: 0000000000000000 ffffffffa02fd720 000001003fd15000 0000000000000000 0000000000000000 ffffffffa03056b0 0000010037529e80 01164000381e1aa8 000001003ff0c3a8 ffffffff801948b1 Call Trace:<ffffffffa03056b0>{:ivtv:ivtv_probe+1712} <ffffffff801948b1>{sysfs_create+113} <ffffffff801951a3>{create_dir+131} <ffffffff8022d3cd>{pci_device_probe_static+61} <ffffffff8022d419>{__pci_device_probe+25} <ffffffff8022d460>{pci_device_probe+48} <ffffffff8028aad7>{bus_match+71} <ffffffff8028abf6>{driver_attach+70} <ffffffff8028ae9e>{bus_add_driver+126} <ffffffff8028b212>{driver_register+50} <ffffffff8022d68e>{pci_register_driver+62} <ffffffffa02ef1ac>{:ivtv:module_start+716} <ffffffff80148417>{sys_init_module+263} <ffffffff8011141a>{system_call+126}
Code: 8b 45 00 39 04 95 70 ae 2f a0 75 54 ff c3 44 8d 65 04 8d 43 RIP <ffffffffa02ebdfb>{:ivtv:ivtv_find_firmware_mailbox+75} RSP <0000010037529dc8> CR2: 00000000000c8100
i was able to track it down to this portion of the code, but i guess the ivtv code is not able to 64bit at all. I habe been in contact with some of the ivtv developers, but none of them use amd64. so it's hard for them to figure out where the problem is. I was hoping someone on this list can help.
int ivtv_find_firmware_mailbox(struct ivtv *itv) { u32 *searchptr, *result; int match = 0;
searchptr = NULL; result = NULL; IVTV_DEBUG(IVTV_DEBUG_INFO, "Searching for encoder mailbox\n"); searchptr =(u32 *)(IVTV_FIRM_SEARCH_ENCODER_START +
itv->io_mem);
while (searchptr < (u32 *)(IVTV_FIRM_SEARCH_ENCODER_END +
itv->io_mem)) { if (ivtv_firm_search_id[match] == readl(searchptr)) { (u32)result = (u32)searchptr+4; /* avoid pointer aritmetic */ match++; while ((match > 0) && (match < 4)) { IVTV_DEBUG(IVTV_DEBUG_INFO, "match: 0x%08x at " "0x%08x. match: %d\n", *result, (u32)result, match); if (ivtv_firm_search_id[match] == readl(result)) { match++; /* FIXME change to just "result++;" ? */ (u32)result = (u32)result + 4; } else match = 0; } } else { IVTV_DEBUG(IVTV_DEBUG_INFO, "."); } if ( 4 == match ) { IVTV_DEBUG(IVTV_DEBUG_INFO, "found encoder mailbox!\n");
itv->enc_mbox = (struct ivtv_mailbox *) result; break; } (u32)searchptr += IVTV_FIRM_SEARCH_STEP; } if (itv->enc_mbox == NULL) IVTV_DEBUG(IVTV_DEBUG_ERR, "Encoder
mailbox not found\n");
IVTV_DEBUG(IVTV_DEBUG_INFO, "Searching for decoder mailbox\n"); match = 0; searchptr = (u32 *)(IVTV_FIRM_SEARCH_DECODER_START +
itv->io_mem);
while (searchptr < (u32 *)(IVTV_FIRM_SEARCH_DECODER_END +
itv->io_mem)) { if (ivtv_firm_search_id[match] == readl(searchptr)) { (u32)result = (u32)searchptr+4; /* avoid pointer aritmetic */ match++; while ((match > 0) && (match < 4)) { IVTV_DEBUG(IVTV_DEBUG_INFO, "match: 0x%08x at 0x%08x. match: %d\n", *result, (u32)result, match); if (ivtv_firm_search_id[match] == readl(result)) { match++; /* FIXME change to just "result++;" ? */ (u32)result = (u32)result + 4; } else match = 0; } } else { IVTV_DEBUG(IVTV_DEBUG_INFO, "."); } if ( 4 == match ) { IVTV_DEBUG(IVTV_DEBUG_INFO, "found decoder mailbox!\n"); itv->dec_mbox = (struct ivtv_mailbox *) result; break; } (u32)searchptr += IVTV_FIRM_SEARCH_STEP; } if (itv->dec_mbox == 0) IVTV_DEBUG(IVTV_DEBUG_ERR, "Decoder mailbox not found\n");
return 0;
}
the first time we run into the loop everything is fine, but after (u32)searchptr += IVTV_FIRM_SEARCH_STEP; is called readl(searchptr) causes the error.
i did a quick hack and changed it to: searchptr = (u32 *) (searchptr + IVTV_FIRM_SEARCH_STEP); which eliminated the error.
but of course id didn't make the driver work properly :-(
no the encoder search loop works, but doesn't find a match at if (ivtv_firm_search_id[match] == readl(searchptr)) {
and when we start looking for the decoder there is still the same error.
i guess there is something going wrong with ivtv->io_mem and readl(searchptr).
unfortunately i don't know much about pointer and address ranges. I'm hoping to get in touch with one of the amd64 kernel gurus on this list to help us figure out how to get ivtv running on amd64.
I'm really stuck!
Cheers, Sven