Re: [RFC PATCH 0/4] drivers/base: Generic framework for tracking internal interfaces

2014-05-05 Thread Andrzej Hajda
On 05/01/2014 11:11 AM, Russell King - ARM Linux wrote:
 On Thu, May 01, 2014 at 09:04:19AM +0200, Andrzej Hajda wrote:
 2. You replace calls of component_add and component_del with calls
 to interface_tracker_ifup(dev, INTERFACE_TRACKER_TYPE_COMPONENT,  
 specific_component_ops),
 or interface_tracker_ifdown.
 Thats all for components.
 How does the master get to decide which components are for it?

This is not a part of the framework. The master can construct
the list of its components anyhow. Some examples:
1. List of device tree video interface port nodes pointed by
master's remote-endpoint phandles.
2. List of device nodes pointed by supernode phandles.
3. Nodes pointed by other phandles in master's node.
4. Devices compatible with the list of drivers.

This is for create list of objects. As interface type it should
use the types of interface it expects at given nodes and is able to handle.

Small issue:
If the master creates list of devices and for particular interface
type expects DT node as the object, translation is easy: dev-of_node.
But if the situation is reverse kernel does not provide generic helper
for translating of_node to device, however kernel have everything to
provide such function if necessary.
Other solution is to use only DT nodes for object identification,
it will narrow the framework usage to DT architectures, but seems to be
more flexible anyway - we can have more than one interface of given type per
device, we can distinguish them by port node.

   As
 I see it, all masters see all components of a particular type.
 What if you have a system with two masters each of which are bound
 to a set of unique components but some of the components are of a
 the same type?

The master receives notifications only about interfaces he has
registered callback for. For example:
interface_tracker_register(node, INTERFACE_TRACKER_TYPE_DRM_PANEL, cb);

means that 'cb' callback will be called only if panel identifed by node
is up or down.
If the driver expect that at the 'node' there could be also component it
can also
listen for components:
interface_tracker_register(node, INTERFACE_TRACKER_TYPE_COMPONENT, cb);

Now 'cb' will be called if component or panel appears/disappears at node
'node'.

so callback function can look like:

void cb_func(struct interface_tracker_block *itb, const void *object,
unsigned long type, bool on,
  void *data)
{
struct priv_struct *priv = container_of(itb, struct priv_struct, itb);
switch(type) {
case INTERFACE_TRACKER_TYPE_DRM_PANEL:
handle_drm_panel(priv, data, on);
break;
case INTERFACE_TRACKER_TYPE_DRM_COMPONENT:
handle_drm_component(priv, data, object, on);
break;
}
}

where handlers can look like:

void handle_drm_panel(struct priv_struct *priv, struct drm_panel *panel,
bool on);
void handle_drm_component(struct priv_struct *priv, struct component_ops
*ops, struct device *dev, bool on);


 How does the master know what type to use?


It should use type which it expects at the given node.

Regards
Andrzej

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


Re: [RFC PATCH 0/4] drivers/base: Generic framework for tracking internal interfaces

2014-05-01 Thread Andrzej Hajda

Russell King - ARM Linux wrote, On 01.05.2014 00:28:

On Wed, Apr 30, 2014 at 11:42:09PM +0200, Andrzej Hajda wrote:

The main problem with component framework is that componentization
significantly changes every driver and changes it in a way which is not
compatible with traditional drivers, so devices which are intended to
work with different DRM masters are hard to componentize if some of DRMs
are componentized and some not.

Many of the problems which the component helpers are designed to solve
are those where you need the drm_device structure (or snd_card, or whatever
subsystem specific card/device representation structure) pre-created in
order to initialise the components.

In the case of DRM, you can't initialise encoders or connectors without
their drm_device structure pre-existing - because these components are
attached to the drm_device.

