📄 cim_defs.h
字号:
/*
* <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 + -