On Tue, 7 Nov 2006, Tyler Trafford wrote:
> On Nov 7, 2006, at 3:44 PM, Robert Hardy wrote:
> > The following code rewrites the ivtv-firmware code so that it has more
> > checks and balances and more closely matches recently discussed proper
> > firmware_class usage examples provided by a new firmware_class
> > maintainer as
> > seen on the kernel mailing list.
> >
> > The most important modification is the code now no longer blindly writes
> > all the data fw->size returns if it makes no sense to!
>
> Maybe I misunderstand, but it seems to write at most the requested
> size, not fw->size.
The point is you are missing here is that the circa 0.8.0 load_fw_direct
only writes at most the requested "size" if "size" is properly set. I've
seen many cases where "size" was larger than "fw->size", and both values
were incorrect. In those cases the code blindly read and wrote "fw->size"
worth of data, usually blowing the system out of the water in the process.
Here are the "size" and "fw->size" values across a few reboots to illustrate
what I'm talking about:
Nov 6 18:33:36 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 6 18:33:36 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 6 18:33:37 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=1048576 bytes;fw->size=376836 bytes)
Nov 6 22:09:39 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 6 22:09:39 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 6 22:12:28 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 6 22:12:28 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 6 22:47:17 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 6 22:47:17 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 6 22:47:18 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=155648 bytes)
Nov 6 22:51:32 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 6 22:51:32 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 6 22:51:32 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=155648 bytes)
Nov 6 22:57:02 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 6 22:57:02 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 6 22:57:04 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=262144 bytes)
Nov 7 01:50:41 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 01:50:41 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 7 01:50:41 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=155648 bytes)
Nov 7 01:51:19 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 01:51:19 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 7 01:51:21 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=155648 bytes)
Nov 7 01:56:39 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 01:56:39 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 11:29:34 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 11:29:35 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 7 11:29:35 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=155648 bytes)
Nov 7 11:33:37 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 11:33:37 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 7 11:33:37 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=155648 bytes)
Nov 7 11:36:38 vortex kernel: ivtv0: loading v4l-cx2341x-enc.fw firmware
(size=262144 bytes;fw->size=376836 bytes)
Nov 7 11:36:38 vortex kernel: ivtv0: loading v4l-cx2341x-dec.fw firmware
(size=262144 bytes;fw->size=262144 bytes)
Nov 7 11:36:39 vortex kernel: ivtv0: loading v4l-cx2341x-init.mpg firmware
(size=155648 bytes;fw->size=262144 bytes)
> > - for (i = 0; i < retval; i += 4) {
> > - writel(*src, dst);
> > - dst++;
> > - src++;
>
> I'm pretty sure those writel's were there to fix something.... *checks*
>
> Refer to these:
>
> http://ivtvdriver.org/trac/changeset/3089
> http://ivtvdriver.org/trac/changeset/3152
I haven't been tracking trunk lately... I've read through these now.
I can see no reason to keep using writel.
I re-read the relevant sections of Linux Device Drivers 3rd Ed just now to
be sure... I should have been using memcpy_toio in my patch and will
re-write it shortly to use that.
Although writel is still widely used in older kernel code, it's use is
discouraged in new code. It looks like the code should either be using
memcpy_toio or if you really like the "do it in little bits" method using
iowrite32 instead of writel would make sense.
void iowrite32(u32 value, void *addr);
>From LLD 3rd Ed:
"If you read through the kernel source, you see many calls to an older set
of functions when I/O memory is being used. These functions still work, but
their use in new code is discouraged. Among other things, they are less safe
because they do not perform the same sort of type checking."
Regards,
Rob
--
---------------------"Happiness is understanding."----------------------
Robert Hardy, B.Eng Computer Systems C.E.O. Webcon Inc.
rhardy <at> webcon <dot> ca GPG Key available (613) 276-7327
_______________________________________________
ivtv-devel mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-devel