Your solution to that is to delay those calls, but the DRM subsystem is
not designed to cope like that - it's designed such that when the
connector or encoder initialisation functions are called, it is assumed
that the driver is initialising its state. (I've raised this point before
but you've just fobbed it off in the past.)

Another issue here is that the order of initialisation matters greatly.
Take CRTCs for example.  In DRM, the order of attachment of CRTCs defines
their identity, changing the order changes their identity, and changes
how they are bound to their respective connectors.


The two problems you show here are not a real problems in this framework:
1. making real device initialization during drm initialization - 
decision is left

to driver developer what should be done in probe, what should be done in
'bind', I guess this is also true for components, at least the framework 
allows it.
2. initialization order - if you put initialization into components 
'bind' function,

master can choose any order of calls to 'bind'.

Anyway you can implement the same behaviour as components with
interface_tracker. Just simple proof of concept, how to convert 
componentized

drivers to interface_tracker:
Components:
1. you can reuse component_ops
2. You replace calls of component_add and component_del with calls
to interface_tracker_ifup(dev, INTERFACE_TRACKER_TYPE_COMPONENT, 
specific_component_ops),

or interface_tracker_ifdown.
Thats all for components.

Master:
1. you register callback for tracking all components.
2. in the callback you check if all components are up, if yes you do the
same as in component framework initialization, to simplify it
helper function can be added.

I guess it should work the same way, if there is interest in it I can 
develop the

helper next week, I hope.

What is the benefit of interface_tracker:
1. interface_tracker is more generic - it can track not only components.
2. you put component initialization code into helper function - sounds 
like mid-layer removal,

developer can choose different helper if it suits better.

So from component point of view interface_tracker can be treated as kind 
of extensions

of the component framework.

I hope I have answerer all your concerns.

I have holidays till Sunday and I am not sure if I will be able to 
answer next emails before

Monday.

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


Re: [RFC PATCH 0/4] drivers/base: Generic framework for tracking internal interfaces

2014-05-01 Thread Russell King - ARM Linux
On Thu, May 01, 2014 at 09:04:19AM +0200, Andrzej Hajda wrote:
 2. You replace calls of component_add and component_del with calls
 to interface_tracker_ifup(dev, INTERFACE_TRACKER_TYPE_COMPONENT,  
 specific_component_ops),
 or interface_tracker_ifdown.
 Thats all for components.

How does the master get to decide which components are for it?  As
I see it, all masters see all components of a particular type.
What if you have a system with two masters each of which are bound
to a set of unique components but some of the components are of a
the same type?

How does the master know what type to use?

-- 
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH 0/4] drivers/base: Generic framework for tracking internal interfaces

