root/sys/arch/hppa/hppa/pim.h
/*      $NetBSD: pim.h,v 1.3 2024/01/22 07:10:54 skrll Exp $    */

/*-
 * Copyright (c) 2002 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Matthew Fredette.
 *
 * 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.
 */

/*
 * This describes the Processor Internal Memory data for various checks.
 *
 * References:
 *
 * "PA/RISC 1.1 I/O Firmware Architecture Reference Specification",
 * Version 1.0, August 22, 2001.
 *
 * "PA/RISC 2.0 I/O Firmware Architecture Reference Specification",
 * Version 1.0, August 22, 2001.
 */

/* The PIM data for HPMC and TOC contains these register arrays. */
struct hppa_pim_regs {

        /* The general registers. */
        uint32_t        pim_regs_r0;
        uint32_t        pim_regs_r1;
        uint32_t        pim_regs_r2;
        uint32_t        pim_regs_r3;
        uint32_t        pim_regs_r4;
        uint32_t        pim_regs_r5;
        uint32_t        pim_regs_r6;
        uint32_t        pim_regs_r7;
        uint32_t        pim_regs_r8;
        uint32_t        pim_regs_r9;
        uint32_t        pim_regs_r10;
        uint32_t        pim_regs_r11;
        uint32_t        pim_regs_r12;
        uint32_t        pim_regs_r13;
        uint32_t        pim_regs_r14;
        uint32_t        pim_regs_r15;
        uint32_t        pim_regs_r16;
        uint32_t        pim_regs_r17;
        uint32_t        pim_regs_r18;
        uint32_t        pim_regs_r19;
        uint32_t        pim_regs_r20;
        uint32_t        pim_regs_r21;
        uint32_t        pim_regs_r22;
        uint32_t        pim_regs_r23;
        uint32_t        pim_regs_r24;
        uint32_t        pim_regs_r25;
        uint32_t        pim_regs_r26;
        uint32_t        pim_regs_r27;
        uint32_t        pim_regs_r28;
        uint32_t        pim_regs_r29;
        uint32_t        pim_regs_r30;
        uint32_t        pim_regs_r31;

        /* The control registers. */
        uint32_t        pim_regs_cr0;
        uint32_t        pim_regs_cr1;
        uint32_t        pim_regs_cr2;
        uint32_t        pim_regs_cr3;
        uint32_t        pim_regs_cr4;
        uint32_t        pim_regs_cr5;
        uint32_t        pim_regs_cr6;
        uint32_t        pim_regs_cr7;
        uint32_t        pim_regs_cr8;
        uint32_t        pim_regs_cr9;
        uint32_t        pim_regs_cr10;
        uint32_t        pim_regs_cr11;
        uint32_t        pim_regs_cr12;
        uint32_t        pim_regs_cr13;
        uint32_t        pim_regs_cr14;
        uint32_t        pim_regs_cr15;
        uint32_t        pim_regs_cr16;
        uint32_t        pim_regs_cr17;
        uint32_t        pim_regs_cr18;
        uint32_t        pim_regs_cr19;
        uint32_t        pim_regs_cr20;
        uint32_t        pim_regs_cr21;
        uint32_t        pim_regs_cr22;
        uint32_t        pim_regs_cr23;
        uint32_t        pim_regs_cr24;
        uint32_t        pim_regs_cr25;
        uint32_t        pim_regs_cr26;
        uint32_t        pim_regs_cr27;
        uint32_t        pim_regs_cr28;
        uint32_t        pim_regs_cr29;
        uint32_t        pim_regs_cr30;
        uint32_t        pim_regs_cr31;

        /* The space registers. */
        uint32_t        pim_regs_sr0;
        uint32_t        pim_regs_sr1;
        uint32_t        pim_regs_sr2;
        uint32_t        pim_regs_sr3;
        uint32_t        pim_regs_sr4;
        uint32_t        pim_regs_sr5;
        uint32_t        pim_regs_sr6;
        uint32_t        pim_regs_sr7;

        /* The back entries of the instruction address queues. */
        uint32_t        pim_regs_iisq_tail;
        uint32_t        pim_regs_iioq_tail;
};

/* The PIM data for HPMC and LPMC contains this check information. */
struct hppa_pim_checks {

