/* Expects AFU struct to have recently been zeroed out */ static int cxl_read_afu_descriptor(struct cxl_afu *afu) { u64 val; val = AFUD_READ_INFO(afu); afu->pp_irqs = AFUD_NUM_INTS_PER_PROC(val); afu->max_procs_virtualised = AFUD_NUM_PROCS(val); afu->crs_num = AFUD_NUM_CRS(val); if (AFUD_AFU_DIRECTED(val)) afu->modes_supported |= CXL_MODE_DIRECTED; if (AFUD_DEDICATED_PROCESS(val)) afu->modes_supported |= CXL_MODE_DEDICATED; if (AFUD_TIME_SLICED(val)) afu->modes_supported |= CXL_MODE_TIME_SLICED; val = AFUD_READ_PPPSA(afu); afu->pp_size = AFUD_PPPSA_LEN(val) * 4096; afu->psa = AFUD_PPPSA_PSA(val); if ((afu->pp_psa = AFUD_PPPSA_PP(val))) afu->pp_offset = AFUD_READ_PPPSA_OFF(afu); val = AFUD_READ_CR(afu); afu->crs_len = AFUD_CR_LEN(val) * 256; afu->crs_offset = AFUD_READ_CR_OFF(afu); return 0; }
/* Expects AFU struct to have recently been zeroed out */ static int cxl_read_afu_descriptor(struct cxl_afu *afu) { u64 val; val = AFUD_READ_INFO(afu); afu->pp_irqs = AFUD_NUM_INTS_PER_PROC(val); afu->max_procs_virtualised = AFUD_NUM_PROCS(val); afu->crs_num = AFUD_NUM_CRS(val); if (AFUD_AFU_DIRECTED(val)) afu->modes_supported |= CXL_MODE_DIRECTED; if (AFUD_DEDICATED_PROCESS(val)) afu->modes_supported |= CXL_MODE_DEDICATED; if (AFUD_TIME_SLICED(val)) afu->modes_supported |= CXL_MODE_TIME_SLICED; val = AFUD_READ_PPPSA(afu); afu->pp_size = AFUD_PPPSA_LEN(val) * 4096; afu->psa = AFUD_PPPSA_PSA(val); if ((afu->pp_psa = AFUD_PPPSA_PP(val))) afu->pp_offset = AFUD_READ_PPPSA_OFF(afu); val = AFUD_READ_CR(afu); afu->crs_len = AFUD_CR_LEN(val) * 256; afu->crs_offset = AFUD_READ_CR_OFF(afu); /* eb_len is in multiple of 4K */ afu->eb_len = AFUD_EB_LEN(AFUD_READ_EB(afu)) * 4096; afu->eb_offset = AFUD_READ_EB_OFF(afu); /* eb_off is 4K aligned so lower 12 bits are always zero */ if (EXTRACT_PPC_BITS(afu->eb_offset, 0, 11) != 0) { dev_warn(&afu->dev, "Invalid AFU error buffer offset %Lx\n", afu->eb_offset); dev_info(&afu->dev, "Ignoring AFU error buffer in the descriptor\n"); /* indicate that no afu buffer exists */ afu->eb_len = 0; } return 0; }