msm: kgsl: Add markers to identify IB sequence start and end
Add nop packets in ringbuffer at the start and end of IB buffers subnmitted by user space driver. These nop packets serve as markers that can be used during replay, recovery, and snapshot to get valid data for a GPU hang dump
This commit is contained in:
parent
1672c9446f
commit
d842173fc6
@ -30,8 +30,10 @@
|
||||
#define KGSL_CMD_FLAGS_NOT_KERNEL_CMD 0x00000004
|
||||
|
||||
/* Command identifiers */
|
||||
#define KGSL_CONTEXT_TO_MEM_IDENTIFIER 0xDEADBEEF
|
||||
#define KGSL_CMD_IDENTIFIER 0xFEEDFACE
|
||||
#define KGSL_CONTEXT_TO_MEM_IDENTIFIER 0x2EADBEEF
|
||||
#define KGSL_CMD_IDENTIFIER 0x2EEDFACE
|
||||
#define KGSL_START_OF_IB_IDENTIFIER 0x2EADEABE
|
||||
#define KGSL_END_OF_IB_IDENTIFIER 0x2ABEDEAD
|
||||
|
||||
#ifdef CONFIG_MSM_SCM
|
||||
#define ADRENO_DEFAULT_PWRSCALE_POLICY (&kgsl_pwrscale_policy_tz)
|
||||
@ -117,15 +119,19 @@ static inline int adreno_is_a200(struct adreno_device *adreno_dev)
|
||||
return (adreno_dev->gpurev == ADRENO_REV_A200);
|
||||
}
|
||||
|
||||
static inline int adreno_is_a203(struct adreno_device *adreno_dev)
|
||||
{
|
||||
return (adreno_dev->gpurev == ADRENO_REV_A203);
|
||||
}
|
||||
|
||||
static inline int adreno_is_a205(struct adreno_device *adreno_dev)
|
||||
{
|
||||
return (adreno_dev->gpurev == ADRENO_REV_A200);
|
||||
return (adreno_dev->gpurev == ADRENO_REV_A205);
|
||||
}
|
||||
|
||||
static inline int adreno_is_a20x(struct adreno_device *adreno_dev)
|
||||
{
|
||||
return (adreno_dev->gpurev == ADRENO_REV_A200 ||
|
||||
adreno_dev->gpurev == ADRENO_REV_A205);
|
||||
return (adreno_dev->gpurev <= 209);
|
||||
}
|
||||
|
||||
static inline int adreno_is_a220(struct adreno_device *adreno_dev)
|
||||
|
@ -580,11 +580,12 @@ adreno_ringbuffer_issueibcmds(struct kgsl_device_private *dev_priv,
|
||||
drawctxt);
|
||||
return -EDEADLK;
|
||||
}
|
||||
link = kzalloc(sizeof(unsigned int) * numibs * 3, GFP_KERNEL);
|
||||
cmds = link;
|
||||
|
||||
cmds = link = kzalloc(sizeof(unsigned int) * (numibs * 3 + 4),
|
||||
GFP_KERNEL);
|
||||
if (!link) {
|
||||
KGSL_MEM_ERR(device, "Failed to allocate memory for for command"
|
||||
" submission, size %x\n", numibs * 3);
|
||||
KGSL_CORE_ERR("kzalloc(%d) failed\n",
|
||||
sizeof(unsigned int) * (numibs * 3 + 4));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -596,6 +597,16 @@ adreno_ringbuffer_issueibcmds(struct kgsl_device_private *dev_priv,
|
||||
adreno_dev->drawctxt_active == drawctxt)
|
||||
start_index = 1;
|
||||
|
||||
if (!start_index) {
|
||||
*cmds++ = cp_nop_packet(1);
|
||||
*cmds++ = KGSL_START_OF_IB_IDENTIFIER;
|
||||
} else {
|
||||
*cmds++ = cp_nop_packet(4);
|
||||
*cmds++ = KGSL_START_OF_IB_IDENTIFIER;
|
||||
*cmds++ = CP_HDR_INDIRECT_BUFFER_PFD;
|
||||
*cmds++ = ibdesc[0].gpuaddr;
|
||||
*cmds++ = ibdesc[0].sizedwords;
|
||||
}
|
||||
for (i = start_index; i < numibs; i++) {
|
||||
(void)kgsl_cffdump_parse_ibs(dev_priv, NULL,
|
||||
ibdesc[i].gpuaddr, ibdesc[i].sizedwords, false);
|
||||
@ -605,6 +616,9 @@ adreno_ringbuffer_issueibcmds(struct kgsl_device_private *dev_priv,
|
||||
*cmds++ = ibdesc[i].sizedwords;
|
||||
}
|
||||
|
||||
*cmds++ = cp_nop_packet(1);
|
||||
*cmds++ = KGSL_END_OF_IB_IDENTIFIER;
|
||||
|
||||
kgsl_setstate(device,
|
||||
kgsl_mmu_pt_get_flags(device->mmu.hwpagetable,
|
||||
device->id));
|
||||
|
Loading…
x
Reference in New Issue
Block a user