2014-04-30 Thread Greg Kroah-Hartman
On Wed, Apr 30, 2014 at 04:02:50PM +0200, Andrzej Hajda wrote:
 Generic framework for tracking internal interfaces
 ==
 
 Summary
 ---
 
 interface_tracker is a generic framework which allows to track appearance
 and disappearance of different interfaces provided by kernel/driver code 
 inside
 the kernel. Examples of such interfaces: clocks, phys, regulators, 
 drm_panel...
 Interface is specified by a pair of object pointer and interface type. Object
 type depends on interface type, for example interface type drm_panel 
 determines
 that object is a device_node. Object pointer is used to distinguish different
 interfaces of the same type and should identify object the interface is bound 
 to.
 For example it could be DT node, struct device,...
 
 The framework provides two functions for interface providers which should be
 called just after interface becomes available or just before interface
 removal. Interface consumers can register callback which will be called
 when requested interface changes its state, if during callback registration
 the interface is already up, notification will be sent also.
 
 The framework allows nesting calls, for example it is possible to signal one
 interface in tracker callback of another interface. It is done by putting
 every request into the queue. If the queue is empty before adding
 the request, the queue will be processed after, if there is already another
 request in the queue it means the queue is already processed by different
 thread so no additional action is required. With this pattern only spinlock
 is necessary to protect the queue. However in case of removal of either
 callback or interface caller should be sure that his request has been
 processed so framework waits until the queue becomes empty, it is done using
 completion mechanism.
 
 The framework functions should not be called in atomic context. Callbacks
 should be aware that they can be called in any time between registration and
 de-registration, so they should use synchronization mechanisms carefully.
 Callbacks should also avoid to perform time consuming tasks, the framework
 serializes them, so it could stall other callbacks.
 
 Use cases
 -
 
 The interface is very generic, there are many situations it can be useful:
 
 1. Replacement for subsystem specific methods of publishing/unpublishing
 interfaces. Currently many frameworks allows only querying for presence of 
 given
 interface. In such cases client can defer probing or implement interface
 polling, which is usually subobtimal. Additionally subsystems often do not
 provide methods to signal to the consumers that they are about to be 
 destroyed.
 
 2. Monitoring for different interfaces provided by the same object. An example
 should explain it better. Lets assume in device tree drm crtc device node have
 video link to another node, so it knows only that there is something connected
 to its RGB output. It can be a RGB panel (drm_panel framework), it can be an
 image enhancer (SoC specific framework) or it can be some signal converter
 (drm_encoder, drm_bridge, drm_encoder_slave...). Driver have only phandle to
 another node. Currently it is difficult to handle such situations in a generic
 way. interface_tracker should make it simple: crtc should monitor all 
 supported
 interface types that appears at the device_node pointed by the phandle.
 
 Potential use cases
 ---
 
 Points mentioned above were the reasons for writing this framework. During
 development I have realized that this framework can be also useful for other
 tasks.
 
 3. Replacement for deferred probing - if for some reason driver do not wants 
 to
 defer but it requires given resources it can use interface_tracker. It should 
 be
 possible to create an helper which will wait for appearance of all interfaces
 from a given list, and 'continue' probe only when all resources becomes
 available.
 
 4. Replacement or helper for subsystem specific solutions:
 - V4L2 subdev async registration,
 - component framework.
 Both frameworks solves a problem of tracking sub-components (un-)registration
 by master device, it should be possible to do the same with interface_tracker
 framework. Some additional helpers can be convienent to make the 
 implementation
 easier.
 
 5. Cure the situation with sysfs 'unbind' property. Currently many drivers are
 providers of different resources/interfaces: regulators, clocks, phys,
 V4L2 subdevs, ... They are usually protected from module unloading by getting
 module reference, but there is no protection from driver unbinding using sysfs
 method: echo 'device' /sys/bus/.../drivers/.../unbind. After unbind consumer
 stays with the pointer to non-existing object, next time it tries to use it
 system usually crashes. interface_tracker do not add any protection, but it 
 adds
 a way to signal to the consumer that given resource will disappear. It allows
 to handle such 

Re: [RFC PATCH 0/4] drivers/base: Generic framework for tracking internal interfaces

2014-04-30 Thread Andrzej Hajda

Hi Greg,

Thanks for comments. I CC Laurent, I hope it could be interesting for 
him also.


Greg Kroah-Hartman wrote, On 30.04.2014 17:49:

On Wed, Apr 30, 2014 at 04:02:50PM +0200, Andrzej Hajda wrote:

Generic framework for tracking internal interfaces
==

Summary
---

interface_tracker is a generic framework which allows to track appearance
and disappearance of different interfaces provided by kernel/driver code inside
the kernel. Examples of such interfaces: clocks, phys, regulators, drm_panel...
Interface is specified by a pair of object pointer and interface type. Object
type depends on interface type, for example interface type drm_panel determines
that object is a device_node. Object pointer is used to distinguish different
interfaces of the same type and should identify object the interface is bound 
to.
For example it could be DT node, struct device,...

The framework provides two functions for interface providers which should be
called just after interface becomes available or just before interface
removal. Interface consumers can register callback which will be called
when requested interface changes its state, if during callback registration
the interface is already up, notification will be sent also.

