On Wed, Oct 16, 2019 at 09:16:41AM +0200, Sebastien Marie wrote:
> uvm_fault(0xffffffff82011010, 0x18, 0, 1) -> e
> kernel: page fault trap, code=0
> Stopped at dc_link_aux_transfer+0x85: movq 0x18(%r14),%rax
> ddb{0}> trace
> dc_link_aux_transfer(ffff80000013c400,0,ffffffff822db9ad,ffffffff822dbb30,1,0)
> at dc_link_aux_transfer+0x85
> dm_dp_aux_transfer(ffff800000a838a0,ffffffff822db9a8) at
> dm_dp_aux_transfer+0xdc
> drm_dp_dpcd_access(ffff800000a838a0,9,0,ffffffff822dbb30,1) at
> drm_dp_dpcd_access+0x8d
> drm_dp_dpcd_read(ffff800000a838a0,0,ffffffff822dbb30,10) at
> drm_dp_dpcd_read+0x45
> dm_helpers_dp_read_dpcd(ffff800000a33000,ffff800000a79800,0,ffffffff822dbb30,10)
> at dm_helpers_dp_read_dpcd+0x43
> core_link_read_dpcd(ffff800000a79800,0,ffffffff822dbb30,10) at
> core_link_read_dpcd+0x2d
> retrieve_link_cap(ffff800000a79800) at retrieve_link_cap+0x40
> dc_link_detect(ffff800000a79800,0) at dc_link_detect+0x99e
> dm_hw_init(ffff80000036d000) at dm_hw_init+0xa96
> amdgpu_device_init(ffff80000036d000,ffff80000037b000,ffff80000037b018,20016)
> at amdgpu_device_init+0x1159
> amdgpu_attachhook(ffff80000036d000) at amdgpu_attachhook+0x3b
> config_process_deferred_mountroot() at config_process_deferred_mountroot+0x6b
> main(0) at main+0x745
> end trace frame: 0x0, count: -13
it fails in dc_link_aux_transfer() function, when calling
aux_engine->funcs->acquire(aux_engine, ddc_pin)
because aux_engine is 0x0.
with debug printf:
> ddc = 0xffff80000013c400
> dcc_pin = 0xffff80000070e160
> ddc_pin->pin_data->en = 3
> ddc->ctx->dc->res_pool->engines = 0xffff80000013adb0
> aux_engine = 0x0
633 int dc_link_aux_transfer(struct ddc_service *ddc,
634 unsigned int address,
635 uint8_t *reply,
636 void *buffer,
637 unsigned int size,
638 enum aux_transaction_type type,
639 enum i2caux_transaction_action action)
640 {
641 struct ddc *ddc_pin = ddc->ddc_pin;
642 struct aux_engine *aux_engine;
643 enum aux_channel_operation_result operation_result;
644 struct aux_request_transaction_data aux_req;
645 struct aux_reply_transaction_data aux_rep;
646 uint8_t returned_bytes = 0;
647 int res = -1;
648 uint32_t status;
649
650 memset(&aux_req, 0, sizeof(aux_req));
651 memset(&aux_rep, 0, sizeof(aux_rep));
652
653 printf("> ddc = %p\n", ddc);
654 printf("> dcc_pin = %p\n", ddc_pin);
655 printf("> ddc_pin->pin_data->en = %d\n", ddc_pin->pin_data->en);
656 printf("> ddc->ctx->dc->res_pool->engines = %p\n",
ddc->ctx->dc->res_pool->engines);
657
658 aux_engine = ddc->ctx->dc->res_pool->engines[ddc_pin->pin_data->en];
659
660 printf("> aux_engine = %p\n", aux_engine);
661 printf("> aux_engine->funcs = %p\n", aux_engine->funcs);
662 printf("> aux_engine->funcs->acquire = %p\n",
aux_engine->funcs->acquire);
663
664 aux_engine->funcs->acquire(aux_engine, ddc_pin);
665
--
Sebastien Marie