Lines Matching +full:entry +full:- +full:method

1 // SPDX-License-Identifier: GPL-2.0-only
18 /* ---------- OCM stuff ---------- */
34 struct asd_ocm_dir_ent entry[15]; member
65 .type = (OCM_DE_ADDC2C_RES0), /* Entry type */
70 .type = (OCM_DE_ADDC2C_RES1), /* Entry type */
75 .type = (OCM_DE_ADDC2C_RES2), /* Entry type */
80 .type = (OCM_DE_ADDC2C_RES3), /* Entry type */
85 .type = (OCM_DE_WIN_DRVR), /* Entry type */
108 * asd_read_ocm_seg - read an on chip memory (OCM) segment
120 if (unlikely(asd_ha->iospace)) in asd_read_ocm_seg()
123 for ( ; size > 0; size--, offs++, p++) in asd_read_ocm_seg()
138 if (dir->sig[0] != 'M' || dir->sig[1] != 'O') { in asd_read_ocm_dir()
140 dir->sig[0], dir->sig[1]); in asd_read_ocm_dir()
141 return -ENOENT; in asd_read_ocm_dir()
143 if (dir->major != 0) { in asd_read_ocm_dir()
145 dir->major); in asd_read_ocm_dir()
146 return -ENOENT; in asd_read_ocm_dir()
148 dir->num_de &= 0xf; in asd_read_ocm_dir()
153 * asd_write_ocm_seg - write an on chip memory (OCM) segment
165 if (unlikely(asd_ha->iospace)) in asd_write_ocm_seg()
168 for ( ; size > 0; size--, offs++, p++) in asd_write_ocm_seg()
182 for (i = 0; i < dir->num_de; i++) { in asd_find_dir_entry()
183 if (dir->entry[i].type == type) in asd_find_dir_entry()
186 if (i >= dir->num_de) in asd_find_dir_entry()
187 return -ENOENT; in asd_find_dir_entry()
188 ent = &dir->entry[i]; in asd_find_dir_entry()
189 *offs = (u32) THREE_TO_NUM(ent->offs); in asd_find_dir_entry()
190 *size = (u32) THREE_TO_NUM(ent->size); in asd_find_dir_entry()
209 err = -ENOMEM; in asd_get_bios_chim()
221 if (strncmp(bc_struct->sig, "SOIB", 4) in asd_get_bios_chim()
222 && strncmp(bc_struct->sig, "IPSA", 4)) { in asd_get_bios_chim()
223 ASD_DPRINTK("BIOS_CHIM entry has no valid sig(%c%c%c%c)\n", in asd_get_bios_chim()
224 bc_struct->sig[0], bc_struct->sig[1], in asd_get_bios_chim()
225 bc_struct->sig[2], bc_struct->sig[3]); in asd_get_bios_chim()
226 err = -ENOENT; in asd_get_bios_chim()
229 if (bc_struct->major != 1) { in asd_get_bios_chim()
231 bc_struct->major); in asd_get_bios_chim()
232 err = -ENOENT; in asd_get_bios_chim()
235 if (bc_struct->flags & BC_BIOS_PRESENT) { in asd_get_bios_chim()
236 asd_ha->hw_prof.bios.present = 1; in asd_get_bios_chim()
237 asd_ha->hw_prof.bios.maj = bc_struct->bios_major; in asd_get_bios_chim()
238 asd_ha->hw_prof.bios.min = bc_struct->bios_minor; in asd_get_bios_chim()
239 asd_ha->hw_prof.bios.bld = le32_to_cpu(bc_struct->bios_build); in asd_get_bios_chim()
241 asd_ha->hw_prof.bios.maj, in asd_get_bios_chim()
242 asd_ha->hw_prof.bios.min, in asd_get_bios_chim()
243 asd_ha->hw_prof.bios.bld); in asd_get_bios_chim()
245 asd_ha->hw_prof.ue.num = le16_to_cpu(bc_struct->ue_num); in asd_get_bios_chim()
246 asd_ha->hw_prof.ue.size= le16_to_cpu(bc_struct->ue_size); in asd_get_bios_chim()
247 ASD_DPRINTK("ue num:%d, ue size:%d\n", asd_ha->hw_prof.ue.num, in asd_get_bios_chim()
248 asd_ha->hw_prof.ue.size); in asd_get_bios_chim()
249 size = asd_ha->hw_prof.ue.num * asd_ha->hw_prof.ue.size; in asd_get_bios_chim()
251 err = -ENOMEM; in asd_get_bios_chim()
252 asd_ha->hw_prof.ue.area = kmalloc(size, GFP_KERNEL); in asd_get_bios_chim()
253 if (!asd_ha->hw_prof.ue.area) in asd_get_bios_chim()
255 err = asd_read_ocm_seg(asd_ha, (void *)asd_ha->hw_prof.ue.area, in asd_get_bios_chim()
258 kfree(asd_ha->hw_prof.ue.area); in asd_get_bios_chim()
259 asd_ha->hw_prof.ue.area = NULL; in asd_get_bios_chim()
260 asd_ha->hw_prof.ue.num = 0; in asd_get_bios_chim()
261 asd_ha->hw_prof.ue.size = 0; in asd_get_bios_chim()
296 struct pci_dev *pcidev = asd_ha->pcidev; in asd_hwi_check_ocm_access()
333 * asd_read_ocm - read on chip memory (OCM)
342 return -1; in asd_read_ocm()
347 return -ENOMEM; in asd_read_ocm()
360 /* ---------- FLASH stuff ---------- */
553 for (c = 5000; c > 0; c--) { in asd_poll_flash()
554 d = asd_read_reg_byte(asd_ha, asd_ha->hw_prof.flash.bar); in asd_poll_flash()
555 d ^= asd_read_reg_byte(asd_ha, asd_ha->hw_prof.flash.bar); in asd_poll_flash()
560 return -ENOENT; in asd_poll_flash()
570 asd_write_reg_byte(asd_ha, asd_ha->hw_prof.flash.bar, FLASH_RESET); in asd_reset_flash()
579 asd_read_reg_string(asd_ha, buffer, asd_ha->hw_prof.flash.bar+offs, in asd_read_flash_seg()
585 * asd_find_flash_dir - finds and reads the flash directory
598 sizeof(FLASH_DIR_COOKIE)-1); in asd_find_flash_dir()
599 if (memcmp(flash_dir->cookie, FLASH_DIR_COOKIE, in asd_find_flash_dir()
600 sizeof(FLASH_DIR_COOKIE)-1) == 0) { in asd_find_flash_dir()
601 asd_ha->hw_prof.flash.dir_offs = v; in asd_find_flash_dir()
617 if (pci_read_config_dword(asd_ha->pcidev, PCI_CONF_FLSH_BAR, in asd_flash_getid()
618 &asd_ha->hw_prof.flash.bar)) { in asd_flash_getid()
620 pci_name(asd_ha->pcidev)); in asd_flash_getid()
621 return -ENOENT; in asd_flash_getid()
623 asd_ha->hw_prof.flash.present = 1; in asd_flash_getid()
624 asd_ha->hw_prof.flash.wide = reg & FLASHW ? 1 : 0; in asd_flash_getid()
637 while (size-- > 0) in asd_calc_flash_chksum()
651 u32 type = le32_to_cpu(flash_dir->dir_entry[i].type); in asd_find_flash_de()
658 return -ENOENT; in asd_find_flash_de()
659 de = &flash_dir->dir_entry[i]; in asd_find_flash_de()
660 *offs = le32_to_cpu(de->offs); in asd_find_flash_de()
661 *size = le32_to_cpu(de->pad_size); in asd_find_flash_de()
667 if (ms->sig[0] != 'S' || ms->sig[1] != 'M') { in asd_validate_ms()
669 ms->sig[0], ms->sig[1]); in asd_validate_ms()
670 return -ENOENT; in asd_validate_ms()
672 if (ms->maj != 0) { in asd_validate_ms()
674 ms->maj); in asd_validate_ms()
675 return -ENOENT; in asd_validate_ms()
677 ms->offs_next = le16_to_cpu((__force __le16) ms->offs_next); in asd_validate_ms()
678 ms->chksum = le16_to_cpu((__force __le16) ms->chksum); in asd_validate_ms()
679 ms->size = le16_to_cpu((__force __le16) ms->size); in asd_validate_ms()
681 if (asd_calc_flash_chksum((u16 *)ms, ms->size/2)) { in asd_validate_ms()
691 memcpy(asd_ha->hw_prof.sas_addr, ms->sas_addr, SAS_ADDR_SIZE); in asd_ms_get_sas_addr()
698 memcpy(asd_ha->hw_prof.pcba_sn, ms->pcba_sn, ASD_PCBA_SN_SIZE); in asd_ms_get_pcba_sn()
699 asd_ha->hw_prof.pcba_sn[ASD_PCBA_SN_SIZE] = '\0'; in asd_ms_get_pcba_sn()
704 * asd_find_ll_by_id - find a linked list entry by its id
721 if (el->id1 == id1) in asd_find_ll_by_id()
723 if (el->id0 == id0) in asd_find_ll_by_id()
726 el = start + le16_to_cpu(el->next); in asd_find_ll_by_id()
733 * asd_ms_get_phy_params - get phy parameters from the manufacturing sector
737 * The manufacturing sector contans also the linked list of sub-segments,
744 * The absolute total phy number is ASD_MAX_PHYS. hw_prof->num_phys
748 * In this case ASD_MAX_PHYS is 8, hw_prof->num_phys is 5, and only 2
784 if (phy_param->maj != 0) { in asd_ms_get_phy_params()
786 phy_param->maj); in asd_ms_get_phy_params()
787 return -ENOENT; in asd_ms_get_phy_params()
790 ASD_DPRINTK("ms: num_phy_desc: %d\n", phy_param->num_phy_desc); in asd_ms_get_phy_params()
791 asd_ha->hw_prof.enabled_phys = 0; in asd_ms_get_phy_params()
792 for (i = 0; i < phy_param->num_phy_desc; i++) { in asd_ms_get_phy_params()
793 struct asd_manuf_phy_desc *pd = &phy_param->phy_desc[i]; in asd_ms_get_phy_params()
794 switch (pd->state & 0xF) { in asd_ms_get_phy_params()
800 asd_ha->hw_prof.enabled_phys &= ~(1 << i); in asd_ms_get_phy_params()
805 asd_ha->hw_prof.enabled_phys |= (1 << i); in asd_ms_get_phy_params()
809 asd_ha->hw_prof.phy_desc[i].phy_control_0 = pd->phy_control_0; in asd_ms_get_phy_params()
810 asd_ha->hw_prof.phy_desc[i].phy_control_1 = pd->phy_control_1; in asd_ms_get_phy_params()
811 asd_ha->hw_prof.phy_desc[i].phy_control_2 = pd->phy_control_2; in asd_ms_get_phy_params()
812 asd_ha->hw_prof.phy_desc[i].phy_control_3 = pd->phy_control_3; in asd_ms_get_phy_params()
814 asd_ha->hw_prof.max_phys = rep_phys + en_phys; in asd_ms_get_phy_params()
815 asd_ha->hw_prof.num_phys = en_phys; in asd_ms_get_phy_params()
817 asd_ha->hw_prof.max_phys, asd_ha->hw_prof.num_phys); in asd_ms_get_phy_params()
818 ASD_DPRINTK("ms: enabled_phys:0x%x\n", asd_ha->hw_prof.enabled_phys); in asd_ms_get_phy_params()
833 if (cm->maj != 0) { in asd_ms_get_connector_map()
835 "\n", cm->maj); in asd_ms_get_connector_map()
836 return -ENOENT; in asd_ms_get_connector_map()
846 * asd_process_ms - find and extract information from the manufacturing sector
866 err = -ENOMEM; in asd_process_ms()
892 SAS_ADDR(asd_ha->hw_prof.sas_addr)); in asd_process_ms()
899 ASD_DPRINTK("manuf sect PCBA SN %s\n", asd_ha->hw_prof.pcba_sn); in asd_process_ms()
923 for (i = 0; i < ps->num_phys; i++) { in asd_process_ctrla_phy_settings()
924 struct asd_ctrla_phy_entry *pe = &ps->phy_ent[i]; in asd_process_ctrla_phy_settings()
928 if (*(u64 *)pe->sas_addr == 0) { in asd_process_ctrla_phy_settings()
929 asd_ha->hw_prof.enabled_phys &= ~(1 << i); in asd_process_ctrla_phy_settings()
933 memcpy(asd_ha->hw_prof.phy_desc[i].sas_addr, pe->sas_addr, in asd_process_ctrla_phy_settings()
935 asd_ha->hw_prof.phy_desc[i].max_sas_lrate = in asd_process_ctrla_phy_settings()
936 (pe->sas_link_rates & 0xF0) >> 4; in asd_process_ctrla_phy_settings()
937 asd_ha->hw_prof.phy_desc[i].min_sas_lrate = in asd_process_ctrla_phy_settings()
938 (pe->sas_link_rates & 0x0F); in asd_process_ctrla_phy_settings()
939 asd_ha->hw_prof.phy_desc[i].max_sata_lrate = in asd_process_ctrla_phy_settings()
940 (pe->sata_link_rates & 0xF0) >> 4; in asd_process_ctrla_phy_settings()
941 asd_ha->hw_prof.phy_desc[i].min_sata_lrate = in asd_process_ctrla_phy_settings()
942 (pe->sata_link_rates & 0x0F); in asd_process_ctrla_phy_settings()
943 asd_ha->hw_prof.phy_desc[i].flags = pe->flags; in asd_process_ctrla_phy_settings()
944 ASD_DPRINTK("ctrla: phy%d: sas_addr: %llx, sas rate:0x%x-0x%x," in asd_process_ctrla_phy_settings()
945 " sata rate:0x%x-0x%x, flags:0x%x\n", in asd_process_ctrla_phy_settings()
947 SAS_ADDR(asd_ha->hw_prof.phy_desc[i].sas_addr), in asd_process_ctrla_phy_settings()
948 asd_ha->hw_prof.phy_desc[i].max_sas_lrate, in asd_process_ctrla_phy_settings()
949 asd_ha->hw_prof.phy_desc[i].min_sas_lrate, in asd_process_ctrla_phy_settings()
950 asd_ha->hw_prof.phy_desc[i].max_sata_lrate, in asd_process_ctrla_phy_settings()
951 asd_ha->hw_prof.phy_desc[i].min_sata_lrate, in asd_process_ctrla_phy_settings()
952 asd_ha->hw_prof.phy_desc[i].flags); in asd_process_ctrla_phy_settings()
959 * asd_process_ctrl_a_user - process CTRL-A user settings
974 ASD_DPRINTK("couldn't find CTRL-A user settings section\n"); in asd_process_ctrl_a_user()
975 ASD_DPRINTK("Creating default CTRL-A user settings section\n"); in asd_process_ctrl_a_user()
981 asd_ha->hw_prof.sas_addr, SAS_ADDR_SIZE); in asd_process_ctrl_a_user()
995 err = -ENOMEM; in asd_process_ctrl_a_user()
1008 err = -ENOENT; in asd_process_ctrl_a_user()
1027 * asd_read_flash - read flash memory
1041 return -ENOMEM; in asd_read_flash()
1043 err = -ENOENT; in asd_read_flash()
1049 if (le32_to_cpu(flash_dir->rev) != 2) { in asd_read_flash()
1051 le32_to_cpu(flash_dir->rev)); in asd_read_flash()
1063 ASD_DPRINTK("couldn't process CTRL-A user settings\n"); in asd_read_flash()
1073 * asd_verify_flash_seg - verify data with flash memory
1087 reg = asd_ha->hw_prof.flash.bar; in asd_verify_flash_seg()
1104 * asd_write_flash_seg - write data into flash memory
1117 reg = asd_ha->hw_prof.flash.bar; in asd_write_flash_seg()
1143 switch (asd_ha->hw_prof.flash.method) { in asd_write_flash_seg()
1201 reg = asd_ha->hw_prof.flash.bar; in asd_chk_write_status()
1228 * ERASE is a sector-by-sector operation and requires in asd_chk_write_status()
1229 * more time to finish while WRITE is byte-byte-byte in asd_chk_write_status()
1243 return -1; in asd_chk_write_status()
1247 * asd_hwi_erase_nv_sector - Erase the flash memory sectors.
1257 reg = asd_ha->hw_prof.flash.bar; in asd_erase_nv_sector()
1267 switch (asd_ha->hw_prof.flash.method) { in asd_erase_nv_sector()
1307 reg = asd_ha->hw_prof.flash.bar; in asd_check_flash_type()
1316 asd_ha->hw_prof.flash.method = FLASH_METHOD_UNKNOWN; in asd_check_flash_type()
1317 asd_ha->hw_prof.flash.manuf = FLASH_MANUF_ID_UNKNOWN; in asd_check_flash_type()
1318 asd_ha->hw_prof.flash.dev_id = FLASH_DEV_ID_UNKNOWN; in asd_check_flash_type()
1324 inc = asd_ha->hw_prof.flash.wide ? 2 : 1; in asd_check_flash_type()
1349 asd_ha->hw_prof.flash.method = FLASH_METHOD_A; in asd_check_flash_type()
1359 asd_ha->hw_prof.flash.method = FLASH_METHOD_A; in asd_check_flash_type()
1369 asd_ha->hw_prof.flash.method = FLASH_METHOD_A; in asd_check_flash_type()
1376 asd_ha->hw_prof.flash.method = FLASH_METHOD_A; in asd_check_flash_type()
1382 if (asd_ha->hw_prof.flash.method == FLASH_METHOD_UNKNOWN) { in asd_check_flash_type()
1410 asd_ha->hw_prof.flash.method = FLASH_METHOD_B; in asd_check_flash_type()
1419 asd_ha->hw_prof.flash.method = FLASH_METHOD_B; in asd_check_flash_type()
1428 asd_ha->hw_prof.flash.method = FLASH_METHOD_B; in asd_check_flash_type()
1435 asd_ha->hw_prof.flash.method = FLASH_METHOD_B; in asd_check_flash_type()
1442 asd_ha->hw_prof.flash.method = FLASH_METHOD_B; in asd_check_flash_type()
1451 if (asd_ha->hw_prof.flash.method == FLASH_METHOD_UNKNOWN) in asd_check_flash_type()
1454 asd_ha->hw_prof.flash.manuf = manuf_id; in asd_check_flash_type()
1455 asd_ha->hw_prof.flash.dev_id = dev_id; in asd_check_flash_type()
1456 asd_ha->hw_prof.flash.sec_prot = sec_prot; in asd_check_flash_type()