RFC: VIDIOC_DBG_G_CHIP_NAME improvements

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Now that the VIDIOC_DBG_G_CHIP_NAME ioctl has been added to the v4l2 API I
started work on removing the VIDIOC_DBG_G_CHIP_IDENT support in existing
drivers. Based on that effort I realized that there are a few things that
could be improved.

One thing that Laurent pointed out is that this ioctl should be available
only if CONFIG_VIDEO_ADV_DEBUG is set to prevent abuse by either userspace
or kernelspace. I agree with that, especially since g_chip_ident is being
abused today by some bridge drivers. That should be avoided in the future.

I am also unhappy with the name. G_CHIP_INFO would certainly be more descriptive,
but perhaps we should move a bit more into the direction of the Media Controller
and call it G_ENTITY_INFO. Opinions are welcome.

What surprised me when digging into the existing uses of G_CHIP_IDENT was that
there are more devices than expected that have multiple register blocks. I.e.
rather than a single set of registers they have multiple blocks of registers,
say one block at address 0x1000, another at 0x2000, etc.

Usually such register blocks represent IP blocks inside the chip, each doing
a specific task. In other cases (adv7604) each block corresponds to an i2c
address, each again representing an IP block inside the chip.

In the case of adv7604 it has been implementing by mapping register offsets
to specific i2c addresses, in the case of the cx231xx it has been implemented
by exposing different bridge chips, unfortunately that's done in such a way
that it can't be enumerated.

The existing debug API has no support for discovering such ranges, but having
worked with such a chip I think that having support for this is very desirable.

Since we added a new ioctl anyway, I thought that this is a good time to
extend it a bit and allow range discovery to be implemented:

/**     
 * struct v4l2_dbg_chip_name - VIDIOC_DBG_G_CHIP_NAME argument
 * @match:      which chip to match
 * @flags:      flags that tell whether this range is readable/writable
 * @name:       unique name of the chip
 * @range_name: name of the register range
 * @range_min:  minimum register of the register range
 * @range_max:  maximum register of the register range
 * @reserved:   future extensions
 */     
struct v4l2_dbg_chip_name {
        struct v4l2_dbg_match match;
	__u32 range;
        __u32 flags;
        char name[32];
        char range_name[32];
        __u64 range_start;
        __u64 range_size;
        __u32 reserved[8];
} __attribute__ ((packed));

range is the range index, range_name describes the purpose of the register
range, range_start and size are the start register address and the size of
this register range.

This extension allows you to enumerate the available register ranges for each
device. If there is only one range, then range_size may be 0. This is mostly
for backwards compatibility as otherwise I would have to modify all existing
drivers for this, and also because this is not really necessary for simple
devices with just one range. These are mostly i2c devices with start address
0 and a size of 256 bytes at most.

Comments?

Regards,

	Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux