⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cim_defs.h

📁 LX 800 WindowsCE 6.0 BSP
💻 H
📖 第 1 页 / 共 3 页
字号:
 /*
  * <LIC_AMD_STD>
  * Copyright (C) 2005 Advanced Micro Devices, Inc.  All Rights Reserved.
  * </LIC_AMD_STD>
  * 
  * <CTL_AMD_STD>
  * </CTL_AMD_STD>
  * 
  * <DOC_AMD_STD>
  * Cimarron hardware access macros.
  * </DOC_AMD_STD>
  * 
  */

#ifndef _cim_defs_h
#define _cim_defs_h

/*-----------------------------------------*/
/*          MEMORY ACCESS MACROS           */
/*-----------------------------------------*/

#ifndef CIMARRON_EXCLUDE_REGISTER_ACCESS_MACROS

#define READ_GP32(offset) \
    (*(volatile unsigned long *)(cim_gp_ptr + (offset)))

#define READ_REG32(offset) \
    (*(volatile unsigned long *)(cim_vg_ptr + (offset)))

#define READ_FB32(offset) \
    (*(volatile unsigned long *)(cim_fb_ptr + (offset)))

#define WRITE_GP32(offset, value) \
	(*(volatile unsigned long *)(cim_gp_ptr + (offset))) = (value)

#define WRITE_REG32(offset, value) \
	(*(volatile unsigned long *)(cim_vg_ptr + (offset))) = (value)

#define WRITE_COMMAND32(offset, value) \
	(*(unsigned long *)(cim_cmd_ptr + (offset))) = (value)

#define WRITE_COMMAND8(offset, value) \
	(*(unsigned char *)(cim_cmd_ptr + (offset))) = (value)

#define WRITE_FB32(offset, value) \
	(*(unsigned long *)(cim_fb_ptr + (offset))) = (value)

#define READ_VID32(offset) \
    (*(volatile unsigned long *)(cim_vid_ptr + (offset)))

#define WRITE_VID32(offset, value) \
	(*(volatile unsigned long *)(cim_vid_ptr + (offset))) = (value)

#define READ_VIP32(offset) \
    (*(volatile unsigned long *)(cim_vip_ptr + (offset)))

#define WRITE_VIP32(offset, value) \
	(*(volatile unsigned long *)(cim_vip_ptr + (offset))) = (value)

#define READ_VOP32(offset) \
    (*(volatile unsigned long *)(cim_vid_ptr + (offset)))

#define WRITE_VOP32(offset, value) \
	(*(volatile unsigned long *)(cim_vid_ptr + (offset))) = (value)

#endif

/*-----------------------------------------*/
/*            GP POLLING MACROS            */
/*-----------------------------------------*/

#define GP3_WAIT_WRAP(variable) \
	while(((variable = READ_GP32 (GP3_CMD_READ)) > gp3_cmd_current) || \
           (variable <= (gp3_cmd_top + GP3_BLT_COMMAND_SIZE + GP3_BLT_COMMAND_SIZE + 96)))

#define GP3_WAIT_PRIMITIVE(variable) \
	while (((variable = READ_GP32 (GP3_CMD_READ)) > gp3_cmd_current) && \
            (variable <= (gp3_cmd_next + 96)))

#define GP3_WAIT_BUSY \
	while(READ_GP32 (GP3_BLT_STATUS) & GP3_BS_BLT_BUSY)

#define GP3_WAIT_PENDING \
	while(READ_GP32 (GP3_BLT_STATUS) & GP3_BS_BLT_PENDING)

/*-----------------------------------------------------------------*/
/* MSR MACROS                                                      */
/* These macros facilitate interaction with the model specific     */
/* registers in GeodeLX.  There are two included methods, direct   */
/* access using the rdmsr and wrmsr opcodes and an indirect method */
/* using VSAII.                                                    */
/*-----------------------------------------------------------------*/

#ifdef CIMARRON_INCLUDE_MSR_MACROS

#if CIMARRON_MSR_DIRECT_ASM

/*-----------------------------------------------------------------
 * MSR_READ
 * Read the contents of a 64 bit MSR into a data structure
 *-----------------------------------------------------------------*/

#define MSR_READ(msr_reg, device_add, data64_ptr)                                   \
{                                                                                   \
	unsigned long msr_add = (unsigned long)(msr_reg) | (unsigned long)(device_add); \
	unsigned long data_high, data_low;                                              \
	_asm { mov ecx, msr_add   }                                                     \
	_asm { rdmsr              }                                                     \
	_asm { mov data_high, edx }                                                     \
	_asm { mov data_low,  eax }                                                     \
	                                                                                \
	((Q_WORD *)(data64_ptr))->high = data_high;                                     \
	((Q_WORD *)(data64_ptr))->low  = data_low;                                      \
}

/*-----------------------------------------------------------------
 * MSR_WRITE
 * Write the contents of a 64 bit data structure to a MSR.
 *-----------------------------------------------------------------*/

#define MSR_WRITE(msr_reg, device_add, data64_ptr)                                  \
{                                                                                   \
	unsigned long msr_add = (unsigned long)(msr_reg) | (unsigned long)(device_add); \
	unsigned long data_high, data_low;                                              \
	                                                                                \
	data_high = ((Q_WORD *)(data64_ptr))->high;                                     \
	data_low  = ((Q_WORD *)(data64_ptr))->low;                                      \
		                                                                            \
	_asm { mov ecx, msr_add   }                                                     \
	_asm { mov edx, data_high }                                                     \
	_asm { mov eax, data_low  }                                                     \
	_asm { wrmsr              }                                                     \
}

#elif CIMARRON_MSR_VSA_IO

/*-----------------------------------------------------------------
 * MSR_READ
 * Read the contents of a 64 bit MSR into a data structure
 *-----------------------------------------------------------------*/

#define MSR_READ(msr_reg, device_add, data64_ptr)                                   \
{                                                                                   \
	unsigned long msr_add = (unsigned long)(msr_reg) | (unsigned long)(device_add); \
	unsigned long data_high, data_low;                                              \
		                                                                            \
	_asm { mov    dx,  0x0AC1C      } 	                                            \
	_asm { mov    eax, 0x0FC530007  }                                               \
	_asm { out    dx, eax           }                                               \
		                                                                            \
	_asm { add    dl, 2             }                                               \
	_asm { mov    ecx, msr_add      }                                               \
	_asm { in     ax, dx            }                                               \
	_asm { mov    data_high, edx    }                                               \
	_asm { mov    data_low, eax     }                                               \
		                                                                            \
	((Q_WORD *)(data64_ptr))->high = data_high;                                     \
	((Q_WORD *)(data64_ptr))->low  = data_low;                                      \
}

/*-----------------------------------------------------------------
 * MSR_WRITE
 * Write the contents of a 64 bit data structure to a MSR.
 *-----------------------------------------------------------------*/

#define MSR_WRITE(msr_reg, device_add, data64_ptr)                                  \
{                                                                                   \
	unsigned long msr_add = (unsigned long)(msr_reg) | (unsigned long)(device_add); \
	unsigned long data_high, data_low;                                              \
		                                                                            \
	data_high = ((Q_WORD *)(data64_ptr))->high;                                     \
	data_low  = ((Q_WORD *)(data64_ptr))->low;                                      \
		                                                                            \
	_asm { mov    dx,  0x0AC1C      } 	                                            \
	_asm { mov    eax, 0x0FC530007  }                                               \
	_asm { out    dx, eax           }                                               \
		                                                                            \
	_asm { add    dl, 2             }                                               \
	_asm { mov    ecx, msr_add      }                                               \
	_asm { mov    ebx, data_high    }                                               \
	_asm { mov    eax, data_low }                                                   \
		                                                                            \
	_asm { mov    esi, 0 }                                                          \
	_asm { mov    edi, 0 }                                                          \
	_asm { out    dx, ax }                                                          \
}

#elif CIMARRON_MSR_ABSTRACTED_ASM

/*-----------------------------------------------------------------
 * MSR_READ
 * Read the contents of a 64 bit MSR into a data structure
 *-----------------------------------------------------------------*/

#define MSR_READ(msr,adr,val)                   \
     __asm__ __volatile__(                      \
        " mov $0x0AC1C, %%edx\n"                \
        " mov $0xFC530007, %%eax\n"             \
        " out %%eax,%%dx\n"                     \
        " add $2,%%dl\n"                        \
        " in %%dx, %%ax"                        \
        : "=a" ((val)->low), "=d" ((val)->high) \
        : "c" (msr | adr))

/*-----------------------------------------------------------------
 * MSR_WRITE
 * Write the contents of a 64 bit data structure to a MSR.
 *-----------------------------------------------------------------*/

#define MSR_WRITE(msr,adr,val)                                      \
     { int d0, d1, d2, d3, d4;                                      \
     __asm__ __volatile__(                                          \
        " mov $0x0AC1C, %%edx\n"                                    \
        " mov $0xFC530007, %%eax\n"                                 \
        " out %%eax,%%dx\n"                                         \
        " add $2,%%dl\n"                                            \
        " mov %5, %4\n"                                             \
        " mov 0(%6), %1\n"                                          \
        " mov 4(%6), %0\n"                                          \
        " xor %3, %3\n"                                             \
        " xor %2, %2\n"                                             \
        " out %%ax, %%dx"                                           \
        : "=a" (d0), "=b" (d1), "=&D" (d2), "=&S" (d3), "=c" (d4)   \
        : "2" (msr | adr), "3" (val));                              \
     }

#elif CIMARRON_MSR_KERNEL_ROUTINE

#include "asm/msr.h"

/*-----------------------------------------------------------------
 * MSR_READ
 * Read the contents of a 64 bit MSR into a data structure
 *-----------------------------------------------------------------*/

#define MSR_READ(msr_reg, device_add, data64_ptr)                                   \
{                                                                                   \
    unsigned long addr, val1, val2;                                                 \
                                                                                    \
	addr = device_add | msr_reg;                                                    \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -