[PATCH v2 18/27] coresight: catu: Add support for scatter gather tables

Mathieu Poirier mathieu.poirier at linaro.org
Tue May 8 09:13:54 PDT 2018


On 8 May 2018 at 09:56, Suzuki K Poulose <Suzuki.Poulose at arm.com> wrote:
> On 07/05/18 21:25, Mathieu Poirier wrote:
>>
>> On Tue, May 01, 2018 at 10:10:48AM +0100, Suzuki K Poulose wrote:
>>>
>>> This patch adds the support for setting up a SG table for use
>>> by the CATU. We reuse the tmc_sg_table to represent the table/data
>>> pages, even though the table format is different.
>>>
>
> ...
>
>>>
>>> diff --git a/drivers/hwtracing/coresight/coresight-catu.c
>>> b/drivers/hwtracing/coresight/coresight-catu.c
>>> index 2cd69a6..4cc2928 100644
>>> --- a/drivers/hwtracing/coresight/coresight-catu.c
>>> +++ b/drivers/hwtracing/coresight/coresight-catu.c
>>> @@ -16,10 +16,419 @@
>
>
> ...
>
>>> +
>>> +/*
>>> + * Update the valid bit for a given range of indices [start, end)
>>> + * in the given table @table.
>>> + */
>>> +static inline void catu_update_state_range(cate_t *table, int start,
>>> +                                                int end, int valid)
>>
>>
>> Indentation
>>
>
> ...
>
>>> +#ifdef CATU_DEBUG
>>> +static void catu_dump_table(struct tmc_sg_table *catu_table)
>>> +{
>>> +       int i;
>>> +       cate_t *table;
>>> +       unsigned long table_end, buf_size, offset = 0;
>>> +
>>> +       buf_size = tmc_sg_table_buf_size(catu_table);
>>> +       dev_dbg(catu_table->dev,
>>> +               "Dump table %p, tdaddr: %llx\n",
>>> +               catu_table, catu_table->table_daddr);
>>> +
>>> +       while (offset < buf_size) {
>>> +               table_end = offset + SZ_1M < buf_size ?
>>> +                           offset + SZ_1M : buf_size;
>>> +               table = catu_get_table(catu_table, offset, NULL);
>>> +               for (i = 0; offset < table_end; i++, offset +=
>>> CATU_PAGE_SIZE)
>>> +                       dev_dbg(catu_table->dev, "%d: %llx\n", i,
>>> table[i]);
>>> +               dev_dbg(catu_table->dev, "Prev : %llx, Next: %llx\n",
>>> +                       table[CATU_LINK_PREV], table[CATU_LINK_NEXT]);
>>> +               dev_dbg(catu_table->dev, "== End of sub-table ===");
>>> +       }
>>> +       dev_dbg(catu_table->dev, "== End of Table ===");
>>> +}
>>> +
>>> +#else
>>> +static inline void catu_dump_table(struct tmc_sg_table *catu_table)
>>> +{
>>> +}
>>> +#endif
>>
>>
>> I think this approach is better than peppering the code with #ifdefs as it
>> was
>> done for ETR.  Please fix that to replicate what you've done here.
>>
>
> OK
>
>>> +
>>> +/*
>>> + * catu_populate_table : Populate the given CATU table.
>>> + * The table is always populated as a circular table.
>>> + * i.e, the "prev" link of the "first" table points to the "last"
>>> + * table and the "next" link of the "last" table points to the
>>> + * "first" table. The buffer should be made linear by calling
>>> + * catu_set_table().
>>> + */
>>> +static void
>>> +catu_populate_table(struct tmc_sg_table *catu_table)
>>> +{
>
>
> ...
>
>>> +       while (offset < buf_size) {
>>> +               /*
>>> +                * The @offset is always 1M aligned here and we have an
>>> +                * empty table @table_ptr to fill. Each table can address
>>> +                * upto 1MB data buffer. The last table may have fewer
>>> +                * entries if the buffer size is not aligned.
>>> +                */
>>> +               last_offset = (offset + SZ_1M) < buf_size ?
>>> +                             (offset + SZ_1M) : buf_size;
>>> +               for (i = 0; offset < last_offset; i++) {
>>> +
>>> +                       data_daddr = catu_table->data_pages.daddrs[dpidx]
>>> +
>>> +                                    s_dpidx * CATU_PAGE_SIZE;
>>> +#ifdef CATU_DEBUG
>>> +                       dev_dbg(catu_table->dev,
>>> +                               "[table %5d:%03d] 0x%llx\n",
>>> +                               (offset >> 20), i, data_daddr);
>>> +#endif
>>
>>
>> I'm not a fan of adding #ifdefs in the code like this.  I think it is
>> better to
>> have a wrapper (that resolves to nothing if CATU_DEBUG is not defined) and
>> handle the output in there.
>>
>
>
>>> +
>>> +       catu_populate_table(catu_table);
>>> +       /* Make the buf linear from offset 0 */
>>> +       (void)catu_set_table(catu_table, 0, size);
>>> +
>>> +       dev_dbg(catu_dev,
>>> +               "Setup table %p, size %ldKB, %d table pages\n",
>>> +               catu_table, (unsigned long)size >> 10,  nr_tpages);
>>
>>
>> I think this should also be wrapped in a special output debug function.
>>
>
> I could do something like :
>
> #ifdef CATU_DEBUG
> #define catu_dbg(fmt, ...)      dev_dbg(fmt, __VA_ARGS__)
> #else
> #define catu_dbg(fmt, ...)      do { } while (0)
> #endif
>
> And use catu_dbg() for the sprinkled prints.

Yes, that is exactly what I had in mind.

>
> Cheers
> Suzuki



More information about the linux-arm-kernel mailing list