        /* The Check Type. */
        uint32_t        pim_check_type;
#define PIM_CHECK_CACHE         (1 << 31)
#define PIM_CHECK_TLB           (1 << 30)
#define PIM_CHECK_BUS           (1 << 29)
#define PIM_CHECK_ASSISTS       (1 << 28)
#define PIM_CHECK_BITS                                          \
        "\177\020"              /* New bitmask format */        \
        "b\037cache\0"          /* bit 31 */                    \
        "b\036tlb\0"            /* bit 30 */                    \
        "b\035bus\0"            /* bit 29 */                    \
        "b\034assists\0"        /* bit 28 */

        /*
         * The CPU State.  In addition to the common PIM_CPU_
         * bits defined below, some fields are HPMC-specific.
         */
        uint32_t        pim_check_cpu_state;
#define PIM_CPU_IQV     (1 << 31)
#define PIM_CPU_IQF     (1 << 30)
#define PIM_CPU_IPV     (1 << 29)
#define PIM_CPU_GRV     (1 << 28)
#define PIM_CPU_CRV     (1 << 27)
#define PIM_CPU_SRV     (1 << 26)
#define PIM_CPU_TRV     (1 << 25)
#define PIM_CPU_BITS                                            \
        "\177\020"              /* New bitmask format */        \
        "b\037iqv\0"            /* bit 31 */                    \
        "b\036iqf\0"            /* bit 30 */                    \
        "b\035ipv\0"            /* bit 29 */                    \
        "b\034grv\0"            /* bit 28 */                    \
        "b\033crv\0"            /* bit 27 */                    \
        "b\032srv\0"            /* bit 26 */                    \
        "b\031trv\0"            /* bit 25 */
#define PIM_CPU_HPMC_TL(cs)     (((cs) >> 4) & 0x3)
#define PIM_CPU_HPMC_HD         (1 << 3)
#define PIM_CPU_HPMC_SIS        (1 << 2)
#define PIM_CPU_HPMC_CS(cs)     ((cs) & 0x3)
#define PIM_CPU_HPMC_BITS                                       \
        PIM_CPU_BITS                                            \
        "f\004\002tl\0"         /* bit 4 .. 5 */                \
        "b\003hd\0"             /* bit 3 */                     \
        "b\002sis\0"            /* bit 2 */                     \
        "f\000\002cs\0"         /* bit 0 .. 1 */

        uint32_t        pim_check_reserved_0;

        /* The Cache Check word. */
        uint32_t        pim_check_cache;
#define PIM_CACHE_ICC   (1 << 31)
#define PIM_CACHE_DCC   (1 << 30)
#define PIM_CACHE_TC    (1 << 29)
#define PIM_CACHE_DC    (1 << 28)
#define PIM_CACHE_CRG   (1 << 27)
#define PIM_CACHE_LC    (1 << 26)
#define PIM_CACHE_RCC   (1 << 25)
#define PIM_CACHE_PADD(cc)      ((cc) & 0x000fffff)
#define PIM_CACHE_BITS                                          \
        "\177\020"              /* New bitmask format */        \
        "b\037icc\0"            /* bit 31 */                    \
        "b\036dcc\0"            /* bit 30 */                    \
        "b\035tc\0"             /* bit 29 */                    \
        "b\034dc\0"             /* bit 28 */                    \
        "b\033crg\0"            /* bit 27 */                    \
        "b\032lc\0"             /* bit 26 */                    \
        "b\031rcc\0"            /* bit 25 */                    \
        "f\000\030paddr\0"      /* bit 0 .. 23 */

        /* The TLB Check word. */
        uint32_t        pim_check_tlb;
#define PIM_TLB_ITC     (1 << 31)
#define PIM_TLB_DTC     (1 << 30)
#define PIM_TLB_TRG     (1 << 29)
#define PIM_TLB_TUC     (1 << 28)
#define PIM_TLB_TNF     (1 << 27)
#define PIM_TLB_BITS                                            \
        "\177\020"              /* New bitmask format */        \
        "b\037itc\0"            /* bit 31 */                    \
        "b\036dtc\0"            /* bit 30 */                    \
        "b\035trg\0"            /* bit 29 */                    \
        "b\034tuc\0"            /* bit 28 */                    \
        "b\033tnf\0"            /* bit 27 */                    \

