Merge changes I32e71478,I85895451,I00b0b40b,Ic0dedbad,Ic0dedbad,Ic0dedbad,Ic0dedbad,Ic0dedbad,Ic0dedbad,Ic0dedbad,Ic0dedbad into msm-3.0
* changes: msm: kgsl: Disable ME, PFP split timeout and VFD interrupts. msm: kgsl: Context switch fixes for A3XX msm: board-8064: Fix 8064 GPU clk at 192 Mhz msm: kgsl: Use the right physical addresses in NOMMU mode msm: kgsl: Only use the setstate slowpath for A3XX msm: kgsl: Set the default MMU to 'none' for APQ8064 msm: kgsl: Fix the A3XX debugbus snapshot code msm: kgsl: Enable A3XX GPU hang detection msm: kgsl: A3XX GMEM save/restore was never executed msm: kgsl: Correct the microcode sizes in the GPU snapshot msm: kgsl: Update the GMEM and istore size for A320
This commit is contained in:
committed by
QuIC Gerrit Code Review
commit
f4be39fe8e
@@ -125,14 +125,14 @@ static struct resource kgsl_3d0_resources[] = {
|
|||||||
static struct kgsl_device_platform_data kgsl_3d0_pdata = {
|
static struct kgsl_device_platform_data kgsl_3d0_pdata = {
|
||||||
.pwrlevel = {
|
.pwrlevel = {
|
||||||
{
|
{
|
||||||
.gpu_freq = 400000000,
|
.gpu_freq = 192000000,
|
||||||
.bus_freq = 4,
|
.bus_freq = 2,
|
||||||
.io_fraction = 0,
|
.io_fraction = 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.gpu_freq = 320000000,
|
.gpu_freq = 192000000,
|
||||||
.bus_freq = 3,
|
.bus_freq = 2,
|
||||||
.io_fraction = 33,
|
.io_fraction = 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.gpu_freq = 1920000000,
|
.gpu_freq = 1920000000,
|
||||||
@@ -140,8 +140,9 @@ static struct kgsl_device_platform_data kgsl_3d0_pdata = {
|
|||||||
.io_fraction = 100,
|
.io_fraction = 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.gpu_freq = 27000000,
|
.gpu_freq = 192000000,
|
||||||
.bus_freq = 0,
|
.bus_freq = 2,
|
||||||
|
.io_fraction = 100,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.init_level = 0,
|
.init_level = 0,
|
||||||
|
|||||||
@@ -131,31 +131,35 @@ static const struct {
|
|||||||
struct adreno_gpudev *gpudev;
|
struct adreno_gpudev *gpudev;
|
||||||
unsigned int istore_size;
|
unsigned int istore_size;
|
||||||
unsigned int pix_shader_start;
|
unsigned int pix_shader_start;
|
||||||
|
unsigned int instruction_size; /* Size of an instruction in dwords */
|
||||||
} adreno_gpulist[] = {
|
} adreno_gpulist[] = {
|
||||||
{ ADRENO_REV_A200, 0, 2, ANY_ID, ANY_ID,
|
{ ADRENO_REV_A200, 0, 2, ANY_ID, ANY_ID,
|
||||||
"yamato_pm4.fw", "yamato_pfp.fw", &adreno_a2xx_gpudev,
|
"yamato_pm4.fw", "yamato_pfp.fw", &adreno_a2xx_gpudev,
|
||||||
512, 384},
|
512, 384, 3},
|
||||||
{ ADRENO_REV_A205, 0, 1, 0, ANY_ID,
|
{ ADRENO_REV_A205, 0, 1, 0, ANY_ID,
|
||||||
"yamato_pm4.fw", "yamato_pfp.fw", &adreno_a2xx_gpudev,
|
"yamato_pm4.fw", "yamato_pfp.fw", &adreno_a2xx_gpudev,
|
||||||
512, 384},
|
512, 384, 3},
|
||||||
{ ADRENO_REV_A220, 2, 1, ANY_ID, ANY_ID,
|
{ ADRENO_REV_A220, 2, 1, ANY_ID, ANY_ID,
|
||||||
"leia_pm4_470.fw", "leia_pfp_470.fw", &adreno_a2xx_gpudev,
|
"leia_pm4_470.fw", "leia_pfp_470.fw", &adreno_a2xx_gpudev,
|
||||||
512, 384},
|
512, 384, 3},
|
||||||
/*
|
/*
|
||||||
* patchlevel 5 (8960v2) needs special pm4 firmware to work around
|
* patchlevel 5 (8960v2) needs special pm4 firmware to work around
|
||||||
* a hardware problem.
|
* a hardware problem.
|
||||||
*/
|
*/
|
||||||
{ ADRENO_REV_A225, 2, 2, 0, 5,
|
{ ADRENO_REV_A225, 2, 2, 0, 5,
|
||||||
"a225p5_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev,
|
"a225p5_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev,
|
||||||
1536, 768 },
|
1536, 768, 3 },
|
||||||
{ ADRENO_REV_A225, 2, 2, 0, 6,
|
{ ADRENO_REV_A225, 2, 2, 0, 6,
|
||||||
"a225_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev,
|
"a225_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev,
|
||||||
1536, 768 },
|
1536, 768, 3 },
|
||||||
{ ADRENO_REV_A225, 2, 2, ANY_ID, ANY_ID,
|
{ ADRENO_REV_A225, 2, 2, ANY_ID, ANY_ID,
|
||||||
"a225_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev,
|
"a225_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev,
|
||||||
1536, 768 },
|
1536, 768, 3 },
|
||||||
|
/* A3XX doesn't use the pix_shader_start */
|
||||||
{ ADRENO_REV_A320, 3, 1, ANY_ID, ANY_ID,
|
{ ADRENO_REV_A320, 3, 1, ANY_ID, ANY_ID,
|
||||||
"a300_pm4.fw", "a300_pfp.fw", &adreno_a3xx_gpudev },
|
"a300_pm4.fw", "a300_pfp.fw", &adreno_a3xx_gpudev,
|
||||||
|
512, 0, 2 },
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static irqreturn_t adreno_isr(int irq, void *data)
|
static irqreturn_t adreno_isr(int irq, void *data)
|
||||||
@@ -247,6 +251,16 @@ static void adreno_setstate(struct kgsl_device *device,
|
|||||||
int sizedwords = 0;
|
int sizedwords = 0;
|
||||||
unsigned int mh_mmu_invalidate = 0x00000003; /*invalidate all and tc */
|
unsigned int mh_mmu_invalidate = 0x00000003; /*invalidate all and tc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A3XX doesn't support the fast path (the registers don't even exist)
|
||||||
|
* so just bail out early
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (adreno_is_a3xx(adreno_dev)) {
|
||||||
|
kgsl_mmu_device_setstate(device, flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If possible, then set the state via the command stream to avoid
|
* If possible, then set the state via the command stream to avoid
|
||||||
* a CPU idle. Otherwise, use the default setstate which uses register
|
* a CPU idle. Otherwise, use the default setstate which uses register
|
||||||
@@ -442,6 +456,7 @@ adreno_identify_gpu(struct adreno_device *adreno_dev)
|
|||||||
adreno_dev->pm4_fwfile = adreno_gpulist[i].pm4fw;
|
adreno_dev->pm4_fwfile = adreno_gpulist[i].pm4fw;
|
||||||
adreno_dev->istore_size = adreno_gpulist[i].istore_size;
|
adreno_dev->istore_size = adreno_gpulist[i].istore_size;
|
||||||
adreno_dev->pix_shader_start = adreno_gpulist[i].pix_shader_start;
|
adreno_dev->pix_shader_start = adreno_gpulist[i].pix_shader_start;
|
||||||
|
adreno_dev->instruction_size = adreno_gpulist[i].instruction_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devinit
|
static int __devinit
|
||||||
|
|||||||
@@ -39,12 +39,7 @@
|
|||||||
#define ADRENO_DEFAULT_PWRSCALE_POLICY NULL
|
#define ADRENO_DEFAULT_PWRSCALE_POLICY NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#define ADRENO_ISTORE_START 0x5000 /* Istore offset */
|
||||||
* constants for the size of shader instructions
|
|
||||||
*/
|
|
||||||
#define ADRENO_ISTORE_BYTES 12
|
|
||||||
#define ADRENO_ISTORE_WORDS 3
|
|
||||||
#define ADRENO_ISTORE_START 0x5000
|
|
||||||
|
|
||||||
enum adreno_gpurev {
|
enum adreno_gpurev {
|
||||||
ADRENO_REV_UNKNOWN = 0,
|
ADRENO_REV_UNKNOWN = 0,
|
||||||
@@ -75,6 +70,7 @@ struct adreno_device {
|
|||||||
unsigned int wait_timeout;
|
unsigned int wait_timeout;
|
||||||
unsigned int istore_size;
|
unsigned int istore_size;
|
||||||
unsigned int pix_shader_start;
|
unsigned int pix_shader_start;
|
||||||
|
unsigned int instruction_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct adreno_gpudev {
|
struct adreno_gpudev {
|
||||||
|
|||||||
@@ -164,7 +164,8 @@ const unsigned int a220_registers_count = ARRAY_SIZE(a220_registers) / 2;
|
|||||||
|
|
||||||
static inline int _shader_shadow_size(struct adreno_device *adreno_dev)
|
static inline int _shader_shadow_size(struct adreno_device *adreno_dev)
|
||||||
{
|
{
|
||||||
return adreno_dev->istore_size*ADRENO_ISTORE_BYTES;
|
return adreno_dev->istore_size *
|
||||||
|
(adreno_dev->instruction_size * sizeof(unsigned int));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int _context_size(struct adreno_device *adreno_dev)
|
static inline int _context_size(struct adreno_device *adreno_dev)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ const unsigned int a3xx_registers[] = {
|
|||||||
0x01ea, 0x01ea, 0x01ee, 0x01f1, 0x01f5, 0x01f5, 0x01fc, 0x01ff,
|
0x01ea, 0x01ea, 0x01ee, 0x01f1, 0x01f5, 0x01f5, 0x01fc, 0x01ff,
|
||||||
0x0440, 0x0440, 0x0443, 0x0443, 0x0445, 0x0445, 0x044d, 0x044f,
|
0x0440, 0x0440, 0x0443, 0x0443, 0x0445, 0x0445, 0x044d, 0x044f,
|
||||||
0x0452, 0x0452, 0x0454, 0x046f, 0x047c, 0x047c, 0x047f, 0x047f,
|
0x0452, 0x0452, 0x0454, 0x046f, 0x047c, 0x047c, 0x047f, 0x047f,
|
||||||
0x0579, 0x057f, 0x0600, 0x0602, 0x0605, 0x0607, 0x060a, 0x060e,
|
0x0578, 0x057f, 0x0600, 0x0602, 0x0605, 0x0607, 0x060a, 0x060e,
|
||||||
0x0612, 0x0614, 0x0c01, 0x0c02, 0x0c06, 0x0c1d, 0x0c3d, 0x0c3f,
|
0x0612, 0x0614, 0x0c01, 0x0c02, 0x0c06, 0x0c1d, 0x0c3d, 0x0c3f,
|
||||||
0x0c48, 0x0c4b, 0x0c80, 0x0c80, 0x0c88, 0x0c8b, 0x0ca0, 0x0cb7,
|
0x0c48, 0x0c4b, 0x0c80, 0x0c80, 0x0c88, 0x0c8b, 0x0ca0, 0x0cb7,
|
||||||
0x0cc0, 0x0cc1, 0x0cc6, 0x0cc7, 0x0ce4, 0x0ce5, 0x0e00, 0x0e05,
|
0x0cc0, 0x0cc1, 0x0cc6, 0x0cc7, 0x0ce4, 0x0ce5, 0x0e00, 0x0e05,
|
||||||
@@ -127,13 +127,8 @@ const unsigned int a3xx_registers_count = ARRAY_SIZE(a3xx_registers) / 2;
|
|||||||
#define HLSQ_MEMOBJ_OFFSET 0x400
|
#define HLSQ_MEMOBJ_OFFSET 0x400
|
||||||
#define HLSQ_MIPMAP_OFFSET 0x800
|
#define HLSQ_MIPMAP_OFFSET 0x800
|
||||||
|
|
||||||
#ifdef GSL_USE_A3XX_HLSQ_SHADOW_RAM
|
|
||||||
/* Use shadow RAM */
|
/* Use shadow RAM */
|
||||||
#define HLSQ_SHADOW_BASE (0x10000+SSIZE*2)
|
#define HLSQ_SHADOW_BASE (0x10000+SSIZE*2)
|
||||||
#else
|
|
||||||
/* Use working RAM */
|
|
||||||
#define HLSQ_SHADOW_BASE 0x10000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define REG_TO_MEM_LOOP_COUNT_SHIFT 15
|
#define REG_TO_MEM_LOOP_COUNT_SHIFT 15
|
||||||
|
|
||||||
@@ -258,7 +253,7 @@ static void build_regconstantsave_cmds(struct adreno_device *adreno_dev,
|
|||||||
struct adreno_context *drawctxt)
|
struct adreno_context *drawctxt)
|
||||||
{
|
{
|
||||||
unsigned int *cmd = tmp_ctx.cmd;
|
unsigned int *cmd = tmp_ctx.cmd;
|
||||||
unsigned int *start = cmd;
|
unsigned int *start;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
drawctxt->constant_save_commands[0].hostptr = cmd;
|
drawctxt->constant_save_commands[0].hostptr = cmd;
|
||||||
@@ -266,6 +261,8 @@ static void build_regconstantsave_cmds(struct adreno_device *adreno_dev,
|
|||||||
virt2gpu(cmd, &drawctxt->gpustate);
|
virt2gpu(cmd, &drawctxt->gpustate);
|
||||||
cmd++;
|
cmd++;
|
||||||
|
|
||||||
|
start = cmd;
|
||||||
|
|
||||||
*cmd++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
|
*cmd++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
|
||||||
*cmd++ = 0;
|
*cmd++ = 0;
|
||||||
|
|
||||||
@@ -1313,7 +1310,8 @@ static unsigned int *build_sys2gmem_cmds(struct adreno_device *adreno_dev,
|
|||||||
_SET(SP_FSCTRLREG1_FSINITIALOUTSTANDING, 2) |
|
_SET(SP_FSCTRLREG1_FSINITIALOUTSTANDING, 2) |
|
||||||
_SET(SP_FSCTRLREG1_HALFPRECVAROFFSET, 63);
|
_SET(SP_FSCTRLREG1_HALFPRECVAROFFSET, 63);
|
||||||
/* SP_FS_OBJ_OFFSET_REG */
|
/* SP_FS_OBJ_OFFSET_REG */
|
||||||
*cmds++ = _SET(SP_OBJOFFSETREG_CONSTOBJECTSTARTOFFSET, 128);
|
*cmds++ = _SET(SP_OBJOFFSETREG_CONSTOBJECTSTARTOFFSET, 128) |
|
||||||
|
_SET(SP_OBJOFFSETREG_SHADEROBJOFFSETINIC, 1);
|
||||||
/* SP_FS_OBJ_START_REG */
|
/* SP_FS_OBJ_START_REG */
|
||||||
*cmds++ = 0x00000000;
|
*cmds++ = 0x00000000;
|
||||||
|
|
||||||
@@ -1329,7 +1327,7 @@ static unsigned int *build_sys2gmem_cmds(struct adreno_device *adreno_dev,
|
|||||||
/* SP_FS_OUT_REG */
|
/* SP_FS_OUT_REG */
|
||||||
*cmds++ = _SET(SP_FSOUTREG_PAD0, SP_PIXEL_BASED);
|
*cmds++ = _SET(SP_FSOUTREG_PAD0, SP_PIXEL_BASED);
|
||||||
|
|
||||||
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
|
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
|
||||||
*cmds++ = CP_REG(A3XX_SP_FS_MRT_REG_0);
|
*cmds++ = CP_REG(A3XX_SP_FS_MRT_REG_0);
|
||||||
/* SP_FS_MRT_REG0 */
|
/* SP_FS_MRT_REG0 */
|
||||||
*cmds++ = _SET(SP_FSMRTREG_REGID, 4);
|
*cmds++ = _SET(SP_FSMRTREG_REGID, 4);
|
||||||
@@ -1426,7 +1424,7 @@ static unsigned int *build_sys2gmem_cmds(struct adreno_device *adreno_dev,
|
|||||||
_SET(VPC_VPCVARPSREPLMODE_COMPONENT16, 1) |
|
_SET(VPC_VPCVARPSREPLMODE_COMPONENT16, 1) |
|
||||||
_SET(VPC_VPCVARPSREPLMODE_COMPONENT17, 2);
|
_SET(VPC_VPCVARPSREPLMODE_COMPONENT17, 2);
|
||||||
|
|
||||||
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 11);
|
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
|
||||||
*cmds++ = CP_REG(A3XX_SP_SP_CTRL_REG);
|
*cmds++ = CP_REG(A3XX_SP_SP_CTRL_REG);
|
||||||
/* SP_SP_CTRL_REG */
|
/* SP_SP_CTRL_REG */
|
||||||
*cmds++ = _SET(SP_SPCTRLREG_SLEEPMODE, 1);
|
*cmds++ = _SET(SP_SPCTRLREG_SLEEPMODE, 1);
|
||||||
@@ -1652,7 +1650,9 @@ static unsigned int *build_sys2gmem_cmds(struct adreno_device *adreno_dev,
|
|||||||
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
|
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
|
||||||
*cmds++ = CP_REG(A3XX_GRAS_SC_CONTROL);
|
*cmds++ = CP_REG(A3XX_GRAS_SC_CONTROL);
|
||||||
/* GRAS_SC_CONTROL */
|
/* GRAS_SC_CONTROL */
|
||||||
*cmds++ = _SET(GRAS_SC_CONTROL_RASTER_MODE, 1);
|
/*cmds++ = _SET(GRAS_SC_CONTROL_RASTER_MODE, 1);
|
||||||
|
*cmds++ = _SET(GRAS_SC_CONTROL_RASTER_MODE, 1) |*/
|
||||||
|
*cmds++ = 0x04001000;
|
||||||
|
|
||||||
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
|
*cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
|
||||||
*cmds++ = CP_REG(A3XX_GRAS_SU_MODE_CONTROL);
|
*cmds++ = CP_REG(A3XX_GRAS_SU_MODE_CONTROL);
|
||||||
@@ -2130,24 +2130,17 @@ static int a3xx_create_gpustate_shadow(struct adreno_device *adreno_dev,
|
|||||||
static int a3xx_create_gmem_shadow(struct adreno_device *adreno_dev,
|
static int a3xx_create_gmem_shadow(struct adreno_device *adreno_dev,
|
||||||
struct adreno_context *drawctxt)
|
struct adreno_context *drawctxt)
|
||||||
{
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
calc_gmemsize(&drawctxt->context_gmem_shadow,
|
calc_gmemsize(&drawctxt->context_gmem_shadow,
|
||||||
adreno_dev->gmemspace.sizebytes);
|
adreno_dev->gmemspace.sizebytes);
|
||||||
tmp_ctx.gmem_base = adreno_dev->gmemspace.gpu_base;
|
tmp_ctx.gmem_base = adreno_dev->gmemspace.gpu_base;
|
||||||
|
|
||||||
if (drawctxt->flags & CTXT_FLAGS_GMEM_SHADOW) {
|
result = kgsl_allocate(&drawctxt->context_gmem_shadow.gmemshadow,
|
||||||
int result =
|
drawctxt->pagetable, drawctxt->context_gmem_shadow.size);
|
||||||
kgsl_allocate(&drawctxt->context_gmem_shadow.gmemshadow,
|
|
||||||
drawctxt->pagetable,
|
|
||||||
drawctxt->context_gmem_shadow.size);
|
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
} else {
|
|
||||||
memset(&drawctxt->context_gmem_shadow.gmemshadow, 0,
|
|
||||||
sizeof(drawctxt->context_gmem_shadow.gmemshadow));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
build_quad_vtxbuff(drawctxt, &drawctxt->context_gmem_shadow,
|
build_quad_vtxbuff(drawctxt, &drawctxt->context_gmem_shadow,
|
||||||
&tmp_ctx.cmd);
|
&tmp_ctx.cmd);
|
||||||
@@ -2163,6 +2156,8 @@ static int a3xx_create_gmem_shadow(struct adreno_device *adreno_dev,
|
|||||||
kgsl_cache_range_op(&drawctxt->context_gmem_shadow.gmemshadow,
|
kgsl_cache_range_op(&drawctxt->context_gmem_shadow.gmemshadow,
|
||||||
KGSL_CACHE_OP_FLUSH);
|
KGSL_CACHE_OP_FLUSH);
|
||||||
|
|
||||||
|
drawctxt->flags |= CTXT_FLAGS_GMEM_SHADOW;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2431,10 +2426,7 @@ static void a3xx_cp_callback(struct adreno_device *adreno_dev, int irq)
|
|||||||
#define A3XX_INT_MASK \
|
#define A3XX_INT_MASK \
|
||||||
((1 << A3XX_INT_RBBM_AHB_ERROR) | \
|
((1 << A3XX_INT_RBBM_AHB_ERROR) | \
|
||||||
(1 << A3XX_INT_RBBM_REG_TIMEOUT) | \
|
(1 << A3XX_INT_RBBM_REG_TIMEOUT) | \
|
||||||
(1 << A3XX_INT_RBBM_ME_MS_TIMEOUT) | \
|
|
||||||
(1 << A3XX_INT_RBBM_PFP_MS_TIMEOUT) | \
|
|
||||||
(1 << A3XX_INT_RBBM_ATB_BUS_OVERFLOW) | \
|
(1 << A3XX_INT_RBBM_ATB_BUS_OVERFLOW) | \
|
||||||
(1 << A3XX_INT_VFD_ERROR) | \
|
|
||||||
(1 << A3XX_INT_CP_T0_PACKET_IN_IB) | \
|
(1 << A3XX_INT_CP_T0_PACKET_IN_IB) | \
|
||||||
(1 << A3XX_INT_CP_OPCODE_ERROR) | \
|
(1 << A3XX_INT_CP_OPCODE_ERROR) | \
|
||||||
(1 << A3XX_INT_CP_RESERVED_BIT_ERROR) | \
|
(1 << A3XX_INT_CP_RESERVED_BIT_ERROR) | \
|
||||||
@@ -2444,7 +2436,6 @@ static void a3xx_cp_callback(struct adreno_device *adreno_dev, int irq)
|
|||||||
(1 << A3XX_INT_CP_RB_INT) | \
|
(1 << A3XX_INT_CP_RB_INT) | \
|
||||||
(1 << A3XX_INT_CP_REG_PROTECT_FAULT) | \
|
(1 << A3XX_INT_CP_REG_PROTECT_FAULT) | \
|
||||||
(1 << A3XX_INT_CP_AHB_ERROR_HALT) | \
|
(1 << A3XX_INT_CP_AHB_ERROR_HALT) | \
|
||||||
(1 << A3XX_INT_MISC_HANG_DETECT) | \
|
|
||||||
(1 << A3XX_INT_UCHE_OOB_ACCESS))
|
(1 << A3XX_INT_UCHE_OOB_ACCESS))
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
@@ -2474,7 +2465,7 @@ static struct {
|
|||||||
A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 21 - CP_AHB_ERROR_FAULT */
|
A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 21 - CP_AHB_ERROR_FAULT */
|
||||||
A3XX_IRQ_CALLBACK(NULL), /* 22 - Unused */
|
A3XX_IRQ_CALLBACK(NULL), /* 22 - Unused */
|
||||||
A3XX_IRQ_CALLBACK(NULL), /* 23 - Unused */
|
A3XX_IRQ_CALLBACK(NULL), /* 23 - Unused */
|
||||||
A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 24 - MISC_HANG_DETECT */
|
A3XX_IRQ_CALLBACK(NULL), /* 24 - MISC_HANG_DETECT */
|
||||||
A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 25 - UCHE_OOB_ACCESS */
|
A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 25 - UCHE_OOB_ACCESS */
|
||||||
/* 26 to 31 - Unused */
|
/* 26 to 31 - Unused */
|
||||||
};
|
};
|
||||||
@@ -2547,6 +2538,9 @@ static void a3xx_start(struct adreno_device *adreno_dev)
|
|||||||
{
|
{
|
||||||
struct kgsl_device *device = &adreno_dev->dev;
|
struct kgsl_device *device = &adreno_dev->dev;
|
||||||
|
|
||||||
|
/* GMEM size on A320 is 512K */
|
||||||
|
adreno_dev->gmemspace.sizebytes = SZ_512K;
|
||||||
|
|
||||||
/* Reset the core */
|
/* Reset the core */
|
||||||
adreno_regwrite(device, A3XX_RBBM_SW_RESET_CMD,
|
adreno_regwrite(device, A3XX_RBBM_SW_RESET_CMD,
|
||||||
0x00000001);
|
0x00000001);
|
||||||
@@ -2570,10 +2564,17 @@ static void a3xx_start(struct adreno_device *adreno_dev)
|
|||||||
adreno_regwrite(device, A3XX_RBBM_AHB_CTL0, 0x00000001);
|
adreno_regwrite(device, A3XX_RBBM_AHB_CTL0, 0x00000001);
|
||||||
|
|
||||||
/* Enable AHB error reporting */
|
/* Enable AHB error reporting */
|
||||||
adreno_regwrite(device, A3XX_RBBM_AHB_CTL1, 0xA6FFFFFF);
|
adreno_regwrite(device, A3XX_RBBM_AHB_CTL1, 0x86FFFFFF);
|
||||||
|
|
||||||
/* Turn on the power counters */
|
/* Turn on the power counters */
|
||||||
adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, 0x00003000);
|
adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, 0x00003000);
|
||||||
|
|
||||||
|
/* Turn on hang detection - this spews a lot of useful information
|
||||||
|
* into the RBBM registers on a hang */
|
||||||
|
|
||||||
|
adreno_regwrite(device, A3XX_RBBM_INTERFACE_HANG_INT_CTL,
|
||||||
|
(1 << 16) | 0xFFF);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Defined in adreno_a3xx_snapshot.c */
|
/* Defined in adreno_a3xx_snapshot.c */
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ static int a3xx_snapshot_cp_pm4_ram(struct kgsl_device *device, void *snapshot,
|
|||||||
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
||||||
struct kgsl_snapshot_debug *header = snapshot;
|
struct kgsl_snapshot_debug *header = snapshot;
|
||||||
unsigned int *data = snapshot + sizeof(*header);
|
unsigned int *data = snapshot + sizeof(*header);
|
||||||
int i, size = adreno_dev->pm4_fw_size >> 2;
|
int i, size = adreno_dev->pm4_fw_size - 1;
|
||||||
|
|
||||||
if (remain < DEBUG_SECTION_SZ(size)) {
|
if (remain < DEBUG_SECTION_SZ(size)) {
|
||||||
SNAPSHOT_ERR_NOMEM(device, "CP PM4 RAM DEBUG");
|
SNAPSHOT_ERR_NOMEM(device, "CP PM4 RAM DEBUG");
|
||||||
@@ -98,7 +98,7 @@ static int a3xx_snapshot_cp_pm4_ram(struct kgsl_device *device, void *snapshot,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
adreno_regwrite(device, REG_CP_ME_RAM_RADDR, 0x0);
|
adreno_regwrite(device, REG_CP_ME_RAM_RADDR, 0x0);
|
||||||
for (i = 0; i < adreno_dev->pm4_fw_size >> 2; i++)
|
for (i = 0; i < size; i++)
|
||||||
adreno_regread(device, REG_CP_ME_RAM_DATA, &data[i]);
|
adreno_regread(device, REG_CP_ME_RAM_DATA, &data[i]);
|
||||||
|
|
||||||
return DEBUG_SECTION_SZ(size);
|
return DEBUG_SECTION_SZ(size);
|
||||||
@@ -110,7 +110,7 @@ static int a3xx_snapshot_cp_pfp_ram(struct kgsl_device *device, void *snapshot,
|
|||||||
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
||||||
struct kgsl_snapshot_debug *header = snapshot;
|
struct kgsl_snapshot_debug *header = snapshot;
|
||||||
unsigned int *data = snapshot + sizeof(*header);
|
unsigned int *data = snapshot + sizeof(*header);
|
||||||
int i, size = adreno_dev->pfp_fw_size >> 2;
|
int i, size = adreno_dev->pfp_fw_size - 1;
|
||||||
|
|
||||||
if (remain < DEBUG_SECTION_SZ(size)) {
|
if (remain < DEBUG_SECTION_SZ(size)) {
|
||||||
SNAPSHOT_ERR_NOMEM(device, "CP PFP RAM DEBUG");
|
SNAPSHOT_ERR_NOMEM(device, "CP PFP RAM DEBUG");
|
||||||
@@ -127,7 +127,7 @@ static int a3xx_snapshot_cp_pfp_ram(struct kgsl_device *device, void *snapshot,
|
|||||||
* maintain always changing hardcoded constants
|
* maintain always changing hardcoded constants
|
||||||
*/
|
*/
|
||||||
kgsl_regwrite(device, A3XX_CP_PFP_UCODE_ADDR, 0x0);
|
kgsl_regwrite(device, A3XX_CP_PFP_UCODE_ADDR, 0x0);
|
||||||
for (i = 0; i < adreno_dev->pfp_fw_size >> 2; i++)
|
for (i = 0; i < size; i++)
|
||||||
adreno_regread(device, A3XX_CP_PFP_UCODE_DATA, &data[i]);
|
adreno_regread(device, A3XX_CP_PFP_UCODE_DATA, &data[i]);
|
||||||
|
|
||||||
return DEBUG_SECTION_SZ(size);
|
return DEBUG_SECTION_SZ(size);
|
||||||
@@ -175,7 +175,7 @@ static int a3xx_snapshot_debugbus_block(struct kgsl_device *device,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = (id << 0x06) | (1 << 0x10);
|
val = (id << 8) | (1 << 16);
|
||||||
|
|
||||||
header->id = id;
|
header->id = id;
|
||||||
header->count = DEBUGFS_BLOCK_SIZE;
|
header->count = DEBUGFS_BLOCK_SIZE;
|
||||||
|
|||||||
@@ -143,7 +143,8 @@ static ssize_t kgsl_istore_read(
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
adreno_dev = ADRENO_DEVICE(device);
|
adreno_dev = ADRENO_DEVICE(device);
|
||||||
count = adreno_dev->istore_size * ADRENO_ISTORE_WORDS;
|
count = adreno_dev->istore_size * adreno_dev->instruction_size;
|
||||||
|
|
||||||
remaining = count;
|
remaining = count;
|
||||||
for (i = 0; i < count; i += rowc) {
|
for (i = 0; i < count; i += rowc) {
|
||||||
unsigned int vals[rowc];
|
unsigned int vals[rowc];
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ static void set_gmem_copy_quad(struct gmem_shadow_t *shadow)
|
|||||||
gmem_restore_quad[7] = uint2float(shadow->width);
|
gmem_restore_quad[7] = uint2float(shadow->width);
|
||||||
|
|
||||||
memcpy(shadow->quad_vertices.hostptr, gmem_copy_quad, QUAD_LEN << 2);
|
memcpy(shadow->quad_vertices.hostptr, gmem_copy_quad, QUAD_LEN << 2);
|
||||||
memcpy(shadow->quad_vertices_restore.hostptr, gmem_copy_quad,
|
memcpy(shadow->quad_vertices_restore.hostptr, gmem_restore_quad,
|
||||||
QUAD_RESTORE_LEN << 2);
|
QUAD_RESTORE_LEN << 2);
|
||||||
|
|
||||||
memcpy(shadow->quad_texcoords.hostptr, gmem_copy_texcoord,
|
memcpy(shadow->quad_texcoords.hostptr, gmem_copy_texcoord,
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ static int snapshot_istore(struct kgsl_device *device, void *snapshot,
|
|||||||
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
|
||||||
int count, i;
|
int count, i;
|
||||||
|
|
||||||
count = adreno_dev->istore_size * ADRENO_ISTORE_WORDS;
|
count = adreno_dev->istore_size * adreno_dev->instruction_size;
|
||||||
|
|
||||||
if (remain < (count * 4) + sizeof(*header)) {
|
if (remain < (count * 4) + sizeof(*header)) {
|
||||||
KGSL_DRV_ERR(device,
|
KGSL_DRV_ERR(device,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/iommu.h>
|
#include <linux/iommu.h>
|
||||||
|
#include <mach/socinfo.h>
|
||||||
|
|
||||||
#include "kgsl.h"
|
#include "kgsl.h"
|
||||||
#include "kgsl_mmu.h"
|
#include "kgsl_mmu.h"
|
||||||
@@ -534,9 +535,16 @@ kgsl_mmu_map(struct kgsl_pagetable *pagetable,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (kgsl_mmu_type == KGSL_MMU_TYPE_NONE) {
|
if (kgsl_mmu_type == KGSL_MMU_TYPE_NONE) {
|
||||||
memdesc->gpuaddr = memdesc->physaddr;
|
if (memdesc->sglen == 1) {
|
||||||
return 0;
|
memdesc->gpuaddr = sg_phys(memdesc->sg);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
KGSL_CORE_ERR("Memory is not contigious "
|
||||||
|
"(sglen = %d)\n", memdesc->sglen);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memdesc->gpuaddr = gen_pool_alloc_aligned(pagetable->pool,
|
memdesc->gpuaddr = gen_pool_alloc_aligned(pagetable->pool,
|
||||||
memdesc->size, KGSL_MMU_ALIGN_SHIFT);
|
memdesc->size, KGSL_MMU_ALIGN_SHIFT);
|
||||||
|
|
||||||
@@ -712,7 +720,14 @@ EXPORT_SYMBOL(kgsl_mmu_get_mmutype);
|
|||||||
|
|
||||||
void kgsl_mmu_set_mmutype(char *mmutype)
|
void kgsl_mmu_set_mmutype(char *mmutype)
|
||||||
{
|
{
|
||||||
kgsl_mmu_type = iommu_found() ? KGSL_MMU_TYPE_IOMMU : KGSL_MMU_TYPE_GPU;
|
/* Set the default MMU - GPU on <=8960 and nothing on >= 8064 */
|
||||||
|
kgsl_mmu_type =
|
||||||
|
cpu_is_apq8064() ? KGSL_MMU_TYPE_NONE : KGSL_MMU_TYPE_GPU;
|
||||||
|
|
||||||
|
/* Use the IOMMU if it is found */
|
||||||
|
if (iommu_found())
|
||||||
|
kgsl_mmu_type = KGSL_MMU_TYPE_IOMMU;
|
||||||
|
|
||||||
if (mmutype && !strncmp(mmutype, "gpummu", 6))
|
if (mmutype && !strncmp(mmutype, "gpummu", 6))
|
||||||
kgsl_mmu_type = KGSL_MMU_TYPE_GPU;
|
kgsl_mmu_type = KGSL_MMU_TYPE_GPU;
|
||||||
if (iommu_found() && mmutype && !strncmp(mmutype, "iommu", 5))
|
if (iommu_found() && mmutype && !strncmp(mmutype, "iommu", 5))
|
||||||
|
|||||||
Reference in New Issue
Block a user