The framework allows nesting calls, for example it is possible to signal one
interface in tracker callback of another interface. It is done by putting
every request into the queue. If the queue is empty before adding
the request, the queue will be processed after, if there is already another
request in the queue it means the queue is already processed by different
thread so no additional action is required. With this pattern only spinlock
is necessary to protect the queue. However in case of removal of either
callback or interface caller should be sure that his request has been
processed so framework waits until the queue becomes empty, it is done using
completion mechanism.

The framework functions should not be called in atomic context. Callbacks
should be aware that they can be called in any time between registration and
de-registration, so they should use synchronization mechanisms carefully.
Callbacks should also avoid to perform time consuming tasks, the framework
serializes them, so it could stall other callbacks.

Use cases
-

The interface is very generic, there are many situations it can be useful:

1. Replacement for subsystem specific methods of publishing/unpublishing
interfaces. Currently many frameworks allows only querying for presence of given
interface. In such cases client can defer probing or implement interface
polling, which is usually subobtimal. Additionally subsystems often do not
provide methods to signal to the consumers that they are about to be destroyed.

2. Monitoring for different interfaces provided by the same object. An example
should explain it better. Lets assume in device tree drm crtc device node have
video link to another node, so it knows only that there is something connected
to its RGB output. It can be a RGB panel (drm_panel framework), it can be an
image enhancer (SoC specific framework) or it can be some signal converter
(drm_encoder, drm_bridge, drm_encoder_slave...). Driver have only phandle to
another node. Currently it is difficult to handle such situations in a generic
way. interface_tracker should make it simple: crtc should monitor all supported
interface types that appears at the device_node pointed by the phandle.

Potential use cases
---

Points mentioned above were the reasons for writing this framework. During
development I have realized that this framework can be also useful for other
tasks.

3. Replacement for deferred probing - if for some reason driver do not wants to
defer but it requires given resources it can use interface_tracker. It should be
possible to create an helper which will wait for appearance of all interfaces
from a given list, and 'continue' probe only when all resources becomes
available.

4. Replacement or helper for subsystem specific solutions:
- V4L2 subdev async registration,
- component framework.
Both frameworks solves a problem of tracking sub-components (un-)registration
by master device, it should be possible to do the same with interface_tracker
framework. Some additional helpers can be convienent to make the implementation
easier.

5. Cure the situation with sysfs 'unbind' property. Currently many drivers are
providers of different resources/interfaces: regulators, clocks, phys,
V4L2 subdevs, ... They are usually protected from module unloading by getting
module reference, but there is no protection from driver unbinding using sysfs
method: echo 'device' /sys/bus/.../drivers/.../unbind. After unbind consumer
stays with the pointer to non-existing object, next time it tries to use it
system usually crashes. interface_tracker do not add any protection, but it adds
a way to signal to the consumer that given resource will disappear. 

Re: [RFC PATCH 0/4] drivers/base: Generic framework for tracking internal interfaces

2014-04-30 Thread Russell King - ARM Linux
On Wed, Apr 30, 2014 at 11:42:09PM +0200, Andrzej Hajda wrote:
 The main problem with component framework is that componentization  
 significantly changes every driver and changes it in a way which is not  
 compatible with traditional drivers, so devices which are intended to  
 work with different DRM masters are hard to componentize if some of DRMs  
 are componentized and some not.

Many of the problems which the component helpers are designed to solve
are those where you need the drm_device structure (or snd_card, or whatever
subsystem specific card/device representation structure) pre-created in
order to initialise the components.

In the case of DRM, you can't initialise encoders or connectors without
their drm_device structure pre-existing - because these components are
attached to the drm_device.

Your solution to that is to delay those calls, but the DRM subsystem is
not designed to cope like that - it's designed such that when the
connector or encoder initialisation functions are called, it is assumed
that the driver is initialising its state. (I've raised this point before
but you've just fobbed it off in the past.)

Another issue here is that the order of initialisation matters greatly.
Take CRTCs for example.  In DRM, the order of attachment of CRTCs defines
their identity, changing the order changes their identity, and changes
how they are bound to their respective connectors.

-- 
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html