Lines Matching +full:mailbox +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0
3 * driver for Microchip PQI-based storage controllers
4 * Copyright (c) 2019-2023 Microchip Technology Inc. and its subsidiaries
5 * Copyright (c) 2016-2018 Microsemi Corporation
6 * Copyright (c) 2016 PMC-Sierra, Inc.
110 status = readl(&ctrl_info->registers->sis_firmware_status); in sis_wait_for_ctrl_ready_with_timeout()
113 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_ctrl_ready_with_timeout()
114 "controller is offline: status code 0x%x\n", in sis_wait_for_ctrl_ready_with_timeout()
116 &ctrl_info->registers->sis_mailbox[7])); in sis_wait_for_ctrl_ready_with_timeout()
117 return -ENODEV; in sis_wait_for_ctrl_ready_with_timeout()
123 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_ctrl_ready_with_timeout()
124 "controller not ready after %u seconds\n", in sis_wait_for_ctrl_ready_with_timeout()
126 return -ETIMEDOUT; in sis_wait_for_ctrl_ready_with_timeout()
151 status = readl(&ctrl_info->registers->sis_firmware_status); in sis_is_firmware_running()
159 dev_err(&ctrl_info->pci_dev->dev, in sis_is_firmware_running()
160 "controller is offline: status code 0x%x\n", in sis_is_firmware_running()
161 readl(&ctrl_info->registers->sis_mailbox[7])); in sis_is_firmware_running()
168 return readl(&ctrl_info->registers->sis_firmware_status) & in sis_is_kernel_up()
174 return readl(&ctrl_info->registers->sis_product_identifier); in sis_get_product_id()
179 u32 mailbox[6]; /* mailboxes 0-5 */ member
191 registers = ctrl_info->registers; in sis_send_sync_cmd()
193 /* Write the command to mailbox 0. */ in sis_send_sync_cmd()
194 writel(cmd, ®isters->sis_mailbox[0]); in sis_send_sync_cmd()
197 * Write the command parameters to mailboxes 1-4 (mailbox 5 is not used in sis_send_sync_cmd()
198 * when sending a command to the controller). in sis_send_sync_cmd()
201 writel(params->mailbox[i], ®isters->sis_mailbox[i]); in sis_send_sync_cmd()
205 ®isters->sis_ctrl_to_host_doorbell_clear); in sis_send_sync_cmd()
208 writel(~0, ®isters->sis_interrupt_mask); in sis_send_sync_cmd()
215 readl(®isters->sis_interrupt_mask); in sis_send_sync_cmd()
217 /* Submit the command to the controller. */ in sis_send_sync_cmd()
218 writel(SIS_CMD_READY, ®isters->sis_host_to_ctrl_doorbell); in sis_send_sync_cmd()
222 * the top of the loop in order to give the controller time to start in sis_send_sync_cmd()
228 doorbell = readl(®isters->sis_ctrl_to_host_doorbell); in sis_send_sync_cmd()
232 return -ETIMEDOUT; in sis_send_sync_cmd()
235 /* Read the command status from mailbox 0. */ in sis_send_sync_cmd()
236 cmd_status = readl(®isters->sis_mailbox[0]); in sis_send_sync_cmd()
238 dev_err(&ctrl_info->pci_dev->dev, in sis_send_sync_cmd()
241 return -EINVAL; in sis_send_sync_cmd()
246 * read the values returned in mailboxes 1-5. in sis_send_sync_cmd()
248 params->mailbox[0] = cmd_status; in sis_send_sync_cmd()
249 for (i = 1; i < ARRAY_SIZE(params->mailbox); i++) in sis_send_sync_cmd()
250 params->mailbox[i] = readl(®isters->sis_mailbox[i]); in sis_send_sync_cmd()
256 * This function verifies that we are talking to a controller that speaks PQI.
273 properties = params.mailbox[1]; in sis_get_ctrl_properties()
276 return -ENODEV; in sis_get_ctrl_properties()
278 extended_properties = params.mailbox[4]; in sis_get_ctrl_properties()
282 return -ENODEV; in sis_get_ctrl_properties()
285 ctrl_info->pqi_reset_quiesce_supported = true; in sis_get_ctrl_properties()
302 ctrl_info->max_sg_entries = params.mailbox[1]; in sis_get_pqi_capabilities()
303 ctrl_info->max_transfer_size = params.mailbox[2]; in sis_get_pqi_capabilities()
304 ctrl_info->max_outstanding_requests = params.mailbox[3]; in sis_get_pqi_capabilities()
305 ctrl_info->config_table_offset = params.mailbox[4]; in sis_get_pqi_capabilities()
306 ctrl_info->config_table_length = params.mailbox[5]; in sis_get_pqi_capabilities()
321 + SIS_BASE_STRUCT_ALIGNMENT - 1, GFP_KERNEL); in sis_init_base_struct_addr()
323 return -ENOMEM; in sis_init_base_struct_addr()
327 error_buffer_paddr = (unsigned long)ctrl_info->error_buffer_dma_handle; in sis_init_base_struct_addr()
329 put_unaligned_le32(SIS_BASE_STRUCT_REVISION, &base_struct->revision); in sis_init_base_struct_addr()
331 &base_struct->error_buffer_paddr_low); in sis_init_base_struct_addr()
333 &base_struct->error_buffer_paddr_high); in sis_init_base_struct_addr()
335 &base_struct->error_buffer_element_length); in sis_init_base_struct_addr()
336 put_unaligned_le32(ctrl_info->max_io_slots, in sis_init_base_struct_addr()
337 &base_struct->error_buffer_num_elements); in sis_init_base_struct_addr()
339 bus_address = dma_map_single(&ctrl_info->pci_dev->dev, base_struct, in sis_init_base_struct_addr()
341 if (dma_mapping_error(&ctrl_info->pci_dev->dev, bus_address)) { in sis_init_base_struct_addr()
342 rc = -ENOMEM; in sis_init_base_struct_addr()
347 params.mailbox[1] = lower_32_bits((u64)bus_address); in sis_init_base_struct_addr()
348 params.mailbox[2] = upper_32_bits((u64)bus_address); in sis_init_base_struct_addr()
349 params.mailbox[3] = sizeof(*base_struct); in sis_init_base_struct_addr()
354 dma_unmap_single(&ctrl_info->pci_dev->dev, bus_address, in sis_init_base_struct_addr()
375 readl(&ctrl_info->registers->sis_host_to_ctrl_doorbell); in sis_wait_for_doorbell_bit_to_clear()
378 if (readl(&ctrl_info->registers->sis_firmware_status) & in sis_wait_for_doorbell_bit_to_clear()
380 rc = -ENODEV; in sis_wait_for_doorbell_bit_to_clear()
384 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_doorbell_bit_to_clear()
387 rc = -ETIMEDOUT; in sis_wait_for_doorbell_bit_to_clear()
398 writel(bit, &ctrl_info->registers->sis_host_to_ctrl_doorbell); in sis_set_doorbell_bit()
417 if (readl(&ctrl_info->registers->sis_firmware_status) & in sis_shutdown_ctrl()
421 if (ctrl_info->firmware_triage_supported) in sis_shutdown_ctrl()
422 writel(ctrl_shutdown_reason, &ctrl_info->registers->sis_ctrl_shutdown_reason_code); in sis_shutdown_ctrl()
424 writel(SIS_TRIGGER_SHUTDOWN, &ctrl_info->registers->sis_host_to_ctrl_doorbell); in sis_shutdown_ctrl()
439 writel(value, &ctrl_info->registers->sis_driver_scratch); in sis_write_driver_scratch()
445 return readl(&ctrl_info->registers->sis_driver_scratch); in sis_read_driver_scratch()
451 return ((enum sis_fw_triage_status)(readl(&ctrl_info->registers->sis_firmware_status) & in sis_read_firmware_triage_status()
457 return readl(&ctrl_info->registers->sis_firmware_status) & SIS_CTRL_KERNEL_CTRL_LOGGING; in sis_is_ctrl_logging_supported()
467 …return ((enum sis_ctrl_logging_status)((readl(&ctrl_info->registers->sis_firmware_status) & SIS_CT… in sis_read_ctrl_logging_status()
473 &ctrl_info->registers->sis_host_to_ctrl_doorbell); in sis_soft_reset()
489 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_fw_triage_completion()
491 rc = -EINVAL; in sis_wait_for_fw_triage_completion()
500 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_fw_triage_completion()
502 rc = -ETIMEDOUT; in sis_wait_for_fw_triage_completion()
525 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_ctrl_logging_completion()
526 "controller data logging condition invalid\n"); in sis_wait_for_ctrl_logging_completion()
527 rc = -EINVAL; in sis_wait_for_ctrl_logging_completion()
535 dev_err(&ctrl_info->pci_dev->dev, in sis_wait_for_ctrl_logging_completion()
536 "timed out waiting for controller data logging status\n"); in sis_wait_for_ctrl_logging_completion()
537 rc = -ETIMEDOUT; in sis_wait_for_ctrl_logging_completion()