I tried to fix the magic numbers used by ALL mx31 boards (except one CS in 
qong.c)
by using some macros. I stayed away from bitfields as it would have resulted
in a very verbose change (something like the setup of CS 3 in qong.c).

To verify the code I used this helper:

-------------- cut -----------
#include <stdio.h>

typedef unsigned int uint;

/* 13 fields of the upper CS control register */
#define CSCR_U(sp, wp, bcd, bcs, psz, pme, sync, dol, \
                cnc, wsc, ew, wws, edc) \
                ((sp) << 31 | (wp) << 30 | (bcd) << 28 | (psz) << 22 | (pme) << 
21 |\
                 (sync) << 20 | (dol) << 16 | (cnc) << 14 | (wsc) << 8 | (ew) 
<< 7 |\
                 (wws) << 4 | (edc) << 0)
/* 12 fields of the lower CS control register */
#define CSCR_L(oea, oen, ebwa, ebwn, \
                csa, ebc, dsz, csn, psr, cre, wrap, csen) \
                ((oea) << 28 | (oen) << 24 | (ebwa) << 20 | (ebwn) << 16 |\
                 (csa) << 12 | (ebc) << 11 | (dsz) << 8 | (csn) << 4 |\
                 (psr) << 3 | (cre) << 2 | (wrap) << 1 | (csen) << 0)
/* 14 fields of the additional CS control register */
#define CSCR_A(ebra, ebrn, rwa, rwn, mum, lah, lbn, lba, dww, dct, \
                wwu, age, cnc2, fce) \
                ((ebra) << 28 | (ebrn) << 24 | (rwa) << 20 | (rwn) << 16 |\
                 (mum) << 15 | (lah) << 13 | (lbn) << 10 | (lba) << 8 |\
                 (dww) << 6 | (dct) << 4 | (wwu) << 3 |\
                 (age) << 2 | (cnc2) << 1 | (fce) << 0)

void decode(unsigned int u, unsigned int l, unsigned int a)
{
        /* 13 fields of the upper CS control register */
        uint sp = (u >> 31) & 1;
        uint wp = (u >> 30) & 1;
        uint bcd = (u >> 28) & 1;
        uint bcs = (u >> 24) & 15;
        uint psz = (u >> 22) & 3;
        uint pme = (u >> 21) & 1;
        uint sync = (u >> 20) & 1;
        uint dol = (u >> 16) & 15;
        uint cnc = (u >> 14) & 3;
        uint wsc = (u >> 8) & 31;
        uint ew = (u >> 7) & 1;
        uint wws = (u >> 4) & 7;
        uint edc = (u >> 0) & 15;

        /* 12 fields of the lower CS control register */
        uint oea = (l >> 28) & 15;
        uint oen = (l >> 24) & 15;
        uint ebwa = (l >> 20) & 15;
        uint ebwn = (l >> 16) & 15;
        uint csa = (l >> 12) & 15;
        uint ebc = (l >> 11) & 1;
        uint dsz = (l >> 8) & 7;
        uint csn = (l >> 4) & 15;
        uint psr = (l >> 3) & 1;
        uint cre = (l >> 2) & 1;
        uint wrap = (l >> 1) & 1;
        uint csen = (l >> 0) & 1;

        /* 14 fields of the additional CS control register */
        uint ebra = (a >> 28) & 15;
        uint ebrn = (a >> 24) & 15;
        uint rwa = (a >> 20) & 15;
        uint rwn = (a >> 16) & 15;
        uint mum = (a >> 15) & 1;
        uint lah = (a >> 13) & 3;
        uint lbn = (a >> 10) & 7;
        uint lba = (a >> 8) & 3;
        uint dww = (a >> 6) & 3;
        uint dct = (a >> 4) & 3;
        uint wwu = (a >> 3) & 1;
        uint age = (a >> 2) & 1;
        uint cnc2 = (a >> 1) & 1;
        uint fce = (a >> 0) & 1;

        printf("---- decode(0x%08x, 0x%08x, 0x%08x):\n", u, l, a);

        printf("/*     sp wp bcd bcs psz pme sync dol cnc wsc ew wws edc */\n");
        printf("CSCR_U(%2u,%2u,%3u,%3u,%3u,%3u,%4u,%3u,%3u,%3u,%2u,%3u,%3u)\n",
                sp, wp, bcd, bcs, psz, pme, sync, dol, cnc, wsc, ew, wws, edc);
        if(CSCR_U(sp, wp, bcd, bcs, psz, pme, sync, dol, cnc, wsc, ew, wws, 
edc) != u)
                printf("U is wrong\n");

        printf("/*     oea oen ebwa ebwn csa ebc dsz csn psr cre wrap csen 
*/\n");
        printf("CSCR_L(%3u,%3u,%4u,%4u,%3u,%3u,%3u,%3u,%3u,%3u,%4u,%4u)\n",
                oea, oen, ebwa, ebwn, csa, ebc, dsz, csn, psr, cre, wrap, csen);
        if(CSCR_L(oea, oen, ebwa, ebwn, csa, ebc, dsz, csn, psr, cre, wrap, 
csen) != l)
                printf("L is wrong\n");

        printf("/*   ebra ebrn rwa rwn mum lah lbn lba dww dct wwu age cnc2 fce 
*/\n");
        
printf("CSCR_A(%2u,%4u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%4u,%3u)\n",
                ebra, ebrn, rwa, rwn, mum, lah, lbn, lba, dww, dct, wwu, age, 
cnc2, fce);
        if(CSCR_A(ebra, ebrn, rwa, rwn, mum, lah, lbn, lba, dww, dct, wwu, age, 
cnc2, fce) != a)
                printf("A is wrong\n");
}

int main(void)
{
        printf("qong: CS1 "); decode(0x00000A01, 0x20040501, 0x04020C00);
        printf("qong: CS3 "); decode(0x00004f00, 0x20013b31, 0x00020800);
        printf("tt01: CS4 "); decode(0x0000dcf6, 0x444A4541, 0x44443302);
        printf("pdk: CS5 ");  decode(0x0000d843, 0x22252521, 0x22220a00);
        printf("ads: CS0 "); decode(0x00000f00, 0x10000D03, 0x00720900);
        printf("phycore: CS0 "); decode(0x0000cf03, 0x10000d03, 0x00720900);
        printf("phycore: CS1 "); decode(0x0000df06, 0x444a4541, 0x44443302);
        printf("phycore: CS4 "); decode(0x0000d843, 0x22252521, 0x22220a00);

        printf("litekit: CS0 "); decode(0x0000cf03, 0xa0330d01, 0x00220800);
        printf("litekit: CS4 "); decode(0x0000dcf6, 0x444a4541, 0x44443302);
}
-------------------- cut --------------------




--
Scanned by MailScanner.

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to