Ignore:
Timestamp:
Jun 10, 2014, 1:31:01 PM (10 years ago)
Author:
alain
Message:

ntroducing several modifs in the mapping_info data structure
to comply with the genmap tool.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_xml/xml_parser.c

    r306 r323  
    294294//
    295295// - For replicated peripherals the virtual base address must be:
    296 //   vbase = seg_type_base & 0XFF000000 + (cluster_xy * increment) & 0x00FF0000
     296//   vbase = seg_type_base & 0XFF000000 + (cluster_xy * 0x00010000) & 0x00FF0000
    297297//
    298298// - For non-replicated peripherals, the cluster index must be cluster_io.
     
    307307    unsigned int type;         // peripheral type
    308308
    309     unsigned int type_mask    = 0xFF000000;
    310     unsigned int cluster_mask = 0x00FF0000;
     309    unsigned int type_mask      = 0xFF000000;
     310    unsigned int cluster_mask   = 0x00FF0000;
     311    unsigned int vseg_increment = 0x00010000;
    311312
    312313#if XML_PARSER_DEBUG
     
    348349
    349350                        if( (vseg[vseg_id]->vbase & cluster_mask) !=
    350                             (header->increment * cluster_xy) )
     351                            (vseg_increment * cluster_xy) )
    351352                        {
    352353                            printf("[XML ERROR] All replicated peripherals "
     
    444445}
    445446
    446 ///////////////////////////////////////////////////////////////////////////////////
    447 int getVobjLocId(unsigned int vspace_id, char * vobj_name, unsigned int vspace_max)
     447////////////////////////////////////////////////////////////////////////////////
     448int getVobjId(unsigned int vspace_id, char * vobj_name, unsigned int vspace_max)
    448449{
    449450    unsigned int vobj_id;
     
    453454    for (vobj_id = vobj_min; vobj_id < vobj_max; vobj_id++)
    454455    {
    455         if (strcmp(vobj[vobj_id]->name, vobj_name) == 0) return (vobj_id - vobj_min);
     456        if (strcmp(vobj[vobj_id]->name, vobj_name) == 0) return vobj_id;
    456457    }
    457458    return -1;
     
    649650    if (ok)
    650651    {
    651         int index = getVobjLocId(vspace_index, str , vobj_loc_index);
     652        int index = getVobjId(vspace_index, str , vobj_loc_index);
    652653        if (index >= 0)
    653654        {
    654655#if XML_PARSER_DEBUG
    655656printf("      stackname = %s\n", str);
    656 printf("      stackid   = %d\n", index);
    657 #endif
    658             task[task_index]->stack_vobjid = index;
     657printf("      stack_id  = %d\n", index);
     658#endif
     659            task[task_index]->stack_vobj_id = index;
    659660        }
    660661        else
     
    676677    if (ok)
    677678    {
    678         int index = getVobjLocId(vspace_index, str, vobj_loc_index);
     679        int index = getVobjId(vspace_index, str, vobj_loc_index);
    679680        if (index >= 0)
    680681        {
    681682#if XML_PARSER_DEBUG
    682683printf("      heapname  = %s\n", str);
    683 printf("      heapid    = %d\n", index);
    684 #endif
    685             task[task_index]->heap_vobjid = index;
     684printf("      heap_id   = %d\n", index );
     685#endif
     686            task[task_index]->heap_vobj_id = index;
    686687        }
    687688        else
     
    694695    else
    695696    {
    696         task[task_index]->heap_vobjid = -1;
     697        task[task_index]->heap_vobj_id = -1;
    697698    }
    698699
     
    11291130    ////////// get startname attribute
    11301131    str = getStringValue(reader, "startname", &ok);
    1131     if (ok) {
     1132    if (ok)
     1133    {
    11321134        //used after parsing the vobjs
    11331135    }
     
    11621164
    11631165            // get index of the vobj containing the start vector
    1164             int index = getVobjLocId(vspace_index, str , vobj_loc_index);
     1166            int index = getVobjId(vspace_index, str , vobj_loc_index);
    11651167            if (index == -1)
    11661168            {
     
    11711173            else
    11721174            {
    1173                 vspace[vspace_index]->start_offset = index;
     1175                vspace[vspace_index]->start_vobj_id = index;
    11741176#if XML_PARSER_DEBUG
    11751177                printf("      startname = %s\n", str);
    1176                 printf("      startid   = %d\n", index);
     1178                printf("      start_id  = %d\n", index);
    11771179                printf("  end vspace %d\n\n", vspace_index);
    11781180#endif
    11791181            }
    11801182
    1181             // checking startid values for all tasks in vspace
     1183            // checking for all tasks that the startid
     1184            // is smaller than the number of tasks in vspace
    11821185            int task_id;
    11831186            int task_min = vspace[vspace_index]->task_offset;
    11841187            int task_max = task_min + vspace[vspace_index]->tasks;
    1185             for (task_id = task_min; task_id < task_max; task_id++) {
     1188            for (task_id = task_min; task_id < task_max; task_id++)
     1189            {
    11861190                if (task[task_id]->startid >= vspace[vspace_index]->tasks)
    11871191                {
     
    12121216    char * str;
    12131217
    1214     unsigned int is_pic = (periph[periph_index]->type == PERIPH_TYPE_PIC);
    1215     unsigned int is_icu = (periph[periph_index]->type == PERIPH_TYPE_ICU) ||
    1216                           (periph[periph_index]->type == PERIPH_TYPE_XCU);
    1217 
    12181218    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
    12191219
     
    12511251    }
    12521252
    1253     ///////// get srctype attribute ... if ICU or XCU
    1254     if ( is_icu )
    1255     {
    1256         str = getStringValue(reader, "srctype", &ok);
    1257         if (ok)
    1258         {
     1253    ///////// get srctype attribute
     1254    str = getStringValue(reader, "srctype", &ok);
     1255    if (ok)
     1256    {
    12591257#if XML_PARSER_DEBUG
    12601258printf("        srctype = %s\n", str);
    12611259#endif
    1262             if      ( strcmp(str, "HWI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_HWI;
    1263             else if ( strcmp(str, "WTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_WTI;
    1264             else if ( strcmp(str, "PTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_PTI;
    1265             else   
    1266             {
    1267                 printf("[XML ERROR] illegal IRQ <srctype> for periph %d in cluster %d\n",
    1268                        cluster_index, periph_loc_index);
    1269                 exit(1);
    1270             }
    1271         }
    1272         else
    1273         {
    1274             printf("[XML ERROR] missing IRQ <srctype> for periph %d in cluster %d\n",
     1260        if      ( strcmp(str, "HWI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_HWI;
     1261        else if ( strcmp(str, "WTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_WTI;
     1262        else if ( strcmp(str, "PTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_PTI;
     1263        else   
     1264        {
     1265            printf("[XML ERROR] illegal IRQ <srctype> for periph %d in cluster %d\n",
    12751266                   cluster_index, periph_loc_index);
    12761267            exit(1);
    12771268        }
    12781269    }
    1279 
    1280     ///////// get isr attribute ... if ICU or XCU
    1281     if ( is_icu )
    1282     {
    1283         str = getStringValue(reader, "isr", &ok);
    1284         if (ok)
    1285         {
     1270    else
     1271    {
     1272        printf("[XML ERROR] missing IRQ <srctype> for periph %d in cluster %d\n",
     1273               cluster_index, periph_loc_index);
     1274        exit(1);
     1275    }
     1276
     1277    ///////// get isr attribute
     1278    str = getStringValue(reader, "isr", &ok);
     1279    if (ok)
     1280    {
    12861281#if XML_PARSER_DEBUG
    12871282printf("        isr     = %s\n", str);
    12881283#endif
    1289             if      (strcmp(str, "ISR_TICK"   ) == 0)  irq[irq_index]->isr = ISR_TICK;
    1290             else if (strcmp(str, "ISR_BDV"    ) == 0)  irq[irq_index]->isr = ISR_BDV;
    1291             else if (strcmp(str, "ISR_CMA"    ) == 0)  irq[irq_index]->isr = ISR_CMA;
    1292             else if (strcmp(str, "ISR_TTY_RX" ) == 0)  irq[irq_index]->isr = ISR_TTY_RX;
    1293             else if (strcmp(str, "ISR_TTY_TX" ) == 0)  irq[irq_index]->isr = ISR_TTY_TX;
    1294             else if (strcmp(str, "ISR_TIMER"  ) == 0)  irq[irq_index]->isr = ISR_TIMER;
    1295             else if (strcmp(str, "ISR_WAKUP"  ) == 0)  irq[irq_index]->isr = ISR_WAKUP;
    1296             else if (strcmp(str, "ISR_NIC_RX" ) == 0)  irq[irq_index]->isr = ISR_NIC_RX;
    1297             else if (strcmp(str, "ISR_NIC_TX" ) == 0)  irq[irq_index]->isr = ISR_NIC_TX;
    1298             else if (strcmp(str, "ISR_MMC"    ) == 0)  irq[irq_index]->isr = ISR_MMC;
    1299             else if (strcmp(str, "ISR_DEFAULT") == 0)  irq[irq_index]->isr = ISR_DEFAULT;
    1300             else
    1301             {
    1302                 printf("[XML ERROR] illegal IRQ <isr> for periph %d in cluster %d\n",
    1303                        periph_loc_index, cluster_index );
    1304                 exit(1);
    1305             }
    1306         } 
     1284        if      (strcmp(str, "ISR_TICK"   ) == 0)  irq[irq_index]->isr = ISR_TICK;
     1285        else if (strcmp(str, "ISR_BDV"    ) == 0)  irq[irq_index]->isr = ISR_BDV;
     1286        else if (strcmp(str, "ISR_CMA"    ) == 0)  irq[irq_index]->isr = ISR_CMA;
     1287        else if (strcmp(str, "ISR_TTY_RX" ) == 0)  irq[irq_index]->isr = ISR_TTY_RX;
     1288        else if (strcmp(str, "ISR_TTY_TX" ) == 0)  irq[irq_index]->isr = ISR_TTY_TX;
     1289        else if (strcmp(str, "ISR_TIMER"  ) == 0)  irq[irq_index]->isr = ISR_TIMER;
     1290        else if (strcmp(str, "ISR_WAKUP"  ) == 0)  irq[irq_index]->isr = ISR_WAKUP;
     1291        else if (strcmp(str, "ISR_NIC_RX" ) == 0)  irq[irq_index]->isr = ISR_NIC_RX;
     1292        else if (strcmp(str, "ISR_NIC_TX" ) == 0)  irq[irq_index]->isr = ISR_NIC_TX;
     1293        else if (strcmp(str, "ISR_MMC"    ) == 0)  irq[irq_index]->isr = ISR_MMC;
     1294        else if (strcmp(str, "ISR_DMA"    ) == 0)  irq[irq_index]->isr = ISR_DMA;
     1295        else if (strcmp(str, "ISR_SPI"    ) == 0)  irq[irq_index]->isr = ISR_SPI;
     1296        else if (strcmp(str, "ISR_DEFAULT") == 0)  irq[irq_index]->isr = ISR_DEFAULT;
    13071297        else
    13081298        {
    1309             printf("[XML ERROR] missing IRQ <isr> for periph %d in cluster %d\n",
    1310                     cluster_index, periph_loc_index);
     1299            printf("[XML ERROR] illegal IRQ <isr> for periph %d in cluster %d\n",
     1300                   periph_loc_index, cluster_index );
    13111301            exit(1);
    13121302        }
     1303    } 
     1304    else
     1305    {
     1306        printf("[XML ERROR] missing IRQ <isr> for periph %d in cluster %d\n",
     1307                cluster_index, periph_loc_index);
     1308        exit(1);
    13131309    }
    13141310
     
    13251321    {
    13261322        irq[irq_index]->channel = 0;
    1327     }
    1328 
    1329     ///////// get dstx attribute ... if PIC
    1330     if ( is_pic )
    1331     {
    1332         value = getIntValue(reader, "dstx", &ok);
    1333         if (ok)
    1334         {
    1335 #if XML_PARSER_DEBUG
    1336 printf("        dstx    = %d\n", value);
    1337 #endif
    1338 
    1339             if ( value < header->x_size )
    1340             {
    1341                 irq[irq_index]->dstx = value;
    1342             }
    1343             else
    1344             {
    1345                 printf("[XML ERROR] IRQ <dstx> too large for periph %d in cluster %d\n",
    1346                        cluster_index, periph_loc_index);
    1347                 exit(1);
    1348             }
    1349         }
    1350         else
    1351         {
    1352             printf("[XML ERROR] missing IRQ <dstx> for periph %d in cluster %d\n",
    1353                    cluster_index, periph_loc_index);
    1354             exit(1);
    1355         }
    1356     }
    1357 
    1358     ///////// get dsty attribute ... if PIC
    1359     if ( is_pic )
    1360     {
    1361         value = getIntValue(reader, "dsty", &ok);
    1362         if (ok)
    1363         {
    1364 #if XML_PARSER_DEBUG
    1365 printf("        dsty    = %d\n", value);
    1366 #endif
    1367 
    1368             if ( value < header->y_size )
    1369             {
    1370                 irq[irq_index]->dsty = value;
    1371             }
    1372             else
    1373             {
    1374                 printf("[XML ERROR] IRQ <dsty> too large for periph %d in cluster %d\n",
    1375                        cluster_index, periph_loc_index);
    1376                 exit(1);
    1377             }
    1378         }
    1379         else
    1380         {
    1381             printf("[XML ERROR] missing IRQ <dsty> for periph %d in cluster %d\n",
    1382                     cluster_index, periph_loc_index);
    1383             exit(1);
    1384         }
    1385     }
    1386 
    1387     ///////// get dstid attribute
    1388     value = getIntValue(reader, "dstid", &ok);
    1389     if (ok)
    1390     {
    1391 #if XML_PARSER_DEBUG
    1392 printf("        dstid   = %d\n", value);
    1393 #endif
    1394         irq[irq_index]->dstid = value;
    1395         if (value >= 32)
    1396         {
    1397             printf("[XML ERROR] IRQ <dstid> too large for periph %d in cluster %d\n",
    1398                     cluster_index, periph_loc_index);
    1399             exit(1);
    1400         }
    1401     }
    1402     else
    1403     {
    1404         printf("[XML ERROR] missing IRQ <dstid> for periph %d in cluster %d\n",
    1405                 cluster_index, periph_loc_index);
    1406         exit(1);
    14071323    }
    14081324
     
    15351451    {
    15361452        periph[periph_index]->channels = 1;
     1453    }
     1454
     1455    ///////// get arg attribute (optionnal : 0 if missing)
     1456    value = getIntValue(reader, "arg", &ok);
     1457    if (ok)
     1458    {
     1459#if XML_PARSER_DEBUG
     1460printf("      arg         = %d\n", value);
     1461#endif
     1462        periph[periph_index]->arg = value;
     1463    }
     1464    else
     1465    {
     1466        periph[periph_index]->arg = 1;
    15371467    }
    15381468
     
    24732403
    24742404    ///////// set other header fields
    2475     header->increment = 0x10000;
    24762405    header->globals   = 0;
    24772406    header->vspaces   = 0;
     
    26192548
    26202549
    2621 ///////////////////////////////////////////////////////////////////////
    2622 // this function set the value the vobj_id fiels of all cp_ports
    2623 ///////////////////////////////////////////////////////////////////////
     2550///////////////////////////////////////////////////////////////////////////////////
     2551// this function set the values of vspace_id and vobj_id fields for all cp_ports
     2552///////////////////////////////////////////////////////////////////////////////////
    26242553void prepareBuild()
    26252554{
    26262555    unsigned int i;
    2627     //asign for all cp_ports the correct vspaceid and vobjid
    2628     for (i = 0; i < cp_port_index; i++) {
     2556   
     2557    for (i = 0; i < cp_port_index; i++)
     2558    {
    26292559        int vspace_id = getVspaceId(cp_port_vobj_ref[i]->vspace_name);
    2630         if (vspace_id < 0) {
     2560        if (vspace_id < 0)
     2561        {
    26312562            printf("[XML ERROR] illegal  <vspacename> for cp_port %d,\n", i);
    26322563            exit(1);
     
    26342565        cp_port[i]->vspaceid = vspace_id;
    26352566
    2636         int vobj_id = getVobjLocId(vspace_id, cp_port_vobj_ref[i]->vobj_name, vspace[vspace_id]->vobjs);
    2637         if (vobj_id >= 0) {
     2567        int vobj_id = getVobjId( vspace_id,
     2568                                 cp_port_vobj_ref[i]->vobj_name,
     2569                                 vspace[vspace_id]->vobjs );
     2570        if (vobj_id >= 0)
     2571        {
    26382572
    26392573#if XML_PARSER_DEBUG
     
    26432577            printf("      vobj_index   = %d\n", vobj_id);
    26442578#endif
    2645             cp_port[i]->mwmr_vobjid = vobj_id;
    2646 
    2647             assert((vobj[ vspace[vspace_id]->vobj_offset + vobj_id]->type == VOBJ_TYPE_MWMR)
    2648                     && "coproc ports have to refer to a vobj of type MWMR");
    2649         }
    2650         else {
    2651             printf("[XML ERROR] illegal  <vobjname> for cp_port %d,\n", i);
     2579            cp_port[i]->mwmr_vobj_id = vobj_id;
     2580
     2581            assert((vobj[vspace[vspace_id]->vobj_offset + vobj_id]->type == VOBJ_TYPE_MWMR)
     2582                    && "coproc ports must refer a vobj of type MWMR");
     2583        }
     2584        else
     2585        {
     2586            printf("[XML ERROR]  <vobjname> not found for cp_port %d,\n", i);
    26522587            exit(1);
    26532588        }
     
    29252860    file_write(fdout, "\n");
    29262861
    2927     ld_write(fdout, "vseg_cluster_increment  ",   header->increment);
     2862    ld_write(fdout, "vseg_cluster_increment  ",   0x00010000);
    29282863
    29292864    close(fdout);
Note: See TracChangeset for help on using the changeset viewer.