root/sys/arch/powerpc/mpc5200/bestcommreg.h
/*      $NetBSD: bestcommreg.h,v 1.1 2026/06/27 13:28:34 rkujawa Exp $  */

/*-
 * Copyright (c) 2026 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Radoslaw Kujawa.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _POWERPC_MPC5200_BESTCOMMREG_H_
#define _POWERPC_MPC5200_BESTCOMMREG_H_

/*
 * BestComm SDMA controller registers (MBAR+0x1200 block). 
 */

#define SDMA_TASKBAR    0x00    /* task table base (physical SRAM addr) */
#define SDMA_CUR_PTR    0x04    /* current descriptor pointer           */
#define SDMA_END_PTR    0x08    /* end descriptor pointer               */
#define SDMA_VAR_PTR    0x0c    /* variable table pointer               */
#define SDMA_INT_VECT1  0x10    /* interrupt vector 1 (8-bit)           */
#define SDMA_INT_VECT2  0x11    /* interrupt vector 2 (8-bit)           */
#define SDMA_PTD_CNTRL  0x12    /* processor task dispatch control (16-bit) */
#define SDMA_INT_PEND   0x14    /* interrupt pending (write 1 to clear) */
#define SDMA_INT_MASK   0x18    /* interrupt mask (1 = masked)          */
#define SDMA_TCR        0x1c    /* task control regs: 16 x 16-bit       */
#define SDMA_IPR        0x3c    /* initiator priority regs: 32 x 8-bit  */
#define SDMA_CREQ_SEL   0x5c    /* current request select               */
#define SDMA_TASK_SIZE0 0x60    /* task size 0                          */
#define SDMA_TASK_SIZE1 0x64    /* task size 1                          */
#define SDMA_MDE_DEBUG  0x68    /* MDE debug                            */
#define SDMA_ADS_DEBUG  0x6c    /* ADS debug                            */
#define SDMA_VALUE1     0x70    /* debug value 1                        */
#define SDMA_VALUE2     0x74    /* debug value 2                        */
#define SDMA_DBG_CONTROL 0x78   /* debug control                        */
#define SDMA_DBG_STATUS 0x7c    /* debug status                         */
#define SDMA_PTD_DEBUG  0x80    /* PTD debug                            */

#define SDMA_REG_SIZE   0x100   /* register window if OF omits a size   */

/*
 * Per-task control register (TCR).
 */
#define SDMA_TCR_TASK(n)        (SDMA_TCR + (n) * 2)
#define SDMA_TCR_ENABLE         0x8000  /* enable/start this task (bit 15)      */
#define SDMA_TCR_INIT_SHIFT     8       /* initiator number field (bits 8-12)   */
#define SDMA_TCR_INIT_MASK      0x1f00
#define SDMA_TCR_HOLD           0x0020  /* hold initiator (bit 5)               */
#define SDMA_TCR_AUTOSTART      0x0080  /* restart after completion (bit 7)     */
#define SDMA_TCR_AUTOTASK_MASK  0x000f  /* task to auto-start (bits 0-3)                */

#define SDMA_NTASKS             16      /* number of SDMA tasks         */

/*
 * Per-task transfer-size register
 */
#define SDMA_SIZE_BYTE(task)    (SDMA_TASK_SIZE0 + (task) / 2)
#define SDMA_SIZE_CODE(sz)      ((sz) & 0x3)
#define SDMA_SIZE_FIELD(src, dst) \
        ((SDMA_SIZE_CODE(src) << 2) | SDMA_SIZE_CODE(dst))

/*
 * Data Routing Descriptor (DRD)
 */
#define SDMA_DRD_INIT_SHIFT     21
#define SDMA_DRD_INIT_MASK      (0x1fu << SDMA_DRD_INIT_SHIFT)  /* 0x03e00000 */
#define SDMA_DRD_EXT            0x40000000
#define SDMA_INITIATOR_ALWAYS   0

/* Per-initiator priority registers: byte SDMA_IPR + initiator */
#define SDMA_IPR_INIT(init)     (SDMA_IPR + (init))

/* PtdCntrl (SDMA_PTD_CNTRL) bits. */
#define SDMA_PTD_CNTRL_TI       0x8000  /* task initiator disable       */
#define SDMA_PTD_CNTRL_TEA      0x4000  /* bus-error (TEA) disable      */
#define SDMA_PTD_CNTRL_HE       0x2000  /* halt on error                */
#define SDMA_PTD_CNTRL_PE       0x0001  /* parity enable                */

/*
 * Interrupt pending / mask register layout.
 */
#define SDMA_INT_TASK_MASK      0x0000ffff      /* the 16 task events   */
#define SDMA_INT_TASK(n)        (1u << (n))
#define SDMA_INT_TEA            __BIT(28)       /* XLB bus error        */
#define SDMA_INT_TEA_TASK_MASK  0x0f000000      /* faulting task (bits 24-27) */
#define SDMA_INT_TEA_TASK_SHIFT 24
#define SDMA_INT_DBG            __BIT(31)       /* debug event          */
#define SDMA_INT_IMPL           0x9000ffff      /* implemented bits     */

#endif /* _POWERPC_MPC5200_BESTCOMMREG_H_ */