github.com/f-secure-foundry/tamago@v0.0.0-20220307101044-d73fcdd7f11b/soc/imx6/usdhc/adma.go (about)

     1  // NXP Ultra Secured Digital Host Controller (uSDHC) driver
     2  // https://github.com/f-secure-foundry/tamago
     3  //
     4  // IP: https://www.mobiveil.com/esdhc/
     5  //
     6  // Copyright (c) F-Secure Corporation
     7  // https://foundry.f-secure.com
     8  //
     9  // Use of this source code is governed by the license
    10  // that can be found in the LICENSE file.
    11  
    12  package usdhc
    13  
    14  import (
    15  	"bytes"
    16  	"encoding/binary"
    17  )
    18  
    19  // ADMA constants
    20  const (
    21  	ATTR_VALID = 0
    22  	ATTR_END   = 1
    23  	ATTR_INT   = 2
    24  	ATTR_ACT   = 4
    25  
    26  	ACT_TRANSFER = 0b10
    27  	ACT_LINK     = 0b11
    28  
    29  	DMASEL_NONE  = 0b00
    30  	DMASEL_ADMA1 = 0b01
    31  	DMASEL_ADMA2 = 0b10
    32  
    33  	ADMA_BD_MAX_LENGTH = 65532
    34  )
    35  
    36  // ADMABufferDescriptor implements p3964 58.4.2.4.1 ADMA Concept and Descriptor Format, IMX6ULLRM.
    37  type ADMABufferDescriptor struct {
    38  	Attribute uint8
    39  	res       uint8
    40  	Length    uint16
    41  	Address   uint32
    42  
    43  	next *ADMABufferDescriptor
    44  }
    45  
    46  // Init initializes an ADMA2 buffer descriptor.
    47  func (bd *ADMABufferDescriptor) Init(addr uint32, size int) {
    48  	b := bd
    49  
    50  	for size > 0 {
    51  		if size <= ADMA_BD_MAX_LENGTH {
    52  			b.Attribute = ACT_TRANSFER<<ATTR_ACT | 1<<ATTR_END | 1<<ATTR_VALID
    53  			b.Length = uint16(size)
    54  			b.Address = addr
    55  			break
    56  		} else {
    57  			b.Attribute = ACT_TRANSFER<<ATTR_ACT | 1<<ATTR_VALID
    58  			b.Length = uint16(ADMA_BD_MAX_LENGTH)
    59  			b.Address = addr
    60  
    61  			addr += ADMA_BD_MAX_LENGTH
    62  			size -= ADMA_BD_MAX_LENGTH
    63  
    64  			b.next = &ADMABufferDescriptor{}
    65  			b = b.next
    66  		}
    67  	}
    68  }
    69  
    70  // Bytes converts the descriptor structure to byte array format.
    71  func (bd *ADMABufferDescriptor) Bytes() []byte {
    72  	buf := new(bytes.Buffer)
    73  
    74  	b := bd
    75  
    76  	for b != nil {
    77  		binary.Write(buf, binary.LittleEndian, b.Attribute)
    78  		binary.Write(buf, binary.LittleEndian, b.res)
    79  		binary.Write(buf, binary.LittleEndian, b.Length)
    80  		binary.Write(buf, binary.LittleEndian, b.Address)
    81  
    82  		b = b.next
    83  	}
    84  
    85  	return buf.Bytes()
    86  }