Thread (16 messages) flat view 16 messages, 5 authors, 2007-06-15

Re: 83xx GPIO/EXT int in arch/powerpc/

From: Kumar Gala <hidden>
Date: 2007-06-14 21:10:45

On Jun 12, 2007, at 11:06 AM, Marc Leeman wrote:
quoted
I'm confused what you are comparing here, 3 seconds on arch=ppc vs
over a minute on arch=powerpc?
Loading of a TI DSP over HPI. HPI is implemented in UPMB  
(programmed by
U-Boot); all that the kernel has to do is write to the in U-Boot
programmed location (0xe2400000) to trigger the UPMB HPI protocol.
quoted
I'd expect the driver to be exactly the same (or close to it) for
arch=ppc vs arch=powerpc.
Same here: there are a number of performance issues wrt to an older  
8245
based implementation (network seems slower too) and this was not one I
expected while switching to powerpc.
Are you comparing 8245 on arch=ppc to 83xx on arch=powerpc or 83xx in  
both cases?
quoted
There shouldn't be, but if you are seeing this we really should
figure out what's going on.

What kernel is this on?  What processor are you using?
$ cat /proc/cpuinfo
processor       : 0
cpu             : e300c1
clock           : 396.000000MHz
revision        : 1.1 (pvr 8083 0011)
bogomips        : 131.28
timebase        : 66000000
platform        : BARCO834x SVC2
Hmm, we really need to put SVR in there as well (add that to the todo  
list).  Which 83xx is this?
$ uname -a
Linux barco 2.6.21.1-barco1 #1 PREEMPT Tue Jun 12 09:48:12 CEST  
2007 ppc unknown

The board is based on the FreeScale SYS/EMDS reference design.

Most of the HPI operations are stuff like this:

static inline int8_t _hpi_set_hhwil(uint8_t b)
{
        volatile immap_t* im;

        if(!(im = ioremap((immrbar),sizeof(struct immap)))){
                return -EINVAL;
        }
        (b)?(im->gpio[0].dat |= HHWIL):(im->gpio[0].dat &= ~HHWIL);
        iounmap(im);

        return 0;
}

static inline uint32_t __hpi_read_hpid(void)
{
        uint32_t returnval;

        /* Program HPID */
        _hpi_set_hcntl1(1);
        _hpi_set_hcntl0(1);

        /* first halfword */
        _hpi_set_hhwil(0);
        /* dummy read */
        returnval = (((uint32_t)(*hpi_dsp))<<16);

        /* delay */
        udelay(1);

        /* second halfword */
        _hpi_set_hhwil(1);
        /* dummy read */
        returnval |= *hpi_dsp;

        /* delay */
        udelay(1);

        return returnval;
}

The ioremap was certainly a bottleneck; and moving it to  
initialisation
with a global pointer got us from 60 secs back to around 1 sec, but  
the
a similar effect was obtained on the ppc arch with this change  
(this was
just making a bad situation to be hidden).
Do you sense of how many calls you make to _hpi_set_hhwil &  
__hpi_read_hpid?

I think I know why the ppc case was more efficient.
Even after this change; the load of a streaming application was
something of 40% on ppc and 60% on powerpc.
What's going on during the streaming?

- k
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help