Changeset 411 for soft/giet_vm


Ignore:
Timestamp:
Sep 29, 2014, 11:56:47 AM (10 years ago)
Author:
alain
Message:

Introducing support for BPP (Big Physical Pages) and SPP (Small Physical Pages)

Location:
soft/giet_vm/giet_python
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_python/genmap

    r401 r411  
    1313# 2) The optionals "map.bin" and vsegs.ld" files are used to configure the GietVM.
    1414# 3) The optional "netbsd.dts" file can be used to configure NetBSD.
    15 # 4) The optional "arch.bib" file can be used to configure ALMOS.
    16 # 5) An optional "map.xml" file can be generated for debug.
     15# 4) The optional "netbsd.dts" file can be used to configure NetBSD.
     16# 5) The optional "arch.bib" file can be used to configure ALMOS.
     17# 6) An optional "map.xml" file can be generated for debug.
    1718#######################################################################################
    1819# The hardware parameters  are:
     
    5758                   help = 'define number of processors per cluster' )
    5859
     60parser.add_option( '--fbf', type = 'int', dest = 'fbf_size',
     61                   default = 128,
     62                   help = 'define frame buffer width and heigth' )
     63
    5964parser.add_option( '--v', action = 'store_true', dest = 'verbose',
    6065                   default = False,
     
    6368parser.add_option( '--netbsd', type = 'string', dest = 'netbsd_path',
    6469                   help = 'define pathname for the netbsd.dts file' )
     70
     71parser.add_option( '--linux', type = 'string', dest = 'linux_path',
     72                   help = 'define pathname for the linux.dts file' )
    6573
    6674parser.add_option( '--almos', type = 'string', dest = 'almos_path',
     
    99107y_size        = options.y_size      # number of clusters in a column
    100108nprocs        = options.nprocs      # number of processors in a cluster
     109fbf_size      = options.fbf_size    # frame buffer width & heigth
    101110
    102111verbose       = options.verbose     # report on map.bin generation if True
    103112
    104113netbsd_path   = options.netbsd_path # path for netbsd.dts file
     114linux_path    = options.linux_path  # path for linux.dts file
    105115almos_path    = options.almos_path  # path for arch.bib file
    106116giet_path     = options.giet_path   # path for map.bin & vsegs.ld files
     
    130140
    131141# build mapping calling the function (function name)
    132 mapping = select.arch( x_size, y_size, nprocs )
     142mapping = select.arch( x_size, y_size, nprocs, fbf_size )
    133143print '[genmap] platform %s build' % mapping.name
    134144
     
    172182    f = open ( pathname, 'w' )
    173183    f.write( mapping.netbsd_dts() )
    174     print '[genmap] %s generated for netbsd' % pathname
     184    print '[genmap] %s generated' % pathname
     185
     186######################################################################################
     187#   Generate linux.dts file if required.
     188#   It is used for LINUX configuration.
     189######################################################################################
     190
     191if ( (linux_path != None) and (arch_path != None) ):
     192    pathname = linux_path + '/linux.dts'
     193    f = open ( pathname, 'w' )
     194    f.write( mapping.linux_dts() )
     195    print '[genmap] %s generated' % pathname
    175196
    176197######################################################################################
  • soft/giet_vm/giet_python/mapping.py

    r406 r411  
    2323##########################################################################################
    2424# Implementation Note
    25 # As described above, the various objects are distributed in the PYTHON structure:
     25# The various objects used to describe a mapping are distributed in the PYTHON structure:
    2626# For example the psegs set is split in several subsets (one subset per cluster),
    2727# or the tasks set is split in several subsets (one subset per vspace), etc...
     
    3333##########################################################################################
    3434
    35 ######################################################################################
    36 # These global lists must be consistent with enums in mapping_info.h or irq_handler.h
    37 ######################################################################################
     35##########################################################################################
     36# Various constants
     37##########################################################################################
     38
     39PADDR_WIDTH       = 40            # number of bits for physical address
     40X_WIDTH           = 4             # number of bits encoding x coordinate
     41Y_WIDTH           = 4             # number of bits encoding y coordinate
     42P_WIDTH           = 4             # number of bits encoding local proc_id
     43VPN_ANTI_MASK     = 0x00000FFF    # mask virtual address to get offset in a small page
     44BPN_MASK          = 0xFFE00000    # mask virtual address to get the BPN (big page)
     45PERI_INCREMENT    = 0x10000       # virtual address increment for replicated global vsegs
     46RESET_ADDRESS     = 0xBFC00000    # Processor wired boot_address
     47MAPPING_SIGNATURE = 0xDACE2014    # Magic number indicating a valid C binary struture
     48
     49##########################################################################################
     50# These global lists must be consistent with enums in mapping_info.h or irq_handler.
     51##########################################################################################
    3852PERIPHTYPES =    [
    3953                  'CMA',
     
    131145##########################################################################################
    132146    def __init__( self,
    133                   name,                          # mapping name
    134                   x_size,                        # number of clusters in a row
    135                   y_size,                        # number of clusters in a column
    136                   procs_max = 2,                 # max number of processors per cluster
    137                   x_width = 4,                   # number of bits encoding x coordinate
    138                   y_width = 4,                   # number of bits encoding y coordinate
    139                   p_width = 2,                   # number of bits encoding local proc id
    140                   paddr_width = 40,              # number of bits for physical address
    141                   coherence = 1,                 # hardware cache coherence when non-zero
    142                   irq_per_proc = 1,              # number or IRQs from XCU to processor
    143                   use_ramdisk = False,           # use ramdisk when true
    144                   x_io = 0,                      # cluster_io x coordinate
    145                   y_io = 0,                      # cluster_io y coordinate
    146                   peri_increment = 0x10000,      # address increment for globals
    147                   reset_address  = 0xBFC00000,   # Processor wired boot_address
    148                   ram_base       = 0,            # RAM physical base address in cluster[0,0]
    149                   ram_size       = 0 ):          # RAM size in each cluster (bytes)
    150 
    151         assert (procs_max <= (1 << p_width))
    152 
    153         self.signature      = 0xDACE2014
     147                  name,                            # mapping name
     148                  x_size,                          # number of clusters in a row
     149                  y_size,                          # number of clusters in a column
     150                  nprocs,                       # max number of processors per cluster
     151                  x_width        = X_WIDTH,        # number of bits encoding x coordinate
     152                  y_width        = Y_WIDTH,        # number of bits encoding y coordinate
     153                  p_width        = P_WIDTH,        # number of bits encoding local proc_id
     154                  paddr_width    = PADDR_WIDTH,    # number of bits for physical address
     155                  coherence      = 1,              # hardware cache coherence when non-zero
     156                  irq_per_proc   = 1,              # number or IRQs from XCU to processor
     157                  use_ramdisk    = False,          # use ramdisk when true
     158                  x_io           = 0,              # cluster_io x coordinate
     159                  y_io           = 0,              # cluster_io y coordinate
     160                  peri_increment = PERI_INCREMENT, # address increment for globals
     161                  reset_address  = RESET_ADDRESS,  # Processor wired boot_address
     162                  ram_base       = 0,              # RAM physical base in cluster[0,0]
     163                  ram_size       = 0 ):            # RAM size in each cluster (bytes)
     164
     165        assert ( x_size <= (1<<X_WIDTH) )
     166        assert ( y_size <= (1<<Y_WIDTH) )
     167        assert ( nprocs <= (1<<P_WIDTH) )
     168
     169        self.signature      = MAPPING_SIGNATURE
    154170        self.name           = name
    155171        self.paddr_width    = paddr_width
     
    157173        self.x_size         = x_size
    158174        self.y_size         = y_size
    159         self.procs_max      = procs_max
     175        self.nprocs      = nprocs
    160176        self.x_width        = x_width
    161177        self.y_width        = y_width
     
    170186        self.ram_size       = ram_size
    171187
    172 
    173188        self.total_vspaces  = 0
    174189        self.total_globals  = 0
     
    201216                size ):                # pseg length (bytes)
    202217
    203         # check coordinates (obtained from the base address)
     218        # computes coordinates from the base address extension
    204219        paddr_lsb_width = self.paddr_width - self.x_width - self.y_width
    205220        cluster_xy = base >> paddr_lsb_width
     
    207222        y = cluster_xy & ((1 << self.y_width) - 1)
    208223
    209         assert (base & 0xFFF) == 0
     224        assert (base & VPN_ANTI_MASK) == 0
    210225
    211226        assert (x < self.x_size) and (y < self.y_size)
     
    242257        assert (x < self.x_size) and (y < self.y_size)
    243258
    244         assert (base & 0xFFF) == 0
     259        assert (base & VPN_ANTI_MASK) == 0
    245260
    246261        assert ptype in PERIPHTYPES
     
    347362        return port
    348363
    349     ############################    add one (or several) global vseg into mapping
    350     def addGlobal( self,
    351                    name,                  # vseg name
    352                    vbase,                 # virtual base address
    353                    size,                  # vobj length (bytes)
    354                    mode,                  # CXWU flags
    355                    vtype,                 # vobj type
    356                    x,                     # destination x coordinate
    357                    y,                     # destination y coordinate
    358                    pseg,                  # destination pseg name
    359                    identity = False,      # identity mapping required if true
    360                    binpath  = '',         # pathname for binary code
    361                    local    = False ):    # non shared vseg when true
     364    ############################    add one global vseg into mapping
     365    def addGlobal( self,
     366                   name,               # vseg name
     367                   vbase,              # virtual base address
     368                   size,               # vobj length (bytes)
     369                   mode,               # CXWU flags
     370                   vtype,              # vobj type
     371                   x,                  # destination x coordinate
     372                   y,                  # destination y coordinate
     373                   pseg,               # destination pseg name
     374                   identity = False,   # identity mapping required if true
     375                   binpath  = '',      # pathname for binary code if required
     376                   align    = 0,       # alignment required
     377                   local    = False,   # only mapped in local PTAB if true
     378                   big      = False ): # to be mapped in a big physical page
    362379
    363380        assert mode in VSEGMODES
     
    365382        assert vtype in VOBJTYPES
    366383
    367         assert (vbase & 0xFFF) == 0
    368 
    369384        assert (x < self.x_size) and (y < self.y_size)
     385
     386        # two global vsegs must not overlap if they have different names
     387        for prev in self.globs:
     388            prev_vbase = prev.vbase
     389            prev_size = prev.vobjs[0].length
     390
     391            if ( ((prev_vbase + prev_size) > vbase ) and
     392                 ((vbase + size) > prev_vbase) and
     393                 (prev.name != name) ):
     394                print '[genmap error] in addGlobal() : %s overlap %s' % (name, prev.name)
     395                print ' %s : base = %x / size = %x' %( name, vbase, size )
     396                print ' %s : base = %x / size = %x' %( prev.name, prev_vbase, prev_size )
     397                sys.exit(1)
    370398
    371399        # add one vseg into mapping
    372400        vseg = Vseg( name, vbase, mode, x, y, pseg,
    373                      identity = identity, local = local )
     401                     identity = identity, local = local, big = big )
    374402
    375403        self.globs.append( vseg )
     
    413441                 align      = 0,        # alignment required
    414442                 init       = 0,        # initial value
    415                  local = False ):       # non shared when true
     443                 local    = False,      # only mapped in local PTAB if true
     444                 big      = False ):    # to be mapped in a big physical page
    416445
    417446        assert mode in VSEGMODES
     
    422451
    423452        # add one vseg into mapping
    424         vseg = Vseg( name, vbase, mode, x, y, pseg, local = local )
     453        vseg = Vseg( name, vbase, mode, x, y, pseg, local = local, big = big )
    425454        vspace.vsegs.append( vseg )
    426455        vseg.index = self.total_vsegs
     
    473502
    474503        assert (x < self.x_size) and (y < self.y_size)
    475         assert lpid < self.procs_max
     504        assert lpid < self.nprocs
    476505
    477506        # add one task into mapping
     
    509538        return byte_stream
    510539
    511     ################
    512     def xml( self ):    # xml file generation for mapping
     540    ####################################################################################
     541    def xml( self ):    # compute string for map.xml file generation
    513542
    514543        s = '<?xml version="1.0"?>\n\n'
     
    545574        return s
    546575
    547     #########################
    548     def cbin( self, verbose ):     # C binary structure generation for mapping
     576    #####################################################################################
     577    def cbin( self, verbose ):     # C binary structure for map.bin file generation
    549578
    550579        byte_stream = bytearray()
     
    705734    # end of cbin()
    706735
    707     #######################
    708     def giet_vsegs( self ):      # compute string for giet_vsegs.ld file
     736    ##################################################################################
     737    def giet_vsegs( self ):      # compute string for giet_vsegs.ld file generation
    709738                                 # required by giet_vm compilation
    710739
     
    798827        return s
    799828
    800     ########################
    801     def hard_config( self ):     # compute string for hard_config.h file required by
     829    ###################################################################################
     830    def hard_config( self ):     # compute string for hard_config.h file generation,
     831                                 # required by
    802832                                 # - top.cpp compilation
    803833                                 # - giet_vm compilation
     
    10941124        s += '#define X_IO                   %d\n'    % self.x_io
    10951125        s += '#define Y_IO                   %d\n'    % self.y_io
    1096         s += '#define NB_PROCS_MAX           %d\n'    % self.procs_max
     1126        s += '#define NB_PROCS_MAX           %d\n'    % self.nprocs
    10971127        s += '#define IRQ_PER_PROCESSOR      %d\n'    % self.irq_per_proc
    10981128        s += '#define RESET_ADDRESS          0x%x\n'  % self.reset_address
     
    12011231    # end of hard_config()
    12021232
    1203     #######################
     1233    ################################################################################
     1234    def linux_dts( self ):     # compute string for linux.dts file generation
     1235                               # used for linux configuration 
     1236        # header
     1237        s =  '/dts-v1/;\n'
     1238        s += '\n'
     1239        s += '/{\n'
     1240        s += '  compatible = "tsar, %s";\n' % self.name
     1241        s += '  #address-cells = <2>;\n'               # physical address on 64 bits
     1242        s += '  #size-cells    = <1>;\n'               # segment size on 32 bits
     1243        s += '  model = "%s";\n' % self.name
     1244        s += '\n'
     1245
     1246        # linux globals arguments
     1247        s += '  chosen {\n'
     1248        s += '    linux,stdout-path = &tty;\n'
     1249        s += '    bootargs = "console=tty0 console=ttyVTTY0 earlyprintk";\n'
     1250        s += '  };\n\n'     
     1251
     1252        # cpus (for each cluster)
     1253        s += '  cpus {\n'
     1254        s += '    #address-cells = <1>;\n'
     1255        s += '    #size-cells    = <0>;\n'
     1256
     1257        for cluster in self.clusters:
     1258            for proc in cluster.procs:
     1259                x       = cluster.x
     1260                y       = cluster.y
     1261                l       = proc.lpid
     1262                proc_id = (((x << self.y_width) + y) * self.nprocs) + l
     1263                s += '    cpu@%d_%d_%d {\n' %(x,y,l)
     1264                s += '      device_type = "cpu";\n'
     1265                s += '      compatible = "soclib,mips32el";\n'
     1266                s += '      reg = <0x%x>;\n' % proc_id
     1267                s += '    };\n'
     1268                s += '\n'
     1269
     1270        s += '  };\n\n'
     1271
     1272        # devices (ram or peripheral) are grouped per cluster
     1273        # the "compatible" attribute links a peripheral device
     1274        # to one or several drivers identified by ("major","minor")
     1275
     1276        for cluster in self.clusters:
     1277            x               = cluster.x
     1278            y               = cluster.y
     1279            found_xcu       = False
     1280            found_pic       = False
     1281
     1282            s += '  /*** cluster[%d,%d] ***/\n\n' % (x,y)
     1283
     1284            # scan all psegs to find RAM in current cluster
     1285            for pseg in cluster.psegs:
     1286                if ( pseg.segtype == 'RAM' ):
     1287                    msb  = pseg.base >> 32
     1288                    lsb  = pseg.base & 0xFFFFFFFF
     1289                    size = pseg.size
     1290
     1291                    s += '  ram@%d_%d: ram@%d_%d {\n' % (x,y,x,y)
     1292                    s += '    device_type = "memory";\n'
     1293                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1294                    s += '  };\n\n'
     1295
     1296            # scan all periphs to find XCU or PIC in current cluster
     1297            for periph in cluster.periphs:
     1298                msb     = periph.pseg.base >> 32
     1299                lsb     = periph.pseg.base & 0xFFFFFFFF
     1300                size    = periph.pseg.size
     1301
     1302                # search XCU (can be replicated)
     1303                if ( (periph.ptype == 'XCU') ): 
     1304                    found_xcu     = True
     1305                    xcu           = periph
     1306                    irq_ctrl_name = 'xcu@%d_%d' % (x,y)
     1307
     1308                    s += '  %s: %s {\n'  % (irq_ctrl_name, irq_ctrl_name)
     1309                    s += '    compatible = "soclib, vci_xicu", "soclib, vci_xicu_timer";\n'
     1310                    s += '    interrupt-controller;\n'
     1311                    s += '    #interrupt-cells = <1>;\n'
     1312                    s += '    clocks = <&freq>;\n'         # the XCU component contains a timer
     1313                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size) 
     1314                    s += '  };\n\n'
     1315
     1316                # search PIC (non replicated)
     1317                if ( periph.ptype == 'PIC' ): 
     1318                    found_pic     = True
     1319                    pic           = periph
     1320                    irq_ctrl_name = 'pic'
     1321
     1322                    s += '  %s: %s {\n'  % (irq_ctrl_name, irq_ctrl_name)
     1323                    s += '    compatible = "soclib, vci_iopic";\n'
     1324                    s += '    interrupt-controller;\n'
     1325                    s += '    #interrupt-cells = <1>;\n'
     1326                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1327                    s += '  };\n\n'
     1328
     1329                # search ICU (non supported by Linux)
     1330                if ( periph.ptype == 'ICU' ): 
     1331                    print '[genmap warning] in linux_dts() : ICU peripheral not supported by LINUX'
     1332
     1333            # we need one interrupt controler in any cluster containing peripherals
     1334            if ( (found_xcu == False) and (found_pic == False) and (len(cluster.periphs) > 0) ):
     1335                print '[genmap error] in linux_dts() : No XCU/PIC in cluster(%d,%d)' % (x,y)
     1336                sys.exit(1)   
     1337
     1338            if ( found_pic == True ): irq_ctrl = pic
     1339            else:                     irq_ctrl = xcu
     1340             
     1341            # scan all periphs to find TTY and IOC in current cluster
     1342            for periph in cluster.periphs:
     1343                msb     = periph.pseg.base >> 32
     1344                lsb     = periph.pseg.base & 0xFFFFFFFF
     1345                size    = periph.pseg.size
     1346
     1347                # search TTY (non replicated)
     1348                if ( periph.ptype == 'TTY' ): 
     1349
     1350                    # get HWI index to XCU or PIC (only TTY channel 0 is used by Linux)
     1351                    hwi_id = 0xFFFFFFFF
     1352                    for irq in irq_ctrl.irqs:
     1353                        if ( (irq.isrtype == 'ISR_TTY_RX') and (irq.channel == 0) ): hwi_id = irq.srcid
     1354                    if ( hwi_id == 0xFFFFFFFF ):
     1355                        print '[genmap error] in linux.dts() IRQ_TTY_RX not found'
     1356                        sys.exit(1)
     1357
     1358                    s += '  tty: tty {\n'
     1359                    s += '    compatible = "soclib, vci_multi_tty";\n'
     1360                    s += '    interrupt-parent = <&%s>;\n' % (irq_ctrl_name)
     1361                    s += '    interrupt = <%d>;\n' % hwi_id
     1362                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1363                    s += '  };\n\n'
     1364
     1365                # search IOC (non replicated)
     1366                elif ( periph.ptype == 'IOC' ): 
     1367
     1368                    if ( periph.subtype == 'BDV' ):
     1369
     1370                        # get irq line index associated to bdv
     1371                        hwi_id = 0xFFFFFFFF
     1372                        for irq in irq_ctrl.irqs:
     1373                            if ( irq.isrtype == 'ISR_BDV' ): hwi_id = irq.srcid
     1374                        if ( hwi_id == 0xFFFFFFFF ):
     1375                            print '[genmap error] in linux.dts() ISR_BDV not found'
     1376                            sys.exit(1)
     1377
     1378                        s += '  bdv: bdv {\n'
     1379                        s += '    compatible = "soclib:vci_blockdevice";\n'
     1380                        s += '    interrupt-parent = <&%s>;\n' % (irq_ctrl_name)
     1381                        s += '    interrupt = <%d>;\n' % hwi_id
     1382                        s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1383                        s += '  };\n\n'
     1384
     1385                    elif ( periph.subtype == 'HBA' ):
     1386
     1387                        print '[genmap error] in linux_dts() : HBA peripheral not supported by LINUX'
     1388                        sys.exit(1)
     1389
     1390                    elif ( periph.subtype == 'SPI' ):
     1391
     1392                        print '[genmap error] in linux_dts() : SPI peripheral not supported by LINUX'
     1393                        sys.exit(1)
     1394
     1395                # other peripherals
     1396                else: 
     1397                    type = periph.ptype
     1398                    print '[genmap warning] in linux_dts() : %s peripheral not supported by LINUX' % (type)
     1399           
     1400        # clocks 
     1401        s += '  /*** clocks ***/\n\n'
     1402        s += '  clocks {\n'
     1403        s += '    freq@50MHZ: freq@50MHZ {\n'
     1404        s += '      #clock-cells = <0>;\n'
     1405        s += '      compatible = "fixed-clock";\n'
     1406        s += '      clock-frequency = <50000000>;\n'
     1407        s += '    };\n'
     1408        s += '  };\n\n'
     1409        s += '  cpuclk {\n'
     1410        s += '    compatible = "soclib, mips32_clksrc";\n'
     1411        s += '    clocks = <&freq@50MHZ>;\n'
     1412        s += '  };\n'
     1413        s += '};\n'
     1414
     1415        return s
     1416        # end linux_dts()
     1417
     1418
     1419    #############################################################################
    12041420    def netbsd_dts( self ):    # compute string for netbsd.dts file generation,
    12051421                               # used for netbsd configuration
     
    12301446        s += '  };\n'
    12311447
    1232         # rams (for each cluster)
     1448        # physical memory banks (for each cluster)
    12331449        for cluster in self.clusters:
    12341450            for pseg in cluster.psegs:
     
    12471463        # peripherals (for each cluster)
    12481464        for cluster in self.clusters:
     1465            x = cluster.x
     1466            y = cluster.y
    12491467
    12501468            # research XCU component
     
    12721490                            s += '    out@%d {\n' % output_id
    12731491                            s += '      device_type = "soclib:xicu:filter";\n'
    1274                             s += '      irq         = <&{/cpus/Mips,32@0x%x} %d>;\n' % (proc_id, itid)
     1492                            s += '      irq = <&{/cpus/Mips,32@0x%x} %d>;\n' % (proc_id, itid)
    12751493                            s += '      output_line = <%d>;\n' % output_id
    1276                             s += '      parent      = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
     1494                            s += '      parent = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
    12771495                            s += '    };\n'
    12781496
     
    12971515                    s += '  };\n'
    12981516
     1517            # at least one interrupt controller
    12991518            if ( (found_xcu == False) and (found_pic == False) and (len(cluster.periphs) > 0) ):
    1300                 print '[genmap error] in netbsd_dts() : No XCU/PIC in cluster(%d,%d)' % (cluster.x, cluster.y)
     1519                print '[genmap error] in netbsd_dts() : No XCU/PIC in cluster(%d,%d)' % (x,y)
    13011520                sys.exit(1)
    13021521
     
    13141533
    13151534                    s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
    1316                     s += '    device_type   = "soclib:dma";\n'
    1317                     s += '    reg           = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1535                    s += '    device_type = "soclib:dma";\n'
     1536                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
    13181537                    s += '    channel_count = <%d>;\n' % periph.channels
    13191538
     
    13321551                        s += '      device_type = "soclib:periph:irq";\n'
    13331552                        s += '      output_line = <%d>;\n' % channel
    1334                         s += '      irq         = <&{/%s}  %d>;\n' % (name, hwi_id)
    1335                         s += '      parent      = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
     1553                        s += '      irq = <&{/%s}  %d>;\n' % (name, hwi_id)
     1554                        s += '      parent = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
    13361555                        s += '    };\n'
    13371556
     
    13511570                    s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
    13521571                    s += '    device_type = "soclib:mmc";\n'
    1353                     s += '    irq         = <&{/%s@0x%x}  %d>;\n' % (irq_tgt.pseg.name, irq_tgt.pseg.base, irq_in)
    1354                     s += '    reg         = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1572                    s += '    irq = <&{/%s@0x%x}  %d>;\n' % (irq_tgt.pseg.name, irq_tgt.pseg.base, irq_in)
     1573                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
    13551574                    s += '  };\n'
    13561575
     
    13581577                elif ( periph.ptype == 'FBF' ):
    13591578
    1360                     s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
     1579                    s += '  %s@0x%x {\n' % (periph.pseg.name, periph.pseg.base)
    13611580                    s += '    device_type = "soclib:framebuffer";\n'
    13621581                    s += '    mode        = <32>;\n'                    # bits par pixel
     
    13791598                            sys.exit(1)
    13801599
    1381                         s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
     1600                        s += '  %s@0x%x {\n' % (periph.pseg.name, periph.pseg.base)
    13821601                        s += '    device_type = "soclib:blockdevice";\n'
    1383                         s += '    irq         = <&{/%s@0x%x}  %d>;\n' % (irq_tgt.pseg.name, irq_tgt.pseg.base, irq_in)
    1384                         s += '    reg         = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1602                        s += '    irq = <&{/%s@0x%x} %d>;\n' % (irq_tgt.pseg.name,irq_tgt.pseg.base,irq_in)
     1603                        s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
    13851604                        s += '  };\n'
    13861605
     
    14011620                        s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
    14021621                        s += '    device_type = "soclib:spi";\n'
    1403                         s += '    irq         = <&{/%s@0x%x}  %d>;\n' % (irq_tgt.pseg.name, irq_tgt.pseg.base, irq_in)
    1404                         s += '    reg         = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1622                        s += '    irq = <&{/%s@0x%x} %d>;\n' % (irq_tgt.pseg.name,irq_tgt.pseg.base,irq_in)
     1623                        s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
    14051624                        s += '  };\n'
    14061625
     
    14081627                elif ( periph.ptype == 'ROM' ):
    14091628
    1410                     s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
     1629                    s += '  %s@0x%x {\n' % (periph.pseg.name, periph.pseg.base)
    14111630                    s += '    device_type = "rom";\n'
    1412                     s += '    cached      = <1>;\n'
    1413                     s += '    reg         = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1631                    s += '    cached = <1>;\n'
     1632                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
    14141633                    s += '  };\n'
    14151634
     
    14251644                elif ( periph.ptype == 'TTY' ):
    14261645
    1427                     s += '  %s@0x%x {\n'  % (periph.pseg.name, periph.pseg.base)
    1428                     s += '    device_type   = "soclib:tty";\n'
    1429                     s += '    reg           = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
     1646                    s += '  %s@0x%x {\n' % (periph.pseg.name, periph.pseg.base)
     1647                    s += '    device_type = "soclib:tty";\n'
    14301648                    s += '    channel_count = < %d >;\n' % periph.channels
     1649                    s += '    reg = <0x%x  0x%x  0x%x>;\n' % (msb, lsb, size)
    14311650
    14321651                    # multi-channels : get HWI index (to XCU or PIC) for each channel
     
    14441663                        s += '      device_type = "soclib:periph:irq";\n'
    14451664                        s += '      output_line = <%d>;\n' % channel
    1446                         s += '      irq         = <&{/%s}  %d>;\n' % (name, hwi_id)
    1447                         s += '      parent      = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
     1665                        s += '      irq = <&{/%s}  %d>;\n' % (name, hwi_id)
     1666                        s += '      parent = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
    14481667                        s += '    };\n'
    14491668
     
    15251744                        s += '      device_type = "soclib:periph:irq";\n'
    15261745                        s += '      output_line = <%d>;\n' % channel
    1527                         s += '      irq         = <&{/%s}  %d>;\n' % (name, hwi_id)
    1528                         s += '      parent      = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
     1746                        s += '      irq = <&{/%s}  %d>;\n' % (name, hwi_id)
     1747                        s += '      parent = <&{/%s@0x%x}>;\n' % (periph.pseg.name, periph.pseg.base)
    15291748                        s += '    };\n'
    15301749
     
    15701789
    15711790        return s
    1572         # end netbsd_dts( )
     1791        # end netbsd_dts()
    15731792
    15741793    ###########################
     
    15831802        s += '        XMAX=%d\n'            % self.x_size
    15841803        s += '        YMAX=%d\n'            % self.y_size
    1585         s += '        CPU_NR=%d\n'          % self.procs_max
     1804        s += '        CPU_NR=%d\n'          % self.nprocs
    15861805        s += '\n'
    15871806
     
    19832202                  psegname,
    19842203                  identity = False,
    1985                   local    = False ):
     2204                  local    = False,
     2205                  big      = False ):
    19862206
    19872207        assert mode in VSEGMODES
     
    19952215        self.psegname = psegname            # name of pseg in destination cluster
    19962216        self.identity = identity            # identity mapping required
    1997         self.local    = local               # one copy per cluster
     2217        self.local    = local               # only mapped in local PTAB when true
     2218        self.big      = big                 # to be mapped in a big physical page
    19982219        self.vobjs    = []
    19992220        return
     
    20062227        if ( self.identity ): s += ' ident="1"'
    20072228        if ( self.local ):    s += ' local="1"'
     2229        if ( self.big ):      s += ' big="1"'
    20082230        s += ' >\n'
    20092231        for vobj in self.vobjs:  s += vobj.xml()
     
    20572279        byte_stream += mapping.int2bytes( 4,  len(self.vobjs) ) # number of vobjs in vseg
    20582280        byte_stream += mapping.int2bytes( 4,  vobj_id )         # first vobj global index
    2059         byte_stream += mapping.int2bytes( 4,  0 )               # linked list of vsegs on same pseg
     2281        byte_stream += mapping.int2bytes( 4,  0 )               # linked list of vsegs on pseg
    20602282        byte_stream += mapping.int2bytes( 1,  0 )               # mapped when non zero
    2061         byte_stream += mapping.int2bytes( 1,  self.identity )   # identity mapping when non zero
    2062         byte_stream += mapping.int2bytes( 1,  self.local )      # non shared if non zero
    2063         byte_stream += mapping.int2bytes( 1,  0 )               # reserved (padding)
     2283        byte_stream += mapping.int2bytes( 1,  self.identity )   # identity mapping if non zero
     2284        byte_stream += mapping.int2bytes( 1,  self.local )      # only mapped in local PTAB
     2285        byte_stream += mapping.int2bytes( 1,  self.big )        # to be mapped in big physical page
    20642286
    20652287        if ( verbose ):
     
    21372359        byte_stream += mapping.int2bytes( 4 , self.align )      # required alignment
    21382360        byte_stream += mapping.int2bytes( 4 , 0 )               # virtual base address
    2139         byte_stream += mapping.int2bytes( 8 , 0 )               # physical base address
    21402361        byte_stream += mapping.int2bytes( 4 , self.init )       # init value
    21412362
Note: See TracChangeset for help on using the changeset viewer.