Message ID | E1WzWOy-0007zc-36@rmk-PC.arm.linux.org.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Russell, On Tue, Jun 24, 2014 at 9:29 PM, Russell King <rmk+kernel@arm.linux.org.uk> wrote: [...] > +/* > + * Add a component to be matched. > + * > + * The match array is first created or extended if necessary. > + */ > +void component_match_add(struct device *dev, struct component_match **matchptr, > + int (*compare)(struct device *, void *), void *compare_data) > +{ > + struct component_match *match = *matchptr; > + > + if (IS_ERR(match)) > + return; > + > + if (!match || match->num == match->alloc) { > + size_t new_size = match ? match->alloc + 16 : 15; > + > + match = component_match_realloc(dev, match, new_size); > + > + *matchptr = match; > + > + if (IS_ERR(match)) > + return; > + } > + > + match->compare[match->num].fn = compare; > + match->compare[match->num].data = compare_data; > + match->num++; > +} component_match_add should be exported. regards Philipp
On Thu, Jun 26, 2014 at 02:34:17PM +0200, Philipp Zabel wrote: > Hi Russell, > > On Tue, Jun 24, 2014 at 9:29 PM, Russell King > <rmk+kernel@arm.linux.org.uk> wrote: > [...] > > +/* > > + * Add a component to be matched. > > + * > > + * The match array is first created or extended if necessary. > > + */ > > +void component_match_add(struct device *dev, struct component_match **matchptr, > > + int (*compare)(struct device *, void *), void *compare_data) > > +{ > > + struct component_match *match = *matchptr; > > + > > + if (IS_ERR(match)) > > + return; > > + > > + if (!match || match->num == match->alloc) { > > + size_t new_size = match ? match->alloc + 16 : 15; > > + > > + match = component_match_realloc(dev, match, new_size); > > + > > + *matchptr = match; > > + > > + if (IS_ERR(match)) > > + return; > > + } > > + > > + match->compare[match->num].fn = compare; > > + match->compare[match->num].data = compare_data; > > + match->num++; > > +} > > component_match_add should be exported. Fixed, thanks.
On Thu, Jun 26, 2014 at 03:46:01PM +0100, Russell King - ARM Linux wrote: > On Thu, Jun 26, 2014 at 02:34:17PM +0200, Philipp Zabel wrote: > > Hi Russell, > > > > On Tue, Jun 24, 2014 at 9:29 PM, Russell King > > <rmk+kernel@arm.linux.org.uk> wrote: > > [...] > > > +/* > > > + * Add a component to be matched. > > > + * > > > + * The match array is first created or extended if necessary. > > > + */ > > > +void component_match_add(struct device *dev, struct component_match **matchptr, > > > + int (*compare)(struct device *, void *), void *compare_data) > > > +{ > > > + struct component_match *match = *matchptr; > > > + > > > + if (IS_ERR(match)) > > > + return; > > > + > > > + if (!match || match->num == match->alloc) { > > > + size_t new_size = match ? match->alloc + 16 : 15; > > > + > > > + match = component_match_realloc(dev, match, new_size); > > > + > > > + *matchptr = match; > > > + > > > + if (IS_ERR(match)) > > > + return; > > > + } > > > + > > > + match->compare[match->num].fn = compare; > > > + match->compare[match->num].data = compare_data; > > > + match->num++; > > > +} > > > > component_match_add should be exported. > > Fixed, thanks. As there's no further comments, and Inki Dae has not responded, I'm going to send these out without the RFC tag in the hope that people will provide acks. This allows us to move forward with this despite the Exynos DRM blockage. The ultimate plan is for patches 1 to 3 inclusive to be merged into Greg's driver tree, 1 to 3 and 5 into Greg's staging tree, and 1 to 3 and 4 for David Airlie's DRM tree - patches 1 to 3 are needed for both patches 4 and 5.
2014-07-01 23:22 GMT+09:00 Russell King - ARM Linux <linux@arm.linux.org.uk>: > On Thu, Jun 26, 2014 at 03:46:01PM +0100, Russell King - ARM Linux wrote: >> On Thu, Jun 26, 2014 at 02:34:17PM +0200, Philipp Zabel wrote: >> > Hi Russell, >> > >> > On Tue, Jun 24, 2014 at 9:29 PM, Russell King >> > <rmk+kernel@arm.linux.org.uk> wrote: >> > [...] >> > > +/* >> > > + * Add a component to be matched. >> > > + * >> > > + * The match array is first created or extended if necessary. >> > > + */ >> > > +void component_match_add(struct device *dev, struct component_match **matchptr, >> > > + int (*compare)(struct device *, void *), void *compare_data) >> > > +{ >> > > + struct component_match *match = *matchptr; >> > > + >> > > + if (IS_ERR(match)) >> > > + return; >> > > + >> > > + if (!match || match->num == match->alloc) { >> > > + size_t new_size = match ? match->alloc + 16 : 15; >> > > + >> > > + match = component_match_realloc(dev, match, new_size); >> > > + >> > > + *matchptr = match; >> > > + >> > > + if (IS_ERR(match)) >> > > + return; >> > > + } >> > > + >> > > + match->compare[match->num].fn = compare; >> > > + match->compare[match->num].data = compare_data; >> > > + match->num++; >> > > +} >> > >> > component_match_add should be exported. >> >> Fixed, thanks. > > As there's no further comments, and Inki Dae has not responded, I'm It's has been just a week. I will check and look into your patch series. I think Exynos drm should also be considered for the use of component match array. Thanks, Inki Dae > going to send these out without the RFC tag in the hope that people > will provide acks. This allows us to move forward with this despite > the Exynos DRM blockage. > > The ultimate plan is for patches 1 to 3 inclusive to be merged into > Greg's driver tree, 1 to 3 and 5 into Greg's staging tree, and 1 to > 3 and 4 for David Airlie's DRM tree - patches 1 to 3 are needed for > both patches 4 and 5. > > -- > FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly > improving, and getting towards what was expected from it. > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
On Thu, Jul 03, 2014 at 12:26:39AM +0900, Inki Dae wrote: > It's has been just a week. I will check and look into your patch > series. I think Exynos drm should also be considered for the use of > component match array. Actually, this series has been around for much longer than just a week. Your new usage introduced in the recent merge window is what has resulted in you becoming aware of this series. It was developed before April through discussions, and then shared with those people. Then, April 27th, it was posted publically to all the recipients except yourself (because Exynos hadn't visibly been converted). At that time, two reviewed-by tags were given. It was also sent out last week, with yourself added to the recepient list because there is now a dependency with some of your work. However, what I'm asking for is *not* the entire series to be merged at this point - that would break Exynos DRM. I'm asking for the first three to be merged initially by Greg, which gets the new interface in place without breaking existing users. We can then convert existing users at a slower rate, and remove the old interface once everyone has caught up. So, I'd ask that you give priority to looking at the first three patches and deciding whether you find them acceptable as a replacement interface, rather than trying to review the entire set of six core patches (1,2,3,6,7,8). What I'm trying to avoid here is for all these patches to be delayed past the next merge window, and pushed into the next cycle. That's likely to end up in the same scenario as exists with Exynos DRM today, only with other new users of the existing interface - and then have to repeat this whole "try to get the new users to review this set of changes" cycle again. We're half way through -rc3 right now. -final occurs anytime between -rc6 and -rc9, which could be just three and a half weeks away. I have other changes which I need to get out onto the list(s) which depend on this too (for DRM) which I'm hoping to also make this coming merge window, but I can't start that process until I know where I stand with these.
On Thu, Jul 03, 2014 at 12:26:39AM +0900, Inki Dae wrote: > 2014-07-01 23:22 GMT+09:00 Russell King - ARM Linux <linux@arm.linux.org.uk>: > > On Thu, Jun 26, 2014 at 03:46:01PM +0100, Russell King - ARM Linux wrote: > >> On Thu, Jun 26, 2014 at 02:34:17PM +0200, Philipp Zabel wrote: > >> > Hi Russell, > >> > > >> > On Tue, Jun 24, 2014 at 9:29 PM, Russell King > >> > <rmk+kernel@arm.linux.org.uk> wrote: > >> > [...] > >> > > +/* > >> > > + * Add a component to be matched. > >> > > + * > >> > > + * The match array is first created or extended if necessary. > >> > > + */ > >> > > +void component_match_add(struct device *dev, struct component_match **matchptr, > >> > > + int (*compare)(struct device *, void *), void *compare_data) > >> > > +{ > >> > > + struct component_match *match = *matchptr; > >> > > + > >> > > + if (IS_ERR(match)) > >> > > + return; > >> > > + > >> > > + if (!match || match->num == match->alloc) { > >> > > + size_t new_size = match ? match->alloc + 16 : 15; > >> > > + > >> > > + match = component_match_realloc(dev, match, new_size); > >> > > + > >> > > + *matchptr = match; > >> > > + > >> > > + if (IS_ERR(match)) > >> > > + return; > >> > > + } > >> > > + > >> > > + match->compare[match->num].fn = compare; > >> > > + match->compare[match->num].data = compare_data; > >> > > + match->num++; > >> > > +} > >> > > >> > component_match_add should be exported. > >> > >> Fixed, thanks. > > > > As there's no further comments, and Inki Dae has not responded, I'm > > It's has been just a week. I will check and look into your patch > series. I think Exynos drm should also be considered for the use of > component match array. It has now been almost two months. What's happening on this? Please note that I'm planning to push the rest of the component updates during the next merge window, which will result in unconverted drivers breaking. Thanks.
On 2014? 08? 31? 06:33, Russell King - ARM Linux wrote: > On Thu, Jul 03, 2014 at 12:26:39AM +0900, Inki Dae wrote: >> 2014-07-01 23:22 GMT+09:00 Russell King - ARM Linux <linux@arm.linux.org.uk>: >>> On Thu, Jun 26, 2014 at 03:46:01PM +0100, Russell King - ARM Linux wrote: >>>> On Thu, Jun 26, 2014 at 02:34:17PM +0200, Philipp Zabel wrote: >>>>> Hi Russell, >>>>> >>>>> On Tue, Jun 24, 2014 at 9:29 PM, Russell King >>>>> <rmk+kernel@arm.linux.org.uk> wrote: >>>>> [...] >>>>>> +/* >>>>>> + * Add a component to be matched. >>>>>> + * >>>>>> + * The match array is first created or extended if necessary. >>>>>> + */ >>>>>> +void component_match_add(struct device *dev, struct component_match **matchptr, >>>>>> + int (*compare)(struct device *, void *), void *compare_data) >>>>>> +{ >>>>>> + struct component_match *match = *matchptr; >>>>>> + >>>>>> + if (IS_ERR(match)) >>>>>> + return; >>>>>> + >>>>>> + if (!match || match->num == match->alloc) { >>>>>> + size_t new_size = match ? match->alloc + 16 : 15; >>>>>> + >>>>>> + match = component_match_realloc(dev, match, new_size); >>>>>> + >>>>>> + *matchptr = match; >>>>>> + >>>>>> + if (IS_ERR(match)) >>>>>> + return; >>>>>> + } >>>>>> + >>>>>> + match->compare[match->num].fn = compare; >>>>>> + match->compare[match->num].data = compare_data; >>>>>> + match->num++; >>>>>> +} >>>>> >>>>> component_match_add should be exported. >>>> >>>> Fixed, thanks. >>> >>> As there's no further comments, and Inki Dae has not responded, I'm >> >> It's has been just a week. I will check and look into your patch >> series. I think Exynos drm should also be considered for the use of >> component match array. > > It has now been almost two months. What's happening on this? > > Please note that I'm planning to push the rest of the component updates > during the next merge window, which will result in unconverted drivers > breaking. > Sorry for this. I was busy with other works. I will update and post it until this week. Thanks, Inki Dae > Thanks. >
diff --git a/drivers/base/component.c b/drivers/base/component.c index 55813e91bf0d..bd8b4908593b 100644 --- a/drivers/base/component.c +++ b/drivers/base/component.c @@ -18,6 +18,15 @@ #include <linux/mutex.h> #include <linux/slab.h> +struct component_match { + size_t alloc; + size_t num; + struct { + void *data; + int (*fn)(struct device *, void *); + } compare[0]; +}; + struct master { struct list_head node; struct list_head components; @@ -25,6 +34,7 @@ struct master { const struct component_master_ops *ops; struct device *dev; + struct component_match *match; }; struct component { @@ -96,6 +106,34 @@ int component_master_add_child(struct master *master, } EXPORT_SYMBOL_GPL(component_master_add_child); +static int find_components(struct master *master) +{ + struct component_match *match = master->match; + size_t i; + int ret = 0; + + if (!match) { + /* + * Search the list of components, looking for components that + * belong to this master, and attach them to the master. + */ + return master->ops->add_components(master->dev, master); + } + + /* + * Scan the array of match functions and attach + * any components which are found to this master. + */ + for (i = 0; i < match->num; i++) { + ret = component_master_add_child(master, + match->compare[i].fn, + match->compare[i].data); + if (ret) + break; + } + return ret; +} + /* Detach all attached components from this master */ static void master_remove_components(struct master *master) { @@ -128,7 +166,7 @@ static int try_to_bring_up_master(struct master *master, * Search the list of components, looking for components that * belong to this master, and attach them to the master. */ - if (master->ops->add_components(master->dev, master)) { + if (find_components(master)) { /* Failed to find all components */ ret = 0; goto out; @@ -186,18 +224,86 @@ static void take_down_master(struct master *master) master_remove_components(master); } -int component_master_add(struct device *dev, - const struct component_master_ops *ops) +static size_t component_match_size(size_t num) +{ + return offsetof(struct component_match, compare[num]); +} + +static struct component_match *component_match_realloc(struct device *dev, + struct component_match *match, size_t num) +{ + struct component_match *new; + + if (match && match->alloc == num) + return match; + + new = devm_kmalloc(dev, component_match_size(num), GFP_KERNEL); + if (!new) + return ERR_PTR(-ENOMEM); + + if (match) { + memcpy(new, match, component_match_size(min(match->num, num))); + devm_kfree(dev, match); + } else { + new->num = 0; + } + + new->alloc = num; + + return new; +} + +/* + * Add a component to be matched. + * + * The match array is first created or extended if necessary. + */ +void component_match_add(struct device *dev, struct component_match **matchptr, + int (*compare)(struct device *, void *), void *compare_data) +{ + struct component_match *match = *matchptr; + + if (IS_ERR(match)) + return; + + if (!match || match->num == match->alloc) { + size_t new_size = match ? match->alloc + 16 : 15; + + match = component_match_realloc(dev, match, new_size); + + *matchptr = match; + + if (IS_ERR(match)) + return; + } + + match->compare[match->num].fn = compare; + match->compare[match->num].data = compare_data; + match->num++; +} + +int component_master_add_with_match(struct device *dev, + const struct component_master_ops *ops, + struct component_match *match) { struct master *master; int ret; + if (ops->add_components && match) + return -EINVAL; + + /* Reallocate the match array for its true size */ + match = component_match_realloc(dev, match, match->num); + if (IS_ERR(match)) + return PTR_ERR(match); + master = kzalloc(sizeof(*master), GFP_KERNEL); if (!master) return -ENOMEM; master->dev = dev; master->ops = ops; + master->match = match; INIT_LIST_HEAD(&master->components); /* Add to the list of available masters. */ @@ -215,6 +321,13 @@ int component_master_add(struct device *dev, return ret < 0 ? ret : 0; } +EXPORT_SYMBOL_GPL(component_master_add_with_match); + +int component_master_add(struct device *dev, + const struct component_master_ops *ops) +{ + return component_master_add_with_match(dev, ops, NULL); +} EXPORT_SYMBOL_GPL(component_master_add); void component_master_del(struct device *dev, diff --git a/include/linux/component.h b/include/linux/component.h index 68870182ca1e..c00dcc302611 100644 --- a/include/linux/component.h +++ b/include/linux/component.h @@ -29,4 +29,11 @@ void component_master_del(struct device *, int component_master_add_child(struct master *master, int (*compare)(struct device *, void *), void *compare_data); +struct component_match; + +int component_master_add_with_match(struct device *, + const struct component_master_ops *, struct component_match *); +void component_match_add(struct device *, struct component_match **, + int (*compare)(struct device *, void *), void *compare_data); + #endif
Add support for generating a set of component matches at master probe time, and submitting them to the component layer. This allows the component layer to perform the matches internally without needing to call into the master driver, and allows for further restructuring of the component helper. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> --- drivers/base/component.c | 119 ++++++++++++++++++++++++++++++++++++++++++++-- include/linux/component.h | 7 +++ 2 files changed, 123 insertions(+), 3 deletions(-)