        /* The Bus Check word. */
        uint32_t        pim_check_bus;
#define PIM_BUS_RSV             (1 << 21)
#define PIM_BUS_RQV             (1 << 20)
#define PIM_BUS_VAR(bc)         (((bc) >> 16) & 0xf)
#define PIM_BUS_TYPE(bc)        (((bc) >> 12) & 0xf)
#define PIM_BUS_SIZE(bc)        (((bc) >> 8) & 0xf)
#define PIM_BUS_PIV             (1 << 7)
#define PIM_BUS_BSV             (1 << 6)
#define PIM_BUS_STAT(bc)        ((bc) & 0x3f)
#define PIM_BUS_BITS \
        "\177\020"              /* New bitmask format */        \
        "b\025rsv\0"            /* bit 21 */                    \
        "b\024rqv\0"            /* bit 20 */                    \
        "f\020\004var\0"        /* bit 16 .. 19 */              \
        "f\014\004type\0"       /* bit 12 .. 15 */              \
        "f\010\004size\0"       /* bit 8 .. 11 */               \
        "b\007piv\0"            /* bit 7 */                     \
        "b\006bsv\0"            /* bit 6 */                     \
        "f\000\006stat\0"       /* bit 0 .. 5 */

        /* The Assist Check word. */
        uint32_t        pim_check_assist;
#define PIM_ASSIST_COC          (1 << 31)
#define PIM_ASSIST_SC           (1 << 30)
#define PIM_ASSIST_BITS         "\020\037COC\036SC"

        uint32_t        pim_check_reserved_1;

        /* Additional information about the check. */
        uint32_t        pim_check_assist_state;
        uint32_t        pim_check_responder;
        uint32_t        pim_check_requestor;
        uint32_t        pim_check_path_info;
};

/* The PIM data for HPMC and LPMC contains this register array. */
struct hppa_pim_fpregs {

        /* The FPU state. */
        uint64_t        pim_fpregs_fp0;
        uint64_t        pim_fpregs_fp1;
        uint64_t        pim_fpregs_fp2;
        uint64_t        pim_fpregs_fp3;
        uint64_t        pim_fpregs_fp4;
        uint64_t        pim_fpregs_fp5;
        uint64_t        pim_fpregs_fp6;
        uint64_t        pim_fpregs_fp7;
        uint64_t        pim_fpregs_fp8;
        uint64_t        pim_fpregs_fp9;
        uint64_t        pim_fpregs_fp10;
        uint64_t        pim_fpregs_fp11;
        uint64_t        pim_fpregs_fp12;
        uint64_t        pim_fpregs_fp13;
        uint64_t        pim_fpregs_fp14;
        uint64_t        pim_fpregs_fp15;
        uint64_t        pim_fpregs_fp16;
        uint64_t        pim_fpregs_fp17;
        uint64_t        pim_fpregs_fp18;
        uint64_t        pim_fpregs_fp19;
        uint64_t        pim_fpregs_fp20;
        uint64_t        pim_fpregs_fp21;
        uint64_t        pim_fpregs_fp22;
        uint64_t        pim_fpregs_fp23;
        uint64_t        pim_fpregs_fp24;
        uint64_t        pim_fpregs_fp25;
        uint64_t        pim_fpregs_fp26;
        uint64_t        pim_fpregs_fp27;
        uint64_t        pim_fpregs_fp28;
        uint64_t        pim_fpregs_fp29;
        uint64_t        pim_fpregs_fp30;
        uint64_t        pim_fpregs_fp31;
};

/* The HPMC PIM data. */
struct hppa_pim_hpmc {
        struct  hppa_pim_regs pim_hpmc_regs;
        struct  hppa_pim_checks pim_hpmc_checks;
        struct  hppa_pim_fpregs pim_hpmc_fpregs;
};

/* The LPMC PIM data. */
struct hppa_pim_lpmc {
        uint32_t        pim_lpmc_hversion_dep[74];
        struct  hppa_pim_checks pim_lpmc_checks;
        struct  hppa_pim_fpregs pim_lpmc_fpregs;
};

/* The TOC PIM data. */
struct hppa_pim_toc {
        struct  hppa_pim_regs pim_toc_regs;
        uint32_t        pim_toc_hversion_dep;
        uint32_t        pim_toc_cpu_state;
};

struct hppa_pim64_regs {

        /* The general registers. */
        uint64_t        pim_regs_r0;
        uint64_t        pim_regs_r1;
        uint64_t        pim_regs_r2;
        uint64_t        pim_regs_r3;
        uint64_t        pim_regs_r4;
        uint64_t        pim_regs_r5;
        uint64_t        pim_regs_r6;
        uint64_t        pim_regs_r7;
        uint64_t        pim_regs_r8;
        uint64_t        pim_regs_r9;
        uint64_t        pim_regs_r10;
        uint64_t        pim_regs_r11;
        uint64_t        pim_regs_r12;
        uint64_t        pim_regs_r13;
        uint64_t        pim_regs_r14;
        uint64_t        pim_regs_r15;
        uint64_t        pim_regs_r16;
        uint64_t        pim_regs_r17;
        uint64_t        pim_regs_r18;
        uint64_t        pim_regs_r19;
        uint64_t        pim_regs_r20;
        uint64_t        pim_regs_r21;
        uint64_t        pim_regs_r22;
        uint64_t        pim_regs_r23;
        uint64_t        pim_regs_r24;
        uint64_t        pim_regs_r25;
        uint64_t        pim_regs_r26;
        uint64_t        pim_regs_r27;
        uint64_t        pim_regs_r28;
        uint64_t        pim_regs_r29;
        uint64_t        pim_regs_r30;
        uint64_t        pim_regs_r31;

        /* The control registers. */
        uint64_t        pim_regs_cr0;
        uint64_t        pim_regs_cr1;
        uint64_t        pim_regs_cr2;
        uint64_t        pim_regs_cr3;
        uint64_t        pim_regs_cr4;
        uint64_t        pim_regs_cr5;
        uint64_t        pim_regs_cr6;
        uint64_t        pim_regs_cr7;
        uint64_t        pim_regs_cr8;
        uint64_t        pim_regs_cr9;
        uint64_t        pim_regs_cr10;
        uint64_t        pim_regs_cr11;
        uint64_t        pim_regs_cr12;
        uint64_t        pim_regs_cr13;
        uint64_t        pim_regs_cr14;
        uint64_t        pim_regs_cr15;
        uint64_t        pim_regs_cr16;
        uint64_t        pim_regs_cr17;
        uint64_t        pim_regs_cr18;
        uint64_t        pim_regs_cr19;
        uint64_t        pim_regs_cr20;
        uint64_t        pim_regs_cr21;
        uint64_t        pim_regs_cr22;
        uint64_t        pim_regs_cr23;
        uint64_t        pim_regs_cr24;
        uint64_t        pim_regs_cr25;
        uint64_t        pim_regs_cr26;
        uint64_t        pim_regs_cr27;
        uint64_t        pim_regs_cr28;
        uint64_t        pim_regs_cr29;
        uint64_t        pim_regs_cr30;
        uint64_t        pim_regs_cr31;

        /* The space registers. */
        uint64_t        pim_regs_sr0;
        uint64_t        pim_regs_sr1;
        uint64_t        pim_regs_sr2;
        uint64_t        pim_regs_sr3;
        uint64_t        pim_regs_sr4;
        uint64_t        pim_regs_sr5;
        uint64_t        pim_regs_sr6;
        uint64_t        pim_regs_sr7;

        /* The back entries of the instruction address queues. */
        uint64_t        pim_regs_iisq_tail;
        uint64_t        pim_regs_iioq_tail;
};

struct hppa_pim64_checks {
        /* The Check Type. */
        uint32_t        pim_check_type;

        /*
         * The CPU State.  In addition to the common PIM_CPU_
         * bits defined below, some fields are HPMC-specific.
         */
        uint32_t        pim_check_cpu_state;

        /* The Cache Check word. */
        uint32_t        pim_check_cache;

        /* The TLB Check word. */
        uint32_t        pim_check_tlb;

        /* The Bus Check word. */
        uint32_t        pim_check_bus;

        /* The Assist Check word. */
        uint32_t        pim_check_assist;

        /* Additional information about the check. */
        uint32_t        pim_check_assist_state;
        uint32_t        pim_check_path_info;
        uint64_t        pim_check_responder;
        uint64_t        pim_check_requestor;
};

/* The PARISC 2.0 HPMC PIM data. */
struct hppa_pim64_hpmc {
        struct hppa_pim64_regs pim_hpmc_regs;
        struct hppa_pim64_checks pim_hpmc_checks;
        struct hppa_pim_fpregs pim_hpmc_fpregs;
};

/* The PARISC 2.0 LPMC PIM data. */
struct hppa_pim64_lpmc {
        uint64_t pim_lmpc_hversion_dep[74];
        struct hppa_pim64_checks pim_lpmc_checks;
        struct hppa_pim_fpregs pim_lpmc_fpregs;
};

/* The PARISC 2.0 TOC PIM data. */
struct hppa_pim64_toc {
        struct  hppa_pim64_regs pim_toc_regs;
        uint32_t        pim_toc_hversion_dep;
        uint32_t        pim_toc_cpu_state;
};